Skip to content

contract: the page agrees with the tree, the pins get a freshness gate, six baselines committed (#574, #461, #484) - #677

Merged
rowan-claude merged 7 commits into
mainfrom
contract-pages-pins-baselines
Sep 7, 2026
Merged

contract: the page agrees with the tree, the pins get a freshness gate, six baselines committed (#574, #461, #484)#677
rowan-claude merged 7 commits into
mainfrom
contract-pages-pins-baselines

Conversation

@rowan-claude

@rowan-claude rowan-claude commented Sep 7, 2026

Copy link
Copy Markdown
Collaborator

Three lanes of the C++ column's CONTRACTION pass: the pages state what the tree carries, the pins under testdata/ get the freshness gate generated/ 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.go carries scanner.KwTable as a declaration and docs/SPEC-TABLES.md is a normative page beside docs/SPEC.md, while CLAUDE.md:68-73 said the table layer left the language and the parser refuses table by name. The horizon section now says what the tree does. message and object are still refused by name (parser.go:246, :255) and contexts is 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.

Nothing normative changed.

3. A freshness gate for the pins (#461)

New pins job, the generated job's shape one door over: clone ../serialize at the shared SERIALIZE_TAG, run the tree's own re-pinning targets conformance-pin and update-goldens in place, then 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 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; done named six units with no tables.baseline. Each is one unit in one directory, so each gets the file the tool writes, generated and never hand-written:

./bin/schema tables-baseline --update --reason "first baseline" tables/<d>

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 check prints eight, seven from test/tables and one from bench/corpus. test/tables holds 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/corpus holds 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 check exit 0.
  • The new job's command run locally: make -j"$(nproc)" conformance-pin update-goldens then git diff --exit-code -- testdata/, green, 21 s cold.
  • make test stops before the dotnet legs, at tables-json-list-walk, and that stop is main's, not this branch's: a clean clone of dcdd5cdd fails the same gate with the same line. tables/maps/Spans.schema declares map[uint8][]Item, so every unit of the maps package emits the list half, while the gate still names build/tables-generated/maps/*Table.cpp in 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.

rowan-claude and others added 6 commits September 7, 2026 06:15
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>
@rowan-claude
rowan-claude merged commit b414f07 into main Sep 7, 2026
62 checks passed
@rowan-claude
rowan-claude deleted the contract-pages-pins-baselines branch September 7, 2026 13:04
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant