# Modern runtime J4.2 — inventory transaction ownership **Status:** COMPLETE **Production commit:** `011efbeaa72509b35ea7f4a442e50a2377ae1ea4` **Parent plan:** `../plans/2026-07-26-modern-runtime-slice-j4.md` ## Result `RuntimeInventoryState` is the single presentation-independent owner for the live external-container state, item-mana state, shortcut assignments, desired spell-component counts, and the retail one-inventory-request-at-a-time transaction gate. It borrows J3's exact `ClientObjectTable`; it does not construct or synchronize a second item collection. The live-session router, item interaction, retained UI, developer tools, current-runtime/plugin boundary, and future no-window hosts all observe those same owner instances. `InventoryTransactionState` now owns the request/response gate previously split across App interaction code. It records the retail request token, matches the corresponding response, maintains the shared busy reference, tracks use reservations, and resets the transaction atomically. Callback failures are isolated after canonical state commits, so one observer cannot strand the busy cursor or prevent a later request. Presentation-only state remains in App: pending backpack-slot projection, drag/drop hover and selection, cursor choice, item icons, panel layout, and optimistic visual placement. App may borrow the Runtime transaction owner but cannot dispose or replace it. ## Retail basis The ownership move preserves the already-ported retail transaction behavior: - `ACCWeenieObject::RecordRequest` at `0x0058C220`; - `ACCWeenieObject::RecordResponse` at `0x0058CAB0`; - `ClientUISystem::UsageCallback` at `0x00565B20`; - `2026-07-23-retail-use-busy-ownership-pseudocode.md`; - `2026-07-13-retail-give-item-pseudocode.md`. ACE and Holtburger remain interpretation cross-checks as recorded in the busy-ownership pseudocode. No request ordering, wire packet, optimistic move, rollback, use-completion, or cursor behavior changed in J4.2. ## Automated evidence - Runtime suite: 157 passed. - App suite: 3,770 passed / 3 established skips. - Core suite: 3,305 passed / 2 established skips. - Complete Release solution: 8,515 passed / 5 established skips. - Release build: pass, zero errors. A clean rebuild reports 17 established test warnings; the J4.2 diff introduces none. - `git diff --check`: pass. The focused matrix covers exact object-table identity, external-container open/replace/close, item-mana replacement, shortcut/component replacement, request/response matching, use reservations, dispatch failure rollback, observer failure isolation, reset/reconnect, borrowed lifetime, idempotent disposal, and two independent Runtime instances. One parallel full-suite run hit the established allocation-sensitive portal projection test with a 1,536-byte measurement. The isolated App rerun passed, and an immediate complete-solution rerun passed all 8,515 tests without a code change. ## Exact-binary connected evidence `logs/connected-world-gate-20260726-082057/report.json` passed on exact source and embedded binary commit `011efbeaa72509b35ea7f4a442e50a2377ae1ea4`: - six capped checkpoints through login, outdoor/dungeon/facility travel and revisit plus one fresh-process uncapped reconnect checkpoint; - 244.011-second capped route and 61.422-second reconnect route; - both sessions exited gracefully with code zero; - zero failures. Its only warning is the established set of 25 expected world-edge landblock misses. ## Divergence audit J4.2 changes lifetime ownership and failure containment only. It introduces no new retail behavior and retires no registered divergence, so the divergence register is unchanged. ## Rollback ```text git revert 011efbeaa72509b35ea7f4a442e50a2377ae1ea4 ``` Do not revert J3's canonical entity/object ownership to mask an inventory transaction failure. ## Next boundary J4.3 moves construction and lifetime of the coupled `Spellbook` and `LocalPlayerState` into Runtime. Immutable DAT spell tables remain supplied by the content host; retained spellbook, active-effect, character-sheet, and paperdoll presentation remain in App/UI.