Narrative reachability guard added, three live NPC mismatches fixed
What changed
auditNarrativeReachability (axiomancer-mechanics/src/World/narrative-reachability.ts) cross-checks every dialogue interaction node's npcName against its map's roster, and a registry-wide test now asserts the invariant holds across MAP_REGISTRY. Fixed the three live mismatches it found: nf-7 named a nonexistent "Forest Hermit" instead of the rostered "Hermit Sage"; nf-14/nf-23 named scenery ("Ancient Stone Marker", "Echo Stone") as if they were people.
Why it changed
resolveInteraction looked NPCs up by display name and fell back silently when the name didn't match, so a missing tree read as a deliberately minimal encounter rather than a broken one. Eleven of fourteen authored dialogue trees sat unreachable this way, undetected across content passes — the same failure class as the first-map audit's fv-1 finding (map-event content nobody could reach), arriving a second time by a different road. Drains the pending plan/AUDIT.md row filed for that earlier instance.