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>
Anthony Green2026-07-08 10:51:34 -0400 481e1e5212f44f6723a8fe0225e3b5ebb97c6aea
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>