fix(drill): staging 26341433's swap fields, a harness that finishes, a drill rig that starts fresh (#20, #22) #23

Merged
whitlocktech merged 4 commits from fix/staging-drill-20 into edge 2026-11-01 02:18:22 -06:00
Member

What & why

The staging drill failed on Rust staging 26341433 (#20) and then on 26344826 (#22). This PR makes the drill trustworthy again and carries the swap's new field list. It does not fix the three fight checks that still fail on staging. Those are the next step, and both issues stay open for them.

Plugin: the swap's field list (D232) gains BasePlayer.timeSinceAiming, BaseEntity.ServerPreProcessed and BaseNetworkable.ignoreNetworkLod, so there are 58 fields instead of 55. The fix lands on edge now and goes to main at the forced wipe on Thu 2026-11-05, after Rust's public update. Until then, a public server boots with a "fields this Rust no longer has" warning.

Harness 0.7.4 (tools/RunicNpcTest.cs):

  • Place puts its spots on the navmesh, searching up to 15 m. The set checks print RunicNPC's refusal text (run 49: "4.4 m from the navmesh").
  • A failed place.spawned ends its group cleanly. Run 47 read each[0] from an empty list there and died silently.
  • Any group that throws now becomes a <group>.exception FAIL line, and the run goes on to # done all.

Drill (tools/drill/drill.js):

  • Fresh data: RunicNPC's data files are deleted before boot. Kits' file is replaced with one holding only the harness's hidden rnhrevolver kit. RunicNPC then writes its example kits at this Rust's durabilities (run 47's fullCondition failure was a stale kit file). The first attempt deleted Kits' file and reloaded Kits after boot through the panel's command endpoint. That reload never happened (run 48: no compile job, so every test profile was refused). The add-after-boot is kept as a fallback, now sent through the console websocket, and it reports a finding if Kits doesn't load again.
  • Stall limit: the wait ends after 5 minutes without a new harness line, with a 45-minute cap. When the harness doesn't finish, the tail of latest.log goes into the issue.
  • Errors from this run only: Oxide error lines are counted from the drill's own start. Run 49 reported run 48's lines.
  • Tests: tools/drill/drill.test.js covers the pure parts and runs in pr-checks.yml.

README.md is updated with the field count and how the drill starts. The plan note is in RunicGateway/docs, docs/runicnpc-staging-drill-20.

Refs #20, #22. Stale example kits on a real server are tracked in #21.

How it was tested

  • node --check tools/drill/drill.js passes.
  • node --test tools/drill/drill.test.js: 9 pass. It also passes from a clean checkout without tools/rigs.json.
  • node scripts/checkPlugin.js passes: "plugin ok — API 6, 24 API call(s), 12 hook(s) declared, requires Kits". node --test scripts/checkPlugin.test.js: 24 pass.
  • The staging drill was dispatched on this branch with force against Rust staging:
    • Run 48 (26344826): static half fields same, npc=58/58, compile ok. The harness ran to # done all with the exception guard working. 73 checks failed because of the kit problem described above.
    • Run 49 (26344826, at 4fb935d): static half clean. 250 pass and 5 fail, with no stall. fullCondition passes now.
    • The remaining failures are place.set.each (fixed afterwards in cf3997b, not re-run yet) plus s5.fight.shootBack, s5.kit.heal and s5.fight.leash. Those three are left for the next step.
  • Not verified:
    • cf3997b's two changes (the 15 m search and the error-line window) have not been run live.
    • There has been no Carbon boot on the new list. That waits for Thursday's public Rust.

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; Sonnet 5.5 subagents for research and implementation). 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 The staging drill failed on Rust staging 26341433 (#20) and then on 26344826 (#22). This PR makes the drill trustworthy again and carries the swap's new field list. It does **not** fix the three fight checks that still fail on staging. Those are the next step, and both issues stay open for them. **Plugin:** the swap's field list (D232) gains `BasePlayer.timeSinceAiming`, `BaseEntity.ServerPreProcessed` and `BaseNetworkable.ignoreNetworkLod`, so there are 58 fields instead of 55. The fix lands on `edge` now and goes to `main` at the forced wipe on Thu 2026-11-05, after Rust's public update. Until then, a public server boots with a "fields this Rust no longer has" warning. **Harness 0.7.4** (`tools/RunicNpcTest.cs`): - `Place` puts its spots on the navmesh, searching up to 15 m. The set checks print RunicNPC's refusal text (run 49: "4.4 m from the navmesh"). - A failed `place.spawned` ends its group cleanly. Run 47 read `each[0]` from an empty list there and died silently. - Any group that throws now becomes a `<group>.exception` FAIL line, and the run goes on to `# done all`. **Drill** (`tools/drill/drill.js`): - **Fresh data:** RunicNPC's data files are deleted before boot. Kits' file is replaced with one holding only the harness's hidden `rnhrevolver` kit. RunicNPC then writes its example kits at this Rust's durabilities (run 47's `fullCondition` failure was a stale kit file). The first attempt deleted Kits' file and reloaded Kits after boot through the panel's command endpoint. That reload never happened (run 48: no compile job, so every test profile was refused). The add-after-boot is kept as a fallback, now sent through the console websocket, and it reports a finding if Kits doesn't load again. - **Stall limit:** the wait ends after 5 minutes without a new harness line, with a 45-minute cap. When the harness doesn't finish, the tail of `latest.log` goes into the issue. - **Errors from this run only:** Oxide error lines are counted from the drill's own start. Run 49 reported run 48's lines. - **Tests:** `tools/drill/drill.test.js` covers the pure parts and runs in `pr-checks.yml`. `README.md` is updated with the field count and how the drill starts. The plan note is in RunicGateway/docs, `docs/runicnpc-staging-drill-20`. Refs #20, #22. Stale example kits on a real server are tracked in #21. ## How it was tested - `node --check tools/drill/drill.js` passes. - `node --test tools/drill/drill.test.js`: 9 pass. It also passes from a clean checkout without `tools/rigs.json`. - `node scripts/checkPlugin.js` passes: "plugin ok — API 6, 24 API call(s), 12 hook(s) declared, requires Kits". `node --test scripts/checkPlugin.test.js`: 24 pass. - The staging drill was dispatched on this branch with `force` against Rust staging: - **Run 48** (26344826): static half `fields same`, `npc=58/58`, compile ok. The harness ran to `# done all` with the exception guard working. 73 checks failed because of the kit problem described above. - **Run 49** (26344826, at 4fb935d): static half clean. 250 pass and 5 fail, with no stall. `fullCondition` passes now. - The remaining failures are `place.set.each` (fixed afterwards in cf3997b, not re-run yet) plus `s5.fight.shootBack`, `s5.kit.heal` and `s5.fight.leash`. Those three are left for the next step. - **Not verified:** - cf3997b's two changes (the 15 m search and the error-line window) have not been run live. - There has been no Carbon boot on the new list. That waits for Thursday's public Rust. ## 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; Sonnet 5.5 subagents for research and implementation)`. 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 4 commits 2026-11-01 02:16:57 -06:00
The staging drill's run 47 failed on Rust staging 26341433:

- Rust added BasePlayer.timeSinceAiming, BaseEntity.ServerPreProcessed and
  BaseNetworkable.ignoreNetworkLod to the swap's field list (D232): 55 -> 58.
  On edge now; main at the forced wipe of 2026-11-05.
- Harness 0.7.4: place.set.each was refused and the refusal was thrown
  away; place.spawned failed; reading each[0] of an empty list then killed
  the coroutine, so the drill waited 45 minutes for a run that had stopped
  after 10. Place puts its spots on the navmesh, the set checks carry the
  refusal, a failed place.spawned ends the group, and any group that throws
  is a <group>.exception FAIL line and the run goes on.
- drill.js: rust-staging boots from empty Kits and RunicNPC data, so the
  write-once example kits match this Rust (s6.examples.fullCondition); the
  wait ends after 5 minutes without a new harness line; latest.log's tail
  goes into the issue when the harness did not finish. drill.test.js
  covers the stall logic.

Refs #20, #21

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
Run 48 deleted Kits' file for a fresh start, and the harness's
rnhrevolver kit, added after boot with `oxide.reload Kits` through the
panel's command endpoint, never reached Kits: no reload or compile job
followed, and every test profile was refused for want of the kit.

The drill now replaces kits_data.json with one holding only that kit.
Kits reads it at boot; RunicNPC's first load adds its example kits
beside it (it skips kits already there) and settles its own Kits
reload (D329). The add-after-boot stays as a fallback, now through the
console's websocket, and is a finding when Kits does not load again.

Refs #20, #22

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
fix(drill): place spots found up to 15 m from the navmesh; count only this run's Oxide errors (#22)
All checks were successful
PR Checks / plugin-checks (pull_request) Successful in 1m28s
cf3997bbce
Run 49: place.set.each was refused "4.4 m from the navmesh", because
OnMesh searched 3 m and returned the unsnapped point; Place now searches
15 m. The drill reported run 48's four error lines again: oxideErrors
read the whole day's Oxide log, and now reads only what was added after
the drill started the rig.

Refs #20, #22

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
whitlocktech merged commit a43e5c299f into edge 2026-11-01 02:18:22 -06:00
whitlocktech deleted branch fix/staging-drill-20 2026-11-01 02:18:23 -06:00
Sign in to join this conversation.
No description provided.