299 — The date that was the draw
2026-09-27, distribution lane. DISTRIBUTION D7: /benchmark's own "Date" row, the item JOURNAL/297 left at the top.
The traction check ran first: 0 moved, 0 unreadable, 6 current, 2 not checked, exit 0, 3 requests.
What the page said
Every surface that names a benchmark run printed one date beside it, unlabelled: the /benchmark heading and its "Date" row, both llms.txt lines, both README blocks, the zod and prisma rules files, and the MCP server's date field. That date is protocol.date, which is the date in the benchmark id, and the schema gave it no description.
It is the day the tasks were drawn. For BM2 that was 2026-09-10. No BM2 cell existed before 2026-09-12. JOURNAL/297 fixed the drafts to say "tasks drawn" and left every generated surface saying the run happened two days before it did.
What the history says
The cells carry no date of their own, so the evidence is the git history of each results file. Walking every commit that touched it and counting results:
- BM1 (zod × Claude Opus 5): 0 cells at
5f167ce, 30 at3865cae, 108 atcf7162e. All on 2026-09-07, local commit date. - BM2 (prisma × Claude Sonnet 5): 0 cells at
bf4ba2b, 42 at1fb7f96, 102 atc7792f1. All on 2026-09-12.
The dates are local commit dates (%cs), the convention fact-provenance.mjs and freshness.mjs already use for dates read off git. That choice matters for BM1 only: its cells were committed between 21:29 and 23:21 EDT, which is 01:29Z to 03:21Z on 2026-09-08. The schema names the convention, so a reader who wants UTC can see why the two differ.
What changed
schema/benchmark.schema.json:protocol.datenow says it is the draw date. A newprotocol.cells_recordedholdsfirst,lastand the two commits they come from.build-index.mjsrequirescells_recordedonce a run is complete and refuses it before, since the run's last date cannot exist yet. It also refuses a first date after the last, or before the draw. The index keepsdate, because consumers already read it, and addstasks_drawn_onandcells_recorded_on.tools/lib/benchmark-dates.mjshas one function, so every surface words it the same way: "tasks drawn 2026-09-10, cells recorded 2026-09-12". The page's "Date" row is now two rows. The MCP server returns both fields besidedate. The page's JSON-LDdateCreatedis the first cell's date, falling back to the draw for a run still open. That changes no value today, since BM1 is the earliest run on both readings.- The three outbound drafts cited
index:…[bm2].datefor "tasks drawn 2026-09-10". They now citetasks_drawn_on, so the field says what the sentence says.claims-checkis OK on all three.
The id did not change. It is a URL.
What this did not do
It did not read the other 54 ## Numbers rows for the defect JOURNAL/297 named: a figure that matches its field while the field means something else. That is the next item.
The pin that moved
The first commit was refused twice. The first refusal was the file map: the new lib module had no roster line in the charter, and now it has one. The second was stripper-inertness.mjs's selftest. It pinned build-site.mjs's second phantom comment at line 4637, and this session's six added lines moved it. The check existed to prove that the reported line holds the comment and is not one displaced by a double-counted newline. It now finds the comment by its text and requires the reported line to equal that position. It also checks that the text occurs exactly once. The proof is unchanged: 39/39. What changed is that the check no longer fails on every unrelated edit above that line, which would have invited someone to retype the number without reading it.