docs(runtime): detail Slice J no-window closeout
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>
This commit is contained in:
parent
b8c90c1959
commit
0a5bc68e70
2 changed files with 221 additions and 0 deletions
217
docs/plans/2026-07-26-modern-runtime-slice-j8.md
Normal file
217
docs/plans/2026-07-26-modern-runtime-slice-j8.md
Normal file
|
|
@ -0,0 +1,217 @@
|
|||
# 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:
|
||||
|
||||
- `RuntimeLiveSessionNoWindowTests` proves a direct session can connect, enter,
|
||||
and stop.
|
||||
- `RuntimeSimulationFixtureHostTests` proves movement, use, attack, cast, and
|
||||
projectile behavior over separately constructed Runtime owners.
|
||||
- `RuntimeWorldTransitDirectHostTests` proves login, portal, cancellation, and
|
||||
host acknowledgements over a separately constructed transit owner.
|
||||
- `GameRuntimeTests` proves 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 `LiveSessionHost` borrowing `GameRuntime.Session`;
|
||||
- one deterministic `ILiveSessionOperations` fixture with a real
|
||||
`WorldSession` and 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:
|
||||
|
||||
1. Construct the root and host; capture the empty checkpoint.
|
||||
2. Start generation 1 through `LiveSessionHost`.
|
||||
3. Bind inbound before connect, select the first fixture character, install
|
||||
exact local identity, enter world, and activate outbound commands.
|
||||
4. 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.
|
||||
5. 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.
|
||||
6. Drive one accepted teleport destination through typed destination
|
||||
readiness, materialization, host projection acknowledgements, world-visible
|
||||
acknowledgement, and completion.
|
||||
7. Capture and compare the ordered Runtime event/checkpoint trace.
|
||||
8. Stop generation 1; prove the old inbound and outbound routes are inert.
|
||||
9. Reconnect as generation 2 in the same process.
|
||||
10. 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.
|
||||
11. 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.Runtime` rather 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:
|
||||
|
||||
```text
|
||||
git revert ce41efb9e5938f79a7580476b949d172f52a1e69
|
||||
```
|
||||
Loading…
Add table
Add a link
Reference in a new issue