{
  "article_slug": "move-multi-tile-units-on-a-grid-in-godot",
  "artifact": "Standalone Godot multi-tile movement correctness proof",
  "checks": [
    {
      "details": {
        "cells": [
          {
            "x": 3,
            "y": 2
          }
        ]
      },
      "id": "one_by_one_footprint_is_anchor_cell",
      "passed": true
    },
    {
      "details": {
        "cells": [
          {
            "x": 3,
            "y": 2
          },
          {
            "x": 4,
            "y": 2
          },
          {
            "x": 3,
            "y": 3
          },
          {
            "x": 4,
            "y": 3
          }
        ]
      },
      "id": "two_by_two_footprint_has_four_cells",
      "passed": true
    },
    {
      "details": {
        "one_by_two": [
          {
            "x": 1,
            "y": 1
          },
          {
            "x": 1,
            "y": 2
          }
        ],
        "two_by_one": [
          {
            "x": 1,
            "y": 1
          },
          {
            "x": 2,
            "y": 1
          }
        ]
      },
      "id": "rectangular_footprints_follow_width_and_height",
      "passed": true
    },
    {
      "details": {
        "actual": {
          "x": 200.0,
          "y": 196.0
        },
        "expected": {
          "x": 200.0,
          "y": 196.0
        }
      },
      "id": "one_by_one_center_equals_map_to_local",
      "passed": true
    },
    {
      "details": {
        "actual": {
          "x": 240.0,
          "y": 224.0
        },
        "anchor_center": {
          "x": 200.0,
          "y": 196.0
        },
        "expected": {
          "x": 240.0,
          "y": 224.0
        },
        "tile_size": {
          "x": 80,
          "y": 56
        }
      },
      "id": "two_by_two_center_offsets_half_a_non_square_cell",
      "passed": true
    },
    {
      "details": {
        "anchor": {
          "x": 4,
          "y": 2
        },
        "center_shift": {
          "x": 40.0,
          "y": -28.0
        },
        "pivot": "top_left",
        "rotated_size": {
          "x": 2,
          "y": 1
        }
      },
      "id": "top_left_rotation_swaps_dimensions_and_shifts_visual_center",
      "passed": true
    },
    {
      "details": {
        "cells": [
          {
            "x": 0,
            "y": 0
          },
          {
            "x": 1,
            "y": 0
          },
          {
            "x": 2,
            "y": 0
          },
          {
            "x": 0,
            "y": 1
          },
          {
            "x": 1,
            "y": 1
          },
          {
            "x": 2,
            "y": 1
          }
        ],
        "code": "OK",
        "kind": "cardinal",
        "ok": true
      },
      "id": "cardinal_two_by_two_step_touches_union_of_six_cells",
      "passed": true
    },
    {
      "details": {
        "cells": [
          {
            "x": 0,
            "y": 0
          },
          {
            "x": 1,
            "y": 0
          },
          {
            "x": 2,
            "y": 0
          },
          {
            "x": 0,
            "y": 1
          },
          {
            "x": 1,
            "y": 1
          },
          {
            "x": 2,
            "y": 1
          },
          {
            "x": 0,
            "y": 2
          },
          {
            "x": 1,
            "y": 2
          },
          {
            "x": 2,
            "y": 2
          }
        ],
        "code": "OK",
        "kind": "diagonal_conservative",
        "ok": true
      },
      "id": "diagonal_two_by_two_step_uses_conservative_three_by_three_cells",
      "passed": true
    },
    {
      "details": {
        "invalid_size": "INVALID_FOOTPRINT",
        "jump": "UNSUPPORTED_MOVE_DELTA",
        "zero": "ZERO_LENGTH_MOVE"
      },
      "id": "unsupported_moves_and_invalid_footprints_are_rejected",
      "passed": true
    },
    {
      "details": {
        "bounds": {
          "position": {
            "x": 0,
            "y": 0
          },
          "size": {
            "x": 5,
            "y": 4
          }
        },
        "inside": true,
        "outside": false
      },
      "id": "full_footprint_must_remain_in_bounds",
      "passed": true
    },
    {
      "details": {
        "anchor_center": {
          "x": 36.0,
          "y": 28.0
        },
        "cardinal_touched_count": 6,
        "center_offset_matches": true,
        "diagonal_touched_count": 9,
        "expected_offset": {
          "x": 36.0,
          "y": 28.0
        },
        "footprint_center": {
          "x": 72.0,
          "y": 56.0
        }
      },
      "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,
  "grid_contract": {
    "anchor": "top-left occupied cell",
    "layout": "orthogonal TileMapLayer",
    "rotation_pivot": "top-left",
    "tile_size": {
      "x": 80,
      "y": 56
    },
    "transition_scope": "one-cell cardinal or diagonal discrete moves"
  },
  "measurement_scope": "Correctness proof only. No performance or throughput claim.",
  "passed": true,
  "passed_count": 11,
  "proof_boundary": {
    "atomic_ownership": "The separate turn-reservation artifact verifies destination-footprint ownership, conflict rejection, undo, and release.",
    "continuous_physics": "Exact continuous collision sweeps require physics queries such as ShapeCast2D or PhysicsDirectSpaceState2D.cast_motion and are outside this discrete proof.",
    "simultaneous_motion": "Temporal and in-transit reservation policy is intentionally not prescribed or verified here.",
    "verified_here": "Footprint cells, orthogonal-grid visual centers, conservative discrete touched-cell sets, move guards, bounds, and top-left-pivot rectangular rotation."
  },
  "verified_at": "2026-07-12T04:25:57",
  "published_files": {
    "source_zip": {
      "path": "/downloads/pathforge/move-multi-tile-units-on-a-grid-in-godot-source.zip",
      "bytes": 8272,
      "sha256": "87e3f293e1444ea83d08495e2b525b422864fa98910d150a08fcb68cea6c14f2"
    }
  }
}
