Wearing traits
wearable (wearable, adjective) is the one live trait here. Fields
stdlib actually reads: the worn state (worn, wornBy), bodyPart
(default torso) and layer (default 1) for the conflict rules, plus the
undeclared cursed property the removal check probes. The layer-default
quirk: because layer defaults to 1, the "same body part, no layers"
conflict branch is unreachable, and garments built with the defaults never
conflict at all: that is why the vest goes on over the worn tunic
and the tunic comes off from underneath it. Set explicit layers (TypeScript
today) and the layering rules engage: hands_full on wear,
prevents_removal on removal. Several declared fields are dormant (slot,
blocksSlots, wearableOver, canRemove, weight, bulk, the message
overrides); don't build on them yet.
clothing (a dormant trait) is a gotcha. It duplicates the wearable
fields and adds material/style/condition, but no action reads it, and
because it is a different trait type, an item composed with only
clothing fails wearing's wearable check and cannot be put on. Use
wearable and keep fabric flavor in descriptions.
equipped (a combat-adjacent trait) provides equipment slots and stat
modifiers; the wearing actions ignore it (equip the verb is just a synonym
for wear), and its one live consumer is combat's weapon selection. It
is TypeScript-only.
open-inventory is a scope marker with no fields. Composed onto an NPC, it makes what they carry reachable, not just visible. This is the difference between admiring the guard's key ring and being able to take it or use it in a lock. It is TypeScript-only today.