v0.2 Revision Candidates
Adjudicated 2026-09-01 — the cycle is complete and v0.2 is declared (see
../REVISIONS.md). Outcomes: A1 → v0.1.4 (D31) · A2 → v0.1.4 clarification · A3 → v0.1.4 registry (E1xxx/E2xxx) · B1+B2 → v0.1.5 (D32, E4093 now static) · B3+B4 → v0.1.5 clarifications · C1 → v0.1.8 (D33, grammar + wasm updated) · C2 → v0.1.7 (D29 amended) · C3 → v0.1.6 (split/contains/ends_with) · C4 → no language change (idiom stands) · D1/D2/D4 → implemented (E4090/E4093 static checks,matchesevaluation + static E4071) · D3 → remains a documented linker limitation.
Findings collected while implementing Phases 2–4 against the frozen
v0.1 specification and validating it on real-world corpora in Phase 5.
Nothing here changes v0.1: each entry is a candidate for the v0.2
revision cycle, to be adjudicated one by one through the standard
process (charter decision + affected chapters + REVISIONS.md in one
change). Entries are ordered by category, then by weight of evidence.
A. Spec defects — the frozen text conflicts with its own corpus
Section titled “A. Spec defects — the frozen text conflicts with its own corpus”- A1. Strict
S ⊑ Tstatic assignability rejects the guide and benchmarks (§3.18, §4.4).port: 9000 + i(withi: 0..<3) infersint, which is not⊑ 1..65535; a string template is not⊑a pattern type. Both forms appear in normative examples. The reference implementation keeps the corpus sound with two precision devices — interval arithmetic over int ranges for+/-/*, and deferring same-kind refinement targets (pattern / range / literal set) to binding when membership is statically unprovable. v0.2 should standardize both (or an equivalent rule) in §3.18/§4.4. - A2. Unit-literal lexing overlapped numeric tokens (§2.7 vs ch. 11).
0o755,1e3,1e-3lexed as unit literals under the published grammar, contradicting §2.7 (“only decimal forms take units”, float exponents are part of the number). The tree-sitter grammar was fixed to §2.7 by construction (no lookahead); ch. 11’s EBNF should state the same token-boundary rule explicitly. - A3. No parsing-error code band in §12. The registry starts at E3xxx; tools need a code for “syntax error” (the implementation uses a provisional code). Reserve and define an E1xxx band.
B. Underspecified semantics surfaced by use
Section titled “B. Underspecified semantics surfaced by use”- B1. Module-
constrecords shared into several roots (§7.5). Aconst base: Topologyembedded in twooutputs gives its internalrefs const-rooted places — E4093 territory, but nothing defines what embedding a const-rooted record value into an output means for the references it carries. The working idiom is a constructorfuncreturning the literal (each output binds its own copy). v0.2 should either bless that idiom normatively and add the static E4093 check, or define re-rooting semantics for embedded values. - B2. Reshaping unbound literals (§4.12, §4.8). A constructor
func’s result is an unevaluated literal until it reaches a typed
position; chaining
with/ comprehensions over it before binding has no defined semantics (the implementation supports plainwithon such values, nothing deeper). Either define the lazy-structure semantics or state the restriction. - B3. Declaring-module scope for member expressions (§8.3).
Imported types’ derived members and asserts must evaluate in the scope
of the module that declared them (sibling consts, namespaces,
$referrerstargets) — the implementation enforces this; the chapter implies but never states it. - B4. Continuation lines in
assert(§2.9, ch. 11). Afterassert name:a newline continuation may not begin with(; the working form wraps the whole condition in parentheses opened on the colon line. Specify the continuation points precisely (the grammar has them; the prose does not).
C. Extension demands from the real-world corpora
Section titled “C. Extension demands from the real-world corpora”- C1. Expression-position access to keyword-named members (§4.3).
Real documents use
typeas a member name. Declaration positions accept it; expressions must fall back to$this["type"]. Consider contextual keywords for member access (x.type). - C2. Numeric leniency at the interchange boundary (§10). Real
documents serialize whole floats as integers (
"frequency": 500). Schemas work around it withint | float. Consider: a float-typed binding position accepts an integer lexeme exactly representable in binary64. - C3.
std.stringgrowth (§13.6). Validating edge keys of the form"a->b.c"needssplit(and would usecontains/ends_with). One-hop operations stayed sufficient otherwise —std.graphremains unjustified (OQ3 verdict unchanged). - C4. Empty-string sentinels as an idiom. Real parameter bags use
""for “not configured” where a name is otherwise required; the"" | Identunion reads well and needs no language change — worth a guide/idiom note.
D. Implementation gaps to close (no spec change needed)
Section titled “D. Implementation gaps to close (no spec change needed)”- D1. E4090 (embedding-site context bounds, §7.3) has no static check yet.
- D2. E4093 (ref navigating a module const) has no static check yet (see B1).
- D3. Generic type arguments that reference importer-local types resolve in the exporting module’s scope and can miss (documented limitation in the module linker).
- D4.
matchesevaluates only where the checker types it; the engine lacks amatchescase.
Evidence base
Section titled “Evidence base”Phases 2–4 test suites (251 checks across eight runners) plus the
Phase 5 sweeps: the three committed domain examples under examples/
(service graph, fixture generation, synthetic network fabric with
scale and corruption probes), and a local-only schema additionally
validated against the full proprietary fixture corpus — 178 documents
including the complete real set (artifacts kept out of the repository
by security policy).
© 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.