fix(GATE-CI-ENFORCEMENT-FLOOR): the diff-scoped walk gets a floor, and its base rule gets a test (#1809) - #1814
Merged
Conversation
…because 41 commits on main can never be repaired (#1809) `commit-protocol-tag` and `documentation-checkpoint` base their walk on the head of the last SUCCESSFUL push run. That base is what makes a cancelled run lossless (#822, #863), and it is also what turns one unrepairable commit into a permanent red: no green run means the base never advances, so every later push re-walks the same violations over a range one commit wider. Re-measured at `bacb71109`: `LAST_GREEN` is `fafa16f0f` of 2026-08-13, the range is 499 first-parent commits with no merges, and 41 distinct commits in it fail a gate with no available remedy — 35 fail the strict trailer contract, 6 disjoint ones fail role discipline. They are on `main`, and the only repair is a rewrite `AGENTS.md` forbids. The spec lands first and alone so the design can be read before the code implements it. It chooses a recorded enforcement floor over a per-commit exemption list, enumerates all 41 forgiven commits, and argues the narrowing explicitly: enforcing on an immutable landed commit is a permanent red rather than a gate, and a permanent red is read by nobody. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code]
…d its base rule gets a test (#1809) The base of the diff-scoped walk on `main` is the head of the last SUCCESSFUL push run. That is what makes a cancelled run lossless (#822, #863) and it is kept. What it did not anticipate is a violation with no available remedy: 41 commits between 2026-08-13 and 2026-08-23 are on `main` and can only be repaired by rewriting `main`, which AGENTS.md forbids. No green run is reachable, the base freezes, and every later push re-walks the same violations over a range one commit wider. `commit-protocol-tag` and `documentation-checkpoint` have been red for ten days for that reason alone. `scripts/ci-enforcement-floor.txt` records one commit the walk never goes behind, and the base becomes the newer of the last green commit and that floor, decided by `git merge-base --is-ancestor` rather than by a commit date an author controls. The floor is a LOWER CLAMP on an otherwise unchanged base, so while it sits behind the last green commit -- the steady state, because that commit advances on every green push and the floor advances only when somebody commits an advance -- the resolved base is byte-identical to today's and a cancelled run is still covered by the next run. The one window that skips anything is `last_green..floor` right after an advance, which is the forgiveness being asked for and is enumerated commit by commit in the spec. This narrows enforcement by 41 commits and the spec argues for the narrowing rather than hiding it: enforcing on an immutable landed commit is a permanent red and not a gate, because no contributor action clears it, and a permanent red is read by nobody. No assertion is deleted, no checker is modified, and a violation landing after the floor still reds. The four byte-similar copies of the selection collapse into `scripts/ci-walk-base.py`. Of those four inline blocks exactly one was ever replayed by a test, `agent-record`'s, and only under a shim that stubs every `python3` call -- so it pinned which checker ran with which range string and could not see the base rule. The extraction is what makes cancelled-run losslessness an executable assertion: the new suite replays the sequence against a real throwaway repository and carries the naive `github.event.before` base as its positive control. Three existing assertions moved rather than went away, because the rule they matched as a string now lives somewhere else. `test_main_baseline`'s shim executes the resolver for real instead of stubbing it, so its cases test the real composition; its `before` fallback case and `test_agent_gates`'s role-range case now EXECUTE the resolver instead of grepping the YAML, which is a stronger statement than the literal each replaces. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code]
… replaying the real step bodies (#1809) The spec's Gates table said "see ## Outcome" and there was no Outcome. This writes it, from a run against a clone of the implementation commit with `main` pointed at it, so a push to `main` could be replayed without touching `main`. The gates are not transcribed. Their `run:` bodies are read out of `.github/workflows/ci.yml` with a YAML parser and executed as-is, with each step's declared `env:` resolved from a supplied event payload, so a change to the workflow changes the evidence. Four results. The three gates are GREEN on the implementation commit with the floor in place, and all three are red on `main` today. They go RED again when the floor is moved back to the frozen base, and RED again when the four resolver call sites are deleted, which is the reachability half. A new commit carrying no marker reds both trailer steps, a new product commit naming no pull request reds role discipline, and a control sharing their path and trailers is green, so each red is attributable to its violation rather than to the harness. Cancelled-run losslessness is replayed live as well as in the unit suite: a violating commit whose run is cancelled is still named by the next run, and the naive `before` base covers it with nothing. One trap is recorded rather than quietly fixed, because it invalidates this class of result: the first no-trailer mutation named the marker in its own body explaining that it lacked one, which satisfied the presence grep and read as a passing gate. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code]
`main` advanced to `0a0a53e5a` while this row was in flight. Both new commits, `849a7dd73` and `0a0a53e5a`, were re-measured against all three diff-scoped gates and are CLEAN, so the recorded enforcement floor stays at `bacb71109` and forgives nothing beyond the 41 commits the spec enumerates. Merged rather than rebased so the commit `## Outcome` names as the tree it measured, `6de046d36`, stays in this branch's history. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code]
…e true tail after the merge (#1809) `main` appended #1804 and #1802 while this row was in flight, and the union merge driver placed our row BEFORE both of them. That leaves the row an insertion in the middle of an append-only file rather than an append, which is the shape `.gitattributes`' union driver cannot be trusted with. The row's bytes are unchanged; only its position is. Verified by line number rather than by reading the diff header, because the diff header shows an append either way. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code]
…ain that moved under this row (#1809) Risk 1 in the spec is a violating commit landing between the recorded floor and the merge. `main` advanced to `0a0a53e5a` while this row was in flight, so the risk arrived and the floor was re-measured rather than assumed still correct. Both new commits are clean on all three gates over `bacb71109..0a0a53e`, so the floor stays where it is and forgives nothing beyond the 41 commits the spec enumerates. Whoever merges this repeats the two commands the section names. The section also records why `test_cpu_x86_llamacpp_floor` is red in preflight and why that is #618 rather than this row: pristine `origin/main`, run serially in its own clone, fails the same cases with `NO_QUIET_WINDOW` at loadavg 63-68. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code]
…s, and the correction says how (#1809) `git log --oneline bacb711..origin/main` prints newest first, and the pair it returned was read in printed order, so the previous commit recorded `0a0a53e5a` as the tip when `849a7dd73` is the tip and `0a0a53e5a` its parent. The merge commit on this branch carries the same error in its body and cannot be repaired without rewriting a commit that other work may already reference, so the `## Outcome` section states the error and the correction instead of hiding it. Nothing measured changes. The range was `bacb71109..origin/main`, which covered both commits whichever is the tip, and both are clean on all three gates. The floor stays at `bacb71109`. The section also names the two `CpuX86FloorHarnessTests` cases that fail on pristine main rather than saying "the same cases", because a claim that two runs failed alike has to name what failed. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code]
…ead, and #618 is discriminated twice (#1809) The `## Outcome` said `test_cpu_x86_llamacpp_floor` is the one red in the final preflight. A later run on the pushed head, after the box quietened, reports All gates green, so the sentence was stale and read as a standing red. Both readings are kept because together they are the discrimination. Pristine `origin/main` in its own clone fails the same two `CpuX86FloorHarnessTests` cases with `NO_QUIET_WINDOW` at loadavg 63-68, and the same tree passes at lower load. That is a load-dependent harness, #618, and not this change. The green run is not offered on its own: a gate that passes once is not a gate that cannot fail. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code]
…ead of asserting it (#1809) The resolver's docstring and the spec both said a broken floor record fails closed. Neither had run it. An unexecuted claim about a failure path is the one most likely to be wrong, because nothing about the happy path exercises it. Measured: with the record emptied to a bare comment, all three diff-scoped steps exit 2 with the resolver's own message and abort under `set -eu` before invoking a single checker. That matters in one specific direction. A broken record read as "no floor" would silently restore the ratchet, so the parse refuses rather than degrades, and the refusal is now a measurement rather than an intention. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code]
…g, and three claims outran their evidence (#1809) A fresh review returned FAIL on the record, not on the mechanism. The resolver, its data file, `ci.yml`, its suite and the three checkers are byte-identical here; every repair is prose in `.agents/specs/ci-enforcement-floor.md`. TWO OF THE 41 ENUMERATED SHAS DID NOT EXIST. `ddff09093663` and `be4a3edf1727` resolve to no object; the commits are `ddff090936bb` and `be4a3edf17b2`. That is worse than a typo, because `scripts/ci-enforcement-floor.txt` says of that table "That record is the only place that now says those violations happened" — after the floor lands no gate names those 41 again, so the enumeration is the sole witness and two of its primary keys pointed at nothing. All three sites are corrected, and every sha in the section is now verified rather than spot-checked: 41 of 41 unique tokens resolve under `git rev-parse --verify -q '<sha>^{commit}'`, and each row's recorded date agrees with the commit's author or committer date. A MITIGATION WAS CLAIMED THAT DOES NOT EXIST. Risk 2 said a floor set too far forward is caught by ancestry and by `RecordedFloorTests`. It is not. Those two guards catch an OFF-HISTORY floor. A floor advanced too far to a commit that really is on `main` IS an ancestor of `HEAD`, so both accept it. Measured at this head with the floor set to `HEAD` itself: the sha pattern accepts it, `known` and `is_ancestor(floor, HEAD)` are both true, the resolver returns `HEAD`, and all three diff-scoped steps return rc 0 vacuously over an empty walk. The risk now says the only mitigation is the reviewed advance, which is the true position. This is a different failure from the fail-closed case recorded in G5, and both are now stated as what they are. THE "STEADY STATE" IS NOT THE STATE THIS REPOSITORY IS IN. The losslessness argument assumed the floor sits behind `LAST_GREEN` because `LAST_GREEN` advances on every green push. Measured: `LAST_GREEN` is `fafa16f0f` and has not moved since 2026-08-12T23:53Z, and of the 100 most recent `push` runs of `ci.yml` on `main` 93 are cancelled, 6 failed and none succeeded. So the floor is AHEAD of `LAST_GREEN`, the base is the floor on every push, and the walk grows by one per merge — the growth this file levels at the rejected exemption list. Correctness is untouched, `floor..HEAD` still covers every post-floor commit, so this is an accuracy repair. The skipping window is also restated precisely: it runs from the advance until the next green push run, not "a moment", and what it skips does not grow while it is open. TWO COSTS THE FILE DID NOT STATE. The floor forgives by RANGE, not by violation: a checker written tomorrow that finds a new class of defect in the pre-floor range is forgiven silently too, which an exemption list would not do, and leaving that out made the comparison one-sided. And the floor swallows the one in-checker exception it cites as precedent — `281b4bc76c0e` (#1262) is below the floor, so `--range fafa16f..origin/main` prints its `This is DEBT, not success` banner once and `--range bacb711..origin/main` prints it zero times. The entry is not deleted or bypassed and `LandedMessageExceptions` still pins it; only its runtime visibility on the push lane is lost, and the record here is the weaker replacement. THE OUTCOME'S PREFLIGHT LINE WAS STALE. It claimed "All gates green". `scripts/agent-preflight.sh` at this head reports rc 0, zero failures and TWO SKIPS — `commit-trailers` and `commit-style`, because `origin/main` is not an ancestor of `HEAD` — and prints "NOT a green preflight" itself. Reading the rc alone is how the claim was made. Both gates were run by hand over `849a7dd73..HEAD`, which is every commit this branch adds: rc 0 and rc 0, both at `f7ef4fe19` and again after this commit was authored. RISK 1 HAS ARRIVED AND IS RECORDED RATHER THAN QUIETLY FIXED. Re-measured at `origin/main` `e6f4f566f`, `check-role-discipline.py` is rc 1 over `bacb71109..origin/main` on `c00b99c7c`, which reached `main` with two LTX-2.5 files and no task branch. The floor value is NOT changed here: advancing it is the reviewed act the spec defines, and doing it inside a review repair is what that section forbids. Whoever merges either advances the floor in a commit that names `c00b99c7c` or accepts a standing red on that step. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code]
The branch was behind `origin/main` and conflicted with it in `scripts/agent-preflight.sh`, so GitHub could produce no merge ref and the PR lane had nothing to check out. Both sides append to the same `SUITES` array; the resolution keeps all four entries, `af320abb2`'s three and this branch's `test_ci_walk_base`. The merge is also what makes the advanced floor recordable: the row's own `RecordedFloorTests::test_recorded_floor_is_an_ancestor_of_head` asserts the recorded value is an ancestor of `HEAD`, and `c00b99c7c` landed on `main` after this branch left it. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code]
… one commit that reformed the deadlock
The floor recorded at `bacb71109` no longer holds. Re-measured at `origin/main`
`d60692c89`, over `bacb71109..origin/main`, ten first-parent commits: the
presence grep is rc 0, `check-commit-trailers.py --range` is rc 0,
`check-now-current.py` is rc 0, and `check-role-discipline.py` is **rc 1** on
exactly one commit.
That commit is `c00b99c7c`, `fix(LTX25-DIT-ATTN-ARM-PARSE): match every DiT
attention arm exactly and refuse a fourth value`, 2026-08-24. It landed
`src/vllm/model_executor/models/ltx2_device.cpp` and
`tests/vllm/models/test_ltx2_device.cpp` — product code and its own test —
straight onto `main` with no `row/<ID>` branch in its history. Its message is
clean, so this is a role-discipline violation and not a trailer one: the split
across the forgiven set moves from 35 trailers / 6 role discipline to 35 / 7,
and the count from 41 to 42.
WHY THIS IS JUSTIFIED. The commit is on `main` and can only be repaired by
rewriting `main`, which the protocol forbids. It is the same condition as the 41
already enumerated, and it produces the same failure at a smaller scale: with
the floor left at `bacb71109`, the `agent-record` role-discipline step reds on
`c00b99c7c` on every future push, forever, with no action any contributor can
take to clear it. A permanent red is read by nobody. Refusing to advance would
hand this row's own merge the defect the row exists to remove — one commit
instead of 41, and freezing again on the next one.
WHY THIS FAR AND NO FURTHER. The floor is set to `c00b99c7c` itself, not to
`origin/main`. The walk is `FLOOR..HEAD` and excludes `FLOOR`, so this forgives
that one commit and leaves `e6f4f566f`, `d60692c89` and everything after them
enforced. Advancing to current `main` would have been the same edit and would
have forgiven two commits nobody examined; risk 2 of this spec records that
nothing in the mechanism can detect that, and the review is the only control.
Minimality is how the control is honoured.
WHAT THE RECORD OWES. `c00b99c7c` is enumerated as the 42nd forgiven commit
with its sha, date, subject and what it actually did. Every one of the 42 shas
was verified to resolve — `git rev-parse --verify -q '<sha>^{commit}'` over all
42: 42 resolved, 0 missing, all 42 ancestors of `origin/main`. That is a full
sweep, not a spot-check, because after this lands the enumeration is the only
witness that these violations happened, and an earlier round of this list
carried two shas that resolved to nothing.
This is the first exercise of `### Advancing the floor`, and it happened before
the pull request that introduces the mechanism had merged. Risk 1 of this spec
predicted exactly this and it arrived one day later. Two things follow, and
they point in opposite directions: the mechanism works, and the violations are
still arriving — `c00b99c7c` is the second role-discipline violation in two
days, after `6e73bdee3ea1`.
Measured after the edit, each rc captured on the command itself and never after
a pipe: over `c00b99c7c..origin/main` the grep step, `check-commit-trailers.py`,
`check-role-discipline.py` and `check-now-current.py` are all rc 0;
`git merge-base --is-ancestor c00b99c origin/main` is rc 0;
`tests/scripts/test_ci_walk_base.py` is 31 tests, 0 failures. The gate still
bites: a scratch commit carrying no `FOLLOWING_AGENTS_PROTOCOL` string anywhere,
marker count printed as 0 before the run, reds both trailer steps by name over
the new floor, and the tree was restored byte-for-byte with sha256 proof.
Not one line of `scripts/ci-walk-base.py`, `.github/workflows/ci.yml`,
`tests/scripts/test_ci_walk_base.py` or any checker changes. This moves one
recorded value and updates the record that justifies it.
FOLLOWING_AGENTS_PROTOCOL
Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [Claude Code]
…ole, because a truncated one understates what it names The fenced block that justifies forgiving `c00b99c7c` re-wrapped the checker's output and cut it off after `...reached main without arriving on a task branch.`, with no ellipsis marking the cut. A reader had no way to see that the message continues, and the half that was dropped is the half that states the rule: work happens in its own worktree on a `row/<ID>` branch and lands through a reviewed PR or an authorized local merge naming that branch. That sentence is the reason the commit is a violation, so a record that omits it argues for the advance with the weaker half of the evidence. The block now carries the checker's single unwrapped line verbatim, and the prose names the exact invocation it came from so the next reader can reproduce it rather than trust a transcription. Copied from the checker's own stdout and compared byte-for-byte, not retyped. Nothing else changes. The floor value, the mechanism, the walk, and the enumerated 42 are untouched. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code]
GitHub read the pull request as CONFLICTING, and locally the merge is clean. The one file both sides touch is `.agents/issue-index.md`, which `.gitattributes:7` marks `merge=union`; GitHub does not apply that attribute, so its mergeability probe is an artefact rather than a real conflict. Two other things unblock with it. `scripts/agent-preflight.sh` was SKIPping `commit-trailers` and `commit-style` because `origin/main` was not an ancestor of HEAD, and a SKIP is not a pass. The floor also has to be re-verified against the `main` that moved, because a floor is only sufficient at the head it is measured on. The index was checked by hand rather than trusted to the union driver, which has twice dropped a tail row in this repository. Merge base `3574065e7` carries 659 rows; this branch adds `#1809` and `main` adds `#1823`, neither side removes one, and the merged file carries 661 rows whose set is exactly the union of the two sides. `#1809` and `#1823` each appear once, the preamble is byte-identical to both parents, and no file in the merge carries a conflict marker. `scripts/ci-enforcement-floor.txt` is unchanged. The floor stays `c00b99c7c8b64f9247230ed6220598cc5c0e347e`, and this merge advances nothing. FOLLOWING_AGENTS_PROTOCOL Following-Agents-Protocol: true AI-Assisted: true Assisted-by: AGENT:claude-opus-5 [Claude Code]
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.
fix(GATE-CI-ENFORCEMENT-FLOOR): the diff-scoped walk gets a floor, and its base rule gets a test
commit-protocol-taganddocumentation-checkpointhave been red onmainsince 2026-08-13 and cannot recover on their own. Their walk bases on the head
of the last SUCCESSFUL push run, so no green run means the base never advances,
and every later push re-walks the same violations over a range one commit wider.
Re-measured at
bacb71109:LAST_GREENisfafa16f0fof 2026-08-13T01:53, therange is 499 first-parent commits with no merges, and 41 distinct commits in it
have no available remedy. 35 fail
check-commit-trailers.py --range, of which20 carry no
FOLLOWING_AGENTS_PROTOCOLmarker at all and the other 15 carry itone to nine times in a form the strict contract rejects; 6 disjoint ones fail
check-role-discipline.py.check-now-current.pypasses over the whole rangeand forgives nothing. Every one of the 41 is on
main, and the only repair is arewrite AGENTS.md forbids.
What changes
scripts/ci-enforcement-floor.txtrecords one commit the walk never goesbehind. The base becomes the newer of the last green commit and that floor,
decided by
git merge-base --is-ancestorrather than by a commit date an authorcontrols and a rebase can move backwards.
The four byte-similar copies of the base selection in
.github/workflows/ci.ymlcollapse into
scripts/ci-walk-base.py.The property that survives
A cancelled run stays lossless. The floor is a LOWER CLAMP on an otherwise
unchanged base, so while it sits behind the last green commit the resolved base
is byte-identical to today's. The one window that skips anything is
last_green..floor, which opens at an advance and closes at the next green pushrun; it is the forgiveness being asked for, what it skips is fixed at the
advance rather than growing, and the spec enumerates all 41 commits with sha,
date and subject.
That window is currently OPEN and will stay open for a while, which the first
draft of this change described backwards.
LAST_GREENisfafa16f0fand hasnot moved since 2026-08-12T23:53Z: of the 100 most recent
pushruns ofci.ymlonmain, 93 are cancelled, 6 failed and none succeeded. So the floorsits AHEAD of the last green commit, not behind it, the resolved base is the
floor on every push, and the walk grows by one per merge until a push run
finishes green. Correctness is unaffected —
floor..HEADstill covers everypost-floor commit — so this is an accuracy repair to the argument, not to the
mechanism.
Proved rather than asserted. A violating commit whose run is cancelled is still
named by the next run's gates, and under the naive
github.event.beforebaserev-list before..headcovers it with nothing, which is #863 exactly.Why the extraction is the point
Of the four inline blocks, exactly one was ever replayed by a test —
agent-record's, bytest_main_baseline.py::AgentRecordDiffRangeTests, and onlyunder a shim that stubs every
python3call, so it pinned which checker ran withwhich range string and could not see the base rule. The other three were executed
by nothing. Nothing in the tree could have caught the ratchet.
tests/scripts/test_ci_walk_base.pyis 31 cases over a real throwawayrepository, because every question here is about ancestry.
What is narrowed, and why
41 commits stop being walked. Enforcing on an immutable landed commit is not
enforcement: no contributor action clears it, so it is a permanent red rather
than a gate, and a permanent red is read by nobody — which is #1722's effect and
strictly worse than a smaller gate that is read. The gate's purpose is to stop a
NEW violation and that is untouched. No assertion is deleted, no checker is
modified, and advancing the floor stays a reviewed commit that must name what it
forgives.
A per-commit exemption list was evaluated and rejected: AGENTS.md has no waiver
registry, the mechanism would have to be built three more times in checkers that
have no exemption concept, and it never shrinks the walk, so the range would
grow by one per merge forever. Reverting to
github.event.beforewas rejectedbecause it reintroduces #863 outright.
Evidence
Measured by reading the gates'
run:bodies out ofci.ymlwith a YAML parserand executing those exact bytes, so nothing about the gates is transcribed.
(#1809)The last row is fail-closed, and it is a measurement rather than an intention: a
broken floor record read as "no floor" would silently restore the ratchet, so
the parse refuses and every step aborts under
set -eubefore invoking a singlechecker.
The call-site deletion also reds
test_ci_walk_base.pyat 2 of 31. Bothmutations were restored and each restoration verified by
sha256sum -cwith aclean
git status.One trap is recorded in the spec rather than quietly fixed: the first
no-trailer mutation named the marker in its own body while explaining that it
lacked one, which satisfied the presence grep and read as a passing gate.
Three existing assertions that matched the old inline shell as a string moved
rather than went away.
test_main_baseline's shim now executes the resolverinstead of stubbing it, and its
beforefallback case andtest_agent_gates'srole-range case now EXECUTE the resolver instead of grepping the YAML — stronger
than the literals they replace.
A fresh review returned FAIL, and this is the repair
Five findings, all in the RECORD. The mechanism passed:
scripts/ci-walk-base.py,the recorded floor sha,
.github/workflows/ci.yml,tests/scripts/test_ci_walk_base.pyand the three checkers are byte-identical, and
git diff --statagainst thereviewed head touches one file under
.agents/.ddff09093663andbe4a3edf1727are not objects; the commits areddff090936bbandbe4a3edf17b2. That is load-bearing rather than cosmetic, becausescripts/ci-enforcement-floor.txtsays of that table "That record is the onlyplace that now says those violations happened". All three sites are corrected
and the whole table is now verified rather than spot-checked: 41 of 41 unique
shas resolve under
git rev-parse --verify -q '<sha>^{commit}', and everyrecorded date agrees with the commit's author or committer date.
floor is caught by ancestry and by
RecordedFloorTests. Those guards catch anOFF-HISTORY floor. A floor advanced too far to a commit that really is on
mainIS an ancestor ofHEAD, so both accept it — measured with the floorset to
HEADitself, whereknownandis_ancestorare both true, theresolver returns
HEAD, and all three diff-scoped steps return rc 0 vacuouslyover an empty walk. The risk now says the only mitigation is the reviewed
advance. This is a different failure from the fail-closed case in the evidence
table above, and both are stated as what they are.
281b4bc76c0e(A landed commit on main carries a malformed Assisted-by, because the PR BODY was never corrected with its commits #1262) is below the floor, socheck-commit-trailers.py --range fafa16f0f..origin/mainprints itsThis is DEBT, not successbanner once and--range bacb71109..origin/mainprints it zero times. The entry is not deleted or bypassed and
LandedMessageExceptionsstill pins it; only its runtime visibility on thepush lane is lost, and the spec now says so.
spec.
that finds a new class of defect in the pre-floor range is forgiven silently
too, which an exemption list would not do. That is the strongest argument
against the shape chosen here and the comparison was one-sided without it.
The floor is advanced once, and this is the first exercise of that mechanism
Risk 1 arrived one day after the floor was recorded, and it is now
discharged. Re-measured independently at
origin/maind60692c89, overbacb71109..origin/main, ten first-parent commits: the presence grep is rc 0,check-commit-trailers.py --rangeis rc 0,check-now-current.pyis rc 0, andcheck-role-discipline.pyis rc 1 on exactly one commit.That commit is
c00b99c7c,fix(LTX25-DIT-ATTN-ARM-PARSE): match every DiT attention arm exactly and refuse a fourth value, 2026-08-24. It landedsrc/vllm/model_executor/models/ltx2_device.cppandtests/vllm/models/test_ltx2_device.cpp— product code and its own test —straight onto
mainwith norow/<ID>branch in its history. Its message isclean and passes the trailer contract, so this is a role-discipline
violation and not a trailer one: the split across the forgiven set moves from 35
trailers / 6 role discipline to 35 / 7, and the count from 41 to 42.
Why the advance is justified.
c00b99c7cis onmainand can only berepaired by rewriting
main, which AGENTS.md forbids. It is the same conditionas the 41 already enumerated and it produces the same failure at a smaller
scale: with the floor left at
bacb71109, theagent-recordrole-disciplinestep would red on that one commit on every future push, forever, with no action
any contributor could take to clear it. That is this row's own defect arriving
at its own merge — one commit instead of 41, and freezing again on the next one.
Why this far and no further. The floor is set to
c00b99c7citself, not toorigin/main. The walk isFLOOR..HEADand excludesFLOOR, so this forgivesthat one commit and leaves
e6f4f566f,d60692c89and everything after themenforced. Advancing to current
mainwould have been the same edit and wouldhave forgiven two commits nobody examined. Risk 2 records that nothing in the
mechanism can detect that; the review is the only control, and minimality is how
it is honoured.
c00b99c7cis enumerated as the 42nd forgiven commit with its sha, date,subject and what it did. All 42 shas were verified to resolve —
git rev-parse --verify -q '<sha>^{commit}'over all 42: 42 resolved, 0missing, all 42 ancestors of
origin/main. A full sweep, not a spot-check,because after this lands the enumeration is the only witness that these
violations happened, and an earlier round of this list carried two shas that
resolved to nothing.
Measured after the edit, each rc captured on the command itself and never after
a pipe:
check-now-current.pybacb71109(old)c00b99c7cc00b99c7c(new)git merge-base --is-ancestor c00b99c7c origin/mainis rc 0, andtests/scripts/test_ci_walk_base.pyis 31 tests, 0 failures over the new value.The gate still bites: a scratch commit above
origin/maincarrying noFOLLOWING_AGENTS_PROTOCOLstring anywhere — marker count printed as 0before the run, because a mutation whose own message mentions the marker
satisfies the presence grep and reads as a pass — reds both trailer steps by
name over
c00b99c7c..<scratch>while role discipline andcheck-now-current.pystay rc 0. It was built with
git commit-treeand never entered the worktree;sha256sum -con both changed files passes afterwards.Two things follow from this being the first advance, and they point in opposite
directions. The mechanism works, and it was exercised before the pull request
introducing it had merged. And the violations are still arriving:
c00b99c7cisthe second role-discipline violation in two days, after
6e73bdee3ea1. A floorstops an unrepairable commit freezing a gate. It is not a fix for whatever is
putting product code on
mainwithout a task branch.mainmoves roughly every twenty minutes, so whoever merges repeats the fourcommands over
c00b99c7c..origin/mainand, if one reds again, advances thefloor the same way.
That re-measurement has been done once more, at the merged head.
mainmoved to
df1ee2058, four first-parent non-merge commits above the floor. Eachrc captured on the command itself and never after a pipe:
commit-protocol-tagpresence grepci.yml, not transcribed, overc00b99c7c..origin/mainpython3 scripts/check-commit-trailers.py --range c00b99c7c..origin/mainpython3 scripts/check-role-discipline.py --base c00b99c7c --head origin/mainpython3 scripts/check-now-current.pygit merge-base --is-ancestor c00b99c7c origin/mainis rc 0, andtests/scripts/test_ci_walk_base.pyis 31 tests, 0 failures, rc 0 at the mergedhead. The recorded floor is still sufficient and still minimal, so nothing
about it changes here:
scripts/ci-enforcement-floor.txtis byte-identical tothe reviewed head and still reads
c00b99c7c8b64f9247230ed6220598cc5c0e347e. Whoever merges repeats the fourcommands one more time, because
mainkeeps moving.The one review finding, repaired
A fresh review returned PASS with one nit, and this is it.
.agents/specs/ci-enforcement-floor.mdpresentedcheck-role-discipline.py'serror inside a fenced block as if it were verbatim, but the block was re-wrapped
and truncated after
…reached main without arriving on a task branch.with noellipsis marking the cut. The dropped half is the half that states the rule —
work happens in its own worktree on a
row/<ID>branch and lands through areviewed PR or an authorized local merge naming that branch — which is the
reason
c00b99c7cis a violation at all. A record that argues for forgiving acommit was doing it with the weaker half of the evidence.
The full message is pasted rather than an ellipsis appended, because the fenced
block is part of what justifies the advance. It is the checker's single
unwrapped line, copied from its own stdout under
--base b207f34d3 --head c00b99c7c(which exits 1) and compared byte-for-byteagainst the file, not retyped. The prose now names that invocation so the next
reader reproduces it instead of trusting a transcription.
git diff --statagainst the reviewed head224f9afb6shows this committouching exactly one file,
.agents/specs/ci-enforcement-floor.md, 5 insertionsand 4 deletions.
scripts/ci-walk-base.py,scripts/ci-enforcement-floor.txt,tests/scripts/test_ci_walk_base.pyand the three checkers are untouched, and.github/workflows/ci.ymlchanges only by what the merge ofdf1ee2058bringsin.
Merge-time hazards, recorded rather than fixed here
origin/mainconflict was real and is resolved; the secondCONFLICTINGwas a GitHub artefact. The trial merge againstaf320abb2genuinely conflicted in
scripts/agent-preflight.sh'sSUITESarray, soGitHub could produce no merge ref;
3574065e7is merged in and both sides'entries are kept,
af320abb2's three plus this branch'stest_ci_walk_base.mainthen moved again and GitHub reportedCONFLICTING/DIRTYa secondtime, for a merge Git performs cleanly. The only file both sides touched was
.agents/issue-index.md, which.gitattributes:7marksmerge=union—an attribute GitHub does not apply when it computes mergeability.
df1ee2058is now merged in as well, with
Auto-mergingon that file and onci.ymlandno conflict anywhere. Merging is also what makes the advanced floor
recordable, since
RecordedFloorTests::test_recorded_floor_is_an_ancestor_of_headasserts the recorded value is an ancestor of
HEADandc00b99c7clandedafter this branch left
main..agents/issue-index.mdrow survived both merges exactly once, and thesecond merge was verified by hand rather than trusted to the union driver,
which has twice silently dropped a tail row in this repository. Merge base
3574065e7carries 659 rows; this branch adds#1809,mainadds#1823,and neither side removes one. The merged file carries 661 rows whose set is
exactly the union of the two sides — compared as sorted sets, not counted —
with
#1809and#1823each appearing once, no duplicate row, the preamblebyte-identical to both parents, and zero conflict markers across all six files
the merge touches. The row is no longer the tail — later rows follow it — which
is correct for an append-only union file, and it is not edited: the row's own
prose still says 41, because an index row is never rewritten.
scripts/agent-preflight.shhas no SKIP left, and that is now measured atthe merged head rather than at the previous one.
commit-trailersandcommit-styleSKIPPED wheneverorigin/mainwas not an ancestor ofHEAD,and the script prints
NOT a green preflight: a skipped gate reported nothing about this treeitself when that happens — a rc 0 carrying a SKIP is a thirdstate the exit status cannot express. Rerun with a role claimed in the working
worktree after merging
df1ee2058: zero SKIPS, the string does not appearin the log,
NOT a green preflightdoes not appear, and both gates reportokunderCommit trailers vs origin/main df1ee20584d69d2ac434c7672f9099c71abc7f49,alongside
ok now-current rangeandok issue-index append-only. The spec's## Outcomeline claiming "All gates green" was already corrected to saythis.
scripts/ci-walk-base.py's docstring still carries the correctedsteady-state sentence. It was left alone so the reviewed mechanism stays
byte-identical; it is named in the spec so it is not left to be found.
test_cpu_x86_llamacpp_flooris red in preflight and is #618, not this row, sothe run exits rc 1 on that one gate and nothing else. It was discriminated
rather than asserted: pristine
origin/mainat0a0a53e5a, run serially in itsown clone, fails the same
CpuX86FloorHarnessTestscases withNO_QUIET_WINDOWat loadavg 63-68. The rerun at the merged head reproduces#618's recorded signature exactly —
test_a_contended_leg_is_discarded_and_never_summarisedassertinggot.returncode == 2and getting 4,waiting for quiet: 15s busy=112% builders=0 load=36.77— which is theNO_QUIET_WINDOW(4) forGIVING_UP(2)substitution the index row for #618 describes. The box carried loadavg 38-52
throughout, with a second session's preflight running concurrently.
Closes #1809.
FOLLOWING_AGENTS_PROTOCOL
Following-Agents-Protocol: true
AI-Assisted: true
Assisted-by: AGENT:claude-opus-5 [Claude Code]