Program: 55759
Project: 55759
Buggy source:
protected Path findWayAroundObstacle(ShortPoint2D position,Path path){
  if (!path.hasOverNextStep()) {
    return path;
  }
  EDirection direction=EDirection.getApproxDirection(position,path.getOverNextPos());
  AbstractMovableGrid grid=movable.grid;
  EDirection leftDir=direction.getNeighbor(-1);
  EDirection rightDir=direction.getNeighbor(1);
  ShortPoint2D straightPos=direction.getNextHexPoint(position);
  ShortPoint2D twoStraightPos=direction.getNextHexPoint(position,2);
  ShortPoint2D leftPos=leftDir.getNextHexPoint(position);
  ShortPoint2D leftStraightPos=direction.getNextHexPoint(leftPos);
  ShortPoint2D straightLeftPos=leftDir.getNextHexPoint(straightPos);
  ShortPoint2D rightPos=rightDir.getNextHexPoint(position);
  ShortPoint2D rightStraightPos=direction.getNextHexPoint(rightPos);
  ShortPoint2D straightRightPos=rightDir.getNextHexPoint(straightPos);
  ShortPoint2D overNextPos=path.getOverNextPos();
  LinkedList<ShortPoint2D[]> possiblePaths=new LinkedList<ShortPoint2D[]>();
  if (twoStraightPos.equals(overNextPos)) {
    if (isValidPosition(leftPos) && isValidPosition(leftStraightPos)) {
      possiblePaths.add(new ShortPoint2D[]{leftPos,leftStraightPos});
    }
 else     if (isValidPosition(rightPos) && isValidPosition(rightStraightPos)) {
      possiblePaths.add(new ShortPoint2D[]{rightPos,rightStraightPos});
    }
 else {
    }
  }
  if (leftStraightPos.equals(overNextPos) && isValidPosition(leftPos)) {
    possiblePaths.add(new ShortPoint2D[]{leftPos});
  }
  if (rightStraightPos.equals(overNextPos) && isValidPosition(rightPos)) {
    possiblePaths.add(new ShortPoint2D[]{rightPos});
  }
  if ((straightLeftPos.equals(overNextPos) || straightRightPos.equals(overNextPos)) && isValidPosition(straightPos) && grid.hasNoMovableAt(straightPos.x,straightPos.y)) {
    possiblePaths.add(new ShortPoint2D[]{straightPos});
  }
 else {
  }
  for (  ShortPoint2D[] pathPrefix : possiblePaths) {
    ShortPoint2D firstPosition=pathPrefix[0];
    Movable movable=grid.getMovableAt(firstPosition.x,firstPosition.y);
    if (movable == null || movable.isProbablyPushable(this.movable)) {
      path.goToNextStep();
      return new Path(path,pathPrefix);
    }
  }
  return path;
}

Fixed version (ground truth):
protected Path findWayAroundObstacle(ShortPoint2D position,Path path){
  if (!path.hasOverNextStep()) {
    return path;
  }
  EDirection direction=EDirection.getApproxDirection(position,path.getOverNextPos());
  AbstractMovableGrid grid=movable.grid;
  EDirection rightDir=direction.getNeighbor(-1);
  EDirection leftDir=direction.getNeighbor(1);
  ShortPoint2D straightPos=direction.getNextHexPoint(position);
  ShortPoint2D twoStraightPos=direction.getNextHexPoint(position,2);
  ShortPoint2D rightPos=rightDir.getNextHexPoint(position);
  ShortPoint2D rightStraightPos=direction.getNextHexPoint(rightPos);
  ShortPoint2D straightRightPos=rightDir.getNextHexPoint(straightPos);
  ShortPoint2D leftPos=leftDir.getNextHexPoint(position);
  ShortPoint2D leftStraightPos=direction.getNextHexPoint(leftPos);
  ShortPoint2D straightLeftPos=leftDir.getNextHexPoint(straightPos);
  ShortPoint2D overNextPos=path.getOverNextPos();
  LinkedList<ShortPoint2D[]> possiblePaths=new LinkedList<ShortPoint2D[]>();
  if (twoStraightPos.equals(overNextPos)) {
    if (isValidPosition(rightPos) && isValidPosition(rightStraightPos)) {
      possiblePaths.add(new ShortPoint2D[]{rightPos,rightStraightPos});
    }
 else     if (isValidPosition(leftPos) && isValidPosition(leftStraightPos)) {
      possiblePaths.add(new ShortPoint2D[]{leftPos,leftStraightPos});
    }
 else {
    }
  }
  if (rightStraightPos.equals(overNextPos) && isValidPosition(rightPos)) {
    possiblePaths.add(new ShortPoint2D[]{rightPos});
  }
  if (leftStraightPos.equals(overNextPos) && isValidPosition(leftPos)) {
    possiblePaths.add(new ShortPoint2D[]{leftPos});
  }
  if ((straightRightPos.equals(overNextPos) || straightLeftPos.equals(overNextPos)) && isValidPosition(straightPos) && grid.hasNoMovableAt(straightPos.x,straightPos.y)) {
    possiblePaths.add(new ShortPoint2D[]{straightPos});
  }
 else {
  }
  for (  ShortPoint2D[] pathPrefix : possiblePaths) {
    ShortPoint2D firstPosition=pathPrefix[0];
    Movable movable=grid.getMovableAt(firstPosition.x,firstPosition.y);
    if (movable == null || movable.isProbablyPushable(this.movable)) {
      path.goToNextStep();
      return new Path(path,pathPrefix);
    }
  }
  return path;
}