Skip to content

fix(record): cap the benchmark ENTRY, never the file -- docs/BENCHMARKS.md had 205 chars of headroom (#460) - #494

Merged
localai-bot merged 14 commits into
mainfrom
row/BENCHMARKS-CAP-RELIEF
Aug 12, 2026
Merged

fix(record): cap the benchmark ENTRY, never the file -- docs/BENCHMARKS.md had 205 chars of headroom (#460)#494
localai-bot merged 14 commits into
mainfrom
row/BENCHMARKS-CAP-RELIEF

Conversation

@localai-bot

@localai-bot localai-bot commented Aug 12, 2026

Copy link
Copy Markdown
Collaborator

Closes #460. Row ENG-RECORD-CONFLICT-SURFACES.
Spec: .agents/specs/benchmarks-entry-cap.md.
Issue table: .agents/roadmap_v1.md lists #460 and #507 under this row.

The blocker, measured

docs/BENCHMARKS.md was gated by a 45,000-character budget on the whole
file
and measured 44,795, so 205 characters were free. Adding a
measurement row meant deleting a row somebody else owns, and the documented way
to delete one, moving it byte-for-byte into .agents/benchmark-record.md, did
not work for exactly the rows that carry evidence links (#460).

Over the last 25 commits that touched the page:

commit rows chars free what it was
04b2b9fa 165 45,007 -7 a CLEAN automatic merge, over the cap
93613baa 165 44,964 36 "trim the Voxtral encoder row back inside"
887e04ff 163 44,579 421 "compact benchmark projection"
bbc482a2 163 44,942 58 ordinary merge
918c568a 162 44,795 205 base of this PR

Three things follow, and AGENTS.md, Records, names each of them.

  • The success mode is unsafe. 04b2b9fa merged cleanly to 45,007 chars
    because two PRs each paid by evicting a different row, and the three-way
    merge applied both additions and neither eviction. Verbatim the corollary:
    "merging two such edits cleanly is worse than conflicting".
  • The eviction is winning. Row count fell 165 to 162 while the project
    gained measurements. Two commits exist for no purpose but to pay rent.
  • The payment mechanism is broken for evidence-bearing rows. 3 of 162 rows
    carry a docs/-relative link and none can be archived byte-for-byte.

What changed

Not by raising anything. By applying AGENTS.md, Records: cap the entry, never
the file
, and relocate the obligation to a per-row surface rather than
deleting it
.

1. max_chars is gone from PageRules, with the measurement recorded in
place. This is the third instance of a defect this row already retired twice on
2026-08-11: 87308dea removed MAX_CHARS from check-now-current.py and the
chars key from STATUS_RATCHET, under #364, on this exact argument.

2. MAX_ROW_CHARS = 600 caps one ENTRY. An author bounds their own row and
never anyone else's. Set from the shipped pages (longest live row 520 on
BENCHMARKS, 580 on FEATURES), and tighter than the cell cap it joins, which
alone permits a five-column row of 1,100 chars.

3. DATED_HEADING_RE rejects a per-attempt heading at every depth.
_h2_headers matches ## only, so a dated ### subsection was caught by
nothing but the character budget. Shape measured, not invented: at merge
fdbc8ae6, 287 of the 310 sections already rolled into the record name a
date in their heading, and 0 of the 36 live headings across the two public
pages do, 18 per page. The archive total climbs as rows land, so it is dated;
the zero is the number the guard rests on and it has not moved.

4. _prose_paragraphs counts list items and blockquote lines. Added in this
revision, for review finding F1. See below: this is the rule that actually
discharges the spec's stop condition.

5. check_links stops validating text that is not a link, and pairs fences
the way CommonMark does. A target inside a fence or an inline code span renders
as literal text, so no reader can follow it; the old behaviour meant no document
in the tree could show a link in sample output. Separately,
.agents/benchmark-record.md now resolves a target from docs/ as well as
.agents/, because it is the declared archive of docs/BENCHMARKS.md and the
rollup moves live markdown. link_base becomes link_bases; the target must
still exist under one of them, and every other file keeps single-base
resolution.

Review round 2: what the FAIL found, and what it cost

An independent review confirmed the design and that every guard the PR adds is
mutation-proof, and returned FAIL on two blocking findings. Both are fixed
here, and neither is a design change.

F1: "strictly tighter than the byte cap" was FALSE

_prose_paragraphs excluded every line starting with -, *, >, | or
#. So a bulleted or blockquoted wall was counted by nothing: not the
paragraph count, not MAX_PARAGRAPH_CHARS, not MAX_CELL_CHARS, not
MAX_ROW_CHARS, and not the heading guard, which fires on a date and
therefore cannot see an undated appended subsection at all.

Measured against the real checker, with the entry cap in place:

mutant page reached first revision BASE
3,000 appended bullet lines (the exact mutant the deleted test_oversized_page_fails used) 113,833 chars [] 113833 chars, over the 45000-char scoreboard budget
500 UNDATED ### Attempt N sections with bulleted forensics 117,222 chars exit 0, 68/68 green over budget

Both halves of the finding are done.

(a) The claim is corrected wherever it appeared -- the checker comment,
spec Design §3, spec Risks, and this body. The true statement is the narrow
one: the guard is strictly tighter than the canonical-section allowlist,
which sees ## only. It is not tighter than the retired byte cap in
general.

(b) The channel is closed, entry-shaped where it can be. List items and
blockquote lines now fold into the paragraph running through them, so a
contiguous run is ONE paragraph: a wall trips MAX_PARAGRAPH_CHARS, and a run
per appended section trips the count. Re-baselining, all of it a
re-measurement under a larger counted population rather than slack:

  • docs/BENCHMARKS.md carries no list item: unmoved at 35 of 35.
  • docs/FEATURES.md carries one: max_prose_paragraphs 20 to 21.
  • docs/STATUS.md shares the function and moves the other way, because its
    29 list items now join neighbouring paragraphs instead of splitting them:
    STATUS_RATCHET["long_paragraphs"] 82 down to 75, and the ceiling in
    test_the_status_ratchet_only_ever_moves_down with it. Leaving 82 would have
    banked 7 units of slack this row did not earn.

Stated plainly, because it is the honest half. A line opening with emphasis
still starts with * and is still excluded, so a **bold**-led prose wall is
unbounded. Closing it turns FOUR paragraphs already shipped on
docs/BENCHMARKS.md red against MAX_PARAGRAPH_CHARS (717, 719, 748 and 1,084
chars), so it owes an edit to a page #481 holds open and it changes what an
existing gate counts. Filed as #507, deferred as spec W8, and pinned by
test_an_EMPHASIS_lead_wall_is_a_KNOWN_residue, which goes red the day it
lands.

F2: strip_code_spans mis-paired fences and stopped validating a LIVE link

The tracker closed a block on any line matching a fence, including one with an
info string
. CommonMark requires a closing fence to carry none, and getting it
wrong does not fail safe: it inverts fence phase for the rest of the file.
With the one unbalanced fence this tree already has, the bare fence at
.agents/completed/state-events/0000-00/STATE-LEGACY-000001.md:17697 was
"closed" by the ```sh at :17948, and ordinary prose two lines under an H2
at :18297 was blanked. A live, reader-followable spec link stopped being
validated.

A closing fence must now match the opener's character, be at least as long, and
carry nothing but whitespace after the marker. Re-measured on the merged tree:

merge fdbc8ae6:  raw 4170   loose rule 4162   CommonMark rule 4163

The corrected rule validates strictly MORE, and all 7 of its losses are code
samples: 3 inside the unclosed block in the legacy file, 4 the path
placeholder in this row's own spec. The one target only the loose rule drops is
the live link at :18297. Both totals climb as the tree gains markdown, so the
spec dates them to a SHA rather than treating them as constants; the invariant
is the inequality, not the counts. The Risk section previously said 4 lost and
"all 4 are quoted samples", which was both stale and wrong: the review
re-measured 5, and the fifth was the live link.

F3 to F9, taken in the same pass

  • F3. Deleted assertGreater(len(grown), RETIRED_PAGE_BUDGET) from the
    LIVE-page acceptance test. It stored a measurement of docs/BENCHMARKS.md
    inside a test file with 173 characters of margin, which is exactly the
    corollary this PR removes; 887e04ff shrank the page by 280 and 93613baa
    by 43. test_a_new_row_costs_no_eviction makes the point on a synthetic page
    it builds itself, and test_no_page_carries_a_whole_file_size_budget holds
    the invariant.
  • F4. The second-base docstring no longer justifies itself with "no reader
    can follow it", which is false of the links it accepts: a reader clicking
    USAGE.md or bench-evidence/... inside .agents/benchmark-record.md gets a
    404. It now says what it enforces, that the evidence still exists under a
    declared base, and names W5 as what would make the archived copy followable.
  • F5. Two stray backticks straddling a link hid the non-existent target
    path in this spec's own prose. Fixed there, and pinned by
    test_a_link_straddled_by_two_INLINE_SPANS_is_not_extracted, which also
    asserts the ordinary backticked-label form is still a link.
  • F6. "Line numbers stay honest" is no longer cited as evidence:
    check_links reports no line numbers. Blanking is kept, and documented as a
    property held for a future caller rather than a benefit realised now.
  • F7. The PageRules docstring now says the no-eviction property is true of
    ROWS only. max_prose_paragraphs is a whole-page count and both pages sit
    on it (35 of 35, 21 of 21). Deliberate, on the same line Shared record surfaces are a lock: 16/29 open PRs conflict, 13 of them in bookkeeping only #364 drew: rows are
    how a keyed table grows, prose is how it decays.
  • F8. The cited counts did not reproduce and are re-measured: _headings
    finds 18 per page, 36 total (the old 32 was _h2_headers-shaped), and the
    archive is 284 of 307 dated, not 278 of 301.
  • F9. The acceptance test now inserts the owed row directly under the last
    Open gaps row
    , with no blank line, so markdown renders it inside that table.
    It previously proved the checker claim but not the placement.

Mutation table

Reproduced on three trees with the same harness: BASE origin/main, the first
revision of this row (1eef2e08), and what lands.

id mutant BASE first revision landed
M1 dated ## appended CAUGHT CAUGHT CAUGHT
M1b dated ### appended CAUGHT CAUGHT CAUGHT
M2 one row over 600 chars CAUGHT (size) CAUGHT CAUGHT
M3 legal cells, illegal row CAUGHT (size) CAUGHT CAUGHT
M4 required section dropped CAUGHT CAUGHT CAUGHT
M5 em-dash CAUGHT CAUGHT CAUGHT
M6 200 legal rows, 599 chars each CAUGHT (size) SURVIVED SURVIVED, intended
M7 500 undated ### + bullets CAUGHT (size) SURVIVED CAUGHT
M8 3,000 bullet lines CAUGHT (size) SURVIVED CAUGHT
M8b 3,000 blockquote lines CAUGHT (size) SURVIVED CAUGHT
M9 live post-fence link redirected to a missing target CAUGHT SURVIVED CAUGHT
M10 archived row, missing docs/-relative link CAUGHT CAUGHT CAUGHT
M11 500 **bold**-lead paragraphs CAUGHT (size) SURVIVED SURVIVED, #507 / W8

Two mutants the byte cap caught are not caught after this row, and both are
named rather than glossed. M6 is the point of the row: rows are the growth
mode of a keyed table, each is capped at 600, and nobody pays for one by
deleting another's. M11 is a defect, filed and deferred with the reason
attached.

Proof a new row lands with nothing evicted

test_the_shipped_page_can_accept_the_next_measurement_row adds the owed 35B
canonical regrid row (the one #481 records as owed) to the real page,
directly under the last Open gaps row:

row chars: 339 (median Open gaps row is 328; 205 chars were free)
rows: 162 -> 163, every pre-existing row asserted still present
errors: []

The row is added and dropped inside the test, so this PR does not edit the page
and does not collide with #481.

Gates

  • python3 -m pytest tests/scripts/ -q --continue-on-collection-errors:
    identical result on a clean origin/main worktree, verified rather than
    assumed. tests/scripts/test_cpu_kernel_bench.py is a standalone
    sys.argv-driven harness and errors at collection on both trees; it is
    untouched here and last changed in ae6223a8.
  • python3 scripts/check-public-doc-tables.py: OK.
  • python3 scripts/check-agent-record.py: OK.
  • scripts/agent-preflight.sh --staged: all record gates ok.
  • Both live pages pass the changed checker unchanged, and neither is edited.
  • CPU only. No GPU was used.
  • A red windows-msvc-* is NOT this row's: main does not compile under
    MSVC (tests/vt/test_cpu_isa_x86.cpp lacks <ostream>), and the lanes are
    PR-only so main-baseline.py never runs them and reports main GREEN. Filed as
    main does not compile under MSVC, and main-baseline.py reports GREEN because windows-msvc-* are PR-only jobs it never runs #503. This PR touches no src/, include/, tests/vt/, cmake/ or .ps1
    path.

What was rejected

Fixing check_links alone. It unblocks payment and leaves the ratchet:
every measurement would still evict a row someone else owns, and the clean merge
of two such payments would still land the page over budget, as 04b2b9fa did.

Per-row benchmark files or a derived page. The three admissible shapes in
Records govern record surfaces; docs/BENCHMARKS.md is a projection whose
purpose is to be one readable page reached from the README badge. "Derived at
read time" removes the lock only when the rendered artifact is not committed,
and GitHub renders committed markdown with no build step, so the generated page
would still be a file every measurement PR writes: the lock moves, it does not
die. Deferred as spec W4 with an explicit trigger.

Applying is_canonical at every heading depth, the reviewer's alternative
for F1(b). It catches M7 but not M8: a bulleted wall carries no heading at all,
so a heading rule cannot reach it. It would also freeze the six live ###
subject titles on the scoreboard behind an allowlist, which contradicts
test_a_new_subject_subsection_is_allowed. The paragraph fold catches both
mutants with one mechanism and no allowlist.

Raising a cap. The line max_chars stood on already recorded why that
fails: the previous occupant "answered it by adding slack to the constant, which
only postponed it to the next cadence of parallel work".

Filed while here, not fixed here

#507: _prose_paragraphs excludes any line starting with *, so an
EMPHASIS-lead prose wall is counted by nothing. Closing it owes an edit to four
already-shipped docs/BENCHMARKS.md paragraphs on a page #481 holds open, and
it changes what an existing gate counts. Spec W8.

#495: _h2_headers is a bare startswith("## ") scan while
split_sections in roll-benchmark-record.py tracks fences, so a
heading-shaped line inside a code fence is a section to the gate and not to the
script the gate tells you to run. Spec W6.

#498: MAX_README_CHARS = 30000 is the same whole-file lock, and
README.md measures 29,965: 35 characters free, tighter than any of the
three budgets already retired. Spec W7.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]

mudler added 3 commits August 12, 2026 15:29
…ock (#460)

docs/BENCHMARKS.md is gated by a 45,000-character budget on the whole file and
measures 44,795, so 205 characters are free. Adding a measurement row means
deleting somebody else's row, and the documented way to delete one -- move it
byte-for-byte into .agents/benchmark-record.md -- is broken for exactly the rows
that carry evidence links, because check_links resolves a docs/-relative target
from .agents/ once archived and reports it dangling.

Measured over the last 25 commits that touched the page: free space ranged from
421 characters down to MINUS SEVEN. 04b2b9f is a clean automatic merge that
landed the page at 45,007 chars, over the cap, because two PRs each paid for
their row by evicting a different one and the three-way merge applied both
additions and neither eviction. That is verbatim the corollary in AGENTS.md
Records: merging two such edits cleanly is worse than conflicting. Row count
fell 165 -> 162 over those commits while the project gained measurements, and
two commits exist for no purpose but to pay rent (93613ba "trim the Voxtral
encoder row back inside", 887e04f "compact benchmark projection").

This is the third instance of a defect this row already retired twice on
2026-08-11: 87308de removed MAX_CHARS from check-now-current.py and the chars
key from STATUS_RATCHET under #364, on this exact argument. The scoreboard's own
max_chars was left standing in that pass.

The spec applies AGENTS.md Records rather than raising anything: cap the entry,
never the file. max_chars goes; MAX_ROW_CHARS caps one row locally, so a
measurement's cost is bounded by its own author; and a dated-heading regrowth
guard picks up the one obligation the byte cap still discharged, the ### hole
that _h2_headers never covered. That guard's shape is measured, not invented:
278 of the 301 sections already rolled into the record name a date in their
heading, and 0 of the 32 live headings on the two public pages do.

Per-row files and a derived page (option b) are argued against and deferred with
an explicit trigger: the public scoreboard is a projection meant to be one
readable page, and a committed generated file is still a file every measurement
PR writes, so the lock would move rather than die.

Issue: #460

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]
…g fenced text a link (#460)

docs/BENCHMARKS.md had 205 characters free against a 45,000-character budget on
the whole file, so the next measurement row could not land without deleting a
row somebody else owns, and the documented way to delete one -- move it
byte-for-byte into .agents/benchmark-record.md -- did not work for exactly the
rows that carry evidence links. The cap had become a ratchet nobody could pay.

RED BEFORE, on 918c568. Adding the owed 35B regrid row to the live page:
"docs/BENCHMARKS.md is 45098 chars, over the 45000-char scoreboard budget".
Archiving the RPi5 SDOT row into the record, both as a quoted fence and as
verbatim live markdown: "dangling link bench-evidence/rpi5-a76-q8-dot-20260806.md"
in both directions.

WHAT CHANGED, per AGENTS.md Records rather than by raising anything.

1. `max_chars` is gone from PageRules, with the measurement recorded in place.
   It is the third instance of a defect this row already retired twice on
   2026-08-11: 87308de removed MAX_CHARS from check-now-current.py and the
   `chars` key from STATUS_RATCHET under #364, on this exact argument. Over the
   last 25 commits touching the page, free space ranged from 421 chars to MINUS
   SEVEN; 04b2b9f is a CLEAN automatic merge that landed it at 45,007, because
   two PRs each paid by evicting a different row and the three-way merge applied
   both additions and neither eviction. Row count fell 165 -> 162 while the
   project gained measurements, and two commits exist only to pay rent.

2. MAX_ROW_CHARS = 600 caps one ENTRY. An author bounds their own row and never
   anyone else's. Set from the shipped pages (longest live row 520 on
   BENCHMARKS, 580 on FEATURES) and tighter than the cell cap it joins, which
   alone permits a five-column row of 1,100 chars.

3. DATED_HEADING_RE is the regrowth guard and picks up the one obligation the
   byte cap still discharged. The canonical-section allowlist runs over
   _h2_headers, which matches "## " only, so an appended "### " subsection was
   caught by nothing but the character budget. The new guard fires at EVERY
   depth, which is strictly TIGHTER than what it replaces. Its shape is
   measured: 278 of the 301 sections already rolled into the record name a date
   in their heading; 0 of the 32 live headings on the two public pages do.

4. check_links no longer validates text that is not a link. A target inside a
   fence or an inline code span renders as literal text under CommonMark, so no
   reader can follow it; the old behaviour meant no document in the tree could
   SHOW a link in sample output. Spans are BLANKED, not deleted, so reported
   line numbers stay honest. Separately, .agents/benchmark-record.md now
   resolves a target from docs/ as well as from .agents/, because it is the
   declared archive of docs/BENCHMARKS.md and roll-benchmark-record.py moves
   sections as live markdown, which fence-stripping alone does not cover.
   link_base becomes link_bases; a target must still exist under one of them,
   and every other file keeps single-base resolution.

GREEN AFTER. tests/scripts 1239 passed; the 8 failures (mlx headers, now
render, 6 vulkan spirv subtests) are byte-identical on a clean 918c568 and
predate this change. Both live pages pass unchanged. The acceptance test is
test_the_shipped_page_can_accept_the_next_measurement_row: it adds the owed 35B
regrid row to the REAL page, asserts every pre-existing row survives, and
asserts the result is valid at 45,127 chars, which the retired rule refused.

Per-row benchmark files and a derived page were considered and rejected in the
spec: the public scoreboard is a projection meant to be one readable page, and
a committed generated file is still a file every measurement PR writes, so the
lock would move rather than die. Deferred as W4 with an explicit trigger.

Issue: #460

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]
Twelve commits landed while this row was in flight (GATE-PIN-UNPINNED-SNAPSHOTS
#471 and four SPEC-DSPARK measurements #442). No conflict: they touch
docs/BENCHMARKS.md, docs/FEATURES.md and .agents/roadmap_v1.md in rows this row
does not own, and neither changed checker nor either mutation suite.

Re-gated on the merged tree, not on the pre-merge one. tests/scripts 1258
passed, 3 skipped; the 8 failures (mlx headers, now render, 6 vulkan spirv
subtests) are byte-identical on a clean e1087a8 worktree and predate this row.
check-pr-size red-before/green-after OK for both checkers, check-doc-checkpoint
OK, every record gate OK.

docs/BENCHMARKS.md arrives at 44,859 chars: 141 free against the cap this row
retires, which is the point.

Issue: #460

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]
mudler added 2 commits August 12, 2026 16:16
Found while doing #460. roll-benchmark-record.py promises in its docstring that
it and the CI gate "can never disagree", but the allowlist is not the only thing
that decides: _h2_headers in check-public-doc-tables.py is a bare
startswith("## ") scan with no fence tracking, while split_sections in the roll
script tracks fences correctly.

    text = "# T\n\n## At a glance\n\n```text\n## CLAIM-FOO 2026-08-04 result\n```\n"
    _h2_headers(text)    -> ['At a glance', 'CLAIM-FOO 2026-08-04 result']
    split_sections(text) -> [('At a glance', ...)]

So a heading-shaped line inside a code fence is a SECTION to the gate and NOT a
section to the script the gate tells you to run, and the reported remedy prints
"nothing to roll". Neither shipped page has a fenced heading today, and
docs/BENCHMARKS.md carries fenced sample output in ## Reproduce, so it is one
pasted line away.

FILED, NOT FIXED. Correcting _h2_headers changes what an existing gate counts as
a section, which per AGENTS.md needs its own spec, red-before and green-after
rather than riding along in a PR scoped to the entry cap. This commit records it
in the two places that must agree with the issue: the roadmap intake table and
the row spec's work breakdown, as W6. The fence-aware _headings scanner added by
the previous commit is the natural basis for the repair.

Issue: #495

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]
The spec was committed before the code, as it must be, so its Tests to port
section named tests by their planned names. Six landed under different names and
five more exist that it did not predict, including the headline one. A spec a
reviewer cannot grep against is a spec that has started drifting from the tree.

Names corrected, the acceptance test
(test_the_shipped_page_can_accept_the_next_measurement_row) promoted to the top
of the list where it belongs, and the RED-on-BASE message quoted for the two
cases whose failure is semantic rather than an absent API.

Two risks added from measurement taken after the code landed. The link-scan
narrowing is 4 targets out of 4,109 across the 481 markdown files the checker
scans, and all 4 are quoted samples. And an unbalanced fence blanks the rest of
a file: one exists, .agents/specs/laguna-s21-scope-2026-07-30.md ends on a stray
closing fence, which costs nothing because no content follows it, and the same
behaviour already exists in _prose_paragraphs, _table_rows and split_sections.
Making that an error is a separate rule with a separate red-before.

No checker, test or public document changes.

Issue: #460

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]
mudler added 2 commits August 12, 2026 16:30
…again

Found while doing #460. MAX_README_CHARS = 30000 in check-readme-structure.py is
a budget on a whole shared file, and README.md measures 29,965: THIRTY-FIVE
characters free, tighter than any of the three budgets already retired for this
exact reason.

Measured over the last 20 commits touching README.md: 13 sat under 60 characters
free, and 031410e landed the file 52 characters OVER the cap. There is a whole
merged row whose only purpose was paying rent, row/DOCS-README-BUDGET (#161),
plus 44206e4 "restore the landing-page budget after the MANIFESTO link".

FILED, NOT FIXED. This is a third checker with its own mutation suite, so per
AGENTS.md it needs its own spec and its own red-before in
tests/scripts/test_check_readme_structure.py rather than riding along in a PR
scoped to the two benchmark-surface checkers. Recorded in the roadmap intake
table and as spec W7.

Also reconciles two claims the spec made before the code existed and that the
diff does not contain: docs/BENCHMARKS.md is UNCHANGED, because #481 is open and
rewrites the 35B row in place, so writing a second copy of "regrid owed" would
duplicate a keyed row the moment both merge. The surface's ability to accept the
row is what this row owes, and it is proven by
test_the_shipped_page_can_accept_the_next_measurement_row, which adds the row to
the real page and drops it again: 44,832 chars and 162 rows to 45,173 and 163,
errors [], every pre-existing row asserted still present.

Issue: #498

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]
… does not make

Left over from the pre-code spec: it said "the row added here is additive and
placed in ## Open gaps" and described how to resolve a conflict with #481 over
it. There is no such edit. docs/BENCHMARKS.md is untouched, #481 keeps ownership
of the "regrid owed" fact, and the two branches cannot conflict at all.

Also records the mid-row base move, 918c568 -> e1087a8 (12 commits), and that
every gate was rerun on the merged tree rather than the pre-merge one. The
figures in Our baseline are as taken at 918c568 and are deliberately not
restated: they are the measurement that justified the change.

Spec text only. No checker, test or public document changes.

Issue: #460

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]
mudler added 2 commits August 12, 2026 17:00
…ot see it

CI on this PR turned windows-msvc-vulkan and windows-msvc-cpu red. Neither is
this row's: it is a Python-only change to two governance checkers and their
mutation suites, touching no src/, include/, tests/, cmake/ or .ps1 path.

Both lanes are `if: github.event_name == 'pull_request'` (ci.yml:640), so the
scheduled/dispatched lane scripts/main-baseline.py reads NEVER RUNS THEM. It
reports "NEWEST BASELINE: GREEN at bbc482a" while both fail on every PR that
reaches them, and they are not even in its `not run:` list, because they are
undefined for that event rather than skipped. A GREEN verdict that silently
excludes two compiling gates is the same failure mode as a green test run with
cases skipped.

The defect: tests/vt/test_cpu_isa_x86.cpp includes <array> <bit> <limits>
<stdexcept> <string> and doctest, but not <ostream>. libstdc++ supplies it
transitively; MSVC's <string_view> does not, so doctest's stringification
instantiates operator<< against an undefined std::basic_ostream.

Reproduced byte-for-byte on two unrelated branches:

    row/ENG-RELEASE-WINDOWS  673c2f3  __msvc_string_view.hpp(550,23) C2027
    row/BENCHMARKS-CAP-RELIEF 104d3f3  __msvc_string_view.hpp(550,23) C2027

same file, same line, same target test_cpu_isa_x86.vcxproj, same failing step,
and the cpu lane fails identically in build-pr-windows-cpu.

FILED, NOT FIXED. There is no MSVC toolchain on this box, so a one-line include
change would be a guess with no green-after evidence, and the file belongs to
ENG-RELEASE-WINDOWS, which is in flight and red on the same job; patching it
from an unrelated row would collide with the branch already working there. The
second half of the repair, teaching main-baseline.py to declare jobs its lane
cannot run, changes a checker's semantics and needs its own spec.

Recorded in the roadmap intake table under ENG-RELEASE-WINDOWS and in this row's
spec Evidence, so a reviewer of #494 does not have to re-derive whose red it is.

Issue: #503

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]
One SPEC-DSPARK measurement (#442) landed while this row was in review. No
conflict: it edits docs/BENCHMARKS.md, docs/STATUS.md, its own spec and the
benchmark record, none of which this row touches, and neither changed checker
nor either mutation suite.

Re-gated on the merged tree.

Issue: #460

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]
mudler added 5 commits August 12, 2026 17:45
…d pair fences the way CommonMark does (#460)

Review returned FAIL on PR #494 with two blocking findings and seven smaller
ones. The design is unchanged: AGENTS.md, Records, says cap the entry, never
the file, and the byte cap stays retired.

F1. "Strictly tighter than the byte cap" was FALSE, and the gap was the
append-log class this row's own stop condition names. `_prose_paragraphs`
excluded every line starting with `-`, `*`, `>`, `|` or `#`, so a bulleted or
quoted wall was counted by NOTHING: not the paragraph count, not
MAX_PARAGRAPH_CHARS, not MAX_CELL_CHARS, not MAX_ROW_CHARS, and not the heading
guard, which fires on a DATE. Measured: 3,000 appended bullet lines took
docs/BENCHMARKS.md to 113,833 chars with the checker reporting `[]` (BASE
rejects the same mutant on size), and 500 UNDATED `### Attempt N` sections with
bulleted forensics reached 117,222 chars at exit 0 with 68/68 green.

Fixed both ways the finding asked. The claim is corrected wherever it appeared,
to the narrower true statement -- tighter than the canonical-section allowlist,
which sees `## ` only -- in the checker comment, spec Design 3, spec Risks and
the PR body. And the channel is closed: list items and blockquote lines fold
into `_prose_paragraphs`, so a contiguous run is ONE paragraph and trips
MAX_PARAGRAPH_CHARS while a run per section trips the count. BENCHMARKS carries
no list item and is unmoved at 35; FEATURES carries one, so
`max_prose_paragraphs` re-baselines 20 to 21; STATUS moves the other way, 82
long paragraphs to 75, so STATUS_RATCHET follows the measurement DOWN rather
than banking 7 units of slack.

An emphasis-lead paragraph still starts with `*` and is still excluded, so a
`**bold**`-led wall remains unbounded. That is stated plainly, not glossed:
closing it turns four paragraphs already shipped on docs/BENCHMARKS.md red at
717, 719, 748 and 1,084 chars against MAX_PARAGRAPH_CHARS, so it owes an edit to
a page #481 holds open. Filed as #507, deferred as spec W8, and pinned by
test_an_EMPHASIS_lead_wall_is_a_KNOWN_residue, which goes red the day it lands.

F2. `strip_code_spans` closed a block on any line matching a fence, including
one with an info string, which is not CommonMark and does not fail safe: it
INVERTS fence phase for the rest of the file. With the one unbalanced fence this
tree has, the bare fence at STATE-LEGACY-000001.md:17697 was "closed" by the
```sh at :17948, and ordinary prose at :18297 was blanked, so a live
reader-followable link stopped being validated. A closing fence now must match
the opener's character, be at least as long, and carry nothing but whitespace
after the marker. Re-measured: 4,114 raw targets, 4,110 after the strip, and all
4 losses are genuine samples. The Risk said 4 and was measuring 5.

F3. Deleted the `assertGreater(len(grown), RETIRED_PAGE_BUDGET)` on the LIVE
page. It stored a measurement of docs/BENCHMARKS.md inside a test file with 173
chars of margin, which is the corollary this row removed; 887e04f shrank the
page by 280.

F4 to F9, same pass. The second-base docstring now says what it enforces (the
evidence still exists under a declared base) instead of "no reader can follow
it", which is false of the links it accepts, and names W5 as what would make the
archived copy followable. `[`name`](path)` wrapped in stray backticks hid the
non-existent target `path` in this row's own spec: fixed and pinned by a test.
"Line numbers stay honest" is no longer cited as evidence, because check_links
reports none. The PageRules docstring now says the no-eviction property is true
of ROWS only, with both pages sitting on the paragraph count. The heading survey
is re-measured: 282 of 305 archived titles dated, 0 of 36 live headings, not
278/301 and 0/32. The acceptance test inserts the owed row directly under the
last Open gaps row so markdown renders it in that table.

Mutation set, three trees, in spec Risks. M7, M8, M8b and M9 flip SURVIVED to
CAUGHT. M6 survives by design and M11 is the filed residue.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]
FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]
…e-measure the heading survey on the merged tree (#460)

Review-repair follow-through, three edits and no behaviour change beyond the
numbers being right.

The `_prose_paragraphs` predicate no longer says which prefixes it dropped, so
the inline comment now says it: "-", "+" and ">" are gone from the exclusion
list entirely, which IS the fold, and the only "*" still excluded is the
emphasis-lead residue filed as #507.

The heading survey is re-measured on the merged tree after origin/main added
sections to the archive: 284 of 307 rolled titles carry a date, against 282 of
305 an hour ago and the 278 of 301 the spec shipped with. Zero of the 36 live
headings do, unchanged. The link census likewise: 4,130 raw targets, 4,122 after
the strip, all 8 losses code samples, against 9 losses for the loose fence rule
whose ninth is the live link F2 found.

The spec's own `[`name`](path)` sample moves into a fence. Written inline it was
four backticks, so the checker read it as two code spans straddling the target
`path`, which is what F5 describes, and after the correction it became a
dangling link the moment the surrounding prose changed shape.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]
FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]
… main lands rows

The heading survey and the link-extraction census are counts over the whole
tree, so they move under every merge: the archive went 305 to 307 to 310
sections in the three hours this repair took, and the link total 4,114 to 4,130
to 4,170. Reporting them as bare constants makes the spec wrong on a cadence
nobody controls.

Both are now stated as measured at merge `fdbc8ae6`, with the reproduction
command, and the spec says plainly which part is the invariant: not the totals,
but that the CommonMark fence rule validates strictly MORE than the loose one
and loses only samples (4,163 against 4,162, and the one extra loss is the live
link at STATE-LEGACY-000001.md:18297).

287 of 310 archived section titles carry a date. Zero of the 36 live headings
do, which is the number the guard actually rests on and the one that has not
moved.

FOLLOWING_AGENTS_PROTOCOL

Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]
@localai-bot
localai-bot merged commit a89b3c4 into main Aug 12, 2026
20 of 22 checks passed
@localai-bot
localai-bot deleted the row/BENCHMARKS-CAP-RELIEF branch August 12, 2026 19:18
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

2 participants