You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Check Changeset concludes success when it measured nothing, and no edited trigger ever re-reads a Clause-②: line added after the last push — a correct seat action leaves the level axis unjudged behind a green check #16776
Split off #16361 by the triage seat. #16361's body is about the level rule's predicate scope (a PR-scoped declaration applied at package scope, producing a false red). This card is the two defects its filer added in comment 5560230929, which point the other way — at a green that judged nothing — and which the filer explicitly left for triage to place ("Whether that belongs on this card or its own is triage's call").
They are one card because defect B is the mechanism that makes defect A reachable in the ordinary course of carrier discipline.
All measurements below are the #15963 implementer's, taken by running the gate's own script offline against --event payloads, and the two live PRs of that round. ⚠️ Not re-driven by triage — see Boundaries.
Defect A — NOT MEASURED and PASSED are the same check-run conclusion
⭐ First, the credit, because it narrows the card: the gate is honest when blind. Measured, three states on commit 273247e56f:
event payload
exit
what the step log says
Clause-②: yes in the body, no carrier label
1
⛔ "…grades a package it grew patch" · declaration line: Clause-②: yes — fires on the body line alone
neither carrier nor body line
0
LEVEL AXIS: NOT MEASURED
(fixed head) body line, no carrier
0
✓ LEVEL AXIS: … no package … is graded patch
⇒ it prints LEVEL AXIS: NOT MEASURED rather than inventing a green verdict. ⛔ So this is not "the gate lies", and the filer corrected their own earlier wording to say so.
The defect is one layer out. The check-run conclusion is success in both the "judged and passed" and the "had nothing to judge" cases. A reader who opens the step log can tell them apart. The merge queue, the required-check set, and every summary view read the conclusion, not the log. ⇒ at the only layer that gates a merge, a gate that measured nothing is indistinguishable from a gate that passed.
That is this repo's own stated failure class, applied to its own CI: a reading that cannot fail is indistinguishable from one that passed. Here the reading did not merely not-fail — it did not happen, and said so somewhere nobody with merge authority is reading.
Defect B — the durable declaration is never re-read until someone pushes
.github/workflows/pr-automation.yml triggers on [opened, synchronize, reopened, labeled, unlabeled], its Check Changeset job skips label events, and there is no edited trigger.
⇒ A PR-body edit that adds the Clause-②: line is never read by the gate until the next synchronize — i.e. until someone pushes a commit.
✓ LEVEL AXIS: this PR declares clause-② `yes`, and no package whose `packages/*/src/**` it moves is graded `patch`.
· carrier: `needs:contract-review` is not on this PR (4 label(s) read)
· declaration line: `Clause-②: yes`
— the first measured pass in that round where the gate read the body line with the carrier already correctly cleared.
⭐ Why the two are one card: the failure needs no mistake
Compose them and the failure mode is reached by a seat doing only correct things, in a defensible order:
at-tier review PASSes;
the review seat strips needs:contract-review — correct carrier discipline;
⇒ Defect B means the gate never re-reads, so it still sees neither carrier nor line ⇒ LEVEL AXIS: NOT MEASURED; Defect A means that concludes success. The level rule — the maintainer ruling of 2026-09-04, decision batch #35, on #15294 — is simply never applied to that PR, and every merge-authority surface shows green.
⇒ ⭐ This also means #16361's proposed remedy does not work on its own. Requiring a body Clause-②: line is defeated by defect B whenever the line is added after the last push. The remedy needs either an edited trigger, or the line to be present from the PR's first push.
Directions (⛔ none chosen — recording what the measurements narrow to)
For A:
NOT MEASURED should not conclude success (neutral, or a failure requiring an explicit opt-out); or
it must be visible in the check-run's own output/summary, not only in step logs, so the conclusion carries the distinction to the surfaces that read it.
For B:
add an edited trigger (⚠️ note it fires on every body edit, including title/description churn — cost and noise want measuring); or
the filer's own cheapest reading: the Clause-②: line belongs in the PR body at creation time, written by the dev opening the PR rather than patched in later by the seat clearing the carrier. That also matches where the declaration comes from — the claim comment — rather than where it was being retrofitted.
⛔ No tolerance, no allowlist, no comment-only heuristic — carried over from #16361's body and it applies here too.
Priority reasoning (triage)
p2, not p1, and the capping fact comes from the round's own reviewer: all 69 packages sit in one fixed group, with 120 minor / 125 patch pending, so the released bump is set by the highest pending changeset regardless. ⇒ a level axis that goes unjudged on one PR does not, today, reliably ship a widened public surface inside a patch release.
Above p3 because the thing that goes unmeasured is a maintainer ruling, the surface that hides it is the one the merge queue reads, and reaching it requires no mistake by anyone.
⚠️ Run/job ids and timestamps belong to 2026-09-06; the workflow file may have moved since. Re-derive the trigger list from .github/workflows/pr-automation.yml rather than inheriting it.
⛔ Nothing was routed around: both PRs of that round complied with the gate as written.
Split off #16361 by the triage seat. #16361's body is about the level rule's predicate scope (a PR-scoped declaration applied at package scope, producing a false red). This card is the two defects its filer added in comment
5560230929, which point the other way — at a green that judged nothing — and which the filer explicitly left for triage to place ("Whether that belongs on this card or its own is triage's call").They are one card because defect B is the mechanism that makes defect A reachable in the ordinary course of carrier discipline.
All measurements below are the #15963 implementer's, taken by running the gate's own script offline against⚠️ Not re-driven by triage — see Boundaries.
--eventpayloads, and the two live PRs of that round.Defect A —
NOT MEASUREDandPASSEDare the same check-run conclusion⭐ First, the credit, because it narrows the card: the gate is honest when blind. Measured, three states on commit
273247e56f:Clause-②: yesin the body, no carrier labelpatch" ·declaration line: Clause-②: yes— fires on the body line aloneLEVEL AXIS: NOT MEASURED✓ LEVEL AXIS: … no package … is graded patch⇒ it prints
LEVEL AXIS: NOT MEASUREDrather than inventing a green verdict. ⛔ So this is not "the gate lies", and the filer corrected their own earlier wording to say so.The defect is one layer out. The check-run conclusion is
successin both the "judged and passed" and the "had nothing to judge" cases. A reader who opens the step log can tell them apart. The merge queue, the required-check set, and every summary view read the conclusion, not the log. ⇒ at the only layer that gates a merge, a gate that measured nothing is indistinguishable from a gate that passed.That is this repo's own stated failure class, applied to its own CI: a reading that cannot fail is indistinguishable from one that passed. Here the reading did not merely not-fail — it did not happen, and said so somewhere nobody with merge authority is reading.
Defect B — the durable declaration is never re-read until someone pushes
.github/workflows/pr-automation.ymltriggers on[opened, synchronize, reopened, labeled, unlabeled], itsCheck Changesetjob skips label events, and there is noeditedtrigger.⇒ A PR-body edit that adds the
Clause-②:line is never read by the gate until the nextsynchronize— i.e. until someone pushes a commit.Measured live on both PRs of that round:
feat(lint): field-typed equality/membership arm for
filter-preset-comparandon declared date/datetime fields #16347 — the passing run's event payload was the push at ~15:22:05Z, which predates the body edit at 15:22:26Z. CI judged on the carrier alone and had not yet seen the standalone line. (The implementer confirmed the line by running the script offline against the same head with the edited body.)fix(spec): every defineStack refusal carries an ADR-0112 envelope — six STACK_* codes beside STACK_CROSS_REFERENCE_INVALID #16342 — getting CI to read the line required a deliberate
git merge origin/mainafter the body edit, purely to manufacture asynchronize. Run34042090196(job101510576899, 15:23:13Z) then printed, verbatim:— the first measured pass in that round where the gate read the body line with the carrier already correctly cleared.
⭐ Why the two are one card: the failure needs no mistake
Compose them and the failure mode is reached by a seat doing only correct things, in a defensible order:
needs:contract-review— correct carrier discipline;Clause-②:line to the PR body so the declaration outlives the carrier — exactly the remedy [finding]Check Changeset's clause-② level rule is PR-scoped but the fact it judges is package-scoped — a PR that widens package A is refused for grading package Bpatch, where B only received a comment #16361 proposes;⇒ Defect B means the gate never re-reads, so it still sees neither carrier nor line ⇒
LEVEL AXIS: NOT MEASURED; Defect A means that concludessuccess. The level rule — the maintainer ruling of 2026-09-04, decision batch #35, on #15294 — is simply never applied to that PR, and every merge-authority surface shows green.⇒ ⭐ This also means #16361's proposed remedy does not work on its own. Requiring a body
Clause-②:line is defeated by defect B whenever the line is added after the last push. The remedy needs either aneditedtrigger, or the line to be present from the PR's first push.Directions (⛔ none chosen — recording what the measurements narrow to)
For A:
NOT MEASUREDshould not concludesuccess(neutral, or a failure requiring an explicit opt-out); orFor B:
editedtrigger (Clause-②:line belongs in the PR body at creation time, written by the dev opening the PR rather than patched in later by the seat clearing the carrier. That also matches where the declaration comes from — the claim comment — rather than where it was being retrofitted.⛔ No tolerance, no allowlist, no comment-only heuristic — carried over from #16361's body and it applies here too.
Priority reasoning (triage)
p2, notp1, and the capping fact comes from the round's own reviewer: all 69 packages sit in onefixedgroup, with 120 minor / 125 patch pending, so the released bump is set by the highest pending changeset regardless. ⇒ a level axis that goes unjudged on one PR does not, today, reliably ship a widened public surface inside a patch release.Above
p3because the thing that goes unmeasured is a maintainer ruling, the surface that hides it is the one the merge queue reads, and reaching it requires no mistake by anyone.Boundaries
Check Changeset's clause-② level rule is PR-scoped but the fact it judges is package-scoped — a PR that widens package A is refused for grading package Bpatch, where B only received a comment #16361's filer, who states plainly they were taken by running the gate's script offline with--eventpayloads. ⛔ Not re-driven by triage. Re-run before acting — the three-row table in defect A is the whole of defect A and it is one script invocation per row..github/workflows/pr-automation.ymlrather than inheriting it.Related
Check Changeset's clause-② level rule is PR-scoped but the fact it judges is package-scoped — a PR that widens package A is refused for grading package Bpatch, where B only received a comment #16361 — the predicate-scope half (false red). Same gate, same file, opposite direction; ⛔ neither subsumes the other, but they will collide on.github/workflows/pr-automation.yml⇒ schedule in one window.filter-preset-comparandon declared date/datetime fields #16347 — where all of this was measured.https://claude.ai/code/session_01SwJQDFKe8tVit3BXQ9EfR5