{
  "article_slug": "annotated-astar-for-multi-size-agents-in-godot",
  "artifact": "Standalone Godot Annotated A* multi-size correctness proof",
  "checks": [
    {
      "details": {
        "anchors_checked": 30,
        "blocked_cell": {
          "x": 3,
          "y": 2
        }
      },
      "id": "clearance_annotation_matches_direct_footprint_expansion",
      "passed": true
    },
    {
      "details": {
        "code": "OK",
        "cost": 8,
        "path": [
          {
            "x": 1,
            "y": 1
          },
          {
            "x": 2,
            "y": 1
          },
          {
            "x": 3,
            "y": 1
          },
          {
            "x": 4,
            "y": 1
          },
          {
            "x": 5,
            "y": 1
          },
          {
            "x": 6,
            "y": 1
          },
          {
            "x": 7,
            "y": 1
          },
          {
            "x": 8,
            "y": 1
          },
          {
            "x": 9,
            "y": 1
          }
        ]
      },
      "id": "one_by_one_agent_crosses_width_one_opening",
      "passed": true
    },
    {
      "details": {
        "code": "OK",
        "cost": 16,
        "path": [
          {
            "x": 1,
            "y": 1
          },
          {
            "x": 2,
            "y": 1
          },
          {
            "x": 3,
            "y": 1
          },
          {
            "x": 3,
            "y": 2
          },
          {
            "x": 3,
            "y": 3
          },
          {
            "x": 3,
            "y": 4
          },
          {
            "x": 3,
            "y": 5
          },
          {
            "x": 4,
            "y": 5
          },
          {
            "x": 5,
            "y": 5
          },
          {
            "x": 6,
            "y": 5
          },
          {
            "x": 6,
            "y": 4
          },
          {
            "x": 6,
            "y": 3
          },
          {
            "x": 6,
            "y": 2
          },
          {
            "x": 6,
            "y": 1
          },
          {
            "x": 7,
            "y": 1
          },
          {
            "x": 8,
            "y": 1
          },
          {
            "x": 9,
            "y": 1
          }
        ]
      },
      "id": "two_by_two_agent_rejects_narrow_opening_and_uses_wide_route",
      "passed": true
    },
    {
      "details": {
        "agent_size": 2,
        "at_anchor": {
          "x": 4,
          "y": 1
        },
        "available_clearance": 1,
        "code": "START_CLEARANCE_INSUFFICIENT",
        "expanded_nodes": 0,
        "ok": false,
        "path": [],
        "required_clearance": 2,
        "total_cost": -1
      },
      "id": "insufficient_start_clearance_fails_before_search",
      "passed": true
    },
    {
      "details": {
        "agent_size": 2,
        "at_anchor": {
          "x": 5,
          "y": 1
        },
        "available_clearance": 1,
        "code": "GOAL_CLEARANCE_INSUFFICIENT",
        "expanded_nodes": 0,
        "ok": false,
        "path": [],
        "required_clearance": 2,
        "total_cost": -1
      },
      "id": "insufficient_goal_clearance_fails_before_search",
      "passed": true
    },
    {
      "details": {
        "path": [
          {
            "x": 1,
            "y": 1
          },
          {
            "x": 2,
            "y": 1
          },
          {
            "x": 3,
            "y": 1
          },
          {
            "x": 3,
            "y": 2
          },
          {
            "x": 3,
            "y": 3
          },
          {
            "x": 3,
            "y": 4
          },
          {
            "x": 3,
            "y": 5
          },
          {
            "x": 4,
            "y": 5
          },
          {
            "x": 5,
            "y": 5
          },
          {
            "x": 6,
            "y": 5
          },
          {
            "x": 6,
            "y": 4
          },
          {
            "x": 6,
            "y": 3
          },
          {
            "x": 6,
            "y": 2
          },
          {
            "x": 6,
            "y": 1
          },
          {
            "x": 7,
            "y": 1
          },
          {
            "x": 8,
            "y": 1
          },
          {
            "x": 9,
            "y": 1
          }
        ],
        "path_length": 17
      },
      "id": "returned_path_anchors_have_clearance_open_footprints_and_cardinal_steps",
      "passed": true
    },
    {
      "details": {
        "cases": 120,
        "reachable": 83,
        "unreachable": 37
      },
      "id": "generated_size_two_and_three_queries_match_direct_footprint_dijkstra",
      "passed": true
    },
    {
      "details": {
        "agent_sizes": [
          1,
          2,
          3
        ],
        "cases": 80
      },
      "id": "weighted_queries_match_dijkstra_optimal_cost",
      "passed": true
    },
    {
      "details": {
        "path": [
          {
            "x": 1,
            "y": 1
          },
          {
            "x": 2,
            "y": 1
          },
          {
            "x": 3,
            "y": 1
          },
          {
            "x": 4,
            "y": 1
          },
          {
            "x": 5,
            "y": 1
          },
          {
            "x": 5,
            "y": 2
          },
          {
            "x": 5,
            "y": 3
          },
          {
            "x": 5,
            "y": 4
          },
          {
            "x": 5,
            "y": 5
          }
        ],
        "runs": 21
      },
      "id": "equal_cost_queries_follow_deterministic_tie_break",
      "passed": true
    },
    {
      "details": {
        "expected": [
          {
            "x": 0,
            "y": 3
          },
          {
            "x": 1,
            "y": 1
          },
          {
            "x": 3,
            "y": 1
          },
          {
            "x": 2,
            "y": 1
          },
          {
            "x": 4,
            "y": 2
          }
        ],
        "popped": [
          {
            "x": 0,
            "y": 3
          },
          {
            "x": 1,
            "y": 1
          },
          {
            "x": 3,
            "y": 1
          },
          {
            "x": 2,
            "y": 1
          },
          {
            "x": 4,
            "y": 2
          }
        ]
      },
      "id": "binary_min_heap_orders_by_f_then_h_then_cell",
      "passed": true
    },
    {
      "details": {
        "bad_goal": "GOAL_OUT_OF_BOUNDS",
        "bad_size": "INVALID_AGENT_SIZE",
        "bad_start": "START_OUT_OF_BOUNDS"
      },
      "id": "invalid_size_and_out_of_bounds_requests_return_named_failures",
      "passed": true
    },
    {
      "details": {
        "size_one_ok": true,
        "size_one_uses_narrow_opening": true,
        "size_three_code": "UNREACHABLE",
        "size_two_ok": true,
        "size_two_path_length": 17,
        "size_two_uses_wide_opening": true
      },
      "id": "runnable_scene_smoke",
      "passed": true
    }
  ],
  "engine": {
    "build": "official",
    "hash": "5b4e0cb0fd279832bbdd69fed5354d4e5ad26f88",
    "hex": 263936,
    "major": 4,
    "minor": 7,
    "patch": 0,
    "status": "stable",
    "string": "4.7-stable (official)",
    "timestamp": 0
  },
  "failed": [],
  "failed_count": 0,
  "measurement_scope": "Correctness proof only. No performance, memory, or throughput claim.",
  "passed": true,
  "passed_count": 12,
  "proof_boundary": {
    "diagonals": "The proof is deliberately four-way. Large-body diagonal corner and transition rules are outside this artifact.",
    "execution": "Animation, touched-cell transitions, and reservations are verified by the separate multi-tile movement and reservation artifacts.",
    "reference": "120 generated size-aware cases and 80 weighted cases are compared with an independent Dijkstra search that validates full footprints directly.",
    "terrain_capability": "The downloadable proof uses one walkability capability. Multiple terrain-capability clearance layers are an extension, not a verified claim here.",
    "verified_here": "Clearance annotations, min-heap A*, 1x1/2x2/3x3 anchor paths, weighted optimality, deterministic ties, and explicit failure codes."
  },
  "query_contract": {
    "anchor": "top-left occupied cell",
    "cost": "positive integer cost of entering the neighbor anchor",
    "footprint": "square N x N",
    "frontier": "binary min-heap with deterministic f, h, y, x ordering",
    "grid": "orthogonal four-way grid",
    "passability": "clearance(anchor) >= agent_size"
  },
  "verified_at": "2026-07-12T05:57:20",
  "published_files": {
    "source_zip": {
      "path": "/downloads/pathforge/annotated-astar-for-multi-size-agents-in-godot-source.zip",
      "bytes": 11449,
      "sha256": "7bc735df871a21d0ccb858a63b0900041277c17a00190441c74068c6ddf7d566"
    },
    "annotated_astar_source": {
      "path_in_zip": "scripts/articles/annotated_astar.gd",
      "sha256": "02dd7038f0f8eb04786e6bfccbf751aaf4f7b245ad18a145eb5ad8f56e19bf4f"
    }
  },
  "extracted_package_rerun": {
    "passed": true,
    "check_count": 12,
    "engine": "4.7-stable (official)"
  }
}
