docs(runtime): close J3.4 and plan J3.5
This commit is contained in:
parent
5ef8b5371d
commit
d3e96ff912
13 changed files with 562 additions and 58 deletions
|
|
@ -1693,8 +1693,14 @@ port in any phase — no separate listing here.
|
|||
> exact `RuntimeEntityKey`; the compatibility GUID view is deleted. Its 3,761
|
||||
> App tests / 3 skips, 8,444-test / 5-skip complete Release suite, and exact-
|
||||
> binary seven-checkpoint gate pass with two graceful exits, zero failures,
|
||||
> zero render-shadow mismatches, and zero pending deltas. J3.4 canonical object-
|
||||
> table ownership is next.
|
||||
> zero render-shadow mismatches, and zero pending deltas. J3.4 is complete at
|
||||
> `5ef8b537`: one Runtime entity/object lifetime root owns the sole canonical
|
||||
> directory and live `ClientObjectTable`; App and routing borrow both. Its 118
|
||||
> Runtime tests, 3,762 App tests / 3 skips, 8,453-test / 5-skip complete
|
||||
> Release suite, and exact-binary seven-checkpoint gate pass with graceful
|
||||
> exits, zero failures, zero render-shadow mismatches, and zero pending deltas.
|
||||
> J3.5 ordered canonical entity/object deltas and direct borrowed views are
|
||||
> next.
|
||||
> The historical exact cutover
|
||||
> rollback remains
|
||||
> `git revert ef1d263337997bb030eadb7b8e71d73dc659907a`. Slice H is complete:
|
||||
|
|
|
|||
|
|
@ -169,7 +169,14 @@ residency is `0/0/0` at every stable checkpoint and teardown converges. Slice I
|
|||
is deleted. Its 3,761 App tests / 3 skips, 8,444 full Release tests / 5 skips,
|
||||
and exact-binary seven-checkpoint connected gate pass with two graceful
|
||||
exits, zero failures, zero render-shadow mismatches, and zero pending deltas.
|
||||
J3.4 canonical `ClientObjectTable` ownership is next under
|
||||
J3.4 is complete at `5ef8b537`: one presentation-free
|
||||
`RuntimeEntityObjectLifetime` owns the sole entity directory and live
|
||||
`ClientObjectTable`; App and routing borrow the exact instances. Its 118
|
||||
Runtime tests, 3,762 App tests / 3 skips, 8,453 full Release tests / 5 skips,
|
||||
and exact-binary seven-checkpoint connected gate pass with graceful exits,
|
||||
zero failures, zero render-shadow mismatches, and zero pending deltas.
|
||||
J3.5 ordered canonical entity/object deltas and direct borrowed views are
|
||||
next under
|
||||
[`2026-07-25-modern-runtime-slice-j.md`](2026-07-25-modern-runtime-slice-j.md).
|
||||
Slice-I closeout evidence is
|
||||
[`../research/2026-07-25-slice-i7-closeout.md`](../research/2026-07-25-slice-i7-closeout.md).
|
||||
|
|
@ -179,6 +186,8 @@ Slice-J3.2 closeout evidence is
|
|||
[`../research/2026-07-25-slice-j3-2-canonical-entity-directory-closeout.md`](../research/2026-07-25-slice-j3-2-canonical-entity-directory-closeout.md).
|
||||
Slice-J3.3 closeout evidence is
|
||||
[`../research/2026-07-25-slice-j3-3-exact-projection-store.md`](../research/2026-07-25-slice-j3-3-exact-projection-store.md).
|
||||
Slice-J3.4 closeout evidence is
|
||||
[`../research/2026-07-26-slice-j3-4-canonical-object-lifetime.md`](../research/2026-07-26-slice-j3-4-canonical-object-lifetime.md).
|
||||
The historical exact G4 visual rollback remains
|
||||
`git revert ef1d263337997bb030eadb7b8e71d73dc659907a`.
|
||||
|
||||
|
|
|
|||
|
|
@ -2,14 +2,14 @@
|
|||
|
||||
**Date:** 2026-07-24
|
||||
|
||||
**Status:** Slices A–I and J0–J3.3 are complete. Flat-authoritative collision, zero-
|
||||
**Status:** Slices A–I and J0–J3.4 are complete. Flat-authoritative collision, zero-
|
||||
allocation resolve scratch, parsed-graph removal, connected correctness/
|
||||
lifetime acceptance, and Slice-I closeout landed 2026-07-25. Slices F–L were
|
||||
explicitly approved 2026-07-24. Slice J0–J1 established the enforced Runtime
|
||||
boundary and borrowed contract seam; J2 moved canonical session/transport
|
||||
lifetime and ordered inbound routing; J3.1–J3.3 moved canonical entity identity
|
||||
to Runtime and exact graphical projection identity to App. J3.4 is the active
|
||||
execution point.
|
||||
lifetime and ordered inbound routing; J3.1–J3.4 moved canonical entity identity
|
||||
and object-table lifetime to Runtime and exact graphical projection identity
|
||||
to App. J3.5 is the active execution point.
|
||||
|
||||
**Scope:** Reconcile and sequence the existing Modern Pipeline (`MP`) and
|
||||
Linux/headless (`LH`) tracks using the 2026-07-24 connected performance audit.
|
||||
|
|
@ -1250,11 +1250,13 @@ gameplay before removing every production parsed collision graph. Slice I7
|
|||
passes 8,413 Release tests / 5 skips plus both exact-binary connected routes;
|
||||
every stable checkpoint reports zero retained parsed collision graphs. J1 is
|
||||
complete with borrowed contracts, and J2 owns canonical session/transport
|
||||
lifetime plus ordered inbound routing in Runtime. J3.1–J3.3 are complete:
|
||||
lifetime plus ordered inbound routing in Runtime. J3.1–J3.4 are complete:
|
||||
Runtime owns the only entity GUID/incarnation/local-ID directory, and App's
|
||||
materialized sidecars plus spatial/presentation worksets carry exact
|
||||
`RuntimeEntityKey`. J3.4 canonical `ClientObjectTable` ownership is the current
|
||||
execution point.
|
||||
`RuntimeEntityKey`. One `RuntimeEntityObjectLifetime` also owns the exact live
|
||||
`ClientObjectTable`; App is a synchronous borrower. J3.5's ordered canonical
|
||||
entity/object delta stream and direct borrowed views are the current execution
|
||||
point.
|
||||
Evidence:
|
||||
[`../research/2026-07-25-slice-g5-production-profile.md`](../research/2026-07-25-slice-g5-production-profile.md)
|
||||
and
|
||||
|
|
@ -1284,7 +1286,7 @@ honest metrics + committed baselines (A — exit criteria block C)
|
|||
-> delta GPU submission (G)
|
||||
-> residual frame cleanup (H-a, H-b, H-c)
|
||||
-> flat collision assets (I — COMPLETE)
|
||||
-> presentation-independent runtime (J — CURRENT at J3.4)
|
||||
-> presentation-independent runtime (J — CURRENT at J3.5)
|
||||
-> Linux/headless/multi-session (K)
|
||||
-> evidence-gated GPU jobs (L)
|
||||
```
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
# Modern runtime Slice J — presentation-independent runtime
|
||||
|
||||
**Status:** J0–J2 COMPLETE; J3.1–J3.3 COMPLETE; J3.4 canonical object-table
|
||||
ownership is next
|
||||
**Status:** J0–J2 COMPLETE; J3.1–J3.4 COMPLETE; J3.5 ordered canonical
|
||||
entity/object deltas and borrowed views are next
|
||||
**Parent:** `2026-07-24-modern-runtime-architecture.md`, Slice J
|
||||
**Authorization:** the user approved Slices F–L, including the otherwise-frozen
|
||||
Slice J gameplay-owner moves, on 2026-07-24
|
||||
|
|
@ -183,14 +183,17 @@ git revert 75930787741db40a83eab8663e4464dce8d687ba
|
|||
**Detailed execution plan:**
|
||||
[`2026-07-25-modern-runtime-slice-j3.md`](2026-07-25-modern-runtime-slice-j3.md).
|
||||
|
||||
**Current checkpoint:** J3.1–J3.3 are complete. Runtime owns accepted entity
|
||||
**Current checkpoint:** J3.1–J3.4 are complete. Runtime owns accepted entity
|
||||
wire state and the only canonical identity/incarnation/local-ID directory.
|
||||
App's `LiveEntityProjectionStore` and every materialized presentation/spatial
|
||||
workset are keyed by exact `RuntimeEntityKey`; the temporary GUID-shaped
|
||||
compatibility view is deleted. The final J3.3 binary `e937cc36` passes 8,444
|
||||
Release tests / 5 skips and the exact seven-checkpoint connected gate at
|
||||
`logs/connected-world-gate-20260725-221008/report.json`. J3.4 now moves the
|
||||
existing `ClientObjectTable` under the Runtime entity/object lifetime root.
|
||||
compatibility view is deleted. `RuntimeEntityObjectLifetime` now owns the
|
||||
exact entity directory and live `ClientObjectTable`; App, routing, interaction,
|
||||
and UI borrow both. The J3.4 binary `5ef8b537` passes 8,453 Release tests / 5
|
||||
skips and the exact seven-checkpoint connected gate at
|
||||
`logs/connected-world-gate-20260726-055713/report.json`. J3.5 now publishes
|
||||
one committed Runtime entity/object delta stream and replaces App-reconstructed
|
||||
entity/inventory views and events.
|
||||
|
||||
- Strip renderer, particle, Wb, and streaming components from the canonical
|
||||
record into an App projection store keyed only by local identity/incarnation.
|
||||
|
|
|
|||
|
|
@ -1,9 +1,11 @@
|
|||
# Modern runtime J3.4 — canonical object-table ownership
|
||||
|
||||
**Status:** READY
|
||||
**Status:** COMPLETE
|
||||
**Parent:** `2026-07-25-modern-runtime-slice-j3.md`
|
||||
**Required production base:** `e937cc36df39cf6ea1eaba2f9c0243d1929da702`
|
||||
**Prior closeout:** `docs/research/2026-07-25-slice-j3-3-exact-projection-store.md`
|
||||
**Production commit:** `5ef8b5371d8990f0380acd939e71cd711289d429`
|
||||
**Closeout:** `docs/research/2026-07-26-slice-j3-4-canonical-object-lifetime.md`
|
||||
|
||||
## Objective
|
||||
|
||||
|
|
@ -222,8 +224,39 @@ exposes an inventory, paperdoll, selection, or interaction symptom.
|
|||
|
||||
## Rollback
|
||||
|
||||
Record the exact J3.4 production commit here before its connected gate. J3.3
|
||||
remains independently reversible; do not use its rollback for a J3.4 failure.
|
||||
The exact J3.4 rollback is:
|
||||
|
||||
```text
|
||||
git revert 5ef8b5371d8990f0380acd939e71cd711289d429
|
||||
```
|
||||
|
||||
J3.3 remains independently reversible; do not use its rollback for a J3.4
|
||||
failure.
|
||||
|
||||
## Result
|
||||
|
||||
`RuntimeEntityObjectLifetime` now constructs and owns the one
|
||||
`RuntimeEntityDirectory` and one live `ClientObjectTable`. `GameWindow`,
|
||||
session routing, retained UI, interaction, and the graphical projection host
|
||||
borrow those exact instances.
|
||||
|
||||
Accepted CreateObject mutation revalidates the exact canonical record and
|
||||
`CreateIntegrationVersion` before, during, and after synchronous object-table
|
||||
callbacks. Authoritative DeleteObject acceptance uses an exact, single-use
|
||||
Runtime token: the active identity is retired first and retained-object
|
||||
removal then commits before App resource teardown. Dormant/offscreen pruning
|
||||
does not remove retained object information.
|
||||
|
||||
Final gates:
|
||||
|
||||
- Runtime: 118 passed;
|
||||
- App: 3,762 passed / 3 skipped;
|
||||
- complete Release solution: 8,453 passed / 5 skipped;
|
||||
- exact-binary connected lifecycle/reconnect:
|
||||
`logs/connected-world-gate-20260726-055713/report.json`;
|
||||
- two sessions, seven checkpoints, graceful zero-code exits, zero failures,
|
||||
zero render-shadow mismatches, zero pending deltas, and zero pending live
|
||||
teardown/publication/retirement work.
|
||||
|
||||
## Final J3 goal
|
||||
|
||||
|
|
|
|||
|
|
@ -1,6 +1,6 @@
|
|||
# Modern runtime Slice J3 — canonical identity, properties, and object table
|
||||
|
||||
**Status:** ACTIVE
|
||||
**Status:** ACTIVE — J3.1–J3.4 COMPLETE; J3.5 NEXT
|
||||
**Parent:** `2026-07-25-modern-runtime-slice-j.md`, J3
|
||||
**Production base:** `9496c01b`
|
||||
**J2 production commit:** `75930787741db40a83eab8663e4464dce8d687ba`
|
||||
|
|
@ -13,20 +13,22 @@
|
|||
| J3.1 accepted-wire owners | complete | `f7442d13e9ae7d5b077ffecb1f8a10899ad46edd`; 110 Runtime tests and complete Release parity remain green after J3.2 |
|
||||
| J3.2 canonical Runtime entity directory | complete | `f46ddb5cdb1e145752bea49aeb1d62bfe71284d3`; 8,441 Release tests / 5 skips and `logs/connected-world-gate-20260725-200749/report.json` pass |
|
||||
| J3.3 App projection store | complete | `420e5eea70fd2c29cf9c8614e6298a1f84d64045` + `e937cc36df39cf6ea1eaba2f9c0243d1929da702`; 8,444 Release tests / 5 skips and `logs/connected-world-gate-20260725-221008/report.json` pass |
|
||||
| J3.4 canonical object-table ownership | next | [`2026-07-25-modern-runtime-slice-j3-object-table.md`](2026-07-25-modern-runtime-slice-j3-object-table.md): move the existing `ClientObjectTable` into the Runtime entity/object lifetime group while App remains a synchronous borrower |
|
||||
| J3.4 canonical object-table ownership | complete | `5ef8b5371d8990f0380acd939e71cd711289d429`; 118 Runtime tests, 3,762 App tests / 3 skips, 8,453 complete Release tests / 5 skips, and `logs/connected-world-gate-20260726-055713/report.json` pass |
|
||||
| J3.5 ordered deltas and borrowed views | next | [`2026-07-26-modern-runtime-slice-j3-delta-stream.md`](2026-07-26-modern-runtime-slice-j3-delta-stream.md): one committed Runtime entity/object stream and direct borrowed views for graphical and no-window hosts |
|
||||
|
||||
J3.3 passes the Release solution build, 3,761 App tests with three skips, and
|
||||
8,444 complete tests with five expected skips. Its final exact-binary
|
||||
seven-checkpoint connected lifecycle/reconnect route also passes with graceful
|
||||
exits, zero render-shadow mismatches, and zero pending deltas. Runtime is now
|
||||
the sole GUID/incarnation/local-ID authority; every materialized App sidecar,
|
||||
presentation workset, and live spatial visibility edge uses the exact
|
||||
`RuntimeEntityKey`. It adds no frame queue, backend dependency, allocation-order
|
||||
change, or gameplay behavior change. The exact rollback for J3.3 is:
|
||||
J3.4 passes the Release solution build, 118 Runtime tests, 3,762 App tests with
|
||||
three skips, and 8,453 complete tests with five expected skips. Its exact-
|
||||
binary seven-checkpoint connected lifecycle/reconnect route also passes with
|
||||
graceful exits, zero render-shadow mismatches, and zero pending deltas. Runtime
|
||||
now owns one entity/object lifetime root containing both the sole
|
||||
GUID/incarnation/local-ID authority and the sole live `ClientObjectTable`.
|
||||
Graphical presentation and UI borrow those exact instances. Authoritative
|
||||
delete removes retained object information; dormant/offscreen pruning does
|
||||
not. No frame queue, backend dependency, allocation-order change, or gameplay
|
||||
behavior change was added. The exact rollback for J3.4 is:
|
||||
|
||||
```text
|
||||
git revert e937cc36df39cf6ea1eaba2f9c0243d1929da702
|
||||
git revert 420e5eea70fd2c29cf9c8614e6298a1f84d64045
|
||||
git revert 5ef8b5371d8990f0380acd939e71cd711289d429
|
||||
```
|
||||
|
||||
## 1. Objective
|
||||
|
|
@ -222,6 +224,9 @@ move rollback, stack response, GUID reuse, and session-clear traces match.
|
|||
|
||||
### J3.5 — ordered deltas and borrowed views
|
||||
|
||||
**Detailed execution plan:**
|
||||
[`2026-07-26-modern-runtime-slice-j3-delta-stream.md`](2026-07-26-modern-runtime-slice-j3-delta-stream.md).
|
||||
|
||||
- Publish one monotonic per-session Runtime entity/object delta stream.
|
||||
- Make J1 `IGameRuntimeView.Entities` and inventory snapshots read the Runtime
|
||||
owners directly rather than App adapters.
|
||||
|
|
@ -294,12 +299,13 @@ failure; record and revert only the exact failing J3 commit.
|
|||
J3 sub-slices are independently reversible:
|
||||
|
||||
```text
|
||||
git revert 5ef8b5371d8990f0380acd939e71cd711289d429
|
||||
git revert e937cc36df39cf6ea1eaba2f9c0243d1929da702
|
||||
git revert 420e5eea70fd2c29cf9c8614e6298a1f84d64045
|
||||
git revert f46ddb5cdb1e145752bea49aeb1d62bfe71284d3
|
||||
git revert f7442d13e9ae7d5b077ffecb1f8a10899ad46edd
|
||||
```
|
||||
|
||||
Revert J3.3's exact-spatial correction before its main projection-store
|
||||
commit. Revert J3.3 before J3.2, and J3.2 before J3.1, when rolling back more
|
||||
than one sub-slice.
|
||||
Revert J3.4 before J3.3. Revert J3.3's exact-spatial correction before its
|
||||
main projection-store commit. Revert J3.3 before J3.2, and J3.2 before J3.1,
|
||||
when rolling back more than one sub-slice.
|
||||
|
|
|
|||
315
docs/plans/2026-07-26-modern-runtime-slice-j3-delta-stream.md
Normal file
315
docs/plans/2026-07-26-modern-runtime-slice-j3-delta-stream.md
Normal file
|
|
@ -0,0 +1,315 @@
|
|||
# Modern runtime J3.5 — committed entity/object deltas and borrowed views
|
||||
|
||||
**Status:** READY
|
||||
**Parent:** `2026-07-25-modern-runtime-slice-j3.md`
|
||||
**Required production base:** `5ef8b5371d8990f0380acd939e71cd711289d429`
|
||||
**Prior closeout:** `docs/research/2026-07-26-slice-j3-4-canonical-object-lifetime.md`
|
||||
|
||||
## Objective
|
||||
|
||||
Publish one synchronous, monotonic, generation-stamped stream from the
|
||||
canonical Runtime entity/object lifetime and make both graphical and
|
||||
no-window/direct hosts observe those same committed facts.
|
||||
|
||||
`IGameRuntimeView.Entities` and `IGameRuntimeView.Inventory` must read the
|
||||
Runtime-owned `RuntimeEntityDirectory` and `ClientObjectTable` directly.
|
||||
`CurrentGameRuntimeEventAdapter` must stop reconstructing entity changes from
|
||||
App projection visibility and inventory changes from an App-owned event seam.
|
||||
|
||||
This slice adds no later-frame queue, copied world, inventory mirror, input
|
||||
delay, renderer dependency, or gameplay behavior change.
|
||||
|
||||
## Current seam at the production base
|
||||
|
||||
- `RuntimeEntityObjectLifetime` owns the exact directory and object table.
|
||||
- `CurrentGameRuntimeViewAdapter.EntityView` still reads App
|
||||
`LiveEntityRuntime`, so a direct host cannot enumerate canonical entities
|
||||
without constructing the graphical projection host.
|
||||
- Its inventory view reads the right table but asks `LiveEntityRuntime` to
|
||||
recover incarnation metadata.
|
||||
- `CurrentGameRuntimeEventAdapter` owns a separate sequencer and reconstructs:
|
||||
- entity events only from `ProjectionVisibilityChanged`; and
|
||||
- inventory events by subscribing directly to object-table callbacks.
|
||||
- Registered, refreshed, parented, picked-up, state-updated, cellless, and
|
||||
authoritative-delete canonical edges therefore do not have one complete
|
||||
Runtime stream.
|
||||
- Runtime local IDs are still claimed at App materialization rather than at
|
||||
canonical registration, even though direct and graphical hosts require one
|
||||
stable cross-host identity.
|
||||
|
||||
The J1 adapter was intentionally temporary. J3.5 deletes these superseded
|
||||
entity/object adapter responsibilities.
|
||||
|
||||
## Fixed contracts
|
||||
|
||||
### One canonical stream owner
|
||||
|
||||
Add one instance-scoped stream under `AcDream.Runtime.Entities`, owned by
|
||||
`RuntimeEntityObjectLifetime`.
|
||||
|
||||
It exposes a narrow subscription equivalent to:
|
||||
|
||||
```csharp
|
||||
public interface IRuntimeEntityObjectObserver
|
||||
{
|
||||
void OnEntity(in RuntimeEntityDelta delta);
|
||||
void OnInventory(in RuntimeInventoryDelta delta);
|
||||
}
|
||||
|
||||
public interface IRuntimeEntityObjectEventSource
|
||||
{
|
||||
IDisposable Subscribe(IRuntimeEntityObjectObserver observer);
|
||||
}
|
||||
```
|
||||
|
||||
Entity and inventory deltas share one sequence owner. There is no entity queue
|
||||
plus inventory queue and no App repeater. Every stamp carries the exact
|
||||
`RuntimeGenerationToken` and current Runtime frame number.
|
||||
|
||||
Sequence rules:
|
||||
|
||||
- sequence starts at one for each live session generation;
|
||||
- entity and inventory commits consume the same monotonic sequence;
|
||||
- rejected/stale packets consume no sequence;
|
||||
- callback reentrancy appends later sequence values in actual commit order;
|
||||
- session reset publishes its committed withdrawals/removals/clear edge, then
|
||||
the retired generation is sealed;
|
||||
- a replacement generation cannot publish through the retired stream context.
|
||||
|
||||
### Canonical entity identity and snapshot
|
||||
|
||||
Runtime claims a local ID when it creates the canonical active record, before
|
||||
any graphical projection callback. The ID remains stable for that incarnation
|
||||
until canonical teardown; graphical hydration failure must not release a
|
||||
still-active Runtime identity.
|
||||
|
||||
The public entity view is canonical and presentation-free:
|
||||
|
||||
- server GUID;
|
||||
- Runtime local ID;
|
||||
- exact `INSTANCE_TS` incarnation;
|
||||
- full cell;
|
||||
- final physics state;
|
||||
- accepted position/snapshot facts.
|
||||
|
||||
Graphical hydration, loaded/pending visibility, and render-resource state do
|
||||
not become gameplay truth. If retained diagnostic contracts still need
|
||||
attached-host counts, those are supplied by a separate projection
|
||||
acknowledgement/diagnostic seam and are not mixed into canonical entity
|
||||
identity.
|
||||
|
||||
### Commit ordering
|
||||
|
||||
An entity delta is created only after the exact Runtime record mutation
|
||||
commits. The graphical projection host receives that same immutable committed
|
||||
delta synchronously and returns an exact acknowledgement; public observers
|
||||
then observe the same sequence. There is no second conversion step and no
|
||||
frame boundary.
|
||||
|
||||
Required entity edges:
|
||||
|
||||
- `Registered` after active-record/local-ID commit;
|
||||
- `Updated` after same-incarnation CreateObject, ObjDesc, vector, movement,
|
||||
accepted position, parent, or equivalent canonical refresh;
|
||||
- `Rebucketed` after a canonical full-cell change;
|
||||
- `Hidden` after a committed Hidden state transition;
|
||||
- `Withdrawn` after pickup/accepted parent/cellless exit-world while the
|
||||
incarnation remains logically alive;
|
||||
- `Deleted` after authoritative identity retirement and retained-object
|
||||
removal acceptance;
|
||||
- generation replacement orders old `Deleted`/withdrawal before new
|
||||
`Registered`.
|
||||
|
||||
Loaded-to-pending renderer visibility is not a canonical withdrawal and emits
|
||||
no gameplay entity delta.
|
||||
|
||||
Required inventory edges remain the exact object-table callback order:
|
||||
|
||||
- `Added`;
|
||||
- `Updated`;
|
||||
- `Moved`;
|
||||
- `Removed` with exact removed generation;
|
||||
- `Cleared`.
|
||||
|
||||
Unknown-object move notices retain the object ID and placement facts rather
|
||||
than disappearing because no `ClientObject` instance exists.
|
||||
|
||||
### Borrowed views
|
||||
|
||||
The Runtime lifetime group exposes concrete allocation-free
|
||||
`IRuntimeEntityView` and `IRuntimeInventoryView` implementations:
|
||||
|
||||
- entity enumeration walks `RuntimeEntityDirectory.ActiveRecords`;
|
||||
- entity lookup resolves directly through the directory;
|
||||
- inventory enumeration/lookup walks `ClientObjectTable`;
|
||||
- inventory incarnation comes from the exact Runtime directory or the
|
||||
object's retained generation, never an App sidecar;
|
||||
- visitors receive value snapshots and may not retain mutable owners.
|
||||
|
||||
`CurrentGameRuntimeViewAdapter` borrows those view objects. It retains only
|
||||
the still-unmoved J4+ chat/movement/portal/lifecycle composition.
|
||||
|
||||
## Execution
|
||||
|
||||
### 1. Pin the pre-cutover normalized oracle
|
||||
|
||||
Add a focused deterministic fixture covering:
|
||||
|
||||
- create, same-incarnation refresh, and generation replacement;
|
||||
- ObjDesc/property and accepted state/vector/movement/position updates;
|
||||
- parent, pickup, cellless withdrawal, and re-entry;
|
||||
- object add/update/move/remove/clear;
|
||||
- optimistic move, confirm, rejection rollback, and container replacement;
|
||||
- authoritative delete and delete/recreate with the same GUID;
|
||||
- reset and next-generation reuse;
|
||||
- callback reentrancy.
|
||||
|
||||
Record both the canonical final state and exact event order. Preserve existing
|
||||
retail-facing object-table callback order; add missing canonical entity edges
|
||||
without treating projection visibility as gameplay truth.
|
||||
|
||||
### 2. Add the Runtime entity/object stream
|
||||
|
||||
- Add the stream owner and narrow observer/source contracts in Runtime.
|
||||
- Give it one per-generation sequencer and explicit session-generation/frame
|
||||
context.
|
||||
- Use copy-on-write subscriber storage so steady dispatch allocates no observer
|
||||
list and unsubscribe is exact.
|
||||
- Reject duplicate subscriptions, cross-owner subscriptions, stale
|
||||
generations, and dispatch after disposal.
|
||||
- Keep callback execution on the existing update/network-drain thread.
|
||||
- Revalidate generation/incarnation/operation version after any callback that
|
||||
can re-enter Runtime.
|
||||
|
||||
### 3. Move identity allocation to canonical registration
|
||||
|
||||
- Claim the Runtime local ID in the same transaction that installs an active
|
||||
canonical record.
|
||||
- Preserve current allocation range and wrap/exhaustion behavior.
|
||||
- Stop releasing the ID when only App materialization rolls back.
|
||||
- Release it only when the canonical incarnation reaches terminal teardown.
|
||||
- Prove pending/unhydrated and direct-host entities still have exact keys.
|
||||
- Prove GUID reuse gets a new key and stale keys never resolve.
|
||||
|
||||
### 4. Publish canonical entity commits
|
||||
|
||||
- Centralize accepted canonical mutations behind
|
||||
`RuntimeEntityObjectLifetime` transaction methods.
|
||||
- Publish only after state commits and only while the exact operation remains
|
||||
current.
|
||||
- Carry the complete immutable accepted snapshot required by a graphical or
|
||||
direct projection host.
|
||||
- Replace App's projection-visibility-derived entity event reconstruction.
|
||||
- Preserve synchronous graphical projection application and exact retryable
|
||||
teardown acknowledgements.
|
||||
- Do not emit on renderer rebucket, loaded/pending visibility, hydration
|
||||
retries, or other presentation-only changes.
|
||||
|
||||
### 5. Publish exact object-table commits
|
||||
|
||||
- Bind the stream to its owned `ClientObjectTable`.
|
||||
- Convert callbacks to immutable `RuntimeInventoryItemSnapshot` values with
|
||||
generation metadata resolved by Runtime.
|
||||
- Preserve add/update/move/remove/clear order and callback reentrancy.
|
||||
- Keep optimistic movement and rollback synchronous.
|
||||
- Ensure an authoritative delete produces the exact entity/object ordering
|
||||
pinned by J3.4.
|
||||
- Do not add a second retained inventory collection.
|
||||
|
||||
### 6. Replace App entity/object view and event adapters
|
||||
|
||||
- Make `CurrentGameRuntimeViewAdapter.Entities` and `.Inventory` return the
|
||||
Runtime group's borrowed views.
|
||||
- Remove its `LiveEntityRuntime` dependency for canonical entity/inventory
|
||||
reads.
|
||||
- Make `CurrentGameRuntimeEventAdapter` forward the Runtime stream directly.
|
||||
- Remove its `ProjectionVisibilityChanged` and object-table subscriptions.
|
||||
- Retain command, lifecycle, chat, movement, and portal adapter work only until
|
||||
their scheduled J4–J6 owner moves.
|
||||
- Add source guards preventing a new App entity/object mirror, sequencer, or
|
||||
owner-event reconstruction.
|
||||
|
||||
### 7. Direct/graphical parity and teardown
|
||||
|
||||
- Build one no-App Runtime fixture and one graphical-host fixture over the
|
||||
same input script.
|
||||
- Compare normalized generation, sequence, identity, cell/state, properties,
|
||||
placement, and terminal edges exactly.
|
||||
- Verify subscriber removal and Runtime disposal leave zero observers.
|
||||
- Verify reset seals the old generation and a new session begins at sequence
|
||||
one without stale delivery.
|
||||
- Verify graphical callbacks remain same-thread and press-time object reads
|
||||
remain immediate.
|
||||
|
||||
## Adversarial cases
|
||||
|
||||
- Observer adds/removes an observer during dispatch.
|
||||
- Observer creates, deletes, or replaces the same GUID reentrantly.
|
||||
- Observer clears the session during create or object-table callbacks.
|
||||
- Graphical projection callback throws after canonical commit.
|
||||
- Same-incarnation CreateObject arrives while a prior projection teardown is
|
||||
retained.
|
||||
- Authoritative delete races a dormant exact-incarnation record.
|
||||
- Equal, stale, and wrapped timestamps.
|
||||
- Local-ID wrap and namespace exhaustion.
|
||||
- Graphical hydration fails before and after resource registration.
|
||||
- Unknown-object move and removal.
|
||||
- Container replacement mutates contents from inside an event callback.
|
||||
- Multiple Runtime groups use identical GUIDs and session-generation values.
|
||||
- Subscription disposal is replayed and Runtime disposal occurs during a
|
||||
callback.
|
||||
|
||||
## Mandatory gates
|
||||
|
||||
Run in this order:
|
||||
|
||||
1. Runtime stream, borrowed-view, sequence, reentrancy, and identity tests.
|
||||
2. Core `ClientObjectTable*` and `ObjectTableWiring*` tests.
|
||||
3. Focused App Runtime-adapter, hydration, update, rebucket, deletion, reset,
|
||||
inventory, paperdoll, selection, interaction, and cooldown tests.
|
||||
4. Direct-host versus graphical-host normalized parity fixture.
|
||||
5. All Runtime tests.
|
||||
6. All App tests.
|
||||
7. `dotnet build AcDream.slnx -c Release`.
|
||||
8. `dotnet test AcDream.slnx -c Release --no-build`.
|
||||
9. Exact-binary connected lifecycle/reconnect gate.
|
||||
10. At every connected checkpoint: zero render-shadow mismatches, zero pending
|
||||
deltas, graceful process exit, and exact canonical/projection teardown
|
||||
convergence.
|
||||
|
||||
A user visual pause is required only if an automated or connected gate exposes
|
||||
a visible inventory, selection, radar, paperdoll, or world-object symptom.
|
||||
|
||||
## Acceptance
|
||||
|
||||
- Runtime owns one per-session ordered entity/object stream.
|
||||
- Entity and inventory deltas share one generation/sequence order.
|
||||
- Runtime views read the directory and object table directly.
|
||||
- Every active canonical entity has a Runtime key before App projection.
|
||||
- App reconstructs neither entity nor inventory events.
|
||||
- Projection visibility is not emitted as canonical gameplay withdrawal.
|
||||
- Graphical and no-window normalized traces are identical.
|
||||
- No copied collection, queue, extra input frame, or backend dependency exists.
|
||||
- Reentrant callbacks cannot resurrect or mutate a superseded incarnation.
|
||||
- Reset/disposal leaves zero observers, queued deltas, and retained stream
|
||||
state.
|
||||
- Complete Release and exact connected gates pass on one committed binary.
|
||||
|
||||
## Rollback
|
||||
|
||||
Record the exact J3.5 production commit here before its connected gate. J3.4
|
||||
remains independently reversible:
|
||||
|
||||
```text
|
||||
git revert 5ef8b5371d8990f0380acd939e71cd711289d429
|
||||
```
|
||||
|
||||
Do not revert J3.4 as a shortcut for a J3.5 failure.
|
||||
|
||||
## Next boundary
|
||||
|
||||
J3.6 failure-injects the complete canonical entity/object lifecycle and proves
|
||||
zero records, tombstones, projections, resources, container entries, parent
|
||||
candidates, subscriptions, or pending deltas after reset and disposal. That
|
||||
closeout is required before J4 moves chat, inventory transactions, vitals,
|
||||
enchantments, spells/components, cooldowns, and ViewModel-facing revisions.
|
||||
Loading…
Add table
Add a link
Reference in a new issue