Three files tested "parity" and none of them said which parity. They were in fact
three different layers, and the seams between them were the useful part, so they are
now one StepCacheParityTests that names them:
ProbeMatchesSlowPath StepProbe vs MovementImpl - is the bake right?
CacheMatchesProbe StepCache vs StepProbe - is it stored and returned intact?
CacheServesReachableWalkStates StepCache vs MovementImpl - end to end, over the states A* visits
Merging them removed a duplicated stub Mobile, duplicated region seeds, and a
filename/class mismatch (StepProbeParityTests.cs declared StaticWalkabilityParityTests).
SwimBake_ProducesWetCells moved with it: it lived in the cache parity file but never
touched the cache - it is a probe test.
The layering is load-bearing, not cosmetic. Offsetting the cache's cell index by one
fails 7 of the 10 parity cases, and the 3 that stay green are exactly the ones that
don't touch the cache - so a failure localizes the fault instead of just reporting one.
Reflection: tests reached into StepCache._chunks via GetField in 9 places to inspect
or inject chunk state, each rebuilding the key and the cell-index arithmetic by hand.
StepCache now exposes GetResidentChunk and ResidentIndexInSync alongside the existing
internal test hooks (LazyReaderHasChunk, CurrentFindGeneration), and the shared
arithmetic moved to PathingTestSupport. All 9 reflection blocks are gone.
StepCacheLifecycleTests is regrouped by what it actually covers - promotion gate,
fallthrough routes, strata, swim layer, eviction - with the Tier4* names dropped
(same internal jargon already removed from the comments) and the repeated
offsets/strata byte-array construction replaced by builders.
Dropped Singleton_IsAvailable: it asserted that an inline-initialized static property
was not null, which it cannot be.
Test count 123 -> 122, entirely from that one removal; every parity case and every
behavioral assertion is preserved.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>