feat(rust): RunicNPC required in the Rust bundle, the banner, edge → main (runicnpc 9e step 3, merge 2 of 3) #40

Merged
whitlocktech merged 4 commits from edge into main 2026-10-09 07:21:43 +00:00
Member

What & why

Merge 2 of 3, together with Rust-Plugins' and Rust-Link's cutovers. RunicNPC becomes required in a Rust bundle (D310: the compose refuses one without it, install/update always place it, doctor fails without it), and the popup look row writing the recommended PopupNotifications banner (D327, D328).

  • Releases v0.7.0 (from v0.6.0). main releases on every push, and this edge was recreated from main in 9b for exactly this.
  • The new compose-bundles.sh runs from main, so it is what composes the protocol 13 bundle after the other two release.

The order (docs/runicnpc/PLAN.md, 9e step 3)

  1. runicnpc-rust edge → main — after runicnpc-rust#18 (the feat!:) has merged into edge. Releases v1.0.0.
  2. Rust-Plugins, Rust-Link and installer edge → main, together — after I have checked v1.0.0 (checksums, manifest api 6). The bridge and the sidecar both move protocol 12 → 13, and the bundle's Gate 1 refuses a pair that disagrees, so one without the other leaves a bundle that cannot compose.
  3. I check those three releases and that v2/rust/current.json on installer's bundles branch moves to protocol 13 with RunicNPC 1.0.0 in it (dispatching bundle.yml if a compose run lost the race).
  4. Module-Rust edge → main — last, once a server can actually get RunicNPC from a bundle.

Please leave edge standing (untick "delete branch" on merge): later work lands there.

After the merges: the installer's RunicNPC path and the egg's banner from the real bundle (the row the walk left for this step), then the docs PR recording step 3.

How it was tested

Each change on edge came in by its own PR with its own checks and rig walk (stages 4–9, the 9d player session, 9e steps 1–2). edge is 0 commits behind main, so this merges clean; this PR's checks are the run against the merged tree.

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). 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 **Merge 2 of 3, together with Rust-Plugins' and Rust-Link's cutovers.** RunicNPC becomes required in a Rust bundle (D310: the compose refuses one without it, `install`/`update` always place it, `doctor` fails without it), and the `popup look` row writing the recommended PopupNotifications banner (D327, D328). - **Releases v0.7.0** (from v0.6.0). `main` releases on every push, and this `edge` was recreated from `main` in 9b for exactly this. - The new `compose-bundles.sh` runs from `main`, so it is what composes the protocol 13 bundle after the other two release. ## The order (docs/runicnpc/PLAN.md, 9e step 3) 1. **runicnpc-rust** `edge` → `main` — after runicnpc-rust#18 (the `feat!:`) has merged into `edge`. Releases **v1.0.0**. 2. **Rust-Plugins**, **Rust-Link** and **installer** `edge` → `main`, **together** — after I have checked v1.0.0 (checksums, manifest `api` 6). The bridge and the sidecar both move protocol 12 → 13, and the bundle's Gate 1 refuses a pair that disagrees, so one without the other leaves a bundle that cannot compose. 3. I check those three releases and that `v2/rust/current.json` on `installer`'s `bundles` branch moves to protocol 13 with RunicNPC 1.0.0 in it (dispatching `bundle.yml` if a compose run lost the race). 4. **Module-Rust** `edge` → `main` — last, once a server can actually get RunicNPC from a bundle. **Please leave `edge` standing** (untick "delete branch" on merge): later work lands there. After the merges: the installer's RunicNPC path and the egg's banner from the real bundle (the row the walk left for this step), then the docs PR recording step 3. ## How it was tested Each change on `edge` came in by its own PR with its own checks and rig walk (stages 4–9, the 9d player session, 9e steps 1–2). `edge` is 0 commits behind `main`, so this merges clean; this PR's checks are the run against the merged tree. ## 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)`. 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-10-09 07:15:50 +00:00
feat(rust): RunicNPC is required in the Rust bundle (runicnpc stage 9, D310)
All checks were successful
PR Checks / rust-gates (pull_request) Successful in 2m13s
04bab67778
- install/update refuse a Rust bundle that carries no RunicNPC, before anything
  is written, and say how to get one that does.
- doctor fails when RunicNPC is missing or was never installed; a file edited
  by hand stays a warning, since it still loads.
- compose-bundles.sh composes no Rust bundle without a RunicNPC release that
  answers the bridge's runicnpc_api (the published one stays), and fails a
  bridge that declares none; every Rust bundle now has `npc`.
- A RunicNPC API-mismatch message lost its line continuation; restored.

The bundle type still parses a bundle without `npc`, so doctor and an old pin
can name it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
Reviewed-on: #38
feat(rust): write the recommended PopupNotifications banner (runicnpc 9e, D327, D328)
All checks were successful
PR Checks / rust-gates (pull_request) Successful in 2m5s
0db3a8ac73
install and update write PopupNotifications.json into the framework's config
directory, as a banner across the top of the screen, only where the file is
missing or every setting is still PopupNotifications 0.2.1's own default (the
Version aside, numbers compared as numbers). A config with any setting
changed, or one that does not parse, is kept whole. The file carries the
plugin's Version, because PopupNotifications resets a config without one to
its defaults on load. The plan prints a "popup look" row naming the case.

Run against two scratch roots (a temporary local bypass of the RunicNPC check,
since no published bundle carries RunicNPC yet): Oxide with no config got the
banner; Carbon at the rig's defaults got the walk's banner file exactly; on
update a hand-changed config and an existing banner were both kept.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
Reviewed-on: #39
whitlocktech approved these changes 2026-10-09 07:21:35 +00:00
whitlocktech merged commit f1bbd46cbd into main 2026-10-09 07:21:43 +00:00
whitlocktech deleted branch edge 2026-10-09 07:21:43 +00:00
Sign in to join this conversation.
No description provided.