fix(physics): guard the world-frame agreement proven unreachable by measurement
Closes #283 (plan S3) - as UNREACHABLE, not by restructuring ownership. acdream has two owners that convert a landblock-local network origin into the streamed world frame: LiveWorldOriginState for presentation/streaming, and RuntimePhysicsState.TryGetWorldFrameOffset for placement. They rebase on different edges - Runtime the instant an accepted Position carries TeleportAdvanced, App only once StreamingOriginRecenterCoordinator observes old-window retirement completion, many frames later. A one-landblock disagreement places an entity 192 m from the geometry around it: the same failure family as the zero-offset bug670f307cfixed, with a wrong origin instead of a missing one. The plan's first step was to prove or disprove reachability BEFORE moving ownership, because a restructure on a hypothesis is churn. The probe added in898ff18banswered it: a connected Release session recorded ZERO disagreements across 11 completed reveals and six destination landblocks (0x0904, 0x1134, 0x3032, 0x8763, 0xA9B4, 0xF682) spanning roughly 45 km. A gap of even one frame would have printed an offset in the tens of thousands of metres. Cause of the safety: BeginOriginRecenter detaches EVERY resident landblock before the new origin is adopted, so the two rebases are serialized and no conversion can observe the gap. Ownership is therefore left exactly as it is. What lands instead is the invariant that keeps it true. LiveWorldOriginState.EnsureAgreesWithRuntimeFrame is checked at the landblock->world conversion and is terminal on disagreement, converting a silent 192 m-multiple misplacement into a loud failure with the offset in metres and the landblock being projected. Six focused tests pin it, including the cross-world portal case (0x09 -> 0xF6 = 45,504 m). Disagreement can no longer reach the probe, so ACDREAM_PROBE_WORLD_FRAME now emits a verbose per-conversion agreement trace - useful when a placement looks displaced for some reason OTHER than a frame disagreement. Complete Release solution: 10,844 passed / 4 skipped / 0 failed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
parent
898ff18b26
commit
89cf1e66d0
5 changed files with 183 additions and 22 deletions
|
|
@ -71,12 +71,19 @@ public static class PhysicsDiagnostics
|
|||
/// anything converted in that gap lands a multiple of 192 m from the
|
||||
/// geometry App is building.
|
||||
///
|
||||
/// <para>When true, every projected placement compares Runtime's frame
|
||||
/// centre against App's origin centre and emits one
|
||||
/// <c>[world-frame]</c> line per DISAGREEMENT only — silence means the
|
||||
/// window is never observed. This exists to prove or disprove
|
||||
/// reachability before any ownership is restructured; it is a
|
||||
/// measurement, never a gate. Initial state from
|
||||
/// <para>A 2026-08-03 connected run answered that question: 11 reveals
|
||||
/// across six landblocks spanning ~45 km recorded ZERO disagreements,
|
||||
/// because the recenter detaches every resident landblock before adopting
|
||||
/// the new origin and so serializes the two rebases. Disagreement is now
|
||||
/// a terminal invariant
|
||||
/// (<c>LiveWorldOriginState.EnsureAgreesWithRuntimeFrame</c>) rather than
|
||||
/// something to observe.</para>
|
||||
///
|
||||
/// <para>When true, this now emits one verbose <c>[world-frame] agree</c>
|
||||
/// line per projected conversion recording the centre both owners used —
|
||||
/// what you want when investigating a placement that looks displaced but
|
||||
/// is NOT a frame disagreement. Measurement only; it never gates
|
||||
/// placement. Initial state from
|
||||
/// <c>ACDREAM_PROBE_WORLD_FRAME=1</c>.</para>
|
||||
/// </summary>
|
||||
public static bool ProbeWorldFrameEnabled { get; set; } =
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue