CrowdFollowingComponent returns successful event too early

I’m using detour crowd for navigation of large number of agents, and I have stumbled upon a weird problem, that I don’t know what to think of. Its symptom is that sometimes an agent will stop navigating too early, sometimes more than 10 meters before reaching his intended target, and yet the OnRequestFinished gets called with Success flag set.
I have tried debugging this, both purely by code breakpoints and visual debugger, and came to the conclusion that the culprit hides in the line 951 (and onward) of CrowdFollowingComponent, in UpdatePathSegment method:


        else if (bFinalPathPart)
        {
            const FVector ToTarget = (GoalLocation - MovementComp->GetActorFeetLocation());
            const bool bMovedTooFar = (bCheckMovementAngle || bCanCheckMovingTooFar) && !CrowdAgentMoveDirection.IsNearlyZero() && FVector::DotProduct(ToTarget, CrowdAgentMoveDirection) < 0.0;

#if ENABLE_VISUAL_LOG
           ...
#endif

            // can't use HasReachedDestination here, because it will use last path point
            // which is not set correctly for partial paths without string pulling
            const float UseAcceptanceRadius = GetFinalAcceptanceRadius(*Path, OriginalMoveRequestGoalLocation, &GoalLocation);
            if (bMovedTooFar || HasReachedInternal(GoalLocation, 0.0f, 0.0f, CurrentLocation, UseAcceptanceRadius, bReachTestIncludesAgentRadius ? MinAgentRadiusPct : 0.0f))
            {
                UE_VLOG(GetOwner(), LogCrowdFollowing, Log, TEXT("Last path segment finished due to \'%s\'"), bMovedTooFar ? TEXT("Missing Last Point") : TEXT("Reaching Destination"));
                OnPathFinished(FPathFollowingResult(EPathFollowingResult::Success, FPathFollowingResultFlags::None));
            }


bFinalPathPart is set somewhere else by the system when last segment of the path has been reached - as for crowd navigation, segment consists of at most 16 navigation polys. Longer path request may have multiple such segments, and if the agent has reached last one, bFinalPathPart is set to true.

This enables evaluation of the bMovedTooFar, which I believe is meant for overshooting prevention, that is should agent reach his destination, and still go further, making his objective suddenly ‘behind’ his current direction, this will be set to true, and in later lines will call OnPathFinished with Success, albeit with a sort of log warning - “Last path segment finished due to Missing Last Point”.

This could seem reasonable, but I fell victim to a case where it’s giving me problems. Imagine that the last segment of the path is sort of a U-turn shape. Your agent enters this segment, and as he starts the U-turn, his objective may for a moment be behind him, thus triggering the bMovedTooFar. He hasn’t reached his goal, but the logic still thinks he has overshoot his target, and calls OnPathFinished.

Do I understand the problem correctly? And if so, how do I use this so that agent can actually reach his goal? I’d think that the overshoot check should only be active at the very last poly of the path, or the bCheckMovementAngle could be disabled, but it’s a runtime flag, also set by ‘Reset’ method, and a protected one, without a way to set it other than to create a child class of CrowdFollowingComponent.

Has anyone experienced similar issue? Or could anyone share his thoughts on the subject?