feat(drill): the staging drill, the week before each forced wipe (stage 9c, D307–D309, D317–D319) #15

Merged
whitlocktech merged 2 commits from feat/stage-9c into edge 2026-10-07 06:45:06 +00:00
Member

What & why

Phase 9c of docs/runicnpc/PLAN.md stage 9: a Gitea job that checks each new Rust staging build in the seven days before the monthly forced wipe, so a RunicNPC fix can ship before the update does. Decisions D307–D309 (docs#324), with D317–D319 from this phase (the companion docs PR).

  • .gitea/workflows/staging-drill.yml is scheduled daily and stops at its first step outside the week before a forced wipe (the first Thursday, D318). A run by hand always goes ahead.
  • tools/drill/static.sh needs no server and takes about a minute. It downloads staging's managed assemblies (DepotDownloader 3.4.0) and Oxide's staging build, then:
    • asks whether Oxide has caught up (tools/fieldlist --oxide-behind);
    • regenerates the swap's field list and compares it with the one the plugin carries;
    • compiles the plugin against them.
  • tools/drill/drill.js has four steps:
    • window: is this the drill week (D318)?
    • gate: one check per manifest of Rust's Linux depot. api.steamcmd.net was a day stale.
    • live: rust-staging runs rnt.run all. When both 6000-map rigs are running, rust-carbon is stopped and started again (D309).
    • report: one issue per build, labelled staging-drill, with the state kept on the drill branch. While Oxide is behind, a build waits up to 3 days without opening an issue (D317).
  • tools/drill/rig-start.sh is the rig's startup. It installs the branch and Oxide's build for it, and refuses to start a mismatched pair.
  • tools/RunicNpcTest.cs 0.7.2: stage 5's five fights look for a field with room for their 280 m line (D319), and s5.fight.spawned names what did not spawn.
  • README: a "staging drill" section and the layout table.

Why Oxide's lag matters (D317)

Oxide ships its own patched Assembly-CSharp.dll, and the plugin compiles only against it: against Rust's own copy, IAISenses is inaccessible. On 2026-10-06, Oxide's staging build was older than Rust's. The rig died at boot on "The referenced script (ItemModFoodVisual) on this Behaviour is missing!".

--oxide-behind counts the members Rust declares that Oxide's patched copy lacks:

Rust Oxide Members behind
public public 0
staging staging 482, then 488

Needs from the org lead

The org secret PTERODACTYL_DRILL_KEY. wtclaude cannot set Actions secrets (Gitea: "user should be the owner"). The key exists, named runicnpc staging drill CI (D309), and its value is in C:\Users\colby\RunicGateway\pterodactyl_drill_api_token (the part after user: ). Until the secret is set, the live half reports "is PTERODACTYL_DRILL_KEY set?".

How it was tested

  • node scripts/checkPlugin.js ok; node --test scripts/checkPlugin.test.js 24/24.
  • Static half, locally:
    • staging: Oxide 482 behind, field list the same, compiles;
    • public: 0 behind, the same, compiles;
    • a planted unknown member fails the compile, and a planted field fails the comparison.
  • Live half, rehearsed on public from this machine with the drill's own key. On the 3500 map: 264 pass, 0 fail, a 4-minute boot, about 15 minutes in all. The 2000 map gave 226/1, and then found no field at all (D319).
  • On the CI runner, run 16, dispatched on this branch with branch: staging:
    • window forced, static half ok: manifest 5029721269705795246, Oxide 488 behind;
    • the live half skipped;
    • "waiting for Oxide (488 behind, day 1 of 3)", and no issue;
    • the drill branch was created and pushed.
  • The wait at three ages, report alone: 1 day still waits, 4 days reports, 17 days starts over.
  • Rigs at the end: rust-staging stopped (3500/1234, 8 GB, on public from the rehearsals; the drill moves it back to staging on its next run). rust-oxide untouched. rust-carbon, which I had stopped for room, started again.

Checklist

  • I have read CONTRIBUTING.md.
  • The change builds and existing tests/checks pass locally.
  • I have added or updated tests/docs where it makes sense.
  • My commits are reasonably scoped with clear messages.

AI-assisted contributions (required)

  • No AI tools were used to produce this contribution.
  • AI tools were used. Tool(s): Claude Code (Claude Opus 5.5). I have reviewed and understand
    every change, and take responsibility for it. AI-authored commits are
    marked with a Co-Authored-By / Assisted-By trailer.

License

  • I agree that my contribution is licensed under this project's 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

## What & why Phase 9c of `docs/runicnpc/PLAN.md` stage 9: a Gitea job that checks each new Rust staging build in the seven days before the monthly forced wipe, so a RunicNPC fix can ship before the update does. Decisions D307–D309 (docs#324), with D317–D319 from this phase (the companion docs PR). - **`.gitea/workflows/staging-drill.yml`** is scheduled daily and stops at its first step outside the week before a forced wipe (the first Thursday, D318). A run by hand always goes ahead. - **`tools/drill/static.sh`** needs no server and takes about a minute. It downloads staging's managed assemblies (DepotDownloader 3.4.0) and Oxide's staging build, then: - asks whether Oxide has caught up (`tools/fieldlist --oxide-behind`); - regenerates the swap's field list and compares it with the one the plugin carries; - compiles the plugin against them. - **`tools/drill/drill.js`** has four steps: - `window`: is this the drill week (D318)? - `gate`: one check per manifest of Rust's Linux depot. `api.steamcmd.net` was a day stale. - `live`: `rust-staging` runs `rnt.run all`. When both 6000-map rigs are running, `rust-carbon` is stopped and started again (D309). - `report`: one issue per build, labelled `staging-drill`, with the state kept on the `drill` branch. While Oxide is behind, a build waits up to 3 days without opening an issue (D317). - **`tools/drill/rig-start.sh`** is the rig's startup. It installs the branch and Oxide's build for it, and refuses to start a mismatched pair. - **`tools/RunicNpcTest.cs` 0.7.2:** stage 5's five fights look for a field with room for their 280 m line (D319), and `s5.fight.spawned` names what did not spawn. - README: a "staging drill" section and the layout table. ### Why Oxide's lag matters (D317) Oxide ships its own patched `Assembly-CSharp.dll`, and the plugin compiles only against it: against Rust's own copy, `IAISenses` is inaccessible. On 2026-10-06, Oxide's staging build was older than Rust's. The rig died at boot on "The referenced script (ItemModFoodVisual) on this Behaviour is missing!". `--oxide-behind` counts the members Rust declares that Oxide's patched copy lacks: | Rust | Oxide | Members behind | |---|---|---| | public | public | 0 | | staging | staging | 482, then 488 | ## Needs from the org lead **The org secret `PTERODACTYL_DRILL_KEY`.** `wtclaude` cannot set Actions secrets (Gitea: "user should be the owner"). The key exists, named `runicnpc staging drill CI (D309)`, and its value is in `C:\Users\colby\RunicGateway\pterodactyl_drill_api_token` (the part after `user: `). Until the secret is set, the live half reports "is PTERODACTYL_DRILL_KEY set?". ## How it was tested - `node scripts/checkPlugin.js` ok; `node --test scripts/checkPlugin.test.js` 24/24. - **Static half, locally:** - staging: Oxide 482 behind, field list the same, compiles; - public: 0 behind, the same, compiles; - a planted unknown member fails the compile, and a planted field fails the comparison. - **Live half,** rehearsed on `public` from this machine with the drill's own key. On the 3500 map: **264 pass, 0 fail**, a 4-minute boot, about 15 minutes in all. The 2000 map gave 226/1, and then found no field at all (D319). - **On the CI runner,** run 16, dispatched on this branch with `branch: staging`: - window forced, static half ok: manifest 5029721269705795246, Oxide 488 behind; - the live half skipped; - "waiting for Oxide (488 behind, day 1 of 3)", and no issue; - the `drill` branch was created and pushed. - The wait at three ages, `report` alone: 1 day still waits, 4 days reports, 17 days starts over. - Rigs at the end: `rust-staging` stopped (3500/1234, 8 GB, on public from the rehearsals; the drill moves it back to staging on its next run). `rust-oxide` untouched. `rust-carbon`, which I had stopped for room, started again. ## Checklist - [x] I have read [CONTRIBUTING.md](CONTRIBUTING.md). - [x] The change builds and existing tests/checks pass locally. - [x] I have added or updated tests/docs where it makes sense. - [x] My commits are reasonably scoped with clear messages. ## AI-assisted contributions (required) - [ ] No AI tools were used to produce this contribution. - [x] AI tools were used. Tool(s): `Claude Code (Claude Opus 5.5)`. I have reviewed and understand every change, and take responsibility for it. AI-authored commits are marked with a `Co-Authored-By` / `Assisted-By` trailer. ## License - [x] I agree that my contribution is licensed under this project's license (**GNU GPL v3.0 or later**), and I have the right to contribute it. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
wtclaude added 2 commits 2026-10-07 06:33:26 +00:00
A Gitea job that checks each new Rust staging build in the seven days before the
monthly forced wipe:

- tools/drill/static.sh: staging's managed assemblies (DepotDownloader) and
  Oxide's staging build; whether Oxide has caught up (fieldlist --oxide-behind),
  the swap's field list compared, and the plugin compiled.
- tools/drill/drill.js: window (D318), gate (one check per depot manifest),
  live (rust-staging runs rnt.run all; rust-carbon is stopped and restarted when
  both 6000-map rigs run, D309) and report (one issue per build, state on the
  drill branch; a build waits up to three days for Oxide, D317).
- tools/drill/rig-start.sh: the rig's startup; installs the branch and Oxide's
  build for it, and refuses to start a mismatched pair.
- RunicNpcTest 0.7.2: stage 5's five fights look for a field with room for their
  280 m line (D319), and the spawn check names what did not spawn.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
fix(drill): a wait from an earlier week starts over; say when a run by hand goes ahead
All checks were successful
PR Checks / plugin-checks (pull_request) Successful in -1m57s
d7ba935302
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
whitlocktech merged commit 2b28575218 into edge 2026-10-07 06:45:06 +00:00
whitlocktech deleted branch feat/stage-9c 2026-10-07 06:45:07 +00:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RunicGateway/runicnpc-rust#15
No description provided.