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 9665b2c
Browse filesBrowse the repository at this point in the historyBrowse files
feat(ns): D-554 — ns attr-map + name-symbol meta merge into ns meta
Smell-audited: 1: the row's original barrier (a Value in the Node needs
new rooting machinery) DISSOLVED with D-556 — the lifted map rides
pushAnalysisRoot -> persisted_analysis_roots, exactly the arena lifetime
the Node already has; no new mechanism was invented.
`(ns ^{:k 1} name "doc" {:author "a"})` now merges the name-symbol reader
meta + the attr-map into the ns meta (attr wins over name-meta; an
explicit docstring wins over an attr :doc — clj's ns-macro order). Both
backends per ADR-0036: tree_walk evalNs -> meta.mergeNsMeta (over the new
map.mergeInto); the VM rides the chunk literal pool (NsFilterEntry
attr_const index + NO_ATTR sentinel; bytecode v5 with the format-coverage
guard, round-trip asserts). e2e phase15_ns_docstring +2 cases; diff case
diff-ns-attr; clj-oracle-verified. D-554 discharged.
Copy file name to clipboardExpand all lines: .dev/debt.yaml
+6-5Lines changed: 6 additions & 5 deletions
Original file line number
Diff line number
Diff line change
@@ -24,11 +24,6 @@
24
24
# md-table-align no longer pads it to ~800 KB of whitespace.
25
25
26
26
active:
27
-
- id: "D-554"
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."
29
-
category: "clj-parity"
30
-
barrier: "none hard — design choice: formToValue at analysis (needs AnalysisFrame rooting for the map Value in NsNode) vs re-analyzing the attr-map Form at execution. Take up easiest-first or on a lib whose ns attr-map meta is read programmatically."
31
-
last_reviewed: "2026-07-06"
32
27
- id: "D-547"
33
28
status: |-
34
29
open (2026-07-01, NARROWED same day). Enforcement-honesty sweep — surfaced by the
@@ -6473,6 +6468,12 @@ discharged:
6473
6468
barrier: "DISCHARGED (was: static-member gap catalog+fill, ADR-0166 row 5)."
6474
6469
last_reviewed: "2026-07-07"
6475
6470
6471
+
- id: "D-554"
6472
+
status: "DISCHARGED 2026-07-07. The `(ns ^{…} name {:attr …})` ATTR-MAP and name-symbol reader meta now MERGE into the ns meta (attr wins over name-meta; an explicit docstring wins over an attr :doc — clj ns-macro merge order). The design barrier dissolved with D-556: the attr map is lifted at analysis via formToValue + pushAnalysisRoot, and production seams persist their AnalysisFrame roots (persisted_analysis_roots) for the arena's lifetime — so embedding the Value in NsNode is GC-safe with NO new rooting machinery. Both backends per ADR-0036: tree_walk evalNs -> meta.mergeNsMeta (new; over the new map.mergeInto); the VM rides the chunk literal pool (NsFilterEntry.attr_const u32 index, NO_ATTR sentinel; bytecode v5 with coverage-guard + round-trip asserts). e2e phase15_ns_docstring (7 cases incl. ns-attr-meta / ns-name-sym-meta); diff case diff-ns-attr; clj-oracle-verified ({:doc :author :added} + ^{:k 1} -> :k 1). ORIGINAL: split from D-239's discharge as the needs-a-Value-in-node residual."
6473
+
category: "clj-parity"
6474
+
barrier: "DISCHARGED (was: ns attr-map skipped at analysis)."
6475
+
last_reviewed: "2026-07-07"
6476
+
6476
6477
conventions: |-
6477
6478
- 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).
6478
6479
- New debt: grep `.dev/debt.yaml` for class-overlap before adding (per `.claude/rules/debt_dedup.md`).
0 commit comments