fix(gc): resolve cave#68 — implement REVIEW.md items 1-6 for the minor collectorVerified
Root cause of the post-minor corruption: REVIEW.md item 2. Evacuation ignored gc-object-movable-p and moved SYMBOLS (pinned by contract: pointer identity matters), breaking a raw reference class to their records/name bvs; the resulting dispatch misses then fell into SILENTLY UNPATCHED calls (rel32=0 — a call to its own fall-through whose ret chain pops an operand as the return PC), producing wild jumps far from the cause. REVIEW.md items, all implemented: 1. The fallback allocation window bumps past OLD/pinned regions and CLAMPS at the first one above (gc-window-base-past-old / gc-window-limit-from) — a mutator window never intersects old space, in any cycle's region layout. 2. Pinning policy: non-movable widetags pin their region (+gc-region-young-pinned+); pinned entities heal in place via gc-minor-pin-fixpoint (alternating with cheney to quiescence); reclaim promotes pinned regions to OLD in place — map and cards intact, dead entities leak until full-MS. Forwarded corpses in pinned regions still resolve (young-ish heal gate). 3. Preflight gc-minor-large-fit-p: largest young entity extent vs largest contiguous virgin run, decided before the first forwarding write. 4. Visit mode 2 = non-mutating stale-check; minor end re-walks the stack (incl. saved-register slots) while the stub frame is live; (gc-stack-stale-count) reports it. gc-verify-to-space documents why a later REPL call cannot walk the (popped) stack. 5. gc-precise-stack-check mirrors the dynamic-rest innermost record (srsp+112 entry, raw nargs from stub-saved RAX). 6. argv root double-coverage documented as deliberate. Also: unresolved patches now RAISE with the callee's name — gated on *gc-raise-unresolved*, armed at the first collection, so host / stage1 / cold-boot keep the designed silent-drop for tree-shaken names (cave#34/#35). Large-object evacuation keeps *gc-evac-top* past the object (latent window overlap); to-space grabs assert monotonic; forwarding words assert below the evac cursor. Validated: two reclaiming minors back-to-back with heap-valued REPL defvars, intern, and cold-name calls all correct (minor 2, degen 0, stack-stale 0, 3 regions pinned then promoted); test-gc + soak + smoke green; bootstrap 202/202. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By:
Claude Fable 5 <noreply@anthropic.com>