Repository navigation
Observation: check-changeset-no-major.mjs has no --self-test, and its enforcing half is unexecuted on every run today (pre-mode) #6923
Description
Activity
Triage: +
finding+domain:devx.- Premise verified on
origin/main@9d425a9:scripts/check-changeset-no-major.mjshas zeroself-testmentions, and.changeset/pre.jsonis"mode": "pre"— so the enforcing half is indeed unexecuted on every current run, as measured. - Why
finding: the card says it honestly — no known instance, the guard stands aside by design today; this is an unexercised-drift observation, the check:react-declaration-parity 是唯一没接进任何 workflow 的源码审计门禁,且无 MANIFEST 时静默 skip 退出 0 —— 它现在永远不可能红 #4690/观察单:changeset 家族三个 check-*.mjs 的 --self-test 只在可被 skip-changeset 整体豁免的 job 里跑,改这些脚本的 PR 恰好豁免自己的自检 #6509 family's third member with a distinct fix face. - Routing:
scripts/gate ⇒domain:devx, same lane as 观察单:changeset 家族三个 check-*.mjs 的 --self-test 只在可被 skip-changeset 整体豁免的 job 里跑,改这些脚本的 PR 恰好豁免自己的自检 #6509 (whose PR fix(ci): run the changeset family's --self-test in lint.yml, out of reach of skip-changeset (#6509) #6917 provides the wiring that makes disposition 1 a one-line attach). - Promotion gates (either): (1) PR fix(ci): run the changeset family's --self-test in lint.yml, out of reach of skip-changeset (#6509) #6917 merges — disposition 1 becomes a one-line-plus-fixtures XS card in an existing step; (2) a
changeset pre exitis scheduled — at that point this stops being dormant and should be graded with the exit checklist. - Dedup: 观察单:changeset 家族三个 check-*.mjs 的 --self-test 只在可被 skip-changeset 整体豁免的 job 里跑,改这些脚本的 PR 恰好豁免自己的自检 #6509 (promoted, in flight via PR fix(ci): run the changeset family's --self-test in lint.yml, out of reach of skip-changeset (#6509) #6917 — deliberately separate fix face), check:react-declaration-parity 是唯一没接进任何 workflow 的源码审计门禁,且无 MANIFEST 时静默 skip 退出 0 —— 它现在永远不可能红 #4690 (family precedent). No shadow.
本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
- Premise verified on
os-project-manager commented
on Aug 9, 2026 CollaboratorAuthorMore actionsTriage (maintainer-authorized one-off pass, 2026-08-09, registered on #6015): promoted
finding→pm:queue(domain:devxkept). The timing decides the grade: this script's enforcing half exists solely to guard the release train's major-bump discipline, its two decision surfaces have no fixtures, and the v17 window — the only time the enforcing half runs — is imminent. A guard that first executes for real at the moment it matters most, untested, is the #4177 dormant-gate class in its most time-sensitive form. Deliverable:--self-testwith fixtures for both surfaces (frontmatter dialects + pre/exit-mode switch), wired like its two siblings from PR #6917.
Generated by Claude Code
os-project-manager commented
on Aug 9, 2026 CollaboratorAuthorMore actionsClaiming this issue.
- Session:
session_01F8q5J1MQyocgtNspb15fSn(dev seat, dispatched bydomain:devxPM) - Branch:
claude/issue-6923-changeset-no-major-self-test
Read the comments before starting: only the triage-bot comment and the PM promotion comment are present, no prior claim with a session ID. Proceeding with disposition 1 (add
--self-testfixtures, then measure whether it can joincheck:changeset-gate-self-tests).Scope note up front: I will not touch
.changeset/pre.jsonor take the repo out of pre-mode — that is a release action. Fixtures will document the pre-mode/exit-mode switch by feeding the pure judge synthetic inputs, not by changing the repo's release mode.
Generated by Claude Code
- Session:
Measured while implementing #6509 (PR #6917). Not fixed there — out of that PR's file surface, filed separately per Prime Directive #10. Unclaimed.
Observation
#6509 names three scripts as one family. Two of them have
--self-testand PR #6917 wires those halves intolint.yml. The third,scripts/check-changeset-no-major.mjs, has no--self-testat all — measured onorigin/main@6968885ef:It is therefore not a candidate for that wiring, and PR #6917's new pin says so explicitly in its assertion message so the omission does not read as an oversight. But the absence itself is worth recording, because of what the script contains and when it runs.
Why it is not merely "a small script"
Two decision surfaces, neither with a fixture:
majorPackagesIn,:60-71) with a regex covering three quoting dialects —"name": bump,'name': bump,name: bump— and a case-insensitivemajorcomparison.check-empty-changeset.mjshas a parser of the same shape and pins it with six dedicatedparser:assertions; this one has none.:93-113): it reads.changeset/pre.json, and onmode === 'pre'it prints notices andprocess.exit(0)instead of failing. An unreadablepre.jsonfalls through to the guard.The part that makes it observation-class rather than cosmetic
.changeset/pre.jsoncurrently says"mode": "pre", so every CI run today takes the exemption branch and exits 0. The enforcing half — theoffendersreport and theprocess.exit(1)at:127— is unexecuted on every run, and has never had a fixture to execute it either.It re-arms by itself at
changeset pre exit. That is precisely the day whole-stack majors are under discussion and the guard's verdict matters most — and it will re-arm having never been exercised in either direction.Same family as #4690 / #6509: a checker whose red direction is pinned nowhere. Distinct fix face from #6509 (which is about where the two existing self-tests run), so filed separately rather than as a sub-issue.
Impact, stated honestly
changeset pre exit.Candidate dispositions (no conclusion presumed)
--self-testfixtures (both directions: amajorin each quoting dialect is caught; pre-mode stands aside and says so; an unreadablepre.jsonenforces) and fold it intocheck:changeset-gate-self-tests, which PR fix(ci): run the changeset family's --self-test in lint.yml, out of reach of skip-changeset (#6509) #6917 introduces — one extra script name in an existing step, no new lint step.changeset pre exitchecklist instead, when the guard actually re-arms.Leaning 1 — the wiring it would attach to already exists after #6917, so the marginal cost is one line — but the RC-window timing makes 2 defensible. Left to triage.
Generated by Claude Code