Manipulation traits
container (a container, a kind noun, so it takes the article).
Holds things inside; composes on one line with openable, lockable,
and scenery (a container, openable, scenery). The putting example
shows one in play. Settings: with max items N and with max weight N limit capacity; capacity counts what is directly inside, and a
container "bears the weight" of nested contents rather than passing it
up. It is read by putting, inserting, removing, searching,
opening/closing, dropping, throwing, and looking. Data fields beyond Chord's reach today
(TypeScript territory): isTransparent (contents visible while closed),
allowedTypes/excludedTypes, and the liquid fields (containsLiquid,
liquidType, liquidAmount; see drinking).
supporter (a supporter). Holds things on top; see the putting
example. Setting: with capacity N, the number of items it holds
(the Cloak of Darkness brass hook is a supporter with capacity 1).
Unlike containers, a supporter's weight math includes nested contents
recursively. It is read by putting, removing, climbing, dropping, and
looking.
pushable (pushable). Makes an entity eligible for pushing: the
signal-box button is this trait, bare. Its pushType, one of
button (default), heavy, or moveable, selects the pushing
behavior; from Chord, bare pushable composes the default
button configuration
(heavy/moveable are TypeScript territory today). Beyond pushType,
revealsPassage, and pushSound, the trait's fields (activates,
maxPushes, pushDirection, effects) are data for your event
handlers, not behavior that stdlib enforces.
pullable (pullable). Makes an entity eligible for pulling: the
signal lever. Stdlib mutates two fields: state (→ 'pulled',
which is what gates already_pulled) and pullCount. It carries the
rest (pullType, activates, linkedTo, detachesOnPull, maxPulls,
effects) as data for story handlers reacting to pulled.
cuttable (cuttable, optionally with the <tool entity>, an
adjective). Makes an entity eligible for cutting (the bramble)
and carries the tool contract mirroring lockable's keys: toolId (one
tool, what Chord's with sets), toolIds (several, TypeScript), with
CuttableBehavior's requiresTool/canCutWith predicates. Composing it
obliges the entity to register exactly one cut implementation; the load
check enforces it.
diggable (diggable, optionally with the <tool entity>) takes the
same shape for digging (the seedbed): toolId/toolIds,
DiggableBehavior.requiresTool/canDigWith, and the same
one-implementation rule.
moveable-scenery is dormant today (no action reads it, no behavior
class, not composable from Chord): a sketched heavy-thing vocabulary
(weight class, blocked exits, reveals-when-moved), not the way to build
a boulder puzzle right now. Use pushable/pullable plus story logic.
attached is dormant on the same terms: a sketched attachment vocabulary (glued/nailed/tied, detachable, detach force); watch the ADRs for when these two wake up.