+ status: "RESOLVED-PENDING-FINAL (2026-06-05) — the CONFIRMATION full-suite torture run (CLJW_GC_TORTURE=1 bash test/run_all.sh --serial-e2e) after all D-252/D-253 fixes shows 0 DRIFTs + 0 panics through the entire diff corpus (where all 38 gaps lived) + the SINGLE-THREADED e2e. (The run later HUNG/crashed in the THREADING e2e — a SEPARATE D-244 #4 multi-thread-STW class, not a corpus gap; see caveat below.) The 38 single-threaded gaps are RESOLVED — torture-green on the corpus. Root-cause fixes that rippled: multi_fn missing-trace (C7, also print-method/clojure_test), realizeSeqWalk (nested-lazy print, partition family/seq_tail/seq_return/print_length_lazy), valueToForm (macroexpand: with_redefs + all macro lazy expansions), atom notifyWatches (atom_watch), + the major classes (Function.header/reduce/persistent-waypoint/constant-pool/isGcManaged). NOTE: this UNBLOCKS the D-250 tier-2 cadence (a clean full-suite torture); the auto-collect-ON flip (D-244 #4) is STILL a separate user-owned decision (full runtime re-audit + user awareness). MULTI-THREAD CAVEAT: the confirmation run hung/crashed in e2e_phase14 future/promise — `(future (reduce + (range 1 100)))` torture-hangs(124), `(mapv #(future (* % %)) …)` crashes(134). A WORKER thread's torture back-edge poll triggers a MULTI-THREAD STW collect = the D-244 #4 dormant/highest-risk path, NOT a single-thread corpus gap. Scope torture single-thread until D-244 #4 multi-thread-STW is validated (the NEXT investigation, tracked under D-244). PARTIAL FIX (2026-06-05): the torture poll (vm.zig) now fires ONLY on the MAIN (unregistered) thread — `root_set.is_registered_worker` gates it — so a future/agent WORKER's own STW collect can no longer self-deadlock (`stopWorld(false)` waited for the caller to park) or miss the main's roots. A MAIN-thread collect parks the registered workers + walks the complete root set, validating multi-thread rooting from the main driver. FIXED: `(future (reduce + …))` (was 124), `(mapv #(future …) …)` (was 134), pmap. RESIDUAL: `(let [a (agent 0)] (send a inc) (await a) @a)` under torture returns blank (the agent send/await/drain path — separate, lower-freq; next). The WORKER-INITIATED collect itself (a worker crossing the threshold) is still the dormant D-244 #4 (needs the collect to walk the main's roots too). Was: OPEN (from the first FULL-SUITE torture sweep — D-250 tier-2 cadence executed: CLJW_GC_TORTURE=1 bash test/run_all.sh --serial-e2e). After the ADR-0094/0095 + D-252 C2/C3/C6/C9 fixes closed the major classes, the full corpus/diff suite under torture surfaced 38 remaining DRIFTs across 12 areas — torture-green (D-250 tier-2 = zero crashes) is NOT yet reached. CLUSTERS (likely shared root causes): (a) DYNAMIC-VAR / BINDING-FRAME (~20): atom_watch(5) FIXED — notifyWatches roots atom+watches+cursor across the watch fn's reentrant eval. REMAINING (a): clojure_test(8, = report multimethod C7 + *report-counters* swap), with_redefs(4), thread_bindings(3), with_open(2) — suspected the binding-frame walk or watch/validator closures swept across a reentrant swap!/bound-fn eval; investigate root_set current_frame + atom.watches rooting first (may fix the whole cluster). (b) SEQ-REALISER: FIXED — root cause was printResult's deep-realize walk (realizeSeqWalk), NOT partition: its `cur` cursor + the gpa accumulator of realized items were held across seq/first/rest + the recursive deepRealize (all re-enter the VM) with no EvalFrame. A NESTED lazy seq (partition = lazy-seqs of lazy-takes) corrupted (`((1 (1 (1 ...`). Fixed with an EvalFrame rooting [cursor]+locals=items (refreshed each iter / after append). Clears partition/partition-all/partitionv/split-at + nested-lazy print. partitionv panic + seq_tail/seq_return/print_length_lazy were the same root. (c) multimethod(3, =C7) FIXED — .multi_fn had NO GC trace (gc.alloc'd, method_table swept = missing-trace gap, not reentrant); added traceGc marking its 8 Value fields + the missing registerGcHooks. Also fixed print-method (a defmulti). REMAINING (c): syntax_quote(3), string_misc(1). RE-VERIFY (2026-06-05, post realizeSeqWalk+multimethod+atom_watch): the broad-impact fixes RIPPLED — clojure_test (was hang), syntax_quote, string_misc, with_open, binding/thread_bindings, partition family are ALL torture-CLEAN now. with-redefs FIXED — root cause was the analyzer's valueToForm (Value->Form round-trip of a macro expansion): valueSeqToForm/Vector/Map/Set held the seq cursor / source Value in Zig locals across the recursive valueToForm + lazy realization (re-enter the VM). A torture collect mid-macroexpand swept the cursor -> the macro's lazy `(seq (concat …))` realized garbage -> `(var <list>)`. Same realizeSeqWalk class. Fixed with an EvalFrame per converter. ALL 38 full-suite-torture DRIFTs are now resolved (the broad fixes + this); re-run the full-suite torture to confirm green and flip D-250 tier-2. NOTE clojure_test(8) RESIDUAL after C7: now HANGS (exit 124) in the clojure.test `is` machinery (binding-frame/dynamic-var sub-cluster, with with_redefs/thread_bindings). Panics seen: chunk_buffer index-16-OOB + range.seqChunk 'integer does not fit' (garbage count). Full per-program inventory: private/notes/torture-full-sweep-gaps.txt (38 DRIFTs with want/got). This is the systematic torture-green campaign; fix cluster (a) first (highest count + likely shared cause), then (b) via the EvalFrame exemplar, then (c). Re-run the full-suite torture sweep after each cluster. Block auto-collect-ON until zero."
0 commit comments