{
  "article_slug": "a-star-pathfinding-starter-godot-csharp",
  "artifact": "Standalone Godot C#/.NET A* pathfinding starter scene",
  "verified_at": "2026-07-16T08:32:47.0474339Z",
  "engine": {
    "string": "4.7.1-stable (official)",
    "status": "stable",
    "build": "official",
    "hash": "a13da4feb8d8aefc283c3763d33a2f170a18d541"
  },
  "dotnet": {
    "target_framework": "net8.0",
    "runtime_version": "10.0.10"
  },
  "measurement_scope": "Deterministic baseline-path correctness and runnable-scene behavior only. No timing, FPS, memory, language-comparison, engine-comparison, or production-readiness claim.",
  "algorithm_contract": {
    "grid": "Rectangular bounded grid.",
    "neighbours": "Four cardinal neighbours in a fixed order.",
    "movement_cost": "Every legal step costs one.",
    "heuristic": "Manhattan distance.",
    "frontier": "Stable custom binary min-heap ordered by total estimated cost, then insertion order.",
    "state": "Closed set, integer cost-so-far dictionary, and parent reconstruction.",
    "failure": "Invalid, blocked, or unreachable endpoints return an empty path."
  },
  "proof_boundary": {
    "verified_here": "Shortest path length against an independent BFS reference, obstacle avoidance, cardinal adjacency, endpoint guards, heap ordering, the authored editor-visible hierarchy, route visibility, agent traversal, and a visible no-path case.",
    "not_verified": "Weighted terrain, diagonal movement, smoothing, dynamic blockers, multi-cell footprints, avoidance, navigation meshes, crowds, Web export, or runtime performance.",
    "comparison": "This receipt covers only the Godot C#/.NET starter. It makes no matched-output, code-size, or ranking claim against GDScript or Unity.",
    "product_scope": "This standalone educational project does not use or claim a released PathForge product API."
  },
  "scene_smoke": {
    "passed": true,
    "details": {
      "initial": {
        "ready": true,
        "authored_scene_nodes": {
          "board": true,
          "path_line": true,
          "path_dots": true,
          "agent": true,
          "goal": true,
          "status": true
        },
        "grid_size": {
          "x": 15,
          "y": 9
        },
        "start_cell": {
          "x": 1,
          "y": 4
        },
        "agent_cell": {
          "x": 1,
          "y": 4
        },
        "goal_cell": {
          "x": 13,
          "y": 4
        },
        "isolated_cell": {
          "x": 12,
          "y": 1
        },
        "path_cell_count": 21,
        "visible_path_segment_count": 20,
        "path_is_cardinal": true,
        "path_avoids_blocked_cells": true,
        "moving": true,
        "destination_reached": false,
        "no_path_visible": false,
        "status": "Path: 20 steps • moving"
      },
      "authored_scene_complete": true,
      "after_movement": {
        "ready": true,
        "authored_scene_nodes": {
          "board": true,
          "path_line": true,
          "path_dots": true,
          "agent": true,
          "goal": true,
          "status": true
        },
        "grid_size": {
          "x": 15,
          "y": 9
        },
        "start_cell": {
          "x": 1,
          "y": 4
        },
        "agent_cell": {
          "x": 13,
          "y": 4
        },
        "goal_cell": {
          "x": 13,
          "y": 4
        },
        "isolated_cell": {
          "x": 12,
          "y": 1
        },
        "path_cell_count": 21,
        "visible_path_segment_count": 20,
        "path_is_cardinal": true,
        "path_avoids_blocked_cells": true,
        "moving": false,
        "destination_reached": true,
        "no_path_visible": false,
        "status": "Destination reached • click another cell or press R"
      },
      "waited_process_frames": 1,
      "isolated_destination": {
        "ready": true,
        "authored_scene_nodes": {
          "board": true,
          "path_line": true,
          "path_dots": true,
          "agent": true,
          "goal": true,
          "status": true
        },
        "grid_size": {
          "x": 15,
          "y": 9
        },
        "start_cell": {
          "x": 1,
          "y": 4
        },
        "agent_cell": {
          "x": 13,
          "y": 4
        },
        "goal_cell": {
          "x": 12,
          "y": 1
        },
        "isolated_cell": {
          "x": 12,
          "y": 1
        },
        "path_cell_count": 0,
        "visible_path_segment_count": 0,
        "path_is_cardinal": true,
        "path_avoids_blocked_cells": true,
        "moving": false,
        "destination_reached": false,
        "no_path_visible": true,
        "status": "No path to (12, 1)"
      }
    }
  },
  "passed": true,
  "passed_count": 10,
  "failed_count": 0,
  "failed": [],
  "checks": [
    {
      "id": "finds_shortest_path_on_open_grid",
      "passed": true,
      "observed": {
        "path": [
          {
            "x": 0,
            "y": 0
          },
          {
            "x": 1,
            "y": 0
          },
          {
            "x": 2,
            "y": 0
          },
          {
            "x": 3,
            "y": 0
          },
          {
            "x": 4,
            "y": 0
          },
          {
            "x": 4,
            "y": 1
          },
          {
            "x": 4,
            "y": 2
          },
          {
            "x": 4,
            "y": 3
          }
        ],
        "expected_cell_count": 8,
        "actual_cell_count": 8
      }
    },
    {
      "id": "routes_around_blocked_cells_with_shortest_length",
      "passed": true,
      "observed": {
        "path": [
          {
            "x": 0,
            "y": 3
          },
          {
            "x": 1,
            "y": 3
          },
          {
            "x": 2,
            "y": 3
          },
          {
            "x": 2,
            "y": 4
          },
          {
            "x": 3,
            "y": 4
          },
          {
            "x": 4,
            "y": 4
          },
          {
            "x": 5,
            "y": 4
          },
          {
            "x": 5,
            "y": 3
          },
          {
            "x": 5,
            "y": 2
          },
          {
            "x": 5,
            "y": 1
          },
          {
            "x": 5,
            "y": 0
          },
          {
            "x": 6,
            "y": 0
          },
          {
            "x": 7,
            "y": 0
          },
          {
            "x": 8,
            "y": 0
          },
          {
            "x": 8,
            "y": 1
          },
          {
            "x": 8,
            "y": 2
          },
          {
            "x": 8,
            "y": 3
          }
        ],
        "astar_steps": 16,
        "reference_bfs_steps": 16
      }
    },
    {
      "id": "returns_empty_when_destination_is_unreachable",
      "passed": true,
      "observed": {
        "path": [],
        "isolated_goal": {
          "x": 1,
          "y": 1
        }
      }
    },
    {
      "id": "path_contains_only_cardinal_neighbours",
      "passed": true,
      "observed": {
        "path": [
          {
            "x": 0,
            "y": 2
          },
          {
            "x": 1,
            "y": 2
          },
          {
            "x": 1,
            "y": 3
          },
          {
            "x": 1,
            "y": 4
          },
          {
            "x": 2,
            "y": 4
          },
          {
            "x": 3,
            "y": 4
          },
          {
            "x": 4,
            "y": 4
          },
          {
            "x": 5,
            "y": 4
          },
          {
            "x": 5,
            "y": 3
          },
          {
            "x": 5,
            "y": 2
          }
        ]
      }
    },
    {
      "id": "path_never_enters_blocked_cells",
      "passed": true,
      "observed": {
        "path": [
          {
            "x": 0,
            "y": 2
          },
          {
            "x": 1,
            "y": 2
          },
          {
            "x": 1,
            "y": 3
          },
          {
            "x": 1,
            "y": 4
          },
          {
            "x": 2,
            "y": 4
          },
          {
            "x": 3,
            "y": 4
          },
          {
            "x": 4,
            "y": 4
          },
          {
            "x": 5,
            "y": 4
          },
          {
            "x": 5,
            "y": 3
          },
          {
            "x": 5,
            "y": 2
          }
        ],
        "blocked": [
          {
            "x": 2,
            "y": 1
          },
          {
            "x": 2,
            "y": 2
          },
          {
            "x": 2,
            "y": 3
          }
        ]
      }
    },
    {
      "id": "start_equals_goal_returns_single_cell",
      "passed": true,
      "observed": {
        "path": [
          {
            "x": 2,
            "y": 2
          }
        ]
      }
    },
    {
      "id": "out_of_bounds_endpoints_return_empty",
      "passed": true,
      "observed": {
        "invalid_start_path": [],
        "invalid_goal_path": []
      }
    },
    {
      "id": "heap_pops_lowest_priority_first",
      "passed": true,
      "observed": {
        "priorities": [
          3,
          3,
          5,
          8
        ],
        "cells": [
          {
            "x": 2,
            "y": 0
          },
          {
            "x": 4,
            "y": 0
          },
          {
            "x": 3,
            "y": 0
          },
          {
            "x": 1,
            "y": 0
          }
        ]
      }
    },
    {
      "id": "runnable_scene_draws_path_moves_agent_and_shows_no_path",
      "passed": true,
      "observed": {
        "initial": {
          "ready": true,
          "authored_scene_nodes": {
            "board": true,
            "path_line": true,
            "path_dots": true,
            "agent": true,
            "goal": true,
            "status": true
          },
          "grid_size": {
            "x": 15,
            "y": 9
          },
          "start_cell": {
            "x": 1,
            "y": 4
          },
          "agent_cell": {
            "x": 1,
            "y": 4
          },
          "goal_cell": {
            "x": 13,
            "y": 4
          },
          "isolated_cell": {
            "x": 12,
            "y": 1
          },
          "path_cell_count": 21,
          "visible_path_segment_count": 20,
          "path_is_cardinal": true,
          "path_avoids_blocked_cells": true,
          "moving": true,
          "destination_reached": false,
          "no_path_visible": false,
          "status": "Path: 20 steps • moving"
        },
        "authored_scene_complete": true,
        "after_movement": {
          "ready": true,
          "authored_scene_nodes": {
            "board": true,
            "path_line": true,
            "path_dots": true,
            "agent": true,
            "goal": true,
            "status": true
          },
          "grid_size": {
            "x": 15,
            "y": 9
          },
          "start_cell": {
            "x": 1,
            "y": 4
          },
          "agent_cell": {
            "x": 13,
            "y": 4
          },
          "goal_cell": {
            "x": 13,
            "y": 4
          },
          "isolated_cell": {
            "x": 12,
            "y": 1
          },
          "path_cell_count": 21,
          "visible_path_segment_count": 20,
          "path_is_cardinal": true,
          "path_avoids_blocked_cells": true,
          "moving": false,
          "destination_reached": true,
          "no_path_visible": false,
          "status": "Destination reached • click another cell or press R"
        },
        "waited_process_frames": 1,
        "isolated_destination": {
          "ready": true,
          "authored_scene_nodes": {
            "board": true,
            "path_line": true,
            "path_dots": true,
            "agent": true,
            "goal": true,
            "status": true
          },
          "grid_size": {
            "x": 15,
            "y": 9
          },
          "start_cell": {
            "x": 1,
            "y": 4
          },
          "agent_cell": {
            "x": 13,
            "y": 4
          },
          "goal_cell": {
            "x": 12,
            "y": 1
          },
          "isolated_cell": {
            "x": 12,
            "y": 1
          },
          "path_cell_count": 0,
          "visible_path_segment_count": 0,
          "path_is_cardinal": true,
          "path_avoids_blocked_cells": true,
          "moving": false,
          "destination_reached": false,
          "no_path_visible": true,
          "status": "No path to (12, 1)"
        }
      }
    },
    {
      "id": "packaged_project_restores_builds_and_reruns_cleanly",
      "passed": true,
      "observed": {
        "extracted_check_count": 9,
        "check_ids_match_workspace": true,
        "scene_smoke_passed": true,
        "dotnet_restore_passed": true,
        "dotnet_build_warnings": 0,
        "dotnet_build_errors": 0,
        "engine": "4.7.1-stable (official)",
        "target_framework": "net8.0",
        "runtime_version": "10.0.10"
      }
    }
  ],
  "published_files": {
    "source_zip": {
      "path": "/downloads/pathfinding/a-star-pathfinding-starter-godot-csharp-source.zip",
      "bytes": 14373,
      "sha256": "b485d2ffa35204f87667b5e78abc8464f0ce1d5076dc95c36fab020f183dbc81"
    },
    "files": {
      "astarstartergodotcsharp_csproj": {
        "path_in_zip": "AStarStarterGodotCSharp.csproj",
        "sha256": "1e1759618cf4d554d4a34ae32d8c72f491398ee925442ffc8e5d0bacdeca15c9"
      },
      "project_godot": {
        "path_in_zip": "project.godot",
        "sha256": "aada37e546c8c560fa78b6bd8fadbf298782d8efef10b556b9434f7d76c2eaea"
      },
      "readme_md": {
        "path_in_zip": "README.md",
        "sha256": "cd5702e1a246a15cd14bee512e2f43d50dc53d7c955e6d9848fee66ba6cb9348"
      },
      "license": {
        "path_in_zip": "LICENSE",
        "sha256": "8429a4194733f32d64f3447cd65ebc3ae904adc0e92001aa6a7998e77ac5ca0b"
      },
      "scripts_astargrid_cs": {
        "path_in_zip": "Scripts/AStarGrid.cs",
        "sha256": "c147343d4e7c8a1a2f83b5ef4044ae4b45c3e454e2bad3197dc5f4857485c5c7"
      },
      "scripts_astarstarterboard_cs": {
        "path_in_zip": "Scripts/AStarStarterBoard.cs",
        "sha256": "f02f459d815773ffa66bde619663878c0703362d7fa693be968faff22c8f2c8c"
      },
      "scripts_astarstartercontroller_cs": {
        "path_in_zip": "Scripts/AStarStarterController.cs",
        "sha256": "e275a7fc3e2b5c6214d691268565e69ae12f62bb5fd392d3ef6ee3d79ee78152"
      },
      "scripts_astarstartermarker_cs": {
        "path_in_zip": "Scripts/AStarStarterMarker.cs",
        "sha256": "6eb7ef21813a6a8c500fae0a548d6ae276b2977c21df1c1905cd4caf50f0b357"
      },
      "scripts_astarstarterpathdots_cs": {
        "path_in_zip": "Scripts/AStarStarterPathDots.cs",
        "sha256": "df7210450bfb5635bf7b993ac2625605d221ab9b3d811de2d133038f70cb2925"
      },
      "scenes_astarstartercsharp_tscn": {
        "path_in_zip": "scenes/AStarStarterCSharp.tscn",
        "sha256": "e4fa9fe6c33821abf10f59ed4a9caeb3297387da231138856e1bee3462b0d625"
      },
      "tools_verifyastarstarter_cs": {
        "path_in_zip": "tools/VerifyAStarStarter.cs",
        "sha256": "993fd8e8fc10fb7555eb52b7f1d8382d28ed7a55e4a667b0657782308790e3d8"
      },
      "tools_verifyastarstarter_tscn": {
        "path_in_zip": "tools/VerifyAStarStarter.tscn",
        "sha256": "8b2aab320243a384cc50fa9e431727580acf610afbddcd1d966e3dbd3d794b76"
      }
    }
  },
  "extracted_package_rerun": {
    "passed": true,
    "workspace_check_count": 9,
    "published_check_count": 10,
    "check_ids_match_workspace": true,
    "scene_smoke_passed": true,
    "dotnet_restore_passed": true,
    "dotnet_build_warnings": 0,
    "dotnet_build_errors": 0,
    "engine": "4.7.1-stable (official)",
    "target_framework": "net8.0",
    "runtime_version": "10.0.10"
  }
}
