
    QNj                       d Z ddlmZ ddlZddlZddlZddlmZ ddlm	Z	 ddl
Z
 ee      j                         j                  d   Zedz  Zedz  Zed	z  Zg d
Zg dZg dZg dZg dZg dZd*dZd*dZd+dZd,dZd,dZd,dZd,dZd,dZd,dZ d,dZ!d,dZ"d,dZ#d-dZ$d.dZ%d/dZ&d,dZ'd,d Z(d,d!Z)d,d"Z*d,d#Z+d,d$Z,d,d%Z-d,d&Z.d,d'Z/d0d(Z0e1d)k(  r e2 e0             y)1zVerify the trimmed active web/data surface.

This verifier intentionally checks only current entry points and compact
handoff artifacts. Legacy per-step audit pages are no longer part of the
active surface.
    )annotationsN)Path)urlparse   weboutdocs)T
index.htmlz	game.htmlzmovement_test.htmlzmap_gallery.htmlmap_review.htmlzmap_occlusion.htmlcns_rect_review.htmlzui_window_review.htmlbattle_analysis.htmlbattle_formula_calculator.htmlzbattle_end_reward_review.html!battle_skill_timeline_review.htmlz)battle_skill_complete_pattern_review.htmlz#battle_rs_skill_runtime_review.htmlz+battle_effect_animation_pattern_review.htmlbattle_simulator.html"field_encounter_static_review.htmlz'field_rng_selector_opcode1c_review.htmlz)field_step_encounter_boundary_review.htmlz0field_active_object_trigger_boundary_review.htmlz*field_battle_resource_boundary_review.html.field_encounter_formation_boundary_review.html,field_encounter_formation_stream_review.htmlz4field_encounter_formation_opcode_cluster_review.htmlz-field_encounter_formation_context_review.htmlz battle_effect_visual_review.htmlzmonster_stats.htmlzmonster_review.htmlzaudio_review.htmlzmidi_bgm_test.htmlz item_equipment_skill_static.htmlz skill_equipment_gate_review.htmlz'item_inventory_state_layout_review.htmlzui_grid_review.htmlzdialogue_review.htmldialogue_prompt_player.htmlz'dialogue_template_text_face_review.htmlz'dialogue_face_slot_selector_review.htmlz&dialogue_face_selector_gap_review.htmlzcompletion_review.htmlzevent_review.htmlzformat_review.html!render_pipeline_model_review.html#surface_wrapper_catalog_review.html draw_flags_color_key_review.htmlpalette_pipeline_review.html'non_palette_motion_producer_review.htmlzscene_event_vm_review.htmlz-scene_event_vm_command_stream_candidates.htmlz*scene_event_vm_execution_route_review.htmlz,scene_event_coordinate_semantics_review.htmlz-scene_event_conditional_map_route_review.htmlz&scene_event_vm_branch_flag_review.htmlz-scene_event_global_flag_candidate_review.htmlz+scene_event_text_consumer_trace_review.htmlz*scene_event_vm_prompt_sequence_review.htmlz(scene_event_vm_choice_target_review.htmlz&scene_event_vm_random_gate_review.htmlz-selected_scene_text_root_consumer_review.html.selected_root_live_writer_frontier_review.html'selected_root_opcode_matrix_review.html)save_selector_dispatch_table_context.html/generic_vm_stream_producer_frontier_review.htmlz*scene_seq_resource_record_link_review.htmlz#selector_root_structure_review.htmlz*resource_loader_consumer_trace_review.html)scene_event_runtime_evidence_handoff.html&global_mode_state_frontier_review.htmlzinput_handler_review.htmlmenu_review.html$hud_menu_opener_frontier_review.html+hud_menu_selected_root_frontier_review.html*hud_menu_mode_state_dispatcher_review.html"runtime_trace_hud_open_review.html%hud_runtime_static_bridge_review.html&hud_runtime_surface_handle_review.htmlintro_runtime_fade_review.htmlz intro_battle_runtime_review.htmlz*intro_battle_helper_dictionary_review.htmlz'menu_cancel_window_consumer_review.htmlz#map3_active_initializer_review.htmlzmap_extra_consumer_review.htmlresource_reference_review.htmlzhud/index.html):zmaps_runtime.jszmaps.jszcns_rect_review_data.jsonzcns_rect_review_data.jszscene_manifest.jsonzscene_events.jsonzevent_dialogue_blocks.jsonzstory_prompts.jsonztext_tables.jsz#static_analysis_remaining_work.json)scene_event_runtime_evidence_handoff.jsonz%scene_event_vm_opcode_dictionary.jsonz-scene_event_vm_command_stream_candidates.jsonz*scene_event_vm_execution_route_review.jsonz*scene_event_vm_prompt_sequence_review.jsonz(scene_event_vm_choice_target_review.jsonz&scene_event_vm_random_gate_review.jsonz-selected_scene_text_root_consumer_review.jsonz.selected_root_live_writer_frontier_review.jsonz'selected_root_opcode_matrix_review.jsonz)save_selector_dispatch_table_context.jsonz/generic_vm_stream_producer_frontier_review.jsonz&global_mode_state_frontier_review.jsonzbattle_end_reward_review.json$battle_skill_timeline_canonical.jsonz"battle_skill_timeline_canonical.jsz#battle_rs_skill_runtime_review.json(battle_effect_runner_binding_review.jsonz(battle_effect_runner_binding_review.html*battle_effect_visual_assertion_review.json*battle_effect_visual_assertion_review.html$battle_effect_pixel_oracle_plan.json$battle_effect_capture_checklist.json'battle_effect_pixel_compare_report.jsonz$candidate_browser_smoke_summary.jsonz$candidate_browser_smoke_summary.htmlz"menu_candidate_review_summary.jsonz"menu_candidate_review_summary.htmlz$hud_menu_opener_frontier_review.jsonz+hud_menu_selected_root_frontier_review.jsonz*hud_menu_mode_state_dispatcher_review.jsonz"runtime_trace_hud_open_review.jsonz%hud_runtime_static_bridge_review.jsonz&hud_runtime_surface_handle_review.jsonzintro_runtime_fade_review.jsonz intro_battle_runtime_review.jsonz*intro_battle_helper_dictionary_review.jsonz(completion_candidate_review_summary.jsonz(completion_candidate_review_summary.htmlz&movement_candidate_review_summary.jsonz&movement_candidate_review_summary.htmlz&dialogue_candidate_review_summary.jsonz&dialogue_candidate_review_summary.html!render_pipeline_model_review.json#surface_wrapper_catalog_review.json draw_flags_color_key_review.jsonpalette_pipeline_review.json'non_palette_motion_producer_review.json)zSCENE_EVENT_VM_GOAL.mdzSCENE_EVENT_VM_REFERENCE.mdzLEGACY_CLEANUP_GOAL.mdzBATTLE_SKILL_TIMELINE_GOAL.md)zengine/audio/midi_bgm_player.jszengine/audio/midi_soundfont.jsz&engine/audio/midi_soundfont_storage.jsz(engine/audio/midi_spessasynth_adapter.jszengine/battle/animation.jszengine/cns/renderer.jszengine/field/runtime.js)zweb/cns_renderer.jszweb/field_runtime.jszweb/midi_bgm_player.jszweb/midi_soundfont.jszweb/midi_soundfont_storage.jszweb/midi_spessasynth_adapter.jsz../web/cns_renderer.jsz../web/field_runtime.jsz../web/midi_bgm_player.jsz../web/midi_soundfont.jsz ../web/midi_soundfont_storage.jsz"../web/midi_spessasynth_adapter.jsengine/cns_renderer.jsengine/field_runtime.jsengine/battle_animation.js)	zcns_renderer.jszfield_runtime.jszmidi_bgm_player.jszmidi_soundfont.jszmidi_soundfont_storage.jszmidi_spessasynth_adapter.jsr6   r7   r8   c                &    | j                  d      S )Nutf-8encoding	read_textpaths    tools/verify_web_assets.pyreadrB      s    >>7>++    c                (    | j                  dd      S )Nr:   replace)r<   errorsr=   r?   s    rA   read_lenientrG      s    >>79>==rC   c                    | st        |      y N)AssertionError)	conditionmessages     rA   requirerM      s    W%% rC   c                 |   t         D ]&  } t        t        | z  j                         d|         ( t        D ]&  } t        t
        | z  j                         d|         ( t        D ]&  } t        t        | z  j                         d|         ( t        D ]&  } t        t        | z  j                         d|         ( y )Nzmissing active web page: web/zmissing active out file: out/zmissing doc: docs/zmissing engine module: web/)	ACTIVE_WEB_PAGESrM   WEBexistsACTIVE_OUT_FILESOUTREQUIRED_DOCSDOCSENGINE_MODULES)rels    rA   assert_existsrX      s     Ms""$(EcU&KLM Ms""$(EcU&KLM C##%);C5'ABC Ks""$(CC5&IJKrC   c            	     N   t        j                  t        t        dz              } t	        | j                  d      dk(  d       | j                  dg       }t	        t        |      dk(  d       |D ch c]+  }t        |j                  dd	            j                         - }}t	        h d
|k  d       | j                  di       }t	        |j                  d      du d       t	        |j                  d      du d       t        t        dz        }t	        d|v d       y c c}w )Nr)   completionDecisiondo-not-call-update-goalz*handoff must keep goal incomplete decisionwatchpoints   z,handoff should keep five runtime watchpointsvaHex >   
0x004576da
0x004576db
0x004576e8
0x004576e9
0x0059de30z!handoff watchpoint VA set changedfrontierSummarystaticFrontierSaturatedTz'static frontier should remain saturatedrouteSpecificProducerPromotedFz0route-specific producer should remain unpromotedr   1HWANSE_SCENE_EVENT_RUNTIME_EVIDENCE_HANDOFF_READYzhandoff web marker missing)
jsonloadsrB   rS   rM   getlenstrlowerrP   )datar\   itemvasfrontierhtmls         rA   assert_handoffrt      s   ::d3!LLMNDDHH)*.GGIuv((="-KC!#QR:E
F$3txx$%++-
FC
FRVYY[~xx)2.HHLL23t;=fgHLL89UBDvwAABD?4GIef Gs   20D"c            	     T   t        j                  t        t        dz              } | j	                  di       }t        | j	                  d      dk(  d       t        |j	                  d      dk(  d       t        |j	                  d	      d
k(  d       t        |j	                  d      dk(  d       | j	                  d      xs g }i }|D cg c],  }|j	                  d      dk(  s|j	                  d      dk(  r|. }}t        t        |      t        |      k(  dt        |              |D ]  }t        |j	                  d      xs d      t        |j	                  d      xs d      j                         f}t        ||v d|        t        |j	                  d      ||   k(  d|         t        |j	                  dd      dk\  d       t        |j	                  dd      d k\  d!       t        |j	                  d"d#      dk(  d$       t        |j	                  d%i       j	                  d&d      d k\  d'       t        t        d( |D              d)       | j	                  d*      xs g }t        t        d+ |D              d,       ||z   }t        t        d- |D              d.       t        t        d/ |D               d0       d1D ]\  }	t        t        |	z        }
t        d|
v d2|	 d3       t        d4|
vd2|	 d5       t        d6|
vd2|	 d7       t        d8|
vd2|	 d9       ^ d:t        t        d;z  d<z        d=}t        t        d;z  d<z  j                  d>?      |        |d@           t        j                  t        t        dAz              }t        |j	                  d      dBk(  dC       t        |j	                  dDd      dEk\  dF       t        |j	                  dGd      dEk\  dH       t        |j	                  dId      dJk\  dK       t        |j	                  dL      xs g       }dMD ]  }t        ||v dN|         |j	                  dO      xs g D ch c]\  }t        |j	                  d      xs d      t        |j	                  d      xs d      j                         |j	                  dP      f^ }}dQD ]  }t        ||v dR|         |j	                  dS      xs g D ch c]}  }t!        |j	                  dT      xs d      dkD  rZt        |j	                  d      xs d      t        |j	                  d      xs d      j                         |j	                  dP      f }}|j	                  dS      xs g D ]  }t!        |j	                  dT      xs d      dkD  s&|j	                  dU      xs i }t        t!        |j	                  dV      xs d      dkD  dW|        |j	                  dX      xs i }|j	                  dY      xs i }t        t!        |j	                  dZ      xs d      dkD  d[|        t        t!        |j	                  dV      xs d      dkD  d\|        t        t!        |j	                  d]      xs d      dkD  d^|         d_D ]  }t        ||v d`|         |j	                  da      xs g D ]@  }|j	                  db      xs i }t        |dc|        t!        |j	                  dT      xs d      dkD  sJ|j	                  dU      xs i }t        t!        |j	                  dV      xs d      dkD  dd|        |j	                  dX      xs i }|j	                  dY      xs i }t        t!        |j	                  dZ      xs d      dkD  de|        t        t!        |j	                  dV      xs d      dkD  df|        t        t!        |j	                  d]      xs d      dkD  dg|        C y c c}w c c}w c c}w )hNr*   summarykindz&hwanse-battle-skill-timeline-canonicalzbattle canonical kind changed
playerRows   z3battle canonical should keep 156 player action rowsmonsterRowsi&  z4battle canonical should keep 294 monster action rows	totalRowsi  z2battle canonical should keep 450 total action rowsplayerActionsalignmentClassunconfirmedstatuszneeds-reviewz9battle canonical has unexpected unconfirmed active rows: ownerKeyr_   
skillIdHexz#unexpected unconfirmed battle row: visualAlignmentStatusz.unexpected unconfirmed reason for battle row: rowsWithFramesr   i  z)battle canonical frame coverage regressedrowsWithWlkCallsi  z'battle canonical WLK coverage regressedwlkEvidenceUnresolvedRowsr   z1battle canonical has unresolved WLK evidence rowswlkEvidenceStatusCountszdirect-display-wlkz.battle canonical direct WLK evidence regressedc              3  >   K   | ]  }|j                  d         yw)timelineNrk   .0rows     rA   	<genexpr>z9assert_battle_skill_timeline_canonical.<locals>.<genexpr>$  s     ;
#;   z5player canonical rows must carry engine timeline datamonsterActionsc              3  >   K   | ]  }|j                  d         yw)timelineSummaryNr   r   s     rA   r   z9assert_battle_skill_timeline_canonical.<locals>.<genexpr>&  s     Cs)*Cr   z<monster canonical rows must carry display timeline summariesc              3  >   K   | ]  }|j                  d         yw)wlkEvidenceStatusNr   r   s     rA   r   z9assert_battle_skill_timeline_canonical.<locals>.<genexpr>(  s     A+,Ar   z7battle canonical rows must classify WLK evidence statusc              3  >   K   | ]  }|j                  d         yw)wlkEvidenceUnresolvedNr   r   s     rA   r   z9assert_battle_skill_timeline_canonical.<locals>.<genexpr>)  s     ICGG34Ir   z1battle canonical includes unresolved WLK evidence)r   r   r   zweb/z  must load battle canonical datazlegacy synthetic dust fallbackz- still exposes legacy synthetic dust fallbackzbattle_frame_gate_review.jsonz2 still loads old player frame gate review directlyz(battle_action_event_timeline_review.jsonz0 still loads old player timeline review directly__verify_web_assets__toolsz+verify_battle_skill_playback_regressions.py)__name____file__r:   r;   mainz(battle_skill_timeline_browser_smoke.jsonokz-battle skill browser timeline smoke must passcheckedRows   z-battle skill browser smoke coverage regressedcheckedEffectRowsz4battle skill browser effect smoke coverage regressedcheckedExecutionRequirementRows4   z=battle skill browser execution-requirement coverage regressed"checkedExecutionRequirementBuckets   child motion loop presentrandom placement/range present-palette transform effect; no CNS frame stream/runner must instantiate child objects over timez@battle skill browser smoke missing execution-requirement bucket checkslevelOrFixed>   ataho0x2fr   r   0x32   rinshan0x05Nr   0x06Nr   0x09r   r   0x0cr   z2battle skill browser smoke missing regression row effectCheckseffectFrameCounteffectCanvasStatsnonEmptyCanvasCountz%effect smoke row has blank canvases: previewRenderpreviewCanvasStatsactiveEffectCountz0effect smoke row has no active preview effects: z+effect smoke row has blank preview canvas: coloredCanvasCountz0effect smoke row has no colored preview pixels: >   r   0x0dr   r   0x11r   r   0x15r   r   0x19r   r   0x10r   r   0x18r   z.battle skill browser smoke missing effect row executionRequirementCheckseffectDiagnosticsz/execution requirement row missing diagnostics: z5execution requirement row has blank effect canvases: z9execution requirement row has no active preview effects: z4execution requirement row has blank preview canvas: z9execution requirement row has no colored preview pixels: )ri   rj   rB   rS   rk   rM   rl   rm   rn   allanyrP   ROOTexecr>   setint)ro   rv   player_rowsallowed_unconfirmedr   unconfirmed_rowsrow_keymonster_rowsall_rowsrW   rs   regression_namespacebrowser_smokerequirement_bucketsrequiredcheckedeffect_checkedstatspreviewpreview_statsdiagnosticss                        rA   &assert_battle_skill_timeline_canonicalr     s   ::d3!GGHIDhhy"%GDHHV HHJijGKK%,.cdGKK&#-/efGKK$+-ab((?+1rK"77#$59Jn9\ 	  %8!99
CCHXDYCZ[   
swwz*0b13sww|7L7RPR3S3Y3Y3[\..2UV]U^0_`GG+,0CG0LL<WIF	

 GKK(!,35`aGKK*A.#57`aGKK3Q71<>qrGKK126::;OQRSWZZ  ]M  NC;{;;=tu88,-3LCClCC  FD  E\)HCAAAC|}IIIIK~ 	F
 C#I6$>$seKk@lm0<SEIv>wx/t;tC5Hz={|:$F$se  TD  IE  	F	F ,w)VVW 		G	GRR\cRd ! "JJtC*T$TUVMMh'4/1`aMmQ/146efM115:<rs;Q?2EG m//0TU[Y[\ @ 	//3st|s}1~@ !$$X.4" 
SWWZ &B	'SWW\-B-Hb)I)O)O)QSVSZSZ[iSjkG  f 	G#'YZbYc%def !$$^4:sww)*/a014 
SWWZ &B	'SWW\-B-Hb)I)O)O)QSVSZSZ[iSjkN 
   06B Esww)*/a014GG/06BEC		"78=A>BFklokpDqrggo.4"GGG$89?RMC$78=A>BFvwzv{D|}C))*?@EAFJNyz}y~L  AC))*>?D1EIM}  B  ~C  LD  EE i 	N*.\]e\f,ghi   !=>D" 
Ngg128bNseTUsww)*/a014GG/06BEC		"78=A>BF{|  |A  EB  Cggo.4"GGG$89?RMC$78=A>BF  AD  @E  EF  GC))*?@EAFJ  OC  DG  CH  MI  JC))*>?D1EI  NG  HK  GL  LM  N
NCzs   1`A!` 0B`%c                    t        j                  t        t        dz              } | j	                  di       }t        | j	                  d      dk(  d       t        | j	                  d      dk(  d       t        |j	                  d	      d
k(  d       t        |j	                  d      dk(  d       t        |j	                  d      dk(  d       t        |j	                  d      dk(  d       t        |j	                  d      |j	                  d      k(  d       t        |j	                  d      |j	                  d      k(  d       t        |j	                  d      dk(  d       t        |j	                  d      dk(  d       t        |j	                  d       dk(  d!       | j	                  d"      xs g D ci c]  }|j	                  d#      | }}d$D ]  }t        ||v d%|         y c c}w )&Nr+   rv   rw   z*hwanse-battle-effect-runner-binding-reviewz)battle effect runner binding kind changedr   zrunner-binding-reviewedz+battle effect runner binding status changedeffectSkillRowsry   z7battle effect runner should cover 156 player skill rowsskillsWithEffectFrames\   z%battle effect frame row count changedskillsWithReviewFlagsr   z%battle effect runner has review flagsskillsWithExecutionRequirementsr   z1battle effect execution requirement count changedengineChecksPassedengineChecksTotalz*battle effect engine binding checks failedpageChecksPassedpageChecksTotalz(battle effect page binding checks failedpagesUsingPlaybackEffectFrames   z;all three battle pages should consume playback.effectFramespagesRenderingHelperEffectLayerz9all three battle pages should render helper effect layers!pagesWithGenericResultEffectsOnlyz5battle pages regressed to generic result effects onlyrequirementsrequirementr   z*battle effect requirement bucket missing: ri   rj   rB   rS   rk   rM   )ro   rv   r   r   r   s        rA   #assert_battle_effect_runner_bindingr     s   ::d3!KKLMDhhy"%GDHHV LLNyzDHHX";;=jkGKK)*c13lmGKK01R79`aGKK/0A57^_GKK9:b@BuvGKK,-=P1QQS  AGKK*+w{{;L/MMOyzGKK89Q>@}~GKK9:a?A|}GKK;<ACz{;?88N;S;YWYZCCGGM*C/ZLZ i 	|+/YZeYf-ghi [s   7G+c                    t        j                  t        t        dz              } | j	                  di       }t        | j	                  d      dk(  d       t        | j	                  d      dk(  d       t        |j	                  d	      d
k(  d       t        |j	                  d      dk(  d       t        |j	                  d      dk(  d       t        |j	                  d      dk(  d       t        |j	                  d      dk(  d       t        |j	                  d      d
k(  d       t        |j	                  d      dk(  d       t        |j	                  d      d
k(  d       t        |j	                  d      d
k(  d       t        |j	                  d       d!k(  d"       t        |j	                  d#      d
k(  d$       t        |j	                  d%      d&k(  d'       t        |j	                  d(      d)k(  d*       t        |j	                  d+      d,k(  d-       t        |j	                  d.      d/k(  d0       t        |j	                  d1      dk(  d2       t        |j	                  d3      d!k(  d4       t        |j	                  d5      d6k(  d7       t        |j	                  d8      d9k(  d:       t        |j	                  d;      dk(  d<       t        |j	                  d=      d/k(  d>       t        |j	                  d?      d
k(  d@       t        |j	                  dA      dBk(  dC       | j	                  dD      xs g D ci c]  }|j	                  dE      | }}dFD ]E  }|j	                  |      }t        |d udG|        t        |j	                  d      dHk(  dI|        G | j	                  dJ      xs g D ci c]  }|j	                  dK      | }}dLD ]E  }|j	                  |      }t        |d udM|        t        |j	                  d      dHk(  dN|        G t        t        dOz        }t        dP|v dQ       y c c}w c c}w )RNr,   rv   rw   z,hwanse-battle-effect-visual-assertion-reviewz+battle effect visual assertion kind changedr   visual-assertions-passz/battle effect visual assertions are not passingrequirementRowsr   zBbattle visual assertion should cover 52 execution requirement rowsrepresentativeEffectRows   z7battle visual assertion representative coverage changedrequirementGroupsr   z7battle visual assertion requirement group count changedeffectClassGroupsr   z8battle visual assertion effect class group count changedfailedGroupsr   z)battle visual assertion has failed groups!requirementRowsWithColoredPreviewz:battle visual assertion colored preview coverage regressed$representativeRowsWithColoredPreviewzAbattle visual assertion representative preview coverage regressedrowsWithEffectFramesz7battle visual assertion effect frame coverage regressedrowsWithTransformDiagnosticsz@battle visual assertion transform diagnostics coverage regressedrowsWithMotionDiagnostics    z;battle visual assertion motion diagnostics coverage changedrowsWithSpawnOverTimez:battle visual assertion spawn-over-time coverage regressedrowsWithLoopPreview   z5battle visual assertion loop preview coverage changedrowsWithNestedVisual   z6battle visual assertion nested visual coverage changedrowsWithSparkleMultiSprite   z=battle visual assertion sparkle multi-sprite coverage changedrowsWithPaletteRequirementr   z<battle visual assertion palette requirement coverage changedrowsWithHiddenCandidatesz9battle visual assertion hidden candidate coverage changed!motionModel_explicit_motion_deltaz>battle visual assertion explicit motion model coverage changed)motionModel_loop_counter_placement_stream	   zEbattle visual assertion loop/counter placement model coverage changedmotionModel_sparkle_streamr   z=battle visual assertion sparkle stream model coverage changed#motionModel_direct_placement_streamz?battle visual assertion direct placement model coverage changed$motionModel_palette_only_frameScriptzBbattle visual assertion palette-only motion model coverage changedmotionModelClassifiedRowszFbattle visual assertion motion model classification coverage regressedpixelOracleStatus!not-original-runtime-pixel-oraclezDbattle visual assertion must not claim original runtime pixel oraclerequirementAssertionsr   r   z-battle visual assertion requirement missing: passz,battle visual assertion requirement failed: effectClassAssertionseffectAnimationClass>   init-frame-effectframeScript-effectspawn-stream-effectz'battle visual assertion class missing: z&battle visual assertion class failed: r-   z%Battle Effect Visual Assertion Reviewz5battle effect visual assertion out page missing titler   )ro   rv   r   r   r   classes
class_namers   s           rA   &assert_battle_effect_visual_assertionsr     s?   ::d3!MMNODhhy"%GDHHV NNP}~DHHX"::<mnGKK)*b02vwGKK23r9;tuGKK+,13lmGKK+,13mnGKK'1,.YZGKK;<B  EA  BGKK>?2E  HK  LGKK./257pqGKK672=  @B  CGKK34:<yzGKK/0B68tuGKK-."46mnGKK./257opGKK45;=|}GKK45:<z{GKK23q8:uvGKK;<B  EE  FGKKCDI  LS  TGKK45:<{|GKK=>!C  FG  HGKK>?1D  GK  LGKK34:  =E  FGKK+,0SS  V\  ];?88D[;\;b`bcCCGGM*C/cLc k {+4#PQ\P]!^_!V+/[\g[h-ijk @DxxH_?`?fdfgsww-.3gGgX d
kk*%4#J:,!WX!V+/UV`Ua-bcd BBCD3t;=tu! d hs   =P?9Qc                    t        j                  t        t        dz              } | j	                  di       }t        | j	                  d      dk(  d       t        | j	                  d      dk(  d       t        |j	                  d	      d
k(  d       t        |j	                  d      dk(  d       t        |j	                  d      dk\  d       t        |j	                  d      dk(  d       | j	                  d      xs g }|D ch c]  }|j	                  d      xs g D ]  }|   }}}dD ]  }t        ||v d|         y c c}}w )Nr.   rv   rw   z&hwanse-battle-effect-pixel-oracle-planz,battle effect pixel oracle plan kind changedr   zcapture-oracle-not-builtzMbattle effect pixel oracle plan must remain a handoff, not a completed oraclewebVisualAssertionStatusr   zEbattle pixel oracle plan should consume passing web visual assertionsrequiredFullOracleRowsr   z2battle pixel oracle full capture row count changedrecommendedFirstPassRows   z1battle pixel oracle first-pass plan lost coveragerZ   r[   z7battle pixel oracle plan must not close the active goalcoverageTokens>   class:init-frame-effectclass:frameScript-effectclass:spawn-stream-effect%requirement:child motion loop present*requirement:random placement/range present9requirement:palette transform effect; no CNS frame stream;requirement:runner must instantiate child objects over timez<battle pixel oracle first-pass plan missing coverage token: r   )ro   rv   rowsr   tokentokenss         rA   &assert_battle_effect_pixel_oracle_planr1    sR   ::d3!GGHIDhhy"%GDHHV HHJxyDHHX"<<  ?N  OGKK237OO  RY  ZGKK01R79mnGKK23q8:mnGKK,-1JJ  MF  G88./52D#Q9I1J1PbQeQeQFQ 	i 	#_`e_f!gh	i Rs   #Ec                 2   t        j                  t        t        dz              } | j	                  di       }t        | j	                  d      dk(  d       t        | j	                  d      dv d       t        |j	                  d	      d
k(  d       t        |j	                  d      dk(  d       t        |j	                  d      dk(  d       t        |j	                  d      dk(  d       |j	                  d      du r<t        |j	                  d      dk(  d       t        |j	                  d      dk(  d       | j	                  d      xs i }t        |j	                  d      dk(  d       t        t        |j	                  d      xs g       dk(  d        y )!Nr/   rv   rw   z&hwanse-battle-effect-capture-checklistz,battle effect capture checklist kind changedr   >   ready-for-first-pass-comparewaiting-for-capturesz.battle effect capture checklist status changedmanifestPathz(data/battle_effect_capture_manifest.jsonz$battle capture manifest path changedfirstPassRowsr%  z5battle capture checklist first-pass row count changedfullOracleRowsr   z6battle capture checklist full oracle row count changedrZ   r[   z7battle capture checklist must not close the active goalmanifestExistsFfirstPassReadyr   z7absent manifest should not report ready first-pass rowsfirstPassMissingz9absent manifest should report all first-pass rows missingcaptureManifestTemplatez%hwanse-battle-effect-capture-manifestz-battle capture manifest template kind changedcaptureszEbattle capture manifest template should include 8 first-pass captures)ri   rj   rB   rS   rk   rM   rl   )ro   rv   templates      rA   &assert_battle_effect_capture_checklistr>    sl   ::d3!GGHIDhhy"%GDHHV HHJxyDHHX"ZZ  ]M  NGKK'+UUW}~GKK(A-/fgGKK()R/1ijGKK,-1JJ  MF  G{{#$-,-24mn./146qrxx128bHHLL $KKM|}CZ(.B/146}~rC   c                    t        j                  t        t        dz              } | j	                  di       }t        | j	                  d      dk(  d       t        | j	                  d      dv d       t        |j	                  d	      d
k(  d       t        |j	                  d      dk(  d       |j	                  d      du rZt        |j	                  d      dk(  d       t        |j	                  d      dk(  d       t        |j	                  d      dk(  d       | j	                  d      dk(  rt        |j	                  d      dk(  d       y t        |j	                  d      dk(  d       y )Nr0   rv   rw   z)hwanse-battle-effect-pixel-compare-reportz(battle pixel compare report kind changedr   >   first-pass-incomplete!first-pass-passed-full-incompletefull-oracle-passedr4  z*battle pixel compare report status changedfirstPassRowsExpectedr%  z6battle pixel compare first-pass expected count changedfullRowsExpectedr   z0battle pixel compare full expected count changedr8  FrZ   r[   z+absent capture manifest must not close goalfirstPassRowsComparedr   z:absent capture manifest should not compare first-pass rowsfullRowsComparedz4absent capture manifest should not compare full rowsrB  zeligible-for-update-goalz7full pixel oracle pass should be eligible to close goalz,incomplete pixel compare must not close goalr   )ro   rv   s     rA   )assert_battle_effect_pixel_compare_reportrG    sP   ::d3!JJKLDhhy"%GDHHV KKMwxDHHX  #O  O  Q}  ~GKK/0A57opGKK*+r13ef{{#$-015NNP}~349;wx./146lmxx11015OO  RK  	L015NNP~rC   c                    t        j                         } t        | j                  d      dk(  d       | j                  d      xs g D ci c]#  }|j                  d      |j                  d      % }}t        |j                  d      dk(  d       t        |j                  d      d	k(  d
       t        |j                  d      dk(  d       y c c}w )Nr   r   z+battle pixel compare self-test did not passr   idr  z/battle pixel compare self-test pass case faileddiffdiffersz/battle pixel compare self-test diff case failedzframe-count-mismatchz3battle pixel compare self-test mismatch case failed)+verify_battle_effect_pixel_compare_selftestrun_selftestrM   rk   )reportr   statusess      rA   +assert_battle_effect_pixel_compare_selftestrP    s    8EEGFFJJx D(*WX<BJJx<P<VTVWSswwx00WHWHLL F*,]^HLL I-/`aHLL/04JJ  MB  C Xs   
(Cc                l   g }dD ]  }t        j                  | d|       D ]x  }t        |      }|j                  s"|j	                  d      s|j	                  d      r=d|v rB|j                  |j                  dd      d   j                  dd      d          z  |D cg c]  }|s|	 c}S c c}w )	N)hrefsrcz=[\"']([^\"']+)[\"']#zmailto:z${r   r   ?)refindallr   scheme
startswithappendsplit)rs   targetsattrvalueparsedtargets         rA   local_targets_from_htmlra    s    G DZZD6)= >E 	DEe_F}} 0 0 59I9I)9Tu}NN5;;sA.q177Q?BC	DD ")3vFF333s   "B1*B1c                 L    t        d t        j                  d      D              S )Nc              3  b   K   | ]'  }|j                  t              j                          ) y wrI   )relative_torP   as_posixr   r@   s     rA   r   z!web_html_pages.<locals>.<genexpr>  s$     St$""3'002Ss   -/z*.html)sortedrP   rglob rC   rA   web_html_pagesrj    s    Ssyy?RSSSrC   c                    t         | z  }|j                  |z  j                         }	 |j                  t               |S # t
        $ r Y y w xY wrI   )rP   parentresolverd  r   
ValueError)
source_relr`  source_pathresolveds       rA   resolve_local_targetrr    sS    
"K""V+446HT" O  s   ? 	A
Ac                     t        t        dz        } dD ]  }t        d| d| v d|         g d}|D ]  }t        || vd|         y )Nr
   )"zgame.html?game=1zprogress.htmlr   r(   r    zhud_menu_preview.htmlr!   r"   r#   r$   r%   r&   r'   r   r   r   r   r   z!menu_descriptor_stack_review.htmlr   r   r   r   r   r   r   r   r   r   r   z-field_encounter_producer_boundary_review.htmlz#static_analysis_remaining_work.htmlr   r   zhref=""zindex should link )z_audit.htmlz,scene_event_prompt_producer_goal_review.htmlz&scene_event_goal_completion_audit.htmlz:scene_event_producer_static_frontier_saturation_audit.htmlz%index still exposes legacy fragment: )rB   rP   rM   )indexrW   forbidden_fragmentsfragments       rA   assert_index_linksrx     sz    |#$E# $FH 	&Q5(,>se*DEI$FJ ( [%)Nxj'YZ[rC   c            	        t               } t        |       }| D ci c]  }|t                }}| D ]  }t        t        |z        }t	        |      D ]`  }|j                  d      st        ||      }|$	 |j                  t              j                         }||v sM||   j                  |       b  dh}d}	|	rLd}	t        |      D ]9  }|j                  |t                     D ]  }||vs|j                  |       d}	 ; |	rLt        ||z
        }
t        |
 ddj                  |
d d               y c c}w # t        $ r Y w xY w)Nz.htmlr
   TFz)web html pages not reachable from index: z,    )rj  r   rB   rP   ra  endswithrr  rd  re  rn  addlistrk   rg  rM   join)pagespage_setrW   linksrs   r`  rq  
target_rel	reachablechangedmissings              rA   $assert_web_html_reachable_from_indexr  Q  sk   E5zH#()CS#%Z)E) +C#I-d3 	+F??7++C8H%11#6??A
 X%c
z*	++ IG
	? 	#C#iiSU3 #
Y.MM*-"G#	#  X	)*GKDTYYwWZXZ|E\D]^_7 *  s   D95#D>>	E
	E
c            	         t               D ]U  } t        | z  }t        |      }t        |      D ]1  }t	        | |      }|t        |j                         d|  d|        3 W y )Nzbroken link in web/z: )rj  rP   rB   ra  rr  rM   rQ   )rW   r@   rs   r`  rq  s        rA   assert_no_broken_web_html_linksr  r  sr     NSyDz-d3 	NF+C8HHOO%)<SEF8'LM		NNrC   c                    t         D ]'  } t        t        | z  j                          d|         ) t        D  cg c]  } t        | z   }} |j                  d t        D               |j                  d t        dz  j                  d      D               |D ]N  }t        |      }|j                  t              j                         } t        D ]  }t        ||v|  d|         P y c c} w )Nz$removed engine file reappeared: web/c              3  .   K   | ]  }t         |z    y wrI   )rS   )r   rW   s     rA   r   z1assert_no_removed_engine_paths.<locals>.<genexpr>  s     >cc	>s   c              3  @   K   | ]  }|j                   d k7  s|  yw)zverify_web_assets.pyN)namerf  s     rA   r   z1assert_no_removed_engine_paths.<locals>.<genexpr>  s     n$))WmJmns   r   z*.pyz' still references removed engine path: )REMOVED_ENGINE_FILESrM   rP   rQ   rO   extendrR   r   globrG   rd  re  REMOVED_ENGINE_PATHS)rW   search_pathsr@   textremoveds        rA   assert_no_removed_engine_pathsr  }  s    # XS3Y&&((,PQTPU*VWX *::#C#I:L:>-=>>n$.)>)>v)Fnn cD!t$--/+ 	cGG4'C50WX_W`)ab	cc ;s   C)c                 n   t        j                  t        t        dz              } t	        | j                  d      dk(  d       t	        | j                  d      dk(  d       | j                  d      xs i }t	        |j                  d	      d
k(  d       t	        |j                  d      dk(  d       | j                  d      xs i }| j                  d      xs i }t	        |j                  d      dk(  d       t	        |j                  d      dk(  d       |j                  d      xs i }t	        |j                  d      du d       t	        |j                  d      du d       t	        |j                  d      xs i j                  d      d       t        t        dz        }t	        d |v d!       y )"Nr1   rw   z#hwanse-render-pipeline-model-reviewzrender pipeline kind changedr   z"field-battle-render-model-groundedzrender pipeline status changedrv   displayResolution	640x480x8z*render pipeline display resolution changedsurfaceWrapperTable
0x0055abd8z%render pipeline wrapper table changedfieldPipelinebattlePipelineevidenceStatusz&tilemap-dirty-render-consumer-groundedz!field render model status changedz#object-sprite-helper-model-groundedz"battle render model status changednegativeEvidencedrawTimeUsesLayer1Flag0x40Fz%field draw-time 0x40 evidence changed*visibleMotionProducerFoundInRedrawConsumerz,field 0x40 producer should remain unpromotedglobalsAndFieldsobject+0x28z battle object+0x28 model missingr   "HWANSE_RENDER_PIPELINE_MODEL_READYz"render pipeline web marker missing)ri   rj   rB   rS   rM   rk   rP   )ro   rv   fieldbattlenegativers   s         rA   #assert_render_pipeline_model_reviewr    s   ::d3!DDEFDDHHV EEGefDHHX"FFHhihhy!'RGGKK+,;=ijGKK-.,>@ghHH_%+EXX&'-2FEII&'+SSUxyFJJ'(,QQSwxyy+,2HHLL56%?AhiHLLEF%OQ  AVZZ*+1r66}EGij99:D0D8:^_rC   c                    t        j                  t        t        dz              } t	        | j                  d      dk(  d       t	        | j                  d      dk(  d       | j                  d      xs i }t	        |j                  d	      d
k(  d       t	        |j                  d      dk(  d       t	        |j                  dd      dk\  d       t	        |j                  dd      dk\  d       t	        |j                  d      du d       |j                  d      xs i }dD ]  }t	        ||v d| d        | j                  d      xs g }t	        t        d |D              d       t	        t        d  |D              d!       t	        t        d" |D              d#       t        t        d$z        }t	        d%|v d&       y )'Nr2   rw   z%hwanse-surface-wrapper-catalog-reviewzsurface wrapper kind changedr   z-wrapper-grid-vs-descriptor-catalog-classifiedzsurface wrapper status changedrv   r  r  zsurface wrapper table changedobjectDrawSourceFieldr  z$surface wrapper object field changeddescriptorPlus4Assetsr   d   z*descriptor +4 asset count unexpectedly lowfixedGridAssetsr   z'fixed-grid asset count unexpectedly low*wrapperGridFullyExplainsDescriptorCatalogsFz#wrapper/descriptor boundary changedwrapperFieldOffsets)z+0x2ez+0x30z+0x32z+0x34zsurface wrapper offset z missingr.  c              3  n   K   | ]-  }|j                  d       dk(  xr |j                  d      du  / yw)assetbtl_atwrapperGridSufficientFNr   r   s     rA   r   z8assert_surface_wrapper_catalog_review.<locals>.<genexpr>  s7     k_b H,Z9P1QUZ1ZZk   35z"btl_at descriptor boundary missingc              3  n   K   | ]-  }|j                  d       dk(  xr |j                  d      du  / yw)r  face_01r  TNr   r   s     rA   r   z8assert_surface_wrapper_catalog_review.<locals>.<genexpr>  s7     k_b I-Z#'':Q2RVZ2ZZkr  z#face_01 fixed-grid boundary missingc              3  p   K   | ].  }|j                  d       dk(  xr |j                  d      dk(   0 yw)r  windowwrapperRolezwindow-template-systemNr   r   s     rA   r   z8assert_surface_wrapper_catalog_review.<locals>.<genexpr>  s6     thk H,c1GKc1cct   46z window template boundary missingr   $HWANSE_SURFACE_WRAPPER_CATALOG_READYz"surface wrapper web marker missingri   rj   rB   rS   rM   rk   r   rP   )ro   rv   offsetskeyr.  rs   s         rA   %assert_surface_wrapper_catalog_reviewr    s   ::d3!FFGHDDHHV GGIghDHHX"QQSsthhy!'RGGKK-.,>@_`GKK/0MACijGKK/3s:<hiGKK)1-24]^GKKDENPuvkk/06BG3 Iw"9#h GHI88F!rDCkfjkk  nR  SCkfjkk  nS  TCtostt  wY  Z;;<D2d:<`arC   c            	        t        j                  t        t        dz              } t	        | j                  d      dk(  d       t	        | j                  d      dk(  d       | j                  d      xs i }t	        |j                  d	      d
k(  d       t	        |j                  d      dk(  d       t	        |j                  d      dk(  d       t	        |j                  d      dk(  d       t	        |j                  d      dk(  d       t	        |j                  d      dk(  d       | j                  d      xs g }t	        t        |      dk\  d       |D ch c]+  }t        |j                  dd            j                         - }}t	        h d |k  d!       | j                  d"      xs g }t	        t        d# |D              d$       t	        t        d% |D              d&       | j                  d'      xs g }|D ch c]+  }t        |j                  dd            j                         - }}t	        h d(|k  d)       t	        t        d* |D              d+       | j                  d,      xs i }t	        |j                  d-      d.u d/       t        t        d0z        }	t	        d1|	v d2       y c c}w c c}w )3Nr3   rw   z"hwanse-draw-flags-color-key-reviewzdraw flags kind changedr   z*object-flag-and-blt-flag-boundary-reviewedzdraw flags status changedrv   objectFlagFieldzobject+0x2czdraw flags object field changedlowBitsClipSlotMask
0x00000007z$draw flags low-bit clip mask changedscaledBranchMask
0x00000208z%draw flags scaled branch mask changedcenteredScaleBitzobject+0x2d bit 0x02zdraw flags center bit changednormalDrawFlagGlobal
0x004676f4z draw flags normal global changedscaledDrawFlagGlobal
0x004676f8z draw flags scaled global changeddirectDrawCallClasses
   z3draw flags DirectDraw call class coverage regressedr^   r_   >   
0x00417722
0x00419b4a
0x00419bc4
0x00419bf2z!draw flags key call sites missingobjectFlagConsumersc              3  D   K   | ]  }|j                  d       dk(    yw)maskr  Nr   r   s     rA   r   z5assert_draw_flags_color_key_review.<locals>.<genexpr>       EC</E    z"draw flags 0x0208 consumer missingc              3  D   K   | ]  }|j                  d       dk(    yw)r  r  Nr   r   s     rA   r   z5assert_draw_flags_color_key_review.<locals>.<genexpr>  r  r  z%draw flags clip-slot consumer missingbyteEvidence>   
0x00416d79r  
0x00419a2az draw flags byte evidence missingc              3  >   K   | ]  }|j                  d         yw	availableNr   r   s     rA   r   z5assert_draw_flags_color_key_review.<locals>.<genexpr>       ;$;r   z=draw flags byte evidence should be available from Hwanse2.exeverificationnotSimplyTransparencyBitTz(draw flags transparency boundary changedr   !HWANSE_DRAW_FLAGS_COLOR_KEY_READYzdraw flags web marker missing)ri   rj   rB   rS   rM   rk   rl   rm   rn   r   r   rP   )
ro   rv   callsr   call_vas	consumers
bytes_rowsbyte_vasr  rs   s
             rA   "assert_draw_flags_color_key_reviewr    sf   ::d3!CCDEDDHHV DDF_`DHHX"NNPklhhy!'RGGKK)*m;=^_GKK-.,>@fgGKK*+|;=deGKK*+/EEGfgGKK./<?AcdGKK./<?AcdHH,-3ECJ"ST=BCcCGGGR()//1CHCDPRuv./52ICE9EEGklCE9EEGno.)/RJ=GHcCGGGR()//1HHH6(BDfgC;
;;=|}88N+1rLL78D@Blm889D/479XY D Is   0J70J<c            	     (   t        j                  t        t        dz              } t	        | j                  d      dk(  d       t	        | j                  d      dk(  d       | j                  d      xs i }t	        |j                  d	      d
k(  d       t	        |j                  d      dk(  d       t	        |j                  d      dk(  d       t	        |j                  d      dk(  d       t	        |j                  d      dk(  d       t	        |j                  d      dk(  d       | j                  d      xs g }|D ch c]+  }t        |j                  dd            j                         - }}t	        h d|k  d       | j                  d       xs g }|D ch c]+  }t        |j                  dd            j                         - }}t	        h d!|k  d"       | j                  d#      xs g }|D ch c]+  }t        |j                  dd            j                         - }}t	        h d$|k  d%       t	        t        d& |D              d'       | j                  d(      xs i }	t	        |	j                  d)      d*u d+       | j                  d,      xs i }
t	        d-|
j                  d.      xs g v d/       t	        d0|
j                  d.      xs g v d1       t        t        d2z        }t	        d3|v d4       y c c}w c c}w c c}w )5Nr4   rw   zhwanse-palette-pipeline-reviewzpalette pipeline kind changedr   z'palette-buffer-copy-apply-path-groundedzpalette pipeline status changedrv   displayModez640x480x8 indexed colorzpalette display mode changedpaletteObjectGlobal
0x004676c4zpalette object global changedpaletteHeaderGlobal
0x004676e4zpalette header global changedpaletteEntriesGlobal
0x004676e8zpalette entries global changed
entryCount   zpalette entry count changedentryStrideBytesr   zpalette entry stride changeddirectDrawPaletteCallsr^   r_   >   
0x0041652e
0x00416649
0x00416708
0x00416856z$palette key DirectDraw calls missingupdateRoutines>   
0x00415c53
0x004165b8
0x00416677
0x00416736zpalette update routines missingr  >   
0x00415c58r  r  
0x004167f1zpalette byte evidence missingc              3  >   K   | ]  }|j                  d         ywr  r   r   s     rA   r   z1assert_palette_pipeline_review.<locals>.<genexpr>  r  r   z:palette byte evidence should be available from Hwanse2.exer  notMapTileMotionProofTz#palette/map-motion boundary changedpaletteVmBoundary0x38knownOpcodeFamiliesz$palette opcode 0x38 boundary missing0x39z$palette opcode 0x39 boundary missingr   HWANSE_PALETTE_PIPELINE_READYz#palette pipeline web marker missing)
ri   rj   rB   rS   rM   rk   rm   rn   r   rP   )ro   rv   r  r   r  routinesroutine_vasr  r  r  vm_boundaryrs   s               rA   assert_palette_pipeline_reviewr    s   ::d3!??@ADDHHV @@BabDHHX"KKMnohhy!'RGGKK&*CCEcdGKK-.,>@_`GKK-.,>@_`GKK./<?AabGKK%,.KLGKK*+q02PQHH-.4"E=BCcCGGGR()//1CHCDPRxyxx()/RH@HI3swww+,224IKIDSUvw.)/RJ=GHcCGGGR()//1HHHDPRqrC;
;;=yz88N+1rLL45=?de((./52KF{'<=CDFlmF{'<=CDFlm445D+t35Z[ D J Is   0L 0L
<0Lc                 6   t        j                  t        t        dz              } t	        | j                  d      dk(  d       t	        | j                  d      dk(  d       | j                  d      xs i }|j                  d	      xs i }|j                  d
      xs i }t	        |j                  d      dk(  d       t	        |j                  d      dk(  d       t	        |j                  d      dk(  d       t	        |j                  d      du d       t	        |j                  d      du d       t	        |j                  d      dk(  d       t	        |j                  d      dk(  d       t	        |j                  d      d k(  d!       t	        |j                  d"      d#k(  d$       | j                  d%      xs g }t	        t        d& |D              d'       t	        t        d( |D              d)       t        t        d*z        }t	        d+|v d,       y )-Nr5   rw   z)hwanse-non-palette-motion-producer-reviewznon-palette motion kind changedr   z7battle-motion-grounded-map-tile-motion-producer-unboundz!non-palette motion status changedrv   
mapSummarybattleSummaryanimatedMapCountr]   z-non-palette motion animated map count changed&liveBufferCandidateVmTileWriteRefCountr   z5non-palette motion live tile writer ref count changed"liveBufferAnimatedRootBindingCountr   z4non-palette motion map binding unexpectedly promoted!frameScriptTileWriteProducerFoundFz0non-palette motion frame-script producer changed#drawTimeVisibleMotionTransformFoundz.non-palette motion draw-time transform changedhelpersWithPositionOrMotionT   z1non-palette motion battle helper coverage changedskillsWithHelpers`   z2non-palette motion skill/helper join count changedr  r   z/non-palette motion classified row count changedr  r  z0non-palette motion pixel oracle boundary changedpromotionDecisionsc              3  p   K   | ].  }|j                  d       dk(  xr |j                  d      dk(   0 yw)areazfield map visible tile motiondecisionzkeep unpromotedNr   r   s     rA   r   z<assert_non_palette_motion_producer_review.<locals>.<genexpr>  s<       Ftw#BBoswwzGZ^oGoo  Fr  z map tile motion decision missingc              3  p   K   | ].  }|j                  d       dk(  xr |j                  d      dk(   0 yw)r  zbattle effect helper motionr  zpromote for runner useNr   r   s     rA   r   z<assert_non_palette_motion_producer_review.<locals>.<genexpr>  s<       Ky|#@@tSWWZEX\tEtt  Kr  z%battle helper motion decision missingr   (HWANSE_NON_PALETTE_MOTION_PRODUCER_READYz%non-palette motion web marker missingr  )ro   rv   map_summarybattle_summary	decisionsrs   s         rA   )assert_non_palette_motion_producer_reviewr    s   ::d3!JJKLDDHHV KKMnoDHHX"[[  ^A  Bhhy!'RG++l+1rK[[17RNKOO./146efKOODEJ  MD  EKOO@AQFH~KOO?@EIK}~KOOABeKM}~N<=CExyN23r9;opN:;rACtuN237ZZ  ]O  P-.4"IC  F  |E  F  F  Hj  kC  K  AJ  K  K  Mt  u??@D6$>@ghrC   c                 Z   t         t        t        t        t        t
        t        t        t        t        t        t        t        t        t        t        t         t"        g} 	 | D ]	  } |         	 t'        d       y# t$        $ r(}t'        d| t(        j*                         Y d }~yd }~ww xY w)Nzverify_web_assets failed: )filer   zverify_web_assets okr   )rX   rt   r   r   r   r1  r>  rG  rP  rx  r  r  r  r  r  r  r  r  rJ   printsysstderr)r   checkexcs      rA   r   r     s    .+...13,'&+-*&1%F( 	EG	
 

 !	  *3%0szzBs   A9 9	B*B%%B*__main__)r@   r   returnrm   )rK   boolrL   rm   r%  None)r%  r'  )rs   rm   r%  	list[str])r%  r(  )ro  rm   r`  rm   r%  zPath | None)r%  r   )3__doc__
__future__r   ri   rV  r   pathlibr   urllib.parser   rL  r   rm  parentsr   rP   rS   rU   rO   rR   rT   rV   r  r  rB   rG   rM   rX   rt   r   r   r   r1  r>  rG  rP  ra  rj  rr  rx  r  r  r  r  r  r  r  r  r   r   
SystemExitri  rC   rA   <module>r/     s=   #  	 
  ! 2 H~''*
Ul
Ulf}U p; | &
 ,>&
KgtNni0,v^i, @ C
4T.[b`BNc`&b*Z8\<i.> z
TV
 rC   