fix(DOC-PROSE-BUDGET-1062): main is red because three facts landed as prose, so they become rows (#1062) - #1064
fix(DOC-PROSE-BUDGET-1062): main is red because three facts landed as prose, so they become rows (#1062)#1064localai-bot wants to merge 2 commits into
Conversation
…ng shape `scripts/check-public-doc-tables.py` exits 1 on `origin/main` at `b493f4981`, and that checker gates the `agent-record` CI job, `scripts/agent-preflight.sh` and the pre-push hook. So `main` is red, every branch cut from it inherits the red, and CI, preflight and pushes are blocked for everyone. The spec is committed before any page is edited because the reflex here is to raise the two constants, and that reflex is wrong. `check-public-doc-tables.py` says so in its own source at `:17` and again at `:105`: table ROWS are unbudgeted and nothing budgets the whole file, so adding a measurement, the normal operation, was never blocked. Only prose is capped, because rows are a keyed table's growth mode and prose is the decay mode the checker exists to stop. Widening the gate to pass would be making a red gate green by widening its scope. It also records the two placements that were rejected, because both read as obvious until measured: the `Registered architectures` cell for `Qwen3_5MoeForConditionalGeneration` has 25 characters of headroom against the 220-char cap and its sibling row is at exactly 220, and a new `At a glance` row would have forced three competitor marks that no evidence in this change supports. Refs #1062 FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [claude-code]
…me rows PR #1054 added two prose paragraphs to `docs/BENCHMARKS.md` and one to `docs/FEATURES.md`. Both pages were sitting exactly on their prose budgets, 35 of 35 and 21 of 21, so the pages went to 36 and 22 and `scripts/check-public-doc-tables.py` began exiting 1 at `e34d71379`. Its verification list does not include this checker, and on an external contribution a red CI job has the #584 fork-artifact story for cover, so a real red passed unnoticed. No constant moves and nothing is deleted. Each fact takes the row its own page's schema already has for it. `docs/BENCHMARKS.md` gains one `Open gaps` row. "Benchmarking is NOT APPLICABLE, and the binding gate is the Apple Clang build" is a disposition, which is exactly what that table records, and it already carries a cluster of "no number owed" build-verification rows (`Ampere consumer`, `Pre-Ampere breadth`) that this one joins. The date moves into the row, which is what the checker's own regrowth-guard message directs. `docs/FEATURES.md` updates the Apple row of `Backends and hardware` in place. Apple Clang building the Qwen3.5 MoE loader with warnings promoted to errors is a platform and toolchain fact, and that table's `CPU` row already carries the same class of caveat in its key cell. Updating a row rather than appending one is what a keyed table asks for. Merging the paragraphs into their neighbours would also have passed the counter. It was rejected: it games the count while leaving the page in the shape the contract rejects. The 13 two-column rows sitting inside four-column tables on `docs/BENCHMARKS.md` are inherited, byte-for-byte identical before and after, and are not touched here. Closes #1062 FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [claude-code]
|
Closing as a DUPLICATE, superseded by #1057 which landed first as `ef6669292`. #1057 was already open when I filed this. Timeline:
That is a coordination failure on my side: I verified the red against #1057 fixed it the same way this PR did, and correctly — Nothing here is lost that matters: the analysis in #1062 (why the budget is NOT the shared-file antipattern — rows are unbudgeted per No reflection on the implementer, whose work was correct, thorough and well-evidenced — the duplication was mine to prevent. |
…r a file did `FEATURE_SURFACE_PREFIXES` covered all of `src/vllm/model_executor/models/`, so any edit to any model translation unit classified as `feature_surface` and owed `docs/FEATURES.md`. That is the classify-by-directory trigger this file's own header says the 2026-08-11 rewrite removed, still standing for model files: > A one-line compile fix owed three public-doc edits, so this gate produced 16 > of the last 20 red CI runs, and it had accreted SIX hardcoded exact-path-set > escape hatches -- one per legitimate change it had blocked. > [...] Editing src/ alone owes nothing. The cost stopped being hypothetical on 2026-08-16. `e34d71379` (#1054) is a one-line lambda-capture change to `models/qwen3_5_weights.cpp` that alters no capability. The gate demanded the surface; the commit answered with prose in BENCHMARKS, FEATURES and STATUS; that prose crossed the `check-public-doc-tables` paragraph budgets; and because that checker also runs in the pre-push hook, every branch in the repository was blocked from pushing. That is #1055, re-filed by a second agent as #1062 with #1064 as a duplicate fix PR, alongside #1058 which is still open. Two shared-file gates in series, each individually defensible. What the project supports is what the registry registers, so `feature_surface` now keys off a change to the set of `REGISTER_VLLM_MODEL(...)` entries in the touched file, read through `blob()` like the existing `measurement_changes`. `scripts/check-supported-models.py` already gates `docs/FEATURES.md` against that same set, so the signal is authoritative rather than newly invented. This NARROWS a gate, which is the risky direction, so the polarity is pinned by test rather than asserted: adding an architecture, adding a whole new registered file, and removing an architecture each still owe `docs/FEATURES.md`, and the four `.agents/*-matrix.md` records keep their path trigger because editing one IS the claim. Red before, green after, and mutation-proven. `test_doc_checkpoint.py` goes 27 -> 32 cases. Before the implementation, `test_editing_a_registered_model_owes_nothing` failed with the FEATURES demand. After it, 32 pass. Because the three still-owes cases were green under the OLD path trigger too, they could not by themselves show the new trigger works, so `registration_changes` was mutated to return `[]`: that fails exactly those three and no others, and restoring returns 32 green. Does not close #595. A genuine new architecture still writes the shared `docs/FEATURES.md` table, so the lock that issue names survives; this removes the contention for every fix, refactor and port phase that changes no registration. #515 is the identical shape for `CMakeLists.txt` -> `docs/USAGE.md` and is untouched. Both are recorded under `## Owed` in the spec, together with the class this narrowing gives up: a capability change inside an already-registered model now goes undemanded. Refs #595 FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]
…r a file did `FEATURE_SURFACE_PREFIXES` covered all of `src/vllm/model_executor/models/`, so any edit to any model translation unit classified as `feature_surface` and owed `docs/FEATURES.md`. That is the classify-by-directory trigger this file's own header says the 2026-08-11 rewrite removed, still standing for model files: > A one-line compile fix owed three public-doc edits, so this gate produced 16 > of the last 20 red CI runs, and it had accreted SIX hardcoded exact-path-set > escape hatches -- one per legitimate change it had blocked. > [...] Editing src/ alone owes nothing. The cost stopped being hypothetical on 2026-08-16. `e34d71379` (#1054) is a one-line lambda-capture change to `models/qwen3_5_weights.cpp` that alters no capability. The gate demanded the surface; the commit answered with prose in BENCHMARKS, FEATURES and STATUS; that prose crossed the `check-public-doc-tables` paragraph budgets; and because that checker also runs in the pre-push hook, every branch in the repository was blocked from pushing. That is #1055, re-filed by a second agent as #1062 with #1064 as a duplicate fix PR, alongside #1058 which is still open. Two shared-file gates in series, each individually defensible. What the project supports is what the registry registers, so `feature_surface` now keys off a change to the set of `REGISTER_VLLM_MODEL(...)` entries in the touched file, read through `blob()` like the existing `measurement_changes`. `scripts/check-supported-models.py` already gates `docs/FEATURES.md` against that same set, so the signal is authoritative rather than newly invented. This NARROWS a gate, which is the risky direction, so the polarity is pinned by test rather than asserted: adding an architecture, adding a whole new registered file, and removing an architecture each still owe `docs/FEATURES.md`, and the four `.agents/*-matrix.md` records keep their path trigger because editing one IS the claim. Red before, green after, and mutation-proven. `test_doc_checkpoint.py` goes 27 -> 32 cases. Before the implementation, `test_editing_a_registered_model_owes_nothing` failed with the FEATURES demand. After it, 32 pass. Because the three still-owes cases were green under the OLD path trigger too, they could not by themselves show the new trigger works, so `registration_changes` was mutated to return `[]`: that fails exactly those three and no others, and restoring returns 32 green. Does not close #595. A genuine new architecture still writes the shared `docs/FEATURES.md` table, so the lock that issue names survives; this removes the contention for every fix, refactor and port phase that changes no registration. #515 is the identical shape for `CMakeLists.txt` -> `docs/USAGE.md` and is untouched. Both are recorded under `## Owed` in the spec, together with the class this narrowing gives up: a capability change inside an already-registered model now goes undemanded. Refs #595 FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: ClaudeCode:claude-opus-5 [ClaudeCode]
scripts/check-public-doc-tables.pyexits 1 onorigin/mainatb493f4981.That checker gates the
agent-recordCI job (.github/workflows/ci.yml:160),scripts/agent-preflight.sh:68and the pre-push hook, somainis red, everybranch cut from it inherits the red, and CI, preflight and pushes are blocked
for everyone.
Where it came from
PR #1054 added two prose paragraphs to
docs/BENCHMARKS.mdand one todocs/FEATURES.md. Both pages were sitting exactly on their prose budgets, 35of 35 and 21 of 21, so they went to 36 and 22. Confirmed in a clean detached
worktree rather than the shared checkout:
283c7e492exits 0,e34d71379isthe first commit that exits 1, and
git diff 283c7e492 e34d71379 -- scripts/check-public-doc-tables.pyis empty, so the pages moved and the gatedid not. #1054's recorded verification does not list this checker, and on an
external contribution a red CI job has the #584 fork-artifact story for cover.
Why no constant moves
The reflex here is to raise the two numbers, and the checker refuses that
reading in its own source.
check-public-doc-tables.py:17and:105both saytable ROWS are unbudgeted and that nothing budgets the whole file: adding a
measurement, the normal operation, was never blocked. Only prose is capped,
because rows are a keyed table's growth mode and prose is the decay mode the
checker exists to stop. So the gate is behaving as designed, AGENTS.md's "limit
an entry, not a shared file" rule is already satisfied, and widening the gate
to pass would be making a red gate green by widening its scope.
Merging the paragraphs into their neighbours would also have passed the
counter. It was rejected for the same reason: it games the count while leaving
the page in the shape the contract rejects.
What changed
Each fact takes the row its own page's schema already has for it. Nothing is
deleted and no fact is dropped.
docs/BENCHMARKS.mdgains oneOpen gapsrow (Track | Status | Next gate)."Benchmarking is NOT APPLICABLE, and the binding gate is the Apple Clang build"
is a disposition, which is exactly what that table records, and it already
carries a cluster of "no number owed" build-verification rows (
Ampere consumer,Pre-Ampere breadth) that this one joins. The date moves into therow, which is what the checker's own regrowth-guard message directs;
DATED_HEADING_REreads headings only.docs/FEATURES.mdupdates the Apple row ofBackends and hardwarein place(
Backend | vllm.cpp | vLLM | SGLang | llama.cpp). Apple Clang building theQwen3.5 MoE loader with warnings promoted to errors is a platform and toolchain
fact, and that table's
CPUrow already carries the same class of caveat in itskey cell. Updating a row rather than appending one is what a keyed table asks
for.
Two placements were rejected, and the spec records why, because both read as
obvious until measured. The
Registered architecturescorrectness cell forQwen3_5MoeForConditionalGenerationis 195 characters against a 220-char capand its
Qwen3_5ForCausalLMsibling is at exactly 220, so neither fits. A newAt a glancerow would have forced a claim in thevLLM,SGLangandllama.cppcolumns about a C++ host-toolchain build that no evidence in thischange supports, and that page's header says those columns are our reading of
documented behavior.
Verification
RED first, from a clean detached worktree, run bare:
GREEN after:
_prose_paragraphs:docs/BENCHMARKS.md35 of 35,docs/FEATURES.md21 of 21.Open gapsrow splitsinto 5 parts on unescaped pipes against its table's 3 columns, and the
Backends and hardwarerow into 7 against its 5. Cells 197 and 198characters against the 220 cap, rows 317 and 218 against the 600 cap, no
em-dash in either.
docs/FEATURES.mdhas zero malformed rows before and after. The 13two-column rows inside four-column tables on
docs/BENCHMARKS.mdareinherited: identical line numbers at
b493f4981and at this head, and nottouched here.
.agents/issue-index.mdis append-only here:origin/main's file is astrict prefix of this one, one row added, 1271 bytes. The malformed
#1003row is inherited and owned by issue-index: a third malformed row (#1003) — unescaped pipes make it a 9-cell row, and no checker can see cell count #1059.
scripts/agent-preflight.shandscripts/agent-preflight.sh --staged, bothrun bare:
All gates green.windows-msvc-cpuandwindows-msvc-vulkanfail on every PR (#584, #968, fixowed by #983) and are not this change.
Closes #1062
FOLLOWING_AGENTS_PROTOCOL
Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [claude-code]