#257 Split-twin symbol's VALUE CELL holds raw garbage (prints ?) — symbol-value returns junk instead of unbound; fabricates asdf false-upgrade cascade

open
Opened by atgreen

ADR-0026 family, caught during the asdf operate campaign (2026-07-08).

After (load "asdf.lisp"):

Consequence chain (explains a whole class of "asdf functional layer broken" symptoms):

  1. asdf-version = (symbol-value (find-symbol "ASDF-VERSION" :asdf)) → garbage, TRUTHY.
  2. (defvar previous-asdf-versions (let ((previous (asdf-version))) ...)) mid-load → (?) — a fabricated "previously installed ASDF".
  3. upgrading-p → T on a fresh load → asdf's when-upgrading purge machinery (fmakunbound/unintern of "old" definitions) RUNS during a normal load.
  4. Functions silently vanish (verified: upgrade-asdf undefined on BOTH symbol doors; asdf:asdf-version returns the garbage; operate died at (upgrade-asdf) with the anonymous undefined-function trap).

Also relevant: the undefined-function trap is shared and nameless (stdlib unresolved-call-trap, "P7") — naming the callee would have saved ~5 probe cycles here.

Workaround shipping in asdf-funcl.patch: #+funcl (defvar previous-asdf-versions nil) — no previous ASDF can exist on funcl; kills the false-upgrade cascade deterministically. The core fixes remain: (a) initialize twin records' value cells to the unbound marker at creation (wherever the reexport/find-symbol door manufactures them), (b) symbol-value should raise unbound-variable rather than return cell junk, (c) ADR 0026 single-canonical-symbol kills the class.

Comments (1)

atgreen3992785796

LIKELY MITIGATED, needs the original repro re-run to close: today's asdf loads (multiple full alexandria loads) show NO false-upgrade cascade, and the reporter double-fault that made value-cell garbage fatal is guarded (21f15f2). The split-twin class itself is ADR-0026 tail (#266). If the repro no longer fires, close; if a twin's value cell still reads garbage (vs unbound), it's the value-cell analog of the fn-cell work and should fold into #266's fix.