TSON 2026 Revision 33 — Change Log
This document records the changes accepted into Revision 33 of the TSON specification series, adjudicated from the implementation’s spec-feedback register (59 entries) and the change report Removal of Cross-Namespace Template Linkage (CR-structure-templates). SPEC-FEEDBACK.md remains a record against Revision 32 and is not modified by this revision; each of its entries receives a disposition here.
Provenance markers used in the disposition table:
- [settled] — the resolution was settled by the spec author inside the feedback register itself, or is already implemented in the revised companion artifacts shipped with this revision.
- [settled] — disposition proposed by this adjudication; consistent with the feedback’s suggested resolution and the artifact evidence, pending confirmation.
- [open] — a genuine design decision the revision editor must make before the edit can be executed. Collected in §5.
1. Baseline: CR-structure-templates is accepted
Revision 33 adopts CR-structure-templates in full, together with its assumed companion
change (the array size sugar desugars directly to !array binding records). The revised
companion artifacts already implement it. Summarising the normative effect:
- D1/D2 — Map sugar
{K => V}. The map type gains a sugar form mirroring the data notation, with an optional size specifier ({K => V ; N..M}), a simple-ref key, one entry, no?on either side, and no interior annotations. (Part 2 §5.3, §12.1, §12.2.) - D3 — De-parameterised constructors.
array,set, andmaplose their parameter lists and= Troutes; type slots become plain REQUIREDtype_reffields. (Part 2 §4.2, §5.6; meta-kernel.) - D4 — Generic heads resolve locally.
name<args>heads resolve through the type-name namespace only (parameters, locals, imports); an unresolved head is an unresolved-type error; a head resolving to a parameter is a resolver error. The §3.3.1 generic-head bullet and its fallback ordering are deleted; a migration diagnostic (SHOULD) suggests the sugar spelling. This resolves feedback #28 by construction. - D5/D6 — One lift rule, structural identity. Every sugar form lifts at desugar —
concrete forms to closed synthetic entries, parameter-bearing forms to open synthetic
entries; a declaration’s own body never lifts; materialisation closes open synthetics
innermost-out. Closed synthetics are keyed on the resolved binding record (source names
the constructor); open synthetics on the alpha-normalised body; instantiation entries
on the flattened application in
source; identity settles after Pass 2 and the two channels dedupe against each other. - D7/D9 —
instance_template/template_argumentand theinstance-templateproduction. The open counterpart of a constructor application, resolver-produced (never authored as!instance_template),top &and unmarked likereference; declaration-time checking of everything the parameter list does not obscure; an unreferenced declared parameter is an error; regular-recursion restriction (R5) as a normative v1 boundary. - D10 — One bracket production, one map production; the positional restriction is
dropped. Size specifiers and element/position
?become legal at every type-ref position. This is a language change: documents that were parse errors under Revision 32 become valid. Feedback #31 is resolved by this collapse, and its “not a change to the language” framing is superseded as the CR records. - §4.1 hardening.
!targets resolve through the structure namespace only, with no type-name precedence and no local capture (a localarraycan no longer capture!array). A semantics change beyond the core proposal, listed per CR §6/R7. - Deletions. The size-refinement templates (
array_min/array_max/array_ranged),vector, refinement-of-application-heads (map<text, text> ^ { … }), the parameterized-heads-over-binding-records carve-outs (§5.10, §7.2), the layer-visibility apparatus, and the inline/declaration tier split. - Additions.
token_set(kernel-internal named entry),instance_template,template_argument; theinstance-templategrammar production. - Pipeline. §3.4.1 becomes Parse → Desugar → Pass 1 → Pass 2, desugar purely syntactic and per-declaration.
- R8 (conformance tiering) is accepted into Part 2 §1.3 as a normative clause: a consumer ingesting only resolved output is fully conforming with zero §5.10 support — the closed-entry rule guarantees the wire carries no template machinery. [settled]
- R9(b) (content-derived synthetic names) is accepted as a SHOULD; the resolved fixtures already use content-hash-derived names. Names remain non-normative between implementations. [settled]
- R10 is moot for this revision (the tranche question is an implementation-sequencing concern; the spec text lands whole).
2. Disposition summary
| # | Entry (abridged) | Disposition |
|---|---|---|
| 1 | Trailing whitespace after closing """ | Accept — permitted and ignored, symmetric with the opening rule (P1 §7.2.3). [settled] |
| 2 | Prefix stripping vs short/ | Accept — remove the matching portion only; never an error (P1 §7.2.3). [settled] |
| 3 | @a:@b:val target cannot stand alone | Accept — extend the example (… target extra) and note why (P1 §3.1). [settled] |
| 4 | Custom type-ref matching undefined in Part 1 | No spec change — Part 2 defines resolution; binding heuristics are implementation policy. Guide note candidate. |
| 5 | !email missing from P1 §5.5 | Accept — add the row and scope the RFC 5322 pin to the dot-atom "@" dot-atom core (no quoted local parts, domain literals, or comments) (P1 §5.5; meta email_type doc). [settled] |
| 6 | §5.6 lists 4 of 16 integer_type instances | Accept — list the full family (int8–int256, uint8–uint256, the four bound-only refinements); confirmed oversight. [settled] |
| 7 | What a typed-binding consumer does with unresolved markers | No spec change — implementer guidance (report by default, preserve on request). Guide note candidate. |
| 8 | ”is a parse error” for atom-format violations collides with §8.1 | Accept — restate as “is a resolver error” in P1 §5.2 (and align §5.3–§5.5 phrasing); §8.1 resolver-category description gains atom-contract failures. [settled] |
| 9 | !text absent from the built-in vocabulary | Accept — the absence was an omission; !text is added to the Part 1 built-in vocabulary (P1 §5). [settled] |
| 10 | Base64 padding requirement unstated | Accept — padding is REQUIRED for !base64/!base64url/!base32 (canonical padding bits stay MAY per RFC 4648 §3.5) (P1 §5.3). [settled] |
| 11 | binary breaks the _type suffix convention | Accept (keep the name) — binary keeps its name for this revision; the naming/ |
| 12 | !duration and ISO 8601 PnW | Open (carried) — deliberately left open; likely revisited in a later revision. No spec change this revision; the question stays recorded here, not in the specification. |
| 13 | Annotation attachment has no host-binding equivalent at scalar positions | No spec change — binding-layer concern. Guide note candidate. |
| 14 | construction-def can’t parse §5.8’s own example | Accept — [ws "&" ws record-def]; fold with #38’s operand fix (P2 §12.1). [settled] |
| 15 | §12.1 lead overstates field-modifier = data-value | Accept — correct the sentence (P2 §12.1). [settled] |
| 16 | instance/atom-refinement payloads too wide | Accept — instance = "!" type-name ws core-value; atom-refinement = "!" type-name ws "^" ws record-def; applied on top of D9’s restructured type-def (P2 §12.1). [settled] |
| 17 | Chained atom refinement: retarget-replaces vs merge | Accept — merge semantics stated explicitly, analogous to §5.7 body materialisation; add a chained worked example (P2 §5.6). [settled] |
| 18 | unit instances distinguishable only by prose | Accept — state normatively that value/token/void MUST be dispatched by declared name: !unit {} instances are internal, machine-recognised primitives whose contracts are fixed by this specification. A machine-readable contract home for third-party unit instances is deferred. [settled] |
| 19 | ~ declarations restricted to kernel-governed schemas? | Accept — ~ is not allowed in user schemas: a constructor declaration (constructor: true) is valid only in a meta-schema — a schema document whose own !!meta names the meta-kernel; elsewhere it is a resolver error (P2 §2.2.2, §4.2). Coherent with #57: extended meta-schemas declaring data-kind constructors are kernel-governed. [settled] |
| 20 | .tn1 used before v1 exists | Accept — the artifacts have moved to the unversioned .tn extension. §7.1 gains the rule: .tn carries no stability claim and is the extension of the 2026 revision series; .tn1 is reserved for the version 1 freeze; note that the rename at freeze changes !!id canonical identities and re-pins the chain. [settled — artifacts renamed] |
| 21 | Validation of shadowed duplicate occurrences | Dissolved by #41 — duplicates are rejected; the second occurrence is the error. |
| 22 | RFC 9485 pin: subset gate? divergence documentation? | Accept — the pin is a strict gate (non-I-Regexp regex value is a resolver error) and implementations MUST document divergences (constructs unenforced, host-engine delegation, Unicode version) (P2 §9/ |
| 23 | Untagged same-class value-disjoint choices | Dissolved by #47 — same class ⇒ disjoint: false ⇒ tag required. |
| 24 | disjoint two-valued prose vs refuted state | Dissolved by #47 — derivation is total and two-valued. |
| 25 | Non-productive recursive types | Accept — a type with no finite model is a resolver error (MUST); “guarded” defined: OPTIONAL field/ |
| 26 | Hash pin in URI query | Open (carried) — the query form is kept for now; no spec change this revision. Whether the pin moves to a fragment or a structured directive stays an open question in this change log. |
| 27 | ”Tightens” undefined for selector facets | Accept — state the refinement rule per facet kind: ordered facets (tighten only), permission flags (withdraw only), member sets (shrink only), selectors (substitution permitted — say whether IS-A survives), fixed facets (restate only). Reconcile core’s complex doc with the outcome (P2 §5.7; core.tn). [settled] |
| 28 | Generic-head lookup ordering/ | Resolved by CR D4 — heads resolve type-name-only; the four sub-questions dissolve. |
| 29 | §6 has no conformance force | Accept — add a Class 2 bullet: annotations MUST be resolved one hop against the governing target and their values validated against the named type’s contract; resolver output preserves them. Failure mode per #56. Fix Part 1 §2.1’s example (see §4.1 below). [settled] |
| 30 | No optional-valued annotations | Resolved — declined — an annotation has exactly the two §6 forms: bare @T (void-targeted, shorthand for @T:_) or @T:value (typed value). Annotation values cannot be optional; §6 stands as written. meta.tn’s text-targeted deprecated/since/todo/lang are unchanged, and Part 1 §2.1’s example is corrected to conform (#29 item 3). [settled] |
| 31 | Two bracket productions, ambiguous type-def | Resolved by CR D10 — collapsed; restriction dropped; recorded as a language change. |
| 32 | Instantiation supertypes unreachable from the carrying schema | Accept (residual) — the forcing case is gone (no supertype transfer; size templates deleted), but state once that a resolved entry’s derived references (source, supertypes) are checked against the namespace of their derivation, not the author’s (P2 §8.1). [settled] |
| 33 | Sized array IS-A array, unsized not | Resolved by CR/supertypes; delete the three IS-A passages (§5.6 “IS-A array…”, §8.1’s array_ranged closure sentence, §8.2’s entry-shape supertype transfer and example). [settled] |
| 34 | §9.4 names the one UTS #39 mechanism that needs context | Open (carried) — needs further investigation; no spec change this revision. The proposed restructure (Identifier_Status at the §7.1 profile; scoped comparison sets; on-detection action; quoted names) stays recorded here for a later revision. |
| 35 | ”Metadata must follow =>” vs 104 fixture @docs | Accept (reading 2) — delete the sentence; an annotation before the name is metadata about the declaration; §8.1 states that schema-map keys carry annotations in resolver output; §10.1 states ingest treatment; @alias classified as derived — discarded and recomputed on ingest (P2 §6, §8.1, §10.1). [settled — fixtures round-trip name-position @doc] |
| 36 | Group reduced to zero members | Accept — state the two-member minimum as an output invariant and the full arity ladder: ≥2 survives, 1 dissolves into a field with the group’s state, 0 removes the group (P2 §5.11). [settled] |
| 37 | Subtraction revokes IS-A for all parents | Accept (flat rule, justified) — keep the flat break; replace rule 3’s circular justification with the head-level-legibility rationale; give §4.3’s “revokes it” the same per-parent precision; note the subtract-then-compose idiom for partial retention (P2 §5.9, §4.3). [settled] |
| 38 | Composition operands drawn from type-ref | Accept — supertype-ref = type-name [ws "<" type-args ">"]; generalize §5.7’s vocabulary-body requirement to composition (natural home §4.3); state whether choice bodies are deliberately excluded (they are: variants, not fields) (P2 §12.1, §4.3, §5.8). [settled] |
| 39 | OPTIONAL_FIXED injection unstated | Accept — not injected (omission leaves the field absent); state the state’s purpose (presence is the payload); a written FIXED value MUST be verified, mismatch is a validation error, never overwritten; retire the “two independent axes” framing (P2 §5.2). [settled] |
| 40 | Closure unstated for constructor bodies in schemas | Accept — a construction/ |
| 41 | Duplicate fields/ | Accept — MUST NOT: duplicate record field names and textually identical map keys are rejected; both last-value-wins rules deleted; type-aware duplicates under a schema are Class 2 validation errors (P1 §2.5, §2.6; P2 §7.7). Dissolves #21. [settled — implemented ahead of spec] |
| 42 | The series never needs a warning severity | Accept — state once: a conforming TSON processor has one severity; this specification never asks for a warning, and resolve the inventory: _ at REQUIRED_DEFAULT → validation error (omission still injects); set-position duplicates → validation error (delete first-wins); vacuous 0.. → resolver error (suggest [T]); unused parameter → resolver error; parameter shadowing a schema type → resolver error; non-productive recursion → resolver error (#25); @disjoint outcomes → verified/!!schema) is a separate normative change — accepted, at minimum for validating processors, so “valid” can never mean “checked nothing” (P1 §2.5/ |
| 43 | Map-key identity for the schemaless reader | Accept — name the third layer: a processor that decodes values compares decoded values (textual identity is the parser’s minimum); a declared key type may only make more keys equal; a key’s type-ref and annotations do not participate in identity. With #41 this is a rejection rule (P1 §2.6; P2 §7.7). [settled] |
| 44 | Shadow-channel parameters on constructors rejected nowhere | Accept — a ~ declaration whose parameter occurs in any type-reference channel is a resolver error at the declaration; cross-referenced from §5.10’s shadowing/ |
| 45 | Size templates: ^ over an application misapplies IS-A | Largely resolved by the CR baseline (templates deleted; sugar desugars direct; defect (a)‘s three passages corrected per #33). The C<args; member …> named-partial-application syntax is deferred — nothing in the kernel needs it now; record as a design note. [settled/ |
| 46 | Level rule: constructor operand ⇒ ~ result | Accept — state in §4.2 as a resolver error; one-directional (kinds and mixins may feed a ~ declaration); cross-reference §5.7/ |
| 47 | Disjointness as discrimination-class distinctness | Accept — total, two-valued, normative: classes boolean /false; the tag is REQUIRED unless disjoint; @disjoint outcomes verified/ |
| 48 | void as a choice variant | Accept — a variant MUST NOT resolve to void (judged after flattening); diagnostic states “optionality is not choice” (P2 §5.4). [settled — implemented] |
| 49 | Nested ? has no structural channel | Resolved by CR/ |
| 50 | Constructor applications must materialise | Accept — every application materialises an entry at desugar; a use site is a bare reference; declaration bodies remain constructions-in-place; delete §5.3’s “Resolution is structural” paragraph and §5.4’s inline-choice-no-entry sentence; type_ref.arguments survives only in source (P2 §5.3, §5.4, §8.2). Artifact fix required: the revised meta-kernel’s type_ref/type_argument doc strings still describe structural carriage — stale against the fixtures, which materialise (see §6). [settled — fixtures implement it] |
| 51 | Non-exposure contradicts identity across !!import | Accept — restate: materialised entries are resolver-named and unspellable, merge under !!import like any entry, and an importing schema’s identical application denotes the merged entry; note that content-derived naming is what makes merged namespaces agree (P2 §8.2). [settled — implemented] |
| 52 | Brace dispatch makes D2’s key-? rule unreachable | Accept — state the interaction at the dispatch; improve the record-field diagnostic (“expected :; if you meant a map type, ? is not permitted on a map key”) (P2 §12.2). [settled] |
| 53 | Parameters inside collection-valued slots | Declined (author) — template_argument keeps three channels; scope D5’s lift rule to constructors whose slots are all scalar and state the exclusion; classify both spellings of the refusal identically (author error at the declaration) (P2 §5.10/ |
| 54 | Type-argument literal: token or value? | Open (carried) — the structure-templates CR is accepted but will go through another revision; the identity question (token / |
| 55 | Shallow !!import vs transitive !!meta | Accept — imports are transitive (whole namespace); collisions decided by entry identity (re-arrival unifies; two different schemas declaring one name is a hard error; locals may not reuse closure names — no hiding); pin is verification metadata, never identity; delete the uuid hiding example; reword §3.3.1’s “one hop”; state the two accepted costs (name reservation; upstream-only conflicts) and the revision-skew consequence (P2 §2.2.3, §3.3.1). [settled — implemented] |
| 56 | Unresolved annotation name: failure mode | Accept — a resolver error, valueless form included; the near-miss diagnostic (declared locally /!!import → usable in data documents, not here) and remedy stated; kernel-bootstrap exception noted. The larger “why can’t a schema’s own declarations serve its annotations” question stays a recorded design question (P2 §6, §3.3.3). [settled — implemented] |
| 57 | Nowhere for a non-type in the schema map | Accept (resolution 2) — the data base kind and kind: DATA are already in the revised kernel: data => top & {}, type_kind gains DATA; §4.1 adds data to kind determination; naming a DATA entry where a type is expected is a resolver error; §10.1 gains the ingest sentence (a DATA body’s vocabulary is meta-supplied, extern-like); §9 gains the extension-author guidance to type reference slots type_ref, not type_name (P2 §4.1, §8.1, §9, §10.1, §3.3.1; kernel). [settled — in artifacts] |
| 58 | Parametric = fixation on template materialisation | Accept — on materialisation a field whose value_param binds to a concrete argument takes its literal spelling’s state: = P → REQUIRED_FIXED, ~ P → REQUIRED_DEFAULT (P2 §5.7). [settled] |
| 59 | Invalid byte sequences | Accept — a byte sequence invalid in the document’s encoding is a lexer error; decoders MUST NOT substitute replacement characters; overlong forms, encoded surrogates, and values above U+10FFFF named as invalid UTF-8 (P1 §7.1, §8.1). [settled] |
Counts: 39 accepted (now including 9, 11, 18, 19), 8 resolved/dissolved by the CR baseline or by another accepted entry (21, 23, 24, 28, 31, 33, 45, 49), 5 declined or no-spec-change (4, 7, 13 — guide candidates — 30, and 53’s core, both declined by the author with a documenting edit), and 4 open questions carried in this change log only (12, 26, 34, 54). Open questions are recorded here and are NOT reflected as open text in the specification.
3. Accepted changes by target document
3.1 Part 1 — Text Data Format
- §2.1 worked example — reconcile the flagship example with annotation typing
(#29/#30):
@deprecated/@expiresmust resolve against the governing schema. Either the example’s schema is said to declare them, or the annotations are replaced with core-reachable ones (@doc), and the bare-vs-valued form must match the declaration. Exact edit depends on the #30 decision. - §2.5 / §2.6 — duplicates: MUST NOT; delete both last-value-wins rules; textual identity stated as the parser’s minimum, decoded-value identity for readers (#41, #43); key type-ref/annotations excluded from identity (#43).
- §3.1 — fix the
@a:@b:val targetexample (#3). - §5.2 — atom-contract failures are “a resolver error” (#8); §8.1’s resolver category description extended to match.
- §5.3 — padding REQUIRED for the padded encodings (#10).
- §5.5 — add
!emailwith the scoped RFC 5322 subset (#5). - §5.6 — full
integer_typefamily (#6). - §5 (vocabulary) —
!textadded as a built-in (#9). ThePnWquestion (#12) is carried open in this change log; the §5.4 table is unchanged. - §7.1 — the
.tnextension rule for the 2026 series;.tn1reserved for the v1 freeze; identity consequences at the rename noted (#20). Encoding: invalid byte sequences are lexer errors; no replacement characters (#59). - §7.2.3 — closing-delimiter trailing whitespace permitted (#1); best-effort prefix removal (#2).
- §8.1 — resolver category covers atom contracts (#8); encoding errors are lexer errors (#59).
- §9.4 — unchanged this revision; the restructure (#34) is carried open in this change log.
3.2 Part 2 — Type System and Schema
- §1.3 — Class 2 bullet for annotations (#29); the resolved-output conformance tier (CR R8).
- §2.2.3 / §3.3.1 — transitive imports, identity-based collisions, pin-vs-identity
sentence,
uuidexample deleted, “one hop” reworded (#55). Structure-namespace-only!resolution (CR §4.1); generic heads type-name-only (CR D4). - §3.3.3 / §6 — annotation failure mode (#56); “must follow
=>” deleted and name-position annotations defined as declaration metadata (#35); §6 normative force (#29). Per #30’s resolution, §6’s two-form rule stands unchanged. - §4.1 — the
database kind; kind determination extended; DATA entries not nameable as types (#57). - §2.2.2 / §4.2 — constructor prose rewritten for parameterless containers (CR D3);
~declarations valid only in meta-schemas (documents whose!!metanames the meta-kernel) — elsewhere a resolver error (#19); labelled-only parameters for~declarations (#44); the level rule (#46);unit-instance dispatch-by-name stated normatively (#18). - §4.3 — vocabulary-body requirement generalised to construction (#38); “revokes it” precision (#37).
- §5.2 — OPTIONAL_FIXED not injected; fixed-value verification; framing (#39); inline-nesting MAY-warn deleted (#42).
- §5.3 — CR D1/D2/D10 rewrite: one bracket form, the map form, the new desugar
table, the Nested forms and synthetic entries subsection; the structural-
representation paragraph deleted (#50);
0..a resolver error (#42). - §5.4 — discrimination-class disjointness rewrite (#47);
voidvariants forbidden (#48); tagging restated over the new fact. - §5.5 / §5.7 — closure for constructor/refinement bodies (#40); per-facet-kind tightening (#27); chained atom-refinement merge semantics (#17, lands in §5.6’s desugaring text); materialisation fixation rule (#58).
- §5.9 — flat-break justification; §4.3 wording (#37).
- §5.10 / §5.10.1 — CR D5–D7/D9 integration; regular recursion (CR R5); productivity MUST with “guarded” defined (#25); unused/shadowing parameters are errors (#42); collection-slot exclusion stated (#53).
- §5.11 — group arity ladder to zero (#36).
- §7.1 — root annotation MUST under
!!schemafor validating processors (#42.9). - §7.2 — parameterized-heads carve-out deleted (CR §4.6).
- §7.5 / §7.6 / §7.7 — set duplicates,
_at REQUIRED_DEFAULT, typed key duplicates: errors (#41/#42/#43). - §8.1 / §8.2 — synthetic entries and the unified identity rule (CR §4.7);
every-application-materialises (#50); non-exposure restated over the import merge
(#51); key annotations in output and ingest (#35);
@aliasand the new@syntheticclassified derived — discarded and recomputed on ingest (#35, CR §9); resolver output marks each materialised entry with@syntheticat the key. The #54 identity question is carried open in this change log; §8.2’s identity text stays as the CR wrote it. - §9 — meta-layer table updated (no
vector;instance_template,template_argument,token_set,data); extension-author guidance (type_refslots) (#57). - §10.1 — DATA-body ingest sentence (#57).
- §12.1 / §12.2 / §12.3 — CR §4.8 grammar; #14/#15/#16 ABNF fixes;
supertype-ref(#38); dispatch note for the key-?case (#52). - §11 / references — regex-pin gate and divergence documentation (#22).
3.3 Companion artifacts
The revised artifacts shipped with this revision already carry: parameterless
array/set/map; the map sugar in schema and instance_template.bindings;
token_set; instance_template/template_argument; the deleted size templates and
vector; the data base kind and DATA type_kind; .tn file identities; fixtures with
content-derived synthetic-entry names. Remaining artifact work is in §6.
3.4 CR-structure-templates (reference edits)
Per its own review items: D5 scoped to scalar-slot constructors (#53); the #31 paragraph
recording the language change stands (already present, R3); open items in CR §9 resolved
by this revision’s decisions (@synthetic marking — see §5; lookahead-budget wording —
folded into §12.2’s rewrite).
4. Notable normative changes (reader’s digest)
Changes a Revision 32 implementer must act on, beyond the CR baseline:
- Duplicate record fields and map keys are now rejected (were last-value-wins).
- The series has one severity: every former warning is an error or is deleted.
- A value governed by
!!schemamust be annotated with its type (validating processors). - Choice disjointness is a total, two-valued discrimination-class fact;
voidis not a valid variant. - Imports are transitive, with identity-based collision rules.
- Non-productive recursive types are rejected at schema load.
!targets resolve structure-namespace-only; generic heads type-name-namespace-only.- Size specifiers and element/position
?are legal at every type-ref position (language extension). - Annotations are normatively resolved and validated; an unresolvable annotation name is a resolver error.
- Every sugar-form application materialises an entry; resolver output carries synthetic entries.
- The file extension for the 2026 series is
.tn;.tn1is reserved for v1. - Constructor declarations (
~) are valid only in meta-schemas (documents whose!!metanames the meta-kernel); a user schema declaring one is rejected. !textjoins the Part 1 built-in vocabulary.
5. Open questions carried by this change log
Adjudicated 2026-08-25. The following remain deliberately open. They live in this change log only — the specification text carries no open questions.
| Ref | Question | Status |
|---|---|---|
| #12 | Does !duration accept ISO 8601’s PnW week form? | Open — likely revised in a later revision; the §5.4 table is unchanged this revision. |
| #26 | Should the content-hash pin move out of the URI query (fragment, or a structured directive value)? | Open — the query form is kept for now. |
| #34 | UTS #39 restructure of §9.4 (Identifier_Status at the §7.1 profile, scoped comparison sets, on-detection action, quoted names) and its normative level | Open — needs further investigation. |
| #54 | Instantiation-identity comparison of a type argument’s literal: token text, denoted value, or normalise-before-compare | Open — deferred to the next revision of the structure-templates design. |
Decisions taken 2026-08-25 (previously open): #9 add !text; #11 keep binary’s name;
#18b defer the machine-readable contract home (name-dispatch MUST stated now); #19 ~
only in meta-schemas; #30 declined — annotations are never optional-valued; CR §9 — a new
@synthetic kernel annotation marks resolver-materialised entries (name-position, on the
schema-map key, classified derived like @alias: discarded and recomputed on ingest).
6. Artifact inconsistencies to resolve before release
- meta-kernel.tn
type_ref/type_argumentdoc strings still say inline sugar forms “are carried structurally and materialise no entries” — contradicts the resolved fixtures (which materialise synthetics) and the accepted #50/CR §11 position. Rewrite the two doc strings. - Revision markers and identities. All six artifacts still carry “2026 Revision 32
draft” and
/2026/32/identities. At release: bump to/2026/33/, recompute the hash chain bottom-up (kernel body → kernel!!iddigest → meta’s pins → meta digest → core’s pin → core digest), regenerate fixtures. - Fixture placeholder names (
array_type_name_xxhash, …) carry a literalxxhashplaceholder — regenerate with real content-derived hashes once §8 canonicalisation decisions (default omission, annotation handling) are pinned. - meta.tn
deprecated/since/todo/langmust agree with the #30 outcome, and Part 1 §2.1’s example with both. - core.tn
complexdoc (“a narrowing may setcomponent”) must agree with the #27 facet-kind rule. @syntheticmarker — DONE:synthetic => @annotation voidadded to meta-kernel.tn beside the annotation markers; the kernel fixture gains the resolvedsyntheticentry, and every synthetic entry’s key in the fixtures now carries@synthetic. (meta.tn’sbinarybucketing (#11) is left unchanged this revision — expected to be revisited later.)
Executed 2026-08-25 (artifacts). All six artifacts bumped to Revision 33 with
/2026/33/ identities. The kernel’s stale type_ref/type_argument doc strings are
rewritten to the every-application-materialises model (#50). Fixture conventions notes
updated (no type_ref-typed pins; bodies headed by the applied constructor; open
instance-form templates carry instance_template; @synthetic convention stated).
§5.7’s selector-facet rule (#27) refined so a constructor-defaulted selector (e.g.
complex.component) may be set while a source-bound one (int8.size) is identity-only —
core.tn’s complex doc now agrees with the rule as stated.
Post-review corrections (executed 2026-08-25). Verification against the spec text —
rather than this table — found two accepted dispositions that had not fully reached the
documents; both are now applied. #15: the “data-value at exactly three points”
sentence stood uncorrected in the P2 §12.1 lead and had been added to the §1
introduction, so the overstatement existed in two places; both are rewritten, and the
count is re-derived against #16’s executed grammar — the schema grammar now imports
core-value at exactly one point (the instance payload) and uses the full data-value
at none (refinement bodies are braced record-defs; field-modifier values are
( token / absent )), so §12.1’s import list also corrects data-value → core-value.
#42: the warn-level inventory had fully landed (neither document contains a normative
warning), but the property held only by exhaustion — the one-severity sentence the
disposition called for is now stated once, in P1 §8.1 beside the canonical error
phrasings, which P2 §1.3’s diagnostics bullet already inherits by reference. Both table
rows stand as accepted; #42’s residual was exactly that sentence. The same pass caught one
more instance of the #15/#16 defect class: §5.5/§5.6’s prose still called the constructor
payload “the data-value after !C” — three occurrences now read “core value”, matching
the executed instance production. The remaining data-value mentions in P2 (annotation
values, §6; the absent sentinel’s data-value positions, §7.6) are correct uses of the
[TSON-DATA] production and stand.
Developer Guide (executed 2026-08-25). tson-guide.md ships with Revision 33, revised
on two principles: it describes the design as it stands, and it does not hold the full
history of decisions — per-revision history lives in the revision change logs, and the
guide’s front matter now says so. §2 “Design History” (fourteen subsections of decision
archaeology) is replaced by §2 “Design Rationale” (seven subsections of standing,
present-tense rationale): the still-true rationale for no comments, no anchors, the
!/^ split, subtraction semantics, elided modifiers, and field groups/labelled sums is
kept in condensed form; the superseded histories (!!include deletion, braces
restoration, size-templates design, pin-coherence relaxation, and the now-reversed “type
slots ride the value channel”) are removed, with a new §2.7 stating the Revision 33
template/sugar/synthetic-entry model. §7’s worked example and §8.1 are rewritten to the
every-application-materialises model (tags and history now reference @synthetic
entries with _xxhash placeholder names; the “structural carriage” bullet and the
“materialisation line” essay are gone); §6.1’s void no longer offers choice variants
(#48); §4.3 notes transitive imports (#55); §8.3’s diagnostic example drops the deleted
size templates; identities and extensions are bumped throughout. Guide candidates from
the dispositions (#4, #7, #13) remain open items for a future guide pass — they add
content rather than correct it.
Hash placeholders (decided 2026-08-25). Hash values are not normative — only the
shape of the data. Source-artifact pins are spelled ?sha256=xxhash and each source
header documents the placeholder; fixture synthetic names keep the …_xxhash suffix and
the fixture notes state that the placeholder is deliberately not a real digest. Real
digests are computed bottom-up at publication (kernel body → kernel !!id digest → meta
pins → meta digest → core pin → core digest); nothing in the drafts presents a
plausible-but-stale value that could be mistaken for a verifiable pin.
7. Out-of-scope items recorded for the Developer Guide
Entries #4, #7, and #13 are implementer guidance, not spec defects; #45’s named-partial- application syntax and #56’s “annotations from the declaring schema” question are design notes for a future revision. Note: the Developer Guide (tson-guide.md) was not part of this revision’s input set — confirm whether it ships with Revision 33 (several §2 dispositions reference it, and its §2.11/§8.1 design-history sections are invalidated by the CR’s deletion of the size templates and the every-application-materialises rule).