Commit graph

1 commit

Author SHA1 Message Date
Erik
429775d4c4 docs: #316 investigation — verdict COSMETIC, resolved without a live gate
Report-only per CLAUDE.md's investigation rule; no fix applied and none
approved. Committed so the evidence is not lost.

Verdict: the player arm's airborne-snap block skips the collision-shadow
publish, but the stale shadow self-heals within one object quantum
(~33 ms). Not the #184 invisible-but-solid class.

The reasoning is structural rather than incidental, which is why it
resolved offline instead of needing a connected sample. The per-tick gate
at RuntimeRemotePhysicsUpdater.cs:840 compares the body against
LastShadowSyncPos/Orientation, and those fields are stamped ONLY inside
SyncRemoteShadowToBody immediately after a publish. They therefore record
where the shadow actually is, which makes the gate an invariant check
("is the shadow more than 1 cm / 0.51 degrees from the body?") rather than
a change-detector. The snap's two raw field writes leave that invariant
violated and untouched, so the next quantum sees the full delta and
republishes.

Three findings beyond the question asked:

- One residual does NOT self-heal: past 96 m the activity gate deactivates
  the remote while OnPosition is not distance-gated, so a distant
  player-remote's render entity moves and its shadow does not, until it
  re-enters the bubble. Unobservable in practice — everything that could
  sweep against it is gated by the same rule.
- The "LANDING TRANSITION" naming throughout the file is stale: the
  predicate is !Body.InContact, the whole airborne period, so it fires on
  every airborne update rather than once at the landing edge.
- RuntimeSetPositionState.cs:5037 stamps LastShadowSyncPosition before a
  guard at :5138 that can return ahead of the publish at :5148 — a
  possible masking hole, deliberately not folded in.

Retail note: retail has no separate shadow at all — SetPositionInternal
0x00515330 calls remove_shadows_from_cells/add_shadows_to_cells in the
same transaction, so the skip is a real divergence, just a 33 ms one.

Recommended next step (NOT approved): an offline two-step test composing
the collapse-matrix player-guid landing fixture with one Tick, asserting
the shadow converges. Strictly stronger than a connected sample, which
could only show that nobody noticed 33 ms.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-08-06 06:25:27 +02:00