fix(rust): protocol 13 step 2 — expiry, plugin loads, the loading hold, NPC names, the link fleet (F2 F5 F6 F7 F8 F13 F14) #22

Merged
whitlocktech merged 2 commits from fix/protocol-13-step2 into edge 2026-09-27 06:10:03 +00:00
Member

The module's half of PLAN_FIXES §6 step 2. Decisions D181–D185 are in docs#288.

Needs website#209 (MODULE_API 1.11.0, ctx.events.expired). coreApi moves to ^1.11.0, so this module won't load on a 1.10.0 core.

  • F13/F14 (D170, D183): a world.expired frame is handed to core as the resource the zone step ledgered (world, <serverId>:<id>), and core records it expired.
  • F8 (D184): plugin.loaded / plugin.unloaded mark the permission sync dirty when the plugin's permission list isn't empty, so the next 30 s tick pushes.
  • Catalogue: plugin.loaded, plugin.unloaded, world.expired and lease.expired are staff kinds. The two expiries had never been classified (default deny kept them off public pages anyway). The test now covers every event kind the plugin emits through protocol 13.
  • F7: permission and title pushes hold while the stored hello says worldReady: false. A human's "sync now" isn't held. A failed or refused sync logs at warn.
  • F2 (D185): the killfeed names NPC attackers: families (Scientist, Bandit guard, Bradley APC…), or the prefab without its variant digits (wolf2 → Wolf).
  • F5/F6: servers that minted a code in the last 6 minutes are asked first, then the rest, each group in parallel. "Unsure" only when a minting server is unreachable. confirmLink keeps its 12 s timeout on purpose: going under the sidecar's 10 s RPC timeout could give up on a reply that has already spent the code.
  • D182: the admin server list carries the ZoneManager helper's state, and the servers page says what a missing or failed helper costs.

Checks: server 400/400 and client 58/58. check:imports, check:bundle, check:swagger (regenerated) and check:engagement (regenerated: coreApi) pass, as do the client build and check:externals. New test/planFixesStep2.test.js; F5/F6 cases are in links.test.js and F2 cases in format.test.js.

Not walked on a site yet: the walk core on :3270 still runs Module-Rust edge on a 1.10.0 core. The rig side is walked; see the Rust-Plugins PR.

Tracking: #21.

  • AI-assisted (Claude Code)

🤖 Generated with Claude Code

https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY

The module's half of PLAN_FIXES §6 step 2. Decisions D181–D185 are in docs#288. **Needs website#209** (MODULE_API 1.11.0, `ctx.events.expired`). `coreApi` moves to `^1.11.0`, so this module won't load on a 1.10.0 core. - **F13/F14 (D170, D183):** a `world.expired` frame is handed to core as the resource the zone step ledgered (`world`, `<serverId>:<id>`), and core records it `expired`. - **F8 (D184):** `plugin.loaded` / `plugin.unloaded` mark the permission sync dirty when the plugin's permission list isn't empty, so the next 30 s tick pushes. - **Catalogue:** `plugin.loaded`, `plugin.unloaded`, `world.expired` and `lease.expired` are staff kinds. The two expiries had never been classified (default deny kept them off public pages anyway). The test now covers every event kind the plugin emits through protocol 13. - **F7:** permission and title pushes hold while the stored hello says `worldReady: false`. A human's "sync now" isn't held. A failed or refused sync logs at warn. - **F2 (D185):** the killfeed names NPC attackers: families (Scientist, Bandit guard, Bradley APC…), or the prefab without its variant digits (`wolf2` → Wolf). - **F5/F6:** servers that minted a code in the last 6 minutes are asked first, then the rest, each group in parallel. "Unsure" only when a minting server is unreachable. `confirmLink` keeps its 12 s timeout on purpose: going under the sidecar's 10 s RPC timeout could give up on a reply that has already spent the code. - **D182:** the admin server list carries the ZoneManager helper's state, and the servers page says what a missing or failed helper costs. **Checks:** server 400/400 and client 58/58. check:imports, check:bundle, check:swagger (regenerated) and check:engagement (regenerated: `coreApi`) pass, as do the client build and check:externals. New `test/planFixesStep2.test.js`; F5/F6 cases are in `links.test.js` and F2 cases in `format.test.js`. **Not walked on a site yet:** the walk core on :3270 still runs Module-Rust `edge` on a 1.10.0 core. The rig side is walked; see the Rust-Plugins PR. Tracking: #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:08 +00:00
fix(rust): protocol 13 step 2 — expiry, plugin loads, the loading hold, NPC names, the link fleet (F2 F5 F6 F7 F8 F13 F14)
Some checks failed
PR Checks / client-build (pull_request) Successful in 18s
PR Checks / frozen-manifest (pull_request) Failing after 56s
PR Checks / server-tests (pull_request) Successful in 7m45s
b10f11b057
The module's half of PLAN_FIXES §6 step 2 (decisions D181-D185, docs#288).

- F13/F14 (D170, D183): `world.expired`, recognisable from protocol 13 by its
  `what`, is handed to core as the resource the zone step ledgered
  (`world`, `<serverId>:<id>`) through ctx.events.expired, which records it
  `expired`. coreApi moves to ^1.11.0 (website#209).
- F8 (D184): `plugin.loaded` / `plugin.unloaded` mark the permission sync dirty
  when the plugin added or removed permissions, so an unresolved grant lands on
  the next tick instead of the fifteen-minute audit.
- Catalogue: plugin.loaded/unloaded, world.expired and lease.expired are staff
  kinds. The last two were never classified (default deny kept them off public
  pages); the test now covers every event kind through protocol 13.
- F7: permission and title pushes hold while the stored hello says
  `worldReady: false` (a human's "sync now" does not); a failed or refused
  permission sync now logs at warn.
- F2 (D185): the killfeed names an NPC attacker — a family (Scientist, Bandit
  guard, Bradley APC…) or the prefab without its variant digits (wolf2 → Wolf).
- F5/F6: a link code is asked of the servers that minted one in the last six
  minutes first, then of the rest, each group in parallel; "unsure" only when
  one of the minting servers is unreachable.
- D182: the admin server list carries the ZoneManager helper's state from the
  hello, and the servers page says what a missing or failed helper costs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
wtclaude added 1 commit 2026-09-27 03:08:45 +00:00
ci(rust): pin frozen-manifest to website#209 while coreApi is ^1.11.0
All checks were successful
PR Checks / client-build (pull_request) Successful in 22s
PR Checks / server-tests (pull_request) Successful in 23s
PR Checks / frozen-manifest (pull_request) Successful in 39s
478c52e7a1
The job cloned a MODULE_API 1.10.0 main and the loader refused the module
("needs core API ^1.11.0, this core is 1.10.0"), so it added no routes and
failed by construction. Pinned to #209's head (cc1f49a), where the job's own
steps pass: core alone 280 routes up to date, with this module 49 routes all
documented. Re-pin to #209's main merge sha once it lands.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
whitlocktech merged commit 31b99fab61 into edge 2026-09-27 06:10:03 +00:00
whitlocktech deleted branch fix/protocol-13-step2 2026-09-27 06:10:05 +00:00
Sign in to join this conversation.
No Reviewers
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: RunicGateway/Module-Rust#22
No description provided.