
    ƬLj                        d Z ddlmZ ddlZddlZddlmZ ddlmZ  ee	      j                         j                  d   Zedz  Zedz  Zdd	Zdd
ZddZddZddZddZddZedk(  r e        yy)a+  Build a concise queue of remaining static-analysis work.

This page is intentionally not another raw evidence dump.  It tells future
analysis passes which fronts are settled, which are blocked by missing producer
proof, and which are web-runner implementation requirements rather than EXE
unknowns.
    )annotationsN)Path)Any   outwebc                    	 t        j                  t        | z  j                  d            }t        |t              r|S i S # t        $ r i cY S w xY w)Nutf-8encoding)jsonloadsOUT	read_textFileNotFoundError
isinstancedict)namedatas     -tools/build_static_analysis_remaining_work.py	load_jsonr      sS    zz3:00'0BC dD)41r1  	s   ,A AAc                L    | j                  d      }t        |t              r|S i S )Nsummary)getr   r   )r   values     r   r   r      s$    HHYEud+533    c                V    t        j                  | dd      S t        |       d      S )N T)quote)htmlescapestr)r   s    r   hr#   #   s%    ;;U]r$GGE
$GGr   c                v    | j                  d      rd| z   S | j                  d      r| j                  d      S | S )Nzout/z../zweb/)
startswithremoveprefix)paths    r   linkr(   '   s:    vt|v  ((Kr   c            *     '   t        d      } t        |       }t        t        d            }t        t        d            }t        t        d            }t        t        d            }t        t        d            }t        t        d            }t        t        d            }t        t        d	            }	t        t        d
            }
t        t        d            }t        t        d            }t        t        d            }t        t        d            }t        t        d            }t        t        d            }t        t        d            }t        t        d            }t        d      }t        t        d            }t        d      }t        t        d            }t        t        d            }t        t        d            }t        t        d            }t        t        d            }t        t        d            }t        t        d            }t        d      }t        d      }t        d      }t        d       } t        d!      }!t        d"      }"t        d#      }#t        |#      }$t        t        d$            }%t        t        d%            }&t        t        d&            }'t        t        d'            }(t        t        d(            })t        t        d)            }*t        t        d*            }+t        t        d+            },t        d,      }-t        |-      }.t        t        d-            }/t        t        d.            }0t        t        d/            }1t        t        d0            }2t        t        d1            }3t        t        d2            }4t        t        d3            }5t        t        d4            }6t        t        d5            }7t        t        d6            }8t        t        d7            }9t        t        d8            }:t        t        d9            };t        t        d:            }<t        t        d;            }=t        t        d<            }>t        t        d=            }?t        t        d>            }@t        t        d?            }At        t        d@            }Bt        t        dA            }Ct        t        dB            }Dt        dC      }E|j                  dDdE      dEk(  xr |j                  dFdE      dEk(  xrz |j                  dGdE      dEk(  xrc |j                  dHdI      |j                  dJdE      k(  xr< |j                  dKdI      |j                  dLdE      k(  xr |j                  dMdE      dNk\  }FdOdPdQdRdS|j                  dTdE       dU|j                  dVdE       dW|j                  dFdE       dX|j                  dGdE       dYg dZd[dOd\|FrdQnd]Frd^nd_d`|j                  dDdE       da|j                  dbdE       dc|j                  dHdE       dU|j                  dJdE       dd|j                  dKdE       dU|j                  dLdE       de|j                  dMdE       dfFrdgndhdidjgd[dkdldQdmdn|j                  dodE       dp|j                  dqdE       dr|j                  dsdE       dtdugd[dvdwdxdydz|j                  d{|j                  d|dE             d}|j                  d~dE       d|j                  ddE       d|	j                  ddE       d|
j                  ddE       d|j                  ddE       ddg dd[dvddxdd|j                  ddE       d|j                  ddE       d|j                  ddE       d|j                  dd       d|j                  ddE       d|j                  ddE       d|j                  dd       dg dd[dddxddj                  g d|j                  d       d|j                  d       d|j                  d       d|j                  ddE       d|j                  d       d|j                  d       d|j                  ddE       dU|j                  ddE       d|j                  ddE       dU|j                  ddE       d|j                  d       d|j                  dd       d|j                  d       d|j                  d       d|j                  d       d|j                  d       d|j                  d       dU|j                  d«       dÑ|j                  ddE       dő|j                  ddE       dǑ|j                  ddɫ       dU|j                  ddɫ       dˑ|j                  ddɫ       d͑|j                  ddE       dϑ|j                  ddE       dU|j                  ddE       dU|j                  ddE       dӑ|j                  dԫ       dՑ|j                  ddE       dב|j                  dث       dّ|j                  dګ       dۑ|j                  ddE       dݑ| j                  dګ       dޑ      dg dd[dddxdd|j                  ddE       d|j                  ddE       d|j                  ddE       d|j                  d      xr |j                  d       d|j                  d       d|j                  d       d|j                  d       d|j                  ddE       d|j                  ddɫ       d|j                  ddɫ       d|j                  ddE       dU|j                  ddE       d|j                  d       d|j                  d       d|j                  d       dg dd[dddxddj                  g d|!j                  dd        d|"j                  dd        d|$j                  ddE       d|$j                  ddE       d|%j                  d       d|%j                  d	dE       dU|%j                  d
dE       d|&j                  ddE       d|&j                  ddE       d|'j                  ddE       d|'j                  ddE       d|'j                  ddɫ       d|)j                  ddɫ       dU|)j                  ddɫ       d|)j                  ddɫ       d|)j                  ddɫ       d|*j                  ddɫ       d|j                  ddɫ       d |*j                  d!dɫ       d"|+j                  d#dɫ       d$|+j                  d%dɫ       dU|+j                  d&dɫ       d'|j                  d#dɫ       d(|,j                  d#dɫ       d)|,j                  d*dɫ       dU|,j                  d+dɫ       dU|,j                  d,dɫ       d-|(j                  d.       d/|(j                  d             d0g d1d[d2d3d4d5dj                  g d6|7j                  d7|:j                  d7dE             d8|7j                  d9|:j                  d9dE             d:|9j                  d;d       d<|;j                  d=dE       dU|;j                  d>dE       d?|<j                  d@dE       dA|<j                  dBdE       dC|=j                  dDdE       dU|=j                  dEdE       dF|>j                  dGd       dH|>j                  dId       dJ|?j                  dKd       dL@j                  dMdE       d|@j                  dNdE       dO|@j                  dPd       dQAj                  dRdE       dS|Aj                  dTdE       dUBj                  dVdE       d|Bj                  dWdE       dX|Bj                  dYdE       dU|Bj                  dZdE       d[Cj                  d\dE       d]|Cj                  d^dE       d_Dj                  d`dE       da|8j                  ddɫ       dbEj                  dcd       dd|7j                  ded              dfg dgd[dhdid4djdj                  g dk|.j                  dldE       dm|.j                  dndE       do|$j                  ddE       dp|4j                  dqd        dr|4j                  dsd        dt|4j                  dudE       dU|4j                  dvdE       dw|/j                  dxd       dy|/j                  dz|.j                  dzd              d{|/j                  d|d       d}|/j                  d~d       d|/j                  dd       d|1j                  ddɫ       d|2j                  ddɫ       dU|2j                  ddɫ       d|0j                  ddɫ       d|0j                  ddɫ       d|3j                  ddɫ       dU|3j                  ddɫ       d|5j                  d\dɫ       d|5j                  ddɫ       d|6j                  ddɫ       d|.j                  di              dg dd[g
}Gddg dt	        |G      t        d |GD              t        d |GD              t        d |GD              t        d |GD              d|GdS (  Nzcns_precut_catalog_review.jsonz+battle_skill_implementation_gap_review.jsonz+battle_effect_animation_pattern_review.jsonz(battle_effect_runner_binding_review.jsonz!battle_hit_window_gap_review.jsonz"field_encounter_static_review.jsonz)field_step_encounter_boundary_review.jsonz-field_encounter_producer_boundary_review.jsonz0field_active_object_trigger_boundary_review.jsonz/field_encounter_tick_route_boundary_review.jsonz.field_encounter_formation_boundary_review.jsonz,field_encounter_formation_stream_review.jsonz4field_encounter_formation_opcode_cluster_review.jsonz'field_rng_selector_opcode1c_review.jsonz+scene_event_text_consumer_trace_review.jsonz-selected_scene_text_root_consumer_review.jsonz.selected_root_live_writer_frontier_review.jsonz'selected_root_opcode_matrix_review.jsonz&selector_root_preentry_ref_review.jsonz/selector_address_predecessor_bridge_review.jsonz)save_selector_dispatch_table_context.jsonz/generic_vm_stream_producer_frontier_review.jsonz-generic_vm_opcode2a_parent_stream_review.jsonz&generic_vm_opcode14_branch_review.jsonz'display_vm_root_ref_context_review.jsonz*scene_event_vm_execution_route_review.jsonz)scene_event_vm_route_boundary_review.jsonz&global_mode_state_frontier_review.jsonz.save_selector_opcode08_activation_windows.jsonz&save_selector_merge_bridge_matrix.jsonz!strict_event_source_coverage.jsonzruntime_trace_feasibility.jsonzmenu_right_panel_ui_review.jsonz%status_menu_ui_expression_review.jsonz status_menu_vm_table_review.jsonz$hud_menu_opener_boundary_review.jsonz$hud_menu_opener_frontier_review.jsonz+hud_menu_selected_root_frontier_review.jsonz*hud_menu_mode_state_dispatcher_review.jsonz)hud_menu_top_sequence_context_review.jsonz&hud_menu_vm_graph_frontier_review.jsonz*hud_active_group_gate_frontier_review.jsonz'hud_input_consumer_boundary_review.jsonz+status_comment_selector_binding_review.jsonz,status_comment_producer_boundary_review.jsonz'status_comment_backing_writer_scan.jsonz+status_comment_backing_base_ref_review.jsonz*status_comment_base_bind_route_review.jsonz3status_comment_indirect_selector_writer_review.jsonz+status_comment_selector_meaning_review.jsonz1status_comment_target0_writer_context_review.jsonz9status_comment_selector_value_source_frontier_review.jsonz%map_animation_exe_pattern_review.jsonz)map_animation_static_frontier_review.jsonz,map_animation_execution_boundary_review.jsonzmap_animation_tile_review.jsonz)map_animation_resource_binding_probe.jsonz,map_animation_live_buffer_writer_review.jsonz4map_animation_object_relative_tile_write_review.jsonz)map_animation_redraw_consumer_review.jsonz-map_animation_draw_tile_transform_review.jsonz$map_animation_tick_route_review.jsonz9map_animation_active_object_script_tile_write_review.jsonz1map_animation_frame_script_tile_write_review.jsonz4map_animation_non_object_tile_write_root_review.jsonz3map_animation_specialized_loop_boundary_review.jsonzruntime_map_layer0_poll.jsonskillsWithReviewFlagsr   runnerImplementationGapRowsstaticAnalysisGapRowsengineChecksPassedengineChecksTotalpageChecksPassedpageChecksTotalpagesRenderingHelperEffectLayer   u   전투u   전투 계산/타격 windowsettledu   EXE 분석 완료zhit events confirmedHitEvents/	hitEventsz, runner gap z, static gap u{   새 기술 오류가 보이면 runner 구현/표시 테이블 문제로 보고, EXE 미확정으로 되돌리지 않는다.))zbattle analysiszweb/battle_analysis.html)zhit window JSONz%out/battle_hit_window_gap_review.json)zsupport/status policy JSONz,out/battle_support_status_policy_review.json)areatitlestate
stateLabelr   nextlinksu   전투 이펙트 실행 요구implementationu   정적 요구/웹 결속 완료u   웹 실행기 구현 요구zreview flags z, execution requirements skillsWithExecutionRequirementsz, engine/page binding z + z, effect render pages z/3u   EXE child/helper/random placement 요구와 active page 결속은 완료됐다. 새 시각 오류는 개별 effect transform/render tuning으로 처리하고, EXE 미확정으로 되돌리지 않는다.u   EXE는 child/helper/random placement 요구를 제공하고, active page는 공통 helper sync/visual 엔진에 결속되어 있다. timeline은 상세 effect frame 검토, simulator/calculator는 전투 흐름용 helper frame preview를 렌더한다.)zeffect patternsz/web/battle_effect_animation_pattern_review.html)zrunner bindingz,out/battle_effect_runner_binding_review.htmlCNSzCNS source-rect/precut catalogu   후보 정리 완료zdescriptor assets descriptorPlus4Assetsz, fixed grids fixedGridAssetsz, unbound candidates unboundCandidateAssetsui   aaa/compile false-positive는 제거했다. 새 CNS rect 문제는 catalog를 우선 근거로 삼는다.)zCNS catalogz"out/cns_precut_catalog_review.htmlu   필드 인카운트u   랜덤 전투 producerblockedu   정적 producer 미발견zRNG call sites rngCallSiteCountrngCallSitesz; direct field evidence $rngDirectFieldEncounterEvidenceCountz; movement RNG refs #sharedRngCallsInCoreMovementWindowsz; active-object route proof routeProofScriptCountz; tick-route promotable calls /promotableKeyDirectCallsInsideKnownFieldWindowsz; producer surfaces promotedProducerSurfaceCountz	 promotedu   좌표 업데이트 함수, known field tick route, manual active-object bridge 안에는 없다. higher-level mode/state dispatcher에서 step success와 battle setup을 연결하는 증거가 필요하다.))zproducer boundary1web/field_encounter_producer_boundary_review.html)ztick route boundary JSONz3out/field_encounter_tick_route_boundary_review.json)zactive-object boundaryz4web/field_active_object_trigger_boundary_review.html)zfield encounterz&web/field_encounter_static_review.html)zstep boundaryz-web/field_step_encounter_boundary_review.html)zopcode 0x1cz+web/field_rng_selector_opcode1c_review.htmlu    전투 편성/몬스터 produceru   consumer만 groundedzselector roots selectorRootCountz, monster roots selectorMonsterRootCountz, map+monster roots selectorMapMonsterRootCountz, cluster producer !directFieldEncounterProducerFoundFz, stream refs candidateExactPointerRefCountz, stream owners with maps candidateOwnerWithFieldMapCountz, stream status statuszproducer-unboundu   opcode 0x1e는 battle actor formation consumer로 확정됐다. stream 후보는 selector/resource root 내부 inline anchor이고 exact pointer ref가 없어, 필드 맵에서 이 stream을 고르는 producer는 아직 없다.))zformation boundaryz2web/field_encounter_formation_boundary_review.html)zopcode clusterz8web/field_encounter_formation_opcode_cluster_review.html)zformation streamz0web/field_encounter_formation_stream_review.html)zformation contextz1web/field_encounter_formation_context_review.htmlzScene/Eventu#   텍스트 consumer와 route bindingz!consumer grounded / route blockedr   ztext consumer proof textConsumerProofFoundz; route binding proof routeTextBindingProofFoundz; selected root consumer consumerVerifiedz; selector/root writers selectedRootWriterRefCountz; selector byte writer selectorByteWriterGroundedz; selected executor selectedRootExecutorFoundz%; root opcode matrix exact 0x07/0x09 opcode07ExactRootSelectCountopcode09ExactRootStoreCountz4; pre-entry current refs source/predecessor/address )sourceOrPredecessorToCurrentRangeRefCount(addressPredecessorToCurrentRangeRefCountz, address bridge proof 0addressPredecessorBridgeRouteExecutionProofFoundz, class bridgeContextClassification
unreviewedz, promoted promotedRouteProofz; dispatch table proof dispatchTableProofFoundz; save slice anchored saveSelectorSliceAnchoredz; runtime dispatch proof 0saveSelectorSliceDirectRuntimeDispatchProofFoundz; generic VM stream producers surfaceCountz, direct unclassified unclassifiedDirectCallCountz, 0x2a fanout calls linkedObjectFanoutCallCountz+; display VM root refs object/create/store objectCreateRefCount	unscannedfieldCallbackStoreCountz, root ref opener normalFieldHudOpenerPromotedz; 0x2a active +ec hits activeObjectEcOpcode2aCountz, 0x2a raw/boundary/promoted rawCandidateCountboundaryCandidateCountpromotedParentProducerCountz; direct execution root directExecutionRootFoundz; route surfaces blockedRouteSurfaceCountz blocked; opcode08 promotes opcode08ActivationPromotesRoutez; merge proof 
proofFoundz; strict source coverage  strictEventSourceCoveragePercentz%; historical runtime proof z (not primary)u  프롬프트 표시 consumer와 selected-root writer/executor VM primitive는 있다. 전체 selector-root opcode matrix에서도 0x4f mode1은 self/slot-alias로만 나타나며, 0x07 exact-root select와 0x09 exact-root store는 0건이다. selector-root pre-entry ref scan에서는 source/predecessor 0:0/1:0에서 current 2:0으로 들어가는 aligned pointer가 0건이다. address-predecessor 10:0에는 current-range pointer 75건이 있으나 별도 bridge review에서 target-side resource/data adjacency로 재분류했고 route producer 승격은 false다. generic dispatcher 0x00402321/0x00440538은 확정됐고 save-selector 0x00440720 slice 모델도 정적으로 anchored됐지만, 0x00440720을 live route에서 쓰는 table-base switch/direct runtime dispatch 증거는 없다. generic object/display VM stream frontier는 직접 호출 미분류를 0으로 줄였고 opcode 0x2a linked-object fanout까지 정리했다. 0x2a는 strict active object +0xec script inventory에서 0건이며 raw 후보는 parent/root 연결이 없어 route producer 승격 0건이다. 다음 시도는 0x00406dbb 또는 0x0040ad9b/0x0040adc9/0x0040ae0e까지 실제 gameplay stream/root를 공급하는 upstream producer 증거를 우선한다. 런타임 trace는 기본 경로로 쓰지 않는다.))zroute boundary JSON-out/scene_event_vm_route_boundary_review.json)ztext consumerz/web/scene_event_text_consumer_trace_review.html)zselected text rootz1web/selected_scene_text_root_consumer_review.htmlzselected root writerz2web/selected_root_live_writer_frontier_review.html)zselected root writer JSON2out/selected_root_live_writer_frontier_review.jsonzselected root opcode matrixz+web/selected_root_opcode_matrix_review.html)z selected root opcode matrix JSON+out/selected_root_opcode_matrix_review.json)zselector root pre-entryz*web/selector_root_preentry_ref_review.html)zselector root pre-entry JSON*out/selector_root_preentry_ref_review.json)zaddress predecessor bridgez3web/selector_address_predecessor_bridge_review.html)zaddress predecessor JSON3out/selector_address_predecessor_bridge_review.jsonzdispatch table contextz-web/save_selector_dispatch_table_context.html)zdispatch table JSON-out/save_selector_dispatch_table_context.jsonzgeneric VM streamz3web/generic_vm_stream_producer_frontier_review.html)zgeneric VM stream JSON3out/generic_vm_stream_producer_frontier_review.jsonzdisplay VM root refsz+web/display_vm_root_ref_context_review.htmlzdisplay VM root refs JSON+out/display_vm_root_ref_context_review.jsonzopcode 0x2a parent streamsz1web/generic_vm_opcode2a_parent_stream_review.html)zopcode 0x2a JSON1out/generic_vm_opcode2a_parent_stream_review.json)zexecution routez.web/scene_event_vm_execution_route_review.html)zopcode08 windows JSON2out/save_selector_opcode08_activation_windows.json)zmerge bridge JSON*out/save_selector_merge_bridge_matrix.json)zstrict coveragez%out/strict_event_source_coverage.htmlu   전역 Mode/Stateu   상위 mode/state dispatcherz'cross-domain scanned / producer pendingzcross-domain funcs crossDomainFunctionCountz, review-required reviewRequiredCountz, promoted producers promotedProducerCountz, selected-root primitives selectedRootWriterGroundedz, opcode matrix promoted routeProducerPromotedz, dispatch proof z, generic VM producer z!, generic VM unclassified direct z, display root opener z, display root object refs z, opcode2a active/promoted z, save/load bridge saveLoadRestoreBridgeFoundz, menu internal excluded menuInternalDispatcherExcludedz, field movement excluded fieldMovementControllerExcludedu   입력/메뉴/scene/field/encounter/map-animation 교집합을 전체 스캔했지만 live gameplay producer 승격은 0건이다. 0x00406dbb는 selector byte writer, 0x0040ad9b/0x0040adc9/0x0040ae0e는 selectedRoot writer/executor primitive로 grounded됐다. 전체 root opcode matrix도 source/predecessor가 current 2:0 exact root를 고르는 경로를 찾지 못했다. generic VM 직접 호출은 nested wrapper/opcode 0x2a fanout/active delayed route로 모두 분류됐고 route producer는 아니다. opcode 0x2a raw 후보도 active +0xec 스크립트에는 없고 parent/root 미연결이므로 생산자로 쓰지 않는다. opcode 0x14는 overlapped-target branch shape로 grounded됐지만 raw VA-shaped 후보는 stream boundary 없이는 승격하지 않는다. dispatch table context와 generic VM stream frontier도 runtime dispatch/table-base switch 또는 object+0x40 producer 승격 증거를 못 찾았으므로, 0x00423319 save/load restore와 구분되는 upstream live producer가 다음 증거다.))zglobal mode/state frontierz*web/global_mode_state_frontier_review.html)zglobal mode/state JSON*out/global_mode_state_frontier_review.jsonrv   rx   r|   r~   r   r   )zopcode 0x14 branchz*web/generic_vm_opcode14_branch_review.html)zHUD mode/state.web/hud_menu_mode_state_dispatcher_review.html)zscene route boundary JSONru   )zencounter producerrL   )zmap animation tick JSON(out/map_animation_tick_route_review.jsonzHUD/Menuu   ESC/X 메뉴 openerz!payload grounded / opener pendingzright menu status: unknownz; status UI: z; 0x40 VM tables opcode13TableCount+opcode14TableCountz; ESC opener normalFieldEscOpenerProvenz; strict inventory 0x62/0x9f #strictInventoryDescriptorAddScriptsstrictInventoryCancelOpScriptsz; frontier intersections intersectionFunctionCountz, open candidates normalOpenCandidateCountz; selected-root promotions selectedRootPromotionCountz, 0x62 promoted !descriptorAddPromotedContextCountz; 0x62 rejected #descriptorAddRejectedUnalignedCountz!; top sequence refs/wrapper refs topMenuSequenceAllRefCounttopMenuWrapperDirectRefCountz, top wrapper calls sequence wrapperCallsTopMenuSequencez	, parent parentContextClassificationz; VM graph op14 reject (postSelectedRootRejectedAsLinearOpcode14z, op14 candidates &vaShapedOverlappedTargetCandidateCountz, graph opener normalFieldEscOpenerPromotedz; active-group gate classificationz, group writes/field consumers directGroupWriteCountfieldGroupConsumerCountz; display VM root refs z; input boundary z; cancel/add/top cancelBackClearsBitcancelBackCallsAddDescriptor#cancelBackReferencesTopMenuSequencez; internal dispatcher menuInternalDispatcherProvenz	, opener u  region #2/#3/#4/#6 payload, 커서, region #2 설명 pointer tables는 확정. strict active-object inventory는 제외됐다. 함수 단위 frontier에서 교집합 3개는 cancel/back, display VM base binder, field movement/collision으로 배제됐고, selected-root/table 및 global 0x62 add-descriptor scan도 opener 승격 0건이다. 4-byte aligned command 조건을 적용해 기존 0x47/0x4d operand 후보는 dword pointer table 내부 unaligned byte로 배제했다. top-menu sequence 0x004ddc6c는 wrapper 0x0047e6a0의 0x04 call operand로만 참조되며, wrapper와 parent context는 direct ref 0건이다. wrapper 직전 0x0047e688의 반복 7c e6 47 00은 opcode 0x7c가 아니라 0x0047e67c branch target 포인터로 해소됐다. 이 gate는 0x6e active group-key branch 2개와 0xe6 active-descriptor-count branch 1개로 wrapper 진입/거부를 나눈다. active group key 0x574544/0x574543은 VM 0x6d handler와 descriptor/display setup에서 쓰이고 field actor/collision subsystem에서도 소비되므로 ESC/X opener 전용 플래그가 아니다. 새 VM graph frontier는 0x0047e670의 apparent 0x14 byte도 linear opcode가 아니라 post-selectedRoot table 값으로 배제했다. 첫 dword 0x0002c614는 file-backed VA가 아니며, 0x0047e688은 이 table 내부 포인터일 뿐이다. 인접 0x004a2cb0 리소스 리스트는 compile/aaa/logo/title/btl_k 계열이라 intro/title context로 재분류되므로 평상시 opener로 승격하지 않는다. 새 input boundary에서도 0x0040c6cc는 0x0200 ESC/X bit를 clear하고 active descriptor cursor/slot을 되감는 cancel/back 소비자일 뿐 addDescriptor/top-menu sequence 근거가 없다. 0x0041d61b와 selector-state handlers는 메뉴가 열린 뒤의 내부 cursor/selector dispatcher로 확정되어 opener 후보에서 제외한다. 평상시 ESC/X opener는 이 내부층보다 위의 field mode/state transition 또는 descriptor attachment producer 쪽에 남았다.))zopener boundary JSON(out/hud_menu_opener_boundary_review.json)zopener frontierz(web/hud_menu_opener_frontier_review.html)zopener frontier JSON(out/hud_menu_opener_frontier_review.json)zselected-root frontierz/web/hud_menu_selected_root_frontier_review.html)zselected-root frontier JSON/out/hud_menu_selected_root_frontier_review.json)ztop sequence contextz-web/hud_menu_top_sequence_context_review.html)ztop sequence context JSON-out/hud_menu_top_sequence_context_review.json)zVM graph frontierz*web/hud_menu_vm_graph_frontier_review.html)zVM graph frontier JSONz*out/hud_menu_vm_graph_frontier_review.json)zactive group gatez.web/hud_active_group_gate_frontier_review.html)zactive group gate JSON.out/hud_active_group_gate_frontier_review.jsonr   r   )zinput consumer boundaryz+web/hud_input_consumer_boundary_review.html)zinput consumer boundary JSON+out/hud_input_consumer_boundary_review.json)zmode/state dispatcherr   )zmode/state JSON.out/hud_menu_mode_state_dispatcher_review.json)zHUD menu previewzweb/hud_menu_preview.html)zright menu JSON#out/menu_right_panel_ui_review.jsonzstatus UI expressionz)web/status_menu_ui_expression_review.htmlzstatus/menu VM tablesz$web/status_menu_vm_table_review.html)zdescriptor stackz%web/menu_descriptor_stack_review.htmlu   맵 애니메이션u*   layer1 0x40 애니메이션 실행 binding	candidateu'   영역 grounded / 실행 binding 후보zanimated maps animatedMapCountz, animated cells animatedCellCountz, visible binding #visibleMotionExecutionBindingProvenz!, resource-root command hits P/T *paletteCommandInsideExactResourceRootCount,tileWriteCommandInsideExactResourceRootCountz, live VM writes candidateVmTileWriteRefCountz, live root-bound )liveBufferRefsInsideAnimatedResourceRootsz, object-relative candidateCountanimatedRootCandidateCountz, redraw consumer redrawPathGroundedz, redraw alt-tile alternateTileSelectionFoundz, draw transform #drawTimeVisibleMotionTransformFoundz, tick direct refs directLiveBufferRefsInTickRoute%directLiveBufferRefsInPerFrameUpdatesz, active script candidate &activeObjectDelayedScriptRouteGroundedz, strict +0xec writes commandBoundaryTileWriteCountz, raw +0xec candidates rawTileWriteCandidateCountz, +0x64 frame writes %opcode20CommandBoundaryTileWriteCount%opcode18CommandBoundaryTileWriteCountz, +0x64 targets opcode20AttachTargetCountopcode18StateEntryTargetCountz, remaining roots uniqueRootCountz, remaining promoted $promotedAnimatedProducerCommandCountz, specialized strong strongSpecializedCandidateCountz, static frontier producer z$, historical runtime layer0 changed layer0Changedz' (not producer proof), palette binding  mapAnimationPaletteBindingStatusu  애니메이션 대상 셀, live tile writer handler, redraw consumer, 일반 draw tile rect 변환은 확정. tick route 직접 write, strict +0xec script, +0x64 frame script, remaining tile-write VM root scan, specialized tick/draw loop scan은 모두 음성. 통합 static frontier에서도 draw-time transform/resource root/active-object/frame-script/non-object/specialized loop/offset-shift visual은 producer로 승격하지 않는다. 남은 증거는 animated-map load/update dispatcher에서 0x40 dirty cell을 실제 visible-motion producer로 연결하는 정적 command/root chain이다. 과거 runtime layer0 변화는 참고만 하고 producer proof로 쓰지 않는다.))zstatic frontierz-web/map_animation_static_frontier_review.html)zexecution boundaryz0web/map_animation_execution_boundary_review.html)zshift hypothesisz.out/map_animation_shift_hypothesis_review.html)zanimation tilez"out/map_animation_tile_review.html)zexecution JSON0out/map_animation_execution_boundary_review.json)zpalette tracez)out/map_palette_handler_trace_review.htmlu	   상태창u   상태창 짧은 문구 선택u    의미 승격 / writer 미확정zcomment groups commentGroupCountz, actor tables actorTableCountz, 0x40 table records z
, meaning meaningCandidatez (meaningConfidencez), chapter lists chapterNumberListCountchapterTitleListCountz, selector source selectorSourceGroundedz, producer selectorProducerProbeStatusz, payload consumer statusPayloadConsumerGroundedz, actor branch postSelectorActorBranchGroundedz, producer proven selectorProducerProvenz, base binds objectA8BackingBaseBindCountz, base route active/text activeObjectOpcodeHextextStatusOpcodeHexz, backing +0 writes offset0WriteLikeCountz, write-like offsets writeLikeOffsetCountz$, dynamic +0 candidates/status-menu target0CandidateCounttarget0InStatusMenuPayloadCountz, target+0 roots z
 promoted statusCommentWriterPromotedz, value-source live writer promotedLiveWriterCountz, binding states statusCountsuz  문구 그룹/actor table, 40 14 inline selector array, 0x41b66d text/status handler, selector source, 상태창 payload 0x2f consumer, selector 뒤 actor-slot branch는 확정. 같은 +0 selector가 상태 문구 그룹뿐 아니라 장 번호/장 제목 리스트도 고르므로 게임 내 의미는 story/chapter selector로 승격한다. object+0xa8을 0x004576d8 backing base에 묶는 immediate bind는 2건 확정됐고, route도 active-object opcode 0x43 및 text/status 40 1b mode 1로 분리됐다. 상태 문구/장 제목 payload는 text/status route를 사용한다. 하지만 backing +0 selector byte 직접 write는 0건이다. object-VM dynamic selector writer 0x8c/0x8d/0x8f 전체 스캔에도 status/menu payload 내부 +0 writer는 0건이다. target +0 후보 52건은 root 문맥상 battle/monster/field active-object local writer라서 status/comment writer로 승격하지 않는다. save/load는 0x72 backing block을 복원할 수 있지만 live producer로 승격하지 않는다. selected-root +2/+3 primitive도 다른 route layer다. 남은 것은 이 backing +0 값을 공급하는 상위 state/scenario writer다.)r   )zselector meaningz/web/status_comment_selector_meaning_review.html)zvalue-source frontierz=web/status_comment_selector_value_source_frontier_review.html)zbase bind routez.web/status_comment_base_bind_route_review.html)zbacking base refsz/web/status_comment_backing_base_ref_review.html)ztarget +0 contextz5web/status_comment_target0_writer_context_review.html)zcomment selector bindingz/web/status_comment_selector_binding_review.html)zproducer boundary JSON0out/status_comment_producer_boundary_review.json)zbacking writer scanz+web/status_comment_backing_writer_scan.html)zbacking writer JSON+out/status_comment_backing_writer_scan.json)zindirect writer scanz7web/status_comment_indirect_selector_writer_review.html)zindirect writer JSON7out/status_comment_indirect_selector_writer_review.jsonr   r   z%hwanse-static-analysis-remaining-work):z/out/battle_skill_implementation_gap_review.jsonz/out/battle_effect_animation_pattern_review.jsonz,out/battle_effect_runner_binding_review.jsonz"out/cns_precut_catalog_review.jsonz&out/field_encounter_static_review.jsonz1out/field_encounter_producer_boundary_review.jsonz4out/field_active_object_trigger_boundary_review.jsonz2out/field_encounter_formation_boundary_review.jsonz8out/field_encounter_formation_opcode_cluster_review.jsonz-out/map_animation_static_frontier_review.jsonz/out/scene_event_text_consumer_trace_review.jsonrw   ry   rz   r{   r}   r   r   r   ru   r   r   r   z%out/strict_event_source_coverage.jsonz"out/runtime_trace_feasibility.jsonr   r   r   r   r   r   r   r   z$out/status_menu_vm_table_review.jsonz)out/map_animation_exe_pattern_review.jsonr   z0out/map_animation_live_buffer_writer_review.jsonz8out/map_animation_object_relative_tile_write_review.jsonz-out/map_animation_redraw_consumer_review.jsonz1out/map_animation_draw_tile_transform_review.jsonr   z=out/map_animation_active_object_script_tile_write_review.jsonz5out/map_animation_frame_script_tile_write_review.jsonz8out/map_animation_non_object_tile_write_root_review.jsonz7out/map_animation_specialized_loop_boundary_review.jsonz out/runtime_map_layer0_poll.jsonz1out/runtime_map_layer0_viewport_match_review.jsonz-out/map_animation_resource_binding_probe.jsonz)out/status_menu_ui_expression_review.jsonz/out/status_comment_selector_binding_review.jsonz/out/status_comment_selector_meaning_review.jsonz=out/status_comment_selector_value_source_frontier_review.jsonz.out/status_comment_base_bind_route_review.jsonz/out/status_comment_backing_base_ref_review.jsonz5out/status_comment_target0_writer_context_review.jsonr   r   r   c              3  2   K   | ]  }|d    dk(  sd  yw)r:   r4   r   N .0items     r   	<genexpr>zbuild.<locals>.<genexpr>9       RdtG}	7QR   c              3  2   K   | ]  }|d    dk(  sd  yw)r:   r>   r   Nr   r   s     r   r   zbuild.<locals>.<genexpr>:  s     &`Td7mO_>_q&`r   c              3  2   K   | ]  }|d    dk(  sd  yw)r:   rD   r   Nr   r   s     r   r   zbuild.<locals>.<genexpr>;  r   r   c              3  2   K   | ]  }|d    dk(  sd  yw)r:   r   r   Nr   r   s     r   r   zbuild.<locals>.<genexpr><  s     !Vg+9U!!Vr   )	itemCountsettledCountimplementationCountblockedCountr   )versionkindsourceArtifactsr   items)r   r   r   joinlensum)Hcnscns_summarybattle_implbattle_effectbattle_effect_runner
hit_windowfield_static
field_stepfield_producerfield_active_objectfield_tick_route	formationformation_streamformation_clusteropcode1c
scene_textselected_textselected_root_writerselected_root_opcode_matrixselector_root_preentryselector_address_predecessorsave_selector_dispatchgeneric_vm_streamgeneric_vm_opcode2ageneric_vm_opcode14display_vm_root_refsscene_routescene_route_boundaryglobal_mode_stateroute_opcode08route_mergeroute_strictroute_runtimemenu	status_uistatus_menu_vmstatus_menu_vm_summaryhud_menu_openerhud_menu_frontierhud_menu_selected_root_frontierhud_menu_mode_statehud_menu_top_contexthud_menu_vm_graphhud_active_group_gatehud_input_boundarystatus_comment_bindingstatus_comment_summarystatus_comment_producerstatus_comment_backing_writerstatus_comment_backing_basestatus_comment_base_routestatus_comment_indirect_writerstatus_comment_meaningstatus_comment_target0_contextstatus_comment_value_sourcemap_animmap_anim_static_frontiermap_anim_boundarymap_anim_tilemap_anim_resource_probemap_anim_live_writermap_anim_object_relativemap_anim_redraw_consumermap_anim_draw_transformmap_anim_tick_routemap_anim_active_scriptmap_anim_frame_scriptmap_anim_non_object_tile_rootmap_anim_specialized_loopmap_anim_runtime_pollbattle_effect_runner_readyr   sH                                                                           r   buildrG  /   s?   
4
5C#,K)$QRSKI&STUM"9-W#XY#FGHJ9%IJKL#NOPJY'VWXN!),^"_`y)Z[\	"RSTIy)WXY	*` aby!JKLH#PQRJI&UVWM"9-]#^_"))4]*^"_&'OP#*95f+g#h &'RS	*[ \]!),["\]!),T"UV"9-V#WX)$PQRK"9-X#YZ	*R STOPNDEK@AL>?M67DABIABN$^4i(NOPO	*P QR&-i8e.f&g#!),X"YZ"9-X#YZ	*R ST#I.Z$[\ +T!UV&'TU$%;<%i0^&_`$+I6_,`$a!"))4a*b"c '	2^(_ `%,Y7l-m%n"$Y/\%]^%,Y7j-k%l""))4o*p"qy!HIJH&y1\']^	*X YZI&FGHM%i0[&\]"9-[#\]&y1g'hi&y1\']^%i0_&`a!),R"ST$Y/j%kl#I.a$bc$+I6l,m$n! '	2g(h i%&DE 	115: 	POO91=B	POO3Q71<	P !$$%92>BVBZBZ[npqBrr	P !$$%7<@T@X@XYjlm@nn		P
 !$$%FJaO  2-jnn-A1EFa
WbdeHfGg h)oo.KQOP Q)oo.EqIJL R	
$ 5"<YBR?Y;_| 1 12I1 MN O**7*;*;<]_`*a)b c''++,@!DEQG[G_G_`suvGwFxx{'++,>BC1EYE]E]^oqrEsDt u'';'?'?@acd'e&ffhj . ] S WR%	
0 50$[__5La%P$Q R*/@!DE F&&1oo6NPQ&R%SU @KL	
 *-5!,"2"23E|GWGWXfhiGj"k!l m))5)9)9:`bc)d(e f%%/^^4Y[\%]$^ _--@-D-DE\^_-`,a b//?/C/CDuwx/y.z {%%3%7%78VXY%Z$[[df f	
0 *70!)--0CQ"G!H I!!*/I1!M N O%%.]]3PRS%T$U V$$5$9$9:]_d$e#f g/334SUVWX Y++;+?+?@acd+e*f g!!1!5!5h@R!S TV z	
. ":=$\ $\& $\z~~6N'O&P $\ Q' $\'1~~6R'S&T$\U*$\*7*;*;<N*O)P$\Q)$\ *>)A)AB^`a)b(c$\d($\ )=(@(@A](^'_	$\`%	$\
 &:%=%=>Y%Z$[$\
\6$\ /223QSTUV$\ WX$\ /223PRSTU$\VE$\ *--.Y[\]^$\ _`$\ *--.XZ[\]$\^($\ )?(B(BCu(v'w$\x$\ 699:WYefg$\h$\ 9<<=QRS$\T($\ )?(B(BC\(]'^$\_'$\  (>'A'AB]'^&_!$\ `*!$\" +A*D*DEw*x)y#$\"z/#$\$ 0A/D/DEc/d.e%$\$ fg%$\& %((89'$\&:''$\( (9'<'<=Z\]'^&_)$\(`%)$\* &7%:%:;XZ[%\$]+$\*^<+$\. (++,BKPQ/$\. RS/$\0 (++,E{ST1$\0U#1$\2 $8#;#;<Z\g#h"i3$\2j(3$\4 )<(?(?@]_`(a'b5$\4c.5$\8 '**+>BC9$\8 DE9$\: '**+CQGH;$\: IJ;$\< '**+H!LM=$\<N)=$\> *59S)T(U?$\>V"?$\@ #7":":;UWX"Y!ZA$\@[%A$\B &4%7%78Y%Z$[C$\B\C$\D  +|<=E$\D>*E$\F +7*:*:;]_`*a)bG$\Fc,G$\H -:,=,=l,K+LI$\H M[I$\L j[F	
P (3C%&7&;&;<VXY&Z%[ \##4#8#89NPQ#R"S T&&7&;&;<SUV&W%X Y,'++,HI  ENbNfNf  hD  OE  F F**E*I*IJa*b)c d""8"<"<=V"W!X Y''8'<'<=T'U&V W22C2G2GHegh2i1j k'';'?'?@^`k'l&m n,,@,D,DE[]h,i+j k,&**+H!LMQ&**+H!LM N$$5$9$9:V$W#X Y**;*?*?@`*a)b c++<+@+@Ab+c*d!f$ W3(	
T *= R  R%  Rdhhx&C%D  R E  R'mmHi@A RB" R"8"<"<=QST"U!V RVW R *--.BAFG RH R .112NOP	 RQ.	 R #&&'LaPQ R RS R #&&'GKL RM* R +<*?*?@[]^*_)` Ra# R $5#8#89SUV#W"X RY, R -L,O,OPlno,p+q Rr! R "A!D!DEhjk!l m Rn! R "A!D!DEjlw!x y Rz2 R (++,H+VW R XY R (++,JKXY RZ. R  /C.F.FGdfq.r-s! R t! R" /223PR]^_# R"`(# R$ ):(=(=>hju(v'w% R$x#% R& $7#:#:;cep#q"r' R&s ' R( !2 5 56TVa bc) R(d%) R* &;%>%>?OQ\%]$^+ R*_0+ R. ),,-DkRS/ R. TU/ R0 ),,-FTU1 R0V(1 R2 )=(@(@AQS^(_'`3 R2a"3 R4 #5"8"89I;"W!X5 R4Y"5 R8 &))*?MN9 R8 OP9 R: &))*H+VW; R: XY; R< &))*OQ\]^= R<_'= R> (;'>'>?]'^&_? R>`? R@ .112NOPA RD KSA	
F *A Ca a. a.@-BSBSTfhiBj!k l a m" a"*,,/BMDUDUViklDm"n!oap#a#4#8#89^`e#f"gah2a +../[]^_`	a ab	a
 +../]_`aba
c"a #7":":;Y[\"]!^a_#a $8#;#;<gij#k"lam#a $<#?#?@PRS#T"Ua VWa ,//0LaPQaR#a $<#?#?@TV[#\"]a^#a $<#?#?@]_d#e"fag"a #:"="=>cej"k!lam$a '**+LaPQa RSa '**+RTUVWaX+a  ,?+B+BCkmr+s*t!a u'!a" (>'A'ABacd'e&f#a"g(#a$ )?(B(BC_ab(c'd%a$e&%a& '<&?&?@gij&k%l'a& mn'a( ),,-TVWXY)a(Z!)a* "7!:!:;VXY!Z [+a* \]+a, ),,-LaPQ-a,R#-a. $A#D#DEVXY#Z"[/a.\&/a0 'D&G&GHnpq&r%s1a0t&1a2 '@&C&CDegh&i%j3a2k,3a4 -E,H,HI`bm,n+o5a4p55a6 6K5N5N`e5f4g7a6h#7a: $,<<0RT]#^"_;a> CM.	
`  5 <S S/ S"8"<"<=PRS"T!U S V  S 6 : :;La PQSR&S&<&@&@AUWX&Y%ZS[S 2556H)TUSVS +../BINO	SP!	S *--.FJKS LMS *--.EqIJSK#S $;#>#>?WY^#_"`SaS 4778UWmWqWq  sP  R[  X\  ]  ^S^$S %<$?$?@_af$g#hSi S !8 ; ;<]_d efSg#S $;#>#>?WY^#_"`SaS :==>\^ijkSl*S -001H+VWS XYS  -001FTU!S V%!S" &C%F%FG^`k%l$m#S"n&#S$ 'D&G&GH^`k&l%m%S$n5%S( 2556M{[\)S( ]^)S* 2556WYdef+S*g"+S, #A"D"DEVXc"d!e-S,f-S. ;>>?\^ijk/S.l,/S0 -H,K,KLegr,s+t1S0u"1S2 #9"<"<^R"P!Q3S6 QE1	
I
vEr 7;
z UReRR#&&`U&`#`ReRR!!V!VV
 MG Gr   c                   | d   }dj                  d |j                         D              }g }| d   D ]  }dj                  d |d   D              }|j                  dt        |d          d	t        |d
          dt        |d          dt        |d          dt        |d          dt        |d          d| d        d| ddj                  |       dS )Nr   r   c              3  X   K   | ]"  \  }}d t        |       dt        |       d $ yw)z<div class='card'><b>z
</b><span>z</span></div>N)r#   )r   kvs      r   r   zrender_html.<locals>.<genexpr>D  s3      Aq  !vZ!v]Cs   (*r   c              3  j   K   | ]+  \  }}d t        t        |             dt        |       d - yw)z<a class='chip' href=''>z</a>N)r#   r(   )r   labelr'   s      r   r   zrender_html.<locals>.<genexpr>J  s7      
t %QtDz]O2ahZtD
s   13r=   z;<article class='item'><div class='head'><span class='area'>r8   z</span><span class='state r:   rM  r;   z</span></div><h2>r9   z</h2><p class='summary'>u*   </p><p class='next'><b>다음 증거:</b> r<   z</p><div class='links'>z</div></article>u	  <!doctype html>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Static Analysis Remaining Work</title>
<style>
  :root {
    --bg:#f5f6f8; --panel:#fff; --line:#d9dee7; --text:#20242b; --muted:#687080;
    --ok:#1b7f46; --impl:#2459a6; --blocked:#9b3b30; --candidate:#986600;
  }
  * { box-sizing:border-box; }
  body { margin:0; background:var(--bg); color:var(--text); font-family:system-ui,-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif; }
  main { width:min(1120px, calc(100vw - 28px)); margin:0 auto; padding:24px 0 36px; }
  h1 { margin:0 0 6px; font-size:28px; }
  h2 { margin:8px 0 8px; font-size:18px; }
  p { margin:0; }
  .lead,.summary,.next { color:var(--muted); line-height:1.45; }
  .cards { display:grid; grid-template-columns:repeat(auto-fit,minmax(160px,1fr)); gap:10px; margin:16px 0; }
  .card,.item { background:var(--panel); border:1px solid var(--line); border-radius:8px; padding:12px; }
  .card b { display:block; color:var(--muted); font-size:12px; }
  .card span { font-size:22px; font-weight:700; }
  .list { display:grid; gap:12px; }
  .head { display:flex; justify-content:space-between; gap:10px; align-items:center; }
  .area { color:var(--muted); font-weight:700; font-size:13px; }
  .state { border-radius:999px; padding:4px 8px; font-size:12px; font-weight:700; background:#eef2f7; }
  .state.settled { color:var(--ok); }
  .state.implementation { color:var(--impl); }
  .state.blocked { color:var(--blocked); }
  .state.candidate { color:var(--candidate); }
  .next { margin-top:8px; }
  .links { display:flex; flex-wrap:wrap; gap:6px; margin-top:10px; }
  .chip { display:inline-flex; min-height:30px; align-items:center; padding:5px 9px; border:1px solid var(--line); border-radius:7px; background:#eef2f7; color:var(--text); text-decoration:none; font-size:13px; }
  .chip:hover { background:#dfe7f3; }
  @media (max-width:720px) { main { width:min(100vw - 18px, 1120px); padding-top:16px; } .head { display:block; } .state { display:inline-block; margin-top:6px; } }
</style>
<main>
  <h1>Static Analysis Remaining Work</h1>
  <p class="lead">EXE 정적 분석에서 이미 확정된 것, 웹 구현 요구, 그리고 아직 producer/root 증거가 막힌 것을 분리한 작업 큐입니다.</p>
  <div class="cards">z</div>
  <section class="list">z</section>
</main>
)r   r   appendr#   )r   r   cardsrowsr   r=   s         r   render_htmlrR  B  s,   9oGGG MMO E DW 
 
#G}
 
 	445d6lO3D E""#DM"2!32a\8J6K5L MT']#$ %""#DO"4!5 6556tF|_4E F""' )		

%J W  (M( (r   c                 V   t         j                  d       t        j                  d       t               } t         dz  j	                  t        j                  | dd      d       t        |       }t        d	z  j	                  |d       t        d
| d   d    d| d   d    d       y )NT)exist_okz#static_analysis_remaining_work.jsonF),:)ensure_ascii
separatorsr
   r   z#static_analysis_remaining_work.htmlz&wrote static analysis remaining work (r   r   z
 blocked, r   z candidates))	r   mkdirWEBrG  
write_textr   dumpsrR  print)r   	html_texts     r   mainr_    s    IItIIItI7D00<<

4e
C =  D!I00<<YQX<Y		ON+,JtIGW7X6YYe	gr   __main__)r   r"   returndict[str, Any])r   rb  ra  rb  )r   r   ra  r"   )r'   r"   ra  r"   )ra  rb  )r   rb  ra  r"   )ra  None)__doc__
__future__r   r    r   pathlibr   typingr   __file__resolveparentsROOTr   rZ  r   r   r#   r(   rG  rR  r_  __name__r   r   r   <module>rm     s    #     H~''*
Ul
Ul24
HPf>B  zF r   