You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit 826cb6d
Browse filesBrowse the repository at this point in the historyBrowse files
fix(vm): D-555 — restore loc fidelity on op_push_binding_frame/op_require raises; sweep CLEAN + nightly cadence
Smell-audited: 1: the e2e expectations were written against the vm's
DEGRADED fallback (message once, no caret) — updated to print.zig's
intended form (message + caret = 2 occurrences) now that both backends
render it; the cycle case was the same class and updated with the same
reason comment.
The vm raised binding_target_not_dynamic and called loadOrFindNs with a
bare `.{}` loc, so these errors rendered header+message only while
tree_walk showed the full source window + caret. Each instruction already
carries line/col — wire the existing instr_loc through both sites.
check_vm_parity sweep is now CLEAN (0 failing: corpus 3903/3903 + every
e2e on -Dbackend=tree_walk; was 6 findings at first run). Cadence
mechanized: ci_gate.sh's FULL tier (nightly schedule + dispatch) runs the
sweep as step 3/3, so an oracle-only regression surfaces within a day
with no human in the loop. D-555 + D-556 discharged.
Copy file name to clipboardExpand all lines: .dev/debt.yaml
+12-10Lines changed: 12 additions & 10 deletions
Original file line number
Diff line number
Diff line change
@@ -24,16 +24,6 @@
24
24
# md-table-align no longer pads it to ~800 KB of whitespace.
25
25
26
26
active:
27
-
- id: "D-556"
28
-
status: "ROOT CAUSE FOUND + FIXED 2026-07-07 (the deftest-BFS integer-overflow panic + the D-555 GC family). The swept-string probe showed the FIRST post-bootstrap collect sweeping foundation strings (\"map\", \"clojure.core\", \"*in*\") on the tree_walk backend: fn-body Node literals live in the heap-lifetime analyzer arena, but the ADR-0169 AnalysisFrame bracket DROPPED its roots at form end — correct only for Nodes that die with their form; a (defn f …) body Node survives via Function.body and its literal pool was unrooted from the first collect on (the vm masks the EXECUTING chunk via the A1 pool root; a not-yet-executed fn had the same latent hole). FIX: root_set.endAnalysisPersist — production seams (driver x2, loader, repl, nrepl, evaluator oracle) persist their bracket roots into gc.persisted_analysis_roots (a GcHeap field, walked after permanent_roots; same lifetime the Nodes already have). ALSO landed in the same arc: the conservative C-stack scan (mark_sweep.conservativeStackScan: stack words from the ADR-0157 anchor + a setjmp register spill (Boehm GC_push_regs idiom), validated against a per-collect live-set hash, pinned — sound under non-moving mark-sweep) as the STRUCTURAL backstop for tree_walk's C-stack intermediates, and the 7 explicit A6/A6b brackets. VERIFIED: the original repro (rush-hour solver-test, pre-edit sources preserved in the scratchpad rhmin copy) passes 3/3 at BOTH default and 1MB thresholds on tree_walk; sym-meta GC e2e green; vm untouched. REMAINING out of scope: registered-WORKER-thread stacks are not conservatively scanned (parked at alloc-prologue; agent+tree_walk is the known D-418-adjacent area)."
29
-
category: "runtime"
30
-
barrier: "FIXED for the reported class — keep open until the D-555 re-sweep (check_vm_parity.sh) confirms which of the 6 findings cleared, then discharge with the sweep numbers."
31
-
last_reviewed: "2026-07-07"
32
-
- id: "D-555"
33
-
status: "SWEEP RE-RUN 2026-07-07 (post-D-556 root-cause fix): 6 findings -> 2. CLEARED by the persist-analysis-roots + conservative-scan arc: (1) watch_recursion segfault [the ADR-0157 tree_walk guard], (2) phase16_gc_torture, (3) symbol_metadata sym_meta_gc_survives, (4) seq_helpers2 interleave_large — all were the D-556 GC family. REMAINING 2 (both the SAME shape, not memory-unsafe): phase15_dynamic_var `guard` + phase15_require_fs `missing` expect `grep -c <message>` == 1 but tree_walk prints 2 — DIAGNOSED: print.zig's INTENDED error form is header+message THEN a source window with `^--- <message>` caret (message appears twice; print.zig's own unit test pins that form); the vm loses the SourceLocation for these errors and falls back to header+message only (1 occurrence), and the e2e expectations were written against the vm's DEGRADED form. Fix = restore loc fidelity on the vm path for these error classes (or consciously pin the fallback) + update the two e2e expectations; then the sweep is CLEAN and D-555 discharges. Cadence follow-up: wire check_vm_parity.sh into the nightly CI leg + Phase-boundary list. PRIOR: six findings from the first sweep (see history in this row)."
34
-
category: "runtime"
35
-
barrier: "none — deterministic repros in hand. Start with the phase15_watch_recursion SEGFAULT (memory safety) and the two GC-related fails (torture + symbol-meta) — likely a tree-walk-only rooting gap; the exit-code pair last (may be harness-shaped)."
36
-
last_reviewed: "2026-07-06"
37
27
- id: "D-554"
38
28
status: "open (2026-07-06, split from D-239's discharge). The `(ns name {:attr-map} …)` ATTR-MAP and `(ns ^{:m 1} name)` name-symbol meta are still SKIPPED at analysis (special_forms.zig analyzeNs) — only the docstring lands as {:doc} ns meta. clj merges name-sym meta + attr-map + docstring into the ns meta. Rare vs the docstring (libs mostly use :author/:added attr-maps); needs a Form->Value map conversion at analysis + ADR-0169-style rooting OR an arena-thread of the literal into both backends (the doc rode NsFilterEntry as a plain string; a map needs a Value). Mechanise via phase15_ns_docstring e2e when landed."
status: "DISCHARGED 2026-07-07 — the check_vm_parity sweep is CLEAN (0 failing: corpus 3903/3903 + every e2e on -Dbackend=tree_walk). Finding disposition: (1) watch_recursion SEGFAULT -> ADR-0157 guard ported to tree_walk; (2) gc_torture + (3) symbol_metadata + (4) interleave_large -> the D-556 persist-analysis-roots root fix (+ conservative stack scan backstop); (5) dynamic_var guard + (6) require_fs missing/cycle -> the vm LOST SourceLocation on op_push_binding_frame / op_require raises (bare .{}) — wired instr_loc (the per-instruction line/col the chunk already carries) so the caret renders; e2e expectations updated to print.zig'''s intended form (message + caret = 2 occurrences). CADENCE mechanized: ci_gate.sh's FULL tier (nightly schedule + manual dispatch) now runs the sweep as step 3/3 — an oracle-only regression is caught within a day, no human in the loop. ORIGINAL: six findings from the sweep'''s first run (D-553)."
status: "DISCHARGED 2026-07-07 — confirmed by the CLEAN check_vm_parity sweep (0 failing) + the original rush-hour repro passing at default AND 1MB thresholds on tree_walk. Root cause + fix narrative preserved in this row'''s history and private/notes/D556-gc-persist-roots.md: fn-body Node literals (heap-lifetime analyzer arena) lost their AnalysisFrame roots at form end -> endAnalysisPersist (gc.persisted_analysis_roots, walked after permanent_roots) at every production seam; PLUS the conservative C-stack scan + setjmp register spill (Boehm idiom) as the structural backstop for tree_walk C-stack intermediates; PLUS 7 explicit A6/A6b brackets. The user-filed integer-overflow panic was this class (a swept string'''s corrupted len overflowing Writer.drain arithmetic). RESIDUAL (recorded, not blocking): registered-WORKER-thread stacks are not conservatively scanned (the agent+tree_walk area, D-418-adjacent)."
- Structure: two top-level lists — `active:` and `discharged:`. Active entries carry id / status / category / barrier (+ optional quality_floor / last_reviewed); discharged entries carry id / discharged_at / resolution. Edit as YAML (no Markdown table to align).
6531
6533
- New debt: grep `.dev/debt.yaml` for class-overlap before adding (per `.claude/rules/debt_dedup.md`).
0 commit comments