ci(release): drop the stable approval gate and run nightlies once a day

TH
1h ago
+40-86

Summary

Every release run spent seconds deciding and minutes queued: Plan executes in ~12s, while recent schedule runs waited 30s–31min for an ubuntu-latest runner. Seven of the eight daily cron runs only reported "shipped today".

  • No stable approval. The v* tag ruleset (creation/update/deletion, org-admin bypass only) already gates stable releases, and Plan still refuses to publish if that ruleset or the npm-publish branch policy weakens. The release environment approval was a second click by the same admin. Drops the approve job and the reviewer check.
  • Fixes Tag nightly, which never ran: a skipped approve skipped every job downstream of publish on nightlies, so no nightly/* tag exists.
  • Nightly once a day (23 1 * * *). Plan waits up to 20 minutes for main's HEAD CI, as tags already did; failed, cancelled, or still-running CI skips that day. Run Release on main to publish one by hand. Removes the same-day npm lookup.
  • Every main commit gets its own CI run. ci.yml keyed its concurrency group by ref, so each main push cancelled the previous commit's run; v0.21.28's Plan failed when the next merge cancelled CI on its tag. Main runs are now grouped by SHA; pull requests still cancel superseded runs. Costs more runner time on busy days.

Docs: CONTRIBUTING.md release channels and one-time setup. 6 files.

Keep the release environment until v0.21.28 ships: its tag predates this change, so any retry on it still runs the approval job. Delete the environment afterwards.

Validation

At e60e96f9c and 8ba6f31d9: pnpm check:affected --run passed; scripts/__tests__/release-plan.test.ts and test/ci/release-workflow.test.ts pass (13 tests). A fresh-context review found the skip wording too narrow (fixed) and a dead test input (fixed). The PR's own Release dry run exercises the workflow.

🤖 Generated with Claude Code