docs(runtime): define the canonical J8 generation reset

This commit is contained in:
Erik 2026-07-27 00:08:52 +02:00
parent 456c72233e
commit 0843a41b85

View file

@ -54,6 +54,41 @@ It must not construct an App adapter, duplicate entity directory, duplicate
object table, duplicate gameplay owner, second clock, second transit owner, or object table, duplicate gameplay owner, second clock, second transit owner, or
second session controller. second session controller.
### Canonical per-generation reset contract
The audit found one production seam that must land before the direct host can
prove reconnect honestly. `GameRuntime` owns every canonical per-session
child, but the graphical `LiveSessionResetManifest` currently invokes those
children one by one and interleaves them with App-only teardown. A no-window
host that copied that list would create a second lifecycle definition and
would not prove the Slice-K host can reuse the graphical runtime.
J8 therefore adds one Runtime-owned, retryable generation-reset transaction.
The exact public contract has these phases:
1. reset the root's canonical transit, communication, inventory, action,
character, movement, object-table, and other per-generation state in the
existing accepted order;
2. call `RuntimeEntityObjectLifetime.BeginSessionClear()` exactly once and
expose the returned exact-incarnation retirement set to one borrowed host
retirement boundary;
3. let the graphical host retire App render/physics/animation projections and
drain their queued removals, while the no-window host immediately retires
the same canonical records without constructing projections;
4. require `CompleteSessionClearIfConverged()` before clearing the canonical
player identity and permitting a new generation;
5. retain every incomplete suffix after callback failure so the same reset can
be retried without replaying a completed retirement.
The host boundary acknowledges projection retirement only. It owns no
canonical dictionary, reset cursor, generation number, or cleanup order.
App-only mouse capture, retained UI, camera, particle visibility, renderer,
audio, input, and diagnostics remain outside the Runtime transaction. The
graphical `LiveSessionResetManifest` invokes the Runtime transaction at its
existing projection-safe point; `NoWindowGameRuntimeHost` invokes that same
transaction with an immediate canonical-only acknowledgement. There is no
test-only production injection API and no alternate reset manifest.
The host applies already-decoded deterministic packets through the same Runtime The host applies already-decoded deterministic packets through the same Runtime
owner APIs that the graphical session route uses. Core.Net parser correctness owner APIs that the graphical session route uses. Core.Net parser correctness
remains covered by Core.Net wire fixtures; J8 verifies ownership, ordering, remains covered by Core.Net wire fixtures; J8 verifies ownership, ordering,
@ -104,6 +139,13 @@ increasing within a generation and restart only when the generation changes.
### J8.1 — one direct root host ### J8.1 — one direct root host
- Add the Runtime-owned generation-reset transaction and its narrow borrowed
host-retirement acknowledgement.
- Replace the child-by-child canonical portions of App's reset bindings with
that transaction while preserving every App-only stage and the current
projection-before-identity order.
- Prove first reset, callback-fault retry, duplicate reset, and populated-root
reconnect converge without replaying completed entity retirement.
- Add a reusable test-only `NoWindowGameRuntimeHost`. - Add a reusable test-only `NoWindowGameRuntimeHost`.
- Move the existing J5 direct-host scenario onto `host.Runtime` rather than - Move the existing J5 direct-host scenario onto `host.Runtime` rather than
separately constructing six owners. separately constructing six owners.
@ -114,8 +156,9 @@ increasing within a generation and restart only when the generation changes.
- Prove the test assembly/process loads no App, UI, Silk.NET, OpenAL, Arch, - Prove the test assembly/process loads no App, UI, Silk.NET, OpenAL, Arch,
ImGui, or renderer/audio/window type. ImGui, or renderer/audio/window type.
Gate: the direct root host constructs, captures a checkpoint, and converges Gate: graphical and no-window session reset use the same Runtime transaction;
without a presentation assembly or duplicate owner. the direct root host constructs, captures a checkpoint, resets a populated
generation, and converges without a presentation assembly or duplicate owner.
### J8.2 — deterministic transport/content lifecycle ### J8.2 — deterministic transport/content lifecycle
@ -180,6 +223,10 @@ extracting gameplay again.
- duplicate CreateObject and GUID reuse across reconnect; - duplicate CreateObject and GUID reuse across reconnect;
- observer throws during entity, inventory, chat, command, movement, or portal - observer throws during entity, inventory, chat, command, movement, or portal
dispatch; dispatch;
- generation reset fails before host retirement, during one projection
retirement, during the drain acknowledgement, and after canonical
convergence but before identity clear;
- reset retry does not replay an already retired canonical incarnation;
- route creation succeeds but activation fails; - route creation succeeds but activation fails;
- detach throws once, then succeeds; - detach throws once, then succeeds;
- portal cancellation before readiness, after readiness, and with each host - portal cancellation before readiness, after readiness, and with each host