R2.4 framework cleanup on the holder side. When a Slotted
host destructs, actively vacate every occupied slot via the
canonical Slotted.vacate(slot, candidate) chokepoint so
the held side's witness chain (onSlotReleased, posture
transitions, onUnwielded, …) fires. A naked
slots.clear() would leave occupants with a stale
getOccupiedHost() until lazy self-heal and would skip the
witness traffic.
Walk order: for a Container+Slotted+Containable host
(avatar with a Wieldable in hand), the Container cleanup
(most-derived) evacuates contents first, then THIS step
vacates slots. A wielded sword that's also in the avatar's
contents ends up in the outer container (via Container
cleanup) AND cleanly unwielded (via this step).
Iteration safety: snapshot the (host, slot, candidate)
tuples first because host.vacate mutates the live map.
R2.4 framework cleanup on the holder side. When a Slotted host destructs, actively vacate every occupied slot via the canonical
Slotted.vacate(slot, candidate)chokepoint so the held side's witness chain (onSlotReleased, posture transitions,onUnwielded, …) fires. A nakedslots.clear()would leave occupants with a stalegetOccupiedHost()until lazy self-heal and would skip the witness traffic.Walk order: for a Container+Slotted+Containable host (avatar with a Wieldable in hand), the Container cleanup (most-derived) evacuates contents first, then THIS step vacates slots. A wielded sword that's also in the avatar's contents ends up in the outer container (via Container cleanup) AND cleanly unwielded (via this step).
Iteration safety: snapshot the (host, slot, candidate) tuples first because
host.vacatemutates the live map.