acdream/docs/research/2026-07-26-slice-j4-5-gameplay-state-closeout.md
Erik 2c67a2c3ba 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>
2026-07-26 10:17:39 +02:00

5 KiB

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.

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

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.