{"version":1,"kind":"hwanse-battle-child-target-renderer-gap-review","source":"tools/build_battle_child_target_renderer_gap_review.py","runtimeUsed":false,"inputs":["out/battle_child_target_renderer_plan_review.json","web/engine/battle/animation.js","web/battle_skill_timeline_review.html","web/battle_formula_calculator.html","web/battle_simulator.html"],"status":"renderer-plan-consumed-with-partial-motion-semantics","summary":{"targetRendererPlanRows":11,"rendererPlanClassCounts":{"counter-held-direct-frame":3,"motion-boundary-loop":7,"nested-child-spawner":1},"implementationRequirementCounts":{"apply-boundary-loop-lifetime":7,"apply-counter-held-lifetime":3,"apply-motion-step-until-branch":7,"apply-nested-repeat-counter":1,"consume-target-renderer-plan-json":11,"recursive-child-spawn-lifetime":1},"fulfilledRequirementCounts":{"apply-boundary-loop-lifetime":7,"apply-counter-held-lifetime":3,"apply-motion-step-until-branch":7,"apply-nested-repeat-counter":1,"consume-target-renderer-plan-json":11,"recursive-child-spawn-lifetime":1},"remainingGapCounts":{},"engineLoadsTargetRendererPlan":false,"engineCanConsumePageLoadedTargetRendererPlan":true,"activePagesLoadingTargetRendererPlan":3},"pageLoadStatus":{"timeline":{"loadsTargetRendererPlan":true,"loadsHelperVisual":true,"loadsHelperPosition":true,"loadsHelperSync":true},"formula":{"loadsTargetRendererPlan":true,"loadsHelperVisual":true,"loadsHelperPosition":true,"loadsHelperSync":true},"simulator":{"loadsTargetRendererPlan":true,"loadsHelperVisual":true,"loadsHelperPosition":true,"loadsHelperSync":true}},"interpretationNotes":["The EXE-derived target renderer plan is now loaded by the active timeline/calculator/simulator pages and consumed by the common battle animation engine API.","Counter-held lifetimes and nested repeat counters are consumed in preview generation.","Boundary-loop rows are previewed with the extracted spawn schedule, lifetime gate, and the common opcode 0x2d mode 0x09 x-axis projection. Exact phase/amplitude remains marked inside the motion boundary review as partial when runtime-specific values are not statically fixed."],"rows":[{"helperId":79,"targetVaHex":"0x004b8364","rendererPlanClass":"nested-child-spawner","skillLabels":["아타호 비기·맹호유성각 0x33 Lv=1","아타호 비기·맹호유성각 0x34 Lv=2","아타호 비기·맹호유성각 0x35 Lv=3","아타호 비기·맹호유성각 0x36 Lv=4"],"frames":[144],"rendererAction":"Draw parent frame [144] and execute nested spawner; repeat child creation 4 times toward 0x004b8434; apply target-script random ranges and anchor/link writes.","implementationRequirements":["consume-target-renderer-plan-json","apply-nested-repeat-counter","recursive-child-spawn-lifetime"],"fulfilledRequirements":["consume-target-renderer-plan-json","apply-nested-repeat-counter","recursive-child-spawn-lifetime"],"remainingGaps":[],"engineEvidence":{"planJsonLoadedByEngine":false,"planRuntimeApiPresent":true,"engineCanConsumePageLoadedPlan":true,"targetPlanIndexerPresent":true,"targetPlanLookupPresent":true,"targetPlanPassedToHelperFrames":true,"counterHeldLifetimePresent":true,"boundaryLoopLifetimePresent":true,"boundaryLoopMotionProjectionPresent":true,"nestedRepeatPresent":true,"currentHelperEffectFramesUsesVisual":true}},{"helperId":95,"targetVaHex":"0x004b9468","rendererPlanClass":"motion-boundary-loop","skillLabels":["린샹 암각·영상승룡파 0x15 Lv=1","린샹 빙조권 0x19 Lv=None"],"frames":[186],"rendererAction":"Spawn frame [186] 17 time(s) every 2 gate tick(s); advance child with opcode 0x2d motion until y-boundary branches end the child.","implementationRequirements":["consume-target-renderer-plan-json","apply-boundary-loop-lifetime","apply-motion-step-until-branch"],"fulfilledRequirements":["consume-target-renderer-plan-json","apply-boundary-loop-lifetime","apply-motion-step-until-branch"],"remainingGaps":[],"engineEvidence":{"planJsonLoadedByEngine":false,"planRuntimeApiPresent":true,"engineCanConsumePageLoadedPlan":true,"targetPlanIndexerPresent":true,"targetPlanLookupPresent":true,"targetPlanPassedToHelperFrames":true,"counterHeldLifetimePresent":true,"boundaryLoopLifetimePresent":true,"boundaryLoopMotionProjectionPresent":true,"nestedRepeatPresent":true,"currentHelperEffectFramesUsesVisual":true}},{"helperId":96,"targetVaHex":"0x004b939c","rendererPlanClass":"motion-boundary-loop","skillLabels":["린샹 암각·영상승룡파 0x16 Lv=2"],"frames":[184],"rendererAction":"Spawn frame [184] 7 time(s) every 1 gate tick(s); advance child with opcode 0x2d motion until y-boundary branches end the child.","implementationRequirements":["consume-target-renderer-plan-json","apply-boundary-loop-lifetime","apply-motion-step-until-branch"],"fulfilledRequirements":["consume-target-renderer-plan-json","apply-boundary-loop-lifetime","apply-motion-step-until-branch"],"remainingGaps":[],"engineEvidence":{"planJsonLoadedByEngine":false,"planRuntimeApiPresent":true,"engineCanConsumePageLoadedPlan":true,"targetPlanIndexerPresent":true,"targetPlanLookupPresent":true,"targetPlanPassedToHelperFrames":true,"counterHeldLifetimePresent":true,"boundaryLoopLifetimePresent":true,"boundaryLoopMotionProjectionPresent":true,"nestedRepeatPresent":true,"currentHelperEffectFramesUsesVisual":true}},{"helperId":96,"targetVaHex":"0x004b94ac","rendererPlanClass":"motion-boundary-loop","skillLabels":["린샹 암각·영상승룡파 0x16 Lv=2"],"frames":[186],"rendererAction":"Spawn frame [186] 7 time(s) every 1 gate tick(s); advance child with opcode 0x2d motion until y-boundary branches end the child.","implementationRequirements":["consume-target-renderer-plan-json","apply-boundary-loop-lifetime","apply-motion-step-until-branch"],"fulfilledRequirements":["consume-target-renderer-plan-json","apply-boundary-loop-lifetime","apply-motion-step-until-branch"],"remainingGaps":[],"engineEvidence":{"planJsonLoadedByEngine":false,"planRuntimeApiPresent":true,"engineCanConsumePageLoadedPlan":true,"targetPlanIndexerPresent":true,"targetPlanLookupPresent":true,"targetPlanPassedToHelperFrames":true,"counterHeldLifetimePresent":true,"boundaryLoopLifetimePresent":true,"boundaryLoopMotionProjectionPresent":true,"nestedRepeatPresent":true,"currentHelperEffectFramesUsesVisual":true}},{"helperId":97,"targetVaHex":"0x004b93e0","rendererPlanClass":"motion-boundary-loop","skillLabels":["린샹 암각·영상승룡파 0x17 Lv=3"],"frames":[184],"rendererAction":"Spawn frame [184] 9 time(s) every 1 gate tick(s); advance child with opcode 0x2d motion until y-boundary branches end the child.","implementationRequirements":["consume-target-renderer-plan-json","apply-boundary-loop-lifetime","apply-motion-step-until-branch"],"fulfilledRequirements":["consume-target-renderer-plan-json","apply-boundary-loop-lifetime","apply-motion-step-until-branch"],"remainingGaps":[],"engineEvidence":{"planJsonLoadedByEngine":false,"planRuntimeApiPresent":true,"engineCanConsumePageLoadedPlan":true,"targetPlanIndexerPresent":true,"targetPlanLookupPresent":true,"targetPlanPassedToHelperFrames":true,"counterHeldLifetimePresent":true,"boundaryLoopLifetimePresent":true,"boundaryLoopMotionProjectionPresent":true,"nestedRepeatPresent":true,"currentHelperEffectFramesUsesVisual":true}},{"helperId":97,"targetVaHex":"0x004b94f0","rendererPlanClass":"motion-boundary-loop","skillLabels":["린샹 암각·영상승룡파 0x17 Lv=3"],"frames":[187],"rendererAction":"Spawn frame [187] 9 time(s) every 1 gate tick(s); advance child with opcode 0x2d motion until y-boundary branches end the child.","implementationRequirements":["consume-target-renderer-plan-json","apply-boundary-loop-lifetime","apply-motion-step-until-branch"],"fulfilledRequirements":["consume-target-renderer-plan-json","apply-boundary-loop-lifetime","apply-motion-step-until-branch"],"remainingGaps":[],"engineEvidence":{"planJsonLoadedByEngine":false,"planRuntimeApiPresent":true,"engineCanConsumePageLoadedPlan":true,"targetPlanIndexerPresent":true,"targetPlanLookupPresent":true,"targetPlanPassedToHelperFrames":true,"counterHeldLifetimePresent":true,"boundaryLoopLifetimePresent":true,"boundaryLoopMotionProjectionPresent":true,"nestedRepeatPresent":true,"currentHelperEffectFramesUsesVisual":true}},{"helperId":98,"targetVaHex":"0x004b9424","rendererPlanClass":"motion-boundary-loop","skillLabels":["린샹 암각·영상승룡파 0x18 Lv=4"],"frames":[185],"rendererAction":"Spawn frame [185] 13 time(s) every 1 gate tick(s); advance child with opcode 0x2d motion until y-boundary branches end the child.","implementationRequirements":["consume-target-renderer-plan-json","apply-boundary-loop-lifetime","apply-motion-step-until-branch"],"fulfilledRequirements":["consume-target-renderer-plan-json","apply-boundary-loop-lifetime","apply-motion-step-until-branch"],"remainingGaps":[],"engineEvidence":{"planJsonLoadedByEngine":false,"planRuntimeApiPresent":true,"engineCanConsumePageLoadedPlan":true,"targetPlanIndexerPresent":true,"targetPlanLookupPresent":true,"targetPlanPassedToHelperFrames":true,"counterHeldLifetimePresent":true,"boundaryLoopLifetimePresent":true,"boundaryLoopMotionProjectionPresent":true,"nestedRepeatPresent":true,"currentHelperEffectFramesUsesVisual":true}},{"helperId":98,"targetVaHex":"0x004b9534","rendererPlanClass":"motion-boundary-loop","skillLabels":["린샹 암각·영상승룡파 0x18 Lv=4"],"frames":[188],"rendererAction":"Spawn frame [188] 13 time(s) every 1 gate tick(s); advance child with opcode 0x2d motion until y-boundary branches end the child.","implementationRequirements":["consume-target-renderer-plan-json","apply-boundary-loop-lifetime","apply-motion-step-until-branch"],"fulfilledRequirements":["consume-target-renderer-plan-json","apply-boundary-loop-lifetime","apply-motion-step-until-branch"],"remainingGaps":[],"engineEvidence":{"planJsonLoadedByEngine":false,"planRuntimeApiPresent":true,"engineCanConsumePageLoadedPlan":true,"targetPlanIndexerPresent":true,"targetPlanLookupPresent":true,"targetPlanPassedToHelperFrames":true,"counterHeldLifetimePresent":true,"boundaryLoopLifetimePresent":true,"boundaryLoopMotionProjectionPresent":true,"nestedRepeatPresent":true,"currentHelperEffectFramesUsesVisual":true}},{"helperId":105,"targetVaHex":"0x004ba4e4","rendererPlanClass":"counter-held-direct-frame","skillLabels":["스마슈 백인일섬 0x15 Lv=2"],"frames":[88],"rendererAction":"Spawn and hold frame [88] using counter [{'fieldHex': '0x96', 'value': 8, 'source': 'visual-root', 'vaHex': '0x004ba6b0'}, {'fieldHex': '0x96', 'value': 8, 'source': 'visual-rootCounterSets', 'vaHex': None}]; decrement local counter each VM tick before destroy/end.","implementationRequirements":["consume-target-renderer-plan-json","apply-counter-held-lifetime"],"fulfilledRequirements":["consume-target-renderer-plan-json","apply-counter-held-lifetime"],"remainingGaps":[],"engineEvidence":{"planJsonLoadedByEngine":false,"planRuntimeApiPresent":true,"engineCanConsumePageLoadedPlan":true,"targetPlanIndexerPresent":true,"targetPlanLookupPresent":true,"targetPlanPassedToHelperFrames":true,"counterHeldLifetimePresent":true,"boundaryLoopLifetimePresent":true,"boundaryLoopMotionProjectionPresent":true,"nestedRepeatPresent":true,"currentHelperEffectFramesUsesVisual":true}},{"helperId":106,"targetVaHex":"0x004ba4e4","rendererPlanClass":"counter-held-direct-frame","skillLabels":["스마슈 백인일섬 0x16 Lv=3"],"frames":[88],"rendererAction":"Spawn and hold frame [88] using counter [{'fieldHex': '0x96', 'value': 8, 'source': 'visual-root', 'vaHex': '0x004ba6f4'}, {'fieldHex': '0x96', 'value': 8, 'source': 'visual-rootCounterSets', 'vaHex': None}]; decrement local counter each VM tick before destroy/end.","implementationRequirements":["consume-target-renderer-plan-json","apply-counter-held-lifetime"],"fulfilledRequirements":["consume-target-renderer-plan-json","apply-counter-held-lifetime"],"remainingGaps":[],"engineEvidence":{"planJsonLoadedByEngine":false,"planRuntimeApiPresent":true,"engineCanConsumePageLoadedPlan":true,"targetPlanIndexerPresent":true,"targetPlanLookupPresent":true,"targetPlanPassedToHelperFrames":true,"counterHeldLifetimePresent":true,"boundaryLoopLifetimePresent":true,"boundaryLoopMotionProjectionPresent":true,"nestedRepeatPresent":true,"currentHelperEffectFramesUsesVisual":true}},{"helperId":107,"targetVaHex":"0x004ba4e4","rendererPlanClass":"counter-held-direct-frame","skillLabels":["스마슈 백인일섬 0x17 Lv=4"],"frames":[88],"rendererAction":"Spawn and hold frame [88] using counter [{'fieldHex': '0x96', 'value': 8, 'source': 'visual-root', 'vaHex': '0x004ba738'}, {'fieldHex': '0x96', 'value': 8, 'source': 'visual-rootCounterSets', 'vaHex': None}]; decrement local counter each VM tick before destroy/end.","implementationRequirements":["consume-target-renderer-plan-json","apply-counter-held-lifetime"],"fulfilledRequirements":["consume-target-renderer-plan-json","apply-counter-held-lifetime"],"remainingGaps":[],"engineEvidence":{"planJsonLoadedByEngine":false,"planRuntimeApiPresent":true,"engineCanConsumePageLoadedPlan":true,"targetPlanIndexerPresent":true,"targetPlanLookupPresent":true,"targetPlanPassedToHelperFrames":true,"counterHeldLifetimePresent":true,"boundaryLoopLifetimePresent":true,"boundaryLoopMotionProjectionPresent":true,"nestedRepeatPresent":true,"currentHelperEffectFramesUsesVisual":true}}]}