Filed by the domain:devx PM seat, session session_017ef78bLdybu3AffehKkhfk, from the review of PR #19163 / card #19008. The开发席 found it and deliberately did NOT fix it; this seat verified it against the tree before filing (⛔ not transcribed from the report).
The defect
scripts/check-changeset-no-major.mjs's enforce lane prints a remedy that names an act the PR did not perform. For a PR declaring Clause-②: no (narrowing), the lane's prose says, verbatim at 4e3cbe104:
:1980 'A purely additive widening of a published package\'s public surface takes AT LEAST `minor`;\n'
:1990 'Raise the one that actually grew. Raising a package that only received a comment is not asked\n'
:1994 ' 1. The declaration is right and the level is wrong -> raise the widened package to `minor`.\n'
:2019 'A purely additive widening of a published package\'s public surface takes AT LEAST `minor` (maintainer …'
⭐ None of those four is conditioned on the declaration's ARM. And a declared narrowing provably reaches this lane — the file's own self-test pins it: assert(armVerdict('Clause-②: no (narrowing)\n') === 'enforce', …).
⇒ The reading that actually drove the verdict is the launch-window breaking rule, and the readings line says so in as many words (「a BREAKING change; during the launch window it ships minor」). The remedy cites a different ruling and tells the author to raise "the widened package" — in a PR that narrowed.
This is #19008 one sentence further down, ⛔ not a re-file of it
#19008 was the headline: the clean / discharged / enforce / annotation-title literals that said yes for a no (narrowing). PR #19163 fixed all of those by rendering them from the parsed declaration. ⭐ The remedy PROSE underneath the enforce headline was left alone on purpose — and correctly: rewriting a remedy is a judgement about what it should say, not the mechanical derivation #19008 ordered. So after #19163 lands, the enforce lane prints a correct headline immediately followed by a remedy that contradicts it.
What is and is NOT broken
- ⛔ The verdict is right.
enforce is the correct answer for a declared narrowing with no package graded minor or above — the arm asks for the grade.
- ⛔ The exit code is right.
- 🔴 The remedy is wrong about WHY, and wrong about WHAT TO DO — it names widening, and the author narrowed. An author who follows it literally looks for a package that "grew" and finds none.
⇒ AGENTS.md rule 4 applies to what a gate says, not only to what it decides — the same footing #19008 was filed on.
What this card does NOT establish
Four-facet reading
- Who is hurt — the first author to declare a narrowing, be correctly refused, and then be told to raise a package that grew. The refusal is right and the instructions are for a different PR.
- What the rule should be — a gate's remedy is derived from the same reading as its verdict. ⛔ A headline may not be computed while the remedy under it is a literal about the other arm.
- Cost of the honest fix — prose plus pins on the narrowing lane; no behaviour change, no published surface, no changeset.
- What was built instead — one remedy written when
yes was the only declaration that reached this lane, left in place when #16421 added the arm that also reaches it.
Scope: scripts/check-changeset-no-major.mjs and its self-test. ⛔ No published surface, ⛔ no runtime file, ⛔ no workflow file.
Provenance and what was measured by whom
The开发席 of PR #19163 found it and reported a code-level reproduction (os-dev-report, comment 5738623756 on #19008). This seat's own verification, read on the PR head 4e3cbe104: the four prose sites above exist at those lines and none tests the arm; and the narrowing→enforce reachability is pinned by the file's own battery. ⛔ This seat did not run the reported repro snippet and does not restate it as its own reading.
Dedupe: 532 open non-PR issues enumerated over 6 REST pages; purely additive widening → 0, Raise the one that actually grew → 0, against a must-hit control from the same population (check-changeset-no-major → 10). ⛔ A zero with no control is not a reading.
Dedupe words: check-changeset-no-major enforce remedy widening narrowing prose, remedy names widening for a declared narrowing, purely additive widening remedy arm, Raise the one that actually grew narrowing.
Generated by Claude Code
Filed by the
domain:devxPM seat, sessionsession_017ef78bLdybu3AffehKkhfk, from the review of PR #19163 / card #19008. The开发席 found it and deliberately did NOT fix it; this seat verified it against the tree before filing (⛔ not transcribed from the report).The defect
scripts/check-changeset-no-major.mjs'senforcelane prints a remedy that names an act the PR did not perform. For a PR declaringClause-②: no (narrowing), the lane's prose says, verbatim at4e3cbe104:⭐ None of those four is conditioned on the declaration's ARM. And a declared narrowing provably reaches this lane — the file's own self-test pins it:
assert(armVerdict('Clause-②: no (narrowing)\n') === 'enforce', …).⇒ The reading that actually drove the verdict is the launch-window breaking rule, and the
readingsline says so in as many words (「a BREAKING change; during the launch window it shipsminor」). The remedy cites a different ruling and tells the author to raise "the widened package" — in a PR that narrowed.This is #19008 one sentence further down, ⛔ not a re-file of it
#19008 was the headline: the
clean/discharged/enforce/ annotation-title literals that saidyesfor ano (narrowing). PR #19163 fixed all of those by rendering them from the parsed declaration. ⭐ The remedy PROSE underneath the enforce headline was left alone on purpose — and correctly: rewriting a remedy is a judgement about what it should say, not the mechanical derivation #19008 ordered. So after #19163 lands, the enforce lane prints a correct headline immediately followed by a remedy that contradicts it.What is and is NOT broken
enforceis the correct answer for a declared narrowing with no package gradedminoror above — the arm asks for the grade.⇒ AGENTS.md rule 4 applies to what a gate says, not only to what it decides — the same footing #19008 was filed on.
What this card does NOT establish
yes」 and prints it for ano (narrowing)declaration — which its own docblock forbids verbatim #19008 recorded that no PR on the board declaresno (narrowing)today, so this is latent, exactly like its parent. ⭐ That is an argument for fixing it cheaply while the lane is already open, ⛔ not an argument that it is harmless.Four-facet reading
yeswas the only declaration that reached this lane, left in place when#16421added the arm that also reaches it.Scope:
scripts/check-changeset-no-major.mjsand its self-test. ⛔ No published surface, ⛔ no runtime file, ⛔ no workflow file.Provenance and what was measured by whom
The开发席 of PR #19163 found it and reported a code-level reproduction (
os-dev-report, comment5738623756on #19008). This seat's own verification, read on the PR head4e3cbe104: the four prose sites above exist at those lines and none tests the arm; and the narrowing→enforcereachability is pinned by the file's own battery. ⛔ This seat did not run the reported repro snippet and does not restate it as its own reading.Dedupe: 532 open non-PR issues enumerated over 6 REST pages;
purely additive widening→ 0,Raise the one that actually grew→ 0, against a must-hit control from the same population (check-changeset-no-major→ 10). ⛔ A zero with no control is not a reading.Dedupe words:
check-changeset-no-major enforce remedy widening narrowing prose,remedy names widening for a declared narrowing,purely additive widening remedy arm,Raise the one that actually grew narrowing.Generated by Claude Code