{"version":1,"kind":"hwanse-static-analysis-remaining-work","sourceArtifacts":["out/battle_skill_implementation_gap_review.json","out/battle_effect_animation_pattern_review.json","out/battle_effect_runner_binding_review.json","out/cns_precut_catalog_review.json","out/field_encounter_static_review.json","out/field_encounter_producer_boundary_review.json","out/field_active_object_trigger_boundary_review.json","out/field_encounter_formation_boundary_review.json","out/field_encounter_formation_opcode_cluster_review.json","out/map_animation_static_frontier_review.json","out/scene_event_text_consumer_trace_review.json","out/selected_root_live_writer_frontier_review.json","out/selected_root_opcode_matrix_review.json","out/selector_root_preentry_ref_review.json","out/selector_address_predecessor_bridge_review.json","out/save_selector_dispatch_table_context.json","out/generic_vm_stream_producer_frontier_review.json","out/generic_vm_opcode2a_parent_stream_review.json","out/display_vm_root_ref_context_review.json","out/scene_event_vm_route_boundary_review.json","out/global_mode_state_frontier_review.json","out/save_selector_opcode08_activation_windows.json","out/save_selector_merge_bridge_matrix.json","out/strict_event_source_coverage.json","out/runtime_trace_feasibility.json","out/menu_right_panel_ui_review.json","out/hud_menu_opener_boundary_review.json","out/hud_menu_opener_frontier_review.json","out/hud_menu_selected_root_frontier_review.json","out/hud_menu_top_sequence_context_review.json","out/hud_active_group_gate_frontier_review.json","out/hud_input_consumer_boundary_review.json","out/hud_menu_mode_state_dispatcher_review.json","out/status_menu_vm_table_review.json","out/map_animation_exe_pattern_review.json","out/map_animation_execution_boundary_review.json","out/map_animation_live_buffer_writer_review.json","out/map_animation_object_relative_tile_write_review.json","out/map_animation_redraw_consumer_review.json","out/map_animation_draw_tile_transform_review.json","out/map_animation_tick_route_review.json","out/map_animation_active_object_script_tile_write_review.json","out/map_animation_frame_script_tile_write_review.json","out/map_animation_non_object_tile_write_root_review.json","out/map_animation_specialized_loop_boundary_review.json","out/runtime_map_layer0_poll.json","out/runtime_map_layer0_viewport_match_review.json","out/map_animation_resource_binding_probe.json","out/status_menu_ui_expression_review.json","out/status_comment_selector_binding_review.json","out/status_comment_selector_meaning_review.json","out/status_comment_selector_value_source_frontier_review.json","out/status_comment_base_bind_route_review.json","out/status_comment_backing_base_ref_review.json","out/status_comment_target0_writer_context_review.json","out/status_comment_producer_boundary_review.json","out/status_comment_backing_writer_scan.json","out/status_comment_indirect_selector_writer_review.json"],"summary":{"itemCount":10,"settledCount":3,"implementationCount":0,"blockedCount":5,"candidateCount":2},"items":[{"area":"전투","title":"전투 계산/타격 window","state":"settled","stateLabel":"EXE 분석 완료","summary":"hit events 230/230, runner gap 0, static gap 0","next":"새 기술 오류가 보이면 runner 구현/표시 테이블 문제로 보고, EXE 미확정으로 되돌리지 않는다.","links":[["battle analysis","web/battle_analysis.html"],["hit window JSON","out/battle_hit_window_gap_review.json"],["support/status policy JSON","out/battle_support_status_policy_review.json"]]},{"area":"전투","title":"전투 이펙트 실행 요구","state":"settled","stateLabel":"정적 요구/웹 결속 완료","summary":"review flags 0, execution requirements 52, engine/page binding 6/6 + 30/30, effect render pages 3/3","next":"EXE child/helper/random placement 요구와 active page 결속은 완료됐다. 새 시각 오류는 개별 effect transform/render tuning으로 처리하고, EXE 미확정으로 되돌리지 않는다.","links":[["effect patterns","web/battle_effect_animation_pattern_review.html"],["runner binding","out/battle_effect_runner_binding_review.html"]]},{"area":"CNS","title":"CNS source-rect/precut catalog","state":"settled","stateLabel":"후보 정리 완료","summary":"descriptor assets 114, fixed grids 6, unbound candidates 0","next":"aaa/compile false-positive는 제거했다. 새 CNS rect 문제는 catalog를 우선 근거로 삼는다.","links":[["CNS catalog","out/cns_precut_catalog_review.html"]]},{"area":"필드 인카운트","title":"랜덤 전투 producer","state":"blocked","stateLabel":"정적 producer 미발견","summary":"RNG call sites 51; direct field evidence 0; movement RNG refs 0; active-object route proof 0; tick-route promotable calls 0; producer surfaces 0 promoted","next":"좌표 업데이트 함수, known field tick route, manual active-object bridge 안에는 없다. higher-level mode/state dispatcher에서 step success와 battle setup을 연결하는 증거가 필요하다.","links":[["producer boundary","web/field_encounter_producer_boundary_review.html"],["tick route boundary JSON","out/field_encounter_tick_route_boundary_review.json"],["active-object boundary","web/field_active_object_trigger_boundary_review.html"],["field encounter","web/field_encounter_static_review.html"],["step boundary","web/field_step_encounter_boundary_review.html"],["opcode 0x1c","web/field_rng_selector_opcode1c_review.html"]]},{"area":"필드 인카운트","title":"전투 편성/몬스터 producer","state":"blocked","stateLabel":"consumer만 grounded","summary":"selector roots 93, monster roots 58, map+monster roots 0, cluster producer False, stream refs 0, stream owners with maps 3, stream status producer-unbound","next":"opcode 0x1e는 battle actor formation consumer로 확정됐다. stream 후보는 selector/resource root 내부 inline anchor이고 exact pointer ref가 없어, 필드 맵에서 이 stream을 고르는 producer는 아직 없다.","links":[["formation boundary","web/field_encounter_formation_boundary_review.html"],["opcode cluster","web/field_encounter_formation_opcode_cluster_review.html"],["formation stream","web/field_encounter_formation_stream_review.html"],["formation context","web/field_encounter_formation_context_review.html"]]},{"area":"Scene/Event","title":"텍스트 consumer와 route binding","state":"blocked","stateLabel":"consumer grounded / route blocked","summary":"text consumer proof True; route binding proof False; selected root consumer True; selector/root writers 3; selector byte writer True; selected executor True; root opcode matrix exact 0x07/0x09 0/0; pre-entry current refs source/predecessor/address 0/75, address bridge proof False, class context-only-target-side-resource-adjacency, promoted False; dispatch table proof False; save slice anchored True; runtime dispatch proof False; generic VM stream producers 0/9, direct unclassified 0, 0x2a fanout calls 2; display VM root refs object/create/store 82/1, root ref opener False; 0x2a active +ec hits 0, 0x2a raw/boundary/promoted 53/23/0; direct execution root False; route surfaces 11 blocked; opcode08 promotes False; merge proof False; strict source coverage 4.02%; historical runtime proof False (not primary)","next":"프롬프트 표시 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는 기본 경로로 쓰지 않는다.","links":[["route boundary JSON","out/scene_event_vm_route_boundary_review.json"],["text consumer","web/scene_event_text_consumer_trace_review.html"],["selected text root","web/selected_scene_text_root_consumer_review.html"],["selected root writer","web/selected_root_live_writer_frontier_review.html"],["selected root writer JSON","out/selected_root_live_writer_frontier_review.json"],["selected root opcode matrix","web/selected_root_opcode_matrix_review.html"],["selected root opcode matrix JSON","out/selected_root_opcode_matrix_review.json"],["selector root pre-entry","web/selector_root_preentry_ref_review.html"],["selector root pre-entry JSON","out/selector_root_preentry_ref_review.json"],["address predecessor bridge","web/selector_address_predecessor_bridge_review.html"],["address predecessor JSON","out/selector_address_predecessor_bridge_review.json"],["dispatch table context","web/save_selector_dispatch_table_context.html"],["dispatch table JSON","out/save_selector_dispatch_table_context.json"],["generic VM stream","web/generic_vm_stream_producer_frontier_review.html"],["generic VM stream JSON","out/generic_vm_stream_producer_frontier_review.json"],["display VM root refs","web/display_vm_root_ref_context_review.html"],["display VM root refs JSON","out/display_vm_root_ref_context_review.json"],["opcode 0x2a parent streams","web/generic_vm_opcode2a_parent_stream_review.html"],["opcode 0x2a JSON","out/generic_vm_opcode2a_parent_stream_review.json"],["execution route","web/scene_event_vm_execution_route_review.html"],["opcode08 windows JSON","out/save_selector_opcode08_activation_windows.json"],["merge bridge JSON","out/save_selector_merge_bridge_matrix.json"],["strict coverage","out/strict_event_source_coverage.html"]]},{"area":"전역 Mode/State","title":"상위 mode/state dispatcher","state":"blocked","stateLabel":"cross-domain scanned / producer pending","summary":"cross-domain funcs 19, review-required 0, promoted producers 0, selected-root primitives True, opcode matrix promoted False, dispatch proof False, generic VM producer False, generic VM unclassified direct 0, display root opener False, display root object refs 82, opcode2a active/promoted 0/0, save/load bridge True, menu internal excluded True, field movement excluded True","next":"입력/메뉴/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가 다음 증거다.","links":[["global mode/state frontier","web/global_mode_state_frontier_review.html"],["global mode/state JSON","out/global_mode_state_frontier_review.json"],["selected root writer","web/selected_root_live_writer_frontier_review.html"],["selected root opcode matrix","web/selected_root_opcode_matrix_review.html"],["dispatch table context","web/save_selector_dispatch_table_context.html"],["generic VM stream","web/generic_vm_stream_producer_frontier_review.html"],["display VM root refs","web/display_vm_root_ref_context_review.html"],["opcode 0x2a parent streams","web/generic_vm_opcode2a_parent_stream_review.html"],["opcode 0x14 branch","web/generic_vm_opcode14_branch_review.html"],["HUD mode/state","web/hud_menu_mode_state_dispatcher_review.html"],["scene route boundary JSON","out/scene_event_vm_route_boundary_review.json"],["encounter producer","web/field_encounter_producer_boundary_review.html"],["map animation tick JSON","out/map_animation_tick_route_review.json"]]},{"area":"HUD/Menu","title":"ESC/X 메뉴 opener","state":"blocked","stateLabel":"payload grounded / opener pending","summary":"right menu status: top-menu-object-and-right-content-payload-grounded-opener-pending; status UI: status-window-expression-grounded-core; 0x40 VM tables 16+4; ESC opener False; strict inventory 0x62/0x9f 0/0; frontier intersections 3, open candidates 0; selected-root promotions 0, 0x62 promoted 0; 0x62 rejected 4; top sequence refs/wrapper refs 1/0, top wrapper calls sequence True, parent intro/title-resource-context; VM graph op14 reject True, op14 candidates 587, graph opener False; active-group gate active-group/descriptor gate grounded; opener producer still unproven, group writes/field consumers 6/13; display VM root refs generic display/object VM root references classified; no opener producer promoted; input boundary input/cancel consumers grounded; opener producer still unproven; cancel/add/top True/False/False; internal dispatcher True, opener False","next":"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 쪽에 남았다.","links":[["opener boundary JSON","out/hud_menu_opener_boundary_review.json"],["opener frontier","web/hud_menu_opener_frontier_review.html"],["opener frontier JSON","out/hud_menu_opener_frontier_review.json"],["selected-root frontier","web/hud_menu_selected_root_frontier_review.html"],["selected-root frontier JSON","out/hud_menu_selected_root_frontier_review.json"],["top sequence context","web/hud_menu_top_sequence_context_review.html"],["top sequence context JSON","out/hud_menu_top_sequence_context_review.json"],["VM graph frontier","web/hud_menu_vm_graph_frontier_review.html"],["VM graph frontier JSON","out/hud_menu_vm_graph_frontier_review.json"],["active group gate","web/hud_active_group_gate_frontier_review.html"],["active group gate JSON","out/hud_active_group_gate_frontier_review.json"],["display VM root refs","web/display_vm_root_ref_context_review.html"],["display VM root refs JSON","out/display_vm_root_ref_context_review.json"],["input consumer boundary","web/hud_input_consumer_boundary_review.html"],["input consumer boundary JSON","out/hud_input_consumer_boundary_review.json"],["mode/state dispatcher","web/hud_menu_mode_state_dispatcher_review.html"],["mode/state JSON","out/hud_menu_mode_state_dispatcher_review.json"],["HUD menu preview","web/hud_menu_preview.html"],["right menu JSON","out/menu_right_panel_ui_review.json"],["status UI expression","web/status_menu_ui_expression_review.html"],["status/menu VM tables","web/status_menu_vm_table_review.html"],["descriptor stack","web/menu_descriptor_stack_review.html"]]},{"area":"맵 애니메이션","title":"layer1 0x40 애니메이션 실행 binding","state":"candidate","stateLabel":"영역 grounded / 실행 binding 후보","summary":"animated maps 5, animated cells 1200, visible binding False, resource-root command hits P/T 0/0, live VM writes 6, live root-bound 0, object-relative 79/0, redraw consumer True, redraw alt-tile False, draw transform False, tick direct refs 0+0, active script candidate True, strict +0xec writes 0, raw +0xec candidates 445, +0x64 frame writes 0+0, +0x64 targets 138/855, remaining roots 95, remaining promoted 0, specialized strong 0, static frontier producer 0, historical runtime layer0 changed True (not producer proof), palette binding candidate-roots-exist-but-map-execution-binding-unproven","next":"애니메이션 대상 셀, 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로 쓰지 않는다.","links":[["static frontier","web/map_animation_static_frontier_review.html"],["execution boundary","web/map_animation_execution_boundary_review.html"],["shift hypothesis","out/map_animation_shift_hypothesis_review.html"],["animation tile","out/map_animation_tile_review.html"],["execution JSON","out/map_animation_execution_boundary_review.json"],["palette trace","out/map_palette_handler_trace_review.html"]]},{"area":"상태창","title":"상태창 짧은 문구 선택","state":"candidate","stateLabel":"의미 승격 / writer 미확정","summary":"comment groups 9, actor tables 21, 0x40 table records 4, meaning story/chapter selector for status/menu context (high-consumer-evidence-writer-unproven), chapter lists 8/8, selector source True, producer inline-vm-array-consumer-grounded-producer-pending, payload consumer True, actor branch True, producer proven False, base binds 2, base route active/text 0x43/0x40 0x1b, backing +0 writes 0, write-like offsets 16, dynamic +0 candidates/status-menu 52/0, target+0 roots 10 promoted False, value-source live writer 0, binding states {'partly-scene-root-contained': 7, 'local-pointer-block-owned': 2}","next":"문구 그룹/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다.","links":[["status UI expression","web/status_menu_ui_expression_review.html"],["selector meaning","web/status_comment_selector_meaning_review.html"],["value-source frontier","web/status_comment_selector_value_source_frontier_review.html"],["base bind route","web/status_comment_base_bind_route_review.html"],["backing base refs","web/status_comment_backing_base_ref_review.html"],["target +0 context","web/status_comment_target0_writer_context_review.html"],["comment selector binding","web/status_comment_selector_binding_review.html"],["producer boundary JSON","out/status_comment_producer_boundary_review.json"],["backing writer scan","web/status_comment_backing_writer_scan.html"],["backing writer JSON","out/status_comment_backing_writer_scan.json"],["indirect writer scan","web/status_comment_indirect_selector_writer_review.html"],["indirect writer JSON","out/status_comment_indirect_selector_writer_review.json"],["status/menu VM tables","web/status_menu_vm_table_review.html"]]}]}