{
  "version": 1,
  "kind": "hwanse-battle-skill-goal-audit",
  "source": "tools/build_battle_skill_goal_audit.py",
  "status": "complete",
  "summary": {
    "criteria": 4,
    "complete": 4,
    "notComplete": 0,
    "missingOrIncomplete": [],
    "canonicalRowsReady": true,
    "canonicalGoalReady": false,
    "browserSmokeStatus": "ok",
    "browserSmokeCheckedRows": 6,
    "browserSmokeCheckedEffectRows": 13,
    "browserSmokeCheckedExecutionRequirementRows": 52,
    "effectExecutionRequirementRows": 52,
    "effectVisualAssertionStatus": "visual-assertions-pass",
    "effectVisualAssertionFailedGroups": 0,
    "effectVisualPixelOracleStatus": "not-original-runtime-pixel-oracle",
    "effectPixelOraclePlanStatus": "capture-oracle-not-built",
    "effectPixelOracleFullRows": 52,
    "effectPixelOracleFirstPassRows": 8,
    "effectCaptureChecklistStatus": "waiting-for-captures",
    "effectCaptureFirstPassReady": 0,
    "effectCaptureFirstPassRows": 8,
    "effectPixelCompareStatus": "waiting-for-captures",
    "effectPixelCompareFullPassed": 0,
    "effectPixelCompareFullExpected": 52,
    "webReferenceCaptureToolExists": true,
    "webReferenceCaptureDocExists": true,
    "originalCapturePrepareToolExists": true,
    "originalCaptureImportToolExists": true,
    "originalCaptureInboxExists": true,
    "originalRuntimePixelParityBlockingCurrentGoal": false
  },
  "criteria": [
    {
      "id": "canonical-action-rows",
      "requirement": "주인공/몬스터 기술 row, frame sequence, gate, WLK evidence가 EXE canonical bundle로 정리되어야 한다.",
      "status": "complete",
      "artifacts": [
        {
          "path": "out/battle_skill_timeline_canonical.json",
          "exists": true
        },
        {
          "path": "out/battle_skill_timeline_canonical.js",
          "exists": true
        },
        {
          "path": "tools/build_battle_skill_timeline_canonical.py",
          "exists": true
        }
      ],
      "evidence": [
        "playerRows=156, monsterRows=294, totalRows=450",
        "wlkEvidenceUnresolvedRows=0",
        "playerTimelineStatusCounts={'confirmed': 156}"
      ],
      "gaps": [],
      "verifier": [
        "python3 tools/build_battle_skill_timeline_canonical.py",
        "python3 tools/verify_battle_skill_playback_regressions.py"
      ]
    },
    {
      "id": "shared-battle-pages",
      "requirement": "battle_skill_timeline_review, battle_formula_calculator, battle_simulator가 같은 canonical playback을 써야 한다.",
      "status": "complete",
      "artifacts": [
        {
          "path": "web/battle_skill_timeline_review.html",
          "exists": true
        },
        {
          "path": "web/battle_formula_calculator.html",
          "exists": true
        },
        {
          "path": "web/battle_simulator.html",
          "exists": true
        },
        {
          "path": "web/engine/battle/animation.js",
          "exists": true
        },
        {
          "path": "out/battle_effect_runner_binding_review.json",
          "exists": true
        }
      ],
      "evidence": [
        "pageChecks=30/30",
        "pagesUsingPlaybackEffectFrames=3",
        "pagesRenderingHelperEffectLayer=3"
      ],
      "gaps": [],
      "verifier": [
        "python3 tools/build_battle_effect_runner_binding_review.py",
        "python3 tools/verify_web_assets.py"
      ]
    },
    {
      "id": "known-browser-regressions",
      "requirement": "룬룬권, 안면백조권, 도발, 꼬챙이꿰기처럼 과거에 밀리던 기술이 실제 브라우저 프레임스트립에서 canonical과 일치해야 한다.",
      "status": "complete",
      "artifacts": [
        {
          "path": "tools/verify_battle_skill_timeline_browser.py",
          "exists": true
        },
        {
          "path": "out/battle_skill_timeline_browser_summary.json",
          "exists": true
        },
        {
          "path": "web/battle_skill_timeline_review.html",
          "exists": true
        },
        {
          "path": "out/battle_effect_visual_assertion_review.json",
          "exists": true
        },
        {
          "path": "out/battle_effect_visual_assertion_review.html",
          "exists": true
        }
      ],
      "evidence": [
        "browserSmokeStatus=ok",
        "checkedRows=6",
        "checkedEffectRows=13",
        "checkedExecutionRequirementRows=52",
        "checkedExecutionRequirementBuckets=['child motion loop present', 'palette transform effect; no CNS frame stream', 'random placement/range present', 'runner must instantiate child objects over time']",
        "checked: Rinshan 도발/꼬챙이꿰기/안면백조권 Lv1,Lv4 + Ataho 룬룬권 Lv1,Lv4",
        "effect checked: Ataho 호격권/맹호비상각/폭전축/맹호스페셜 Lv4 + Rinshan 선렬각/영상승룡파 Lv4",
        "execution requirement rows expose browser effect diagnostics for transform/range, child spawn timing, loop/motion, and palette buckets",
        "effect rows with CNS frames pass a browser canvas non-empty pixel guard",
        "effect rows render at an active tick in the combined actor/effect preview canvas with non-empty pixels",
        "visualAssertionStatus=visual-assertions-pass",
        "visualAssertionRows=52, failedGroups=0",
        "pixelOracleStatus=not-original-runtime-pixel-oracle"
      ],
      "gaps": [],
      "verifier": [
        "xvfb-run -a python3 tools/verify_battle_skill_timeline_browser.py",
        "python3 tools/build_battle_effect_visual_assertion_review.py"
      ]
    },
    {
      "id": "effect-runner-binding",
      "requirement": "EXE helper/effect 요구가 공통 러너에 결속되어 있고, active pages가 helper effect layer를 그려야 한다.",
      "status": "complete",
      "artifacts": [
        {
          "path": "out/battle_effect_animation_pattern_review.json",
          "exists": true
        },
        {
          "path": "out/battle_effect_runner_binding_review.json",
          "exists": true
        },
        {
          "path": "web/engine/battle/animation.js",
          "exists": true
        }
      ],
      "evidence": [
        "effectSkillRows=156",
        "skillsWithEffectFrames=92",
        "skillsWithExecutionRequirements=52",
        "engineChecks=6/6"
      ],
      "gaps": [],
      "verifier": [
        "python3 tools/build_battle_effect_animation_pattern_review.py",
        "python3 tools/build_battle_effect_runner_binding_review.py"
      ]
    }
  ],
  "futureVerification": [
    {
      "id": "original-runtime-pixel-parity",
      "requirement": "원본 게임 런타임 캡처와 웹 러너 프레임을 픽셀 비교해 최종 시각 parity를 확인한다.",
      "blockingCurrentGoal": false,
      "status": "waiting-for-captures",
      "artifacts": [
        {
          "path": "out/battle_effect_pixel_oracle_plan.json",
          "exists": true
        },
        {
          "path": "out/battle_effect_capture_checklist.json",
          "exists": true
        },
        {
          "path": "out/battle_effect_pixel_compare_report.json",
          "exists": true
        },
        {
          "path": "tools/capture_battle_effect_web_reference.py",
          "exists": true
        },
        {
          "path": "tools/prepare_battle_effect_original_capture_dirs.py",
          "exists": true
        },
        {
          "path": "tools/import_battle_effect_original_captures.py",
          "exists": true
        },
        {
          "path": "docs/BATTLE_EFFECT_WEB_REFERENCE_CAPTURE.md",
          "exists": true
        }
      ],
      "evidence": [
        "pixelOraclePlanStatus=capture-oracle-not-built",
        "pixelOracleFullRows=52, firstPassRows=8",
        "captureChecklistStatus=waiting-for-captures",
        "captureChecklistFirstPassReady=0/8",
        "pixelCompareStatus=waiting-for-captures",
        "pixelCompareFullPassed=0/52",
        "webReferenceCaptureToolExists=True",
        "webReferenceCaptureDocExists=True",
        "originalCapturePrepareToolExists=True",
        "originalCaptureImportToolExists=True",
        "originalCaptureInboxExists=True"
      ],
      "note": "원본 런타임 캡처는 최종 parity 검증용 외부 증거다. EXE 정적 분석/canonical playback goal의 완료 조건에는 포함하지 않는다."
    }
  ],
  "completionDecision": "eligible-for-update-goal"
}
