feat(rust): install the helpers a plugin release ships beside the bridge (D182) #35

Merged
whitlocktech merged 1 commits from feat/rust-plugin-helpers into main 2026-09-27 06:11:20 +00:00
Member

From protocol 13, Rust-Plugins releases the ZoneManager helper RunicGatewayZones.cs beside RunicGateway.cs, and the org lead decided it is installed by default (PLAN_FIXES D181, D182; docs#288). Today read_tarball takes only the bridge, so the helper would be downloaded and dropped.

  • Reading the release: every other .cs the manifest lists in files is read. The release is refused if one is missing, doesn't match its own sha256, or isn't a plain <Name>.cs, because that name is written into a plugins directory. A .cs the manifest doesn't list is ignored, so a release older than helpers has none.
  • install / update: each helper is placed before the bridge, written in place like the bridge (the frameworks reload on a change, not on a rename). One that was deleted or edited is put back. One that a later release stops shipping is removed.
  • Record: each instance gains helpers (path + sha256). Records written before this have no such key and read back as none.
  • doctor: a missing or edited helper is a warning, never a failure, and the row says what the bridge loses without it.
  • uninstall: helpers are removed before the bridge.

Checks: cargo fmt --check, cargo clippy --all-targets -- -D warnings, and cargo test (169 + 9) all pass. New tests cover a release with a helper, an old release with a stray file, a missing helper, a tampered helper, path-like names, name validation, and an old record loading.

Safe to release on its own: it changes nothing for today's releases, which list only the bridge. It starts mattering at the protocol-13 cutover, when a Rust-Plugins release carries the helper.

Tracking: Module-Rust#21.

  • AI-assisted (Claude Code)

🤖 Generated with Claude Code

https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY

From protocol 13, Rust-Plugins releases the ZoneManager helper `RunicGatewayZones.cs` beside `RunicGateway.cs`, and the org lead decided it is installed by default (PLAN_FIXES D181, D182; docs#288). Today `read_tarball` takes only the bridge, so the helper would be downloaded and dropped. - **Reading the release:** every other `.cs` the manifest lists in `files` is read. The release is refused if one is missing, doesn't match its own sha256, or isn't a plain `<Name>.cs`, because that name is written into a plugins directory. A `.cs` the manifest doesn't list is ignored, so a release older than helpers has none. - **install / update:** each helper is placed before the bridge, written in place like the bridge (the frameworks reload on a change, not on a rename). One that was deleted or edited is put back. One that a later release stops shipping is removed. - **Record:** each instance gains `helpers` (path + sha256). Records written before this have no such key and read back as none. - **doctor:** a missing or edited helper is a **warning**, never a failure, and the row says what the bridge loses without it. - **uninstall:** helpers are removed before the bridge. **Checks:** `cargo fmt --check`, `cargo clippy --all-targets -- -D warnings`, and `cargo test` (169 + 9) all pass. New tests cover a release with a helper, an old release with a stray file, a missing helper, a tampered helper, path-like names, name validation, and an old record loading. **Safe to release on its own:** it changes nothing for today's releases, which list only the bridge. It starts mattering at the protocol-13 cutover, when a Rust-Plugins release carries the helper. Tracking: Module-Rust#21. - [x] AI-assisted (Claude Code) 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
wtclaude added 1 commit 2026-09-27 02:47:24 +00:00
feat(rust): install the helpers a plugin release ships beside the bridge (D182)
All checks were successful
PR Checks / rust-gates (pull_request) Successful in 1m37s
9d9ee3344b
Rust-Plugins now releases a ZoneManager helper, RunicGatewayZones.cs, beside
RunicGateway.cs (docs/modules/rust/PLAN_FIXES.md D181, D182), and the org lead
decided it is installed by default. The tarball reader took only the bridge,
so the helper would have been downloaded and dropped.

- plugin::read_tarball reads every other .cs the release's manifest lists in
  `files`, and refuses the release when one is missing, does not match its own
  sha256, or is not a plain `<Name>.cs` (the name is written into a plugins
  directory, so nothing in a tarball may reach outside it). A .cs the manifest
  does not list is ignored, so a release older than helpers has none.
- install/update place each helper before the bridge, in place like the
  bridge (Oxide and Carbon reload on a change, not on a rename), put back one
  that was deleted or edited, and remove one a later release stops shipping.
- The record gains per-instance `helpers` (path + sha256). It is absent from
  every record written before this and reads back as none.
- doctor warns — never fails — on a missing or edited helper and says what
  the bridge loses without it; uninstall removes helpers before the bridge.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
whitlocktech approved these changes 2026-09-27 06:11:10 +00:00
whitlocktech merged commit 331e30710e into main 2026-09-27 06:11:20 +00:00
whitlocktech deleted branch feat/rust-plugin-helpers 2026-09-27 06:11:22 +00:00
Sign in to join this conversation.
No description provided.