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 4f03401
Browse filesBrowse the repository at this point in the historyBrowse files
feat(meta): D-316 — computed def-meta evaluates at def time (clj-exact)
Smell-audited: 1: the residual resolved ON the D-563(b) meta_expr
channel — the def-meta map now analyzes as a real expression (quotes
stay data, computed values evaluate: ^{:k (+ 1 2)} → 3, defn attr-map
(* 2 3) → 6, both clj-oracle-matched). The enabling fix is at the
GENERATORS: defn/defmacro now QUOTE their synthesized :arglists like
clj does, which is what made raw-expression analysis safe (the earlier
wholesale-quote workaround existed only to protect those raw lists).
Corpus def_meta_eval.txt; 2 e2e cases; D-316 discharged (active ->
discharged).
Copy file name to clipboardExpand all lines: .dev/debt.yaml
+12-12Lines changed: 12 additions & 12 deletions
Original file line number
Diff line number
Diff line change
@@ -611,18 +611,6 @@ active:
611
611
user-ns resolution). The current source-synthesis migrates cleanly: the
612
612
synthesized form IS the Clojure body that fn would host.
613
613
last_reviewed: "2026-06-07"
614
-
- id: "D-316"
615
-
status: "NARROWED (2026-06-08) — quoted-datum + literal meta values now evaluate at def time. analyzeDef/analyzeDefmacro lift via unquoteMetaValues: a `(quote X)` meta value lifts to X (clj parity), covering the realistic case `:arglists '([k v])` (integrant defmulti) + `{:k '(a b)}`; literals are unchanged; defn synthesized :arglists unaffected. RESIDUAL: arbitrary COMPUTED meta (`{:k (+ 1 2)}`) still stores the unevaluated Form — full def-time RUNTIME eval needs a meta-expr node threaded through DefNode/op_def/evalDef (depth-2, both backends), deferred as rare (real def-meta is literal or quoted, never computed). 5 e2e (phase14_def_meta_quote_value). PRIOR: now (2026-06-07, integrant probe / defmulti fix) — def-target metadata MAP VALUES are not evaluated. `(defn g {:foo '(a b)} [x] x)` → `(:foo (meta #'g))` is `(quote (a b))` in cljw vs `(a b)` in clj; same for the defmulti attr-map `:arglists '([k v])` (cljw `(quote ([k v]))` vs clj `([k v])`). GENERAL: the attr-map / `^{…}` value FORMS are attached to Var.meta verbatim, not evaluated. Affects defn + defmulti (and any `^meta`). Not defmulti-specific — surfaced while fixing defmulti docstring/attr-map attachment (which itself now matches clj for `:doc`). Low-impact (most metadata values are literals: strings/keywords/bools), but `:arglists`/computed-meta diverge."
616
-
category: "scope"
617
-
barrier: |-
618
-
Def-target metadata map values are attached as unevaluated Forms. clj
619
-
evaluates `^{:k expr}` / attr-map values at def time. Fix: evaluate the
620
-
metadata map's VALUES (analyzeDef / the meta-lift path) instead of storing
621
-
the raw value Forms, so `:arglists '([k v])` → `([k v])`. Touches the meta
622
-
side-channel lift shared by defn/defmulti (buildDefnMeta + analyzeDef). Most
623
-
metadata is literal so impact is narrow; surfaced by integrant's defmulti
status: "open — security (SE-8, eval-free deploy build). `eval` (+ read-string) is public with no confinement story. read-string is ALREADY eval-free by design (ADR-0122 / AD-026 — `#=` not evaluated; the read-eval RCE footgun is closed). The residual is the `eval`/nREPL surface itself: a deployed serverless edge binary should be able to ship eval-free, author opts IN."
628
616
category: "security"
@@ -2384,6 +2372,18 @@ standing:
2384
2372
barrier: "open after the D-440 arc completes (R4 + R5 must first rewrite the bulk of 'Phase N' citations to gap-area terms). Premature adoption = ~70 dangling citations with no 1:1 redirect. Trigger: D-440 R4/R5 done + a user nod to re-architect the planning axis (it is depth-4, the project's organizing metaphor)."
2385
2373
last_reviewed: "2026-06-15"
2386
2374
discharged:
2375
+
- id: "D-316"
2376
+
status: "DISCHARGED 2026-07-17 — the residual (computed def-meta) resolved on the D-563(b) meta_expr channel: the def-meta map now analyzes as a REAL expression (quotes stay data, literals embed, computed values EVALUATE at def time — clj-exact, oracle [3 (a b) \"s\"] / defn attr-map (* 2 3) → 6). Prerequisite: defn/defmacro now QUOTE their synthesized :arglists at the generator (like clj), which is what made raw-expression analysis safe. unquoteMetaValues stays only for the analyze-time static Var.meta lift (pre-eval approximation; the runtime value wins). Corpus def_meta_eval.txt; e2e computed_meta/defn_attr_computed on phase15_var_source_meta. ORIGINAL NARROWED note (2026-06-08) + original finding (2026-06-07) in git history."
2377
+
category: "scope"
2378
+
barrier: |-
2379
+
Def-target metadata map values are attached as unevaluated Forms. clj
2380
+
evaluates `^{:k expr}` / attr-map values at def time. Fix: evaluate the
2381
+
metadata map's VALUES (analyzeDef / the meta-lift path) instead of storing
2382
+
the raw value Forms, so `:arglists '([k v])` → `([k v])`. Touches the meta
2383
+
side-channel lift shared by defn/defmulti (buildDefnMeta + analyzeDef). Most
2384
+
metadata is literal so impact is narrow; surfaced by integrant's defmulti
DISCHARGED 2026-07-17 — Character/getName + codePointOf land on the generated UCD 16.0.0 word-indexed name table (scripts/gen_unicode_names.py → unicode_names.zig, pre-compressed raw-deflate blobs + delta-varint index, decoded once per process in char_name.zig). JVM-oracle-exact semantics: stored names, pinned control aliases (scripts/data/jvm_control_names.txt), assigned-but-unnamed = "<BLOCK> <HEX>" (the JVM does NOT synthesize UCD algorithmic names), unassigned nil; codePointOf = trimmed case-insensitive inverse accepting exactly getName output forms. Corpus char_names.txt 10/10. Size: mac +279KB (7.35MB; ADR-0172 revision — README claim 7.8MB; Linux ~94% of ceiling, next size work measures Linux first).
0 commit comments