# Modern runtime J4.4 — character projections and typed state commands **Status:** COMPLETE **Production commit:** `dcb61efb5af6c12bd619369e28cf11bacc37bc73` **Parent plan:** `../plans/2026-07-26-modern-runtime-slice-j4.md` ## Result `RuntimeCharacterState` now owns the remaining presentation-independent local character state: both character-option bitfields and the server-authoritative run/jump skill projection. The App-owned `PlayerCharacterOptionsState` and `LocalPlayerSkillState` were deleted. The graphical movement controller borrows and applies the Runtime values when its body is constructed or reconstructed. The current-runtime boundary exposes borrowed, immutable projections over the exact J4 owners: - inventory request/busy state, complete item-or-spell shortcuts, and item mana; - character options, movement skills, vitals, attributes, skills, learned spells, favorites, filters, desired components, enchantment counts, and revisions; - friends, squelch counts/revisions, and negotiated chat-room state. Synchronous, generation-gated typed commands now cover shortcut mutation, spell favorites/filter/forget/component preferences, advancement, character options, friends, and squelch. The retained graphical UI uses this same seam. The adapter publishes into the existing generation-scoped `ICommandBus`; the exact live-session router performs the established `WorldSession` sends and becomes inert before session detachment. No asynchronous queue, second state collection, or extra frame was introduced. Normalized checkpoints now include J4 inventory, character, and social revisions/counts, so later graphical-versus-no-window parity gates cannot pass while ignoring the newly exposed state. ## Retail basis J4.4 changes ownership and command routing, not game behavior. The retained defaults come from the named retail client: ```text PlayerModule::PlayerModule @ 0x005D51F0 options_ = 0x50C4A54A options2_ = 0x00948700 spell_filters_ = 0x00003FFF ``` `PlayerModule::Clear @ 0x005D48A0` clears the per-character shortcut, desired-component, generic-option, and gameplay-option objects. Because one modern Runtime owner survives successive character sessions, its session reset restores the equivalent freshly constructed option bitfields. Existing PlayerDescription replacement and `SetCharacterOptions (0x01A1)` packing are unchanged. Controller/body/camera/input application remains in App and is intentionally outside J4; J5 owns that later boundary. ## Automated evidence - Runtime suite: 169 passed. - App suite: 3,777 passed / 3 established skips. - Core suite: 3,305 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,534 passed / 5 established skips. - Release build: pass, zero warnings and zero errors on the final incremental build. - `git diff --check`: pass. Focused coverage proves the retail defaults, partial run/jump updates, character replacement/reset, full item and spell shortcut observation, borrowed owner identity, typed command/generation routing, displaced-session inertness, normalized checkpoint coverage, two independent Runtime instances, absence of static mutable session state, and deletion of both App owner paths. ## Exact-binary connected evidence `logs/connected-world-gate-20260726-091340/report.json` passed on exact source and embedded binary commit `dcb61efb5af6c12bd619369e28cf11bacc37bc73`: - six capped checkpoints through login, outdoor/dungeon/facility travel and revisit plus one fresh-process uncapped reconnect checkpoint; - 243.602-second capped route and 61.262-second reconnect route; - both sessions exited gracefully with code zero; - zero failures, render-shadow mismatches, pending deltas, or stranded owner work. Its only warning is the established set of 25 expected world-edge landblock misses. ## Divergence audit The slice preserves existing retail-derived packet order, option defaults, movement-skill application, and command builders while changing only lifetime ownership and the host boundary. No divergence row was added or retired. ## Rollback ```text git revert dcb61efb5af6c12bd619369e28cf11bacc37bc73 ``` Revert J4.4 before J4.3 if the gameplay-state groups must be unwound. Do not revert J3's canonical entity/object ownership to mask a J4 state or command failure. ## Next boundary J4.5 removes the remaining compatibility paths, proves graphical and no-window command/state parity under injected failures, and runs the combined Release, connected lifecycle/reconnect, and canonical nine-stop closeout.