156 lines
7.2 KiB
Markdown
156 lines
7.2 KiB
Markdown
# Slice J5.7 — simulation-ownership closeout
|
||
|
||
Date: 2026-07-26
|
||
Scope: ownership and teardown cleanup only; no retail algorithm, packet,
|
||
timing, collision policy, gameplay outcome, or graphical presentation change
|
||
|
||
## Objective
|
||
|
||
Close the temporary seams left by J5.1–J5.6 so one Runtime lifetime owns the
|
||
complete presentation-independent simulation graph:
|
||
|
||
- canonical entity/object identity and accepted wire state;
|
||
- selection, interaction, combat, magic, and local movement intent;
|
||
- per-session physics, remote motion, projectiles, shadows, and spatial
|
||
worksets;
|
||
- reset, projection withdrawal, and terminal retirement.
|
||
|
||
App remains the graphical host. It supplies physical input, immutable
|
||
DAT/content inputs, transport and projection acknowledgements, then presents
|
||
committed Runtime state through animation, meshes, particles, audio, cameras,
|
||
retained UI, markers, and diagnostics.
|
||
|
||
## Named-retail invariant
|
||
|
||
J5.7 preserves the already-ported retail control flow. The one relocated
|
||
initialization detail follows:
|
||
|
||
- `CPhysicsObj::set_description` at `0x00514F40`
|
||
|
||
CreateObject velocity and angular velocity are installed once when Runtime
|
||
constructs the canonical remote body. Later authoritative Vector updates flow
|
||
through the existing retail timestamp gate and canonical record. App no longer
|
||
constructs a second body or repeats the accepted CreateObject vector install.
|
||
|
||
The projectile, movement, collision, interaction, combat, and spell algorithms
|
||
remain those documented by the preceding J5 evidence notes. No constant,
|
||
branch, packet order, server-authority boundary, or visible effect changed.
|
||
|
||
## Closed ownership gaps
|
||
|
||
Production commit
|
||
`cdee7a4b49addb5e1500753f6a885f7c899bd0f0`:
|
||
|
||
- removes the App remote-motion/physics-host/canonical-runtime/cell/placement
|
||
compatibility aliases after production consumers moved to Runtime types;
|
||
- deletes `LiveEntityRemoteMotionRuntimeView<T>` and the App
|
||
`RemotePhysicsBodyInitializer`;
|
||
- makes `LiveEntityNetworkUpdateController` borrow the canonical
|
||
`LiveEntityRuntime` and delegate body, remote-motion, vector, wakeup, and
|
||
activation work to `RuntimePhysicsState`;
|
||
- makes Runtime install accepted CreateObject velocity and angular velocity
|
||
exactly once at canonical body construction;
|
||
- makes `RuntimeEntityObjectLifetime.CompleteProjectionRetirement` own final
|
||
simulation-component retirement after the App projection acknowledges
|
||
withdrawal;
|
||
- removes App-side mutation of canonical remote/body/host/placement component
|
||
slots;
|
||
- makes current-runtime checkpoints borrow `IRuntimeEntityView` and inventory
|
||
views rather than reconstructing state from App projections or
|
||
`ClientObjectTable`;
|
||
- adds terminal clearing for `PhysicsEngine`, `ShadowObjectRegistry`, spatial
|
||
worksets, collision residence, bodies, hosts, remotes, and projectiles;
|
||
- adds `RuntimeSimulationOwnershipSnapshot`, one terminal ledger spanning
|
||
entity/object, physics, and gameplay ownership;
|
||
- adds a Runtime-only fixture host that drives movement, use, combat, casting,
|
||
and projectile simulation without loading App, UI, Silk.NET, OpenAL, ImGui,
|
||
Arch, or a native window.
|
||
|
||
`ILocalPlayerMotionSource` remains as a presentation-facing source name for
|
||
the animation projection seam. It does not construct, store, or mutate a
|
||
second movement owner; graphical animation borrows the exact
|
||
`RuntimeLocalPlayerMovementState`.
|
||
|
||
## Failure and parity matrix
|
||
|
||
The closeout fixtures cover every J5.7 boundary:
|
||
|
||
| Boundary | Evidence |
|
||
|---|---|
|
||
| construction | per-instance entity/object/physics/gameplay owners; canonical remote-body acquisition; no presentation/backend assembly load |
|
||
| subscription | entity, communication, gameplay, and projection observers isolate failures and detach exactly |
|
||
| command | graphical and direct movement, use, combat, and magic commands reach the same exact owners |
|
||
| projection acknowledgement | vector, rebucket, projectile, and terminal projection failures preserve canonical committed state and allow retry/convergence |
|
||
| reset | interaction, action, movement, session, entity/object, and physics reset paths converge without replay |
|
||
| disposal | combined simulation ledger, physics residence, shadows, worksets, objects, and subscriptions reach exact zero |
|
||
|
||
Normalized graphical/direct parity is pinned by:
|
||
|
||
- `CurrentGameRuntimeAdapterTests.GraphicalAndDirectCombatMagicCommands_ReachTheExactSameOwners`;
|
||
- `CurrentGameRuntimeAdapterTests.DirectAndGraphicalHosts_ProduceIdenticalEntityObjectTrace`;
|
||
- `RuntimeLocalPlayerMovementStateTests.GraphicalAndDirectCommandsMutateOneAutorunLatch`;
|
||
- `RuntimeSimulationFixtureHostTests.RuntimeOnlyHostDrivesCompleteJ5SimulationWithoutPresentation`.
|
||
|
||
The projection-failure fixture additionally proves that a failed graphical
|
||
acknowledgement cannot strand or roll back canonical simulation state:
|
||
|
||
- `RuntimeSimulationFixtureHostTests.ProjectionAcknowledgementFailureStillAllowsTerminalConvergence`.
|
||
|
||
## Automated acceptance
|
||
|
||
On the production commit:
|
||
|
||
- focused App ownership/entity/projectile/hydration suite: 198 passed;
|
||
- Runtime tests: 323 passed;
|
||
- App tests: 3,717 passed / 3 skipped;
|
||
- complete Release solution: 8,596 passed / 5 skipped;
|
||
- Release solution build: zero errors; 17 pre-existing warnings;
|
||
- source/dependency guards pass;
|
||
- `git diff --check` is clean.
|
||
|
||
The combined Runtime fixture loads no presentation or backend assembly and
|
||
its terminal `RuntimeSimulationOwnershipSnapshot.IsConverged` is true after
|
||
normal operation and injected projection failure.
|
||
|
||
## Connected acceptance
|
||
|
||
Both accepted connected gates used the exact rebuilt executable and source
|
||
commit `cdee7a4b49addb5e1500753f6a885f7c899bd0f0`.
|
||
|
||
- Lifecycle/reconnect:
|
||
`logs/connected-world-gate-20260726-160825/report.json`
|
||
passed all seven fresh-login, outdoor, dungeon, revisit, graceful-disconnect,
|
||
and uncapped fresh-process reconnect checkpoints. Both processes exited
|
||
gracefully with code zero, with zero failures and only the 25 expected
|
||
world-edge empty-landblock misses.
|
||
- Canonical nine-stop route:
|
||
`logs/connected-r6-soak-20260726-161406.report.json`
|
||
reported `binaryMatchesSource = true`, materialized all nine destinations,
|
||
passed forward, jump, combat, and authoritative movement-truth exercises at
|
||
Caul, Holtburg, and the Caul return, and exited gracefully with code zero
|
||
and zero failures. Every checkpoint converged with zero pending publication,
|
||
retirement, worker-completion, or destination backlog.
|
||
|
||
The earlier post-commit route
|
||
`logs/connected-r6-soak-20260726-155912.report.json` was behaviorally green
|
||
but is deliberately rejected as exact-binary evidence because its embedded
|
||
binary SHA preceded the source commit. It remains in the audit trail. The
|
||
solution was rebuilt and both accepted gates were then rerun.
|
||
|
||
The user-accepted connected behavior carried through J5 includes local
|
||
movement and target-facing, near/far object use, combat and spell bars,
|
||
projectile presentation, collision, repeated portal/recall, and reconnect.
|
||
J5.7 changes only ownership seams and the exact-binary routes exercise those
|
||
same owners after cleanup.
|
||
|
||
## Divergence and rollback
|
||
|
||
J5.7 removes duplicate ownership and compatibility seams. It introduces no
|
||
new retail behavior or divergence, so the divergence register requires no new
|
||
row.
|
||
|
||
Exact rollback:
|
||
|
||
```text
|
||
git revert cdee7a4b49addb5e1500753f6a885f7c899bd0f0
|
||
```
|