{
  "article_slug": "runtime-astargrid2d-updates-without-full-rebuilds",
  "artifact": "Standalone Godot runtime AStarGrid2D update correctness proof",
  "checks": [
    {
      "id": "grid_initializes_clean",
      "observed": {
        "dirty": false,
        "initialized": true
      },
      "passed": true
    },
    {
      "id": "point_solid_reroutes_without_update",
      "observed": {
        "after": [
          "0,1",
          "1,1",
          "1,2",
          "2,2",
          "3,2",
          "3,1",
          "4,1"
        ],
        "before": [
          "0,1",
          "1,1",
          "2,1",
          "3,1",
          "4,1"
        ],
        "dirty": false
      },
      "passed": true
    },
    {
      "id": "point_unblock_restores_route_without_update",
      "observed": {
        "blocked": [
          "0,1",
          "1,1",
          "1,2",
          "2,2",
          "3,2",
          "3,1",
          "4,1"
        ],
        "restored": [
          "0,1",
          "1,1",
          "2,1",
          "3,1",
          "4,1"
        ]
      },
      "passed": true
    },
    {
      "id": "weight_change_applies_without_update",
      "observed": {
        "after": [
          "0,1",
          "1,1",
          "1,0",
          "2,0",
          "3,0",
          "4,0",
          "4,1"
        ],
        "before": [
          "0,1",
          "1,1",
          "2,1",
          "3,1",
          "4,1"
        ],
        "weight": 20.0
      },
      "passed": true
    },
    {
      "id": "fill_solid_region_applies_without_update",
      "observed": {
        "dirty": false,
        "path_size": 0
      },
      "passed": true
    },
    {
      "id": "query_policy_change_does_not_dirty_grid",
      "observed": {
        "changed": true,
        "diagonal_mode": 3,
        "dirty": false
      },
      "passed": true
    },
    {
      "id": "clean_update_is_noop_and_preserves_point_data",
      "observed": {
        "dirty_before": false,
        "solid_after": true,
        "weight_after": 7.0
      },
      "passed": true
    },
    {
      "id": "region_change_marks_grid_dirty",
      "observed": {
        "dirty": true,
        "region": "[P: (0, 0), S: (6, 3)]"
      },
      "passed": true
    },
    {
      "id": "dirty_update_clears_solidity_and_weights",
      "observed": {
        "dirty_before": true,
        "solid_after": false,
        "weight_after": 1.0
      },
      "passed": true
    },
    {
      "id": "replay_restores_authored_point_data",
      "observed": {
        "authored_solid": true,
        "rebuilt": true,
        "runtime_solid": true,
        "weight": 6.0
      },
      "passed": true
    },
    {
      "id": "overlapping_blocker_release_preserves_remaining_owner",
      "observed": {
        "remaining_owners": 1,
        "solid": true
      },
      "passed": true
    },
    {
      "id": "moving_blocker_replaces_previous_cell_set",
      "observed": {
        "cells": [
          "2,1"
        ],
        "new_count": 1,
        "old_count": 0
      },
      "passed": true
    },
    {
      "id": "invalid_batch_rejects_before_partial_write",
      "observed": {
        "accepted": false,
        "candidate_count": 0,
        "preserved_cells": [
          "1,1"
        ]
      },
      "passed": true
    },
    {
      "id": "packaged_project_rerun_matches_named_checks",
      "passed": true,
      "details": {
        "extracted_logic_check_count": 13,
        "check_ids_match_workspace": true,
        "scene_smoke_passed": true,
        "engine": "4.7-stable (official)"
      }
    }
  ],
  "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 verification only; no performance or timing claim.",
  "passed": true,
  "passed_count": 14,
  "proof_boundary": {
    "performance": "No timing, throughput, or allocation claim is made.",
    "product_scope": "This standalone article artifact is not a claim about a released PathForge product API.",
    "verified_here": "Immediate point-level solidity and weight edits, dirty structural rebuild behavior, explicit point-layer replay, and overlap-safe runtime blocker ownership."
  },
  "scene_smoke": {
    "passed": true,
    "report": {
      "closed_path_avoids_door": true,
      "grid_clean": true,
      "open_path_uses_door": true,
      "runtime_blocker_owner_count": 1,
      "structural_replay_restored_runtime_blocker": true,
      "structural_replay_restored_wall": true
    }
  },
  "update_contract": {
    "point_edits": "Solidity and weight edits apply immediately without update().",
    "structural_edits": "Region, cell size, offset, or cell shape may dirty the grid; update() rebuilds native state and the helper replays authored/runtime layers."
  },
  "verified_at": "2026-07-13T11:11:48",
  "published_files": {
    "source_zip": {
      "path": "/downloads/pathforge/runtime-astargrid2d-updates-without-full-rebuilds-source.zip",
      "bytes": 9285,
      "sha256": "b76e3d1298c8035cf9eee295b31528a5cbb84f73bab6333f9a80339a56f30af3"
    },
    "runtime_state_source": {
      "path_in_zip": "scripts/articles/runtime_astargrid2d_state.gd",
      "sha256": "c76717fc873e391749f628308945305ec68045447758b11f2a983e952adde5a7"
    },
    "demo_source": {
      "path_in_zip": "scripts/articles/runtime_astargrid2d_updates_demo.gd",
      "sha256": "b85379cfa585d0a8f322ce25b24a62fc4db46721b73e90eaa49339d47a94ed6c"
    }
  },
  "extracted_package_rerun": {
    "passed": true,
    "logic_check_count": 13,
    "published_check_count": 14,
    "check_ids_match_workspace": true,
    "scene_smoke_passed": true,
    "engine": "4.7-stable (official)"
  }
}
