docs(rust): stage 3 built — TruePVE in the zone step (PROTOCOL §20.6, PLAN_REDESIGNS §14.3.16)

- rust-link/PROTOCOL.md §20.6: hello's integrations.truePve, world.zone's
  truePve (exactly one of exclude and ruleset, all or nothing, the
  refusals), the unmapping on every erase path with truepve.json for
  while TruePVE is away, rg.world's two fields, and the website's two
  params. The §15 command table points at it.
- modules/rust/PLAN_REDESIGNS.md §14.3.16: the stage-3 record, ten points
  settled in code (all overrulable), TruePVE's one-second save, the tests
  and the rig compile. Pointers from §9's summary and §14.3.2.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01E14m6SuuY6i1vASFeGDBeY
This commit is contained in:
2026-10-15 05:47:27 -05:00
parent bf2524aa6c
commit 65c57cec36
2 changed files with 101 additions and 2 deletions

View File

@@ -930,7 +930,7 @@ pulls) is research, not a walk, so it still comes first:
answered before code: **written on 2026-10-14 as §14.3**, from D361–D369, and answered as D370–D376. Then the
build, in §14.3.11's nine stages (two of them core), §13 first. **Stage 1, §13, was built on 2026-10-15
(§14.3.14)**, with D378 and D379. **Stage 2, core's `retryAfterMs` (MODULE_API 1.15.0), was built on
2026-10-15 (§14.3.15).**
2026-10-15 (§14.3.15).** **Stage 3, TruePVE in the zone step, was built on 2026-10-15 (§14.3.16).**
**Then one walk, on Oxide and Carbon, of everything still owed (D331):** §2.7; §11's rows; §12.9; §13's and
§14's rows; the in-game rows
@@ -2501,6 +2501,8 @@ helicopter from a run, then cancel the run and see both stay; a Guarded Crate cr
#### 14.3.2 TruePVE in the zone step (D362, D368)
> **Built on 2026-10-15** (§14.3.16), specified in PROTOCOL.md §20.6.
**Hello.** `integrations.truePve`: `{ loaded, version }`.
**The wire.** `world.zone` gains an optional **`truePve`**: `{ "exclude": true }` or `{ "ruleset": "pvp-arena" }`
@@ -2933,6 +2935,47 @@ machine's installed `modules/`; client 422/422 and the build.
**No walk rows of its own.** Stage 5's Dangerous Treasures rows exercise it: a step answering *"not ready"*
shows *"retrying at …"* and runs then.
#### 14.3.16 Stage 3, built: TruePVE in the zone step (2026-10-15)
Built in Rust-Plugins and Module-Rust as §14.3.2 planned it, specified in
[PROTOCOL.md](../../rust-link/PROTOCOL.md) §20.6. **No Rust-Link change**: the sidecar forwards `world.zone`
whole. `PROTOCOL_VERSION` stays 14. Builds: Rust 25902425, Oxide 2.0.7830, Carbon 2.0.262, TruePVE 2.4.6 on both
rigs.
**Settled in the code, and overrulable:**
1. **A ruleset name is trimmed and 1–64 characters**, checked by the site and the plugin alike; past that it
is passed as written, because TruePVE compares names case-sensitively (`r.name == ruleset` in 2.4.6).
2. **A server whose hello has not said whether it has TruePVE is left to the plugin** (a plugin before
protocol 14, or never reached), as a dome is, and the plugin answers `truepve-missing`. Only a hello that
says `loaded: false` is refused at verify.
3. **`exclude` refused by TruePVE answers `refused`, not `truepve-ruleset`.** It happens only when TruePVE has
not read its config or data yet; the zone is erased all the same.
4. **The mapping comes after the dome**, so a refusal erases both, as a failed dome erases its zone.
5. **Re-creation maps nothing again.** TruePVE keeps the mapping in its own data file, keyed by the zone id,
which re-creation keeps.
6. **Two erase paths beyond the plan's three are covered:** a zone `world.owned` finds ZoneManager no longer
holds, and a new wipe dropping the old map's entries. TruePVE's table outlives a wipe.
7. **Leftovers are also flushed at the bridge's own load**, not only at `OnPluginLoaded(TruePVE)`, so a bridge
reloaded after TruePVE came back does not wait for TruePVE's next reload. `truepve.json` is deleted when empty.
8. **Hello is sent again when TruePVE loads or unloads**, so the site's verify reads the current answer.
9. **`truepve-missing` and `truepve-ruleset` are permanent failures**, as `no-zone` is.
10. **Server settings' plugin line names TruePVE**: *"TruePVE 2.4.6 is loaded — a zone step may turn off PvP
protection or name a ruleset."*
**One thing TruePVE does that we cannot change:** it saves its data file one second after a change, on its
own timer. A restart inside that second loses the change. For a removal that leaves a mapping for an `rg-…` id
no zone will have again, which changes nothing in game; D362's cleanup is otherwise complete.
**Tests.** Module-Rust: five new in `test/zones.test.js` (exclude, `"true"` and a trimmed ruleset on the wire;
unset, off and blank send nothing; both, a long name and no TruePVE refused for good at verify and perform; a
hello that has not said is left to the plugin; `truepve-ruleset` and `truepve-missing` fail for good with the
plugin's words). Full suites: server 603/603 and every check (imports, bundle, swagger, engagement); client
84/84, the build and externals. The plugin compiled and loaded on both rigs, and `rg.world` read
`truePve=True truePveLeftover=0` on each; both rigs were put back on the protocol-13 bridge after.
**Walk rows** are §14.3.2's, at the end walk (D331, D359).
### 14.4 Questions for the org lead
**Answered on 2026-10-14:** Q17 as proposed, out (D358). **Q18 against the proposal: the end walk waits for