Skip to content

[finding] check-changeset-no-major 的 enforce 补救散文把一个已声明的 narrowing 说成 widening —— 就在 #19008 刚修好的那行下面一句 #19165

Description

@os-try-charles

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

  1. 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.
  2. 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.
  3. Cost of the honest fix — prose plus pins on the narrowing lane; no behaviour change, no published surface, no changeset.
  4. 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 widening0, Raise the one that actually grew0, 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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions