#!/usr/bin/env python3
"""Build the current browser prototype asset set."""
from __future__ import annotations

import argparse
import json
import os
import shutil
from collections import defaultdict
from pathlib import Path

from classify_cns_payloads import classify_payload
from decode_cns import decode_file, decompress_cns, indices_to_rgb, parse_image
from extract_scene_events import extract_events
from extract_scene_manifest import extract_manifest
from extract_save_scene_selectors import extract_selectors as extract_save_scene_selectors
from extract_save_scene_selectors import selector_html as save_scene_selector_html
from export_battle_backgrounds import export_battle_backgrounds
from export_battle_enemy_candidates import build_summary as build_battle_enemy_candidate_summary
from export_battle_enemy_candidates import write_outputs as write_battle_enemy_candidate_outputs
from export_battle_event_candidates import export_battle_event_candidates
from export_map_js import export_map_chunks, export_maps
from map_render_reviews import candidate_index as map_render_review_index
from map_render_reviews import coverage_rows as map_render_review_coverage_rows
from map_render_reviews import load_reviews as load_map_render_reviews
from map_render_reviews import write_outputs as write_map_render_review_outputs
from summarize_battle_action_handler_context import build_summary as build_battle_action_handler_context_summary
from summarize_battle_action_handler_context import write_outputs as write_battle_action_handler_context_outputs
from audio_archive_manifest import build_summary as build_audio_archive_manifest_summary
from audio_archive_manifest import write_outputs as write_audio_archive_manifest_outputs
from summarize_audio_title_provenance import build_summary as build_audio_title_provenance_summary
from summarize_audio_title_provenance import write_outputs as write_audio_title_provenance_outputs
from summarize_original_battle_resource_descriptors import build_summary as build_original_battle_resource_descriptor_summary
from map_layout_reviews import load_reviews as load_map_layout_reviews
from map_layout_reviews import write_outputs as write_map_layout_review_outputs
from probe_scene_coordinate_candidates import extract_candidates as extract_coordinate_candidates
from probe_exe_scene_tables import read_sections
from render_tile_class_gap_gallery import markdown as tile_class_gap_gallery_markdown
from render_tile_class_gap_gallery import render_galleries as render_tile_class_gap_galleries
from render_tileset_usage_gallery import render_gallery_from_counter as render_tileset_usage_gallery
from render_tileset_usage_gallery import usage_by_tileset_from_map_data
from summarize_map_tiles import load_maps
from summarize_map_tile_class_gaps import markdown as map_tile_class_gaps_markdown
from summarize_map_tile_class_gaps import index_markdown as map_tile_class_gap_index_markdown
from summarize_map_tile_class_gaps import summarize as summarize_map_tile_class_gaps
from summarize_map_tile_class_gaps import write_map_pages as write_map_tile_class_gap_pages
from summarize_map_exit_candidates import build_rows as build_map_exit_candidate_rows
from summarize_map_exit_candidates import write_outputs as write_map_exit_candidate_outputs
from summarize_original_collision_route_audit import build_summary as build_original_collision_route_audit_summary
from summarize_original_collision_route_audit import write_outputs as write_original_collision_route_audit_outputs
from summarize_map1_01a_edge_trigger_gap import build_summary as build_map1_01a_edge_trigger_gap_summary
from summarize_map1_01a_edge_trigger_gap import write_outputs as write_map1_01a_edge_trigger_gap_outputs
from summarize_map1_01a_tile_hotspot_pattern_contrast import build_summary as build_map1_01a_tile_hotspot_pattern_contrast_summary
from summarize_map1_01a_tile_hotspot_pattern_contrast import write_outputs as write_map1_01a_tile_hotspot_pattern_contrast_outputs
from summarize_map1_01a_strict_event_tile_signature_scan import build_summary as build_map1_01a_strict_event_tile_signature_scan_summary
from summarize_map1_01a_strict_event_tile_signature_scan import write_outputs as write_map1_01a_strict_event_tile_signature_scan_outputs
from summarize_map_exit_coordinate_refs import build_summary as build_map_exit_coordinate_ref_summary
from summarize_map_exit_coordinate_refs import write_outputs as write_map_exit_coordinate_ref_outputs
from summarize_map1_01a_exit_coordinate_context import build_summary as build_map1_01a_exit_coordinate_context_summary
from summarize_map1_01a_exit_coordinate_context import write_outputs as write_map1_01a_exit_coordinate_context_outputs
from summarize_map1_01a_exit_coordinate_variant_scan import build_summary as build_map1_01a_exit_coordinate_variant_scan_summary
from summarize_map1_01a_exit_coordinate_variant_scan import write_outputs as write_map1_01a_exit_coordinate_variant_scan_outputs
from summarize_map1_01a_exit_byte_coordinate_scan import build_summary as build_map1_01a_exit_byte_coordinate_scan_summary
from summarize_map1_01a_exit_byte_coordinate_scan import write_outputs as write_map1_01a_exit_byte_coordinate_scan_outputs
from summarize_map1_01a_exit_cns_payload_scan import build_summary as build_map1_01a_exit_cns_payload_scan_summary
from summarize_map1_01a_exit_cns_payload_scan import write_outputs as write_map1_01a_exit_cns_payload_scan_outputs
from summarize_map1_01a_strict_hotspot_review_matrix import build_summary as build_map1_01a_strict_hotspot_review_matrix_summary
from summarize_map1_01a_strict_hotspot_review_matrix import write_outputs as write_map1_01a_strict_hotspot_review_matrix_outputs
from summarize_map1_01a_entry_context import build_summary as build_map1_01a_entry_context_summary
from summarize_map1_01a_entry_context import write_outputs as write_map1_01a_entry_context_outputs
from summarize_map1_01a_manifest_point_scan import build_summary as build_map1_01a_manifest_point_scan_summary
from summarize_map1_01a_manifest_point_scan import write_outputs as write_map1_01a_manifest_point_scan_outputs
from summarize_map1_01a_root_point_scan import build_summary as build_map1_01a_root_point_scan_summary
from summarize_map1_01a_root_point_scan import write_outputs as write_map1_01a_root_point_scan_outputs
from summarize_map1_01a_selector_bridge_refs import build_summary as build_map1_01a_selector_bridge_ref_summary
from summarize_map1_01a_selector_bridge_refs import write_outputs as write_map1_01a_selector_bridge_ref_outputs
from summarize_playable_progress import annotate_map_exit_trial_routes
from summarize_playable_progress import annotate_save_selector_frontier_risks
from summarize_playable_progress import build_summary as build_playable_progress_summary
from summarize_playable_progress import write_outputs as write_playable_progress_outputs
from summarize_route_blockers import build_rows as build_route_blocker_rows
from summarize_route_blockers import write_outputs as write_route_blocker_outputs
from summarize_route_guide_browser import build_summary as build_route_guide_browser_summary
from summarize_route_guide_browser import write_outputs as write_route_guide_browser_outputs
from summarize_title_start_browser import build_summary as build_title_start_browser_summary
from summarize_title_start_browser import write_outputs as write_title_start_browser_outputs
from summarize_route_investigation_queue import build_rows as build_route_investigation_queue_rows
from summarize_route_investigation_queue import write_outputs as write_route_investigation_queue_outputs
from summarize_route_promotion_gate import build_summary as build_route_promotion_gate_summary
from summarize_route_promotion_gate import write_outputs as write_route_promotion_gate_outputs
from summarize_route_assist_frontier import build_rows as build_route_assist_frontier_rows
from summarize_route_assist_frontier import write_outputs as write_route_assist_frontier_outputs
from summarize_completion_audit import build_summary as build_completion_audit_summary
from summarize_completion_audit import write_outputs as write_completion_audit_outputs
from summarize_candidate_browser_smokes import build_summary as build_candidate_browser_smoke_summary
from summarize_candidate_browser_smokes import write_outputs as write_candidate_browser_smoke_outputs
from summarize_completion_candidate_review import build_summary as build_completion_candidate_review_summary
from summarize_completion_candidate_review import write_outputs as write_completion_candidate_review_outputs
from summarize_dialogue_candidate_review import build_summary as build_dialogue_candidate_review_summary
from summarize_dialogue_candidate_review import write_outputs as write_dialogue_candidate_review_outputs
from summarize_event_object_candidate_review import build_summary as build_event_object_candidate_review_summary
from summarize_event_object_candidate_review import write_outputs as write_event_object_candidate_review_outputs
from summarize_menu_candidate_review import build_summary as build_menu_candidate_review_summary
from summarize_menu_candidate_review import write_outputs as write_menu_candidate_review_outputs
from summarize_movement_candidate_review import build_summary as build_movement_candidate_review_summary
from summarize_movement_candidate_review import write_outputs as write_movement_candidate_review_outputs
from summarize_mobile_browser_controls import build_summary as build_mobile_browser_controls_summary
from summarize_mobile_browser_controls import write_outputs as write_mobile_browser_controls_outputs
from summarize_save_point_candidate_review import build_summary as build_save_point_candidate_review_summary
from summarize_save_point_candidate_review import write_outputs as write_save_point_candidate_review_outputs
from summarize_transition_progress_candidate_review import (
    build_summary as build_transition_progress_candidate_review_summary,
)
from summarize_transition_progress_candidate_review import (
    write_outputs as write_transition_progress_candidate_review_outputs,
)
from summarize_runtime_trace_feasibility import build_summary as build_runtime_trace_feasibility_summary
from summarize_runtime_trace_feasibility import write_outputs as write_runtime_trace_feasibility_outputs
from summarize_runtime_memory_snapshot_context import build_summary as build_runtime_memory_snapshot_context_summary
from summarize_runtime_memory_snapshot_context import write_outputs as write_runtime_memory_snapshot_context_outputs
from summarize_runtime_title_start_context import build_summary as build_runtime_title_start_context_summary
from summarize_runtime_title_start_context import write_outputs as write_runtime_title_start_context_outputs
from summarize_runtime_source_exit_poll_context import build_summary as build_runtime_source_exit_poll_context_summary
from summarize_runtime_source_exit_poll_context import write_outputs as write_runtime_source_exit_poll_context_outputs
from summarize_runtime_source_save_load_variant_context import (
    build_summary as build_runtime_source_save_load_variant_context_summary,
)
from summarize_runtime_source_save_load_variant_context import (
    write_outputs as write_runtime_source_save_load_variant_context_outputs,
)
from summarize_runtime_predecessor_route_attempt_context import (
    build_summary as build_runtime_predecessor_route_attempt_context_summary,
)
from summarize_runtime_predecessor_route_attempt_context import (
    write_outputs as write_runtime_predecessor_route_attempt_context_outputs,
)
from summarize_runtime_opcode24_flag_context import build_summary as build_runtime_opcode24_flag_context_summary
from summarize_runtime_opcode24_flag_context import write_outputs as write_runtime_opcode24_flag_context_outputs
from summarize_transition_extraction_gaps import build_rows as build_transition_extraction_gap_rows
from summarize_transition_extraction_gaps import write_outputs as write_transition_extraction_gap_outputs
from summarize_transition_review_shortlist import build_audit as build_transition_review_shortlist_audit
from summarize_transition_review_shortlist import build_rows as build_transition_review_shortlist_rows
from summarize_transition_review_shortlist import write_outputs as write_transition_review_shortlist_outputs
from summarize_map1_01a_scene_payload_context import build_summary as build_map1_01a_scene_payload_context_summary
from summarize_map1_01a_scene_payload_context import write_outputs as write_map1_01a_scene_payload_context_outputs
from summarize_map1_01a_resource_ref_scan import build_summary as build_map1_01a_resource_ref_scan_summary
from summarize_map1_01a_resource_ref_scan import write_outputs as write_map1_01a_resource_ref_scan_outputs
from summarize_map1_01a_event_shape_scan import build_summary as build_map1_01a_event_shape_scan_summary
from summarize_map1_01a_event_shape_scan import write_outputs as write_map1_01a_event_shape_scan_outputs
from summarize_strict_event_source_coverage import build_summary as build_strict_event_source_coverage_summary
from summarize_strict_event_source_coverage import write_outputs as write_strict_event_source_coverage_outputs
from summarize_map1_01a_record_pattern_contrast import build_summary as build_map1_01a_record_pattern_contrast_summary
from summarize_map1_01a_record_pattern_contrast import write_outputs as write_map1_01a_record_pattern_contrast_outputs
from summarize_map1_01a_strict_target_link_gap import build_summary as build_map1_01a_strict_target_link_gap_summary
from summarize_map1_01a_strict_target_link_gap import write_outputs as write_map1_01a_strict_target_link_gap_outputs
from summarize_map1_01a_hotspot_gap import build_summary as build_map1_01a_hotspot_gap_summary
from summarize_map1_01a_hotspot_gap import write_outputs as write_map1_01a_hotspot_gap_outputs
from summarize_map1_01a_strict_source_hotspot_context import build_summary as build_map1_01a_strict_source_hotspot_context_summary
from summarize_map1_01a_strict_source_hotspot_context import write_outputs as write_map1_01a_strict_source_hotspot_context_outputs
from summarize_map1_01a_scene_record_cluster_context import build_summary as build_map1_01a_scene_record_cluster_context_summary
from summarize_map1_01a_scene_record_cluster_context import write_outputs as write_map1_01a_scene_record_cluster_context_outputs
from summarize_map1_01a_exit_target_ranking import build_summary as build_map1_01a_exit_target_ranking_summary
from summarize_map1_01a_exit_target_ranking import write_outputs as write_map1_01a_exit_target_ranking_outputs
from summarize_route_blocker_evidence_matrix import build_matrix as build_route_blocker_evidence_matrix
from summarize_route_blocker_evidence_matrix import write_outputs as write_route_blocker_evidence_matrix_outputs
from summarize_web_playtest_route import build_summary as build_web_playtest_route_summary
from summarize_web_playtest_route import write_outputs as write_web_playtest_route_outputs
from summarize_reciprocal_transition_candidates import build_summary as build_reciprocal_transition_candidate_summary
from summarize_reciprocal_transition_candidates import write_outputs as write_reciprocal_transition_candidate_outputs
from summarize_event_transitions import transition_records
from summarize_event_object_branch_state_stream_candidates import build_summary as build_event_object_branch_state_stream_candidate_summary
from summarize_event_object_branch_state_stream_candidates import write_outputs as write_event_object_branch_state_stream_candidate_outputs
from summarize_event_object_branch_state_candidate_links import build_summary as build_event_object_branch_state_candidate_link_summary
from summarize_event_object_branch_state_candidate_links import write_outputs as write_event_object_branch_state_candidate_link_outputs
from summarize_event_object_branch_state_block_context import build_summary as build_event_object_branch_state_block_context_summary
from summarize_event_object_branch_state_block_context import write_outputs as write_event_object_branch_state_block_context_outputs
from summarize_field_map_record_roots import build_summary as build_field_map_record_root_summary
from summarize_field_map_record_roots import write_outputs as write_field_map_record_root_outputs
from summarize_directdraw_flow import build_summary as build_directdraw_flow_summary
from summarize_directdraw_flow import write_outputs as write_directdraw_flow_outputs
from summarize_exe_imports import parse_imports
from summarize_runtime_timing import build_summary as build_runtime_timing_summary
from summarize_runtime_timing import write_outputs as write_runtime_timing_outputs
from summarize_runtime_movement import build_summary as build_runtime_movement_summary
from summarize_runtime_movement import write_outputs as write_runtime_movement_outputs
from summarize_input_keymap import build_summary as build_input_keymap_summary
from summarize_input_keymap import markdown as input_keymap_markdown
from summarize_korean_text_candidates import build_summary as build_korean_text_candidate_summary
from summarize_korean_text_candidates import write_outputs as write_korean_text_candidate_outputs
from summarize_cns_text_candidates import build_summary as build_cns_text_candidate_summary
from summarize_cns_text_candidates import write_outputs as write_cns_text_candidate_outputs
from build_cns_frame_assets import build_rows as build_cns_frame_asset_rows
from build_cns_frame_assets import build_summary as build_cns_frame_asset_summary
from build_cns_frame_assets import write_outputs as write_cns_frame_asset_outputs
from build_ui_window_review_data import build_summary as build_ui_window_review_summary
from build_ui_window_review_data import write_outputs as write_ui_window_review_outputs
from build_cns_rect_review_data import build_summary as build_cns_rect_review_summary
from build_cns_rect_review_data import write_outputs as write_cns_rect_review_outputs
from probe_cns_frame_rect_exe_patterns import run_scan as run_cns_frame_rect_exe_scan
from probe_cns_frame_rect_exe_patterns import write_outputs as write_cns_frame_rect_exe_outputs
from summarize_text_tables import build_summary as build_text_table_summary
from summarize_text_tables import write_outputs as write_text_table_outputs
from summarize_text_routine_callers import build_summary as build_text_routine_caller_summary
from summarize_text_routine_callers import write_outputs as write_text_routine_caller_outputs
from summarize_event_handler_text_refs import build_summary as build_event_handler_text_ref_summary
from summarize_event_handler_text_refs import write_outputs as write_event_handler_text_ref_outputs
from summarize_event_text_source_flow import build_summary as build_event_text_source_flow_summary
from summarize_event_text_source_flow import write_outputs as write_event_text_source_flow_outputs
from summarize_event_dialogue_blocks import build_summary as build_event_dialogue_block_summary
from summarize_event_dialogue_blocks import write_outputs as write_event_dialogue_block_outputs
from summarize_event_vm_opcode_semantics import build_summary as build_event_vm_opcode_semantics_summary
from summarize_event_vm_opcode_semantics import write_outputs as write_event_vm_opcode_semantics_outputs
from summarize_event_vm_semantics_gap import build_summary as build_event_vm_semantics_gap_summary
from summarize_event_vm_semantics_gap import write_outputs as write_event_vm_semantics_gap_outputs
from summarize_save_point_candidates import build_summary as build_save_point_candidate_summary
from summarize_save_point_candidates import write_outputs as write_save_point_candidate_outputs
from summarize_collision_fallback_delta import summarize as summarize_collision_fallback_delta
from summarize_scene_dispatch_refs import summarize as summarize_dispatch_refs
from summarize_scene_event_text_refs import build_summary as build_scene_event_text_ref_summary
from summarize_scene_event_text_refs import write_outputs as write_scene_event_text_ref_outputs
from summarize_scene_events import summarize
from summarize_scene_links import structured_links, summarize as summarize_scene_links
from summarize_scene_selector_progress import build_summary as build_scene_selector_progress_summary
from summarize_scene_selector_progress import write_outputs as write_scene_selector_progress_outputs
from summarize_save_selector_references import expand_selector_references as expand_save_selector_references
from summarize_save_selector_references import write_outputs as write_save_selector_reference_outputs
from summarize_save_selector_frontier import build_rows as build_save_selector_frontier_rows
from summarize_save_selector_frontier import write_outputs as write_save_selector_frontier_outputs
from summarize_save_selector_frontier_branches import build_rows as build_save_selector_frontier_branch_rows
from summarize_save_selector_frontier_branches import write_outputs as write_save_selector_frontier_branch_outputs
from summarize_save_selector_branch_paths import build_rows as build_save_selector_branch_path_rows
from summarize_save_selector_branch_paths import write_outputs as write_save_selector_branch_path_outputs
from summarize_save_selector_scene_list_context import build_summary as build_save_selector_scene_list_context_summary
from summarize_save_selector_scene_list_context import write_outputs as write_save_selector_scene_list_context_outputs
from summarize_save_selector_frontier_reader_branch_context import build_summary as build_save_selector_frontier_reader_branch_context_summary
from summarize_save_selector_frontier_reader_branch_context import write_outputs as write_save_selector_frontier_reader_branch_context_outputs
from summarize_save_selector_frontier_payload_shape import build_summary as build_save_selector_frontier_payload_shape_summary
from summarize_save_selector_frontier_payload_shape import write_outputs as write_save_selector_frontier_payload_shape_outputs
from summarize_save_selector_scene_record_sequence import build_summary as build_save_selector_scene_record_sequence_summary
from summarize_save_selector_scene_record_sequence import write_outputs as write_save_selector_scene_record_sequence_outputs
from summarize_save_selector_scene_adjacency_index import build_summary as build_save_selector_scene_adjacency_index_summary
from summarize_save_selector_scene_adjacency_index import write_outputs as write_save_selector_scene_adjacency_index_outputs
from summarize_save_selector_frontier_selection_flow import build_rows as build_save_selector_frontier_selection_flow_rows
from summarize_save_selector_frontier_selection_flow import write_outputs as write_save_selector_frontier_selection_flow_outputs
from summarize_save_selector_selection_writers import scan_operations as scan_save_selector_selection_writers
from summarize_save_selector_selection_writers import write_outputs as write_save_selector_selection_writer_outputs
from summarize_save_selector_current_writer_paths import build_rows as build_save_selector_current_writer_path_rows
from summarize_save_selector_current_writer_paths import write_outputs as write_save_selector_current_writer_path_outputs
from summarize_save_selector_selection_buffer20_provenance import build_summary as build_save_selector_selection_buffer20_provenance_summary
from summarize_save_selector_selection_buffer20_provenance import write_outputs as write_save_selector_selection_buffer20_provenance_outputs
from summarize_save_selector_writer_chain import build_rows as build_save_selector_writer_chain_rows
from summarize_save_selector_writer_chain import write_outputs as write_save_selector_writer_chain_outputs
from summarize_save_selector_gate_paths import build_rows as build_save_selector_gate_path_rows
from summarize_save_selector_gate_paths import write_outputs as write_save_selector_gate_path_outputs
from summarize_save_selector_opcode24_payload import build_rows as build_save_selector_opcode24_payload_rows
from summarize_save_selector_opcode24_payload import write_outputs as write_save_selector_opcode24_payload_outputs
from summarize_save_selector_opcode24_payload_table import build_summary as build_save_selector_opcode24_payload_table_summary
from summarize_save_selector_opcode24_payload_table import write_outputs as write_save_selector_opcode24_payload_table_outputs
from summarize_save_selector_dispatch_stop_context import build_summary as build_save_selector_dispatch_stop_context_summary
from summarize_save_selector_dispatch_stop_context import write_outputs as write_save_selector_dispatch_stop_context_outputs
from summarize_save_selector_data_descriptor_opcode_map import build_summary as build_save_selector_data_descriptor_opcode_map_summary
from summarize_save_selector_data_descriptor_opcode_map import write_outputs as write_save_selector_data_descriptor_opcode_map_outputs
from summarize_save_selector_opcode07_indexed_pointers import build_summary as build_save_selector_opcode07_indexed_pointer_summary
from summarize_save_selector_opcode07_indexed_pointers import write_outputs as write_save_selector_opcode07_indexed_pointer_outputs
from summarize_save_selector_route_pair_descriptor_context import build_summary as build_save_selector_route_pair_descriptor_context_summary
from summarize_save_selector_route_pair_descriptor_context import write_outputs as write_save_selector_route_pair_descriptor_context_outputs
from summarize_save_selector_opcode2c_route_pair_context import build_summary as build_save_selector_opcode2c_route_pair_context_summary
from summarize_save_selector_opcode2c_route_pair_context import write_outputs as write_save_selector_opcode2c_route_pair_context_outputs
from summarize_save_selector_wrapper_descriptor_context import build_summary as build_save_selector_wrapper_descriptor_context_summary
from summarize_save_selector_wrapper_descriptor_context import write_outputs as write_save_selector_wrapper_descriptor_context_outputs
from summarize_save_selector_leaf_table_context import build_summary as build_save_selector_leaf_table_context_summary
from summarize_save_selector_leaf_table_context import write_outputs as write_save_selector_leaf_table_context_outputs
from summarize_save_selector_leaf_table_global_context import build_summary as build_save_selector_leaf_table_global_context_summary
from summarize_save_selector_leaf_table_global_context import write_outputs as write_save_selector_leaf_table_global_context_outputs
from summarize_save_selector_opcode24_handler import build_summary as build_save_selector_opcode24_handler_summary
from summarize_save_selector_opcode24_handler import write_outputs as write_save_selector_opcode24_handler_outputs
from summarize_save_selector_opcode24_globals import build_summary as build_save_selector_opcode24_global_summary
from summarize_save_selector_opcode24_globals import write_outputs as write_save_selector_opcode24_global_outputs
from summarize_save_selector_opcode24_mode1_source_writes import build_summary as build_save_selector_opcode24_mode1_source_write_summary
from summarize_save_selector_opcode24_mode1_source_writes import write_outputs as write_save_selector_opcode24_mode1_source_write_outputs
from summarize_save_selector_opcode24_mode1_runtime_context import build_summary as build_save_selector_opcode24_mode1_runtime_context_summary
from summarize_save_selector_opcode24_mode1_runtime_context import write_outputs as write_save_selector_opcode24_mode1_runtime_context_outputs
from summarize_save_selector_opcode24_runtime_enabled_context import build_summary as build_save_selector_opcode24_runtime_enabled_context_summary
from summarize_save_selector_opcode24_runtime_enabled_context import write_outputs as write_save_selector_opcode24_runtime_enabled_context_outputs
from summarize_save_selector_opcode24_mode1_default_effect import build_summary as build_save_selector_opcode24_mode1_default_effect_summary
from summarize_save_selector_opcode24_mode1_default_effect import write_outputs as write_save_selector_opcode24_mode1_default_effect_outputs
from summarize_save_selector_opcode24_mode1_indirect_context import build_summary as build_save_selector_opcode24_mode1_indirect_context_summary
from summarize_save_selector_opcode24_mode1_indirect_context import write_outputs as write_save_selector_opcode24_mode1_indirect_context_outputs
from summarize_save_selector_opcode24_mode1_file_read_context import build_summary as build_save_selector_opcode24_mode1_file_read_context_summary
from summarize_save_selector_opcode24_mode1_file_read_context import write_outputs as write_save_selector_opcode24_mode1_file_read_context_outputs
from summarize_save_selector_opcode24_mode1_block_writes import build_summary as build_save_selector_opcode24_mode1_block_write_summary
from summarize_save_selector_opcode24_mode1_block_writes import write_outputs as write_save_selector_opcode24_mode1_block_write_outputs
from summarize_save_selector_opcode24_runtime_enabled_block_writes import build_summary as build_save_selector_opcode24_runtime_enabled_block_write_summary
from summarize_save_selector_opcode24_runtime_enabled_block_writes import write_outputs as write_save_selector_opcode24_runtime_enabled_block_write_outputs
from summarize_save_selector_opcode24_current_root_modes import build_summary as build_save_selector_opcode24_current_root_mode_summary
from summarize_save_selector_opcode24_current_root_modes import write_outputs as write_save_selector_opcode24_current_root_mode_outputs
from summarize_opcode24_action_payload_patterns import build_summary as build_opcode24_action_payload_pattern_summary
from summarize_opcode24_action_payload_patterns import write_outputs as write_opcode24_action_payload_pattern_outputs
from summarize_save_selector_object_field_refs import scan_refs as build_save_selector_object_field_ref_summary
from summarize_save_selector_object_field_refs import write_outputs as write_save_selector_object_field_ref_outputs
from summarize_save_selector_object61_consumers import build_summary as build_save_selector_object61_consumer_summary
from summarize_save_selector_object61_consumers import write_outputs as write_save_selector_object61_consumer_outputs
from summarize_save_selector_object61_stream_branch import build_summary as build_save_selector_object61_stream_branch_summary
from summarize_save_selector_object61_stream_branch import write_outputs as write_save_selector_object61_stream_branch_outputs
from summarize_save_selector_object61_stream_operands import build_summary as build_save_selector_object61_stream_operand_summary
from summarize_save_selector_object61_stream_operands import write_outputs as write_save_selector_object61_stream_operand_outputs
from summarize_save_selector_context58_consumers import build_summary as build_save_selector_context58_consumer_summary
from summarize_save_selector_context58_consumers import write_outputs as write_save_selector_context58_consumer_outputs
from summarize_save_selector_branch_selector_equation import build_summary as build_save_selector_branch_selector_equation_summary
from summarize_save_selector_branch_selector_equation import write_outputs as write_save_selector_branch_selector_equation_outputs
from summarize_save_selector_active_flag_sources import build_summary as build_save_selector_active_flag_source_summary
from summarize_save_selector_active_flag_sources import write_outputs as write_save_selector_active_flag_source_outputs
from summarize_save_selector_secondary_state_sources import build_summary as build_save_selector_secondary_state_source_summary
from summarize_save_selector_secondary_state_sources import write_outputs as write_save_selector_secondary_state_source_outputs
from summarize_save_selector_secondary_fill_roots import build_summary as build_save_selector_secondary_fill_root_summary
from summarize_save_selector_secondary_fill_roots import write_outputs as write_save_selector_secondary_fill_root_outputs
from summarize_save_selector_secondary_route_overlap_candidates import build_summary as build_save_selector_secondary_route_overlap_candidate_summary
from summarize_save_selector_secondary_route_overlap_candidates import write_outputs as write_save_selector_secondary_route_overlap_candidate_outputs
from summarize_save_selector_inherited_state_candidates import build_summary as build_save_selector_inherited_state_candidate_summary
from summarize_save_selector_inherited_state_candidates import write_outputs as write_save_selector_inherited_state_candidate_outputs
from summarize_save_selector_predecessor_state_effect import build_summary as build_save_selector_predecessor_state_effect_summary
from summarize_save_selector_predecessor_state_effect import write_outputs as write_save_selector_predecessor_state_effect_outputs
from summarize_save_selector_active_flag_effect import build_summary as build_save_selector_active_flag_effect_summary
from summarize_save_selector_active_flag_effect import write_outputs as write_save_selector_active_flag_effect_outputs
from summarize_save_selector_predecessor_route_order import build_summary as build_save_selector_predecessor_route_order_summary
from summarize_save_selector_predecessor_route_order import write_outputs as write_save_selector_predecessor_route_order_outputs
from summarize_save_selector_set_decomposition import build_summary as build_save_selector_set_decomposition_summary
from summarize_save_selector_set_decomposition import write_outputs as write_save_selector_set_decomposition_outputs
from summarize_save_selector_recomposition_lattice import build_summary as build_save_selector_recomposition_lattice_summary
from summarize_save_selector_recomposition_lattice import write_outputs as write_save_selector_recomposition_lattice_outputs
from summarize_save_selector_address_predecessor_context import build_summary as build_save_selector_address_predecessor_context_summary
from summarize_save_selector_address_predecessor_context import write_outputs as write_save_selector_address_predecessor_context_outputs
from summarize_save_selector_mapset_aliases import build_alias_groups as build_save_selector_mapset_alias_summary
from summarize_save_selector_mapset_aliases import write_outputs as write_save_selector_mapset_alias_outputs
from summarize_save_selector_target_alias_state_effects import build_summary as build_save_selector_target_alias_state_effect_summary
from summarize_save_selector_target_alias_state_effects import write_outputs as write_save_selector_target_alias_state_effect_outputs
from summarize_save_selector_target_alias_bridges import build_summary as build_save_selector_target_alias_bridge_summary
from summarize_save_selector_target_alias_bridges import write_outputs as write_save_selector_target_alias_bridge_outputs
from summarize_runtime_patched_selector_followup_context import build_summary as build_runtime_patched_selector_followup_context_summary
from summarize_runtime_patched_selector_followup_context import write_outputs as write_runtime_patched_selector_followup_context_outputs
from summarize_save_selector_route_root_ref_context import build_summary as build_save_selector_route_root_ref_context_summary
from summarize_save_selector_route_root_ref_context import write_outputs as write_save_selector_route_root_ref_context_outputs
from summarize_save_selector_predecessor_persistence_gap import build_summary as build_save_selector_predecessor_persistence_gap_summary
from summarize_save_selector_predecessor_persistence_gap import write_outputs as write_save_selector_predecessor_persistence_gap_outputs
from summarize_save_selector_predecessor_branch_state_execution_gap import build_summary as build_save_selector_predecessor_branch_state_execution_gap_summary
from summarize_save_selector_predecessor_branch_state_execution_gap import write_outputs as write_save_selector_predecessor_branch_state_execution_gap_outputs
from summarize_save_selector_predecessor_fill_execution_order_gap import build_summary as build_save_selector_predecessor_fill_execution_order_gap_summary
from summarize_save_selector_predecessor_fill_execution_order_gap import write_outputs as write_save_selector_predecessor_fill_execution_order_gap_outputs
from summarize_save_selector_predecessor_fill_opcode10_context import build_summary as build_save_selector_predecessor_fill_opcode10_context_summary
from summarize_save_selector_predecessor_fill_opcode10_context import write_outputs as write_save_selector_predecessor_fill_opcode10_context_outputs
from summarize_save_selector_predecessor_descriptor_bridge_gap import build_summary as build_save_selector_predecessor_descriptor_bridge_gap_summary
from summarize_save_selector_predecessor_descriptor_bridge_gap import write_outputs as write_save_selector_predecessor_descriptor_bridge_gap_outputs
from summarize_save_selector_predecessor_fill_site_execution_context import build_summary as build_save_selector_predecessor_fill_site_execution_context_summary
from summarize_save_selector_predecessor_fill_site_execution_context import write_outputs as write_save_selector_predecessor_fill_site_execution_context_outputs
from summarize_save_selector_predecessor_tail_reset import build_summary as build_save_selector_predecessor_tail_reset_summary
from summarize_save_selector_predecessor_tail_reset import write_outputs as write_save_selector_predecessor_tail_reset_outputs
from summarize_save_selector_predecessor_bridge_refs import build_summary as build_save_selector_predecessor_bridge_ref_summary
from summarize_save_selector_predecessor_bridge_refs import write_outputs as write_save_selector_predecessor_bridge_ref_outputs
from summarize_save_selector_merge_bridge_matrix import build_summary as build_save_selector_merge_bridge_matrix_summary
from summarize_save_selector_merge_bridge_matrix import write_outputs as write_save_selector_merge_bridge_matrix_outputs
from summarize_save_selector_reverse_reuse_context import build_summary as build_save_selector_reverse_reuse_context_summary
from summarize_save_selector_reverse_reuse_context import write_outputs as write_save_selector_reverse_reuse_context_outputs
from summarize_save_selector_merge_gap import build_summary as build_save_selector_merge_gap_summary
from summarize_save_selector_merge_gap import write_outputs as write_save_selector_merge_gap_outputs
from summarize_save_selector_merge_execution_gap import build_summary as build_save_selector_merge_execution_gap_summary
from summarize_save_selector_merge_execution_gap import write_outputs as write_save_selector_merge_execution_gap_outputs
from summarize_save_selector_merge_runtime_context import build_summary as build_save_selector_merge_runtime_context_summary
from summarize_save_selector_merge_runtime_context import write_outputs as write_save_selector_merge_runtime_context_outputs
from summarize_save_selector_merge_closure_context import build_summary as build_save_selector_merge_closure_context_summary
from summarize_save_selector_merge_closure_context import write_outputs as write_save_selector_merge_closure_context_outputs
from summarize_save_selector_wrapper_execution_gap import build_summary as build_save_selector_wrapper_execution_gap_summary
from summarize_save_selector_wrapper_execution_gap import write_outputs as write_save_selector_wrapper_execution_gap_outputs
from summarize_save_selector_selected_pointer_usage import build_summary as build_save_selector_selected_pointer_usage_summary
from summarize_save_selector_selected_pointer_usage import write_outputs as write_save_selector_selected_pointer_usage_outputs
from summarize_save_selector_selected_pointer_opcode_paths import build_summary as build_save_selector_selected_pointer_opcode_path_summary
from summarize_save_selector_selected_pointer_opcode_paths import write_outputs as write_save_selector_selected_pointer_opcode_path_outputs
from summarize_save_selector_global_selected_pointer_paths import build_summary as build_save_selector_global_selected_pointer_path_summary
from summarize_save_selector_global_selected_pointer_paths import write_outputs as write_save_selector_global_selected_pointer_path_outputs
from summarize_save_selector_opcode08_activation_windows import build_summary as build_save_selector_opcode08_activation_window_summary
from summarize_save_selector_opcode08_activation_windows import write_outputs as write_save_selector_opcode08_activation_window_outputs
from summarize_save_selector_opcode08_unreadable_producers import build_summary as build_save_selector_opcode08_unreadable_producer_summary
from summarize_save_selector_opcode08_unreadable_producers import write_outputs as write_save_selector_opcode08_unreadable_producer_outputs
from summarize_save_selector_opcode09_pointer_collisions import build_summary as build_save_selector_opcode09_pointer_collision_summary
from summarize_save_selector_opcode09_pointer_collisions import write_outputs as write_save_selector_opcode09_pointer_collision_outputs
from summarize_save_selector_selected_root_execution_gap import build_summary as build_save_selector_selected_root_execution_gap_summary
from summarize_save_selector_selected_root_execution_gap import write_outputs as write_save_selector_selected_root_execution_gap_outputs
from summarize_save_selector_route_pair_entry_execution_gap import build_summary as build_save_selector_route_pair_entry_execution_gap_summary
from summarize_save_selector_route_pair_entry_execution_gap import write_outputs as write_save_selector_route_pair_entry_execution_gap_outputs
from summarize_save_selector_route_pair_index_source_gap import build_summary as build_save_selector_route_pair_index_source_gap_summary
from summarize_save_selector_route_pair_index_source_gap import write_outputs as write_save_selector_route_pair_index_source_gap_outputs
from summarize_save_selector_secondary_reset_scope import build_summary as build_save_selector_secondary_reset_scope_summary
from summarize_save_selector_secondary_reset_scope import write_outputs as write_save_selector_secondary_reset_scope_outputs
from summarize_save_selector_secondary_block_writes import build_summary as build_save_selector_secondary_block_write_summary
from summarize_save_selector_secondary_block_writes import write_outputs as write_save_selector_secondary_block_write_outputs
from summarize_save_selector_secondary_global_reset_gap import build_summary as build_save_selector_secondary_global_reset_gap_summary
from summarize_save_selector_secondary_global_reset_gap import write_outputs as write_save_selector_secondary_global_reset_gap_outputs
from summarize_save_selector_post_gate_reset_candidates import build_summary as build_save_selector_post_gate_reset_candidate_summary
from summarize_save_selector_post_gate_reset_candidates import write_outputs as write_save_selector_post_gate_reset_candidate_outputs
from summarize_save_selector_branch_gate_consistency import build_summary as build_save_selector_branch_gate_consistency_summary
from summarize_save_selector_branch_gate_consistency import write_outputs as write_save_selector_branch_gate_consistency_outputs
from summarize_save_selector_gate_offset_sources import build_summary as build_save_selector_gate_offset_source_summary
from summarize_save_selector_gate_offset_sources import write_outputs as write_save_selector_gate_offset_source_outputs
from summarize_save_selector_gate_offset_patterns import build_summary as build_save_selector_gate_offset_pattern_summary
from summarize_save_selector_gate_offset_patterns import write_outputs as write_save_selector_gate_offset_pattern_outputs
from summarize_save_selector_selection_buffer_bases import build_summary as build_save_selector_selection_buffer_base_summary
from summarize_save_selector_selection_buffer_bases import write_outputs as write_save_selector_selection_buffer_base_outputs
from summarize_save_selector_gate_base_candidates import build_summary as build_save_selector_gate_base_candidate_summary
from summarize_save_selector_gate_base_candidates import write_outputs as write_save_selector_gate_base_candidate_outputs
from summarize_save_selector_gate_sample_values import build_summary as build_save_selector_gate_sample_value_summary
from summarize_save_selector_gate_sample_values import write_outputs as write_save_selector_gate_sample_value_outputs
from summarize_save_selector_gate_pass_matrix import build_summary as build_save_selector_gate_pass_matrix_summary
from summarize_save_selector_gate_pass_matrix import write_outputs as write_save_selector_gate_pass_matrix_outputs
from summarize_save_selector_opcode20_nested_base_modes import build_summary as build_save_selector_opcode20_nested_base_mode_summary
from summarize_save_selector_opcode20_nested_base_modes import write_outputs as write_save_selector_opcode20_nested_base_mode_outputs
from summarize_save_selector_opcode20_slot_sources import build_summary as build_save_selector_opcode20_slot_source_summary
from summarize_save_selector_opcode20_slot_sources import write_outputs as write_save_selector_opcode20_slot_source_outputs
from summarize_save_selector_opcode20_slot_descriptor_writers import build_summary as build_save_selector_opcode20_slot_descriptor_writer_summary
from summarize_save_selector_opcode20_slot_descriptor_writers import write_outputs as write_save_selector_opcode20_slot_descriptor_writer_outputs
from summarize_save_selector_opcode20_descriptor_scripts import build_summary as build_save_selector_opcode20_descriptor_script_summary
from summarize_save_selector_opcode20_descriptor_scripts import write_outputs as write_save_selector_opcode20_descriptor_script_outputs
from summarize_save_selector_opcode20_object_base_candidates import build_summary as build_save_selector_opcode20_object_base_candidate_summary
from summarize_save_selector_opcode20_object_base_candidates import write_outputs as write_save_selector_opcode20_object_base_candidate_outputs
from summarize_save_selector_opcode20_sample_order_effects import build_summary as build_save_selector_opcode20_sample_order_effect_summary
from summarize_save_selector_opcode20_sample_order_effects import write_outputs as write_save_selector_opcode20_sample_order_effect_outputs
from summarize_save_selector_opcode20_order_space import build_summary as build_save_selector_opcode20_order_space_summary
from summarize_save_selector_opcode20_order_space import write_outputs as write_save_selector_opcode20_order_space_outputs
from summarize_save_selector_opcode20_context_f2_sources import build_summary as build_save_selector_opcode20_context_f2_source_summary
from summarize_save_selector_opcode20_context_f2_sources import write_outputs as write_save_selector_opcode20_context_f2_source_outputs
from summarize_save_selector_opcode20_runtime_materializers import build_summary as build_save_selector_opcode20_runtime_materializer_summary
from summarize_save_selector_opcode20_runtime_materializers import write_outputs as write_save_selector_opcode20_runtime_materializer_outputs
from summarize_save_selector_gate_base_proof_gap import build_summary as build_save_selector_gate_base_proof_gap_summary
from summarize_save_selector_gate_base_proof_gap import write_outputs as write_save_selector_gate_base_proof_gap_outputs
from summarize_save_selector_current_state_sources import build_summary as build_save_selector_current_state_source_summary
from summarize_save_selector_current_state_sources import write_outputs as write_save_selector_current_state_source_outputs
from summarize_save_selector_scene_links import build_links as build_save_selector_scene_links
from summarize_save_selector_scene_links import write_outputs as write_save_selector_scene_link_outputs
from summarize_save_selector_xrefs import build_rows as build_save_selector_xref_rows
from summarize_save_selector_xrefs import write_outputs as write_save_selector_xref_outputs
from summarize_save_selector_leaf_streams import build_rows as build_save_selector_leaf_stream_rows
from summarize_save_selector_leaf_streams import write_outputs as write_save_selector_leaf_stream_outputs
from summarize_save_selector_stream_traces import build_rows as build_save_selector_stream_trace_rows
from summarize_save_selector_stream_traces import write_outputs as write_save_selector_stream_trace_outputs
from summarize_save_selector_leaf_index_space import build_summary as build_save_selector_leaf_index_space_summary
from summarize_save_selector_leaf_index_space import write_outputs as write_save_selector_leaf_index_space_outputs
from summarize_save_selector_runtime_selector_byte_writes import build_summary as build_save_selector_runtime_selector_byte_write_summary
from summarize_save_selector_runtime_selector_byte_writes import write_outputs as write_save_selector_runtime_selector_byte_write_outputs
from summarize_save_selector_current_root_frontier_paths import build_summary as build_save_selector_current_root_frontier_path_summary
from summarize_save_selector_current_root_frontier_paths import write_outputs as write_save_selector_current_root_frontier_path_outputs
from summarize_save_selector_branch_state import build_summary as build_save_selector_branch_state_summary
from summarize_save_selector_branch_state import write_outputs as write_save_selector_branch_state_outputs
from summarize_save_selector_branch_state_writers import build_summary as build_save_selector_branch_state_writer_summary
from summarize_save_selector_branch_state_writers import write_outputs as write_save_selector_branch_state_writer_outputs
from summarize_save_selector_branch_state_dispatch import build_summary as build_save_selector_branch_state_dispatch_summary
from summarize_save_selector_branch_state_dispatch import write_outputs as write_save_selector_branch_state_dispatch_outputs
from summarize_save_selector_branch_state_opcode_overlap import build_summary as build_save_selector_branch_state_opcode_overlap_summary
from summarize_save_selector_branch_state_opcode_overlap import write_outputs as write_save_selector_branch_state_opcode_overlap_outputs
from summarize_save_selector_selection_state import build_summary as build_save_selector_selection_state_summary
from summarize_save_selector_selection_state import write_outputs as write_save_selector_selection_state_outputs
from summarize_save_loader_trace import build_summary as build_save_loader_trace_summary
from summarize_save_loader_trace import write_outputs as write_save_loader_trace_outputs
from summarize_runtime_save_path_context import build_summary as build_runtime_save_path_context_summary
from summarize_runtime_save_path_context import write_outputs as write_runtime_save_path_context_outputs
from summarize_script_handler_table import build_summary as build_script_handler_table_summary
from summarize_script_handler_table import write_outputs as write_script_handler_table_outputs
from summarize_save_selector_dispatch_table_context import build_summary as build_save_selector_dispatch_table_context_summary
from summarize_save_selector_dispatch_table_context import write_outputs as write_save_selector_dispatch_table_context_outputs
from summarize_tileset_candidates import summarize as summarize_tileset_candidates
from summarize_tile_class_coverage import summarize as summarize_tile_class_coverage
from summarize_tile_class_gaps import markdown as tile_class_gaps_markdown
from summarize_tile_class_gaps import summarize as summarize_tile_class_gaps
from summarize_tile_class_gaps import summary as summarize_tile_class_gap_summary
from summarize_tile_pair_class_gaps import markdown as tile_pair_class_gaps_markdown
from summarize_tile_pair_class_gaps import index_markdown as tile_pair_class_gap_index_markdown
from summarize_tile_pair_class_gaps import summarize as summarize_tile_pair_class_gaps
from summarize_tile_pair_class_gaps import write_tileset_pages as write_tile_pair_class_gap_pages
from tile_classes import load as load_tile_classes
from tile_classes import validate_capacities as validate_tile_class_capacities
from tile_classes import write_outputs as write_tile_class_outputs
from transition_reviews import load_reviews as load_transition_reviews
from transition_reviews import transition_index as transition_review_index
from transition_reviews import validate_maps as validate_transition_review_maps
from transition_reviews import write_gap_outputs as write_transition_review_gap_outputs
from transition_reviews import write_outputs as write_transition_review_outputs


ROOT = Path(__file__).resolve().parents[1]
EXTRACT_FLD = ROOT / "extract_fld"
OUT = ROOT / "out"
PARKED_SAVEDATA_SAMPLE_GATE_VALUES = {"status": "parked", "samples": []}
PARKED_SAVEDATA_SAMPLE_PARTY_ORDER = {"status": "parked", "samples": []}
RUNTIME_MAP_NAMES = {
    "map1_01a",
    "map1_02b",
    "map3_09a",
}
OPTIONAL_REVIEW_OUTPUT_DIRS = [
    "tile_class_gap_galleries",
    "tile_pair_class_gaps",
    "map_tile_class_gaps",
    "tile_usage",
    "transition_review_gaps",
    "transition_review_patches",
]


def parked_savedata_sample_coverage() -> dict:
    return {
        "status": "parked",
        "sampleCount": 0,
        "sampleSelectors": [],
        "currentFrontierSelector": "",
        "currentFrontierSampleCovered": False,
        "routePairSampleCovered": False,
        "remainingProofs": ["savedata analysis parked; see docs/SAVEDATA_PARKED.md"],
        "promotionStatus": "parked",
        "semanticCoverage": {
            "expectedSaveSize": 0,
            "knownSemanticByteCount": 0,
            "knownSemanticFields": [],
            "knownFieldCount": 0,
            "unknownByteCount": 0,
            "unknownVaryingByteCount": 0,
            "unknownVaryingRanges": [],
            "unsupportedOriginalSystems": [],
            "equipmentEvidence": {"status": "parked", "source": "docs/SAVEDATA_PARKED.md"},
        },
    }


def parked_savedata_sample_deltas() -> dict:
    return {
        "status": "parked",
        "sampleCount": 0,
        "sampleSelectors": [],
        "currentSelector": "",
        "currentSelectorPublicSampleCount": 0,
        "routePairPublicSampleCount": 0,
        "routeCriticalOffsets": [],
        "selectorDistinguishingOffsetCount": 0,
        "selectorDistinguishingOffsets": [],
        "closestPublicSourceTargetPair": {},
        "semanticCoverage": parked_savedata_sample_coverage()["semanticCoverage"],
        "samples": [],
        "promotionStatus": "parked",
    }


def parked_savedata_offset_triage_clusters() -> dict:
    return {
        "status": "parked",
        "knownSemanticByteCount": 0,
        "unknownVaryingRangeCount": 0,
        "unknownVaryingByteCount": 0,
        "routeCriticalOffsetCount": 0,
        "bucketRows": [],
        "routeControlRows": [],
        "inventoryEquipmentRows": [],
        "pairDecodeRows": [],
    }


def parked_savedata_targeted_delta_intake() -> dict:
    return {
        "status": "parked",
        "rows": [],
        "providedCapturePairCount": 0,
        "validCapturePairCount": 0,
        "missingCapturePairCount": 0,
        "manifestFound": False,
        "nonPromoting": True,
    }


def parked_synthetic_savedata_selector_probe() -> dict:
    return {
        "status": "parked",
        "syntheticDiagnosticExcluded": True,
        "routeProofCandidate": False,
        "realRouteProofCandidate": False,
    }


def parked_real_savedata_evidence_gap() -> dict:
    return {
        "status": "parked",
        "candidateCount": 0,
        "realCandidateCount": 0,
        "validRealCandidateCount": 0,
        "validRealUniqueSha256Count": 0,
        "archiveCandidateCount": 0,
        "archiveSkippedCount": 0,
        "workspaceDatFileCount": 0,
        "workspaceExpectedSizeDatFileCount": 0,
        "workspaceZipDatMemberCount": 0,
        "workspaceHiddenExpectedSizeDatFileCount": 0,
        "validRealCandidatesAllBlocked": True,
        "validRealCandidateBlockReasonCounts": {"savedata-parked": 1},
        "currentSelector": "",
        "currentSelectorRealSaveCount": 0,
        "selectedPointerRealSaveCount": 0,
        "routePairRealSaveCount": 0,
        "routePromotionRealSaveCount": 0,
        "proofFound": False,
        "routeEvidenceProofFound": False,
        "realSelector20SaveFound": False,
        "routeEvidenceRejectionClassification": "savedata-parked",
        "requiredSelectorBytePairRealSaveCount": 0,
        "requiredByteCoverage": {"requiredSelectorBytePairRealSaveCount": 0},
        "capturedRoutePairGap": {"sourceOnlyCount": 0, "targetOnlyCount": 0, "routePairCount": 0},
        "publicSampleSelectors": [],
        "publicSearchNotes": ["savedata analysis parked; see docs/SAVEDATA_PARKED.md"],
        "publicCurrentFrontierCovered": False,
        "publicRoutePairCovered": False,
        "syntheticDiagnosticExcluded": True,
        "failedSavedataGateIds": ["savedata-parked"],
        "missingProofs": ["savedata analysis parked"],
        "missingEvidence": ["savedata analysis parked"],
        "evidenceRefCount": 1,
        "promotionStatus": "parked",
    }


def js_json(data) -> str:
    return json.dumps(data, ensure_ascii=False, separators=(",", ":"))


def parse_args() -> argparse.Namespace:
    parser = argparse.ArgumentParser(description=__doc__)
    parser.add_argument(
        "--keep-review-previews",
        action="store_true",
        help=(
            "keep optional review preview/detail directories under out/. "
            "Default build prunes them after writing metadata so the VM disk stays small."
        ),
    )
    return parser.parse_args()


def prune_optional_review_outputs(out_dir: Path) -> list[str]:
    removed = []
    for dirname in OPTIONAL_REVIEW_OUTPUT_DIRS:
        path = out_dir / dirname
        if not path.exists():
            continue
        shutil.rmtree(path)
        removed.append(dirname)
    return removed


def write_playable_progress_runtime(summary: dict, out_dir: Path) -> None:
    runtime = {
        "startMap": summary.get("startMap"),
        "reachableFromStart": summary.get("reachableFromStart") or [],
        "saveSelectorCandidateReachableFromStart": summary.get("saveSelectorCandidateReachableFromStart") or [],
        "saveSelectorCandidateReachableEdges": [
            {
                "source": edge.get("source"),
                "target": edge.get("target"),
                "promotionRisk": edge.get("promotionRisk"),
            }
            for edge in summary.get("saveSelectorCandidateReachableEdges") or []
            if edge.get("source") and edge.get("target")
        ],
    }
    (out_dir / "playable_progress_runtime.js").write_text(
        "window.HWANSE_PLAYABLE_PROGRESS = "
        + js_json(runtime)
        + ";\n",
        encoding="utf-8",
    )

BASE_IMAGE_ASSETS = [
    "title.cns",
    "map_a1.cns",
    "map_a2.cns",
    "cara_at1.cns",
    "cara_sm1.cns",
    "cara_rs1.cns",
    "btl_etc.cns",
    "btl_efc.cns",
    "btl_at.cns",
    "btl_sm.cns",
    "btl_rs.cns",
    "window.cns",
    "icon.cns",
    "frame.cns",
    "num.cns",
    "item.cns",
    "status.cns",
    "face_01.cns",
]

CHARACTER_FRAME_WIDTH = 48
CHARACTER_FRAME_HEIGHT = 64
CHARACTER_WALK_FRAMES = 5
CHARACTER_IDLE_FRAME = 0
CHARACTER_FIRST_WALK_FRAME = 1
CHARACTER_SPRITES = [
    ("Ataho", "cara_at1.cns"),
    ("Smashu", "cara_sm1.cns"),
    ("Rinshan", "cara_rs1.cns"),
]
CHARACTER_DIRECTIONS = [
    ("down", 0, 0),
    ("left", 0, 5),
    ("up", 1, 0),
    ("right", 1, 5),
]


def require_sources(names: list[str]) -> list[Path]:
    paths = [EXTRACT_FLD / name for name in dict.fromkeys(names)]
    missing = [path for path in paths if not path.exists()]
    if missing:
        joined = "\n".join(f"  {path}" for path in missing)
        raise SystemExit(
            "missing extracted FLD entries:\n"
            f"{joined}\n"
            "run `python3 tools/extract_fld.py` first"
        )
    return paths


def png_color_type(path: Path) -> int | None:
    try:
        header = path.read_bytes()[:26]
    except FileNotFoundError:
        return None
    if len(header) < 26 or header[:8] != b"\x89PNG\r\n\x1a\n" or header[12:16] != b"IHDR":
        return None
    return header[25]


def cns_uses_palette0_transparency(src: Path) -> bool:
    stem = src.stem
    if stem.startswith(("cara_", "btl_", "z", "boss")):
        return True
    # Map tileset 1 is the opaque ground layer. Tilesets 2/3 are foreground
    # overlays, and palette index 0 is the transparent cutout color.
    return len(stem) == 6 and stem.startswith("map_") and stem[4].isalpha() and stem[5] in {"2", "3"}


def decode_if_stale(src: Path, dst: Path) -> None:
    if dst.is_dir():
        shutil.rmtree(dst)
    transparent_palette0 = cns_uses_palette0_transparency(src)
    needs_alpha_refresh = transparent_palette0 and png_color_type(dst) != 6
    if dst.exists() and dst.stat().st_mtime >= src.stat().st_mtime and not needs_alpha_refresh:
        return
    decode_file(src, dst, transparent_palette0=transparent_palette0)


def write_character_sprite_review(dst: Path) -> None:
    """Legacy review output kept for one-off local use.

    Active pages use field_character_review/cns_rect_review instead. This
    writer renders directly from CNS canvases and is no longer called by the
    normal asset build.
    """
    cards = []
    for title, cns in CHARACTER_SPRITES:
        rows = []
        for direction, row, col in CHARACTER_DIRECTIONS:
            frames = []
            for frame in range(CHARACTER_WALK_FRAMES):
                x = (col + frame) * CHARACTER_FRAME_WIDTH
                y = row * CHARACTER_FRAME_HEIGHT
                frames.append(
                    '<canvas class="frame" '
                    f'data-cns="../extract_fld/{cns}" '
                    f'data-x="{x}" data-y="{y}" '
                    f'width="{CHARACTER_FRAME_WIDTH}" height="{CHARACTER_FRAME_HEIGHT}"></canvas>'
                )
            rows.append(
                '<div class="row">'
                f'<span class="label">{direction}</span>'
                f'{"".join(frames)}'
                '</div>'
            )
        cards.append(
            '<section>'
            f'<h2>{title}</h2>'
            f'<p><code>{cns}</code> sliced as {CHARACTER_FRAME_WIDTH}x{CHARACTER_FRAME_HEIGHT}, '
            '5 direction frames per direction. Frame 0 is idle; moving uses frames 1-4.</p>'
            f'{"".join(rows)}'
            '</section>'
        )
    dst.write_text(
        '<!doctype html>\n'
        '<html lang="en">\n'
        '<head>\n'
        '  <meta charset="utf-8">\n'
        '  <meta name="viewport" content="width=device-width, initial-scale=1">\n'
        '  <title>Character Sprite Frames</title>\n'
        '  <style>\n'
        '    :root { color-scheme: dark; font-family: system-ui, sans-serif; background: #111; color: #eee; }\n'
        '    body { margin: 0; padding: 24px; }\n'
        '    h1 { margin: 0 0 8px; font-size: 24px; }\n'
        '    p { color: #bbb; margin: 0 0 14px; }\n'
        '    section { margin: 22px 0; }\n'
        '    h2 { margin: 0 0 8px; font-size: 18px; }\n'
        '    .row { display: flex; align-items: center; gap: 8px; margin: 8px 0; }\n'
        '    .label { width: 44px; color: #bbb; font: 13px ui-monospace, monospace; }\n'
        f'    .frame {{ display: inline-block; width: {CHARACTER_FRAME_WIDTH}px; '
        f'height: {CHARACTER_FRAME_HEIGHT}px; image-rendering: pixelated;'
        ' background-repeat: no-repeat; background-color: #252525; border: 1px solid #444; }\n'
        '    code { color: #9bd4ff; }\n'
        '  </style>\n'
        '</head>\n'
        '<body>\n'
        '  <h1>Character Sprite Frames</h1>\n'
        '  <p>Runtime walking uses frame 0 only while standing and skips it while moving.</p>\n'
        f'  {"".join(cards)}\n'
        '  <script src="../web/engine/cns/renderer.js"></script>\n'
        '  <script>\n'
        '    (async () => {\n'
        '      const cache = new Map();\n'
        '      for (const canvas of document.querySelectorAll(".frame")) {\n'
        '        let image = cache.get(canvas.dataset.cns);\n'
        '        if (!image) {\n'
        '          image = await window.HWANSE_CNS_RENDERER.loadImageCanvas(canvas.dataset.cns);\n'
        '          cache.set(canvas.dataset.cns, image);\n'
        '        }\n'
        '        const ctx = canvas.getContext("2d");\n'
        '        ctx.imageSmoothingEnabled = false;\n'
        '        ctx.drawImage(image, Number(canvas.dataset.x), Number(canvas.dataset.y), canvas.width, canvas.height, 0, 0, canvas.width, canvas.height);\n'
        '      }\n'
        '    })();\n'
        '  </script>\n'
        '</body>\n'
        '</html>\n',
        encoding="utf-8",
    )


def character_frame_metadata(src: Path) -> dict:
    decoded = decompress_cns(src.read_bytes())
    width, height, palette, pixels, bpp = parse_image(decoded)
    rgb = indices_to_rgb(width, height, palette, pixels, bpp)
    bg = tuple(rgb[:3])

    def pixel(x: int, y: int) -> tuple[int, int, int]:
        offset = (y * width + x) * 3
        return tuple(rgb[offset : offset + 3])

    directions = []
    for direction, row, col in CHARACTER_DIRECTIONS:
        frames = []
        for frame in range(CHARACTER_WALK_FRAMES):
            x0 = (col + frame) * CHARACTER_FRAME_WIDTH
            y0 = row * CHARACTER_FRAME_HEIGHT
            min_x = CHARACTER_FRAME_WIDTH
            min_y = CHARACTER_FRAME_HEIGHT
            max_x = -1
            max_y = -1
            opaque = 0
            for y in range(y0, y0 + CHARACTER_FRAME_HEIGHT):
                for x in range(x0, x0 + CHARACTER_FRAME_WIDTH):
                    if pixel(x, y) == bg:
                        continue
                    opaque += 1
                    min_x = min(min_x, x - x0)
                    min_y = min(min_y, y - y0)
                    max_x = max(max_x, x - x0)
                    max_y = max(max_y, y - y0)
            frames.append({
                "index": frame,
                "sourceX": x0,
                "sourceY": y0,
                "width": CHARACTER_FRAME_WIDTH,
                "height": CHARACTER_FRAME_HEIGHT,
                "opaquePixels": opaque,
                "bbox": None if opaque == 0 else [min_x, min_y, max_x, max_y],
            })
        directions.append({"name": direction, "row": row, "col": col, "frames": frames})

    special_frames = []
    for row in range(height // CHARACTER_FRAME_HEIGHT):
        for col in range(10, width // CHARACTER_FRAME_WIDTH):
            x0 = col * CHARACTER_FRAME_WIDTH
            y0 = row * CHARACTER_FRAME_HEIGHT
            opaque = 0
            for y in range(y0, y0 + CHARACTER_FRAME_HEIGHT):
                for x in range(x0, x0 + CHARACTER_FRAME_WIDTH):
                    if pixel(x, y) != bg:
                        opaque += 1
            if opaque:
                special_frames.append({
                    "row": row,
                    "col": col,
                    "sourceX": x0,
                    "sourceY": y0,
                    "opaquePixels": opaque,
                })

    return {
        "file": src.name,
        "width": width,
        "height": height,
        "backgroundRgb": list(bg),
        "frameWidth": CHARACTER_FRAME_WIDTH,
        "frameHeight": CHARACTER_FRAME_HEIGHT,
        "walkFramesPerDirection": CHARACTER_WALK_FRAMES,
        "idleFrame": CHARACTER_IDLE_FRAME,
        "movingFrames": list(range(CHARACTER_FIRST_WALK_FRAME, CHARACTER_WALK_FRAMES)),
        "directions": directions,
        "specialFrames": special_frames,
    }


def write_character_sprite_metadata(out_dir: Path) -> None:
    records = [
        character_frame_metadata(EXTRACT_FLD / cns)
        for _title, cns in CHARACTER_SPRITES
    ]
    (out_dir / "character_sprite_frames.json").write_text(
        json.dumps(records, ensure_ascii=False, indent=2) + "\n",
        encoding="utf-8",
    )


def linked_object_assets(events: list[dict]) -> list[str]:
    assets = {
        linked
        for event in events
        for linked in event.get("linkedStrings", [])
        if linked.endswith(".cns")
    }
    return sorted(assets)


def enemy_object_sprite_assets() -> list[str]:
    return sorted(
        {
            path.name
            for pattern in ("boss*.cns", "z*.cns")
            for path in EXTRACT_FLD.glob(pattern)
        }
    )


def map_metadata(manifest: list[dict]) -> dict[str, dict]:
    by_map: dict[str, list[dict]] = defaultdict(list)
    for item in manifest:
        by_map[item["map"]].append(item)

    metadata = {}
    for name, records in by_map.items():
        records.sort(key=lambda item: item["recordVa"])
        variants = sorted({tuple(record["tilesets"]) for record in records})
        selected = records[0]
        metadata[name] = {
            "sceneId": selected["sceneId"],
            "sceneIdHex": selected["sceneIdHex"],
            "recordVa": selected["recordVa"],
            "tilesets": selected["tilesets"],
            "variantCount": len(variants),
            "tilesetVariants": [list(variant) for variant in variants],
        }
    return metadata


def main() -> None:
    args = parse_args()
    OUT.mkdir(parents=True, exist_ok=True)

    exe_data = (ROOT / "Hwanse2.exe").read_bytes()
    sections = read_sections(exe_data)
    runtime_patched_selector_active_order_poll = (
        json.loads((OUT / "runtime_selected_pointer_patched_public_selector_2_0_active_order_poll.json").read_text(encoding="utf-8"))
        if (OUT / "runtime_selected_pointer_patched_public_selector_2_0_active_order_poll.json").exists()
        else {}
    )
    runtime_patched_selector_branch_state_poll = (
        json.loads((OUT / "runtime_selected_pointer_patched_public_selector_2_0_branch_state_poll.json").read_text(encoding="utf-8"))
        if (OUT / "runtime_selected_pointer_patched_public_selector_2_0_branch_state_poll.json").exists()
        else {}
    )
    runtime_predecessor_direction_sweep_active_order_poll = (
        json.loads((OUT / "runtime_selected_pointer_predecessor_direction_sweep_active_order_poll.json").read_text(encoding="utf-8"))
        if (OUT / "runtime_selected_pointer_predecessor_direction_sweep_active_order_poll.json").exists()
        else {}
    )
    runtime_predecessor_left_overrun_active_order_poll = (
        json.loads((OUT / "runtime_selected_pointer_predecessor_left_overrun_activation_active_order_poll.json").read_text(encoding="utf-8"))
        if (OUT / "runtime_selected_pointer_predecessor_left_overrun_activation_active_order_poll.json").exists()
        else {}
    )
    exe_imports = parse_imports(ROOT / "Hwanse2.exe")
    (OUT / "exe_imports.json").write_text(
        json.dumps(exe_imports, ensure_ascii=False, indent=2) + "\n",
        encoding="utf-8",
    )
    print(f"wrote EXE import summary -> {OUT / 'exe_imports.json'}")
    audio_archive_manifest = build_audio_archive_manifest_summary(ROOT)
    write_audio_archive_manifest_outputs(audio_archive_manifest, OUT)
    print(f"wrote audio archive manifest -> {OUT / 'audio_archive_manifest.html'}")
    audio_title_provenance = build_audio_title_provenance_summary(ROOT)
    write_audio_title_provenance_outputs(audio_title_provenance, OUT)
    print(f"wrote audio title provenance -> {OUT / 'audio_title_provenance.html'}")
    directdraw_flow = build_directdraw_flow_summary(ROOT / "Hwanse2.exe", exe_imports=exe_imports)
    write_directdraw_flow_outputs(directdraw_flow, OUT)
    print(f"wrote DirectDraw flow -> {OUT / 'directdraw_flow.html'}")
    runtime_timing = build_runtime_timing_summary(ROOT / "Hwanse2.exe")
    write_runtime_timing_outputs(runtime_timing, OUT)
    print(f"wrote runtime timing -> {OUT / 'runtime_timing.html'}")
    runtime_movement = build_runtime_movement_summary(ROOT / "Hwanse2.exe")
    write_runtime_movement_outputs(runtime_movement, OUT)
    print(f"wrote runtime movement -> {OUT / 'runtime_movement.md'}")
    input_keymap = build_input_keymap_summary(ROOT / "Hwanse2.exe")
    (OUT / "input_keymap.json").write_text(
        json.dumps(input_keymap, ensure_ascii=False, indent=2) + "\n",
        encoding="utf-8",
    )
    (OUT / "input_keymap.md").write_text(input_keymap_markdown(input_keymap), encoding="utf-8")
    (OUT / "input_keymap.js").write_text(
        "window.HWANSE_INPUT_KEYMAP = "
        + js_json(input_keymap)
        + ";\n",
        encoding="utf-8",
    )
    print(f"wrote original input keymap -> {OUT / 'input_keymap.md'}")
    korean_text_candidates = build_korean_text_candidate_summary(exe_data, exe_path=ROOT / "Hwanse2.exe")
    write_korean_text_candidate_outputs(korean_text_candidates, OUT)
    print(f"wrote Korean text candidates -> {OUT / 'korean_text_candidates.json'}")
    cns_text_candidates = build_cns_text_candidate_summary(EXTRACT_FLD)
    write_cns_text_candidate_outputs(cns_text_candidates, OUT)
    print(f"wrote CNS text candidates -> {OUT / 'cns_text_candidates.html'}")
    text_tables = build_text_table_summary(korean_text_candidates)
    write_text_table_outputs(text_tables, OUT)
    print(f"wrote text tables -> {OUT / 'text_tables.json'}")
    text_routine_callers = build_text_routine_caller_summary(exe_data, korean_text_candidates, ROOT / "Hwanse2.exe")
    write_text_routine_caller_outputs(text_routine_callers, OUT)
    print(f"wrote text routine callers -> {OUT / 'text_routine_callers.json'}")
    events = extract_events(exe_data, EXTRACT_FLD)
    scene_event_text_refs = build_scene_event_text_ref_summary(exe_data, events, korean_text_candidates)
    write_scene_event_text_ref_outputs(scene_event_text_refs, OUT)
    print(f"wrote scene event text refs -> {OUT / 'scene_event_text_refs.json'}")
    manifest = extract_manifest(exe_data, max_dwords=80)
    save_scene_selectors = extract_save_scene_selectors(exe_data)
    save_loader_trace = build_save_loader_trace_summary(exe_data)
    write_save_loader_trace_outputs(save_loader_trace, OUT)
    runtime_save_path_context = build_runtime_save_path_context_summary(exe_data, exe_imports)
    write_runtime_save_path_context_outputs(runtime_save_path_context, OUT)
    (OUT / "save_scene_selectors.json").write_text(
        json.dumps(save_scene_selectors, ensure_ascii=False, separators=(",", ":")) + "\n",
        encoding="utf-8",
    )
    (OUT / "save_scene_selectors.js").write_text(
        "window.HWANSE_SAVE_SCENE_SELECTORS = "
        + js_json(save_scene_selectors)
        + ";\n",
        encoding="utf-8",
    )
    savedata_sample_coverage = parked_savedata_sample_coverage()
    savedata_sample_deltas = parked_savedata_sample_deltas()
    savedata_offset_triage_clusters = parked_savedata_offset_triage_clusters()
    savedata_targeted_delta_intake = parked_savedata_targeted_delta_intake()
    scene_selector_progress = build_scene_selector_progress_summary(save_scene_selectors)
    write_scene_selector_progress_outputs(scene_selector_progress, OUT)
    save_selector_references = expand_save_selector_references(
        exe_data,
        save_scene_selectors,
        manifest=manifest,
    )
    write_save_selector_reference_outputs(save_selector_references, OUT)
    save_selector_scene_links = build_save_selector_scene_links(save_selector_references)
    write_save_selector_scene_link_outputs(save_selector_scene_links, OUT)
    coordinate_candidates = extract_coordinate_candidates(exe_data, EXTRACT_FLD, 80)
    metadata_by_map = map_metadata(manifest)
    object_assets = linked_object_assets(events)
    enemy_assets = enemy_object_sprite_assets()
    tileset_assets = sorted(path.name for path in EXTRACT_FLD.glob("map_[a-z][123].cns"))
    event_map_names = {event["map"] for event in events}
    map_assets = sorted({path.name for path in EXTRACT_FLD.glob("map[0-9]*.cns")} | {f"{name}.cns" for name in event_map_names})
    scene_link_data = structured_links(events)
    runtime_map_names = set(RUNTIME_MAP_NAMES) | event_map_names
    for entry in scene_link_data.values():
        runtime_map_names.update(entry.get("fieldMaps") or [])
    for entry in save_scene_selectors:
        runtime_map_names.update(entry.get("fieldMaps") or [])

    if os.environ.get("HWANSE_WRITE_LEGACY_PNG") == "1":
        for src in require_sources([*BASE_IMAGE_ASSETS, *tileset_assets, *object_assets, *enemy_assets]):
            decode_if_stale(src, OUT / f"{src.stem}.png")
    else:
        print("skipped legacy decoded PNG generation; browser pages render CNS directly")
    write_character_sprite_metadata(OUT)

    export_maps(require_sources(map_assets), OUT / "maps.js", metadata_by_map)
    runtime_map_assets = sorted(
        name
        for name in map_assets
        if Path(name).stem in runtime_map_names
    )
    export_map_chunks(
        require_sources(runtime_map_assets),
        OUT / "maps_runtime.js",
        OUT / "maps_runtime_chunks",
        metadata_by_map,
    )
    battle_backgrounds = export_battle_backgrounds(OUT, EXTRACT_FLD)
    map_data = load_maps(OUT / "maps.js")
    tile_classes = load_tile_classes(ROOT / "data" / "tile_classes.json")
    validate_tile_class_capacities(tile_classes)
    cns_payloads = [classify_payload(path) for path in sorted(EXTRACT_FLD.glob("*.cns"))]
    (OUT / "cns_payloads.json").write_text(
        json.dumps(cns_payloads, ensure_ascii=False, indent=2) + "\n",
        encoding="utf-8",
    )
    print(f"wrote {len(cns_payloads)} CNS payload classifications -> {OUT / 'cns_payloads.json'}")
    print(f"wrote {len(save_scene_selectors)} save scene selectors -> {OUT / 'save_scene_selectors.json'}")

    (OUT / "scene_manifest.json").write_text(
        json.dumps(manifest, ensure_ascii=False, separators=(",", ":")) + "\n",
        encoding="utf-8",
    )
    print(f"wrote {len(manifest)} scene records -> {OUT / 'scene_manifest.json'}")

    (OUT / "scene_events.json").write_text(
        json.dumps(events, ensure_ascii=False, indent=2) + "\n",
        encoding="utf-8",
    )
    (OUT / "scene_events.js").write_text(
        "window.HWANSE_SCENE_EVENTS = "
        + js_json(events)
        + ";\n",
        encoding="utf-8",
    )
    (OUT / "object_assets.js").write_text(
        "window.HWANSE_OBJECT_ASSETS = "
        + json.dumps(
            {
                Path(asset).stem: f"../extract_fld/{Path(asset).stem}.cns"
                for asset in object_assets
            },
            ensure_ascii=False,
            separators=(",", ":"),
        )
        + ";\n",
        encoding="utf-8",
    )
    event_transitions = transition_records(events)
    (OUT / "event_transitions.json").write_text(
        json.dumps(event_transitions, ensure_ascii=False, indent=2) + "\n",
        encoding="utf-8",
    )
    (OUT / "event_transitions.js").write_text(
        "window.HWANSE_EVENT_TRANSITIONS = "
        + js_json(event_transitions)
        + ";\n",
        encoding="utf-8",
    )
    map_render_reviews = load_map_render_reviews(
        ROOT / "data" / "map_render_reviews.json",
        map_render_review_index(map_data, scene_link_data),
    )
    write_map_render_review_outputs(map_render_reviews, OUT)
    map_render_review_rows = map_render_review_coverage_rows(
        map_data,
        map_render_review_index(map_data, scene_link_data),
        map_render_reviews,
    )
    transition_reviews = load_transition_reviews(
        ROOT / "data" / "transition_reviews.json",
        transition_review_index(event_transitions),
    )
    validate_transition_review_maps(transition_reviews, map_data)
    write_transition_review_outputs(transition_reviews, OUT)
    transition_gap_rows = write_transition_review_gap_outputs(
        transition_review_index(event_transitions),
        transition_reviews,
        OUT,
        map_data,
    )
    transition_review_shortlist = build_transition_review_shortlist_rows(transition_gap_rows)
    write_transition_review_shortlist_outputs(transition_review_shortlist, OUT)
    playable_progress = build_playable_progress_summary(
        map_data,
        event_transitions,
        transition_reviews,
        start_map="map1_02b",
        transition_gap_rows=transition_gap_rows,
        save_selector_scene_links=save_selector_scene_links,
    )
    write_playable_progress_outputs(playable_progress, OUT)
    save_selector_frontier = build_save_selector_frontier_rows(
        playable_progress,
        save_selector_scene_links,
        manifest,
        events,
        event_transitions,
    )
    write_save_selector_frontier_outputs(save_selector_frontier, OUT)
    field_map_record_roots = build_field_map_record_root_summary(
        manifest,
        events,
        save_selector_references,
        save_selector_frontier,
        map_render_reviews,
    )
    write_field_map_record_root_outputs(field_map_record_roots, OUT)
    transition_review_shortlist = build_transition_review_shortlist_rows(
        transition_gap_rows,
        field_map_roots=field_map_record_roots,
    )
    write_transition_review_shortlist_outputs(transition_review_shortlist, OUT)
    transition_review_shortlist_audit = build_transition_review_shortlist_audit(transition_review_shortlist, OUT)
    save_selector_xrefs = build_save_selector_xref_rows(
        exe_data,
        sections,
        save_selector_frontier,
        save_selector_references,
        save_scene_selectors,
    )
    write_save_selector_xref_outputs(save_selector_xrefs, OUT)
    save_selector_leaf_streams = build_save_selector_leaf_stream_rows(exe_data, save_selector_frontier)
    write_save_selector_leaf_stream_outputs(save_selector_leaf_streams, OUT)
    save_selector_scene_record_sequence = build_save_selector_scene_record_sequence_summary(save_selector_leaf_streams)
    write_save_selector_scene_record_sequence_outputs(save_selector_scene_record_sequence, OUT)
    save_selector_scene_adjacency_index = build_save_selector_scene_adjacency_index_summary(
        save_selector_references,
        event_transitions,
        transition_reviews,
    )
    write_save_selector_scene_adjacency_index_outputs(save_selector_scene_adjacency_index, OUT)
    save_selector_runtime_selector_byte_writes = build_save_selector_runtime_selector_byte_write_summary(
        exe_data,
        save_scene_selectors,
        save_selector_leaf_streams,
    )
    write_save_selector_runtime_selector_byte_write_outputs(save_selector_runtime_selector_byte_writes, OUT)
    script_handler_table = build_script_handler_table_summary(exe_data, save_selector_leaf_streams)
    write_script_handler_table_outputs(script_handler_table, OUT)
    save_selector_stream_traces = build_save_selector_stream_trace_rows(exe_data, save_selector_leaf_streams)
    write_save_selector_stream_trace_outputs(save_selector_stream_traces, OUT)
    save_selector_dispatch_table_context = build_save_selector_dispatch_table_context_summary(
        exe_data,
        save_selector_stream_traces,
    )
    write_save_selector_dispatch_table_context_outputs(save_selector_dispatch_table_context, OUT)
    save_selector_branch_state = build_save_selector_branch_state_summary(exe_data)
    write_save_selector_branch_state_outputs(save_selector_branch_state, OUT)
    save_selector_branch_state_writers = build_save_selector_branch_state_writer_summary(
        exe_data,
        save_selector_branch_state,
    )
    write_save_selector_branch_state_writer_outputs(save_selector_branch_state_writers, OUT)
    save_selector_branch_state_dispatch = build_save_selector_branch_state_dispatch_summary(
        exe_data,
        save_selector_branch_state_writers,
    )
    write_save_selector_branch_state_dispatch_outputs(save_selector_branch_state_dispatch, OUT)
    event_handler_text_refs = build_event_handler_text_ref_summary(
        exe_data,
        korean_text_candidates,
        save_selector_branch_state_dispatch,
        ROOT / "Hwanse2.exe",
    )
    write_event_handler_text_ref_outputs(event_handler_text_refs, OUT)
    print(f"wrote event handler text refs -> {OUT / 'event_handler_text_refs.json'}")
    event_text_source_flow = build_event_text_source_flow_summary(exe_data, event_transitions)
    write_event_text_source_flow_outputs(event_text_source_flow, OUT)
    print(f"wrote event text source flow -> {OUT / 'event_text_source_flow.html'}")
    event_dialogue_blocks = build_event_dialogue_block_summary(exe_data, event_text_source_flow)
    write_event_dialogue_block_outputs(event_dialogue_blocks, OUT)
    print(f"wrote event dialogue blocks -> {OUT / 'event_dialogue_blocks.html'}")
    dialogue_candidate_review_summary = build_dialogue_candidate_review_summary(ROOT)
    write_dialogue_candidate_review_outputs(dialogue_candidate_review_summary, OUT)
    print(f"wrote dialogue candidate review summary -> {OUT / 'dialogue_candidate_review_summary.html'}")
    event_object_candidate_review_summary = build_event_object_candidate_review_summary(ROOT)
    write_event_object_candidate_review_outputs(event_object_candidate_review_summary, OUT)
    print(f"wrote event/object candidate review summary -> {OUT / 'event_object_candidate_review_summary.json'}")
    save_point_candidate_review_summary = build_save_point_candidate_review_summary(ROOT)
    write_save_point_candidate_review_outputs(save_point_candidate_review_summary, OUT)
    print(f"wrote save-point candidate review summary -> {OUT / 'save_point_candidate_review_summary.json'}")
    transition_progress_candidate_review_summary = build_transition_progress_candidate_review_summary(ROOT)
    write_transition_progress_candidate_review_outputs(transition_progress_candidate_review_summary, OUT)
    print(
        "wrote transition-progress candidate review summary -> "
        f"{OUT / 'transition_progress_candidate_review_summary.json'}"
    )
    event_vm_opcode_semantics = build_event_vm_opcode_semantics_summary(
        save_selector_branch_state_dispatch,
        event_text_source_flow,
        event_dialogue_blocks,
    )
    write_event_vm_opcode_semantics_outputs(event_vm_opcode_semantics, OUT)
    print(f"wrote event VM opcode semantics -> {OUT / 'event_vm_opcode_semantics.html'}")
    event_vm_semantics_gap = build_event_vm_semantics_gap_summary(
        script_handler_table,
        save_selector_branch_state_dispatch,
        event_handler_text_refs,
        event_text_source_flow,
        event_vm_opcode_semantics,
        event_dialogue_blocks,
        scene_event_text_refs,
        dialogue_candidate_review_summary,
    )
    write_event_vm_semantics_gap_outputs(event_vm_semantics_gap, OUT)
    print(f"wrote event VM semantics gap -> {OUT / 'event_vm_semantics_gap.html'}")
    save_point_candidates = build_save_point_candidate_summary(
        event_dialogue_blocks,
        korean_text_candidates,
        text_tables,
    )
    write_save_point_candidate_outputs(save_point_candidates, OUT)
    print(f"wrote save point candidates -> {OUT / 'save_point_candidates.html'}")
    battle_event_candidates = export_battle_event_candidates(event_dialogue_blocks, battle_backgrounds, OUT)
    original_battle_resource_descriptors = build_original_battle_resource_descriptor_summary(
        exe_data,
        sections,
        cns_payloads,
    )
    battle_enemy_candidates = build_battle_enemy_candidate_summary(
        original_battle_resource_descriptors,
        battle_event_candidates,
        cns_payloads,
        OUT,
    )
    write_battle_enemy_candidate_outputs(battle_enemy_candidates, OUT)
    print(f"wrote battle enemy sprite candidates -> {OUT / 'battle_enemy_candidates.js'}")
    non_party_descriptor_links = {}
    if (OUT / "non_party_descriptor_asset_links.json").exists():
        non_party_descriptor_links = json.loads(
            (OUT / "non_party_descriptor_asset_links.json").read_text(encoding="utf-8")
        )
    character_sprite_frames = json.loads((OUT / "character_sprite_frames.json").read_text(encoding="utf-8"))
    cns_frame_assets = build_cns_frame_asset_summary(
        build_cns_frame_asset_rows(
            cns_payloads,
            character_sprite_frames,
            battle_enemy_candidates,
            non_party_descriptor_links,
            OUT,
        )
    )
    write_cns_frame_asset_outputs(cns_frame_assets, OUT)
    print(f"wrote CNS frame assets -> {OUT / 'cns_frame_assets.json'}")
    cns_frame_rect_exe_scan = run_cns_frame_rect_exe_scan(ROOT / "Hwanse2.exe", OUT)
    write_cns_frame_rect_exe_outputs(cns_frame_rect_exe_scan, OUT)
    print(f"wrote CNS frame rect EXE scan -> {OUT / 'cns_frame_rect_exe_scan.json'}")
    ui_window_review = build_ui_window_review_summary(
        OUT / "cns_frame_assets.json",
        OUT / "cns_frame_rect_exe_scan.json",
    )
    write_ui_window_review_outputs(ui_window_review, OUT)
    print(f"wrote UI window review data -> {OUT / 'ui_window_review_data.js'}")
    cns_rect_review = build_cns_rect_review_summary(OUT)
    write_cns_rect_review_outputs(cns_rect_review, OUT)
    print(f"wrote CNS rect review data -> {OUT / 'cns_rect_review_data.js'}")
    battle_action_handler_context = build_battle_action_handler_context_summary(
        event_handler_text_refs,
        text_tables,
        event_dialogue_blocks,
    )
    battle_action_handler_context_out = write_battle_action_handler_context_outputs(
        battle_action_handler_context,
        OUT,
    )
    print(f"wrote battle action handler context -> {battle_action_handler_context_out}")
    def load_out_json(name: str) -> dict:
        path = OUT / name
        return json.loads(path.read_text(encoding="utf-8")) if path.exists() else {}

    menu_candidate_review_summary = build_menu_candidate_review_summary(ROOT)
    write_menu_candidate_review_outputs(menu_candidate_review_summary, OUT)
    print(f"wrote menu candidate review summary -> {OUT / 'menu_candidate_review_summary.html'}")
    completion_candidate_review_summary = build_completion_candidate_review_summary(ROOT)
    write_completion_candidate_review_outputs(completion_candidate_review_summary, OUT)
    print(f"wrote completion candidate review summary -> {OUT / 'completion_candidate_review_summary.html'}")
    movement_candidate_review_summary = build_movement_candidate_review_summary(ROOT)
    write_movement_candidate_review_outputs(movement_candidate_review_summary, OUT)
    print(f"wrote movement candidate review summary -> {OUT / 'movement_candidate_review_summary.html'}")
    mobile_browser_controls_summary = build_mobile_browser_controls_summary(ROOT)
    write_mobile_browser_controls_outputs(mobile_browser_controls_summary, OUT)
    print(f"wrote mobile browser controls summary -> {OUT / 'mobile_browser_controls_summary.json'}")
    menu_candidate_reviews = menu_candidate_review_summary.get("menus") or {}
    mobile_browser_smoke = mobile_browser_controls_summary.get("controls") or {}
    candidate_movement_browser_smoke = movement_candidate_review_summary.get("movement") or {}
    candidate_save_point_browser_smoke = save_point_candidate_review_summary.get("savePoint") or {}
    candidate_status_menu_browser_smoke = menu_candidate_reviews.get("status") or {}
    candidate_skill_menu_browser_smoke = menu_candidate_reviews.get("skill") or {}
    candidate_equipment_menu_browser_smoke = menu_candidate_reviews.get("equipment") or {}
    candidate_shop_menu_browser_smoke = menu_candidate_reviews.get("shop") or {}
    candidate_party_join_browser_smoke = menu_candidate_reviews.get("party") or {}
    candidate_event_object_browser_smoke = event_object_candidate_review_summary.get("eventObject") or {}
    candidate_progress_browser_smoke = menu_candidate_reviews.get("progress") or {}
    candidate_dialogue_progress_browser_smoke = dialogue_candidate_review_summary.get("dialogue") or {}
    candidate_route_progress_browser_smoke = completion_candidate_review_summary.get("route") or {}
    candidate_deep_route_browser_smoke = completion_candidate_review_summary.get("deep") or {}
    candidate_transition_progress_browser_smoke = (
        transition_progress_candidate_review_summary.get("transition") or {}
    )
    review_surface_smoke = load_out_json("home_landing_browser_smoke.json")
    route_guide_browser_summary = build_route_guide_browser_summary(ROOT)
    write_route_guide_browser_outputs(route_guide_browser_summary, OUT)
    print(f"wrote route guide browser summary -> {OUT / 'route_guide_browser_summary.json'}")
    route_guide_smoke = route_guide_browser_summary.get("routeGuide") or {}
    runtime_music_cue_smoke = load_out_json("runtime_music_cue_browser_smoke.json")
    title_menu_sound_smoke = load_out_json("title_menu_sound_browser_smoke.json")
    title_start_browser_summary = build_title_start_browser_summary(ROOT)
    write_title_start_browser_outputs(title_start_browser_summary, OUT)
    print(f"wrote title start browser summary -> {OUT / 'title_start_browser_summary.json'}")
    title_start_smoke = title_start_browser_summary.get("titleStart") or {}
    legacy_hwanedit_editor_gap = load_out_json("legacy_hwanedit_editor_gap.json")
    candidate_browser_smoke_summary = build_candidate_browser_smoke_summary(ROOT)
    write_candidate_browser_smoke_outputs(candidate_browser_smoke_summary, OUT)
    print(f"wrote candidate browser smoke summary -> {OUT / 'candidate_browser_smoke_summary.html'}")
    event_battle_gap_audit = load_out_json("battle_analysis_summary.json")
    event_object_branch_state_stream_candidates = build_event_object_branch_state_stream_candidate_summary(exe_data)
    write_event_object_branch_state_stream_candidate_outputs(event_object_branch_state_stream_candidates, OUT)
    event_object_branch_state_candidate_links = build_event_object_branch_state_candidate_link_summary(
        exe_data,
        event_object_branch_state_stream_candidates,
        save_selector_leaf_streams,
        save_scene_selectors,
        manifest,
    )
    write_event_object_branch_state_candidate_link_outputs(event_object_branch_state_candidate_links, OUT)
    event_object_branch_state_block_context = build_event_object_branch_state_block_context_summary(
        exe_data,
        event_object_branch_state_candidate_links,
    )
    write_event_object_branch_state_block_context_outputs(event_object_branch_state_block_context, OUT)
    print("wrote event/object branch-state reports", flush=True)
    save_selector_selection_state = build_save_selector_selection_state_summary(exe_data)
    write_save_selector_selection_state_outputs(save_selector_selection_state, OUT)
    save_selector_frontier_branches = build_save_selector_frontier_branch_rows(
        save_selector_frontier,
        save_selector_stream_traces,
        save_selector_leaf_streams,
        map_render_reviews,
    )
    write_save_selector_frontier_branch_outputs(save_selector_frontier_branches, OUT)
    save_selector_branch_paths = build_save_selector_branch_path_rows(
        exe_data,
        save_selector_frontier_branches,
        save_selector_leaf_streams,
    )
    write_save_selector_branch_path_outputs(save_selector_branch_paths, OUT)
    save_selector_scene_list_context = build_save_selector_scene_list_context_summary(
        exe_data,
        save_selector_frontier_branches,
        manifest,
    )
    write_save_selector_scene_list_context_outputs(save_selector_scene_list_context, OUT)
    save_selector_frontier_selection_flow = build_save_selector_frontier_selection_flow_rows(
        save_selector_frontier_branches,
        save_selector_stream_traces,
    )
    write_save_selector_frontier_selection_flow_outputs(save_selector_frontier_selection_flow, OUT)
    print("wrote save-selector frontier branch reports", flush=True)
    save_selector_selection_writers = scan_save_selector_selection_writers(
        exe_data,
        sections,
        save_selector_references,
        save_selector_leaf_streams,
        save_selector_frontier_branches,
        context_window=0x300,
    )
    write_save_selector_selection_writer_outputs(save_selector_selection_writers, OUT)
    save_selector_current_writer_paths = build_save_selector_current_writer_path_rows(
        exe_data,
        save_selector_selection_writers,
    )
    write_save_selector_current_writer_path_outputs(save_selector_current_writer_paths, OUT)
    save_selector_selection_buffer20_provenance = build_save_selector_selection_buffer20_provenance_summary(
        save_selector_selection_writers,
        save_selector_current_writer_paths,
    )
    write_save_selector_selection_buffer20_provenance_outputs(save_selector_selection_buffer20_provenance, OUT)
    save_selector_writer_chain = build_save_selector_writer_chain_rows(
        save_selector_selection_writers,
        save_selector_current_writer_paths,
    )
    write_save_selector_writer_chain_outputs(save_selector_writer_chain, OUT)
    save_selector_gate_paths = build_save_selector_gate_path_rows(
        exe_data,
        save_selector_writer_chain,
        save_selector_leaf_streams,
    )
    write_save_selector_gate_path_outputs(save_selector_gate_paths, OUT)
    print("wrote save-selector writer/gate path reports", flush=True)
    save_selector_opcode24_payload = build_save_selector_opcode24_payload_rows(
        exe_data,
        save_selector_gate_paths,
    )
    write_save_selector_opcode24_payload_outputs(save_selector_opcode24_payload, OUT)
    save_selector_opcode24_payload_table = build_save_selector_opcode24_payload_table_summary(
        exe_data,
        save_selector_gate_paths,
    )
    write_save_selector_opcode24_payload_table_outputs(save_selector_opcode24_payload_table, OUT)
    save_selector_dispatch_stop_context = build_save_selector_dispatch_stop_context_summary(
        exe_data,
        save_selector_gate_paths,
    )
    write_save_selector_dispatch_stop_context_outputs(save_selector_dispatch_stop_context, OUT)
    save_selector_leaf_table_context = build_save_selector_leaf_table_context_summary(
        exe_data,
        save_selector_references,
        save_selector_leaf_streams,
        save_selector_stream_traces,
    )
    write_save_selector_leaf_table_context_outputs(save_selector_leaf_table_context, OUT)
    save_selector_leaf_index_space = build_save_selector_leaf_index_space_summary(
        exe_data,
        save_selector_leaf_streams,
        save_selector_stream_traces,
    )
    write_save_selector_leaf_index_space_outputs(save_selector_leaf_index_space, OUT)
    save_selector_leaf_table_global_context = build_save_selector_leaf_table_global_context_summary(
        exe_data,
        save_scene_selectors,
    )
    write_save_selector_leaf_table_global_context_outputs(save_selector_leaf_table_global_context, OUT)
    save_selector_wrapper_descriptor_context = build_save_selector_wrapper_descriptor_context_summary(
        exe_data,
        save_selector_leaf_streams,
    )
    write_save_selector_wrapper_descriptor_context_outputs(save_selector_wrapper_descriptor_context, OUT)
    save_selector_route_pair_descriptor_context = build_save_selector_route_pair_descriptor_context_summary(
        save_selector_leaf_index_space,
        save_selector_scene_record_sequence,
        save_selector_stream_traces,
    )
    write_save_selector_route_pair_descriptor_context_outputs(save_selector_route_pair_descriptor_context, OUT)
    save_selector_opcode2c_route_pair_context = build_save_selector_opcode2c_route_pair_context_summary(
        exe_data,
        save_selector_route_pair_descriptor_context,
    )
    write_save_selector_opcode2c_route_pair_context_outputs(save_selector_opcode2c_route_pair_context, OUT)
    save_selector_leaf_index_space = build_save_selector_leaf_index_space_summary(
        exe_data,
        save_selector_leaf_streams,
        save_selector_stream_traces,
        save_selector_opcode2c_route_pair_context,
    )
    write_save_selector_leaf_index_space_outputs(save_selector_leaf_index_space, OUT)
    save_selector_route_pair_descriptor_context = build_save_selector_route_pair_descriptor_context_summary(
        save_selector_leaf_index_space,
        save_selector_scene_record_sequence,
        save_selector_stream_traces,
        save_selector_opcode2c_route_pair_context,
    )
    write_save_selector_route_pair_descriptor_context_outputs(save_selector_route_pair_descriptor_context, OUT)
    save_selector_data_descriptor_opcode_map = build_save_selector_data_descriptor_opcode_map_summary(
        exe_data,
        save_selector_dispatch_stop_context,
        save_selector_leaf_table_context,
        save_selector_opcode24_payload_table,
    )
    write_save_selector_data_descriptor_opcode_map_outputs(save_selector_data_descriptor_opcode_map, OUT)
    save_selector_opcode07_indexed_pointers = build_save_selector_opcode07_indexed_pointer_summary(
        exe_data,
        save_selector_leaf_table_context,
    )
    write_save_selector_opcode07_indexed_pointer_outputs(save_selector_opcode07_indexed_pointers, OUT)
    save_selector_route_pair_index_source_gap = build_save_selector_route_pair_index_source_gap_summary(
        exe_data,
        save_selector_leaf_table_global_context,
        save_selector_opcode07_indexed_pointers,
    )
    write_save_selector_route_pair_index_source_gap_outputs(save_selector_route_pair_index_source_gap, OUT)
    save_selector_opcode24_handler = build_save_selector_opcode24_handler_summary(
        exe_data,
        save_selector_gate_paths,
    )
    write_save_selector_opcode24_handler_outputs(save_selector_opcode24_handler, OUT)
    save_selector_opcode24_globals = build_save_selector_opcode24_global_summary(
        exe_data,
        save_selector_opcode24_handler,
    )
    write_save_selector_opcode24_global_outputs(save_selector_opcode24_globals, OUT)
    save_selector_opcode24_mode1_source_writes = build_save_selector_opcode24_mode1_source_write_summary(exe_data)
    write_save_selector_opcode24_mode1_source_write_outputs(save_selector_opcode24_mode1_source_writes, OUT)
    save_selector_opcode24_mode1_block_writes = build_save_selector_opcode24_mode1_block_write_summary(exe_data)
    write_save_selector_opcode24_mode1_block_write_outputs(save_selector_opcode24_mode1_block_writes, OUT)
    save_selector_opcode24_runtime_enabled_block_writes = (
        build_save_selector_opcode24_runtime_enabled_block_write_summary(exe_data)
    )
    write_save_selector_opcode24_runtime_enabled_block_write_outputs(
        save_selector_opcode24_runtime_enabled_block_writes,
        OUT,
    )
    save_selector_opcode24_current_root_modes = build_save_selector_opcode24_current_root_mode_summary(
        exe_data,
        save_selector_selection_writers,
        save_selector_gate_paths,
    )
    write_save_selector_opcode24_current_root_mode_outputs(save_selector_opcode24_current_root_modes, OUT)
    opcode24_action_payload_patterns = build_opcode24_action_payload_pattern_summary(
        exe_data,
        save_scene_selectors,
    )
    write_opcode24_action_payload_pattern_outputs(opcode24_action_payload_patterns, OUT)
    save_selector_opcode24_mode1_runtime_context = build_save_selector_opcode24_mode1_runtime_context_summary(
        exe_data,
        save_loader_trace,
        save_selector_opcode24_mode1_source_writes,
        runtime_patched_selector_active_order_poll,
    )
    write_save_selector_opcode24_mode1_runtime_context_outputs(save_selector_opcode24_mode1_runtime_context, OUT)
    save_selector_opcode24_runtime_enabled_context = build_save_selector_opcode24_runtime_enabled_context_summary(
        exe_data,
        save_loader_trace,
        save_selector_opcode24_globals,
        runtime_patched_selector_active_order_poll,
    )
    write_save_selector_opcode24_runtime_enabled_context_outputs(save_selector_opcode24_runtime_enabled_context, OUT)
    print("wrote save-selector opcode24 reports", flush=True)
    save_selector_selection_buffer_bases = build_save_selector_selection_buffer_base_summary(exe_data)
    write_save_selector_selection_buffer_base_outputs(save_selector_selection_buffer_bases, OUT)
    save_selector_opcode24_mode1_indirect_context = build_save_selector_opcode24_mode1_indirect_context_summary(
        exe_data,
        save_selector_opcode24_mode1_source_writes,
        save_selector_selection_buffer_bases,
    )
    write_save_selector_opcode24_mode1_indirect_context_outputs(save_selector_opcode24_mode1_indirect_context, OUT)
    save_selector_opcode24_mode1_file_read_context = build_save_selector_opcode24_mode1_file_read_context_summary(
        exe_data,
        exe_imports,
    )
    write_save_selector_opcode24_mode1_file_read_context_outputs(save_selector_opcode24_mode1_file_read_context, OUT)
    save_selector_object_field_refs = build_save_selector_object_field_ref_summary(exe_data)
    write_save_selector_object_field_ref_outputs(save_selector_object_field_refs, OUT)
    save_selector_object61_consumers = build_save_selector_object61_consumer_summary(OUT)
    write_save_selector_object61_consumer_outputs(save_selector_object61_consumers, OUT)
    save_selector_object61_stream_branch = build_save_selector_object61_stream_branch_summary(exe_data)
    write_save_selector_object61_stream_branch_outputs(save_selector_object61_stream_branch, OUT)
    save_selector_object61_stream_operands = build_save_selector_object61_stream_operand_summary(
        exe_data,
        script_handler_table,
    )
    write_save_selector_object61_stream_operand_outputs(save_selector_object61_stream_operands, OUT)
    save_selector_opcode24_mode1_default_effect = build_save_selector_opcode24_mode1_default_effect_summary(
        save_selector_opcode24_handler,
        save_selector_opcode24_mode1_runtime_context,
        save_selector_object61_consumers,
        save_selector_object61_stream_operands,
    )
    write_save_selector_opcode24_mode1_default_effect_outputs(save_selector_opcode24_mode1_default_effect, OUT)
    print("wrote save-selector object/selection-buffer reports", flush=True)
    save_selector_branch_selector_equation_base = build_save_selector_branch_selector_equation_summary()
    save_selector_active_flag_sources = build_save_selector_active_flag_source_summary(
        exe_data,
        save_loader_trace,
    )
    write_save_selector_active_flag_source_outputs(save_selector_active_flag_sources, OUT)
    save_selector_secondary_state_sources = build_save_selector_secondary_state_source_summary(
        exe_data,
        save_selector_branch_state,
    )
    write_save_selector_secondary_state_source_outputs(save_selector_secondary_state_sources, OUT)
    save_selector_secondary_fill_roots = build_save_selector_secondary_fill_root_summary(exe_data, save_scene_selectors)
    write_save_selector_secondary_fill_root_outputs(save_selector_secondary_fill_roots, OUT)
    save_selector_inherited_state_candidates = build_save_selector_inherited_state_candidate_summary(
        save_scene_selectors,
        save_selector_secondary_fill_roots,
    )
    write_save_selector_inherited_state_candidate_outputs(save_selector_inherited_state_candidates, OUT)
    save_selector_predecessor_state_effect = build_save_selector_predecessor_state_effect_summary()
    write_save_selector_predecessor_state_effect_outputs(save_selector_predecessor_state_effect, OUT)
    save_selector_active_flag_effect = build_save_selector_active_flag_effect_summary(
        save_selector_active_flag_sources,
        save_selector_predecessor_state_effect,
        save_selector_branch_selector_equation_base,
    )
    write_save_selector_active_flag_effect_outputs(save_selector_active_flag_effect, OUT)
    save_selector_branch_selector_equation = build_save_selector_branch_selector_equation_summary(
        save_selector_predecessor_state_effect,
        save_selector_active_flag_effect,
    )
    write_save_selector_branch_selector_equation_outputs(save_selector_branch_selector_equation, OUT)
    save_selector_predecessor_route_order = build_save_selector_predecessor_route_order_summary(
        save_scene_selectors,
        save_selector_inherited_state_candidates,
        playable_progress,
    )
    write_save_selector_predecessor_route_order_outputs(save_selector_predecessor_route_order, OUT)
    save_selector_set_decomposition = build_save_selector_set_decomposition_summary(
        save_scene_selectors,
        playable_progress,
    )
    write_save_selector_set_decomposition_outputs(save_selector_set_decomposition, OUT)
    save_selector_recomposition_lattice = build_save_selector_recomposition_lattice_summary(save_scene_selectors)
    write_save_selector_recomposition_lattice_outputs(save_selector_recomposition_lattice, OUT)
    save_selector_address_predecessor_context = build_save_selector_address_predecessor_context_summary(
        exe_data,
        save_scene_selectors,
        save_selector_secondary_fill_roots,
    )
    write_save_selector_address_predecessor_context_outputs(save_selector_address_predecessor_context, OUT)
    save_selector_mapset_aliases = build_save_selector_mapset_alias_summary(
        save_scene_selectors,
        save_selector_secondary_fill_roots,
        savedata_sample_coverage,
        save_selector_address_predecessor_context,
        save_selector_set_decomposition,
    )
    write_save_selector_mapset_alias_outputs(save_selector_mapset_aliases, OUT)
    save_selector_target_alias_state_effects = build_save_selector_target_alias_state_effect_summary(
        save_selector_mapset_aliases,
        save_selector_secondary_fill_roots,
    )
    write_save_selector_target_alias_state_effect_outputs(save_selector_target_alias_state_effects, OUT)
    save_selector_target_alias_bridges = build_save_selector_target_alias_bridge_summary(
        exe_data,
        save_scene_selectors,
        save_selector_mapset_aliases,
        save_selector_secondary_fill_roots,
        save_selector_leaf_index_space,
    )
    write_save_selector_target_alias_bridge_outputs(save_selector_target_alias_bridges, OUT)
    save_selector_route_root_ref_context = build_save_selector_route_root_ref_context_summary(
        exe_data,
        save_scene_selectors,
    )
    write_save_selector_route_root_ref_context_outputs(save_selector_route_root_ref_context, OUT)
    save_selector_branch_state_opcode_overlap = build_save_selector_branch_state_opcode_overlap_summary(
        exe_data,
        save_selector_leaf_streams,
        save_selector_branch_state_dispatch,
        save_selector_selection_writers,
    )
    write_save_selector_branch_state_opcode_overlap_outputs(save_selector_branch_state_opcode_overlap, OUT)
    save_selector_current_state_sources = build_save_selector_current_state_source_summary(
        exe_data,
        save_selector_selection_writers,
        save_selector_current_writer_paths,
        save_scene_selectors,
    )
    write_save_selector_current_state_source_outputs(save_selector_current_state_sources, OUT)
    print("wrote save-selector state source reports", flush=True)
    annotate_save_selector_frontier_risks(playable_progress, save_selector_frontier_branches)
    write_playable_progress_outputs(playable_progress, OUT)
    route_blockers = build_route_blocker_rows(
        playable_progress,
        save_selector_frontier,
        save_selector_xrefs,
        save_selector_leaf_streams,
        save_selector_stream_traces,
        save_selector_frontier_branches,
        save_loader_trace,
        scene_selector_progress,
    )
    write_route_blocker_outputs(route_blockers, OUT)
    map_exit_candidates = build_map_exit_candidate_rows(
        map_data,
        tile_classes,
        save_selector_scene_links,
        route_blockers,
    )
    write_map_exit_candidate_outputs(map_exit_candidates, OUT)
    original_collision_route_audit = build_original_collision_route_audit_summary(
        map_data,
        map_exit_candidates,
    )
    write_original_collision_route_audit_outputs(original_collision_route_audit, OUT)
    print(f"wrote original collision route audit -> {OUT / 'original_collision_route_audit.html'}")
    map1_01a_edge_trigger_gap = build_map1_01a_edge_trigger_gap_summary(
        ROOT / "Hwanse2.exe",
        runtime_movement,
        original_collision_route_audit,
    )
    write_map1_01a_edge_trigger_gap_outputs(map1_01a_edge_trigger_gap, OUT)
    print(f"wrote map1_01a edge trigger gap -> {OUT / 'map1_01a_edge_trigger_gap.md'}")
    map1_01a_tile_hotspot_pattern_contrast = build_map1_01a_tile_hotspot_pattern_contrast_summary(
        map_data,
        transition_reviews,
        event_transitions,
        original_collision_route_audit,
    )
    write_map1_01a_tile_hotspot_pattern_contrast_outputs(map1_01a_tile_hotspot_pattern_contrast, OUT)
    map1_01a_strict_event_tile_signature_scan = build_map1_01a_strict_event_tile_signature_scan_summary(
        map_data,
        event_transitions,
        transition_reviews,
        map1_01a_tile_hotspot_pattern_contrast,
    )
    write_map1_01a_strict_event_tile_signature_scan_outputs(map1_01a_strict_event_tile_signature_scan, OUT)
    annotate_map_exit_trial_routes(playable_progress, map_exit_candidates, map_data)
    write_playable_progress_outputs(playable_progress, OUT)
    write_playable_progress_runtime(playable_progress, OUT)
    runtime_trace_feasibility = build_runtime_trace_feasibility_summary()
    write_runtime_trace_feasibility_outputs(runtime_trace_feasibility, OUT)
    if (OUT / "runtime_selected_pointer_source_exit_branch_state_poll.json").exists():
        runtime_source_exit_poll_context = build_runtime_source_exit_poll_context_summary(
            json.loads((OUT / "runtime_selected_pointer_source_exit_branch_state_poll.json").read_text(encoding="utf-8")),
            json.loads((OUT / "runtime_selected_pointer_source_exit_branch_state_load_confirmed_poll.json").read_text(
                encoding="utf-8"
            ))
            if (OUT / "runtime_selected_pointer_source_exit_branch_state_load_confirmed_poll.json").exists()
            else {},
        )
        write_runtime_source_exit_poll_context_outputs(runtime_source_exit_poll_context, OUT)
    runtime_source_save_load_variant_context = {}
    if (
        (OUT / "runtime_selected_pointer_source_savedata_load_variants_poll.json").exists()
        or (OUT / "runtime_selected_pointer_source_savedata_load_coordinate_poll.json").exists()
        or (OUT / "runtime_selected_pointer_source_exit_branch_state_load_confirmed_poll.json").exists()
        or (OUT / "runtime_selected_pointer_source_exit_adaptive_coordinate_poll.json").exists()
        or (OUT / "runtime_selected_pointer_source_exit_adaptive_trail_start_poll.json").exists()
    ):
        runtime_source_save_load_variant_context = build_runtime_source_save_load_variant_context_summary(
            json.loads((OUT / "runtime_selected_pointer_source_savedata_load_variants_poll.json").read_text(encoding="utf-8"))
            if (OUT / "runtime_selected_pointer_source_savedata_load_variants_poll.json").exists()
            else {},
            json.loads((OUT / "runtime_selected_pointer_source_savedata_load_coordinate_poll.json").read_text(encoding="utf-8"))
            if (OUT / "runtime_selected_pointer_source_savedata_load_coordinate_poll.json").exists()
            else {},
            json.loads(
                (OUT / "runtime_selected_pointer_source_exit_branch_state_load_confirmed_poll.json").read_text(
                    encoding="utf-8"
                )
            )
            if (OUT / "runtime_selected_pointer_source_exit_branch_state_load_confirmed_poll.json").exists()
            else {},
            json.loads(
                (OUT / "runtime_selected_pointer_source_exit_adaptive_coordinate_poll.json").read_text(
                    encoding="utf-8"
                )
            )
            if (OUT / "runtime_selected_pointer_source_exit_adaptive_coordinate_poll.json").exists()
            else {},
            json.loads(
                (OUT / "runtime_selected_pointer_source_exit_adaptive_trail_start_poll.json").read_text(
                    encoding="utf-8"
                )
            )
            if (OUT / "runtime_selected_pointer_source_exit_adaptive_trail_start_poll.json").exists()
            else {},
            save_selector_mapset_aliases,
            save_selector_scene_adjacency_index,
            {},
        )
        write_runtime_source_save_load_variant_context_outputs(runtime_source_save_load_variant_context, OUT)
    if list(OUT.glob("runtime_selected_pointer_predecessor_*poll.json")):
        runtime_predecessor_route_attempt_context = build_runtime_predecessor_route_attempt_context_summary(OUT)
        write_runtime_predecessor_route_attempt_context_outputs(runtime_predecessor_route_attempt_context, OUT)
    if (OUT / "runtime_route_watch_values_poll.json").exists():
        runtime_opcode24_flag_context = build_runtime_opcode24_flag_context_summary()
        write_runtime_opcode24_flag_context_outputs(runtime_opcode24_flag_context, OUT)
    runtime_memory_snapshot_context = {}
    if (OUT / "runtime_memory_snapshot.json").exists():
        runtime_memory_snapshot_context = build_runtime_memory_snapshot_context_summary(
            json.loads((OUT / "runtime_memory_snapshot.json").read_text(encoding="utf-8")),
            save_scene_selectors,
            save_selector_selection_writers,
            exe_data,
            sections,
        )
        write_runtime_memory_snapshot_context_outputs(runtime_memory_snapshot_context, OUT)
    runtime_title_start_context = {}
    if runtime_memory_snapshot_context:
        runtime_title_start_context = build_runtime_title_start_context_summary(
            runtime_memory_snapshot_context,
            json.loads((OUT / "runtime_input_path_probe.json").read_text(encoding="utf-8"))
            if (OUT / "runtime_input_path_probe.json").exists()
            else {},
            json.loads((OUT / "runtime_key_sequence_probe.json").read_text(encoding="utf-8"))
            if (OUT / "runtime_key_sequence_probe.json").exists()
            else {},
            playable_progress,
            save_scene_selectors,
            manifest,
            save_selector_selection_writers,
            cns_payloads,
        )
        write_runtime_title_start_context_outputs(runtime_title_start_context, OUT)
    completion_audit = build_completion_audit_summary(
        playable_progress,
        route_blockers,
        transition_reviews,
        map_render_reviews,
        map_count=len(map_data),
        map_render_gap_rows=map_render_review_rows,
        runtime_trace_feasibility=runtime_trace_feasibility,
        runtime_timing=runtime_timing,
        runtime_movement=runtime_movement,
        original_collision_route_audit=original_collision_route_audit,
        edge_trigger_gap=map1_01a_edge_trigger_gap,
        tile_hotspot_pattern_contrast=map1_01a_tile_hotspot_pattern_contrast,
        strict_event_tile_signature_scan=map1_01a_strict_event_tile_signature_scan,
        transition_review_shortlist_audit=transition_review_shortlist_audit,
        runtime_title_start_context=runtime_title_start_context,
        battle_background_count=len(battle_backgrounds),
        battle_candidate_count=battle_event_candidates.get("candidateCount", 0),
        event_battle_gap_audit=event_battle_gap_audit,
        event_vm_semantics_gap=event_vm_semantics_gap,
        savedata_sample_deltas=savedata_sample_deltas,
        target_alias_state_effects=save_selector_target_alias_state_effects,
        target_alias_bridges=save_selector_target_alias_bridges,
        opcode24_runtime_enabled_block_writes=save_selector_opcode24_runtime_enabled_block_writes,
    )
    write_completion_audit_outputs(completion_audit, OUT)
    print("wrote route blocker and completion audit reports", flush=True)
    (OUT / "scene_events_summary.md").write_text(summarize(events), encoding="utf-8")
    (OUT / "scene_coordinate_candidates.json").write_text(
        json.dumps(coordinate_candidates, ensure_ascii=False, indent=2) + "\n",
        encoding="utf-8",
    )
    (OUT / "scene_dispatch_summary.md").write_text(
        summarize_dispatch_refs(events),
        encoding="utf-8",
    )
    scene_links = structured_links(events)
    (OUT / "scene_links.json").write_text(
        json.dumps(scene_links, ensure_ascii=False, indent=2) + "\n",
        encoding="utf-8",
    )
    (OUT / "scene_links.js").write_text(
        "window.HWANSE_SCENE_LINKS = "
        + js_json(scene_links)
        + ";\n",
        encoding="utf-8",
    )
    (OUT / "scene_links_summary.md").write_text(
        summarize_scene_links(events),
        encoding="utf-8",
    )
    transition_extraction_gaps = build_transition_extraction_gap_rows(
        coordinate_candidates,
        event_transitions,
        scene_links,
        manifest,
    )
    write_transition_extraction_gap_outputs(transition_extraction_gaps, OUT)
    map_exit_coordinate_refs = build_map_exit_coordinate_ref_summary(
        exe_data,
        map_exit_candidates,
        route_blockers,
        event_transitions,
        coordinate_candidates,
        transition_extraction_gaps,
    )
    write_map_exit_coordinate_ref_outputs(map_exit_coordinate_refs, OUT)
    print("wrote transition extraction and map-exit coordinate reports", flush=True)
    map1_01a_exit_coordinate_context = build_map1_01a_exit_coordinate_context_summary(
        exe_data,
        save_scene_selectors,
        map_exit_coordinate_refs,
    )
    write_map1_01a_exit_coordinate_context_outputs(map1_01a_exit_coordinate_context, OUT)
    map1_01a_exit_coordinate_variant_scan = build_map1_01a_exit_coordinate_variant_scan_summary(
        exe_data,
        save_scene_selectors,
        map_exit_candidates,
    )
    write_map1_01a_exit_coordinate_variant_scan_outputs(map1_01a_exit_coordinate_variant_scan, OUT)
    map1_01a_exit_byte_coordinate_scan = build_map1_01a_exit_byte_coordinate_scan_summary(
        save_scene_selectors=save_scene_selectors,
        scene_events=events,
        event_transitions=event_transitions,
        scene_manifest=manifest,
        map_exit_candidates=map_exit_candidates,
    )
    write_map1_01a_exit_byte_coordinate_scan_outputs(map1_01a_exit_byte_coordinate_scan, OUT)
    map1_01a_exit_cns_payload_scan = build_map1_01a_exit_cns_payload_scan_summary(
        map_exit_candidates=map_exit_candidates,
    )
    write_map1_01a_exit_cns_payload_scan_outputs(map1_01a_exit_cns_payload_scan, OUT)
    map1_01a_strict_hotspot_review_matrix = build_map1_01a_strict_hotspot_review_matrix_summary(
        map_exit_candidates,
        map_exit_coordinate_refs,
        map1_01a_exit_coordinate_variant_scan,
        map1_01a_tile_hotspot_pattern_contrast,
        transition_reviews,
        event_transitions,
    )
    write_map1_01a_strict_hotspot_review_matrix_outputs(map1_01a_strict_hotspot_review_matrix, OUT)
    map1_01a_scene_payload_context = build_map1_01a_scene_payload_context_summary(
        exe_data,
        map_data,
        event_transitions,
        coordinate_candidates,
        transition_extraction_gaps,
    )
    write_map1_01a_scene_payload_context_outputs(map1_01a_scene_payload_context, OUT)
    save_selector_frontier_reader_branch_context = build_save_selector_frontier_reader_branch_context_summary(
        save_selector_scene_list_context,
        save_selector_branch_selector_equation,
        map1_01a_scene_payload_context,
        save_selector_opcode2c_route_pair_context,
    )
    write_save_selector_frontier_reader_branch_context_outputs(save_selector_frontier_reader_branch_context, OUT)
    save_selector_frontier_payload_shape = build_save_selector_frontier_payload_shape_summary(
        exe_data,
        cns_payloads,
        map_data,
        save_selector_frontier_reader_branch_context,
    )
    write_save_selector_frontier_payload_shape_outputs(save_selector_frontier_payload_shape, OUT)
    map1_01a_resource_ref_scan = build_map1_01a_resource_ref_scan_summary(
        exe_data,
        map_data,
        map_exit_candidates,
    )
    write_map1_01a_resource_ref_scan_outputs(map1_01a_resource_ref_scan, OUT)
    map1_01a_event_shape_scan = build_map1_01a_event_shape_scan_summary(
        exe_data,
        map_data,
        events,
    )
    write_map1_01a_event_shape_scan_outputs(map1_01a_event_shape_scan, OUT)
    strict_event_source_coverage = build_strict_event_source_coverage_summary(
        map_data,
        event_transitions,
        transition_reviews,
        field_map_record_roots,
        playable_progress,
    )
    write_strict_event_source_coverage_outputs(strict_event_source_coverage, OUT)
    map1_01a_record_pattern_contrast = build_map1_01a_record_pattern_contrast_summary(
        field_map_record_roots,
        events,
        transition_reviews,
        map1_01a_resource_ref_scan,
        save_selector_scene_list_context,
        save_selector_scene_record_sequence,
        map1_01a_exit_coordinate_variant_scan,
    )
    write_map1_01a_record_pattern_contrast_outputs(map1_01a_record_pattern_contrast, OUT)
    map1_01a_strict_target_link_gap = build_map1_01a_strict_target_link_gap_summary(
        field_map_record_roots,
        event_transitions,
    )
    write_map1_01a_strict_target_link_gap_outputs(map1_01a_strict_target_link_gap, OUT)
    map1_01a_entry_context = build_map1_01a_entry_context_summary(
        manifest,
        event_transitions,
        field_map_record_roots,
        save_selector_scene_links,
    )
    write_map1_01a_entry_context_outputs(map1_01a_entry_context, OUT)
    map1_01a_selector_bridge_refs = build_map1_01a_selector_bridge_ref_summary(exe_data)
    write_map1_01a_selector_bridge_ref_outputs(map1_01a_selector_bridge_refs, OUT)
    map1_01a_manifest_point_scan = build_map1_01a_manifest_point_scan_summary(
        exe_data,
        map_data,
        manifest,
        events,
        event_transitions,
        map1_01a_entry_context,
    )
    write_map1_01a_manifest_point_scan_outputs(map1_01a_manifest_point_scan, OUT)
    map1_01a_hotspot_gap = build_map1_01a_hotspot_gap_summary(
        manifest,
        coordinate_candidates,
        transition_extraction_gaps,
        event_transitions,
        playable_progress,
        map1_01a_manifest_point_scan,
        field_map_record_roots,
        map1_01a_resource_ref_scan,
    )
    write_map1_01a_hotspot_gap_outputs(map1_01a_hotspot_gap, OUT)
    map1_01a_scene_record_cluster_context = build_map1_01a_scene_record_cluster_context_summary(
        field_map_record_roots,
        map1_01a_hotspot_gap,
        map1_01a_strict_target_link_gap,
        map1_01a_record_pattern_contrast,
    )
    write_map1_01a_scene_record_cluster_context_outputs(map1_01a_scene_record_cluster_context, OUT)
    save_selector_predecessor_persistence_gap = build_save_selector_predecessor_persistence_gap_summary(
        save_scene_selectors,
        save_selector_inherited_state_candidates,
        save_selector_predecessor_state_effect,
        save_selector_predecessor_route_order,
        save_selector_secondary_state_sources,
        save_selector_current_state_sources,
        map1_01a_hotspot_gap,
    )
    write_save_selector_predecessor_persistence_gap_outputs(save_selector_predecessor_persistence_gap, OUT)
    save_selector_secondary_route_overlap_candidates = build_save_selector_secondary_route_overlap_candidate_summary(
        save_scene_selectors,
        save_selector_secondary_fill_roots,
        save_selector_predecessor_persistence_gap,
    )
    write_save_selector_secondary_route_overlap_candidate_outputs(save_selector_secondary_route_overlap_candidates, OUT)
    save_selector_predecessor_tail_reset = build_save_selector_predecessor_tail_reset_summary(
        exe_data,
        save_scene_selectors,
        save_selector_secondary_fill_roots,
    )
    write_save_selector_predecessor_tail_reset_outputs(save_selector_predecessor_tail_reset, OUT)
    save_selector_secondary_reset_scope = build_save_selector_secondary_reset_scope_summary(
        exe_data,
        save_selector_branch_state,
        save_selector_secondary_state_sources,
        save_selector_predecessor_tail_reset,
        save_selector_predecessor_persistence_gap,
    )
    write_save_selector_secondary_reset_scope_outputs(save_selector_secondary_reset_scope, OUT)
    save_selector_secondary_block_writes = build_save_selector_secondary_block_write_summary(exe_data)
    write_save_selector_secondary_block_write_outputs(save_selector_secondary_block_writes, OUT)
    save_selector_secondary_global_reset_gap = build_save_selector_secondary_global_reset_gap_summary(
        save_selector_secondary_reset_scope,
        save_selector_secondary_state_sources,
        save_selector_predecessor_tail_reset,
        save_selector_predecessor_persistence_gap,
        save_selector_secondary_fill_roots,
        save_selector_secondary_route_overlap_candidates,
        save_selector_secondary_block_writes,
    )
    write_save_selector_secondary_global_reset_gap_outputs(save_selector_secondary_global_reset_gap, OUT)
    save_selector_post_gate_reset_candidates = build_save_selector_post_gate_reset_candidate_summary(
        save_selector_gate_paths,
        save_selector_secondary_state_sources,
    )
    write_save_selector_post_gate_reset_candidate_outputs(save_selector_post_gate_reset_candidates, OUT)
    save_selector_branch_gate_consistency = build_save_selector_branch_gate_consistency_summary(
        exe_data,
        save_selector_writer_chain,
        save_selector_gate_paths,
        save_selector_secondary_reset_scope,
    )
    write_save_selector_branch_gate_consistency_outputs(save_selector_branch_gate_consistency, OUT)
    print("wrote map1_01a hotspot and predecessor-state reports", flush=True)
    save_selector_gate_offset_sources = build_save_selector_gate_offset_source_summary(
        exe_data,
        save_scene_selectors,
        save_selector_branch_gate_consistency,
    )
    write_save_selector_gate_offset_source_outputs(save_selector_gate_offset_sources, OUT)
    save_selector_gate_offset_patterns = build_save_selector_gate_offset_pattern_summary(
        exe_data,
        save_scene_selectors,
    )
    write_save_selector_gate_offset_pattern_outputs(save_selector_gate_offset_patterns, OUT)
    save_selector_gate_base_candidates = build_save_selector_gate_base_candidate_summary(
        save_selector_gate_offset_sources,
        save_selector_selection_buffer_bases,
    )
    write_save_selector_gate_base_candidate_outputs(save_selector_gate_base_candidates, OUT)
    save_selector_gate_sample_values = build_save_selector_gate_sample_value_summary(
        PARKED_SAVEDATA_SAMPLE_GATE_VALUES,
        save_selector_gate_base_candidates,
    )
    write_save_selector_gate_sample_value_outputs(save_selector_gate_sample_values, OUT)
    save_selector_gate_pass_matrix = build_save_selector_gate_pass_matrix_summary(
        save_selector_gate_sample_values,
        save_selector_predecessor_state_effect,
        save_selector_gate_paths,
    )
    write_save_selector_gate_pass_matrix_outputs(save_selector_gate_pass_matrix, OUT)
    save_selector_opcode20_nested_base_modes = build_save_selector_opcode20_nested_base_mode_summary(
        exe_data,
        save_selector_current_writer_paths,
        save_selector_gate_offset_sources,
        save_selector_selection_buffer_bases,
    )
    write_save_selector_opcode20_nested_base_mode_outputs(save_selector_opcode20_nested_base_modes, OUT)
    save_selector_context58_consumers = build_save_selector_context58_consumer_summary(
        save_selector_object_field_refs,
        save_selector_opcode24_handler,
        save_selector_opcode20_nested_base_modes,
    )
    write_save_selector_context58_consumer_outputs(save_selector_context58_consumers, OUT)
    save_selector_opcode20_slot_sources = build_save_selector_opcode20_slot_source_summary(
        exe_data,
        save_loader_trace,
        save_selector_opcode20_nested_base_modes,
    )
    write_save_selector_opcode20_slot_source_outputs(save_selector_opcode20_slot_sources, OUT)
    save_selector_opcode20_slot_descriptor_writers = build_save_selector_opcode20_slot_descriptor_writer_summary(
        exe_data,
        save_selector_opcode20_slot_sources,
    )
    write_save_selector_opcode20_slot_descriptor_writer_outputs(save_selector_opcode20_slot_descriptor_writers, OUT)
    print("wrote save-selector gate base and opcode20 setup reports", flush=True)
    save_selector_current_root_frontier_paths = build_save_selector_current_root_frontier_path_summary(
        save_selector_references,
        save_selector_leaf_streams,
        save_selector_stream_traces,
        map1_01a_hotspot_gap,
        field_map_record_roots,
    )
    write_save_selector_current_root_frontier_path_outputs(save_selector_current_root_frontier_paths, OUT)
    map1_01a_root_point_scan = build_map1_01a_root_point_scan_summary(
        exe_data,
        map_data,
        save_scene_selectors,
        map_exit_candidates,
        save_selector_current_root_frontier_paths,
    )
    write_map1_01a_root_point_scan_outputs(map1_01a_root_point_scan, OUT)
    map1_01a_strict_source_hotspot_context = build_map1_01a_strict_source_hotspot_context_summary(
        map1_01a_strict_hotspot_review_matrix,
        map1_01a_strict_event_tile_signature_scan,
        map1_01a_hotspot_gap,
        map1_01a_exit_coordinate_variant_scan,
        map1_01a_exit_byte_coordinate_scan,
        map1_01a_exit_cns_payload_scan,
        map1_01a_resource_ref_scan,
        map1_01a_scene_payload_context,
        map1_01a_record_pattern_contrast,
        map1_01a_strict_target_link_gap,
        save_selector_frontier_reader_branch_context,
        save_selector_frontier_payload_shape,
        save_selector_scene_adjacency_index,
        map1_01a_edge_trigger_gap,
        map1_01a_manifest_point_scan,
        map1_01a_root_point_scan,
        map1_01a_entry_context,
        map1_01a_scene_record_cluster_context,
        map1_01a_selector_bridge_refs,
    )
    write_map1_01a_strict_source_hotspot_context_outputs(map1_01a_strict_source_hotspot_context, OUT)
    save_selector_predecessor_bridge_refs = build_save_selector_predecessor_bridge_ref_summary(
        exe_data,
        save_scene_selectors,
        save_selector_references,
        save_selector_predecessor_tail_reset,
        save_selector_current_root_frontier_paths,
    )
    write_save_selector_predecessor_bridge_ref_outputs(save_selector_predecessor_bridge_refs, OUT)
    save_selector_merge_bridge_matrix = build_save_selector_merge_bridge_matrix_summary(
        exe_data,
        save_scene_selectors,
    )
    write_save_selector_merge_bridge_matrix_outputs(save_selector_merge_bridge_matrix, OUT)
    save_selector_reverse_reuse_context = build_save_selector_reverse_reuse_context_summary(
        exe_data,
        save_selector_merge_bridge_matrix,
    )
    write_save_selector_reverse_reuse_context_outputs(save_selector_reverse_reuse_context, OUT)
    save_selector_merge_gap = build_save_selector_merge_gap_summary(
        save_scene_selectors,
        scene_selector_progress,
        map1_01a_selector_bridge_refs,
        save_selector_predecessor_bridge_refs,
        savedata_sample_coverage,
        save_selector_predecessor_persistence_gap,
    )
    write_save_selector_merge_gap_outputs(save_selector_merge_gap, OUT)
    save_selector_predecessor_branch_state_execution_gap = (
        build_save_selector_predecessor_branch_state_execution_gap_summary(
            save_selector_predecessor_persistence_gap,
            save_selector_predecessor_state_effect,
            save_selector_predecessor_tail_reset,
            save_selector_secondary_reset_scope,
            save_selector_secondary_global_reset_gap,
            save_selector_predecessor_route_order,
            save_selector_merge_gap,
            map1_01a_hotspot_gap,
            json.loads((OUT / "runtime_selected_pointer_predecessor_progress_poll.json").read_text(encoding="utf-8"))
            if (OUT / "runtime_selected_pointer_predecessor_progress_poll.json").exists()
            else {},
            json.loads((OUT / "runtime_selected_pointer_predecessor_direction_sweep_poll.json").read_text(encoding="utf-8"))
            if (OUT / "runtime_selected_pointer_predecessor_direction_sweep_poll.json").exists()
            else {},
            json.loads((OUT / "runtime_selected_pointer_predecessor_direction_sweep_branch_state_poll.json").read_text(encoding="utf-8"))
            if (OUT / "runtime_selected_pointer_predecessor_direction_sweep_branch_state_poll.json").exists()
            else {},
            json.loads((OUT / "runtime_selected_pointer_predecessor_left_overrun_activation_branch_state_poll.json").read_text(encoding="utf-8"))
            if (OUT / "runtime_selected_pointer_predecessor_left_overrun_activation_branch_state_poll.json").exists()
            else {},
            json.loads((OUT / "runtime_selected_pointer_predecessor_nearest_exit_branch_state_poll.json").read_text(encoding="utf-8"))
            if (OUT / "runtime_selected_pointer_predecessor_nearest_exit_branch_state_poll.json").exists()
            else {},
            json.loads((OUT / "runtime_selected_pointer_predecessor_reciprocal_exit_branch_state_poll.json").read_text(encoding="utf-8"))
            if (OUT / "runtime_selected_pointer_predecessor_reciprocal_exit_branch_state_poll.json").exists()
            else {},
            json.loads((OUT / "runtime_selected_pointer_predecessor_coordinate_branch_state_poll.json").read_text(encoding="utf-8"))
            if (OUT / "runtime_selected_pointer_predecessor_coordinate_branch_state_poll.json").exists()
            else {},
            json.loads((OUT / "runtime_selected_pointer_predecessor_trail_start_branch_state_poll.json").read_text(encoding="utf-8"))
            if (OUT / "runtime_selected_pointer_predecessor_trail_start_branch_state_poll.json").exists()
            else {},
            json.loads((OUT / "runtime_selected_pointer_predecessor_trail_left_overrun_branch_state_poll.json").read_text(encoding="utf-8"))
            if (OUT / "runtime_selected_pointer_predecessor_trail_left_overrun_branch_state_poll.json").exists()
            else {},
            predecessor_highfreq_branch_state_poll=(
                json.loads((OUT / "runtime_selected_pointer_predecessor_highfreq_branch_state_poll.json").read_text(encoding="utf-8"))
                if (OUT / "runtime_selected_pointer_predecessor_highfreq_branch_state_poll.json").exists()
                else {}
            ),
        )
    )
    write_save_selector_predecessor_branch_state_execution_gap_outputs(
        save_selector_predecessor_branch_state_execution_gap,
        OUT,
    )
    save_selector_merge_execution_gap = build_save_selector_merge_execution_gap_summary(
        save_selector_set_decomposition,
        save_selector_recomposition_lattice,
        save_selector_merge_gap,
        save_selector_merge_bridge_matrix,
        save_selector_target_alias_bridges,
        save_selector_route_root_ref_context,
        save_selector_predecessor_branch_state_execution_gap,
    )
    write_save_selector_merge_execution_gap_outputs(save_selector_merge_execution_gap, OUT)
    save_selector_predecessor_fill_execution_order_gap = (
        build_save_selector_predecessor_fill_execution_order_gap_summary(
            exe_data,
            save_selector_predecessor_branch_state_execution_gap,
            save_selector_predecessor_tail_reset,
            save_selector_secondary_global_reset_gap,
            save_selector_predecessor_persistence_gap,
            save_selector_predecessor_route_order,
            save_selector_merge_execution_gap,
            frontier_reader_branch_context=save_selector_frontier_reader_branch_context,
            data_descriptor_opcode_map=save_selector_data_descriptor_opcode_map,
            dispatch_table_context=save_selector_dispatch_table_context,
            field_entry_sequence_scan=(
                json.loads((OUT / "runtime_predecessor_field_entry_sequence_scan.json").read_text(encoding="utf-8"))
                if (OUT / "runtime_predecessor_field_entry_sequence_scan.json").exists()
                else {}
            ),
            coordinate_source_scan=(
                json.loads((OUT / "runtime_predecessor_coordinate_source_scan.json").read_text(encoding="utf-8"))
                if (OUT / "runtime_predecessor_coordinate_source_scan.json").exists()
                else {}
            ),
        )
    )
    write_save_selector_predecessor_fill_execution_order_gap_outputs(
        save_selector_predecessor_fill_execution_order_gap,
        OUT,
    )
    save_selector_predecessor_descriptor_bridge_gap = (
        build_save_selector_predecessor_descriptor_bridge_gap_summary(
            exe_data,
            save_selector_data_descriptor_opcode_map,
            save_selector_predecessor_fill_execution_order_gap,
        )
    )
    write_save_selector_predecessor_descriptor_bridge_gap_outputs(
        save_selector_predecessor_descriptor_bridge_gap,
        OUT,
    )
    save_selector_predecessor_fill_site_execution_context = (
        build_save_selector_predecessor_fill_site_execution_context_summary(
            save_selector_predecessor_fill_execution_order_gap,
            save_selector_predecessor_branch_state_execution_gap,
            save_selector_predecessor_descriptor_bridge_gap,
            json.loads((OUT / "runtime_predecessor_coordinate_source_scan.json").read_text(encoding="utf-8"))
            if (OUT / "runtime_predecessor_coordinate_source_scan.json").exists()
            else {},
            json.loads((OUT / "runtime_predecessor_field_entry_sequence_scan.json").read_text(encoding="utf-8"))
            if (OUT / "runtime_predecessor_field_entry_sequence_scan.json").exists()
            else {},
            save_selector_branch_gate_consistency,
        )
    )
    write_save_selector_predecessor_fill_site_execution_context_outputs(
        save_selector_predecessor_fill_site_execution_context,
        OUT,
    )
    save_selector_predecessor_branch_state_execution_gap = (
        build_save_selector_predecessor_branch_state_execution_gap_summary(
            save_selector_predecessor_persistence_gap,
            save_selector_predecessor_state_effect,
            save_selector_predecessor_tail_reset,
            save_selector_secondary_reset_scope,
            save_selector_secondary_global_reset_gap,
            save_selector_predecessor_route_order,
            save_selector_merge_gap,
            map1_01a_hotspot_gap,
            json.loads((OUT / "runtime_selected_pointer_predecessor_progress_poll.json").read_text(encoding="utf-8"))
            if (OUT / "runtime_selected_pointer_predecessor_progress_poll.json").exists()
            else {},
            json.loads((OUT / "runtime_selected_pointer_predecessor_direction_sweep_poll.json").read_text(encoding="utf-8"))
            if (OUT / "runtime_selected_pointer_predecessor_direction_sweep_poll.json").exists()
            else {},
            json.loads((OUT / "runtime_selected_pointer_predecessor_direction_sweep_branch_state_poll.json").read_text(encoding="utf-8"))
            if (OUT / "runtime_selected_pointer_predecessor_direction_sweep_branch_state_poll.json").exists()
            else {},
            json.loads((OUT / "runtime_selected_pointer_predecessor_left_overrun_activation_branch_state_poll.json").read_text(encoding="utf-8"))
            if (OUT / "runtime_selected_pointer_predecessor_left_overrun_activation_branch_state_poll.json").exists()
            else {},
            json.loads((OUT / "runtime_selected_pointer_predecessor_nearest_exit_branch_state_poll.json").read_text(encoding="utf-8"))
            if (OUT / "runtime_selected_pointer_predecessor_nearest_exit_branch_state_poll.json").exists()
            else {},
            json.loads((OUT / "runtime_selected_pointer_predecessor_reciprocal_exit_branch_state_poll.json").read_text(encoding="utf-8"))
            if (OUT / "runtime_selected_pointer_predecessor_reciprocal_exit_branch_state_poll.json").exists()
            else {},
            json.loads((OUT / "runtime_selected_pointer_predecessor_coordinate_branch_state_poll.json").read_text(encoding="utf-8"))
            if (OUT / "runtime_selected_pointer_predecessor_coordinate_branch_state_poll.json").exists()
            else {},
            json.loads((OUT / "runtime_selected_pointer_predecessor_trail_start_branch_state_poll.json").read_text(encoding="utf-8"))
            if (OUT / "runtime_selected_pointer_predecessor_trail_start_branch_state_poll.json").exists()
            else {},
            json.loads((OUT / "runtime_selected_pointer_predecessor_trail_left_overrun_branch_state_poll.json").read_text(encoding="utf-8"))
            if (OUT / "runtime_selected_pointer_predecessor_trail_left_overrun_branch_state_poll.json").exists()
            else {},
            predecessor_highfreq_branch_state_poll=(
                json.loads((OUT / "runtime_selected_pointer_predecessor_highfreq_branch_state_poll.json").read_text(encoding="utf-8"))
                if (OUT / "runtime_selected_pointer_predecessor_highfreq_branch_state_poll.json").exists()
                else {}
            ),
            predecessor_fill_execution_order_gap=save_selector_predecessor_fill_execution_order_gap,
            predecessor_fill_site_execution_context=save_selector_predecessor_fill_site_execution_context,
        )
    )
    write_save_selector_predecessor_branch_state_execution_gap_outputs(
        save_selector_predecessor_branch_state_execution_gap,
        OUT,
    )
    save_selector_merge_execution_gap = build_save_selector_merge_execution_gap_summary(
        save_selector_set_decomposition,
        save_selector_recomposition_lattice,
        save_selector_merge_gap,
        save_selector_merge_bridge_matrix,
        save_selector_target_alias_bridges,
        save_selector_route_root_ref_context,
        save_selector_predecessor_branch_state_execution_gap,
    )
    write_save_selector_merge_execution_gap_outputs(save_selector_merge_execution_gap, OUT)
    save_selector_predecessor_fill_opcode10_context = (
        build_save_selector_predecessor_fill_opcode10_context_summary(
            exe_data,
            save_selector_predecessor_fill_execution_order_gap,
            save_selector_predecessor_branch_state_execution_gap,
            save_selector_predecessor_fill_site_execution_context,
            save_selector_secondary_reset_scope,
            script_handler_table,
        )
    )
    write_save_selector_predecessor_fill_opcode10_context_outputs(
        save_selector_predecessor_fill_opcode10_context,
        OUT,
    )
    save_selector_selected_pointer_usage = build_save_selector_selected_pointer_usage_summary(
        exe_data,
        save_scene_selectors,
        save_loader_trace,
    )
    write_save_selector_selected_pointer_usage_outputs(save_selector_selected_pointer_usage, OUT)
    save_selector_selected_pointer_opcode_paths = build_save_selector_selected_pointer_opcode_path_summary(
        exe_data,
        save_scene_selectors,
    )
    write_save_selector_selected_pointer_opcode_path_outputs(save_selector_selected_pointer_opcode_paths, OUT)
    save_selector_global_selected_pointer_paths = build_save_selector_global_selected_pointer_path_summary(
        exe_data,
        save_scene_selectors,
    )
    write_save_selector_global_selected_pointer_path_outputs(save_selector_global_selected_pointer_paths, OUT)
    if (
        (OUT / "runtime_selected_pointer_source_savedata_load_variants_poll.json").exists()
        or (OUT / "runtime_selected_pointer_source_savedata_load_coordinate_poll.json").exists()
        or (OUT / "runtime_selected_pointer_source_exit_branch_state_load_confirmed_poll.json").exists()
        or (OUT / "runtime_selected_pointer_source_exit_adaptive_coordinate_poll.json").exists()
        or (OUT / "runtime_selected_pointer_source_exit_adaptive_trail_start_poll.json").exists()
    ):
        runtime_source_save_load_variant_context = build_runtime_source_save_load_variant_context_summary(
            json.loads((OUT / "runtime_selected_pointer_source_savedata_load_variants_poll.json").read_text(encoding="utf-8"))
            if (OUT / "runtime_selected_pointer_source_savedata_load_variants_poll.json").exists()
            else {},
            json.loads((OUT / "runtime_selected_pointer_source_savedata_load_coordinate_poll.json").read_text(encoding="utf-8"))
            if (OUT / "runtime_selected_pointer_source_savedata_load_coordinate_poll.json").exists()
            else {},
            json.loads(
                (OUT / "runtime_selected_pointer_source_exit_branch_state_load_confirmed_poll.json").read_text(
                    encoding="utf-8"
                )
            )
            if (OUT / "runtime_selected_pointer_source_exit_branch_state_load_confirmed_poll.json").exists()
            else {},
            json.loads(
                (OUT / "runtime_selected_pointer_source_exit_adaptive_coordinate_poll.json").read_text(
                    encoding="utf-8"
                )
            )
            if (OUT / "runtime_selected_pointer_source_exit_adaptive_coordinate_poll.json").exists()
            else {},
            json.loads(
                (OUT / "runtime_selected_pointer_source_exit_adaptive_trail_start_poll.json").read_text(
                    encoding="utf-8"
                )
            )
            if (OUT / "runtime_selected_pointer_source_exit_adaptive_trail_start_poll.json").exists()
            else {},
            save_selector_mapset_aliases,
            save_selector_scene_adjacency_index,
            save_selector_global_selected_pointer_paths,
        )
        write_runtime_source_save_load_variant_context_outputs(runtime_source_save_load_variant_context, OUT)
    if list(OUT.glob("runtime_selected_pointer_predecessor_*poll.json")):
        runtime_predecessor_route_attempt_context = build_runtime_predecessor_route_attempt_context_summary(
            OUT,
            save_selector_mapset_aliases,
            save_selector_scene_adjacency_index,
            save_selector_global_selected_pointer_paths,
            save_scene_selectors,
            save_selector_references,
        )
        write_runtime_predecessor_route_attempt_context_outputs(runtime_predecessor_route_attempt_context, OUT)
    runtime_patched_selector_followup_context = build_runtime_patched_selector_followup_context_summary(
        json.loads((OUT / "runtime_selected_pointer_patched_public_selector_2_0_input_path_case_alias_poll.json").read_text(encoding="utf-8"))
        if (OUT / "runtime_selected_pointer_patched_public_selector_2_0_input_path_case_alias_poll.json").exists()
        else {},
        save_selector_mapset_aliases,
        save_selector_address_predecessor_context,
        save_selector_target_alias_state_effects,
        save_selector_target_alias_bridges,
        save_selector_global_selected_pointer_paths,
        save_selector_runtime_selector_byte_writes,
        runtime_patched_selector_active_order_poll,
        runtime_patched_selector_branch_state_poll,
        json.loads((OUT / "runtime_patched_selector_exit_candidate_poll.json").read_text(encoding="utf-8"))
        if (OUT / "runtime_patched_selector_exit_candidate_poll.json").exists()
        else {},
        json.loads((OUT / "runtime_patched_selector_left_stability_poll.json").read_text(encoding="utf-8"))
        if (OUT / "runtime_patched_selector_left_stability_poll.json").exists()
        else {},
        json.loads((OUT / "runtime_patched_selector_left_stability_recheck_poll.json").read_text(encoding="utf-8"))
        if (OUT / "runtime_patched_selector_left_stability_recheck_poll.json").exists()
        else {},
        json.loads((OUT / "runtime_patched_selector_left_active_order_poll.json").read_text(encoding="utf-8"))
        if (OUT / "runtime_patched_selector_left_active_order_poll.json").exists()
        else {},
        ROOT / "Hwanse2.exe",
    )
    write_runtime_patched_selector_followup_context_outputs(runtime_patched_selector_followup_context, OUT)
    save_selector_opcode08_activation_windows = build_save_selector_opcode08_activation_window_summary(
        save_selector_selected_pointer_opcode_paths,
    )
    write_save_selector_opcode08_activation_window_outputs(save_selector_opcode08_activation_windows, OUT)
    save_selector_opcode08_unreadable_producers = build_save_selector_opcode08_unreadable_producer_summary(
        exe_data,
        save_selector_opcode08_activation_windows,
        save_selector_selected_pointer_opcode_paths,
    )
    write_save_selector_opcode08_unreadable_producer_outputs(save_selector_opcode08_unreadable_producers, OUT)
    save_selector_opcode09_pointer_collisions = build_save_selector_opcode09_pointer_collision_summary(
        exe_data,
        save_selector_selected_pointer_opcode_paths,
        save_selector_opcode08_unreadable_producers,
    )
    write_save_selector_opcode09_pointer_collision_outputs(save_selector_opcode09_pointer_collisions, OUT)
    synthetic_savedata_selector_probe = parked_synthetic_savedata_selector_probe()
    save_selector_real_savedata_evidence_gap = parked_real_savedata_evidence_gap()
    save_selector_selected_root_execution_gap = build_save_selector_selected_root_execution_gap_summary(
        save_selector_selected_pointer_usage,
        save_selector_global_selected_pointer_paths,
        save_selector_selected_pointer_opcode_paths,
        save_selector_current_writer_paths,
        save_selector_dispatch_table_context,
        save_selector_real_savedata_evidence_gap,
        runtime_memory_snapshot_context,
        json.loads((OUT / "runtime_input_path_probe.json").read_text(encoding="utf-8"))
        if (OUT / "runtime_input_path_probe.json").exists()
        else {},
        json.loads((OUT / "runtime_key_sequence_probe.json").read_text(encoding="utf-8"))
        if (OUT / "runtime_key_sequence_probe.json").exists()
        else {},
        json.loads((OUT / "runtime_selected_pointer_poll.json").read_text(encoding="utf-8"))
        if (OUT / "runtime_selected_pointer_poll.json").exists()
        else {},
        json.loads((OUT / "runtime_selected_pointer_prelude_poll.json").read_text(encoding="utf-8"))
        if (OUT / "runtime_selected_pointer_prelude_poll.json").exists()
        else {},
        json.loads((OUT / "runtime_selected_pointer_long_poll.json").read_text(encoding="utf-8"))
        if (OUT / "runtime_selected_pointer_long_poll.json").exists()
        else {},
        json.loads((OUT / "runtime_selected_pointer_late_poll.json").read_text(encoding="utf-8"))
        if (OUT / "runtime_selected_pointer_late_poll.json").exists()
        else {},
        json.loads((OUT / "runtime_route_watch_values_poll.json").read_text(encoding="utf-8"))
        if (OUT / "runtime_route_watch_values_poll.json").exists()
        else {},
        json.loads((OUT / "runtime_selected_pointer_savedata_load_poll.json").read_text(encoding="utf-8"))
        if (OUT / "runtime_selected_pointer_savedata_load_poll.json").exists()
        else {},
        json.loads((OUT / "runtime_selected_pointer_multislot_savedata_load_poll.json").read_text(encoding="utf-8"))
        if (OUT / "runtime_selected_pointer_multislot_savedata_load_poll.json").exists()
        else {},
        json.loads((OUT / "runtime_selected_pointer_multislot_savedata_load_case_alias_poll.json").read_text(encoding="utf-8"))
        if (OUT / "runtime_selected_pointer_multislot_savedata_load_case_alias_poll.json").exists()
        else {},
        json.loads((OUT / "runtime_selected_pointer_multislot_savedata_load_input_path_case_alias_poll.json").read_text(encoding="utf-8"))
        if (OUT / "runtime_selected_pointer_multislot_savedata_load_input_path_case_alias_poll.json").exists()
        else {},
        json.loads((OUT / "runtime_selected_pointer_predecessor_direction_sweep_poll.json").read_text(encoding="utf-8"))
        if (OUT / "runtime_selected_pointer_predecessor_direction_sweep_poll.json").exists()
        else {},
        json.loads((OUT / "runtime_selected_pointer_predecessor_left_overrun_activation_sweep_poll.json").read_text(encoding="utf-8"))
        if (OUT / "runtime_selected_pointer_predecessor_left_overrun_activation_sweep_poll.json").exists()
        else {},
        runtime_predecessor_route_attempt_context,
        json.loads((OUT / "runtime_selected_pointer_synthetic_selector_2_0_input_path_case_alias_poll.json").read_text(encoding="utf-8"))
        if (OUT / "runtime_selected_pointer_synthetic_selector_2_0_input_path_case_alias_poll.json").exists()
        else {},
        json.loads((OUT / "runtime_selected_pointer_patched_public_selector_2_0_input_path_case_alias_poll.json").read_text(encoding="utf-8"))
        if (OUT / "runtime_selected_pointer_patched_public_selector_2_0_input_path_case_alias_poll.json").exists()
        else {},
        json.loads((OUT / "runtime_save_file_io_strace_attach_load_candidates_probe.json").read_text(encoding="utf-8"))
        if (OUT / "runtime_save_file_io_strace_attach_load_candidates_probe.json").exists()
        else {},
        json.loads((OUT / "runtime_save_file_io_strace_attach_load_candidates_case_alias_probe.json").read_text(encoding="utf-8"))
        if (OUT / "runtime_save_file_io_strace_attach_load_candidates_case_alias_probe.json").exists()
        else {},
        map1_01a_edge_trigger_gap,
        runtime_patched_selector_followup_context,
        exe_data,
    )
    write_save_selector_selected_root_execution_gap_outputs(save_selector_selected_root_execution_gap, OUT)
    save_selector_route_pair_entry_execution_gap = build_save_selector_route_pair_entry_execution_gap_summary(
        save_selector_leaf_index_space,
        save_selector_leaf_table_global_context,
        save_selector_opcode08_activation_windows,
        save_selector_opcode07_indexed_pointers,
        save_selector_opcode09_pointer_collisions,
        save_selector_wrapper_descriptor_context,
        save_selector_selected_root_execution_gap,
        save_selector_current_root_frontier_paths,
        save_selector_route_pair_index_source_gap,
        save_selector_leaf_table_context,
    )
    write_save_selector_route_pair_entry_execution_gap_outputs(save_selector_route_pair_entry_execution_gap, OUT)
    save_selector_merge_runtime_context = build_save_selector_merge_runtime_context_summary(
        save_selector_merge_execution_gap,
        save_selector_predecessor_fill_site_execution_context,
        save_selector_selected_root_execution_gap,
        save_selector_route_pair_entry_execution_gap,
        map1_01a_strict_hotspot_review_matrix,
    )
    write_save_selector_merge_runtime_context_outputs(save_selector_merge_runtime_context, OUT)
    save_selector_merge_closure_context = build_save_selector_merge_closure_context_summary(
        save_selector_merge_execution_gap,
        save_selector_merge_runtime_context,
        save_selector_set_decomposition,
        save_selector_recomposition_lattice,
        save_selector_target_alias_bridges,
        save_selector_route_root_ref_context,
        save_selector_predecessor_bridge_refs,
        save_selector_selected_root_execution_gap,
        save_selector_predecessor_fill_opcode10_context,
        save_selector_predecessor_persistence_gap,
    )
    write_save_selector_merge_closure_context_outputs(save_selector_merge_closure_context, OUT)
    save_selector_predecessor_fill_execution_order_gap = (
        build_save_selector_predecessor_fill_execution_order_gap_summary(
            exe_data,
            save_selector_predecessor_branch_state_execution_gap,
            save_selector_predecessor_tail_reset,
            save_selector_secondary_global_reset_gap,
            save_selector_predecessor_persistence_gap,
            save_selector_predecessor_route_order,
            save_selector_merge_execution_gap,
            save_selector_merge_runtime_context,
            save_selector_merge_closure_context,
            frontier_reader_branch_context=save_selector_frontier_reader_branch_context,
            data_descriptor_opcode_map=save_selector_data_descriptor_opcode_map,
            dispatch_table_context=save_selector_dispatch_table_context,
            field_entry_sequence_scan=(
                json.loads((OUT / "runtime_predecessor_field_entry_sequence_scan.json").read_text(encoding="utf-8"))
                if (OUT / "runtime_predecessor_field_entry_sequence_scan.json").exists()
                else {}
            ),
            coordinate_source_scan=(
                json.loads((OUT / "runtime_predecessor_coordinate_source_scan.json").read_text(encoding="utf-8"))
                if (OUT / "runtime_predecessor_coordinate_source_scan.json").exists()
                else {}
            ),
        )
    )
    write_save_selector_predecessor_fill_execution_order_gap_outputs(
        save_selector_predecessor_fill_execution_order_gap,
        OUT,
    )
    save_selector_predecessor_descriptor_bridge_gap = (
        build_save_selector_predecessor_descriptor_bridge_gap_summary(
            exe_data,
            save_selector_data_descriptor_opcode_map,
            save_selector_predecessor_fill_execution_order_gap,
        )
    )
    write_save_selector_predecessor_descriptor_bridge_gap_outputs(
        save_selector_predecessor_descriptor_bridge_gap,
        OUT,
    )
    save_selector_predecessor_fill_site_execution_context = (
        build_save_selector_predecessor_fill_site_execution_context_summary(
            save_selector_predecessor_fill_execution_order_gap,
            save_selector_predecessor_branch_state_execution_gap,
            save_selector_predecessor_descriptor_bridge_gap,
            json.loads((OUT / "runtime_predecessor_coordinate_source_scan.json").read_text(encoding="utf-8"))
            if (OUT / "runtime_predecessor_coordinate_source_scan.json").exists()
            else {},
            json.loads((OUT / "runtime_predecessor_field_entry_sequence_scan.json").read_text(encoding="utf-8"))
            if (OUT / "runtime_predecessor_field_entry_sequence_scan.json").exists()
            else {},
            save_selector_branch_gate_consistency,
        )
    )
    write_save_selector_predecessor_fill_site_execution_context_outputs(
        save_selector_predecessor_fill_site_execution_context,
        OUT,
    )
    save_selector_predecessor_fill_opcode10_context = (
        build_save_selector_predecessor_fill_opcode10_context_summary(
            exe_data,
            save_selector_predecessor_fill_execution_order_gap,
            save_selector_predecessor_branch_state_execution_gap,
            save_selector_predecessor_fill_site_execution_context,
            save_selector_secondary_reset_scope,
            script_handler_table,
        )
    )
    write_save_selector_predecessor_fill_opcode10_context_outputs(
        save_selector_predecessor_fill_opcode10_context,
        OUT,
    )
    save_selector_wrapper_execution_gap = build_save_selector_wrapper_execution_gap_summary(
        save_selector_leaf_table_context,
        save_selector_leaf_table_global_context,
        save_selector_wrapper_descriptor_context,
        save_selector_route_pair_descriptor_context,
        save_selector_opcode07_indexed_pointers,
        save_selector_opcode08_activation_windows,
        save_selector_opcode09_pointer_collisions,
        save_selector_selected_root_execution_gap,
        save_selector_current_root_frontier_paths,
        save_selector_merge_execution_gap,
        route_pair_entry_execution_gap=save_selector_route_pair_entry_execution_gap,
    )
    write_save_selector_wrapper_execution_gap_outputs(save_selector_wrapper_execution_gap, OUT)
    save_selector_opcode20_descriptor_scripts = build_save_selector_opcode20_descriptor_script_summary(
        exe_data,
        save_selector_opcode20_slot_descriptor_writers,
        save_selector_current_root_frontier_paths,
    )
    write_save_selector_opcode20_descriptor_script_outputs(save_selector_opcode20_descriptor_scripts, OUT)
    save_selector_opcode20_object_base_candidates = build_save_selector_opcode20_object_base_candidate_summary(
        exe_data,
        save_selector_opcode20_descriptor_scripts,
        save_selector_selection_buffer_bases,
    )
    write_save_selector_opcode20_object_base_candidate_outputs(save_selector_opcode20_object_base_candidates, OUT)
    save_selector_opcode20_sample_order_effects = build_save_selector_opcode20_sample_order_effect_summary(
        PARKED_SAVEDATA_SAMPLE_PARTY_ORDER,
        save_selector_opcode20_descriptor_scripts,
    )
    write_save_selector_opcode20_sample_order_effect_outputs(save_selector_opcode20_sample_order_effects, OUT)
    save_selector_opcode20_order_space = build_save_selector_opcode20_order_space_summary(
        save_selector_opcode20_descriptor_scripts,
        save_selector_opcode20_slot_sources,
        save_selector_opcode20_sample_order_effects,
    )
    write_save_selector_opcode20_order_space_outputs(save_selector_opcode20_order_space, OUT)
    save_selector_opcode20_context_f2_sources = build_save_selector_opcode20_context_f2_source_summary(
        exe_data,
        save_selector_opcode20_object_base_candidates,
        save_selector_opcode20_order_space,
        runtime_patched_selector_active_order_poll,
    )
    write_save_selector_opcode20_context_f2_source_outputs(save_selector_opcode20_context_f2_sources, OUT)
    save_selector_opcode20_runtime_materializers = build_save_selector_opcode20_runtime_materializer_summary(
        exe_data,
        save_loader_trace,
        save_selector_opcode20_descriptor_scripts,
        save_selector_opcode20_sample_order_effects,
        save_selector_leaf_streams,
    )
    write_save_selector_opcode20_runtime_materializer_outputs(save_selector_opcode20_runtime_materializers, OUT)
    save_selector_gate_base_proof_gap = build_save_selector_gate_base_proof_gap_summary(
        save_selector_current_writer_paths,
        save_selector_opcode20_nested_base_modes,
        save_selector_opcode20_descriptor_scripts,
        save_selector_opcode20_sample_order_effects,
        save_selector_gate_pass_matrix,
        runtime_patched_selector_followup_context,
        runtime_predecessor_direction_sweep_active_order_poll,
        runtime_predecessor_left_overrun_active_order_poll,
    )
    write_save_selector_gate_base_proof_gap_outputs(save_selector_gate_base_proof_gap, OUT)
    map1_01a_exit_target_ranking_for_queue = build_map1_01a_exit_target_ranking_summary(
        map_exit_candidates,
        map_exit_coordinate_refs,
        [],
        transition_reviews,
        save_selector_scene_adjacency_index,
    )
    route_investigation_queue = build_route_investigation_queue_rows(
        route_blockers,
        save_selector_frontier,
        save_selector_frontier_branches,
        save_selector_frontier_selection_flow,
        save_selector_leaf_streams,
        field_map_record_roots,
        save_selector_writer_chain,
        save_selector_gate_paths,
        save_selector_opcode24_mode1_indirect_context,
        save_selector_opcode24_mode1_file_read_context,
        save_selector_opcode24_mode1_block_writes,
        save_selector_opcode24_runtime_enabled_block_writes,
        save_selector_opcode24_mode1_source_writes,
        save_selector_opcode24_mode1_runtime_context,
        save_selector_opcode24_runtime_enabled_context,
        save_selector_opcode24_mode1_default_effect,
        map1_01a_exit_coordinate_variant_scan,
        map_exit_coordinate_refs,
        map1_01a_exit_coordinate_context,
        original_collision_route_audit,
        save_selector_gate_base_proof_gap,
        save_selector_branch_gate_consistency,
        save_selector_branch_selector_equation,
        save_selector_gate_offset_sources,
        save_selector_gate_offset_patterns,
        save_selector_gate_base_candidates,
        save_selector_gate_sample_values,
        save_selector_gate_pass_matrix,
        save_selector_predecessor_state_effect,
        save_selector_predecessor_persistence_gap,
        save_selector_predecessor_branch_state_execution_gap,
        save_selector_active_flag_effect,
        save_selector_secondary_fill_roots,
        save_selector_inherited_state_candidates,
        save_selector_current_state_sources,
        save_selector_predecessor_tail_reset,
        save_selector_branch_state_writers,
        save_selector_branch_state_dispatch,
        save_selector_secondary_state_sources,
        save_selector_branch_state_opcode_overlap,
        event_object_branch_state_stream_candidates,
        event_object_branch_state_candidate_links,
        event_object_branch_state_block_context,
        save_selector_predecessor_route_order,
        save_selector_set_decomposition,
        save_selector_recomposition_lattice,
        save_selector_mapset_aliases,
        save_selector_target_alias_state_effects,
        save_selector_address_predecessor_context,
        save_selector_target_alias_bridges,
        save_selector_route_root_ref_context,
        save_selector_predecessor_bridge_refs,
        save_selector_reverse_reuse_context,
        save_selector_merge_bridge_matrix,
        save_selector_selected_pointer_opcode_paths,
        save_selector_global_selected_pointer_paths,
        save_selector_selected_pointer_usage,
        save_selector_selected_root_execution_gap,
        save_selector_route_pair_entry_execution_gap,
        save_selector_opcode08_activation_windows,
        save_selector_opcode08_unreadable_producers,
        save_selector_opcode09_pointer_collisions,
        synthetic_savedata_selector_probe,
        save_selector_selection_buffer20_provenance,
        save_selector_data_descriptor_opcode_map,
        save_selector_opcode24_payload_table,
        save_selector_real_savedata_evidence_gap,
        save_selector_opcode24_globals,
        map1_01a_resource_ref_scan,
        save_selector_opcode20_object_base_candidates,
        save_selector_opcode20_order_space,
        save_selector_opcode20_context_f2_sources,
        save_selector_opcode20_slot_sources,
        save_selector_opcode20_descriptor_scripts,
        save_selector_opcode20_sample_order_effects,
            save_selector_opcode20_runtime_materializers,
            save_selector_opcode20_nested_base_modes,
            save_selector_secondary_reset_scope,
            save_selector_secondary_global_reset_gap,
            save_selector_secondary_block_writes,
            save_selector_runtime_selector_byte_writes,
            save_selector_post_gate_reset_candidates,
            save_selector_secondary_route_overlap_candidates,
        save_selector_wrapper_descriptor_context,
        map1_01a_scene_payload_context,
        save_selector_scene_list_context,
        save_selector_scene_adjacency_index,
        save_selector_leaf_table_context,
        save_selector_leaf_index_space,
        save_selector_route_pair_descriptor_context,
        save_selector_opcode07_indexed_pointers,
        save_selector_object61_stream_operands,
        save_selector_context58_consumers,
        save_selector_current_root_frontier_paths,
        save_selector_selection_buffer_bases,
        map1_01a_record_pattern_contrast,
        map1_01a_strict_target_link_gap,
        map1_01a_entry_context,
        map1_01a_selector_bridge_refs,
        map1_01a_manifest_point_scan,
        map1_01a_root_point_scan,
        save_selector_opcode20_slot_descriptor_writers,
        save_selector_opcode24_current_root_modes,
        map1_01a_event_shape_scan,
        save_selector_current_writer_paths,
        edge_trigger_gap_summary=map1_01a_edge_trigger_gap,
        hotspot_gap_summary=map1_01a_hotspot_gap,
        tile_hotspot_pattern_summary=map1_01a_tile_hotspot_pattern_contrast,
        strict_event_tile_signature_summary=map1_01a_strict_event_tile_signature_scan,
        strict_hotspot_review_matrix_summary=map1_01a_strict_hotspot_review_matrix,
        strict_source_hotspot_context_summary=map1_01a_strict_source_hotspot_context,
        runtime_source_save_load_variant_context_summary=runtime_source_save_load_variant_context,
        frontier_reader_branch_context_summary=save_selector_frontier_reader_branch_context,
        frontier_payload_shape_summary=save_selector_frontier_payload_shape,
        predecessor_fill_execution_order_gap_summary=save_selector_predecessor_fill_execution_order_gap,
        predecessor_fill_opcode10_context_summary=save_selector_predecessor_fill_opcode10_context,
        predecessor_descriptor_bridge_gap_summary=save_selector_predecessor_descriptor_bridge_gap,
        predecessor_fill_site_execution_context_summary=save_selector_predecessor_fill_site_execution_context,
        merge_execution_gap_summary=save_selector_merge_execution_gap,
        merge_runtime_context_summary=save_selector_merge_runtime_context,
        merge_closure_context_summary=save_selector_merge_closure_context,
        exit_target_ranking_summary=map1_01a_exit_target_ranking_for_queue,
        runtime_trace_feasibility_summary=runtime_trace_feasibility,
    )
    write_route_investigation_queue_outputs(route_investigation_queue, OUT)
    route_promotion_gate = build_route_promotion_gate_summary(
        route_investigation_queue,
        json.loads((OUT / "savedata_slot_scan.json").read_text(encoding="utf-8"))
        if (OUT / "savedata_slot_scan.json").exists()
        else {},
        runtime_trace_feasibility,
        map1_01a_exit_coordinate_variant_scan,
        map1_01a_strict_source_hotspot_context,
        map1_01a_edge_trigger_gap,
        save_selector_selected_root_execution_gap,
        save_selector_predecessor_fill_execution_order_gap,
        save_selector_predecessor_descriptor_bridge_gap,
        save_selector_predecessor_fill_site_execution_context,
        save_selector_merge_runtime_context,
        save_selector_wrapper_execution_gap,
        save_selector_gate_base_proof_gap,
        save_selector_secondary_fill_roots,
        save_selector_merge_execution_gap,
        runtime_source_save_load_variant_context,
        runtime_predecessor_route_attempt_context,
    )
    write_route_promotion_gate_outputs(route_promotion_gate, OUT)
    print(f"wrote route promotion gate -> {OUT / 'route_promotion_gate.html'}")
    route_assist_frontier = build_route_assist_frontier_rows(
        playable_progress,
        route_investigation_queue,
        map_exit_candidates,
    )
    write_route_assist_frontier_outputs(route_assist_frontier, OUT)
    map1_01a_exit_target_ranking = build_map1_01a_exit_target_ranking_summary(
        map_exit_candidates,
        map_exit_coordinate_refs,
        route_assist_frontier,
        transition_reviews,
        save_selector_scene_adjacency_index,
    )
    write_map1_01a_exit_target_ranking_outputs(map1_01a_exit_target_ranking, OUT)
    reciprocal_transition_candidates = build_reciprocal_transition_candidate_summary(
        playable_progress,
        transition_reviews,
        event_transitions,
        save_selector_scene_links,
        map_exit_candidates,
    )
    write_reciprocal_transition_candidate_outputs(reciprocal_transition_candidates, OUT)
    map_layout_reviews = load_map_layout_reviews(ROOT / "data" / "map_layout_reviews.json", map_data)
    print("loaded map layout reviews", flush=True)
    write_map_layout_review_outputs(map_layout_reviews, OUT)
    print("wrote map layout review outputs", flush=True)
    map_render_review_rows = map_render_review_coverage_rows(
        map_data,
        map_render_review_index(map_data, scene_links),
        map_render_reviews,
    )
    print("calculated map render review coverage rows", flush=True)
    completion_audit = build_completion_audit_summary(
        playable_progress,
        route_blockers,
        transition_reviews,
        map_render_reviews,
        map_count=len(map_data),
        map_render_gap_rows=map_render_review_rows,
        runtime_trace_feasibility=runtime_trace_feasibility,
        route_promotion_gate=route_promotion_gate,
        transition_review_shortlist_audit=transition_review_shortlist_audit,
        runtime_timing=runtime_timing,
        runtime_movement=runtime_movement,
        original_collision_route_audit=original_collision_route_audit,
        edge_trigger_gap=map1_01a_edge_trigger_gap,
        tile_hotspot_pattern_contrast=map1_01a_tile_hotspot_pattern_contrast,
        strict_event_tile_signature_scan=map1_01a_strict_event_tile_signature_scan,
        strict_source_hotspot_context=map1_01a_strict_source_hotspot_context,
        battle_background_count=len(battle_backgrounds),
        battle_candidate_count=battle_event_candidates.get("candidateCount", 0),
        event_battle_gap_audit=event_battle_gap_audit,
        event_vm_semantics_gap=event_vm_semantics_gap,
        map1_resource_ref_scan=map1_01a_resource_ref_scan,
        event_shape_scan=map1_01a_event_shape_scan,
        map1_hotspot_gap=map1_01a_hotspot_gap,
        strict_hotspot_review_matrix=map1_01a_strict_hotspot_review_matrix,
        strict_event_source_coverage=strict_event_source_coverage,
        record_pattern_contrast=map1_01a_record_pattern_contrast,
        strict_target_link_gap=map1_01a_strict_target_link_gap,
        scene_record_cluster_context=map1_01a_scene_record_cluster_context,
        entry_context=map1_01a_entry_context,
        selector_bridge_refs=map1_01a_selector_bridge_refs,
        manifest_point_scan=map1_01a_manifest_point_scan,
        root_point_scan=map1_01a_root_point_scan,
        map1_exit_variant_scan=map1_01a_exit_coordinate_variant_scan,
        map1_exit_byte_coordinate_scan=map1_01a_exit_byte_coordinate_scan,
        map1_exit_cns_payload_scan=map1_01a_exit_cns_payload_scan,
        map1_exit_coordinate_context=map1_01a_exit_coordinate_context,
        branch_gate_consistency=save_selector_branch_gate_consistency,
        branch_selector_equation=save_selector_branch_selector_equation,
        writer_chain=save_selector_writer_chain,
        dispatch_stop_context=save_selector_dispatch_stop_context,
        gate_offset_sources=save_selector_gate_offset_sources,
        gate_offset_patterns=save_selector_gate_offset_patterns,
        gate_base_candidates=save_selector_gate_base_candidates,
        gate_base_proof_gap=save_selector_gate_base_proof_gap,
        gate_sample_values=save_selector_gate_sample_values,
        savedata_sample_deltas=savedata_sample_deltas,
        real_savedata_evidence_gap=save_selector_real_savedata_evidence_gap,
        gate_pass_matrix=save_selector_gate_pass_matrix,
        opcode20_object_base_candidates=save_selector_opcode20_object_base_candidates,
        opcode20_order_space=save_selector_opcode20_order_space,
        opcode20_context_f2_sources=save_selector_opcode20_context_f2_sources,
        opcode20_slot_sources=save_selector_opcode20_slot_sources,
        opcode20_slot_descriptor_writers=save_selector_opcode20_slot_descriptor_writers,
        opcode20_descriptor_scripts=save_selector_opcode20_descriptor_scripts,
        opcode20_sample_order_effects=save_selector_opcode20_sample_order_effects,
        opcode20_runtime_materializers=save_selector_opcode20_runtime_materializers,
        opcode20_nested_base_modes=save_selector_opcode20_nested_base_modes,
        secondary_reset_scope=save_selector_secondary_reset_scope,
        secondary_global_reset_gap=save_selector_secondary_global_reset_gap,
        secondary_block_writes=save_selector_secondary_block_writes,
        runtime_selector_byte_writes=save_selector_runtime_selector_byte_writes,
        post_gate_reset_candidates=save_selector_post_gate_reset_candidates,
        merge_gap=save_selector_merge_gap,
        merge_bridge_matrix=save_selector_merge_bridge_matrix,
        selected_pointer_opcode_paths=save_selector_selected_pointer_opcode_paths,
        global_selected_pointer_paths=save_selector_global_selected_pointer_paths,
        selected_pointer_usage=save_selector_selected_pointer_usage,
        selected_root_execution_gap=save_selector_selected_root_execution_gap,
        route_pair_entry_execution_gap=save_selector_route_pair_entry_execution_gap,
        current_writer_paths=save_selector_current_writer_paths,
        opcode08_activation_windows=save_selector_opcode08_activation_windows,
        opcode08_unreadable_producers=save_selector_opcode08_unreadable_producers,
        opcode09_pointer_collisions=save_selector_opcode09_pointer_collisions,
        secondary_route_overlap_candidates=save_selector_secondary_route_overlap_candidates,
        predecessor_state_effect=save_selector_predecessor_state_effect,
        active_flag_effect=save_selector_active_flag_effect,
        active_flag_sources=save_selector_active_flag_sources,
        selection_state=save_selector_selection_state,
        selection_writers=save_selector_selection_writers,
        branch_paths=save_selector_branch_paths,
        stream_traces=save_selector_stream_traces,
        selector_xrefs=save_selector_xrefs,
        predecessor_persistence_gap=save_selector_predecessor_persistence_gap,
        selection_buffer20_provenance=save_selector_selection_buffer20_provenance,
        secondary_fill_roots=save_selector_secondary_fill_roots,
        inherited_state_candidates=save_selector_inherited_state_candidates,
        current_state_sources=save_selector_current_state_sources,
        predecessor_tail_reset=save_selector_predecessor_tail_reset,
        predecessor_branch_state_execution_gap=save_selector_predecessor_branch_state_execution_gap,
        branch_state=save_selector_branch_state,
        branch_state_writers=save_selector_branch_state_writers,
        branch_state_dispatch=save_selector_branch_state_dispatch,
        secondary_state_sources=save_selector_secondary_state_sources,
        branch_state_opcode_overlap=save_selector_branch_state_opcode_overlap,
        event_object_branch_state_stream_candidates=event_object_branch_state_stream_candidates,
        event_object_branch_state_candidate_links=event_object_branch_state_candidate_links,
        event_object_branch_state_block_context=event_object_branch_state_block_context,
        predecessor_route_order=save_selector_predecessor_route_order,
        selector_set_decomposition=save_selector_set_decomposition,
        selector_recomposition_lattice=save_selector_recomposition_lattice,
        address_predecessor_context=save_selector_address_predecessor_context,
        mapset_aliases=save_selector_mapset_aliases,
        target_alias_state_effects=save_selector_target_alias_state_effects,
        target_alias_bridges=save_selector_target_alias_bridges,
        route_root_ref_context=save_selector_route_root_ref_context,
        predecessor_bridge_refs=save_selector_predecessor_bridge_refs,
        reverse_reuse_context=save_selector_reverse_reuse_context,
        merge_execution_gap=save_selector_merge_execution_gap,
        merge_runtime_context=save_selector_merge_runtime_context,
        merge_closure_context=save_selector_merge_closure_context,
        predecessor_fill_execution_order_gap=save_selector_predecessor_fill_execution_order_gap,
        predecessor_fill_opcode10_context=save_selector_predecessor_fill_opcode10_context,
        predecessor_descriptor_bridge_gap=save_selector_predecessor_descriptor_bridge_gap,
        predecessor_fill_site_execution_context=save_selector_predecessor_fill_site_execution_context,
        wrapper_execution_gap=save_selector_wrapper_execution_gap,
        opcode24_globals=save_selector_opcode24_globals,
        opcode24_mode1_source_writes=save_selector_opcode24_mode1_source_writes,
        opcode24_runtime_enabled_block_writes=save_selector_opcode24_runtime_enabled_block_writes,
        opcode24_mode1_runtime_context=save_selector_opcode24_mode1_runtime_context,
        opcode24_mode1_default_effect=save_selector_opcode24_mode1_default_effect,
        opcode24_payload_table=save_selector_opcode24_payload_table,
        opcode24_current_root_modes=save_selector_opcode24_current_root_modes,
        wrapper_descriptor_context=save_selector_wrapper_descriptor_context,
        scene_payload_context=map1_01a_scene_payload_context,
        scene_list_context=save_selector_scene_list_context,
        frontier_reader_branch_context=save_selector_frontier_reader_branch_context,
        frontier_payload_shape_context=save_selector_frontier_payload_shape,
        scene_record_sequence=save_selector_scene_record_sequence,
        scene_adjacency_index=save_selector_scene_adjacency_index,
        leaf_table_context=save_selector_leaf_table_context,
        leaf_index_space=save_selector_leaf_index_space,
        leaf_table_global_context=save_selector_leaf_table_global_context,
        route_pair_descriptor_context=save_selector_route_pair_descriptor_context,
        opcode2c_route_pair_context=save_selector_opcode2c_route_pair_context,
        opcode07_indexed_pointers=save_selector_opcode07_indexed_pointers,
        object61_stream_operands=save_selector_object61_stream_operands,
        context58_consumers=save_selector_context58_consumers,
        current_root_frontier_paths=save_selector_current_root_frontier_paths,
        selection_buffer_bases=save_selector_selection_buffer_bases,
        runtime_trace_execution_probe=json.loads((OUT / "runtime_trace_execution_probe.json").read_text(encoding="utf-8"))
        if (OUT / "runtime_trace_execution_probe.json").exists()
        else None,
        legacy_hwanedit_editor_gap=legacy_hwanedit_editor_gap,
        mobile_browser_smoke=mobile_browser_smoke,
        candidate_movement_browser_smoke=candidate_movement_browser_smoke,
        save_point_candidate_review_summary=candidate_save_point_browser_smoke,
        candidate_status_menu_browser_smoke=candidate_status_menu_browser_smoke,
        candidate_skill_menu_browser_smoke=candidate_skill_menu_browser_smoke,
        candidate_equipment_menu_browser_smoke=candidate_equipment_menu_browser_smoke,
        candidate_shop_menu_browser_smoke=candidate_shop_menu_browser_smoke,
        candidate_party_join_browser_smoke=candidate_party_join_browser_smoke,
        event_object_candidate_review_summary=candidate_event_object_browser_smoke,
        candidate_progress_browser_smoke=candidate_progress_browser_smoke,
        candidate_dialogue_progress_browser_smoke=candidate_dialogue_progress_browser_smoke,
        candidate_route_progress_browser_smoke=candidate_route_progress_browser_smoke,
        candidate_deep_route_browser_smoke=candidate_deep_route_browser_smoke,
        transition_progress_candidate_review_summary=candidate_transition_progress_browser_smoke,
        review_surface_smoke=review_surface_smoke,
        route_guide_smoke=route_guide_smoke,
        runtime_music_cue_smoke=runtime_music_cue_smoke,
        title_menu_sound_smoke=title_menu_sound_smoke,
        title_start_smoke=title_start_smoke,
        runtime_title_start_context=runtime_title_start_context,
    )
    write_completion_audit_outputs(completion_audit, OUT)
    route_blocker_evidence_matrix = build_route_blocker_evidence_matrix(
        route_investigation_queue,
        map1_01a_exit_target_ranking,
        map1_01a_hotspot_gap,
        save_selector_merge_gap,
        save_selector_real_savedata_evidence_gap,
        runtime_trace_feasibility,
        save_selector_selected_pointer_usage,
        completion_audit,
        save_selector_leaf_index_space,
        save_selector_leaf_table_global_context,
        save_selector_opcode2c_route_pair_context,
        save_selector_frontier_reader_branch_context,
        save_selector_frontier_payload_shape,
        map1_01a_event_shape_scan,
        map1_01a_scene_record_cluster_context,
        save_selector_scene_adjacency_index,
        save_selector_current_writer_paths,
        save_selector_selected_root_execution_gap,
        route_pair_entry_execution_gap=save_selector_route_pair_entry_execution_gap,
        predecessor_fill_site_execution_context=save_selector_predecessor_fill_site_execution_context,
        merge_runtime_context=save_selector_merge_runtime_context,
        route_root_ref_context=save_selector_route_root_ref_context,
        runtime_save_path_context=runtime_save_path_context,
        original_collision_route_audit=original_collision_route_audit,
        edge_trigger_gap=map1_01a_edge_trigger_gap,
        tile_hotspot_pattern_contrast=map1_01a_tile_hotspot_pattern_contrast,
        strict_event_tile_signature_scan=map1_01a_strict_event_tile_signature_scan,
        strict_source_hotspot_context=map1_01a_strict_source_hotspot_context,
        wrapper_execution_gap=save_selector_wrapper_execution_gap,
        runtime_patched_selector_followup_context=runtime_patched_selector_followup_context,
    )
    write_route_blocker_evidence_matrix_outputs(route_blocker_evidence_matrix, OUT)
    web_playtest_route = build_web_playtest_route_summary(
        playable_progress,
        route_assist_frontier,
        route_blocker_evidence_matrix,
        real_savedata_gap=save_selector_real_savedata_evidence_gap,
        savedata_sample_deltas=savedata_sample_deltas,
        savedata_slot_scan=json.loads((OUT / "savedata_slot_scan.json").read_text(encoding="utf-8"))
        if (OUT / "savedata_slot_scan.json").exists()
        else {},
        reciprocal_transition_candidates=reciprocal_transition_candidates,
        runtime_title_start_context=runtime_title_start_context,
        strict_event_source_coverage=strict_event_source_coverage,
        strict_source_hotspot_external_review_packet=json.loads(
            (OUT / "strict_source_hotspot_external_review_packet.json").read_text(encoding="utf-8")
        )
        if (OUT / "strict_source_hotspot_external_review_packet.json").exists()
        else {},
        route_promotion_external_proof_handoff=json.loads(
            (OUT / "route_promotion_external_proof_handoff.json").read_text(encoding="utf-8")
        )
        if (OUT / "route_promotion_external_proof_handoff.json").exists()
        else {},
    )
    write_web_playtest_route_outputs(web_playtest_route, OUT)
    print("wrote save-selector frontier and opcode20 proof-gap reports", flush=True)
    (OUT / "map_tileset_candidates.md").write_text(
        summarize_tileset_candidates(map_data, scene_links),
        encoding="utf-8",
    )
    print("wrote map tileset candidate report", flush=True)
    write_tile_class_outputs(tile_classes, OUT)
    print("wrote tile class outputs", flush=True)
    tile_class_coverage = summarize_tile_class_coverage(map_data, tile_classes)
    (OUT / "tile_class_coverage.json").write_text(
        json.dumps(tile_class_coverage, ensure_ascii=False, indent=2) + "\n",
        encoding="utf-8",
    )
    collision_fallback_delta = summarize_collision_fallback_delta(map_data, tile_classes)
    (OUT / "collision_fallback_delta.json").write_text(
        json.dumps(collision_fallback_delta, ensure_ascii=False, separators=(",", ":")) + "\n",
        encoding="utf-8",
    )
    tile_class_gaps = summarize_tile_class_gaps(map_data, tile_classes)
    tile_class_gap_summary = summarize_tile_class_gap_summary(tile_class_gaps)
    (OUT / "tile_class_gaps.json").write_text(
        json.dumps(tile_class_gaps, ensure_ascii=False, indent=2) + "\n",
        encoding="utf-8",
    )
    (OUT / "tile_class_gap_summary.json").write_text(
        json.dumps(tile_class_gap_summary, ensure_ascii=False, indent=2) + "\n",
        encoding="utf-8",
    )
    (OUT / "tile_class_gaps.md").write_text(
        tile_class_gaps_markdown(tile_class_gaps),
        encoding="utf-8",
    )
    tile_pair_class_gaps = summarize_tile_pair_class_gaps(map_data, tile_classes)
    (OUT / "tile_pair_class_gaps.json").write_text(
        json.dumps(tile_pair_class_gaps, ensure_ascii=False, indent=2) + "\n",
        encoding="utf-8",
    )
    (OUT / "tile_pair_class_gaps.md").write_text(
        tile_pair_class_gaps_markdown(tile_pair_class_gaps),
        encoding="utf-8",
    )
    tile_pair_class_gap_dir = OUT / "tile_pair_class_gaps"
    tile_pair_class_gap_index = write_tile_pair_class_gap_pages(tile_pair_class_gaps, tile_pair_class_gap_dir)
    (tile_pair_class_gap_dir / "index.md").write_text(
        tile_pair_class_gap_index_markdown(tile_pair_class_gap_index, tile_pair_class_gap_dir),
        encoding="utf-8",
    )
    print("wrote tile class and pair gap reports", flush=True)
    map_tile_class_gaps = summarize_map_tile_class_gaps(map_data, tile_classes)
    (OUT / "map_tile_class_gaps.json").write_text(
        json.dumps(map_tile_class_gaps, ensure_ascii=False, separators=(",", ":")) + "\n",
        encoding="utf-8",
    )
    compact_map_tile_class_gaps = [
        {
            "map": row["map"],
            "tile": row["tile"],
            "count": row["count"],
            "fallbackKind": row["fallbackKind"],
            "fallbackPass": row["fallbackPass"],
            "fallbackBlock": row["fallbackBlock"],
            "components": row.get("components", [])[:6],
            "pairs": row.get("pairs", [])[:4],
            "sample": row["samples"][0] if row.get("samples") else None,
        }
        for row in map_tile_class_gaps
    ]
    (OUT / "map_tile_class_gap_index.js").write_text(
        "window.HWANSE_MAP_TILE_CLASS_GAP_INDEX = "
        + js_json(compact_map_tile_class_gaps)
        + ";\n",
        encoding="utf-8",
    )
    (OUT / "map_tile_class_gaps.md").write_text(
        map_tile_class_gaps_markdown(map_tile_class_gaps),
        encoding="utf-8",
    )
    map_tile_class_gap_dir = OUT / "map_tile_class_gaps"
    map_tile_class_gap_index = write_map_tile_class_gap_pages(map_tile_class_gaps, map_tile_class_gap_dir)
    (map_tile_class_gap_dir / "index.md").write_text(
        map_tile_class_gap_index_markdown(map_tile_class_gap_index, map_tile_class_gap_dir),
        encoding="utf-8",
    )
    tile_class_gap_galleries = []
    if os.environ.get("HWANSE_WRITE_LEGACY_PNG") == "1":
        tile_class_gap_gallery_dir = OUT / "tile_class_gap_galleries"
        tile_class_gap_galleries = render_tile_class_gap_galleries(tile_class_gaps, tile_class_gap_gallery_dir)
        (OUT / "tile_class_gap_galleries.md").write_text(
            tile_class_gap_gallery_markdown(tile_class_gap_galleries, tile_class_gap_gallery_dir),
            encoding="utf-8",
        )
        tile_usage_dir = OUT / "tile_usage"
        first_layer_tilesets = sorted({
            (info.get("layerTilesets") or [info.get("tileset")])[0]
            for info in map_data.values()
        })
        usage_by_tileset = usage_by_tileset_from_map_data(map_data)
        for tileset_name in first_layer_tilesets:
            render_tileset_usage_gallery(
                tileset_name,
                usage_by_tileset[tileset_name],
                tile_usage_dir / f"{tileset_name}_usage.png",
                80,
            )
    else:
        (OUT / "tile_class_gap_galleries.md").write_text(
            "Legacy PNG tile-class gap galleries are disabled. Use map_review.html and map_occlusion.html for CNS-backed review.\n",
            encoding="utf-8",
        )
    print(f"wrote {len(events)} scene event records -> {OUT / 'scene_events.json'}")
    print(f"wrote {len(battle_backgrounds)} battle background records -> {OUT / 'battle_backgrounds.js'}")
    print(f"wrote {battle_event_candidates.get('candidateCount', 0)} battle event candidate records -> {OUT / 'battle_event_candidates.js'}")
    print(f"wrote {len(event_transitions)} event transition candidates -> {OUT / 'event_transitions.json'}")
    print(f"wrote {len(transition_reviews)} transition reviews -> {OUT / 'transition_reviews.json'}")
    print(f"wrote event transition data -> {OUT / 'event_transitions.json'}")
    print(f"wrote {len(coordinate_candidates)} scene coordinate candidate records -> {OUT / 'scene_coordinate_candidates.json'}")
    print(f"wrote {len(object_assets)} object asset refs -> {OUT / 'object_assets.js'}")
    print(f"indexed {len(enemy_assets)} enemy/object sprite CNS assets for browser CNS rendering")
    print(f"wrote {len(scene_links)} scene link sets -> {OUT / 'scene_links.json'}")
    print(f"wrote {len(map_data)} map tileset candidate summaries -> {OUT / 'map_tileset_candidates.md'}")
    print(f"calculated {len(map_render_review_rows)} map render review coverage rows")
    print(f"wrote tile classes -> {OUT / 'tile_classes.json'}")
    print(f"wrote tile class coverage -> {OUT / 'tile_class_coverage.json'}")
    print(f"wrote collision fallback delta -> {OUT / 'collision_fallback_delta.json'}")
    print(f"wrote tile class gaps -> {OUT / 'tile_class_gaps.md'}")
    print(f"wrote tile pair class gaps -> {OUT / 'tile_pair_class_gaps.md'}")
    print(f"wrote {len(tile_pair_class_gap_index)} tile pair class gap pages -> {tile_pair_class_gap_dir}")
    print(f"wrote map tile class gaps -> {OUT / 'map_tile_class_gaps.md'}")
    print(f"wrote {len(map_tile_class_gap_index)} map tile class gap pages -> {map_tile_class_gap_dir}")
    print(f"wrote {len(tile_class_gap_galleries)} tile class gap galleries -> {OUT / 'tile_class_gap_galleries.md'}")
    if args.keep_review_previews:
        print("kept optional review preview/detail directories")
    else:
        removed = prune_optional_review_outputs(OUT)
        if removed:
            print(f"pruned optional review preview/detail directories: {', '.join(removed)}")


if __name__ == "__main__":
    main()
