docs(runtime): close gameplay-state ownership

Record J4.5 canonical shortcut and spellbook command ownership, combined failure and graphical/headless parity evidence, the 8,544-test Release gate, exact-binary lifecycle and nine-stop acceptance, rollback instructions, and the J5 boundary.

Co-authored-by: Codex <noreply@openai.com>
This commit is contained in:
Erik 2026-07-26 10:17:39 +02:00
parent 89e6b207f8
commit 2c67a2c3ba
11 changed files with 209 additions and 22 deletions

View file

@ -0,0 +1,118 @@
# Modern runtime J4.5 — gameplay-state closeout
**Status:** COMPLETE
**Production commit:** `89e6b207f81946b40c38c8dc6597817ad99fc6e0`
**Parent plan:** `../plans/2026-07-26-modern-runtime-slice-j4.md`
## Result
J4 now has one presentation-independent owner for every gameplay-state group
in its scope. Graphical UI, current-runtime/plugin projections, and future
no-window hosts borrow the exact Runtime instances.
- `RuntimeInventoryState` owns the one 18-slot `ShortcutStore` and the one
inventory transaction/busy owner over J3's canonical `ClientObjectTable`.
- `RuntimeCharacterState` owns favorite spells, spellbook filters, and desired
component levels on its exact `Spellbook`.
- Retained toolbar and spell controllers initiate typed Runtime commands; they
no longer construct or reconstruct another mutable shortcut, favorite, or
component collection.
- `ItemInteractionController` requires the Runtime-owned
`InventoryTransactionState`; its compatibility fallback and ownership flag
are deleted.
- One allocation-free `RuntimeGameplayOwnershipSnapshot` covers inventory,
character, and communication owner/subscriber convergence.
The command seam preserves the named-retail local/send order:
- toolbar shortcut add/remove sends first and then mutates `PlayerModule`;
- favorite add/remove and filter changes mutate locally before sending;
- desired-component set/clear sends first and then mutates locally;
- an explicit desired-component value of zero remains an entry until the
complete list is cleared.
The retail trace and pseudocode are recorded in
[`2026-07-26-slice-j4-5-retail-local-command-order.md`](2026-07-26-slice-j4-5-retail-local-command-order.md).
## Failure and parity evidence
- Graphical command adapters and direct no-window owner commands produce equal
inventory/character snapshots, revisions, shortcuts, favorites, filters,
and desired-component values.
- Invalid and stale-generation commands neither publish nor mutate.
- Outbound exceptions preserve retail's already-committed local side of each
operation.
- A failing UI/subscriber callback cannot skip another observer or strand a
half-disposed Runtime root. Terminal disposal reports the failure only after
every owned suffix has run and the combined ledger has converged.
- Two independent Runtime graphs remain isolated and Runtime's dependency
closure loads no App, UI, Silk.NET, OpenAL, Arch, or ImGui assembly.
## Automated evidence
- Runtime suite: 175 passed.
- App suite: 3,780 passed / 3 established skips.
- Core suite: 3,306 passed / 2 established skips.
- Core.Net suite: 600 passed.
- UI abstractions: 545 passed.
- Content: 119 passed.
- Bake: 15 passed.
- CLI: 4 passed.
- Complete Release solution: 8,544 passed / 5 established skips.
- Final incremental Release build: zero warnings and zero errors.
- `git diff --check`: pass.
## Exact-binary connected evidence
`logs/connected-world-gate-20260726-095654/report.json` passed on exact source
and embedded binary
`89e6b207f81946b40c38c8dc6597817ad99fc6e0`:
- six capped login/outdoor/dungeon/facility/revisit checkpoints;
- one fresh-process uncapped reconnect checkpoint;
- 247.294-second capped route and 61.424-second reconnect route;
- both clients exited gracefully with code zero;
- zero failures, render-shadow mismatches, pending deltas, or stranded owner
work.
`logs/connected-r6-soak-20260726-100235.report.json` passed on the same exact
source/binary commit:
- all nine Caul/Sawato/Rynthid/Aerlinthe/Holtburg/revisit/plateau checkpoints;
- camera-turn samples at every location and movement/jump/combat exercises at
Caul, Holtburg, and Caul return;
- 515.083 seconds, graceful code-zero exit, zero failures, and
`BinaryMatchesSource=true`.
Its six warnings are the established live-world diagnostics: small
authoritative/transient entity, particle, script, and retained cache
differences at the Caul plateau, 32 missing DAT VFX messages, and 25 expected
world-edge empty-landblock misses. None is a J4 ownership failure.
An earlier post-commit run was deliberately discarded before acceptance when
the soak harness proved its executable still carried the prior commit stamp.
The retained gates above ran only after a clean App rebuild and exact
source/binary identity verification.
## Divergence audit
J4.5 changes ownership and faithfully ports existing local command ordering.
It introduces no gameplay approximation, asynchronous command queue, or
presentation difference. No divergence-register row was added or retired.
## Rollback
```text
git revert 89e6b207f81946b40c38c8dc6597817ad99fc6e0
```
Revert J4.5 before J4.4 when unwinding gameplay-state extraction. Do not
revert J3's canonical entity/object lifetime to mask a J4 command or teardown
failure.
## Next boundary
J5 moves presentation-free movement, physics, selection/approach/use, combat
intent, projectiles, and outbound cadence by coherent lifetime groups. Camera,
input devices, selection graphics, combat/spell bars, animated poses, sound,
particles, and all retained UI remain in App.