{
  "article_slug": "turn-order-and-movement-planning-in-godot",
  "artifact": "Standalone Godot turn-order and movement-planning correctness proof",
  "checks": [
    {
      "details": {
        "actual": [
          10,
          20
        ],
        "expected": [
          10,
          20
        ]
      },
      "id": "higher_initiative_resolves_first",
      "passed": true
    },
    {
      "details": {
        "actual": [
          20,
          10
        ],
        "unit_10_sequence": 9,
        "unit_20_sequence": 2
      },
      "id": "equal_initiative_uses_command_sequence",
      "passed": true
    },
    {
      "details": {
        "actual": [
          10,
          20
        ],
        "equal_command_sequence": 1,
        "equal_initiative": 18
      },
      "id": "stable_unit_id_is_final_tiebreaker",
      "passed": true
    },
    {
      "details": {
        "forward_registration_result": [
          10,
          20,
          30
        ],
        "reverse_registration_result": [
          10,
          20,
          30
        ]
      },
      "id": "registration_order_does_not_change_result",
      "passed": true
    },
    {
      "details": {
        "after": "1,1:10|5,1:20||10@1,1|20@5,1",
        "before": "1,1:10|5,1:20||10@1,1|20@5,1",
        "plan_count": 1
      },
      "id": "planning_does_not_mutate_board",
      "passed": true
    },
    {
      "details": {
        "plan_count": 1,
        "reason": "UNIT_ALREADY_PLANNED"
      },
      "id": "duplicate_unit_plan_is_rejected",
      "passed": true
    },
    {
      "details": {
        "intent_after_mutation": [
          {
            "x": 1,
            "y": 1
          },
          {
            "x": 2,
            "y": 2
          }
        ],
        "source_after_mutation": [
          {
            "x": 1,
            "y": 1
          },
          {
            "x": 1,
            "y": 2
          }
        ],
        "stored_path": [
          {
            "x": 1,
            "y": 1
          },
          {
            "x": 2,
            "y": 1
          }
        ]
      },
      "id": "plans_are_isolated_copies",
      "passed": true
    },
    {
      "details": {
        "current_round": 1,
        "intent_round": 0,
        "reason": "WRONG_ROUND"
      },
      "id": "wrong_round_plan_is_rejected",
      "passed": true
    },
    {
      "details": {
        "board_after_resolve": "5,1:20||20@5,1",
        "board_before_resolve": "5,1:20||20@5,1",
        "reason": "UNIT_MISSING"
      },
      "id": "removed_unit_is_skipped_safely",
      "passed": true
    },
    {
      "details": {
        "contested_owner": 20,
        "resolution_order": [
          20,
          10
        ],
        "winner_count": 1
      },
      "id": "contested_destination_has_one_winner",
      "passed": true
    },
    {
      "details": {
        "conflict_signature": "1,2:10|3,2:20||10@1,2|20@3,2",
        "loser_reason": "TARGET_RESERVED",
        "winner_only_signature": "1,2:10|3,2:20||10@1,2|20@3,2"
      },
      "id": "losing_plan_does_not_mutate_state",
      "passed": true
    },
    {
      "details": {
        "actor_cell": {
          "x": 3,
          "y": 2
        },
        "start_owner": 0,
        "target_owner": 20,
        "winner": {
          "from_cell": {
            "x": 5,
            "y": 2
          },
          "ok": true,
          "outcome": "COMMITTED",
          "path": [
            {
              "x": 5,
              "y": 2
            },
            {
              "x": 3,
              "y": 2
            }
          ],
          "reason": "OK",
          "round_id": 1,
          "to_cell": {
            "x": 3,
            "y": 2
          },
          "unit_id": 20
        }
      },
      "id": "winner_commit_updates_position_and_occupancy",
      "passed": true
    },
    {
      "details": {
        "early_round_reason": "INVALID_PHASE",
        "early_submit_reason": "NOT_PLANNING",
        "next_round": 2,
        "phase_after_acknowledgement": "ROUND_END",
        "phase_before": "ANIMATING",
        "playback_calls": 1,
        "played_unit_ids": [
          20
        ]
      },
      "id": "animation_acknowledgement_gates_phase_advance",
      "passed": true
    },
    {
      "details": {
        "board_signature": "1,2:10|3,2:20|2,4:30||10@1,2|20@3,2|30@2,4",
        "contested_owner": 20,
        "loser_reason": "TARGET_RESERVED",
        "phase_before_playback": "ANIMATING",
        "resolution_order": [
          20,
          10,
          30
        ],
        "third_unit_cell": {
          "x": 2,
          "y": 4
        },
        "winner_id": 20
      },
      "id": "runnable_scene_smoke",
      "passed": true
    },
    {
      "id": "packaged_project_rerun_matches_named_checks",
      "passed": true,
      "details": {
        "extracted_check_count": 14,
        "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.",
  "passed": true,
  "passed_count": 15,
  "proof_boundary": {
    "action_points": "AP pricing, terrain costs, and refunds remain covered by the separate tactical transaction artifact.",
    "excluded": "Multi-cell bodies, space-time crossings, swaps, cycles, reactions, interrupts, networking, rollback, and cross-platform lockstep are not implemented or claimed.",
    "pathfinding": "Paths are supplied as already selected cell arrays; reachability and optimality are outside this proof.",
    "product_scope": "This standalone article artifact is not a benchmark or a claim about a released PathForge product API.",
    "reservation_layer": "The artifact composes the separately verified turn_reservation_table.gd for destination ownership and atomic cell commits.",
    "verified_here": "Discrete 1x1 turn coordination, isolated plans, total ordering, actor invalidation, destination conflict handoff, commit state, and playback gating."
  },
  "scene_smoke": {
    "details": {
      "board_signature": "1,2:10|3,2:20|2,4:30||10@1,2|20@3,2|30@2,4",
      "contested_owner": 20,
      "loser_reason": "TARGET_RESERVED",
      "phase_before_playback": "ANIMATING",
      "resolution_order": [
        20,
        10,
        30
      ],
      "third_unit_cell": {
        "x": 2,
        "y": 4
      },
      "winner_id": 20
    },
    "id": "runnable_scene_smoke",
    "passed": true
  },
  "turn_contract": {
    "initiative": "snapshotted at round start",
    "ordering": "initiative descending, command sequence ascending, stable unit id ascending",
    "phases": [
      "ROUND_START",
      "PLANNING",
      "RESOLVING",
      "ANIMATING",
      "ROUND_END"
    ],
    "planning": "deep-copied data intents; no board mutation",
    "playback": "committed results are authoritative; awaited playback gates ROUND_END",
    "resolution": "current actor and reservation state validate before each discrete commit"
  },
  "verified_at": "2026-07-12T22:53:58",
  "published_files": {
    "source_zip": {
      "path": "/downloads/pathforge/turn-order-and-movement-planning-in-godot-source.zip",
      "bytes": 13587,
      "sha256": "75bfefc611988aa47376e674ba5b1e40cb3365864c27594edca30b94ab364f23"
    },
    "planner_source": {
      "path_in_zip": "scripts/articles/turn_order_movement_planner.gd",
      "sha256": "5c92f440ad11497b3d3dde909a4e1107bc3f7a825f2c3ab759edcb4f4f0f7fd4"
    },
    "reservation_source": {
      "path_in_zip": "scripts/articles/turn_reservation_table.gd",
      "sha256": "42830fab52c9ef984562ce049f606ec8229144cdb9a6779d58a6211440b06ffe"
    },
    "demo_source": {
      "path_in_zip": "scripts/articles/turn_order_movement_planning_demo.gd",
      "sha256": "9f45814562e63921d3fc555c6e0dc4179d5e09f6d3684b7b7c1e43f15838dba5"
    }
  },
  "extracted_package_rerun": {
    "passed": true,
    "workspace_check_count": 14,
    "published_check_count": 15,
    "check_ids_match_workspace": true,
    "scene_smoke_passed": true,
    "engine": "4.7-stable (official)"
  }
}
