{
  "status": "ready-with-notes",
  "user_story": "【技术美术 小林】以前【把「像不像概念图」交给评审口头感觉，调色与关卡改动搅在一起无法复盘】→ 用【concept-art-godot-score-hillclimb】现在【先 scene（灯/雾/布局）再 LUT，全程 change-one + 分数条，复盘谁改了什么】",
  "funnel_url": "https://concept-art-godot-score-rec.pages.dev/",
  "funnel_checks": [
    {
      "url": "https://concept-art-godot-score-rec.pages.dev/",
      "status": 200,
      "role": "page"
    },
    {
      "url": "https://concept-art-godot-score-rec.pages.dev/desktop/demo.gif",
      "status": 200,
      "role": "gif"
    },
    {
      "url": "https://concept-art-godot-score-rec.pages.dev/desktop/demo.mp4",
      "status": 200,
      "role": "mp4"
    },
    {
      "url": "https://concept-art-godot-score-rec.pages.dev/handoff.json",
      "status": 200,
      "role": "handoff"
    },
    {
      "url": "https://concept-art-godot-score-rec.pages.dev/desktop/cues.json",
      "status": 200,
      "role": "cues"
    },
    {
      "url": "https://concept-art-godot-score-rec.pages.dev/mobile/demo.mp4",
      "status": 200,
      "role": "mp4"
    },
    {
      "url": "https://concept-art-godot-score-rec.pages.dev/mobile/cues.json",
      "status": 200,
      "role": "cues"
    }
  ],
  "gif": "https://concept-art-godot-score-rec.pages.dev/desktop/demo.gif",
  "mp4": "https://concept-art-godot-score-rec.pages.dev/desktop/demo.mp4",
  "poster": "",
  "gif_mobile": "",
  "mp4_mobile": "https://concept-art-godot-score-rec.pages.dev/mobile/demo.mp4",
  "commit": "ace5fa9",
  "branch": "feature/concept-art-godot-score-film-a",
  "pr": "",
  "product_url": "https://concept-art-godot-score.pages.dev/",
  "product_commit": "66848f8",
  "product_pr": 34,
  "story_scores": [
    {
      "candidate": "S1",
      "R1": 20,
      "R2": 12,
      "R3": 20,
      "R4": 15,
      "R5": 15,
      "R6": 8,
      "R7": 3,
      "total": 93
    },
    {
      "candidate": "S2",
      "R1": 16,
      "R2": 15,
      "R3": 20,
      "R4": 12,
      "R5": 12,
      "R6": 10,
      "R7": 3,
      "total": 88,
      "winner": true
    },
    {
      "candidate": "S3",
      "R1": 16,
      "R2": 12,
      "R3": 20,
      "R4": 12,
      "R5": 15,
      "R6": 8,
      "R7": 3,
      "total": 86
    }
  ],
  "winner": "S2",
  "shot_list": [
    {
      "id": "S1",
      "t_start": 0.0,
      "t_end": 3.51,
      "t_raw_start": 0.0,
      "beat": "B0 establish / pin",
      "framing": "full",
      "zoom": 1.0,
      "crop_css": [
        0,
        0,
        1280,
        800
      ],
      "roi_css": null,
      "roi_center_offset_pct": [
        0,
        0
      ],
      "roi_in_frame": true,
      "focus": "Freeze hero plate",
      "pointer": "click Freeze hero plate",
      "text_expected": [
        "1 · Pick reference",
        "Freeze hero plate",
        "reference locked"
      ],
      "legibility": "hero_ref",
      "legibility_px": {
        "metric": "cap",
        "measured": 18,
        "threshold": 16,
        "frame": "f-0003",
        "pass": true
      },
      "transition_in": "cut",
      "ease": "none",
      "hold_s": 2.2,
      "purpose": "Pin 一念逍遥 look reference so TA has a frozen target"
    },
    {
      "id": "S2",
      "t_start": 3.51,
      "t_end": 7.11,
      "t_raw_start": 3.51,
      "beat": "B1 seed HUD",
      "framing": "full",
      "zoom": 1.0,
      "crop_css": [
        0,
        0,
        1280,
        800
      ],
      "roi_css": null,
      "roi_center_offset_pct": [
        0,
        0
      ],
      "roi_in_frame": true,
      "focus": "SEED HUD + Regenerate",
      "pointer": "click Next then Regenerate from seed",
      "text_expected": [
        "SEED",
        "Regenerate from seed",
        "2 · Seed"
      ],
      "legibility": "seed_hud",
      "legibility_px": {
        "metric": "x-height",
        "measured": 10,
        "threshold": 9,
        "frame": "f-0008",
        "pass": true
      },
      "transition_in": "cut",
      "ease": "none",
      "hold_s": 2.4,
      "purpose": "Show seeded procedural level HUD"
    },
    {
      "id": "S3",
      "t_start": 7.11,
      "t_end": 11.31,
      "t_raw_start": 7.11,
      "beat": "B2 pieces",
      "framing": "full",
      "zoom": 1.0,
      "crop_css": [
        0,
        0,
        1280,
        800
      ],
      "roi_css": null,
      "roi_center_offset_pct": [
        0,
        0
      ],
      "roi_in_frame": true,
      "focus": "Stones Flagstones Planks Chains",
      "pointer": "Next (auto pieces)",
      "text_expected": [
        "3 · Small pieces",
        "Stones",
        "Planks"
      ],
      "legibility": "pieces",
      "legibility_px": {
        "metric": "x-height",
        "measured": 9,
        "threshold": 9,
        "frame": "f-0012",
        "pass": true
      },
      "transition_in": "cut",
      "ease": "none",
      "hold_s": 1.8,
      "purpose": "Pieces assemble block-by-block"
    },
    {
      "id": "S4",
      "t_start": 11.31,
      "t_end": 15.8,
      "t_raw_start": 11.31,
      "beat": "B2 shaders",
      "framing": "full",
      "zoom": 1.0,
      "crop_css": [
        0,
        0,
        1280,
        800
      ],
      "roi_css": null,
      "roi_center_offset_pct": [
        0,
        0
      ],
      "roi_in_frame": true,
      "focus": "Material spotlight",
      "pointer": "click Material spotlight",
      "text_expected": [
        "4 · Procedural",
        "Material spotlight",
        "stone",
        "wood"
      ],
      "legibility": "shader",
      "legibility_px": {
        "metric": "x-height",
        "measured": 9,
        "threshold": 9,
        "frame": "f-0016",
        "pass": true
      },
      "transition_in": "cut",
      "ease": "none",
      "hold_s": 1.6,
      "purpose": "Procedural shader material spotlight"
    },
    {
      "id": "S5",
      "t_start": 15.8,
      "t_end": 19.91,
      "t_raw_start": 15.8,
      "beat": "B3 score",
      "framing": "full",
      "zoom": 1.0,
      "crop_css": [
        0,
        0,
        1280,
        800
      ],
      "roi_css": null,
      "roi_center_offset_pct": [
        0,
        0
      ],
      "roi_in_frame": true,
      "focus": "score 77/100 + bars",
      "pointer": "click Compute score",
      "text_expected": [
        "77",
        "/100",
        "Color",
        "Light",
        "Contrast",
        "Detail"
      ],
      "legibility": "score",
      "legibility_px": {
        "metric": "cap",
        "measured": 22,
        "threshold": 16,
        "frame": "f-0021",
        "pass": true
      },
      "transition_in": "cut",
      "ease": "none",
      "hold_s": 2.8,
      "purpose": "Split ON + computed 0–100 score with dimension bars"
    },
    {
      "id": "S6",
      "t_start": 19.91,
      "t_end": 24.99,
      "t_raw_start": 19.91,
      "beat": "B3 change-one lighting",
      "framing": "medium",
      "zoom": 1.45,
      "crop_css": [
        0,
        0,
        1280,
        800
      ],
      "roi_css": null,
      "roi_center_offset_pct": [
        0,
        0
      ],
      "roi_in_frame": true,
      "focus": "Lighting knob + change one: lighting banner",
      "pointer": "nudge Lighting range",
      "text_expected": [
        "change one: lighting",
        "Lighting",
        "78",
        "+1 · lighting"
      ],
      "legibility": "lighting",
      "legibility_px": {
        "metric": "cap",
        "measured": 16,
        "threshold": 16,
        "frame": "f-0023",
        "pass": true
      },
      "transition_in": "push-in 0.45s",
      "ease": "cosine",
      "hold_s": 2.8,
      "purpose": "ONLY change lighting; score jumps; hold ≥2.5s"
    },
    {
      "id": "S7",
      "t_start": 24.99,
      "t_end": 28.55,
      "t_raw_start": 24.99,
      "beat": "B4 LUT last",
      "framing": "full",
      "zoom": 1.0,
      "crop_css": [
        0,
        0,
        1280,
        800
      ],
      "roi_css": null,
      "roi_center_offset_pct": [
        0,
        0
      ],
      "roi_in_frame": true,
      "focus": "LUT strength + wipe",
      "pointer": "raise LUT strength",
      "text_expected": [
        "Before LUT",
        "After LUT",
        "LUT strength",
        "7 · Auto-fit LUT"
      ],
      "legibility": "lut",
      "legibility_px": {
        "metric": "x-height",
        "measured": 9,
        "threshold": 9,
        "frame": "f-0028",
        "pass": true
      },
      "transition_in": "pull-out then cut",
      "ease": "cosine",
      "hold_s": 2.2,
      "purpose": "LUT last with before/after wipe; hold ≥2s"
    },
    {
      "id": "S8",
      "t_start": 28.55,
      "t_end": 33.06,
      "t_raw_start": 28.55,
      "beat": "B4 loop haze",
      "framing": "full",
      "zoom": 1.0,
      "crop_css": [
        0,
        0,
        1280,
        800
      ],
      "roi_css": null,
      "roi_center_offset_pct": [
        0,
        0
      ],
      "roi_in_frame": true,
      "focus": "change one: haze chip",
      "pointer": "click change one: haze",
      "text_expected": [
        "change one: haze",
        "8 · Loop",
        "haze"
      ],
      "legibility": "haze",
      "legibility_px": {
        "metric": "x-height",
        "measured": 9,
        "threshold": 9,
        "frame": "f-0032",
        "pass": true
      },
      "transition_in": "cut",
      "ease": "none",
      "hold_s": 2.8,
      "purpose": "Second loop change-one (haze); hold ≥2.5s"
    }
  ],
  "legibility": {
    "verdict": "pass-with-notes",
    "file": "outputs/verify/verify.json",
    "checks": [
      {
        "id": "score_hero",
        "metric": "cap",
        "measured_px": 22,
        "threshold_px": 16,
        "ocr": "provisional",
        "pass": true
      },
      {
        "id": "lighting_banner",
        "metric": "cap",
        "measured_px": 16,
        "threshold_px": 16,
        "ocr": "provisional",
        "pass": true
      },
      {
        "id": "change_one_chip",
        "metric": "x-height",
        "measured_px": 9,
        "threshold_px": 9,
        "ocr": "haze/change one found",
        "pass": true
      }
    ],
    "readable_result_s": 2.8,
    "centering_pass": true,
    "story_test": {
      "independent": false,
      "pass": "provisional",
      "answer": "A TA toolkit walks an 8-step concept→Godot score loop: freeze ink-wash reference, seed a level, assemble pieces, spotlight procedural materials, compute a 0–100 score with split view, nudge ONLY Lighting (banner says change one: lighting) and watch score rise, apply LUT last with a wipe, then loop again changing only haze."
    }
  },
  "qa": {
    "verdict": "pass-with-notes",
    "hold_s": 2.8,
    "cjk_frames": 0,
    "notes": "Product verify PASS; Film frame gate PASS for all 8 beats; desktop letterbox (mobile-first product); lighting delta +1; haze delta +0; cold-viewer provisional"
  },
  "deviations": [
    "Desktop 1280×800 inherits product mobile-first centered column (side letterbox) — not cropped away",
    "Second loop haze score delta +0 (computed histogram; still marks change-one: haze)",
    "Cold-viewer provisional (recorder context) — remix-ship/parent may re-run independent",
    "Optional zoom 1.45× only on S6 lighting; no Screen-Studio style multi-keyframe camera elsewhere",
    "Pages preview omits mobile GIF + contact posters (MCP 4MB body limit); full mobile GIF in repo outputs/mobile/demo.gif",
    "Pages media CRF-compressed vs full-res repo outputs (same take)"
  ],
  "artifacts": [
    "concept-art-godot-score-hillclimb/outputs/desktop/{demo.mp4,demo.gif,cues.json,contact.png,shotlist.json}",
    "concept-art-godot-score-hillclimb/outputs/mobile/{demo.mp4,demo.gif,cues.json,contact.png}",
    "concept-art-godot-score-hillclimb/outputs/handoff.json",
    "concept-art-godot-score-hillclimb/outputs/B1_SEND_TO_REMIX_SHIP.txt",
    "concept-art-godot-score-hillclimb/outputs/verify/",
    "concept-art-godot-score-hillclimb/outputs/raw/A-desktop-take1/",
    "concept-art-godot-score-hillclimb/outputs/raw/A-mobile-take1/",
    "concept-art-godot-score-hillclimb/story/shots.md",
    "concept-art-godot-score-hillclimb/scripts/record.mjs",
    "concept-art-godot-score-hillclimb/deploy/"
  ],
  "known_weaknesses": [
    "Score deltas are small on this seed (lighting +1, haze +0) — story still readable via banner + delta label",
    "OCR (tesseract) unreliable on dark ink UI; relied on visual frame inspection",
    "Desktop GIF 640px; mobile GIF ~320px after size trim"
  ],
  "issues_for": {
    "f28cb932-9806-46f4-a18b-b076705795f8": [
      "Accept UI_MP4 + cues.json + preview; unlock huashu/earshot only after remix-ship review",
      "Cold-viewer was provisional — optional independent re-read of desktop contact sheet"
    ]
  },
  "next": "remix-ship reviews UI_MP4+cues+preview; do NOT hand huashu/earshot/X-manager until remix-ship unlocks",
  "deployment_id": "576abd57-5fd2-4adb-a744-f24871c0d400",
  "deployment_url": "https://576abd57.concept-art-godot-score-rec.pages.dev"
}
