Skip to content

Specification Revisions

The revision log of the Decl specification. Every post-freeze change records: the date, the charter decision it rests on (new or amended D-number), the chapters touched, and a one-line rationale. A change without an entry here did not happen (docs/README.md, freeze rules).

Date Version Decision Chapters Change
2026-08-31 v0.1 all Initial freeze. P1–P7, D1–D29, chapters 01–13, guide, validation cases; gated by the §0.6 evaluator spike (31/31 green, spike/FINDINGS.md); all open questions resolved (OQ1–OQ7).
2026-08-31 v0.1 — (editorial) 07 Spell out §7.3’s per-site checking mechanism: context obligations collected at declaration, discharged at each embedding site; diagnostics attributed to the embedding line. No semantic change.
2026-08-31 v0.1.1 D30 (new) 03, 07, 11, 12 Context obligations are declared, not inferred: named types using $parent/$root/$key carry explicit context declarations ($parent: P); the variable is typed by its declaration, body checks are modular, and the site check is one subsumption test. Lexically nested type expressions are exempt (parent evident). Supersedes the inferred-obligation mechanism of the entry above. New codes E4094; E4090 reworded.
2026-08-31 v0.1.2 D30 (amended) 07 Context variables are references: $this/$parent/$root type as ref<…> (a value reading would be a self-containing value — the cycle D26 forbids); the declaration states the target bound P, the invariant ref wrapper is never written. $key stays a plain value.
2026-08-31 v0.1.3 D30 (amended) 03, 07 The ref wrapper is written, not implicit: context declarations read $parent: ref<P> — the annotation is the variable’s exact type (D2), the invariant compiler-enforced (bare non-ref bound is an error with the fix supplied). Supersedes v0.1.2’s never-written rule; no ambiguity exists since an owner is never itself a reference.
2026-09-01 v0.1.4 D31 (new) 03, 04 Static assignability is precise, then deferred: int +/-/* over range/literal operands infer interval-arithmetic ranges, and same-base-kind refinement targets (range, pattern, literal set, predicate) whose membership is statically undecidable defer to binding-time validation; kind mismatches stay static errors. Without this the frozen guide/benchmarks are ill-typed under strict S ⊑ T (found implementing the checker).
2026-09-01 v0.1.4 — (clarification) 02, 11 Unit-literal token boundary: the numeric reading is longest-first, so float exponents and radix prefixes never split into number + unit (1e3 is a float, 0o755 an int; 0s, 5eV are unit literals). The published tree-sitter grammar had the overlap and was fixed to §2.7 by construction.
2026-09-01 v0.1.4 — (registry) 12 Populate the E1xxx (lexical) and E2xxx (syntax) bands: E1001/E1002, E2001/E2002. Tools were using a provisional code for parse errors.
2026-09-01 v0.1.5 D32 (new) 04, 07 Roots own places; unbound literals are inert. No implicit re-rooting when a const-built record embeds into a root (E4093, now also static); the normative idiom for reuse is a constructor func bound per root; unbound literals support member access / with / embedding only. Found building the Phase 5 service-graph example.
2026-09-01 v0.1.5 — (clarification) 02, 08 State the declaring-module scope rule for imported types’ member expressions (§8.3, already implemented) and the exact newline continuation points (§2.9 — the grammar was always the source of truth).
2026-09-01 v0.1.6 D16 (consistent) 13 std.string grows split / contains / ends_with (append-only, D20 discipline): validating real edge keys of the form "a->b.c" needed split; the additions stay one-hop, so the OQ3 verdict on std.graph is unchanged.
2026-09-01 v0.1.7 D29 (amended) 10 Interchange leniency: an integer lexeme binds where float is expected iff exactly representable in binary64 (real corpora serialize whole floats as 500); serialization stays canonical (500.0); the reverse direction remains an error.
2026-09-01 v0.1.8 D33 (new) 02, 03, 11 Member positions are their own name space: keywords are ordinary bare member names in declarations, ./?. access, and object keys (real corpora use type, unit, …), with plain sibling references; true/false/null stay literals. Supersedes v0.1’s quoted-keyword rule; grammar + wasm updated.
2026-09-01 v0.2 — (cycle) v0.2 declared: the revision cycle over the Phase 2–5 findings is complete — v0.1.4 (D31 precise/deferred assignability), v0.1.5 (D32 roots own places), v0.1.6 (std.string growth), v0.1.7 (D29 interchange leniency), v0.1.8 (D33 keyword member names), plus clarifications (lexing boundary, continuation points, declaring-module scope) and the E1xxx/E2xxx registry bands. Adjudications recorded per entry in design/03_v02_revision_candidates.md; implementation, grammar, and corpus updated in step.
2026-08-31 v0.1.3 — (editorial) 07 Add the $key declaration example (map-key bound, array site error) and note the non-existence of $value ($this for entry values; predicate parameters for checked values). No semantic change.
2026-09-03 v0.2.1 — (clarification) 07 A conditional whose branches are navigations is itself a navigation in a ref<T> position: each branch is read as a place, only the taken branch resolves (§7.4). Found porting a real interconnect scratch — the runtimes read if as a value and rejected the maybe-absent branch. Same change: the runtimes now implement $key and $root (specified since v0.1.1), context variables evaluate as references (v0.1.2), pattern interpolation (§3.6), and outputs reading inputs with the on-demand fallback (§5.5–5.6, §9.4); no further spec text changed.
2026-09-03 v0.2.2 — (registry) 03, 12 A pattern body outside the §3.6 core is E4119 with a fixed message set, validated by the implementations themselves: delegating to the host regular-expression engine made the same defect read differently in each implementation (the one parity gap left by v0.2.1).
2026-09-04 v0.2.2 — (editorial) 04, 07 Align the dot-spellable wording of §4.3 and §7.2 with D33 (v0.1.8): reserved keywords are ordinary dotted member names; only the literal keywords true/false/null take the bracket form. No semantic change. Same change: the runtimes now spell map keys in canonical paths as ["…"] (§7.2, unchanged text) and refuse non-canonical reference strings from documents (§7.5); they had spelled identifier-shaped keys with a dot.
2026-09-04 v0.3 D4 (amended), D34 (new), D3/D19/D29 (amended) 01, 02, 03, 04, 05, 07, 09, 10, 11, 12, 13, guide Member kinds by shape; hidden members. ? says input may supply a member, = e says the schema computes it: required x: T, optional x?: T, defaulted x?: T = e, derived x: T = e / x = e — no const in record bodies (the keyword stays the module-level constant). A hidden member x$ = e is computed for the schema’s own use — read by expressions and $referrers, never part of the value (not emitted, compared, copied, or targetable; supplying it is E4006). Breaking syntax: the migration is mechanical (x: T = ex?: T = e, const x = ex = e); the tree-sitter grammar, all three implementations, the formatter, the corpus, and the examples moved in step. Found porting a real interconnect scratch whose link members leaked into every document (every peer language marks such members: Pkl hidden, jsonnet ::, Nickel not_exported, CUE _).
2026-09-06 v0.3.1 D35 (new) 05, 10, 12 Rendering is tooling, declared in the module. §5.10 names @render among the known annotations (on an output; metadata, its keys fixed by docs/tooling/05_render.md); §10.6 points to the renderer’s document for the tool-side conversions (documents in YAML, roots as YAML or indented JSON or a template’s text, fan-out) — interchange stays JSON; §12 reserves the E7xxx — rendering band and registers E7001–E7005, and rewords E6004 for a document in YAML. Editorial in the same change: the registry’s superseded E1xxx/E2xxx tables (pre-v0.1.4) removed, leaving the populated ones. The language does not change; the grammar gains the annotation rule §11.3 always had (the parsers lacked it).
2026-09-06 v0.4 — (cycle) v0.4 declared: the revision cycle over Phase 10 — v0.3.1 (D35: rendering is tooling, declared in the module with @render; documents in YAML; the E7xxx band) and the annotation rule of §11.3 implemented in the grammar and the three parsers (W0001 reported) — with the implementations, the editor extensions, and the corpus moved in step; released as 0.4.0.

© 2026 Luuvish. Decl is open source under the MIT License.

Type: Literata and IBM Plex, under the SIL Open Font License. Built with Astro Starlight.