Pin the single-root fixture host, full deterministic lifecycle, fault and isolation matrix, and J7 visual entry gate before implementation begins. Co-authored-by: OpenAI Codex <codex@openai.com>
9.6 KiB
Modern runtime Slice J8 — no-window integration and Slice J closeout
Status: PLANNED — J7 PHYSICAL-DISPLAY ACCEPTANCE IS THE ENTRY GATE
Parent: 2026-07-25-modern-runtime-slice-j.md, J8
Authorization: the user approved Slices F–L, including the J gameplay-owner
gates, on 2026-07-24
Purpose: prove that the exact GameRuntime graph now used by the graphical
client can run a complete deterministic client lifecycle without App, a
window, rendering, retained UI, audio, or backend assemblies.
1. Entry state
J7.1 created the root at 96ddd165. J7.2/J7.3 cut the graphical host and
shutdown transaction over to it at
ce41efb9e5938f79a7580476b949d172f52a1e69. Focused, complete Release,
connected lifecycle/reconnect, and canonical nine-stop automated gates pass.
J8 may begin production/test implementation only after the user accepts J7's
physical-display radar, paperdoll, Use/approach, combat-facing, and recall
matrix.
Existing direct tests prove the individual pieces, but not the complete root:
RuntimeLiveSessionNoWindowTestsproves a direct session can connect, enter, and stop.RuntimeSimulationFixtureHostTestsproves movement, use, attack, cast, and projectile behavior over separately constructed Runtime owners.RuntimeWorldTransitDirectHostTestsproves login, portal, cancellation, and host acknowledgements over a separately constructed transit owner.GameRuntimeTestsproves root construction, isolation, lazy events, leases, rollback, and terminal disposal.
J8 replaces those disconnected proofs with one end-to-end root-host proof. It does not remove the focused tests.
2. Fixed boundary
The integration host lives in AcDream.Runtime.Tests and references only
AcDream.Runtime and its existing transitive Core/Core.Net/Content contracts.
It is a test host, not the Slice-K CLI.
It constructs:
- one
GameRuntime; - one explicit no-window host lease;
- one
LiveSessionHostborrowingGameRuntime.Session; - one deterministic
ILiveSessionOperationsfixture with a realWorldSessionand in-memory transport; - one generation-scoped inbound route;
- one generation-scoped outbound command route;
- one immutable fixture-content catalog for spell and world metadata;
- one
RuntimeTraceRecorder.
It must not construct an App adapter, duplicate entity directory, duplicate object table, duplicate gameplay owner, second clock, second transit owner, or second session controller.
The host applies already-decoded deterministic packets through the same Runtime
owner APIs that the graphical session route uses. Core.Net parser correctness
remains covered by Core.Net wire fixtures; J8 verifies ownership, ordering,
commands, state, generation, and teardown after decode. Test reflection may
raise a WorldSession event only where the public event source deliberately
has no injection API; no production test-only hook is added.
3. Scenario and exact ordering
One canonical scenario runs in this order:
- Construct the root and host; capture the empty checkpoint.
- Start generation 1 through
LiveSessionHost. - Bind inbound before connect, select the first fixture character, install exact local identity, enter world, and activate outbound commands.
- Deliver decoded inbound fixtures:
- local-player CreateObject;
- one hostile creature;
- one usable world object;
- one container and one inventory item;
- one inventory/container mutation;
- one system chat line and one local speech line;
- one vital/character update;
- one environment/time update.
- Advance the instance clock and execute through the root's exact owners:
- movement;
- selection plus use;
- combat mode plus attack;
- learned-spell cast;
- one projectile simulation commit.
- Drive one accepted teleport destination through typed destination readiness, materialization, host projection acknowledgements, world-visible acknowledgement, and completion.
- Capture and compare the ordered Runtime event/checkpoint trace.
- Stop generation 1; prove the old inbound and outbound routes are inert.
- Reconnect as generation 2 in the same process.
- Reuse one server GUID with a new incarnation; prove no generation-1 identity, command, packet, event sequence, inventory, physics, or portal state leaks into generation 2.
- Stop, release the no-window lease, dispose the root, and require
GameRuntimeOwnershipSnapshot.IsConverged.
The fixture trace records lifecycle, entity, inventory, chat, movement, portal, command, and checkpoint rows. Sequence numbers must be strictly increasing within a generation and restart only when the generation changes.
4. Execution
J8.1 — one direct root host
- Add a reusable test-only
NoWindowGameRuntimeHost. - Move the existing J5 direct-host scenario onto
host.Runtimerather than separately constructing six owners. - Borrow root identity, session, entity/object, inventory, character, communication, action, movement, environment, transit, clock, and event source.
- Acquire and release one named host lease.
- Prove the test assembly/process loads no App, UI, Silk.NET, OpenAL, Arch, ImGui, or renderer/audio/window type.
Gate: the direct root host constructs, captures a checkpoint, and converges without a presentation assembly or duplicate owner.
J8.2 — deterministic transport/content lifecycle
- Build deterministic session operations and in-memory transport.
- Bind the exact session lifecycle order: reset → attach inbound → connect → select identity → enter → activate outbound.
- Install immutable spell/world fixture metadata before its dependent packet.
- Route decoded entity, object, inventory, chat, character, environment, and transit fixtures into the root.
- Execute movement, use, attack, cast, and projectile work through root-owned state.
- Complete one portal using the same typed host acknowledgement contract as App.
- Stop and reconnect, then verify generation isolation and GUID reuse.
Gate: one normalized golden trace proves all state and commands share the same root, accepted ordering is stable, and old-generation routes are inert.
J8.3 — cancellation, faults, isolation, and credentials
- Cancel during connect, after inbound attach, during portal readiness, and with a host acknowledgement pending.
- Inject route-construction, route-detach, observer, projection acknowledgement, and terminal callback failures.
- Retry the exact retained suffix and require convergence.
- Run two roots simultaneously with different credentials, clocks, GUIDs, inventory, chat, combat, spell, projectile, and portal state.
- Assert logs contain endpoint/user context only where intended and never contain the password, credential record, or exception text that embeds it.
- Prove a disposed/old route cannot mutate the new generation.
Gate: every fault converges; two roots remain isolated; diagnostics are credential-safe.
J8.4 — complete Slice J gate
- Run focused Runtime tests.
- Run the Release solution build.
- Run the complete Release suite.
- Run exact-binary connected graphical lifecycle/reconnect.
- Run the canonical graphical nine-stop route.
- Reconfirm the accepted J7 physical-display matrix.
- Audit dependency closure, presentation assembly loads, duplicate constructors, mutable statics, retail divergences, and teardown ledgers.
- Update architecture, code structure, milestones, roadmap, parent and umbrella plans, AGENTS/CLAUDE, and durable memory.
Gate: graphical and no-window hosts use the same root and owner graph; packet and command ordering remains stable; terminal ownership converges; no presentation/backend assembly enters the direct process. Slice J is then closed and Slice K may add the Linux multi-session CLI and scheduler without extracting gameplay again.
5. Adversarial matrix
- missing credentials and no characters;
- connect failure before and after route attachment;
- duplicate Start, stale Start, Stop, and Reconnect generations;
- inbound packet before selection and after Stop;
- command before world entry and after route retirement;
- duplicate CreateObject and GUID reuse across reconnect;
- observer throws during entity, inventory, chat, command, movement, or portal dispatch;
- route creation succeeds but activation fails;
- detach throws once, then succeeds;
- portal cancellation before readiness, after readiness, and with each host acknowledgement outstanding;
- projectile projection callback throws;
- host lease retained during root disposal;
- root terminal disposal retries after each stage;
- two roots use the same server GUID without sharing local IDs;
- password-shaped marker absent from trace, logs, exception messages, and test output;
- App/UI/Silk/OpenAL/Arch/ImGui assemblies absent from the loaded-assembly set.
6. Non-goals
- No Linux executable or bot scheduler; those are Slice K.
- No hidden graphical process.
- No renderer, audio, UI, particle, camera, selection-marker, or portal-tunnel stub.
- No new network parser or alternate packet order.
- No asynchronous command queue or extra frame boundary.
- No gameplay-state mirror, facade dictionary, service locator, or test-only production injection API.
- No retail behavior change and therefore no divergence row unless the audit discovers a pre-existing unregistered difference.
7. Commit and rollback discipline
J8 implementation lands as one test/integration closeout commit after the J7
visual entry gate, followed by one documentation closeout commit if needed.
The full production SHA and exact git revert <sha> are recorded here before
Slice K starts. J8 must not modify the J7 rollback point:
git revert ce41efb9e5938f79a7580476b949d172f52a1e69