docs: every page against the finished specification - #536
Merged
Conversation
README-NEW.md: the field header is a reference, a kind byte and a payload with the ids in a trailer, and only the skip and the clamp are counted; the silent class is four edits and not two; the cook's Open checks the reserved words too and names its refusal beside the null; the block form's layout is held by a static_assert in C++ and a type-initialization check in C#; descriptors carry the text key, the doc comment and the tags. Both READMEs link COMPETITION.md, and README-NEW links PORTING.md and COMPARISON-TABLES.md. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Corrected against the id-table wire (#507), the reachability-scoped projection (#527), the refused positional keyed spelling, and the per-language layout-contract mechanisms. Added the features a stranger could not use from this page: wstring(N), the /// doc comment and tags, maps, and unbounded arrays, each with its own status note where no backend emits it yet. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The field-header sentence now matches the id-table wire; the projection's exclusion list names doc comments, tags and const declarations; the evolution table gains rows for the unbounded array and for annotations; the tiny-message edge names the message form beside the file form's cost. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
M6 named the node-table reserved id as 0xFFFF and the node index as a u32; both are M20's own facts and are now spelled from it. M18 said no per-arm kind byte rides and called a bad arm length a kind mismatch; an arm header is a field header, so a retyped arm is the kind mismatch and a bad length is framing damage. The arm terminator control names the one-byte zero reference. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
FAQ: nothing on the table wire is fatal, and the widening event joins the list; the independent-versioning answer is the table wire and its message form rather than another library, with RPC named as what schema still declines; maps have landed; the packet wire's refusal of unbounded collections is stated; Elixir's write-side raise joins the idiom list; wstring is named as the one type not yet emitted. SECURITY: the wire fuzzer's mutator list names the id-table wire's own numbers. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…tion The read report is six counters, not five; the silent class is four, not five; a kind that grew decodes exactly and counts widened; the wire has no size ceiling now that every length is a canonical LEB128. Maps, sorted lookup, arrays of pointers, arrays of unions and optional bounded arrays are closed rather than pending; doc comments are specified rather than deferred; the unbounded array joins the evolution table. COMPARISON names the table wire as the answer for the independently-versioned case. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ruling The when-to-use-theirs line no longer declines the independently-versioned service: that is what a table is for, the message form is what makes it competitive by the byte, and the remaining gaps are cited as issues. Maps and general union arms move off the not-built list; the widening rule, the doc comment and retain-unknown are specified rather than declined or deferred; the id-table wire's own facts replace the u32 lengths, the 16-bit hash and the 4 GiB body, and the eight dormant port legs are named in the scoring rule and in every footnote that turned on them. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
bench/tables: the framing split the performance ladder cites from this page. test/conformance: the id-table wire is the reference's and the tool's, the eight ports write its previous form, and their negative controls print dormant until they carry it. USAGE says the same where it introduces the form byte. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…e form Field identity is fnv1a64 with no fold, not a folded 32-bit hash; the encoding model is the form byte, the reference-and-kind header, canonical LEB128 and the trailing id table; a union arm carries its own kind byte; the node index is a LEB128 under kind 17 and the reserved id is the full 64 bits. Maps, sorted lookup, blob buffers and optional bounded arrays are landed rather than pending; the unbounded array and wstring join the rows they belong to; doc comments are specified rather than deferred. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This was referenced Sep 4, 2026
Status notes on every present-tense claim the tree lacks: the protocol id's reachability closure (#524), the [E.Max]T refusal (#540), wstring and *wstring (#522), TableRefuseReason and the widened counter (#523), the doc and tag descriptor columns, and the union of table arms (#392). Maps and unbounded arrays state their own backend status per section rather than in one trailing sentence, and the list is owed rather than carried. FAQ scopes the nine-language answer to the packet wire with the table wire's state beside it, and gives the whole-wire malformed case and the form-byte refusal one clause, since both decode nothing. The conformance README says what the harness prints, N seeds absent, rather than what a make target echoes. Three additions the sections owed: Insert answers NULL for an oversized key, Add answers NULL at the arena, and a list's indices are not stable across an erase while its pointer is, beside the three names it claims. Em dashes are out of the new prose: the four USAGE sections, COMPETITION's new paragraphs, the conformance and bench additions and VERSIONING's new rows. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
gafferongames
force-pushed
the
docs-pass
branch
from
September 4, 2026 16:54
c265c7e to
6fd6530
Compare
gafferongames
marked this pull request as ready for review
September 4, 2026 16:55
The two unbounded-array rows and the maps row said what the construct is without saying whether anything emits it, where every other page now does. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
gafferongames
added a commit
that referenced
this pull request
Sep 4, 2026
…ntation (#539) Several specification sections state present-tense behavior the tree does not carry. Each now says so in the house form §3.3, §6.6 and §2.9 already use: the behavior is specified ahead of its implementation, what the tree does today, and the issue that owes it. Every line is deleted by the implementation PR that lands the behavior. No rule changes. - SPEC.md §3.1: the compiler reads no comment kind. A `///` line lexes as an ordinary `//` comment and is discarded, no doc text reaches the IR or a descriptor column, and none of §4.1's misplacement refusals fires. #523 ruling 4. - SPEC.md §4.2: a tag compiles on a `type` declaration alone. Every other line kind refuses one under a diagnostic written for a different rule. #523 ruling 4. - SPEC-TABLES.md §8.1: no target emits `doc`, `num_tags` or `tags` on `TableFieldInfo` or `TableTypeInfo`. #523 ruling 4. - SPEC-TABLES.md §6.5, §7 and §19.2: `TableRefuseReason` is spelled nowhere, `Open` and `BlockOpen` take no reason out-parameter, a measure answers a bare `-1`, and the name is not claimed. #523. - SPEC-TABLES.md §4: no report struct carries `widened`, and every pair the ladders accept is a `kind_mismatch` today. #523. - SPEC-TABLES.md §2.4 and §11: `schema check` accepts `[E.Max]T` in a table body with no diagnostic and exit 0. #540, which VERSIONING.md's "Owed before 3.0.0" list already carries after #536. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
gafferongames
added a commit
that referenced
this pull request
Sep 4, 2026
…ntation (#539) (#541) Several specification sections state present-tense behavior the tree does not carry. Each now says so in the house form §3.3, §6.6 and §2.9 already use: the behavior is specified ahead of its implementation, what the tree does today, and the issue that owes it. Every line is deleted by the implementation PR that lands the behavior. No rule changes. - SPEC.md §3.1: the compiler reads no comment kind. A `///` line lexes as an ordinary `//` comment and is discarded, no doc text reaches the IR or a descriptor column, and none of §4.1's misplacement refusals fires. #523 ruling 4. - SPEC.md §4.2: a tag compiles on a `type` declaration alone. Every other line kind refuses one under a diagnostic written for a different rule. #523 ruling 4. - SPEC-TABLES.md §8.1: no target emits `doc`, `num_tags` or `tags` on `TableFieldInfo` or `TableTypeInfo`. #523 ruling 4. - SPEC-TABLES.md §6.5, §7 and §19.2: `TableRefuseReason` is spelled nowhere, `Open` and `BlockOpen` take no reason out-parameter, a measure answers a bare `-1`, and the name is not claimed. #523. - SPEC-TABLES.md §4: no report struct carries `widened`, and every pair the ladders accept is a `kind_mismatch` today. #523. - SPEC-TABLES.md §2.4 and §11: `schema check` accepts `[E.Max]T` in a table body with no diagnostic and exit 0. #540, which VERSIONING.md's "Owed before 3.0.0" list already carries after #536. Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
The docs pass against the finished specification.
docs/SPEC.mdanddocs/SPEC-TABLES.mdas they stand onmainat dbff2ff — after #507, #510,#527, #529, #530, #531 and #532 — are the two sources of truth. Every other
page was read against them sentence by sentence and corrected where it
disagreed.
Out of scope by instruction:
docs/TUTORIAL.md(being rewritten on thetutorialbranch, #520), and the two specification pages themselves.No SPEC cross-reference edit was needed: no correction on any other page
exposed one.
Rebased onto
mainat 1711ee0, which carries #538's status fix for #537.The cold read ruled "merge after named changes"; they are in the branch.
The second commit carries them and is summarised at the bottom of this body.
Two issues filed rather than fixed here: #537, now landed as #538, and
#540 (the
[E.Max]Trefusal in a table body is not made by the checker).Corrections, by page
README.md — 1
The README split stays. Both files keep their own opening line, their own
feature list and their own release stance. Neither was merged into the other,
renamed or deleted.
README-NEW.md — 7
field carries a REFERENCE to its name's id, a kind byte and its payload, and
the file carries every id it used once each in a trailer (§3).
taking its declared default and a field renamed under
wasare both SILENT(§4, §4.1's table). Only the skip and the clamp count.
flagsvariant moved, a field's referent swapped for one that cannot stand in for
it, and a
fixedfield'sFmoved.Opencheck list omitted the reserved words (§7's enumeration).Opennow names itself beside the null throughTableRefuseReason(§7).languages": C++ has
static_assert, C# has a check at type initialization(§19.3, and the C# note in §2's front matter).
///doc comment and the tagsbeside the columns the page listed (§8.1).
Plus PORTING.md, COMPARISON-TABLES.md and COMPETITION.md added to the
beside-list, which README.md already carried.
docs/USAGE.md — 14 corrected, 4 sections added
Corrected:
name; what it carries is a reference (§3, §5).
reference-kind-payload header, canonical LEB128 numbers and a trailing id
table.
widened(§4).nesting level, keeps what it decoded and reads on past
L(§4).30carrying a reference to that id; an arm header carries the arm id reference
and a kind byte (§3).
body's zero reference and the eight-byte entry count (§3).
typedeclarations and nothing else" — it isthe CLOSURE over them, with the eight edges enumerated, and
flagsprojectswhether reached or not (SPEC §3.1, §3.2, spec: reachability-scoped protocol id, and retain-unknown (#524, #525) #527).
[E.Max]Tis now REFUSED in a table body by name, with[E]Tthe fix(§2.4, §11) — the page taught the respelling as a wire break only.
declares one" (a union of table arms) — all nine carry it: a union of table
arms with no pointer is an ordinary member of the fixed class.
LEB128 node index under kind
17(§3.1).*wstring, the third spelling (§2.5).BlockOpennames its refusal beside the null,bad_layoutincluded(§19.2).
mechanism is per language:
static_assert, a const assert, a check at typeinitialization, a refusing
init(), an accessors-against-descriptors check.length, count and index is a canonical LEB128 with 64 bits of capability
(§3). The scalar list gained
wstring(N).Added, because the page's doctrine is that a stranger can use every feature
without opening the specification, each carrying a status note where no backend
emits it yet:
wstring(N)(SPEC §4.12) — the bound in code units, the two-step wirewith no alignment, the four reader rules and what no reader enforces, the
write side's two checks, the per-target boundary cost, and kind
33on thetable wire.
///is opt-in, what thetext is, where it goes, every refusal, and tags at every line kind, with both
named as free edits.
order, the builder and const surfaces,
Findand the optional index, theeight claimed names, the evolution events, and the
[..N]Pairmigration.[]Tand[]*T, the same bytes as[..N]T,the element set and its four refusals, insertion order, the surface, and the
two counters that cannot fire.
Also: the id-table wire's own backend status (the reference and the tool; the
eight ports on #511 to #518), and the table of contents.
Verified, no edit needed: lines 1012 and 1281 read "the same six counters",
which is the spec's own count after #532 —
unknown,kind_mismatch,widened,clamped,duplicateand themalformedflag.docs/PORTING.md — 3
0xFFFF; it is0xFFFFFFFFFFFFFFFF, which M20 on the same page already spells (§3.1).rides", and called a bad arm length a KIND MISMATCH. An arm header IS a
field header (§3), so a retyped arm is the kind mismatch and a bad length is
framing damage; the payload-free arm is kind
32; and the terminatorcontrol moves a one-byte zero reference, not a u16.
Verified, no edit needed: line 771's "six counters" is the spec's count.
docs/VERSIONING.md — 5 corrected, 3 rows and 2 owed entries added
id, kind, payload; a node istype id, length, fields" — areference names a slot of the id table, and a node record is a
type id reference, length, body(§3, §3.1). The page's own layout section alreadysaid so, so the two contradicted each other.
constdeclarations, which SPEC §3.1 excludes explicitly.
cost, and the ten-byte empty table.
comment or a tag added, changed or removed — free in all three frames.
list_migratesgolden, and the///comment with its two descriptorcolumns.
The page was already current on the widening rule, the message form and
retain-unknown.
docs/PERFORMANCE.md — 0
Bench data in its recorded convention, with no spec-facing claim.
docs/FAQ.md — 6
damage stops the damaged nesting level and the parent reads on (§4). The
list gained
widened.server ship independently and must interoperate across versions over one
connection, use Protobuf" is no longer a decline. That is what the TABLE
wire is for and the message form is its stream shape, at 58 bytes against
proto3's 49 on the same login (§3.3). What schema still declines is RPC, and
the answer now says so.
body takes both (§2.8, §2.9).
ArgumentErrorin every build(SPEC §5).
wstring(N)isspecified and emitted nowhere, so it is named rather than counted as parity.
docs/COMPARISON.md — 1
table wire and the message form as schema's answer for the
independently-versioned case, on the same addendum.
docs/COMPARISON-TABLES.md — 20
Named by the design read: row 162 (the read report list gained
widened),row 263 (a changed kind, with the widening exception stated), row 272
(the same list in the evolution table). Also line 163 and line 273, "the
silent-edit class enumerated: exactly five" — it is exactly four (§4.1).
Beyond those:
id u16, kind u8, payload, u16terminator" — the three parts, the reference header, the canonical LEB128 and
the trailing table.
fold16(fnv1a32(name))— it isfnv1a64(name), atsixty-four bits, no fold, one rule for four vocabularies (§5).
u32length; a LEB128, and an arm carries its own kind byte beside it.spell.
the optional-fields row, the maps row and the sorted-lookup row each carried a
construct that has since landed or moved: kind
30, an arm as a field line,[]T,*bytes/*string/*wstring,wstring(N),?[..N]T,map[K]Vandits
Find.its refusals.
under them, listed as pending: maps, sorted lookup, doc comments, arrays of
pointers, arrays of unions and optional arrays. Four are landed and the
remaining gaps are named instead.
docs/COMPETITION.md — 13
Named by the design read: row 268 (defined widening or promotion),
row 337 (the "Promotion" bullet under "Where they are ahead"), row 378
(footnote s24, the read report's counters).
versions independently of its callers is Protocol Buffers' case" is struck.
The page now says what the table wire guarantees for that case, names the
message form and its measured bytes, keeps RPC as what schema declines, and
cites every gap as an issue: the message form, the widening rule and
TableRefuseReason(Design lock-in before the sweep: the cold read's shortest list #523); retain-unknown (Retain-unknown: an opt-in that keeps what this build cannot name (ruling 12 on #523) #525); the retired-names ledger(The retired-names ledger: the baseline records every removed field, variant and arm, and a re-added name or colliding id is refused until acknowledged (before the 3.0.0 evolution claims) #441);
wasbeyond a table's own fields (Generalizewasto enum variants and union arms: identity survives a rename in every vocabulary, not only fields #442, Language-level features from FlatBuffers, Avro, Protobuf and Cap'n Proto: four to adopt, seven later, eighteen declined #396); and the id-table wirein the eight ports (Go: the table wire's id-table form (#435) #511 to Rust: the table wire's id-table form (#435) #518).
built, lands after 3.0.0" to the construct as it stands.
field line — leaving s9 for the defaults it also covered.
u32.named by a reference.
u32today, so a node body is capped at 4 GiB…under The table wire goes uniformly 64-bit before 3.0.0: every id fnv1a64 (fields, variants, arms, tables), every length, count and node index u64 #435" — that landed; the ports are the live scope.
30; theremaining silent cases are the referent swap and a moved
F.DEFAULT, and retain-unknown is the specified opt-in beside it.
2and the eight ports are the live scope.docs/SECURITY.md — 1
out of range"; it now names the id-table wire's own numbers — non-minimal
LEB128, a reference past the entry count, the trailer passes, the moved body
terminator, the arm kind and length, and the reserved kind
34(§4.2).The page was already current on
wstring, kind33and kind12.docs/CONTRIBUTING.md — 0
No spec-facing claim disagreed.
examples/README.md — 0
Type-wire corpus only, and current.
bench/tables/README.md — 1
performance ladder cites FROM this page and this page did not carry.
test/conformance/README.md — 1
id-table wire itself is the reference's and the tool's, the eight ports write
its previous form, and their negative controls print
dormant— with theeight issues and the PORTING M20 cell named.
The
reportsurface'su,k,c,d,mline is left alone deliberately: itdescribes the harness protocol as the tree implements it, and it gains
widenedwhenwidenedlands.Issues filed
The section says "the C++ REFERENCE and the TOOL carry it" and names a
tables/listscorpus of nine instances. Againstmain,table Save { scores []int32 }drawsexpected an expression, found "]", there is notables/listsdirectory, and nothing underinternal/mentions an unboundedarray. Every other subsection that landed ahead of its implementation says so
plainly (§3.3, §6.6, SPEC.md §3.1, SPEC.md §4.12), so this line is an
outlier. The issue also notes §2.5's status line covering
*wstring, which isnowhere in the tree.
What was checked with the tool
go build ./cmd/schemaandschema checkover hand-written units for everyconstruct this pass added or corrected. That is how the status notes on
wstring(N),[]Tand the///block are honest rather than assumed: maps,general union arms and payload-free arms compile today;
[]T,wstring(N),*wstring, a tag on a constant and a tag on a table declaration do not. No C++was built.
The cold read's named changes
Landed on the same branch as one commit.
Rulings applied. The README split stays exactly as it is, on the owner's
standing rule. Status notes are USAGE's own practice, so every present-tense
claim of an implementation the tree lacks now carries the italic note rather
than standing bare. Em dashes are out of the NEW prose only, and left inside
sentences this pass merely corrected, per #402.
The twelve edits.
every other backend refuses a unit that declares one by name (Table is king: the recursion closure — every slot that can hold a value can hold a table, at every depth, in every form #392, §15).
It said "all nine".
each section now states its own backend status at its head instead of one
trailing sentence for both.
scope by it yet,
ir.WireProjectionstill rendering the unit atProjectionVersion2 (A reachability-scoped wire-shape projection (ruling 11 on #523) #524).reader cannot read whole and a form byte it does not know, both of which
decode nothing rather than mangle anything.
TableRefuseReasonis specified and no backendwrites it, so an
Openanswers the null alone today (Design lock-in before the sweep: the cold read's shortest list #523), matchingCOMPETITION.
widened: one note per site, specified and counted nowhere yet (Design lock-in before the sweep: the cold read's shortest list #523), onUSAGE twice, FAQ once and COMPARISON-TABLES three times.
docandtagsdescriptor columns are specified and nobackend emits them, so they are named apart from the columns that ship.
*wstringis specified and no backend emits it (tables: the wstring kind on the id-table wire #522, spec: §2.9 and §2.5 state their backend status honestly (#537) #538).[E.Max]Trefusal in a table body is stated by§2.4 and §11 and the checker does not make it. Noted at both sites, filed as
check: the [E.Max]T refusal in a table body (§2.4, §11) is not made #540, and added to VERSIONING's "Owed before 3.0.0" list.
N seeds absent (roots the leg has no codec for), rather than thedormanta make target echoes, which is a different instrument.wstringspelling at parse, said in thestatus note.
table wire's state in one sentence beside it, fixed class everywhere, the
variable class the reference's and the tool's, and the id-table wire's
eight ports on Go: the table wire's id-table form (#435) #511 to Rust: the table wire's id-table form (#435) #518.
Three one-sentence additions the new sections owed. A map's
Insertanswers NULL for a key longer than
N, and for an arena that cannot carve asegment, because a truncated key would be a merged entry. A list's
Addanswers NULL at the arena, its indices are not stable across an erase while
the POINTER
Addhanded back is the stable handle, and a count past theint32extent cap is refused. And the list claims three names against itsfield,
Add,EachandErase, where a map claims eight.Issues filed by this pass
carry. Landed as spec: §2.9 and §2.5 state their backend status honestly (#537) #538 before this rebase; the branch now sits on it.
[E.Max]Trefusal in a table body is not made. §2.4 and §11state it as a compile error naming the field and the enum with
[E]Tas thefix;
table Fleet { ships [ShipType.Max]int32 }compiles clean today. Itmatters past the diagnostic: §4.1 leans on that refusal to keep
flagstheONE positional vocabulary a table has, and SPEC.md §3.1 leans on THAT as the
reason
flagsis held in the wire-shape projection unconditionally.