fix(physics): preserve retail edge-slide stop semantics

This commit is contained in:
Erik 2026-07-31 13:03:46 +02:00
parent c559c48d80
commit 4fbd93ecdb
3 changed files with 427 additions and 77 deletions

View file

@ -1110,4 +1110,27 @@ rejects a greater-than-15-tick frozen streak. The earlier dedicated
`Ts4SteepRoofWedgeCaptureTests` remains green, so retiring these four
compensations did not require weakening or deleting the TS-4 control.
### Corrective review: edge_slide has two outputs
The first Slice 1B commit collapsed `CTransition::edge_slide`'s function
return into its out `TransitionState`. That loses a material retail case:
the steep-contact branch writes the result of `cliff_slide` to the out state
but returns false independently. A degenerate/parallel CliffSlide therefore
writes `OK_TS` **and still tells `transitional_insert` to continue its outer
retry**. Branch 1 and the contact-without-remembered-walkable branch stop with
`OK_TS`; a `COLLIDED_TS` Precipice result stops; `SLID_TS` and `ADJUSTED_TS`
retain their ordinary retry handling.
The corrective implementation preserves this exact bool-plus-out-state seam.
Its end-to-end test drives an invalid-contact StepDown probe into a steep,
parallel-last-known CliffSlide, then proves a second outer object pass occurs
before success. The roof controls were also hardened: the flat-roof fixture
must first land and publish its persistent contact/walkable chronology, fails
its control arm when the roof is removed, and proves outward-X rejection plus
continued edge tangency. The steep-roof fixture now rejects non-finite or
oversized frame steps and signed-plane penetration until polygon exit. Parsed
graph and prepared-flat runs compare every `ResolveResult` field and every
persistent `PhysicsBody` field by raw float/double bits, including the ordered
walkable vertex payload.
---