acdream/docs/research/2026-07-25-slice-j3-3-exact-projection-store.md
Erik d9bf4c4960 docs(runtime): close J3.3 and hand off J3.4
Record exact projection-store ownership, automated and connected evidence, rollback chain, and the executor-ready canonical object-table plan. Reconcile milestones, roadmap, architecture, divergence pointers, AGENTS/CLAUDE, and durable handoff state.

Co-authored-by: Codex <codex@openai.com>
2026-07-25 22:29:34 +02:00

128 lines
4.9 KiB
Markdown

# Modern runtime J3.3 exact projection-store closeout
## Result
J3.3 is complete in two production commits:
1. `420e5eea70fd2c29cf9c8614e6298a1f84d64045` — exact-key App
projection store and presentation-owner cutover.
2. `e937cc36df39cf6ea1eaba2f9c0243d1929da702` — exact-key spatial
residence, visibility, quiescence, rebucketing, and retirement correction.
The second commit is the final exact binary certified by the connected gate.
`AcDream.Runtime.Entities.RuntimeEntityDirectory` remains the sole owner of
current server GUID, `INSTANCE_TS` incarnation, Runtime local ID, reverse
lookup, accepted snapshot/timestamps, parent state, session epoch, tombstones,
and per-GUID operation versions.
`AcDream.App.World.LiveEntityProjectionStore` now owns materialized graphical
sidecars only. Its key is the complete `RuntimeEntityKey`:
```text
Runtime local ID + INSTANCE_TS incarnation
```
There are three explicit states:
1. canonical-only Runtime registration with no App sidecar;
2. one materialized App sidecar under its exact key;
3. retryable teardown retaining only the unfinished suffix for that exact key.
The temporary `ActiveRecordView`, `_activeRecords`, detached
`LiveEntityRecord(EntitySpawn)` fixture path, and broad materialized/visible
`WorldEntity` collection APIs are deleted. Consumers use focused borrowed
queries or allocation-free exact-key record views.
## Exact owner cutover
The following App owners now carry the exact key:
- world projection and loaded/pending spatial residence;
- spatial visibility transitions and world-generation quiescence;
- hydration and recovery;
- animation and spatial-animation schedules;
- remote motion, remote teleport, and movement observations;
- projectile and ordinary-root worksets;
- entity effect profiles and moving lights;
- equipped-child roots and render registrations;
- render-scene journal identity;
- radar, targeting, selection, liveness, and teardown lookups.
`GpuWorldState` preserves the exact key through loaded-to-loaded rebucketing,
pending residence, landblock retirement/reload, persistent rescue, and
full-origin recenter. A delayed visibility edge therefore cannot match a later
incarnation that reused the same numeric local ID. DAT-static entities retain
their existing non-Runtime path and are not assigned a fabricated server-live
identity.
No asynchronous queue, copied gameplay world, extra input frame, local-ID
allocation-order change, renderer order change, or gameplay behavior change
was introduced.
## Automated acceptance
At final commit `e937cc36`:
- focused ownership/streaming tests: 104 passed;
- App tests: 3,761 passed / 3 skipped;
- complete Release solution: 8,444 passed / 5 skipped;
- Release solution build: pass.
Coverage includes canonical-only registration, exact sidecar claim, same-
incarnation refresh, factory/resource rollback, local-ID wrap and stale-key
rejection, loaded/pending rebucketing, landblock detach/reload, origin
recenter, reentrant visibility callbacks, GUID replacement, hydration,
animation/effect/light/equipped-child ownership, and retryable teardown.
Source guards reject a GUID-keyed App `LiveEntityRecord` authority map and
local-ID-only ownership in the materialized presentation/spatial worksets.
The divergence-register audit found no new behavioral divergence: J3.3 changes
ownership and identity plumbing only. AD-32's moved Runtime source pointers
were refreshed without changing its scope.
## Connected lifecycle acceptance
Raw evidence:
`logs/connected-world-gate-20260725-221008/report.json`.
Result: PASS on exact commit
`e937cc36df39cf6ea1eaba2f9c0243d1929da702`.
- Two fresh processes/sessions completed.
- Seven of seven checkpoints passed.
- Both processes exited gracefully with exit code zero.
- The report contains zero failures.
- Every checkpoint has zero render-scene shadow mismatches.
- Every checkpoint converged with zero pending render deltas.
- The only warning is 25 expected world-edge landblock misses.
This certifies fresh login, outdoor/dungeon travel, same-location revisit,
graceful logout, and fresh-process reconnect on the exact final binary.
## Exact rollback
Revert newest first:
```text
git revert e937cc36df39cf6ea1eaba2f9c0243d1929da702
git revert 420e5eea70fd2c29cf9c8614e6298a1f84d64045
```
Do not revert J3.2 unless canonical Runtime identity itself is also being
rolled back.
## Next slice
Start J3.4 in
`docs/plans/2026-07-25-modern-runtime-slice-j3.md`.
The executor-ready transfer prompt is
`docs/research/2026-07-25-slice-j3-3-complete-j3-4-handoff.md`.
J3.4 moves the existing canonical `ClientObjectTable` and its placement/
container lifetime under one Runtime entity/object group. App remains a
synchronous borrower for retained UI, item icons, paperdolls, grids, cooldown
drawing, and interaction presentation. It must preserve object add/update/
remove, container replacement, optimistic move rollback, stack responses,
GUID reuse, session clear, and press-time event ordering without adding a
queue or copied inventory model.