acdream/docs/research/2026-07-26-slice-j5-7-simulation-ownership-closeout.md

7.2 KiB
Raw Blame History

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.1J5.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:

git revert cdee7a4b49addb5e1500753f6a885f7c899bd0f0