contract: the page agrees with the tree, the pins get a freshness gate, six baselines committed (#574, #461, #484) - #677
Merged
Conversation
The table layer is in the language: `table` declares a data type on the evolution-tolerant table wire and docs/SPEC-TABLES.md is its normative page beside docs/SPEC.md, so the source-of-truth bullet names both. The parser carries `table` as a declaration (internal/parser/parser.go, scanner.KwTable); the file said it was refused by name. The protocol layer stays out, as the tree has it: `message` and `object` are reserved words the parser refuses by name and `contexts` is refused at file scope. The frozen projection tokens are stated for what they do today, which is holding every existing unit's id stable. Glenn's scope sentence of 2026-08-25 is kept verbatim, in both places it appears. Closes #574 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
docs/VERSIONING.md's owed list, in the form its #522 and #525 rows already use. #435 and #434: the C++ reference and internal/tablewire carry the id-table form, the enum kind and the escape kind, and the eight ports are what is owed (#511 to #518). #523's message form: the C++ reference carries it and internal/tablenames claims §11's names, so what is owed is the eight ports and the form's LoadRetain. #523's unbounded array: the C++ reference carries the construct and testdata/wire/tables/list_migrates.bin is pinned. The #523 doc-comment row leaves the list: the language carries the `///` comment and a tag at every line kind, and the doc and tags descriptor columns are done in all nine ports on ROADMAP.md. docs/SPEC-TABLES.md §6.1's block-identity backend status: schema#301 is closed and no open issue carries the row, so the page says so and states why the identity is taken over the block's own text and never over a compiler version. docs/SPEC-TABLES.md §6.6: TableRetain and the three verbs are IN §11's claimed set. internal/tablenames/cpp.go:13 registers TableRetain, internal/check/check.go:3646 carries LoadRetain, MeasureRetain and SaveRetain in tableGeneratedVerbs, and :3692 carries Dart's three member spellings. What still lands with the Dart port is TableRetain in that backend's library-scope registry. docs/SPEC-TABLES.md §6.1's backend-status paragraph gains the form the eight ports actually write, which is the one that preceded §3. docs/SPEC-TABLES.md §15's map and list rows state the tool's honest cook status: compiler/cook.go refuses a map or a []T at Cook and Uncook by name, and cook-check refuses a map slot by name while carrying §7.4's element-array clause. Makefile: the zero-cost gate's parenthetical no longer cites ROUND-LOG.md, which no longer exists in the tree. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
`make conformance-pin update-goldens` on a clean checkout of main rewrites
six files and nothing else: testdata/golden/tables/maps/{Cells,Chunks,Docs,
Runs,Slots,Spans}Table.h. The pins carry neither the retain walk's arm and
enum-reference case (kind 15 and kind 30 resolving as framed content) nor the
map entry loader's present clamp, both of which the C++ table emitter writes
today.
This is the shape #461 describes. The pins were written on the branch that
became #662, which was cut before #658's retain-unknown walk landed and
merged after it; the two diffs do not touch the same lines, so the merge is
clean and nothing in CI reads these files.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
ci.yml checks freshness for generated/ and for nothing under testdata/, so a conformance pin or a table golden regenerated against an older main auto-merges clean and every job stays green against a pin nobody wrote. The new `pins` job is the `generated` job's shape one door over: check out, clone ../serialize at the shared SERIALIZE_TAG, run the tree's own re-pinning targets (`conformance-pin` and `update-goldens`) in place, and fail on a dirty testdata/, tracked or untracked. Naming the targets rather than the files means a rule that starts writing a new pin is covered the moment it joins one of them. Its first run is the negative control the issue asks for, taken from live material rather than a planted byte: on main the job goes red and names the six map goldens the previous commit re-pins. With those committed it is green. Closes #461 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
`for d in tables/*/; do ./bin/schema check $d; done` names six units with no tables.baseline: blobdemo, blockdemo, blockhome, scalardemo, streamdemo and vocab9demo. Each is one unit in one directory, which is what the notice's advice needs, so each gets the file the tool writes: ./bin/schema tables-baseline --update --reason "first baseline" tables/<d> The files are generated and never hand-written. Every one carries the history entry the reason opens, so the corpus itself carries the coverage clock (docs/SPEC-TABLES.md §18.4). The loop now prints the notice zero times. What still prints it is the multi-unit case #484 carves out: test/tables holds seven units of different packages in one directory, where "commit one in this directory" is advice a caller cannot take, and bench/corpus holds one more. Neither is a baseline this commit can write. Closes #484 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
1m44s on run 34113070433, against 4m27s for big-endian in the same run: the job is inside this file's two-minute rule and is not the binding constraint. The comment names where its budget goes, so the next reader who needs the time back knows the first place to look. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
…aselines # Conflicts: # docs/SPEC-TABLES.md
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.
Three lanes of the C++ column's CONTRACTION pass: the pages state what the tree carries, the pins under
testdata/get the freshness gategenerated/has had all along, and the six corpora that keep printing the missing-baseline notice get their baselines.1. CLAUDE.md states the present tree (#574)
internal/parser/parser.gocarriesscanner.KwTableas a declaration anddocs/SPEC-TABLES.mdis a normative page besidedocs/SPEC.md, while CLAUDE.md:68-73 said the table layer left the language and the parser refusestableby name. The horizon section now says what the tree does.messageandobjectare still refused by name (parser.go:246, :255) andcontextsis refused at file scope, so the protocol bullet keeps its substance and states the frozen projection tokens for what they do today, which is holding every existing unit's id stable. Glenn's scope sentence of 2026-08-25 is verbatim in both places it appears.2. Page versus tree
Each line measured on main first.
docandtagsdescriptor columns are ✅ in all nine ports.TableRetainand the three verbs were listed as OWED to §11's claimed set.internal/tablenames/cpp.go:13,internal/check/check.go:3646and:3692claim them andinternal/codegen/cpptable/retain.goemits them, so the bullet says they are claimed. What still lands with the Dart port isTableRetainin that backend's library-scope registry.internal/tablewire, and the eight ports write the one that preceded it (Go: the table wire's id-table form (#435) #511 to Rust: the table wire's id-table form (#435) #518).compiler/cook.go:60and:150refuse a map or a[]TatCookandUncookby name, andinternal/tablecook/check.go:212refuses a map slot while the scan carries §7.4's element-array clause. The map row said cook-check's clause was "the one piece still owed"; both rows now state the tool's whole cook status. ROADMAP's maps cell is left alone: it is a per-language cell and C++ does carry maps, so the cell and the page do not disagree.Nothing normative changed.
3. A freshness gate for the pins (#461)
New
pinsjob, thegeneratedjob's shape one door over: clone../serializeat the sharedSERIALIZE_TAG, run the tree's own re-pinning targetsconformance-pinandupdate-goldensin place, then fail on a dirtytestdata/, tracked or untracked. Naming the targets rather than the files means a rule that starts writing a new pin is covered the moment it joins one of them.Its negative control is live material rather than a planted byte. On main the job goes red and names six files,
testdata/golden/tables/maps/*Table.h, which carry neither the retain walk's arm and enum-reference case nor the map entry loader's present clamp. They were pinned on the branch that became #662, cut before #658's retain-unknown walk landed and merged after it, and the two diffs do not touch the same lines, so the merge was clean and nothing in CI read them. The first commit of this pair re-pins them; with them committed the job is green.Wall time, measured locally on arm64 with the build tree deleted first: 21 s cold, 7 s warm. The CI number is on this pull request's own run.
4. Six baselines (#484)
for d in tables/*/; do ./bin/schema check $d; donenamed six units with notables.baseline. Each is one unit in one directory, so each gets the file the tool writes, generated and never hand-written:blobs, block, blockhome, scalars, stream, vocab9. The loop now prints the notice zero times.
What still prints it, and it is not a baseline this branch can write:
make checkprints eight, seven fromtest/tablesand one frombench/corpus.test/tablesholds seven units of different packages in one directory, which is the multi-unit case #484 itself carves out ("either split those units into directories or teach the notice to say so").bench/corpusholds one unit and could take a baseline; it is outside the six and outside #484's own list of eight.Verification
go test ./...green.make checkexit 0.make -j"$(nproc)" conformance-pin update-goldensthengit diff --exit-code -- testdata/, green, 21 s cold.make teststops before the dotnet legs, attables-json-list-walk, and that stop is main's, not this branch's: a clean clone ofdcdd5cddfails the same gate with the same line.tables/maps/Spans.schemadeclaresmap[uint8][]Item, so every unit of the maps package emits the list half, while the gate still namesbuild/tables-generated/maps/*Table.cppin its list-free set. Filed separately rather than fixed here.Closes #574
Closes #461
Closes #484
🤖 Generated with Claude Code
From the cold read
The pins job's first run found six stale maps goldens on the main of that hour and this branch re-pinned them (6d7386c); #668 then re-pinned the same six independently, so main is pin-fresh today and that commit merges to nothing (the reader materialised the merge tree and ran the gate on it: clean). The history is kept as it happened rather than rewritten. The pins job measured 1m44s and 1m21s on this PR's two runs, inside the two-minute rule, with big-endian the binding constraint at 4m27s. The message and object refusals are at parser.go:246 and :254.