remove() freed a node and its descendants by directly indexing inner.nodes and unconditionally pushing each slot onto the free list. An out-of-range id panicked out-of-bounds, and removing an already-freed node pushed its slot a second time, so two later allocations could be handed the same NodeId (aliasing/corruption). Free a slot only when it is currently live, via checked access. Fixes #500