ci(cutover): the wipe-day edge → main cutover, once five gates pass (D332) #25
Reference in New Issue
Block a user
No description provided.
Delete Branch "feat/auto-cutover"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
What & why
The wipe-day
edge→maincutover, automated, so the org lead approves no merge on a wipe day. This is D332 in docs/runicnpc/PLAN.md, approved in docs#411.When it runs.
.gitea/workflows/cutover.ymlwakes hourly from the forced-wipe Thursday 17:00 UTC until Sunday 23:00 UTC. It works out the weekend itself (wipeWeekend), so there are no dates and no issue numbers anywhere in it.Five gates, cheapest first:
rust-carbonrestarts withedge's RunicNPC. It must prove it installed the public manifest, thenrnpc.statusmust sayframework=carbon navmesh=ready missing=- added=-.edge's plugin and harness.What it remembers. Gates are kept in
drill.jsonfor one combination of wipe, public manifest andedgecommit; any change runs them all again. A failed Carbon or live attempt waits 3 hours before retrying, the cool-down the org lead approved.The merge. A merge commit (not a squash), so
release.ymlstill sees thefix/featsubjects. It is made withRUNICNPC_TOKENin that one step, and pinned to the commit the gates ran on withhead_commit_id.The issues. The cutover PR lists every
Closes #Nfound in the bodies of PRs merged intoedgesince the last cutover. Those issues close on the merge intomain, and each then gets the release version as a comment.If a gate blocks. One comment a day on the cutover PR. At the deadline it hands back to the org lead.
Safety.
dry_runis exactlyfalse.rust-carbonis started again if the job left it stopped.rust-oxide.The
maincopy. It is only the trigger and the step wiring; every step runsedge's code. A dry dispatch may name another branch withcode_ref. The header states this contract, and a test checks the workflow's outputs against the script's.Other changes.
drill.jsonly gains exports; itsreportalready kept other keys, and now a test proves it. pr-checks runs the new tests.Merge this first, then the one-file
ci:PR intomain, so Thursday's schedule findscutover.jsonedge.How it was tested
node --test tools/drill/cutover.test.js tools/drill/drill.test.js scripts/checkPlugin.test.js: 85 pass, 0 fail. These include tests against a fake Gitea, fake git and a fake panel: the merge body and the moved-head refusal, dry runs writing nothing, the cool-down timing, theedge-commit reset, and the install-record (.acf) parse.node scripts/checkPlugin.js: plugin ok. Both workflows parse as YAML.Closescollection over the PRs merged intoedgereturns [20, 22] (#24's lines; #23's "Refs" is ignored).512efa7, forced, dry; about 50 minutes): every gate refused, for the right reason.edgecarries for November, and gates 2, 3 and 4 each caught that:missing=BasePlayer.timeSinceAiming,BaseEntity.ServerPreProcessed,BaseNetworkable.ignoreNetworkLod.rust-carbon. The build check matched the public manifest before reading the console.rust-carbonwas running before and after.29226ab.Not verifiable before Thursday: the pass path (it needs Rust's wipe update), and the real merge (
head_commit_idand the token's merge rights) against Gitea 1.24. If anything there fails, the workflow comments on the cutover PR and hands back at the deadline, so the worst case is today's manual merge.Checklist
AI-assisted contributions (required)
Claude Code (Claude Opus 5.5, with Sonnet implementer, reviewer and test-runner agents). I have reviewed and understandevery change, and take responsibility for it. AI-authored commits are
marked with a
Co-Authored-By/Assisted-Bytrailer.License
(GNU GPL v3.0 or later), and I have the right to contribute it.
🤖 Generated with Claude Code
https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY