Start with a route contract
Write the test before interpreting its outcome. Identify the starting region, destination, permitted movement actions and expected world state. Specify whether arrival means entering a trigger, standing within a tolerance, or interacting successfully with an object. These are different contracts. A character beside a locked door has not necessarily completed a route through it, even when its distance from the target is small.
Capture the map revision, build identifier, agent radius, height, slope limit and step capability. Include ability unlocks and relevant inventory. In Unity, a NavMeshAgent configuration may differ from the character controller it drives. In Unreal Engine, a Recast navigation representation and a Character Movement Component can likewise disagree about what is traversable. The test should expose that disagreement rather than assume the configurations match.
Classify the earliest broken assumption
Inspect the first point where expected progress diverges from observation. Did the path request return no route? Did it return a partial route? Did the controller receive movement commands that produced no displacement? Did an interaction fail to open a required passage? These observations place the investigation at different boundaries. Record the exact status returned by your system; do not translate every non-success into “stuck.”
A* searches a graph according to its nodes, edges and costs. It cannot certify that the graph accurately represents collision geometry. Recast and Detour provide navigation representations and query capabilities, but project-specific movement, animation and interaction still determine execution. Treat a successful query as evidence about the query, not a guarantee about the complete player journey.