{"kind":"godot_contract","contract_version":"v0.4.6","api_version":"0.4.6","client_role":"visual_input_client_only","server_authoritative":true,"client_must_not_decide":["movement legality","combat outcome","supply state","resource spending","victory status","turn resolution"],"godot_source_version":"0.4.6","godot_scene_entrypoint":"res://scenes/GameRoot.tscn","godot_source_modules":["api_client.gd","asset_manifest.gd","game_state.gd","map_renderer.gd","scene_registry.gd","input_controller.gd","tooltip_panel.gd","hex_tile.gd","edge_marker.gd","unit_marker.gd","city_marker.gd","overlay_marker.gd","camera_controller.gd","order_builder.gd","replay_player.gd"],"render_foundation":{"scope":"map_state_render_preview","loads_from":"GET /api/matches/{match_id}/state","renders":["tiles","edges","units","cities","selection_overlay","supply_pips","status_panel"],"does_not_do":["rule decisions","combat resolution","resource booking","victory checks"]},"web_export_shell":{"scope":"browser_export_slot_ready","export_preset":"Web","export_path":"web/public/game/index.html","manifest_path":"web/public/game/manifest.json","fallback_mode":"placeholder_until_real_godot_export","smoke_flags":["GODOT_EXPORT_PRESET_OK","GODOT_WEB_SLOT_OK","GAME_SHELL_OK"]},"api_load_demo":{"scope":"godot_source_loads_live_api_and_renders_demo_state","version":"0.4.6","load_sequence":["GET /api/contracts/godot","GET /api/maps/tutorial_valley","POST /api/matches","GET /api/matches/{match_id}/state"],"interactive_demo_actions":["reload_contract_map_match","submit_demo_move","load_replay"],"source_files":["api_client.gd","asset_manifest.gd","game_state.gd","game_root.gd","map_renderer.gd","order_builder.gd","replay_player.gd"],"smoke_flags":["GODOT_API_LOAD_SOURCE_OK","GODOT_DEMO_ACTIONS_SOURCE_OK"],"does_not_do":["client-side rule validation as authority","combat resolution","resource booking","victory decisions"]},"visual_seed_assets":{"scope":"godot_imported_seed_assets_for_map_rendering","version":"0.4.6","asset_manifest":"client-godot/assets/ASSET_MANIFEST.json","minimum_png_assets":80,"preview_sheet":"client-godot/assets/previews/hexfall_visual_seed_preview_sheet_01.png","renderer_source_files":["asset_manifest.gd","map_renderer.gd"],"renders_with_assets":["terrain textures","edge markers","unit tokens","building markers","selection overlays","supply pips"],"smoke_flags":["VISUAL_SEED_ASSET_MANIFEST_OK","VISUAL_SEED_PNG_COUNT_OK","GODOT_ASSET_RENDERER_SOURCE_OK"],"does_not_do":["client-side rule validation as authority","final art lock","combat resolution","supply computation"]},"scene_marker_foundation":{"scope":"typed_scene_markers_for_map_renderer_next_slice","version":"0.4.6","scenes":["client-godot/scenes/HexTile.tscn","client-godot/scenes/EdgeMarker.tscn","client-godot/scenes/UnitMarker.tscn","client-godot/scenes/OverlayMarker.tscn","client-godot/scenes/CityMarker.tscn"],"scripts":["hex_tile.gd","edge_marker.gd","unit_marker.gd","overlay_marker.gd","city_marker.gd","scene_registry.gd"],"smoke_flags":["GODOT_SCENE_MARKERS_OK","GODOT_SCENE_AUTHORITY_OK"],"does_not_do":["client-side rule validation as authority","final gameplay interaction","combat resolution"]},"scene_instancing":{"scope":"map_renderer_uses_typed_packed_scene_instances","version":"0.4.6","renderer":"client-godot/scripts/map_renderer.gd","registry":"client-godot/scripts/scene_registry.gd","instanced_scenes":["HexTile","EdgeMarker","UnitMarker","CityMarker","OverlayMarker"],"delegated_to_markers":["terrain texture/fallback","edge marker texture/fallback","unit token/supply pip","city marker","selection overlay"],"smoke_flags":["GODOT_SCENE_INSTANCING_OK","GODOT_RENDERER_DELEGATION_OK","GODOT_RENDERER_NO_MONOLITH_OK"],"does_not_do":["client-side rule validation as authority","combat resolution","supply computation","resource booking","victory decisions"]},"input_foundation":{"scope":"hover_selection_touch_tooltip_foundation_without_client_rule_authority","version":"0.4.6","input_controller":"client-godot/scripts/input_controller.gd","tooltip_panel":"client-godot/scripts/tooltip_panel.gd","scene":"client-godot/scenes/TooltipPanel.tscn","renderer_entrypoints":["handle_pointer_motion","handle_primary_click","clear_selection"],"signals":["pointer_world_moved","primary_world_pressed","cancel_selection_requested","hover_changed","selection_changed"],"supports":["mouse hover","left click select","right click clear","touch select","escape clear","tooltip text"],"smoke_flags":["GODOT_INPUT_FOUNDATION_OK","GODOT_HOVER_SELECTION_SOURCE_OK","GODOT_TOOLTIP_SOURCE_OK"],"does_not_do":["movement legality","combat resolution","supply computation","resource booking","victory decisions","turn resolution"]},"snapshot_foundation":{"scope":"safe_project_snapshot_without_secrets_or_runtime_db","version":"0.4.6","script":"scripts/snapshot_safe.sh","default_output_dir":"/srv/projects/_snapshots","excludes":[".env",".env.*","secrets/","data/postgres/","data/valkey/","data/backups/","client-godot/.godot/","large web export blobs"],"manifest_kind":"hexfall_snapshot_manifest","smoke_flags":["SNAPSHOT_SCRIPT_OK","SNAPSHOT_DRY_RUN_OK","SNAPSHOT_EXCLUDES_OK","SNAPSHOT_LEAK_GUARD_OK"]},"load_sequence":["GET /api/contracts/godot","GET /api/contracts/scenarios","GET /api/contracts/fixtures","GET /api/maps/{map_id}","POST /api/matches","GET /api/matches/{match_id}/state","POST /api/matches/{match_id}/orders","POST /api/matches/{match_id}/resolve","GET /api/matches/{match_id}/replay"],"state_sections":["turn","phase","players","tiles","edges","units","resources","supply","score","victory_status"],"scenario_ids":["foundation_contract_boot","tutorial_move_resolve_replay","combat_supply_edge_build_victory","contract_error_envelope"],"golden_fixture_ids":["fixture_manifest","foundation_contract_boot","tutorial_move_resolve_replay","combat_supply_edge_build_victory","contract_error_envelope"],"order_payload_examples":{"move_unit":{"type":"move_unit","player_id":"player_1","payload":{"unit_id":"u_p1_standard_1","from":"h_0_0","to":"h_1_0"}},"attack_unit":{"type":"attack_unit","player_id":"player_1","payload":{"attacker_id":"u_p1_standard_1","defender_id":"u_p2_standard_1","from":"h_1_0","to":"h_2_0"}},"claim_edge":{"type":"claim_edge","player_id":"player_1","payload":{"unit_id":"u_p1_standard_1","from":"h_2_0","to":"h_3_0"}},"build_unit":{"type":"build_unit","player_id":"player_1","payload":{"unit_type":"fast","tile_id":"h_0_0"}}},"replay_event_types":["turn_started","unit_moved","move_rejected","attack_rejected","combat_resolved","unit_destroyed","edge_claimed","edge_claim_rejected","supply_updated","supply_cut","city_captured","production_resolved","unit_created","build_rejected","score_updated","match_ended","turn_resolved"],"links":{"contracts":"/api/contracts","health":"/api/health","version":"/api/version","maps":"/api/maps","golden_fixtures":"/api/contracts/fixtures","godot_source":"client-godot/project.godot","godot_export_preset":"client-godot/export_presets.cfg","godot_web_slot":"web/public/game/index.html","snapshot_script":"scripts/snapshot_safe.sh","scene_registry":"client-godot/scripts/scene_registry.gd","scene_instancing_check":"scripts/check_godot_scene_instancing.sh","input_foundation_check":"scripts/check_godot_input_foundation.sh"}}