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>
This commit is contained in:
Erik 2026-07-26 09:21:26 +02:00
parent dcb61efb5a
commit ce6fae7b38
9 changed files with 194 additions and 22 deletions

View file

@ -0,0 +1,117 @@
# 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.