Skip to content

changeset-release.yml: drop the duplicate pnpm test, and stop concurrency discarding release runs (95 of 200 never executed) #5404

Description

@os-support-ai

Blocked-by: #5403

Ruled by the maintainer on 2026-08-20 (#5393, verbatim 「接受你的所有建议,现在开始处理。」). Item 3 of 5, and last on purpose — see the ordering note below. Both halves are in changeset-release.yml, so one card, one PR.

Half 1 — the duplicate test run

Run tests (pnpm test, unsharded) is 34 minutes of a ~35-minute job; everything else combined is ~90 seconds (install 7 s, build 35 s, publish 12 s). It re-tests a commit that is already on main — failing it cannot keep anything out, it only blocks publishing after the fact.

Half 2 — runs are being discarded, not queued

concurrency: ${{ github.workflow }}-${{ github.ref }} with cancel-in-progress unset. I originally described this as serialising with a ~35-minute wait. #5395 refuted the magnitude and found something worse: GitHub holds only one pending run per group and discards the rest — 95 of 200 release runs never executed at all. Median wait for those that did run is 5 min 08 s (22% of wall clock), not ~35 min.

So the defect is not latency. Release runs are being thrown away, on a workflow whose last step publishes to npm.

Do not fix this with cancel-in-progress: true. The final step is changeset publish; cancelling mid-publish is worse than any wait. The requirement is that no merge loses its release run — find the shape that achieves that (a queue that actually queues, or a design where a dropped run is provably harmless because the next run subsumes it). If the second is true, prove it rather than asserting it: show that a discarded run's changesets are still consumed by the following run.

⚠️ Half 1 makes half 2 much cheaper — a ~2-minute job contends far less than a 35-minute one — but ⛔ it does not make half 2 unnecessary. A dropped run is a dropped publish at any duration.

⚠️ Why this card is last, and what must be true before it lands

I originally proposed removing the release-side tests first, arguing the CI push lane still ran the whole suite as a backstop. That argument was false: #5402 shows Test (coverage) has failed 100% of the time since 2026-08-16.

So this card may only land once both are true, and the implementer must verify both on origin/main before opening the PR, not take this card's word for it:

  1. ci.ymlTest (coverage) has failed 100% of the time since 2026-08-16 — one test times out under v8 coverage, and Codecov has received nothing since #5402 is fixed — the push lane's suite actually passes.
  2. Shard Test (coverage) 4 ways and stop the Codecov upload being skipped by its implicit success() #5403 has landed — the push lane is sharded and its upload no longer fails silently.

If either is not true when you pick this up, stop and report rather than proceeding — removing this test run while the push lane is dark would leave main with no working post-merge validation at all.

⚠️ Related context the implementer should read but not act on: the merge queue currently runs no CI (#4986 — a repository-settings matter, ⛔ no PR can fix it), and the release PR itself runs no CI (#5397). Neither blocks this card; both mean there is less validation upstream than the workflow's design assumes.

⛔ Constraints

  • changeset:publish behaviour is not in scope and must not change. ⛔ No AI-executed release.
  • ⛔ Do not touch changeset:versionfix(release): carry QUICK_REFERENCE's Current Release block in changeset:version #5396 just wired the QUICK_REFERENCE sync into it, and a pin in sync-quick-reference-release.test.ts asserts this workflow's version: input. If your change trips that pin, that is the pin working; do not weaken it.
  • Report elapsed from the jobs' own started_at/completed_at.

Evidence and method: #5395. Ruling: #5393.

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions