acdream/tests/AcDream.Runtime.Tests
Erik 19d9509497 fix(physics): #307 — PreviousTeleport was always 0 on the live Position path
Shipped defect in route 2 (9966b531), found while reviewing route 4a.

`InboundPhysicsStateController.TryApplyPosition` built its AcceptedPhysicsTimestamps
via `Current(gate, teleportAdvanced: ...)`, omitting `previousTeleport`, which
defaulted to a literal 0. The only site that populated it was the deferred
initial-create path — which is why the continuation executor was correct and
every newer consumer was not.

Consequence in shipped code: route 2 feeds this into
`ValidAcceptedAuthority`, which requires Previous == Accepted for a
ForcePosition. Any local player whose TELEPORT_TS is nonzero — anyone who has
portalled or recalled this session — had the authority rejected and the force
correction SILENTLY DROPPED. The user's @pklite acceptance was genuine but
narrow: that character had not teleported, so the stamp was still 0.

Second latent consequence: with an accepted stamp >= 0x8000, wrap-safe
TeleportRegressed also fires against the 0 and rejects ordinary Apply positions,
not just ForcePosition.

The fix captures `previousTeleport = gate.TeleportTimestamp` BEFORE
`TryAcceptPositionEvent` mutates it, matching the shape the deferred path
already used. Ordering is the whole point: capturing after would make
Previous == Accepted unconditionally, so ValidAcceptedAuthority's check would
pass vacuously — the symptom would disappear while the semantics broke.

Also removes the footgun that allowed it. `Current`'s parameter is now
`ushort? previousTeleport = null` resolving to `gate.TeleportTimestamp`, so the
eleven non-Position channels — none of which can move TELEPORT_TS — get
"previous == current" by omission rather than a literal 0 that is
indistinguishable from a genuine "never teleported".

Consumer audit: only TryApplyPosition was defective. The two route-2 call sites
trace back to it; the RuntimeEntityObjectLifetime sites source from
TryAcceptDeferredPosition and were already correct.

Tests discrimination-verified by reverting the argument to 0: the stamp test
fails Expected 10 / Actual 0, and the classifier test fails Expected
SetPositionSimple / Actual RejectedAuthority — the shipped defect reproduced
exactly.

Gates: complete Release solution 10,935 passed / 4 skipped / 0 failed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 23:48:09 +02:00
..
Entities fix(physics): #307 — PreviousTeleport was always 0 on the live Position path 2026-08-03 23:48:09 +02:00
Gameplay feat(physics): C4 route 2 — ForcePosition through the canonical placement 2026-08-03 18:46:36 +02:00
Physics fix(physics): #297 — keep the PWD bitfield live so PK status reaches the client 2026-08-03 20:59:01 +02:00
Platform feat(linux): add graphical platform services 2026-07-27 11:54:59 +02:00
Session feat(physics): C4 route 2 — ForcePosition through the canonical placement 2026-08-03 18:46:36 +02:00
Support refactor(runtime): unify generation reset for direct hosts 2026-07-27 00:43:26 +02:00
World feat(app): project canonical runtime placements 2026-08-01 15:00:49 +02:00
AcDream.Runtime.Tests.csproj arch(runtime): establish presentation-independent boundary 2026-07-25 17:33:11 +02:00
GameRuntimeContractTests.cs refactor(runtime): acknowledge exact world host projections 2026-07-26 18:27:41 +02:00
GameRuntimeTests.cs feat(headless): complete deterministic bot command parity 2026-07-27 08:23:36 +02:00
NoWindowGameRuntimeHostTests.cs feat(headless): complete deterministic bot command parity 2026-07-27 08:23:36 +02:00
RuntimeDependencyBoundaryTests.cs feat(headless): establish portable Linux host boundary 2026-07-27 01:10:45 +02:00
RuntimeGenerationResetTests.cs feat(headless): complete deterministic bot command parity 2026-07-27 08:23:36 +02:00
RuntimeSimulationFixtureHostTests.cs refactor(runtime): unify generation reset for direct hosts 2026-07-27 00:43:26 +02:00