fix(rust): the last fixes' small ones (W3 W6 W7/W11 W8 W10 W13-W18) #55

Merged
whitlocktech merged 1 commits from fix/last-fixes-small into edge 2026-10-21 13:45:48 -05:00
Member

What & why

Stage 2 of docs/modules/rust/PLAN_LAST_FIXES.md (docs#366): Module-Rust's small fixes. Two items follow the org lead's answers of 2026-10-21: W3 moves to the bridge, and only its module half is here. W17 changes the sync state only.

# Fix
W7, W11 An "is it loaded" refusal is confirmed live before it is given. The new server/liveStatus.js asks the sidecar once (boot.refreshOne, exactly what a poll tick does), then reads the stored status again. Only a "no" that survives that is a refusal. A "yes" is not asked again: the plugin still refuses at the run. Each server is asked at most once per 5 s (so a ten-step dry run asks once), and a step waits at most 3 s for the answer, to stay inside its 15 s budgetMs. Used by Economics (the step and the staff page), Backpacks, Dangerous Treasures (with the console probe), Guarded Crate, RaidableBases, ZoneDomes, TruePVE and RunicNPC.
W3 (module half) A world.call answered with reason already-out succeeds as called: 0, noting "a Travelling Vendor is already out on Oxide rig, and the game runs one at a time; nothing new was called". The plugin's check comes in stage 3 (Rust-Plugins). Until then, nothing sends this reason.
W6 "A locked crate dropped by a Chinook is being hacked" (the feed line).
W8 A RaidableBases profile write's audit row names RaidableBases, not @data. pluginOf moved into the config model and reads past the @data/ prefix.
W10 The backpack sizes picker lists each size once, naming every server that offers it ("48 slots — Main, PvE").
W13 A RaidableBases difficulty, profile or base on two servers that describe it differently shows each one ("Hard Bases · Hard — Oxide rig; Hard Bases · Expert — Carbon rig").
W14 Each RaidableBases note after the first starts its own sentence ("…once the base opens. Not the run's: …").
W15 A staff deposit refused at Economics' limit answers 409, like the low-balance refusal. The OpenAPI 409 description says so.
W16 A pay step's failedNote explains only the reasons that happened (at-limit alone reads "at-limit: the balance is at Economics' limit").
W17 The permission sync state gains waitingToLand, the report's notLanded entries for a Steam id. The Permissions page shows "in sync · 1 waits for their player to join" instead of plain "in sync". The run log is unchanged: core has no way for a module to add to a finished run's log, and hello does not say which framework a server runs (the org lead's call).
W18 Guarded Crate's "kept" note drops the "30 minutes as Guarded Crate ships", because the report names each event but not its time limit.

The docs (PLAN_LAST_FIXES status, PROTOCOL's already-out) come in stage 5, as the plan says.

How it was tested

  • npm test (server): 704/704. check:imports, check:bundle, check:swagger and check:engagement are clean. swagger-fragment.json is regenerated, and ci/bundle.json ships liveStatus.js.
  • Client: npm run build, check:externals, npm test 99/99.
  • New tests: liveStatus.test.js covers a refusal asked again and acted on fresh; a pass never re-asked; a "no" that stays a "no"; a failed ask; ten refusals asking once; the 3 s cap; and a backpack step refused on a stale "not installed" that passes once the server says Backpacks is back. There are also tests for W3, W8, W10, W13, W14, W15, W16 and W17. The seven older test files whose refusals now reach the live ask stub it, so the suite opens no sockets.
  • Not walked live. I copied this branch into the walk site's module copy, but restarting the walk core was not permitted from this session, so the running walk site still has stage 1 loaded. The plan's stage 2 asks for no walk-site check. W7/W11 (a step dry run right after loading Backpacks by hand) is worth a look in the final walk.

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.

🤖 Generated with Claude Code

https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY

## What & why Stage 2 of [`docs/modules/rust/PLAN_LAST_FIXES.md`](https://gitea.whitlocktech.com/RunicGateway/docs/src/branch/main/modules/rust/PLAN_LAST_FIXES.md) (docs#366): Module-Rust's small fixes. Two items follow the org lead's answers of 2026-10-21: **W3** moves to the bridge, and only its module half is here. **W17** changes the sync state only. | # | Fix | |---|---| | **W7, W11** | An "is it loaded" refusal is **confirmed live before it is given**. The new `server/liveStatus.js` asks the sidecar once (`boot.refreshOne`, exactly what a poll tick does), then reads the stored status again. Only a "no" that survives that is a refusal. A "yes" is not asked again: the plugin still refuses at the run. Each server is asked at most once per 5 s (so a ten-step dry run asks once), and a step waits at most 3 s for the answer, to stay inside its 15 s `budgetMs`. Used by Economics (the step and the staff page), Backpacks, Dangerous Treasures (with the console probe), Guarded Crate, RaidableBases, ZoneDomes, TruePVE and RunicNPC. | | W3 (module half) | A `world.call` answered with reason `already-out` succeeds as `called: 0`, noting "a Travelling Vendor is already out on Oxide rig, and the game runs one at a time; nothing new was called". The plugin's check comes in stage 3 (Rust-Plugins). Until then, nothing sends this reason. | | W6 | "A locked crate dropped by a Chinook is being hacked" (the feed line). | | W8 | A RaidableBases profile write's audit row names `RaidableBases`, not `@data`. `pluginOf` moved into the config model and reads past the `@data/` prefix. | | W10 | The backpack sizes picker lists each size once, naming every server that offers it ("48 slots — Main, PvE"). | | W13 | A RaidableBases difficulty, profile or base on two servers that describe it differently shows each one ("Hard Bases · Hard — Oxide rig; Hard Bases · Expert — Carbon rig"). | | W14 | Each RaidableBases note after the first starts its own sentence ("…once the base opens. Not the run's: …"). | | W15 | A staff deposit refused at Economics' limit answers **409**, like the low-balance refusal. The OpenAPI 409 description says so. | | W16 | A pay step's `failedNote` explains only the reasons that happened (`at-limit` alone reads "at-limit: the balance is at Economics' limit"). | | W17 | The permission sync state gains `waitingToLand`, the report's `notLanded` entries for a Steam id. The Permissions page shows "in sync · 1 waits for their player to join" instead of plain "in sync". The run log is unchanged: core has no way for a module to add to a finished run's log, and hello does not say which framework a server runs (the org lead's call). | | W18 | Guarded Crate's "kept" note drops the "30 minutes as Guarded Crate ships", because the report names each event but not its time limit. | The docs (PLAN_LAST_FIXES status, PROTOCOL's `already-out`) come in stage 5, as the plan says. ## How it was tested - `npm test` (server): 704/704. `check:imports`, `check:bundle`, `check:swagger` and `check:engagement` are clean. `swagger-fragment.json` is regenerated, and `ci/bundle.json` ships `liveStatus.js`. - Client: `npm run build`, `check:externals`, `npm test` 99/99. - New tests: `liveStatus.test.js` covers a refusal asked again and acted on fresh; a pass never re-asked; a "no" that stays a "no"; a failed ask; ten refusals asking once; the 3 s cap; and a backpack step refused on a stale "not installed" that passes once the server says Backpacks is back. There are also tests for W3, W8, W10, W13, W14, W15, W16 and W17. The seven older test files whose refusals now reach the live ask stub it, so the suite opens no sockets. - **Not walked live.** I copied this branch into the walk site's module copy, but restarting the walk core was not permitted from this session, so the running walk site still has stage 1 loaded. The plan's stage 2 asks for no walk-site check. W7/W11 (a step dry run right after loading Backpacks by hand) is worth a look in the final walk. ## 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. 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
wtclaude added 1 commit 2026-10-21 07:43:55 -05:00
fix(rust): the last fixes' small ones (W3 W6 W7/W11 W8 W10 W13-W18)
All checks were successful
PR Checks / client-build (pull_request) Successful in 24s
PR Checks / server-tests (pull_request) Successful in 32s
PR Checks / frozen-manifest (pull_request) Successful in 44s
3aa142bf06
Stage 2 of PLAN_LAST_FIXES (docs#366).

- W7/W11: an "is it loaded" refusal is confirmed live before it is given.
  New liveStatus.js asks the sidecar once (boot.refreshOne, as a poll tick
  would), at most once per server per 5 s and waiting at most 3 s, then
  reads the stored status again. Used by Economics (step and staff page),
  Backpacks, Dangerous Treasures, Guarded Crate, RaidableBases, ZoneDomes,
  TruePVE and RunicNPC.
- W3: a world call answered `already-out` (the bridge half comes in stage
  3) succeeds as called 0, saying a Travelling Vendor is already out.
- W6: "A locked crate dropped by a Chinook is being hacked."
- W8: a RaidableBases profile's audit row names RaidableBases, not "@data".
- W10: the backpack sizes picker lists each size once, naming its servers.
- W13: a RaidableBases name both servers describe differently shows each
  server's own description.
- W14: each RaidableBases note after the first starts its own sentence.
- W15: a staff deposit refused at Economics' limit answers 409.
- W16: a payment's failedNote explains only the reasons that happened.
- W17: the sync state counts player grants that did not land
  (waitingToLand), and the Permissions page says "in sync · 1 waits for
  their player to join" instead of plain "in sync".
- W18: Guarded Crate's kept note drops the "30 minutes" it could not know.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
whitlocktech merged commit 7304d68d0a into edge 2026-10-21 13:45:48 -05:00
whitlocktech deleted branch fix/last-fixes-small 2026-10-21 13:45:49 -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/Module-Rust#55
No description provided.