From 5880bc9f1ebc068edeeb2b5c2c892c6424213d93 Mon Sep 17 00:00:00 2001 From: Claude Date: Sat, 18 Jul 2026 02:32:49 -0500 Subject: [PATCH] docs: fix cross-refs and scrub machine paths - Repoint doc-to-doc references from the old docs/ prefix to the co-located sibling filenames (docs live under link/ here now). - Replace the personal ServUO checkout path (C:\Users\...\servuo) with a placeholder throughout. --- link/ADMIN_CONTROLS.md | 6 +++--- link/PLAN.md | 2 +- link/PROTOCOL_2.md | 10 +++++----- link/RESEARCH.md | 2 +- link/SHARD_PREREQS.md | 2 +- link/link-README.md | 28 ++++++++++++++-------------- 6 files changed, 25 insertions(+), 25 deletions(-) diff --git a/link/ADMIN_CONTROLS.md b/link/ADMIN_CONTROLS.md index a856c3a..247d120 100644 --- a/link/ADMIN_CONTROLS.md +++ b/link/ADMIN_CONTROLS.md @@ -2,7 +2,7 @@ **Status:** Research + design. No code written yet. **Date:** 2026-07-12 -**Codebase:** ServUO 57.4, `C:\Users\colby\Desktop\servuo`, net48 / x64, Expansion **EJ**. +**Codebase:** ServUO 57.4, ``, net48 / x64, Expansion **EJ**. **Companion to** [`PLAN.md`](PLAN.md) (the read/event plane) and [`INTEGRATION.md`](INTEGRATION.md) (the website API). This document covers the **write plane**: staff actions the website should be able to take against the live shard. --- @@ -269,7 +269,7 @@ Every one: enforce the **Owner floor** on the target (refuse `AccessLevel >= CoO ## 7. Verification log (all resolved) -All resolved by source inspection (ServUO checkout at `C:\Users\colby\Desktop\servuo`). No live-shard run was needed — every path below is unambiguous in the code, and a mute smoke-test would in any case require a real UO client to log in and speak. +All resolved by source inspection (ServUO checkout at ``). No live-shard run was needed — every path below is unambiguous in the code, and a mute smoke-test would in any case require a real UO client to log in and speak. 1. **`Mobile.Squelched` persists — confirmed durable.** Serialized unconditionally (`Server/Mobile.cs:6489` write) and read back in the version ladder at case 9 (`:6013`), so it survives relog **and** a full server restart; no need to persist it ourselves. It gates `OnSaid` (`:7591` → *"You can not say anything, you have been muted."*). Two consequences for the plan: (a) it is **per-Mobile (per-character), not per-account** — "mute the account" means squelch each resident character; (b) it works on **offline** characters too, since logged-off mobiles stay resident in `World`. Phase 3 mute is therefore durable and offline-capable out of the box. 2. **Kicking all sessions — settled.** Enumerate `NetState.Instances` (`Server/Network/NetState.cs:583`, a `ReadOnlyCollection`), filter on `ns.Account == acct` (`:574`), and `Dispose()` each. This is **strictly better than walking the account's characters' `NetState`**: a client sitting at character-select has a `NetState` with an `Account` but *no* mobile, and only the `Instances` sweep catches it. `admin.kick` and the live-session cleanup in `admin.ban` both use this. @@ -302,7 +302,7 @@ All resolved by source inspection (ServUO checkout at `C:\Users\colby\Desktop\se | `overlay/Scripts/Custom/Bridge/BridgePages.cs` | New (Phase 2). Streams/snapshots/answers the `PageQueue`. | | `overlay/Config/Bridge.cfg` | Add `AdminWriteEnabled` (default off), `AdminAccessFloor` (default `CoOwner`), and the caps. | | `sidecar/src/web.rs` | New REST routes (`POST /admin/*`, `/pages/*`) → inbound lines; map replies to status codes. | -| `docs/INTEGRATION.md` | Document the new endpoints + the `admin.audit` / `page.*` events. | +| `INTEGRATION.md` | Document the new endpoints + the `admin.audit` / `page.*` events. | | *(website, separate repo)* | Admin/moderator-gated UI + a durable moderation log that records both its own actions and inbound `admin.audit` frames. | The Phase-1 **verbs** need no core or stock edit — every web-initiated action is an existing script-layer API called from the new `BridgeAdmin.cs` overlay. The only non-overlay change is the **one-line `CommandLogging` event** (`patches/commandlogging-event.patch`), needed solely so *in-game* bans/kicks forward their resolved target to the website (§5.5); it reuses the Phase-7 `patches/` mechanism and touches nothing else. diff --git a/link/PLAN.md b/link/PLAN.md index cefc30d..fff21e0 100644 --- a/link/PLAN.md +++ b/link/PLAN.md @@ -2,7 +2,7 @@ **Status:** Design, grounded in **measurements taken on this shard**, not estimates. **Date:** 2026-07-10 -**Codebase:** ServUO 57.4, `C:\Users\colby\Desktop\servuo`, net48 / x64, Expansion **EJ**. +**Codebase:** ServUO 57.4, ``, net48 / x64, Expansion **EJ**. **Supersedes** the speculative parts of `BRIDGE_FINDINGS.md`. See [§8](#8-corrections-to-bridge_findingsmd) for where that document is wrong. Test scaffolding used to produce this plan lives in `Scripts/Custom/BridgeSeeder.cs` (world population) and `Scripts/Custom/BridgeProbe.cs` (timing). Both are gated behind `Config/Bridge.cfg` flags and default to off. **Neither is part of the bridge.** Delete before production. diff --git a/link/PROTOCOL_2.md b/link/PROTOCOL_2.md index 7da8a15..bc0dec7 100644 --- a/link/PROTOCOL_2.md +++ b/link/PROTOCOL_2.md @@ -2,7 +2,7 @@ **Status:** Parts A + B (phases 1–4) **built and smoke-tested live** on branch `feat/protocol2-account-provisioning` (2026-07-17) — booted ServUO + the real sidecar and exercised every endpoint (see §15). Part B phase 5 (Factions/VvV) deferred by owner decision. **Date:** 2026-07-17 -**Codebase:** ServUO 57.4, `C:\Users\colby\Desktop\servuo`, net48 / x64, Expansion **EJ**. +**Codebase:** ServUO 57.4, ``, net48 / x64, Expansion **EJ**. **Companion to** [`PLAN.md`](PLAN.md) (read/event plane), [`ADMIN_CONTROLS.md`](ADMIN_CONTROLS.md) (staff write plane), and [`INTEGRATION.md`](INTEGRATION.md) (website API). Protocol 1.0 shipped the read/event plane, the request/reply plane, `[link` account linking, town-crier, the player-vendor-sale core edit, the admin write plane, and the help-page queue. @@ -208,7 +208,7 @@ Per the 2026-07-17 decision, **this is not in 2.0's committed scope.** When an a | `overlay/Config/Bridge.cfg` + `.example` | **Extend.** The §6 keys, defaults documented. | | `sidecar/src/web.rs` | **Extend.** `POST /accounts/create` (forwards `ip` from the body untouched), `DELETE /link/:account`; `respond_account` status mapping (409 on collision, 429 on IP cap, 400 on missing IP); scrub password from any logged/broadcast value. | | `sidecar/src/store.rs` | **Extend.** `record_unlink` (clear the mirrored link row) beside the existing `record_link`. | -| `docs/INTEGRATION.md` | **Extend.** Document `POST /accounts/create`, `DELETE /link/{account}`, and the `account.audit` event. | +| `INTEGRATION.md` | **Extend.** Document `POST /accounts/create`, `DELETE /link/{account}`, and the `account.audit` event. | | *(website, separate repo)* | Signup form → `POST /accounts/create`; unlink control → `DELETE /link/{account}`; consume `account.audit`. | No new core/stock edits in committed scope — `account.create`/`unlink` are all script-layer (`new Account`, `SetTag`/`RemoveTag`) called from the new overlay. The only core edit contemplated (the `AccountCreated` event, §7) is explicitly deferred. @@ -333,7 +333,7 @@ Everything below is grounded in a hook or a cheap sweep in *this* server. Ranked | `overlay/Scripts/Custom/Bridge/BridgeSweeps.cs` | **Extend / mirror.** New sweep timers (guild, city, presence), re-armable via `[bridge reload`, one-shot via `[bridge sweepnow`, counters in `[bridge status` — same shape as the existing sweeps. | | `overlay/Config/Bridge.cfg` | **Extend.** `GuildSweepSeconds`, `CitySweepSeconds`, `PresenceSweepSeconds` (+ enable flags). | | `sidecar/src/store.rs` + `web.rs` | **Extend.** Persist the snapshots that back boards (guild roster, governors, population history); `GET /guilds`, `/governors`, `/online` served from the store so they survive a shard outage, exactly like `/champs` and `/economy` do today. | -| `docs/INTEGRATION.md` | **Extend.** New event catalog entries + the read endpoints. | +| `INTEGRATION.md` | **Extend.** New event catalog entries + the read endpoints. | --- @@ -443,7 +443,7 @@ Key points, all grounded: | `overlay/Scripts/Custom/Bridge/BridgeReports.cs` | **New.** Core-thread report sweep calling `Reports.Compile*` + `Reports.StaffHistory`; serialize to `report.*`; re-armable via `[bridge reload`, one-shot via `[bridge sweepnow`. | | `overlay/Config/Bridge.cfg` | **Extend.** `ReportSweepSeconds` (+ enable flag). | | `sidecar/src/store.rs` + `web.rs` | **Extend.** Persist the report snapshots; `GET /reports/{skills,general,staff}` served from the store (survives shard outage, like `/champs`). | -| `docs/INTEGRATION.md` | **Extend.** `report.*` events + endpoints; note they supersede the stock FTP/HTML reports and `WebStatus`. | +| `INTEGRATION.md` | **Extend.** `report.*` events + endpoints; note they supersede the stock FTP/HTML reports and `WebStatus`. | > **Recommendation:** fold this in as **Part B, Phase 6** (after the world-state streams), scoped to skill distribution + staff/page-queue history first. It is low-effort (public methods, existing sweep pattern) and directly answers "get the admin reports onto the site instead of a file" — by tapping the data the engine already computes and never letting it become a file at all. @@ -543,6 +543,6 @@ On an inbound article the bridge does two things on the Core thread: | `overlay/Scripts/Custom/Bridge/BridgeNews.cs` | **New.** `news.add` / `news.remove`: insert/remove `TownCryerNewsEntry` in the public `NewsEntries` list, track `_ours`, cap; optional title announcement via `GlobalTownCrierEntryList`; replies + caps. No stock edit. | | `overlay/Config/Bridge.cfg` | **Extend.** `NewsMaxTitleLength`, `NewsMaxBodyLength`, `NewsMaxExternal`, default announce duration. | | `sidecar/src/web.rs` + `store.rs` | **Extend.** `POST /news`, `DELETE /news/{id}`; persist the external-news set; replay it on shard (re)connect. | -| `docs/INTEGRATION.md` | **Extend.** The `news.*` verbs + endpoints. | +| `INTEGRATION.md` | **Extend.** The `news.*` verbs + endpoints. | No core or stock ServUO change — the whole integration rides the public `TownCryerSystem.NewsEntries` list and the existing crier say path. diff --git a/link/RESEARCH.md b/link/RESEARCH.md index 57ca92e..8108b27 100644 --- a/link/RESEARCH.md +++ b/link/RESEARCH.md @@ -3,7 +3,7 @@ **Status:** Research only, no implementation. **Architecture:** Rust sidecar owns a bidirectional WebSocket + JSON endpoint for the website; ServUO links to it over a **local loopback socket**. Tracking players/stats/gold/economy/NPC+player-vendor sales, IDOC/house decay, in-game **`[link`** account linking, and website→game town-crier news. See **Part II** (design/transport/tracking/link), **Part III** (player-vendor, IDOC, town crier, config), and **Part IV** (full character profiles — gear/skills/stats, online & offline, up to 5/account). **Date:** 2026-07-07 -**Codebase:** ServUO 57.4 (this repo, `C:\Users\colby\Desktop\servuo`), target framework **.NET Framework 4.8 / x64**. +**Codebase:** ServUO 57.4 (this repo, ``), target framework **.NET Framework 4.8 / x64**. **Method:** Grounded in this repo's source. Where the running server would normally be used to confirm behavior, see the note in [§0](#0-note-on-empirical-verification) — the shard was **not running** at research time, so live-boot verification was deliberately skipped and replaced with source-level proof plus evidence from this repo's own crash logs. A ready-to-run empirical probe is included in [Appendix A](#appendix-a-drop-in-empirical-probe-run-this-yourself). --- diff --git a/link/SHARD_PREREQS.md b/link/SHARD_PREREQS.md index ae4d926..f19a07a 100644 --- a/link/SHARD_PREREQS.md +++ b/link/SHARD_PREREQS.md @@ -1,6 +1,6 @@ # Shard prerequisites -Repairs the target shard (`C:\Users\colby\Desktop\servuo`, ServUO 57.4) required before the bridge could load. These are **deletions and edits of existing files**, so they cannot be expressed as an overlay copy. They are recorded here, and where practical as diffs under `patches/`. +Repairs the target shard (``, ServUO 57.4) required before the bridge could load. These are **deletions and edits of existing files**, so they cannot be expressed as an overlay copy. They are recorded here, and where practical as diffs under `patches/`. Applied 2026-07-10. Backups on the Desktop: `servuo_saves_backup_2026-07-10_032608`, `servuo_bin_backup_2026-07-10_032608`, `servuo_removed_files_2026-07-10`. diff --git a/link/link-README.md b/link/link-README.md index b6711e7..d678fe7 100644 --- a/link/link-README.md +++ b/link/link-README.md @@ -17,10 +17,10 @@ The shard never speaks WebSocket. Every world read happens on the Core thread; t | `patches/` | Unified diffs against stock ServUO for files we must modify rather than add. | | `sidecar/` | The Rust sidecar: terminates the loopback link to the shard, exposes WS + REST to the website. See `sidecar/README.md`. | | `tools/` | Never deployed. Test scaffolding and anything else that must not reach a server. | -| `docs/INTEGRATION.md` | **Website integration guide** — the WebSocket feed, REST endpoints, auth, event catalog, and examples. Start here to build the front end. | -| `docs/PLAN.md` | Implementation plan, measured performance budget, and the full data catalog. | -| `docs/RESEARCH.md` | Original source-level research. Partly superseded — see the corrections table in `PLAN.md` §8. | -| `docs/SHARD_PREREQS.md` | Repairs the target shard needed before any of this could load. | +| `INTEGRATION.md` | **Website integration guide** — the WebSocket feed, REST endpoints, auth, event catalog, and examples. Start here to build the front end. | +| `PLAN.md` | Implementation plan, measured performance budget, and the full data catalog. | +| `RESEARCH.md` | Original source-level research. Partly superseded — see the corrections table in `PLAN.md` §8. | +| `SHARD_PREREQS.md` | Repairs the target shard needed before any of this could load. | | `deploy.ps1` | Copies `overlay/` into a server root. `-Verify` diffs instead of writing. | Anything under `overlay/` is authoritative. Do not edit files in the server tree directly — edit here and deploy. @@ -28,8 +28,8 @@ Anything under `overlay/` is authoritative. Do not edit files in the server tree ## Deploy ```powershell -.\deploy.ps1 -ServerPath C:\Users\colby\Desktop\servuo -Verify # show what would change -.\deploy.ps1 -ServerPath C:\Users\colby\Desktop\servuo # write +.\deploy.ps1 -ServerPath -Verify # show what would change +.\deploy.ps1 -ServerPath # write ``` ## Status @@ -37,13 +37,13 @@ Anything under `overlay/` is authoritative. Do not edit files in the server tree | Phase | State | |------:|-------| | 0 — build fix (`Scripts.csproj`) | **done, verified end-to-end** | -| 1 — transport (`BridgeLink`) | **done, acceptance in `docs/PLAN.md` §11** | -| 2 — event streams (`BridgeEvents`) | **done, acceptance in `docs/PLAN.md` §12** | -| 3 — sweeps (`BridgeSweeps`) | **done, acceptance in `docs/PLAN.md` §13** | -| 4 — request/response (`BridgeRequests`) | **done, acceptance in `docs/PLAN.md` §14** | -| 5 — `[link` account linking (`BridgeAccountLink`) | **done, acceptance in `docs/PLAN.md` §15** | -| 6 — town-crier inbound (`BridgeTownCrier`) | **done, acceptance in `docs/PLAN.md` §16** | -| 7 — `PlayerVendorSale` core event (`patches/` + `BridgeVendorSale`) | **done, acceptance in `docs/PLAN.md` §17** | +| 1 — transport (`BridgeLink`) | **done, acceptance in `PLAN.md` §11** | +| 2 — event streams (`BridgeEvents`) | **done, acceptance in `PLAN.md` §12** | +| 3 — sweeps (`BridgeSweeps`) | **done, acceptance in `PLAN.md` §13** | +| 4 — request/response (`BridgeRequests`) | **done, acceptance in `PLAN.md` §14** | +| 5 — `[link` account linking (`BridgeAccountLink`) | **done, acceptance in `PLAN.md` §15** | +| 6 — town-crier inbound (`BridgeTownCrier`) | **done, acceptance in `PLAN.md` §16** | +| 7 — `PlayerVendorSale` core event (`patches/` + `BridgeVendorSale`) | **done, acceptance in `PLAN.md` §17** | Every phase on the ServUO side is complete. Phases 0–6 are drop-in (`overlay/`); Phase 7 is the one core change, shipped as `patches/`. Remaining work is the Rust sidecar. @@ -91,4 +91,4 @@ Runtime script compilation therefore had no effect, silently. `overlay/Scripts/S Note: the throwaway PowerShell sidecars are fragile — they get reaped and contend on their log file. The real Rust sidecar replaces them; don't read their flakiness as a shard problem. The shard buffers non-perishable events through any outage and reconnects on its own (observed reconnecting 5× unattended in one session). -`tools/scaffolding/` holds the world seeder and the performance probe. Neither is deployed — `deploy.ps1` only copies `overlay/`. They produced the budget in `docs/PLAN.md` §1. See `tools/scaffolding/README.md`. +`tools/scaffolding/` holds the world seeder and the performance probe. Neither is deployed — `deploy.ps1` only copies `overlay/`. They produced the budget in `PLAN.md` §1. See `tools/scaffolding/README.md`.