#304 asdf fasl replay: aborts in uiop/image with 'The value ? is not a LIST (car/cdr)' (next layer after cave#303)

closed
Opened by atgreen

Residue after cave#303 (c769fc0). The asdf fasl (fasl-compile asdf.lisp, ~250s; load 0.12s) now survives uiop/os — designator funcall works, (uiop/os:detect-os) => :OS-UNIX — and replays through uiop/pathname, uiop/filesystem, uiop/stream into uiop/image, where the load aborts with:

; Error: The value ? is not a LIST (car/cdr). | in: LOAD

Measured post-abort (surviving session, package left at UIOP/IMAGE):

The printed offender is '?' (unprintable value) fed to car/cdr in some CO-RUN effect thunk. Same onion pattern as #302 -> #303: each fixed divergence unmasks the next form downstream. Repro: (fasl-compile "asdf.lisp" X) then (load X) in a fresh image. Next step: bisect uiop/image's top-level effect forms (register-image-restore-hook / image-dumped-p setup are the first CO-RUNs there), or gdb break on the car/cdr type-error raise during the 0.12s load.

Comments (1)

atgreen3992942688

FIXED in 2beac09. The '?' datum was the UNBOUND MARKER, and the mechanism was a VALUE-CELL SPLIT for uiop/image's defvars — the same first-touch-home disease as cave#303, on the KIND-2 channel:

  • A defvar's KIND-2 value-cell relocs carried NO home package: ag-global-home-pkg-name reads the record's home slot, but the global-vaddr patch entries hold NAME BVS, so it answered nil and the reloc went name-keyed.
  • At replay, the defvar's setq (and every free-var read) resolved through ag-runtime-mint-symbol to a name-keyed cell (record A), while quoted-symbol reads — (symbol-value 'image-restore-hook) inside register-hook-function — resolved through the accessibility door (record B, from the KIND-4 reloc). The setq wrote A; the read saw B = UNBOUND; pushnew car/cdr'd the marker.
  • Measured before the fix: (symbol-value 'uiop/image::image-restore-hook) => ? (unbound marker) while the free-ref read => NIL.

Fix: ag-global-door-home-name — KIND-2 homes resolve through the SAME accessibility door as cave#303's KIND-4 fix (reader-intern on the emission-site package; CL/CL-USER/KEYWORD and gensym names keep the record-slot fallback). The loader then interns every channel's cell on ONE record.

After: (symbol-value 'uiop/image::image-restore-hook) => (SETUP-TEMPORARY-DIRECTORY SETUP-COMMAND-LINE-ARGUMENTS SETUP-STDERR SETUP-STDOUT SETUP-STDIN) — the failing CO-RUN completes, all 5 restore hooks register and run. The load proceeds past uiop/image and dies one layer deeper at uiop/lisp-build's define-package replay with 'assertion failed' — filed as its own issue. Gates: sharded suite 8/8, spike oracle green, --hosted 42, fixed point held.