acdream/docs/research/2026-07-26-slice-j4-4-character-projections.md
Erik ce6fae7b38 docs(runtime): close character projections
Record J4.4's canonical character settings, borrowed gameplay views, typed state-command seam, complete Release evidence, exact-binary lifecycle/reconnect acceptance, rollback, and the J4.5 combined closeout boundary. Synchronize architecture, roadmap, milestones, agent guidance, and durable memory.

Co-authored-by: Codex <codex@openai.com>
2026-07-26 09:21:26 +02:00

4.6 KiB

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:

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

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.