fix(bridge): protocol 13 — a configuration reload that works on Carbon (W1-W5) #17

Merged
whitlocktech merged 1 commits from fix/protocol-13-carbon-reload into edge 2026-09-26 20:23:58 -05:00
Member

The fixes from step 1's rig walk (PLAN_FIXES.md §6, D180; spec docs PR alongside, PROTOCOL.md §19.1). All five are in RunicGateway.cs, and no third-party plugin is touched. There is no wire change; this is still protocol 13, unreleased, on edge.

What the walk found

Framework Finding Fix
W3 Carbon Carbon's Oxide-compatible ReloadPlugin isn't a reload. The first save unloaded Kits and it never came back; the second did nothing. Carbon reloads with c.reload on the server console (ConsoleSystem.Run). Oxide keeps ReloadPlugin, falling back to oxide.reload.
W4 Carbon The log evidence never fired: carbon/logs has no *.txt, and the log is Carbon.Core.log. That file is chosen by name. "Newest" would pick the Harmony log.
W5 Carbon A config that LoadConfig can't read gets [Kits] Failed ILoadConfig (…), then "Loaded plugin Kits" anyway (broken), and the save settled as applied. OnPluginLoaded is only noted now. The job settles on the first log read a poll after it. failed iloadconfig is added to the words.
W2 Oxide The reason shown was "Previous version of plugin failed to load", not the exception. could not initialize is added, so the outcome quotes Could not initialize plugin 'Kits v4.4.9' (JsonReaderException: …).
W1 Oxide The idle compiler shut down with our reload queued ("Timed out waiting for plugin to be compiled: ZoneManager"). That waited 30 s and then applied, reloaded:false. On that line the reload is asked for once more. A second give-up settles at once by what is loaded.

rg.config now prints log=<file it follows>.

Walked on both rigs (protocol-13 sidecar + this plugin, core :3270)

  • Oxide: step 2 (a cold compile, 3078 ms) is applied in 9 s. 2b is UTF-8 on disk, and ZoneManager re-saved it intact. 4 rolls back in about 3 s with the exception as the reason, restored: true, and the file byte-identical.

  • Carbon: 2 is applied and reloaded in 4 s. 2b is UTF-8 on disk. 4 rolls back with Carbon's Failed ILoadConfig line as the reason, restored: true, the file byte-identical, and Kits reloaded clean.

  • W1: a rig-only probe (since deleted) wrote Oxide's exact line during a pending save. The plugin logged "asking for the reload once more" and the retry landed applied. The second give-up path isn't walked: a real stall can't be forced, because Oxide caches compiled plugins. That path reuses the ceiling's settle code.

  • node scripts/checkPlugin.js passes.

  • AI-assisted: Claude Code (Claude Opus 5.5)

🤖 Generated with Claude Code

https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY

The fixes from step 1's rig walk (`PLAN_FIXES.md` §6, **D180**; spec docs PR alongside, PROTOCOL.md §19.1). All five are in `RunicGateway.cs`, and no third-party plugin is touched. There is no wire change; this is still protocol 13, unreleased, on `edge`. ### What the walk found | | Framework | Finding | Fix | |---|---|---|---| | **W3** | Carbon | Carbon's Oxide-compatible `ReloadPlugin` isn't a reload. The first save unloaded Kits and it never came back; the second did nothing. | Carbon reloads with **`c.reload` on the server console** (`ConsoleSystem.Run`). Oxide keeps `ReloadPlugin`, falling back to `oxide.reload`. | | **W4** | Carbon | The log evidence never fired: `carbon/logs` has no `*.txt`, and the log is `Carbon.Core.log`. | That file is chosen by name. "Newest" would pick the Harmony log. | | **W5** | Carbon | A config that `LoadConfig` can't read gets `[Kits] Failed ILoadConfig (…)`, then **"Loaded plugin Kits"** anyway (broken), and the save settled as `applied`. | `OnPluginLoaded` is only noted now. The job settles on the first log read a poll after it. `failed iloadconfig` is added to the words. | | **W2** | Oxide | The reason shown was "Previous version of plugin failed to load", not the exception. | `could not initialize` is added, so the outcome quotes `Could not initialize plugin 'Kits v4.4.9' (JsonReaderException: …)`. | | **W1** | Oxide | The idle compiler shut down with our reload queued ("Timed out waiting for plugin to be compiled: ZoneManager"). That waited 30 s and then `applied, reloaded:false`. | On that line the reload is asked for once more. A second give-up settles at once by what is loaded. | `rg.config` now prints `log=<file it follows>`. ### Walked on both rigs (protocol-13 sidecar + this plugin, core :3270) - **Oxide:** step 2 (a cold compile, 3078 ms) is applied in 9 s. **2b** is UTF-8 on disk, and ZoneManager re-saved it intact. **4** rolls back in about 3 s with the exception as the reason, `restored: true`, and the file byte-identical. - **Carbon:** **2** is applied and reloaded in 4 s. **2b** is UTF-8 on disk. **4** rolls back with Carbon's `Failed ILoadConfig` line as the reason, `restored: true`, the file byte-identical, and Kits reloaded clean. - **W1:** a rig-only probe (since deleted) wrote Oxide's exact line during a pending save. The plugin logged "asking for the reload once more" and the retry landed `applied`. **The second give-up path isn't walked**: a real stall can't be forced, because Oxide caches compiled plugins. That path reuses the ceiling's settle code. - `node scripts/checkPlugin.js` passes. - [x] AI-assisted: Claude Code (Claude Opus 5.5) 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
wtclaude added 1 commit 2026-09-26 20:21:58 -05:00
fix(bridge): protocol 13 — a configuration reload that works on Carbon (W1-W5)
All checks were successful
PR Checks / plugin-checks (pull_request) Successful in 9s
616f4fbca8
The step-1 rig walk (PLAYER_WALK configuration 2, 2b, 4 on both rigs) found:

- W3: Carbon's Oxide-compatible ReloadPlugin is not a reload. One call unloaded
  Kits and never compiled it again; the next did nothing. Carbon now reloads
  with `c.reload` on the server console (ConsoleSystem.Run), as an operator
  would at the panel. Oxide keeps ReloadPlugin, falling back to `oxide.reload`.
- W4: Carbon's log is carbon/logs/Carbon.Core.log, with no *.txt in the
  directory at all, so the log evidence never fired on Carbon. Chosen by name.
- W5: Carbon loads a plugin whose LoadConfig threw and raises Loaded in the
  same instant. OnPluginLoaded is now noted, and the job settles on the first
  log read a poll after it. Carbon's "Failed ILoadConfig" is on the word list.
- W2: Oxide's "Could not initialize plugin 'Kits v4.4.9' (JsonReaderException:
  ...)" is on the word list, so the outcome quotes the exception.
- W1: Oxide's idle compiler shutdown drops a queued reload with "Timed out
  waiting for plugin to be compiled: X". The reload is asked for once more;
  a second give-up settles at once by what is loaded.

rg.config prints the log file it follows (log=).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
whitlocktech merged commit fc7dccb90b into edge 2026-09-26 20:23:58 -05:00
whitlocktech deleted branch fix/protocol-13-carbon-reload 2026-09-26 20:23:59 -05:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RunicGateway/Rust-Plugins#17
No description provided.