acdream/tests/AcDream.Runtime.Tests
Erik 97d11e6c7f fix(runtime): name why a placement is parked and fail closed when it cannot resolve
Fixes #284 (plan S1).

A first-entry placement that could not be prepared returned
RetrySetupUnavailable and was re-Advanced every pump forever. Nothing counted
it, nothing named its cause, and nothing distinguished "waiting for something
that will arrive" from "waiting for something that never can". That is why
#281's 43 test failures presented as four unrelated symptoms across App and
Runtime instead of one cause, and why a stuck entity in the live client simply
never appears with no log line to follow.

Worse, the two causes were conflated: 670f307c's missing-world-frame park
reported itself as RetrySetupUnavailable, sending anyone diagnosing it to the
prepared-asset pipeline rather than to the absent local-player Create that
actually publishes the frame.

- RetryWorldFrameUnavailable splits the two causes. Call sites now ask
  IsRetryable() instead of comparing against one reason, so a future retry
  reason cannot be silently reclassified as a hard rejection - the exact way
  this class of bug hides.
- The operation retains its RuntimeSetPositionParkReason, and
  RuntimeSetPositionOwnershipSnapshot reports parked work by cause
  (ParkedAwaitingSetupCollisionCount / ParkedAwaitingWorldFrameCount /
  ParkedPlacementCount), so parked placements appear wherever ledgers are
  already asserted.
- ObserveLocalPlayerCreate records the accepted local-player Create even when
  it carries no landblock - precisely the case where no frame is ever
  published - and ThrowIfWorldFrameUnreachable makes that contradiction
  terminal. Waiting is legitimate only while that Create is outstanding; after
  it, no later pump can supply the frame. Same shape as 01f4791e, which made a
  violated receipt-ledger invariant terminal rather than resumable.

This is observability plus fail-fast. There is no timeout, no retry cap, and
no grace period anywhere in it; retryable work still retries exactly as before
and no placement behaviour changed.

The parked counts are deliberately NOT folded into IsConverged: #277 documents
a far Create legitimately parking for a whole session, so a parked entry at
teardown is not automatically a defect. Wiring them into the connected gates
is carried with #277's service-window conversion, where "legitimately parked"
becomes definable.

Runtime 1,012/1,012. Complete Release solution: 10,834 passed / 4 skipped /
0 failed.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-03 13:55:16 +02:00
..
Entities test(runtime): restore the world-frame precondition across first-entry fixtures 2026-08-03 13:32:28 +02:00
Gameplay feat(runtime): C3c - production placement cutover: both hosts on the residence conductors (routes 1+8) 2026-08-02 18:10:33 +02:00
Physics fix(runtime): name why a placement is parked and fail closed when it cannot resolve 2026-08-03 13:55:16 +02:00
Platform feat(linux): add graphical platform services 2026-07-27 11:54:59 +02:00
Session test(runtime): restore the world-frame precondition across first-entry fixtures 2026-08-03 13:32:28 +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