#257 Split-twin symbol's VALUE CELL holds raw garbage (prints ?) — symbol-value returns junk instead of unbound; fabricates asdf false-upgrade cascade
openADR-0026 family, caught during the asdf operate campaign (2026-07-08).
After (load "asdf.lisp"):
- (%fn-ptr-as-fixnum 'asdf/upgrade::upgrade-asdf) = 1083427963 but (%fn-ptr-as-fixnum (find-symbol "UPGRADE-ASDF" "ASDF/UPGRADE")) = 36434265987 — TWO symbols, same name, same package (the split).
- Worse: (symbol-value (find-symbol "ASDF-VERSION" :asdf)) returns a GARBAGE object that prints as
?— not NIL, not an unbound error: the twin record's value cell was never initialized to the unbound marker and reads as raw junk. The direct reference asdf/upgrade::asdf-version correctly reads "3.3.7".
Consequence chain (explains a whole class of "asdf functional layer broken" symptoms):
- asdf-version = (symbol-value (find-symbol "ASDF-VERSION" :asdf)) → garbage, TRUTHY.
- (defvar previous-asdf-versions (let ((previous (asdf-version))) ...)) mid-load → (?) — a fabricated "previously installed ASDF".
- upgrading-p → T on a fresh load → asdf's when-upgrading purge machinery (fmakunbound/unintern of "old" definitions) RUNS during a normal load.
- 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.
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.