4.1 KiB
Context
The prior scum-game-player-intelligence change owns server-local player identity, sessions, risk signals, and access control. The existing game-client bridge supplies declared commands, approval states, leases, audit references, and result fencing, but it does not itself constrain individual game-state fields or maintain a readable player-change history.
Goals / Non-Goals
Goals:
- Permit only catalogued SCUM skills and character attributes for an explicitly declared server game version.
- Verify player/server ownership, current state version, companion availability, declared maintenance/online safety state, and platform-admin approval before dispatch.
- Record before/after value, reason, requester, approver, bridge command result, and read-after-write confirmation as an immutable patch audit.
- Prevent unknown versions, fields, out-of-range values, stale versions, unsafe execution windows, and unknown/failed execution from being represented as applied.
Non-Goals:
- SQL or database access, raw JSON/INI write APIs, host paths, direct Run/game connections, OCR/input automation, player identity/risk-signal edits, bans, gifts, or map trails.
Decisions
-
Catalog at the platform boundary.
SCUMPlayerStateCatalogmaps a declared server game version to a small list of field keys and numeric ranges. No caller or plugin payload can introduce fields dynamically. The initial exact version is0.9.700.90357and supportsskills.runningandattributes.strengthin range 0–10. -
Use a dedicated typed bridge operation. The manifest declares only
game-state.patch, with a schema requiring target player ID, game version, expected state version, safety-window token, reason, and a list of catalogued changes. The result carries a bounded per-field outcome and an immediate confirmed state version; it contains no raw storage/database material. -
Two-stage platform-admin approval. A server-authorized requester creates a durable patch record in
pending-approval. A platform admin approves it after revalidating authorization, catalog, snapshot version, and safety window. Approval queues the bridge command and remains auditable; a requester who is also platform admin still creates then approves the explicit record. -
Snapshot/state fencing and confirmation. A current
player.statesnapshot is the source of before values and itsstateVersionis copied into the requested patch. The companion must reject mismatches, apply only declared fields in a verified maintenance/offline safety window, then read state back before returning success. Platform marks a recordconfirmedonly when each returned value exactly equals its requested value and the returned state version advances. Failed and unknown results stay readable terminal audit states. -
Ownership is revalidated at every transition. Player record lookup checks server ownership before viewing, creating, approving, or reading a patch. The bridge command is scoped to the same server plugin and profile; the generic queue cannot be used as an alternate raw patch entry point because the dedicated service owns field/snapshot validation and records the audit before dispatch.
Risks / Trade-offs
- [Companion has no exact version/state snapshot] → Disable the form and return a readable unsupported/unknown-version result.
- [State changes between snapshot and execution] → The expected state version causes the companion to reject; record the conflict without claiming application.
- [Companion times out or result is missing] → Keep the record
execution-unknown; do not infer a write, and require a later confirmation read. - [Maintenance state becomes unsafe] → Approval and companion both reject dispatch; no write is attempted.
Migration Plan
- Add model-first patch records, memory/file/MySQL repositories, and immutable transition helpers.
- Deploy the manifest schemas and companion version declaration; no version is implicitly supported.
- Deploy the API and console. Existing player profiles retain all read-only intelligence behavior.
- Roll back by disabling the command declaration and form; historical audit records remain readable.