{
  "article_slug": "tilemaplayer-custom-data-for-movement-costs-in-godot",
  "artifact": "Godot TileSet custom-data movement-cost import correctness proof",
  "checks": [
    {
      "id": "typed_float_movement_cost_schema_is_accepted",
      "observed": {
        "errors": [],
        "layer_id": 0,
        "ok": true
      },
      "passed": true
    },
    {
      "id": "missing_layer_reports_named_schema_error",
      "observed": {
        "errors": [
          {
            "layer": "movement_cost",
            "reason": "missing_custom_data_layer"
          }
        ],
        "layer_id": -1,
        "ok": false
      },
      "passed": true
    },
    {
      "id": "wrong_layer_type_reports_named_schema_error",
      "observed": {
        "errors": [
          {
            "expected_type": 3,
            "layer": "terrain_id",
            "observed_type": 4,
            "reason": "wrong_custom_data_type"
          }
        ],
        "layer_id": -1,
        "ok": false
      },
      "passed": true
    },
    {
      "id": "untouched_float_is_unserialized_zero_and_rejected",
      "observed": {
        "has_custom_data": true,
        "import_error": {
          "alternative_tile": 0,
          "atlas_coords": "(2, 0)",
          "cell": "(0, 0)",
          "minimum_cost": 1.0,
          "observed": 0.0,
          "reason": "invalid_movement_cost",
          "source_id": 0
        },
        "runtime_value": 0.0,
        "serialized_explicit_custom_data_0_absent": true,
        "serialized_tile_definition_present": true
      },
      "passed": true
    },
    {
      "id": "explicit_atlas_costs_import_with_normalized_cells",
      "observed": {
        "costs": {
          "(0, 1)": 1.0,
          "(1, 1)": 4.0,
          "(2, 1)": 1.0,
          "(3, 1)": 7.0
        },
        "errors": [],
        "ok": true
      },
      "passed": true
    },
    {
      "id": "scene_collection_cell_reports_non_atlas_diagnostic",
      "observed": {
        "costs": {},
        "errors": [
          {
            "alternative_tile": 0,
            "atlas_coords": "(0, 0)",
            "cell": "(4, 0)",
            "reason": "no_atlas_tile_data",
            "source_id": 1
          }
        ],
        "ok": false
      },
      "passed": true
    },
    {
      "id": "alternative_tile_keeps_cost_independent_from_base",
      "observed": {
        "costs": {
          "(0, 0)": 4.0,
          "(1, 0)": 7.0
        },
        "errors": [],
        "ok": true
      },
      "passed": true
    },
    {
      "id": "bulk_baseline_and_per_cell_weights_apply_without_update",
      "observed": {
        "baseline_cell": 1.0,
        "dirty": false,
        "overridden_cell": 20.0
      },
      "passed": true
    },
    {
      "id": "imported_weight_changes_selected_route",
      "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)"
        ]
      },
      "passed": true
    },
    {
      "id": "structural_update_clears_weights_and_replay_restores_them",
      "observed": {
        "cleared_path": [
          "(0, 1)",
          "(1, 1)",
          "(2, 1)",
          "(3, 1)",
          "(4, 1)"
        ],
        "replayed_path": [
          "(0, 1)",
          "(1, 1)",
          "(1, 0)",
          "(2, 0)",
          "(3, 0)",
          "(4, 0)",
          "(4, 1)"
        ],
        "weight_after_update": 1.0,
        "weighted_path": [
          "(0, 1)",
          "(1, 1)",
          "(1, 0)",
          "(2, 0)",
          "(3, 0)",
          "(4, 0)",
          "(4, 1)"
        ]
      },
      "passed": true
    },
    {
      "id": "jumping_ignores_imported_weight_scale",
      "observed": {
        "path": [
          "(0, 1)",
          "(4, 1)"
        ],
        "weighted_skipped_cell": "(2, 1)"
      },
      "passed": true
    },
    {
      "id": "terrain_id_import_rejects_empty_and_unknown_ids",
      "observed": {
        "empty": {
          "errors": [
            {
              "alternative_tile": 0,
              "atlas_coords": "(2, 0)",
              "cell": "(0, 0)",
              "reason": "missing_terrain_id",
              "source_id": 0
            }
          ],
          "ok": false,
          "terrain_by_cell": {}
        },
        "unknown": {
          "errors": [
            {
              "alternative_tile": 0,
              "atlas_coords": "(1, 0)",
              "cell": "(0, 0)",
              "observed": "forest",
              "reason": "unknown_terrain_id",
              "source_id": 0
            }
          ],
          "ok": false,
          "terrain_by_cell": {}
        }
      },
      "passed": true
    },
    {
      "id": "profiles_resolve_different_weights_from_same_terrain_map",
      "observed": {
        "infantry_costs": {
          "(0, 0)": 1.0,
          "(1, 0)": 2.0,
          "(2, 0)": 1.0
        },
        "terrain_by_cell": {
          "(0, 0)": "grass",
          "(1, 0)": "forest",
          "(2, 0)": "road"
        },
        "vehicle_costs": {
          "(0, 0)": 2.0,
          "(1, 0)": 5.0,
          "(2, 0)": 1.0
        }
      },
      "passed": true
    },
    {
      "id": "extracted_package_reruns_cleanly",
      "passed": true,
      "observed": {
        "extracted_logic_check_count": 13,
        "check_ids_match_workspace": true,
        "untouched_fixture_property_absent": true,
        "engine": "4.7.2-stable (official)"
      }
    }
  ],
  "engine": {
    "build": "official",
    "hash": "ed1daf0bf001b61586d9930840f2f1394092c079",
    "hex": 263938,
    "major": 4,
    "minor": 7,
    "patch": 2,
    "status": "stable",
    "string": "4.7.2-stable (official)",
    "timestamp": 0
  },
  "failed": [],
  "failed_count": 0,
  "fixture_contract": {
    "alternative_tile": "Atlas (1, 0), alternative 1 owns movement_cost 7.0 independently of base cost 4.0.",
    "movement_cost_layer": "Typed float. Traversable authored costs must be at least 1.0.",
    "resource": "res://fixtures/articles/tilemap_movement_costs/movement_cost_tileset.tres",
    "terrain_id_layer": "Typed String. Empty and profile-unknown IDs are rejected.",
    "untouched_tile": "Atlas (2, 0), alternative 0 has no serialized custom_data_0 property and loads as 0.0."
  },
  "measurement_scope": "Deterministic correctness verification only. No performance, memory, or Web-export claim.",
  "passed": true,
  "passed_count": 14,
  "proof_boundary": {
    "not_verified": "Editor screenshots, TileMap coordinate policy, walkability import, AP transactions, runtime overlay architecture, or production performance.",
    "verified_here": "Real serialized TileSet and TileMapLayer import, schema diagnostics, untouched typed defaults, atlas alternatives, scene-collection rejection, bulk baseline fill, apply-after-update, replay, JPS interaction, and terrain-profile resolution."
  },
  "verified_at": "2026-08-22T08:36:08",
  "published_files": {
    "source_zip": {
      "path": "/downloads/pathforge/tilemaplayer-custom-data-for-movement-costs-in-godot-source.zip",
      "bytes": 8996,
      "sha256": "09431778306a12ba8e54b17510791e369335038807951d1b760b221593f5b695"
    },
    "importer_source": {
      "path_in_zip": "scripts/articles/tilemap_movement_cost_importer.gd",
      "sha256": "196f2aec17b0a400deb8e4fec7c37f0d0f253feb9a0c246d63589e1c275b8c1d"
    },
    "serialized_fixture": {
      "path_in_zip": "fixtures/articles/tilemap_movement_costs/movement_cost_tileset.tres",
      "sha256": "c3f63bf2736fc1fc5dad378f9b5be0f013fdbc734a2710db3f5dbf407aa5dfaa",
      "untouched_property_absent": true
    },
    "verifier_source": {
      "path_in_zip": "tools/verify_tilemap_movement_costs.gd",
      "sha256": "8d6a8a0a885b0f473713878d3466a07476254eead40cac40d16fdb1e1205761f"
    }
  },
  "extracted_package_rerun": {
    "passed": true,
    "logic_check_count": 13,
    "published_check_count": 14,
    "check_ids_match_workspace": true,
    "untouched_fixture_property_absent": true,
    "engine": "4.7.2-stable (official)"
  }
}
