feat(linkage): ADR-0032 Stage B.2 checkpoint — shared closure-cell stub (dormant), two blockers isolated and filedVerified
The B.2 deliverables that survived adversarial testing, plus the two
that didn't ship and why:
SHIPPED:
- The shared closure-cell call stub (ag-emit-cell-closure-stub):
verifies widetag 0x08, pops the site return address into R11,
pushes the ncaps captures per the ADR-0028 trailing-param
convention, re-pushes the return address, tail-jumps the entry —
the callee's ret-pop returns straight to the site. Emitted at
REPL-ready on BOTH ADR-0017 witness producers (bytes are
name-independent, so cave#315's drift is unchanged) at a
boot-deterministic offset so fasl COs may carry raw rel32 calls to
it. Probe-verified for 0-cap, 1-cap, and 2-user+2-cap closures,
including across forced GC. DORMANT: both arms' non-raw paths
keep the B.1 name-keyed fallback (see cave#316).
- Two hard-won stub rules, now encoded in comments + this history:
stack ops inside boot-emitted stubs must be RAW byte emissions
(the asm push/pop helpers bump the emission-time CFI tracker, and
a stub's cap loop runs N times at runtime vs once at emit); and
NEVER pop into R13 — it is the GC allocation-window limit
([R15,R13)); doing so nuked the heap limit with a code address and
the first collection under a stub-called callee spun forever in
GC-REGION-SYNC.
- asm helpers: asm-jmp-rcx; r13 push/pop added then deliberately
removed.
NOT SHIPPED, isolated + filed:
- Routing non-raw cells through the stub: asdf's uiop/package stores
some widetag-0x08 callable whose entry does NOT take trailing caps
("__G63__ expected 2, got 4") — cave#316 has the species hunt.
- The pkgsym arm's bind-and-retry migration: compile-file's wire
machinery mints package-own records for INHERITED names
(UIOP/UTILITY::SECOND) whose empty cells only the name-keyed
fallback kept alive; the ADR-0031 rule-2 raise then kills the asdf
compile. The emit-side accessibility-first intern (ADR-0031 rule
3 completion) is the prerequisite — cave#317.
Verified: 8/8 sharded suite, smoke, spike suite 16/0, alexandria via
the auto-loaded fasl, 12/12 package edge probes, bind-path probes
pre/post forced GC; replay boot 161.06G instructions (+0.12% vs
B.1 — the dormant stub costs nothing).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By:
Claude Fable 5 <noreply@anthropic.com>