feat(adr0026): Phase C step 1 — runtime canonical symbol allocator (B1a)Verified
ag-dynamic-symbol-record-allocate (src/cold/compiler.lisp): mints ONE non-moving 40-byte symbol record in a disjoint top-1-MiB slice of the RWX pool mmap and registers it as a GC root range, so its name/value/function slots are traced AND evacuated across a moving collection. Unlike make-symbol (a movable HEAP record, unusable for defvar's fixed value-cell lea), this record has a stable address — the prerequisite for intern (step 3) to stop minting the split heap symbol E. Codex invariant: header + safe immediates written first, GC range registered, then the real name pointer. Standalone GC-visibility witness (tests/adr0026-fixtures/dyn-alloc-gc.lisp, wired into adr0026-witness.sh EXPECT=pass): after binding value to a fresh heap cons and the function cell to a heap closure, then churning the nursery + full GC, the value stays eq to the original object and the closure stays callable. setf symbol-value/symbol-function on the arena record work with no barrier crash (root-range slots are unconditionally scanned). Not yet wired into intern (step 3) — the two new fns are runtime-reachable but statically dead, declared in cold-bootstrap-retained.lisp (removed in step 3 when intern makes them live). Witness 18 PASS / 2 known-fail (export gaps await step 3). Full sharded suite green: stage2==stage3 fixed point holds, cold-allowed-dead gate passes. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-Authored-By:
Claude Opus 4.8 (1M context) <noreply@anthropic.com>