diff --git a/runicnpc/PLAN.md b/runicnpc/PLAN.md index 5c6ff32..3c21b40 100644 --- a/runicnpc/PLAN.md +++ b/runicnpc/PLAN.md @@ -1739,6 +1739,43 @@ D318 (the drill week, the org lead's change) and D319 (the map). changing its seed for half an hour, which spoiled one round of the map measurements; they were found in the panel's activity log and measured again cleanly. +**9c, the first drill that failed (2026-11-01, runicnpc-rust#20).** The drill's run 47, on Rust staging build +26341433 (manifest 6731949433558131698), failed in five checks, and the harness then stopped. Three causes are +found below; two checks are not explained yet (the last item). + +- **Rust added three fields to the swap's list (D232):** `BasePlayer.timeSinceAiming`, `BaseEntity.ServerPreProcessed` + and `BaseNetworkable.ignoreNetworkLod`, 55 fields now 58. They are on `edge` and ship to `main` at the forced + wipe on Thu 2026-11-05, after Rust's public update, so a server on public Rust never names fields it does not + have. The release is checked first by a Carbon boot on the updated Rust reporting `added=-`. The brain's list + is unchanged. +- **The harness stopped without saying so (fixed in 0.7.4).** `place.set.each` was refused (the harness threw the + refusal away, so why is not known; RunicNPC refuses a roamer's spot off the navmesh, D219, and this was the one + spot in the harness not put on it), `place.spawned` failed, and the next line read the first of zero NPCs and + threw, which ended the coroutine silently: no `# done all`, so the drill waited its full 45 minutes. The run + itself had taken 10 minutes. Now `Place` puts its spots on the navmesh as every other group does, + `place.set.each` and `place.set.group` carry the refusal text, and a `place.spawned` failure takes back what + was set and ends the group. Any group that throws is now a FAIL line naming it + (`.exception`), and the run goes on to `# done all`. +- **The drill's rig kept data a fresh server would not have.** `s6.examples.fullCondition` failed on kits that an + older build had written: RunicNPC writes its example kits once, into Kits' own file (D284), and the drill + removed only the harness's files before a run. It now also deletes RunicNPC's `profiles`, `placements`, + `routes` and `state` files and replaces Kits' `kits_data.json` with one holding only the harness's hidden + `rnhrevolver` kit, so `rust-staging` boots like a new server: Kits reads that kit at boot, and RunicNPC's first + load adds the examples beside it at this Rust's durabilities (D324) and settles the Kits reload (D329). Files + only, never a directory the panel would create (ยง1.5). The first try deleted Kits' file and added the kit + after boot with `oxide.reload Kits` through the panel's command endpoint; that reload never happened (run 48, + #22: no compile job, every test profile refused for want of the kit). The add-after-boot stays as a fallback, + now through the console's websocket, and is a finding when Kits does not load again. +- **The drill stops waiting when the harness has.** If the harness's file gets no new line for 5 minutes, the + finding reads "The harness stopped after `` (no output for 5 minutes; N pass, M fail so far)." The 45 + minutes stays as the cap for a harness that is still writing. Whenever the harness did not finish, the tail of + the rig's `latest.log` goes into the issue under "Console, last lines", where an exception in a coroutine shows. +- **Not explained yet:** `s5.fight.shootBack` (a neutral `t_roam` shot by a one-sidedly hostile profile did not + answer in 70 s, D268) and `s5.kit.heal` (healer at health 75 with both syringes unused). Neither left a line in + Oxide's log, and `s5.fight.factions` and `s5.fight.marked` passed, so the hurt path works. They are re-run on the + fixed harness with fresh data before anything in the plugin changes for them. That example kits written once + keep an older Rust's item condition on a real server is runicnpc-rust#21. + **9d. The player walk (D312).** Both rigs are updated first (Rust, Oxide, Carbon) and their builds stated. One checklist, published as a page, for one session per rig. I prepare the rigs, the walk site and a linked test account; the org lead plays, and I watch the logs and record each row. It gathers every in-game check deferred so