crafting: retire form, unify on affordance capability axis (ADR-0055 amendment)

Recipe roles now match on a single `affordance.*` axis, required by both consumed `inputs` and non-consumed `tools` (the inputs/tools split carries consumption, not a separate axis). `form` — which conflated geometry, identity and capability — is removed. Its functional members folded into affordances (blade->cutting, shaft->leverage, plus knappable/spinnable/binding); identity members became template-id (chop_tree) or material+weight (log, hammer head).

vagrant-skeleton v0.20.0; no crafting/composition lib bump (they never knew `form`). Verified headless via the tool-harness: 16/16 checks pass — role-flexibility (stick OR branch hafts), weight discrimination, tool-gating (tool not consumed), and anti-recursion guards (sharp_stone not re-knappable, cordage not re-spinnable).
This commit is contained in:
calic
2026-07-31 07:43:08 +00:00
parent 4825d01426
commit b28afd5290
4 changed files with 93 additions and 58 deletions

View File

@@ -8,18 +8,25 @@ callback, foot-body-orientation ("tactical twist"), scale-deformation walk
cycle, and inheritance-decoupled foot sprites. End-to-end inventory pickup/drop
demo: pick up a rock into a backpack container, drop it back into the world.
**Version:** 0.19.0
**Version:** 0.20.0
**Module-ID:** vagrant-skeleton
**Requires:** lib-core.input >=0.4.0, lib-core.camera >=0.3.0, lib-core.render >=0.2.0, lib-core.maps >=0.1.2, lib-core.puppet >=0.4.4, lib-core.interaction >=0.1.0, lib-core.composition >=0.3.0, lib-core.actor >=0.1.0, lib-core.inventory-list >=0.1.0, lib-core.panel >=0.2.0, lib-core.inventory-list-display >=0.1.0, lib-core.notify >=0.1.0, lib-core.notify-display >=0.1.0, lib-core.world-overlay >=0.1.0, lib-core.crafting >=0.3.0, lib-core.crafting-display >=0.2.0, lib-asset.prototype-subterrain >=0.2.0, lib-asset.prototype-tc-basics >=0.1.0
**Tags:** test-chamber, puppet, walking-sim, interaction
> **v0.19.0:** **Role-based recipes.** Items carry a `form` role (shaft / cord /
> fiber / lump / blade / …); Stone-Age recipes now match by ROLE + material +
> weight + affordance, not by item id — so **any item that fills a role qualifies**
> (a haft = `{form="shaft"}` → stick OR branch). Verified: stick and branch both
> haft a hammer/axe; a log is rejected as a hammer head (not a lump); weight
> discriminates (a light stick can't be "broken", a heavy branch can't be
> "sharpened"). Template-id matching stays available (see rock_pick/rock_pile) —
> **v0.20.0:** **`form` retired → `affordance` is the one capability axis**
> (ADR-0055 amendment). The `form` role-tag mixed geometry, identity and
> capability; it is gone. Its functional members folded into `affordance.*`
> (`blade→cutting`, `shaft→leverage`, plus `knappable` / `spinnable` /
> `binding`); identity members became template-id (`chop_tree` = `{template=
> "tree"}`) or material+mass (`log`/hammer-head). The SAME affordance vocabulary
> is now required by both consumed `inputs` and non-consumed `tools`. Role-
> flexibility preserved: a haft = `{["affordance.leverage"]=true}` → stick OR
> branch; weight still discriminates (light stick sharpens, heavy branch breaks).
>
> **v0.19.0:** **Role-based recipes** (superseded by v0.20.0's axis rename).
> Introduced role-matching for Stone-Age recipes so any item filling a role
> qualifies, not a specific item id — originally via a `form` tag, since folded
> into `affordance`. Template-id matching stays available (rock_pick/rock_pile) —
> one of several modes, not the default.
>
> **v0.18.0:** Stone-Age round-out (content pack) — `craft_stone_hammer`