Repository navigation
Description
Path: none | instrument (changeset gate prose) | 北极星「仪器为车队服务」
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.
enforceis the correct answer for a declared narrowing with no package gradedminoror 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
- ⛔ No remedy prescribed, and the shapes are not equivalent. Arm-aware remedy prose, one added sentence for the narrowing case, or a re-word that is true of both arms — they trade differently against the file's 「never trade a red for a warning」 rule and against how much prose a red should carry.
- ⛔ Not measured: whether any PR has actually hit this. [finding] check-changeset-no-major's clean headline hardcodes 「declares clause-②
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
- 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
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.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
Activity