A workflow that merges edge into main on the forced-wipe weekend with no approval: hourly from Thursday 17:00 UTC to Sunday 23:00 UTC, through five gates in order, then a merge commit made with RUNICNPC_TOKEN (that step only) so release.yml cuts the release. 1. Rust's public build changed: dated the wipe day and naming the same depot manifest as staging (the staging build was promoted to live). 2. Oxide's public release caught up, RunicNPC compiles, the swap's fields match. 3. A Carbon boot on public Rust: rust-carbon proves the public manifest is installed, and rnpc.status says framework carbon, navmesh ready, missing=- added=-. 4. The drill's live half on public Rust with edge's plugin and harness. 5. PR checks, run fresh on the cutover PR's head just before the merge. Gates are kept in drill.json for one (wipe, public manifest, edge commit); any change runs them again. A failed Carbon or live attempt cools down for 3 hours. The merge is pinned to the commit the gates ran on. The cutover PR lists every `Closes #N` from the PRs merged into edge since the last cutover, so those issues close on the merge; afterwards each gets the release version. One comment a day while a gate blocks; at the deadline it hands back. The copy on main is only the trigger and step wiring; every step runs edge's code (a dry dispatch may name another branch, code_ref). Dispatches are dry unless dry_run is exactly false. rust-carbon is started again if the job left it stopped. drill.js only gains exports; its report already kept other keys, now tested. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
69 lines
2.7 KiB
YAML
69 lines
2.7 KiB
YAML
# Gate every pull request into `main` and `edge`.
|
|
#
|
|
# RunicNPC cannot be compiled by CI: it is deployed as SOURCE and built by Oxide
|
|
# or Carbon against game assemblies that exist only on a Rust server, so a build
|
|
# job is not available at any price.
|
|
#
|
|
# What is available is a reader, and the mistakes worth reading for are the ones
|
|
# both frameworks make silent. Hooks, chat commands and `Call` targets bind by
|
|
# name through reflection, with no compile-time check and no warning when a name
|
|
# matches nothing. `scripts/checkPlugin.js` asks, dependency-free:
|
|
#
|
|
# • every hook is listed in `ExpectedHooks`, so `rnpc.status` can report it;
|
|
# • every hook is void unless answering is written down with a reason;
|
|
# • every chat command has the signature the frameworks bind;
|
|
# • every `RunicNpc_*` API call is one Oxide's `Call` can reach;
|
|
# • `ApiVersion`, `// Requires:` and `[Info]` agree with plugin.toml, which is
|
|
# what the release copies into the manifest the installer reads.
|
|
#
|
|
# Its own test suite breaks it every way it claims to catch — including the
|
|
# failure that would make every other case meaningless, a parser that silently
|
|
# matches nothing.
|
|
#
|
|
# Enforcement (one-time, in the Gitea UI):
|
|
# Repository Settings → Branches → Branch Protection (rules for `main`, `edge`)
|
|
# • Enable Status Check
|
|
# • Status check patterns: PR Checks / *
|
|
# Gitea only lists a context after it has reported once; the glob matches
|
|
# without the dropdown and keeps matching as jobs are added.
|
|
|
|
name: PR Checks
|
|
|
|
on:
|
|
pull_request:
|
|
branches: [main, edge]
|
|
|
|
concurrency:
|
|
group: pr-checks-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
plugin-checks:
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 10
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- uses: actions/setup-node@v4
|
|
with:
|
|
node-version: 20
|
|
|
|
# No install step: the checks are dependency-free on purpose, which is also
|
|
# how a contributor runs them.
|
|
- name: Check the plugin's hooks, API and declarations
|
|
run: node scripts/checkPlugin.js
|
|
|
|
# Named individually rather than `node --test scripts/`: directory mode is
|
|
# not portable across the Node versions this project runs on.
|
|
- name: Test the checker itself
|
|
run: node --test scripts/checkPlugin.test.js
|
|
|
|
# The staging drill's pure parts (tools/drill/drill.js): its stall limit and fresh-data list.
|
|
- name: Test the staging drill
|
|
run: node --test tools/drill/drill.test.js
|
|
|
|
# The wipe-day cutover's pure parts (tools/drill/cutover.js, D332): the weekend, the five gates'
|
|
# verdicts, the issues the PR closes and what the hourly run does next.
|
|
- name: Test the wipe-day cutover
|
|
run: node --test tools/drill/cutover.test.js
|