{
  "article_slug": "action-points-and-terrain-costs-in-godot",
  "artifact": "Standalone Godot action-points and terrain-cost transaction correctness proof",
  "checks": [
    {
      "details": {
        "actual_cost_units": 0,
        "expected_cost_units": 0,
        "path": [
          {
            "x": 1,
            "y": 2
          }
        ]
      },
      "id": "start_cell_cost_is_zero",
      "passed": true
    },
    {
      "details": {
        "actual_cost_units": 6144,
        "entered_ap_costs": [
          1,
          2,
          3
        ],
        "expected_ap": 6,
        "expected_cost_units": 6144
      },
      "id": "terrain_costs_charge_each_entered_cell_once",
      "passed": true
    },
    {
      "details": {
        "remaining_ap": 0,
        "required_ap": 6,
        "state_unchanged": true,
        "target_occupied_hint": false
      },
      "id": "preview_does_not_spend_ap_or_move_unit",
      "passed": true
    },
    {
      "details": {
        "ap_after": 4,
        "ap_before": 10,
        "confirmed_spend": 6,
        "quoted_ap": 6
      },
      "id": "preview_cost_matches_confirmed_spend",
      "passed": true
    },
    {
      "details": {
        "actual_cell": {
          "x": 4,
          "y": 2
        },
        "remaining_ap": 0,
        "required_ap": 6,
        "target": {
          "x": 4,
          "y": 2
        }
      },
      "id": "exact_budget_move_reaches_zero_ap",
      "passed": true
    },
    {
      "details": {
        "available_ap": 5,
        "required_ap": 6,
        "state_unchanged": true
      },
      "id": "insufficient_ap_rejects_without_state_mutation",
      "passed": true
    },
    {
      "details": {
        "current_revision": 2,
        "quoted_revision": 1,
        "state_unchanged_by_confirm": true
      },
      "id": "stale_board_revision_rejects_without_state_mutation",
      "passed": true
    },
    {
      "details": {
        "confirm_reason": "TARGET_OCCUPIED",
        "occupancy_hint": true,
        "occupied_by": 202,
        "state_unchanged": true
      },
      "id": "occupied_target_rejects_without_state_mutation",
      "passed": true
    },
    {
      "details": {
        "history_size": 1,
        "revision_delta": 1,
        "start_occupant": 0,
        "target_occupant": 101,
        "unit_ap": 0,
        "unit_cell": {
          "x": 4,
          "y": 2
        }
      },
      "id": "confirm_updates_occupancy_cell_and_ap_together",
      "passed": true
    },
    {
      "details": {
        "history_size": 0,
        "initial_signature_length": 111,
        "restored_ap": 6,
        "start_occupant": 101,
        "target_occupant": 0,
        "unit_ap": 6,
        "unit_cell": {
          "x": 1,
          "y": 2
        }
      },
      "id": "undo_restores_cell_ap_and_occupancy",
      "passed": true
    },
    {
      "details": {
        "expected_swimmer_ap": 3,
        "infantry_cost": -1,
        "swimmer_cost": 3072,
        "water_cost_for_swimmer_ap": 2
      },
      "id": "movement_profile_changes_or_forbids_terrain_cost",
      "passed": true
    },
    {
      "details": {
        "actual_cell": {
          "x": 5,
          "y": 2
        },
        "history_after": 1,
        "history_before": 1,
        "state_unchanged": true,
        "undo_reason": "UNDO_STATE_MISMATCH"
      },
      "id": "undo_state_mismatch_rejects_and_preserves_history",
      "passed": true
    },
    {
      "id": "packaged_project_rerun_matches_named_checks",
      "passed": true,
      "details": {
        "extracted_logic_check_count": 12,
        "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": "Deterministic correctness proof only. No runtime, throughput, or memory claim.",
  "movement_contract": {
    "confirm": "revision, ownership, occupancy, affordability, and current path cost validate before the first write",
    "cost_semantics": "start cell costs zero; each entered cell is charged once",
    "cost_units_per_ap": 1024,
    "grid": "four-way cell paths supplied by the movement-range layer",
    "preview": "pure quote carrying path, exact cost, required AP, remaining AP, occupancy hint, and board revision",
    "undo": "immediate LIFO restore of cell, AP, and occupancy; mismatched current state fails without consuming history",
    "zero_cost_policy": "authored and profile costs are clamped to at least 1 AP in this baseline"
  },
  "passed": true,
  "passed_count": 13,
  "proof_boundary": {
    "interrupts": "Per-cell overwatch, reactions, and partial-route refunds are outside this whole-route contract.",
    "product_scope": "This standalone article artifact is not a benchmark or a claim about a released PathForge product API.",
    "range_search": "The artifact consumes an already selected cell path. Reachable-range search is proved by the separate tactical movement-range artifact.",
    "simultaneous_orders": "Batch resolution is outside scope; the reservation-table article owns contested queued destinations.",
    "verified_here": "Whole-route shared-AP confirmation over deterministic terrain costs, profile rules, current occupancy, stale revision rejection, and immediate LIFO undo."
  },
  "scene_smoke": {
    "passed": true,
    "report": {
      "board_revision": 1,
      "history_size": 0,
      "phase": "preview",
      "quote_ok": true,
      "quoted_ap": 6,
      "quoted_cost_units": 6144,
      "unit_ap": 6,
      "unit_cell": {
        "x": 1,
        "y": 2
      }
    }
  },
  "verified_at": "2026-07-12T09:51:42",
  "published_files": {
    "source_zip": {
      "path": "/downloads/pathforge/action-points-and-terrain-costs-in-godot-source.zip",
      "bytes": 11978,
      "sha256": "f787ec6c004e4acbd9cbd664d1697f7cafadef167f78141ac6bfd280f2f9e5eb"
    },
    "transaction_source": {
      "path_in_zip": "scripts/articles/tactical_move_transaction.gd",
      "sha256": "60080b65c7ab6364c63e3933b9af1919e57bc7bcf5b8bbd5f56add27432290e4"
    },
    "demo_source": {
      "path_in_zip": "scripts/articles/action_points_terrain_costs_demo.gd",
      "sha256": "cdb4811204de95b787363572f2d8f75160ac32a397f4d3e7b74c853b77783ace"
    }
  },
  "extracted_package_rerun": {
    "passed": true,
    "logic_check_count": 12,
    "published_check_count": 13,
    "check_ids_match_workspace": true,
    "scene_smoke_passed": true,
    "engine": "4.7-stable (official)"
  }
}
