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
finding: check-changeset-no-major --self-test goes red repo-wide after a release exits pre mode — its control requires major-declaring changesets AND a pre.json that no longer exists #8654
Filed by the domain:devx execution PM seat (#6023), observation only. Unassigned and unlabeled for triage. ⛔ No remedy is proposed and none was attempted — every route available to this seat is barred (see the last section).
The measurement
Two independent PRs, each on a fresh merge ref recomputed against current main, fail check:changeset-gate-self-tests → check-changeset-no-major --self-test with the identical two failures:
PR
head
result
8650
00df74f3
2 failures, below
8647
7a9fa79a
2 failures, identical
✗ check-changeset-no-major --self-test — 2 failure(s)
• control (#7005): the real .changeset stock must actually contain major-declaring
changesets, or the assertion below is green for the wrong reason
• reader: the real .changeset/pre.json is readable and parses
The two diffs have nothing in common — one is content/docs/** only, the other is root scripts/ plus tests — and neither touches .changeset/, the changeset gates, or anything they read.
The delta that isolates the cause
Before the branch updates, the same self-test reported three failures; the third was reader: the real .changeset directory is non-empty — got 0 entries.
.changeset/ was measured empty (only README.md + config.json) at ~08:0xZ and back to two entries at 08:31Z. On the fresh refs the empty-directory failure is gone, leaving exactly the two above. So:
the empty-directory half was a release-window transient and self-healed when changesets began landing again;
the remaining two do not self-heal.
⚠️ Method note worth recording: rerun_failed_jobs on the original run reproduced all three failures, because a re-run replays the job against the merge ref as it stood when the PR was last pushed. It is not a re-measurement against current main — only a branch update recomputes that. A stale-ref replay reading as "the condition persists" is the trap here.
Mechanism
The self-test asserts two properties of the real repository, not of a fixture:
the real .changeset/pre.json is readable and parses.
pre.json exists only while changesets is in pre-release mode. A release that exits pre mode removes it, and versioning consumes the pending major changesets. Both properties therefore become false together at the end of a release, and stay false until pre mode is re-entered and a major-declaring changeset lands.
⇒ This is a repo-wide red on every PR whose CI runs in that window, and unlike the empty-directory case it does not clear on its own.
The tension a fix has to resolve (⛔ not resolved here)
The obvious remedy — point the self-test at a synthetic fixture instead of the real stock — re-opens exactly what #7005 closed. That control exists because an assertion over synthetic data alone can pass for the wrong reason. Any route that removes the real-stock reading has to explain how it keeps that guarantee.
Routes are listed without a recommendation, because weighing them is a judgement about the gate's contract:
make the real-stock control conditional on pre mode being active, so the gate asserts it only where it is meaningful;
keep the real-stock reading but treat its absence as skipped rather than failed, with the skip reported loudly enough that a permanently-skipping control gets noticed;
keep current behaviour and accept a known post-release window in which nothing merges.
⚠️ Whoever takes this should decide what the control is for: catching a synthetic-only green, or asserting the repo is mid-cycle. Those are different guarantees and the current code conflates them.
Why this seat did not act
⛔ Editing the gate is a gate change — maintainer floor, and this seat does not weaken or reshape gates to unblock its own work.
⛔ Adding a major-declaring changeset to either PR would fabricate a release note and force a major version bump; both are correctly skip-changeset (docs-only; root tooling and tests) and neither publishes anything.
Both PRs are ACCEPTed on substance and remain draft and unarmed — ⛔ deliberately not armed into a required check that cannot currently pass, since auto-merge on a blocked PR waits silently and surfaces no reason.
Filed by the
domain:devxexecution PM seat (#6023), observation only. Unassigned and unlabeled for triage. ⛔ No remedy is proposed and none was attempted — every route available to this seat is barred (see the last section).The measurement
Two independent PRs, each on a fresh merge ref recomputed against current
main, failcheck:changeset-gate-self-tests→check-changeset-no-major --self-testwith the identical two failures:00df74f37a9fa79aThe two diffs have nothing in common — one is
content/docs/**only, the other is rootscripts/plus tests — and neither touches.changeset/, the changeset gates, or anything they read.The delta that isolates the cause
Before the branch updates, the same self-test reported three failures; the third was
reader: the real .changeset directory is non-empty — got 0 entries..changeset/was measured empty (onlyREADME.md+config.json) at ~08:0xZ and back to two entries at 08:31Z. On the fresh refs the empty-directory failure is gone, leaving exactly the two above. So:rerun_failed_jobson the original run reproduced all three failures, because a re-run replays the job against the merge ref as it stood when the PR was last pushed. It is not a re-measurement against currentmain— only a branch update recomputes that. A stale-ref replay reading as "the condition persists" is the trap here.Mechanism
The self-test asserts two properties of the real repository, not of a fixture:
.changesetstock contains major-declaring changesets — the positive control added bycheck-changeset-no-major.mjsjudges the whole.changesetstock, not the PR's diff — atchangeset pre exitit reds every unrelated PR (171 files measured) #7005 so the assertion beneath it cannot be green for the wrong reason;.changeset/pre.jsonis readable and parses.pre.jsonexists only while changesets is in pre-release mode. A release that exits pre mode removes it, and versioning consumes the pending major changesets. Both properties therefore become false together at the end of a release, and stay false until pre mode is re-entered and a major-declaring changeset lands.⇒ This is a repo-wide red on every PR whose CI runs in that window, and unlike the empty-directory case it does not clear on its own.
The tension a fix has to resolve (⛔ not resolved here)
The obvious remedy — point the self-test at a synthetic fixture instead of the real stock — re-opens exactly what #7005 closed. That control exists because an assertion over synthetic data alone can pass for the wrong reason. Any route that removes the real-stock reading has to explain how it keeps that guarantee.
Routes are listed without a recommendation, because weighing them is a judgement about the gate's contract:
Why this seat did not act
skip-changeset(docs-only; root tooling and tests) and neither publishes anything.changeset pre enteris a release action, permanently barred for AI seats (release workflow: publish pushes tags + npm but its version commit never reaches main — twice now (rc.3 c6a52d3, rc.4 a10cbc77); landing the commit must be part of the publish lane #6170).Both PRs are ACCEPTed on substance and remain draft and unarmed — ⛔ deliberately not armed into a required check that cannot currently pass, since auto-merge on a blocked PR waits silently and surfaces no reason.