feat(fasl): ADR-0030 slice 3 — KIND-1/5 novel symbol+string relocs, v5 format, reader-visible fasl globalsVerified

Third Model A slice: novel SYMBOLS and STRINGS are now fasl-portable, and
a fasl-defined global is reader-visible from the fresh REPL.

v5 reloc wire format (the widening deferred from slice 2, built with its
consumer): kind u32 | co-relative pos u32 | name bv | width u8 | home-pkg
bv. .fco v4->v5, FUNCLFA v1->v2 (no silent cross-version reads). Two new
kinds: KIND-4 (novel symbol-pool lea) and KIND-5 (novel string-pool lea,
name bv = content).

Emit: ag-resolve-symbol-patches / string-pool resolver novel branches
record KIND-4/5 (arena-gated; cold build byte-identical). Load: pool-as-
mint — intern the name/content into *ag-symbol-pool*/*ag-string-pool*
and queue the site on the patch lists; the replay's per-action
ag-emit-quote-pool lays fresh records registered where the reader looks,
then patches the sites.

Reader visibility: home-pkg payload + ag-loader-pkg-value-cell (interns
via ag-intern-in-pkg onto the package alist) + a mint-map arm in
ag-resolve-global-vaddr-patches so post-load REPL sites resolve to the
SAME cell the fasl stored into (without it every fasl global read back
unbound). spike::*marker* from a fresh REPL after load -> :SPIKE-MARKER.

Value-type matrix green: defvar int/cons/keyword/string/symbol all
round-trip through a fasl, with cross-boundary eq for the keyword and
symbol.

Debugging finds recorded for the next slice: KIND-4 must string-pool-
intern the name FIRST (symbol records resolve the name slot through the
string pool); fasl global cells diverge from post-load reads without the
mint-map resolver arm; the keyword mint must register in
*ag-keyword-pool-offsets* (not just vaddrs) or the next compiled :kw
mints a second record and breaks eq.

Gates: oracle 4/4 both sides; reader-visibility + matrix probes green;
stage1 boots + handler-case BAD (cave#293/294 intact); native conditions
typep T; build/funcl boots on the v5 embedded image; make build green,
byte-identical fixed point held; tree-shake slice-clean (5 new cold
defuns retained; the ~50-name backlog predates this work and needs its
own manifest-refresh pass).

Remaining Model A scope: Cat-2 pkgsym IMM64 sites (quote shape 3, direct
calls, (function NAME)) for general fasls.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Anthony Green2026-07-12 21:19:34 -0400 b29217679a5a90e96024cb33ef064db182eb93b7
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>