fix(examples): a Kits reload owed for the example kits survives an interrupted load (D329) #17
Reference in New Issue
Block a user
No description provided.
Delete Branch "fix/kits-reload-owed"
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
RunicNPC stage 9e, step 2 (docs/runicnpc/PLAN.md). In the 9d player session on Carbon, the automatic Kits reload after the first load did not take effect, and
s6bosscstayed refused ("no kit 'rnpc_juggernaut'") until Kits was reloaded by hand.Cause, read from the rig's own Carbon log for 2026-10-09 04:49:
c.reload Kitson a one-second timer.examplesWrittenwas already set, so nothing asked for the reload again.It is not a first-boot problem. A fresh Carbon boot, a
c.loadand the file landing on a running server all reloaded Kits correctly. Oxide never shows it: loading RunicNPC makes Oxide recompile and reload Kits itself (// Requires: Kits). Carbon does not do that.The fix (D329, approved by the org lead):
data/RunicNPC/state.jsonaskitsReloadOwedandkitsReloadTries.SettleKitsReloadruns on every load and when Kits comes back.c.reload Kits/oxide.reload Kits) and stops, so a kit Kits never takes cannot cause a reload loop.The API, hooks and data shape are unchanged apart from two new state fields. A
state.jsonfrom before this change reads them as empty.How it was tested
Rust 25797215, Oxide 2.0.7815, Carbon 2.0.262 (all latest). Each case was run on both rigs and each rig was restored afterwards:
refused: -, debt clearedrefused: -(the session's case, now self-healing)Requiresreload already loaded them, so the debt cleared with no extra reloadnode scripts/checkPlugin.jspasses, andcheckPlugin.test.jspasses 24/24.s6.examples.reloadSettled(version 0.7.3). It compiled on the Carbon rig. The fulls6group was not run, because the walk site is pushing profiles to the rigs.Docs: RunicGateway/docs PR for 9e step 2 (D329).
Checklist
AI-assisted contributions (required)
Claude Code (Claude Opus 5.5). 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
The first load writes the example kits into Kits' file and asked for a Kits reload on a one-second timer. A timer dies with its plugin, so a second load of RunicNPC inside that second (the 9d session's, on Carbon) lost the reload, and examplesWritten was already set: the examples stayed refused ("no kit rnpc_juggernaut") until Kits was reloaded by hand. The kits written are now owed a reload in data/RunicNPC/state.json (kitsReloadOwed). SettleKitsReload, on every load and when Kits comes back, clears the debt once Kits knows every kit owed, and otherwise asks for the reload again, at most three times, then warns with the command to run. Oxide never showed it: loading RunicNPC recompiles and reloads Kits there (// Requires: Kits). Carbon does not. Walked on both rigs (Rust 25797215, Oxide 2.0.7815, Carbon 2.0.262): a first install landing on a running server, the interrupted state, and a debt for a kit that never exists (three reloads, the warning, no loop). The harness gains s6.examples.reloadSettled (0.7.3; compiled on the Carbon rig). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY