{
  "status": "ready",
  "user_story": "【新玩家】在【小黑屋开局】用【常驻目标行「火灭了，生火」】完成了【点「生火」后提示原地变成「火还在，添柴」】",
  "funnel_url": "https://resume-box.tail6a877d.ts.net/adarkroom-pr-31/",
  "funnel_checks": [
    {
      "url": "https://resume-box.tail6a877d.ts.net/adarkroom-pr-31/",
      "status": 200,
      "via": "WebFetch + api.microlink.io (external), 2026-10-18 02:40 Asia/Taipei"
    },
    {
      "url": "https://resume-box.tail6a877d.ts.net/adarkroom-pr-31/before-after.gif",
      "status": 200,
      "via": "api.microlink.io (external), content-type image/gif; WebFetch returns 500 on binary (fetcher limitation)"
    },
    {
      "url": "https://resume-box.tail6a877d.ts.net/adarkroom-pr-31/before-after.mp4",
      "status": 200,
      "via": "api.microlink.io (external), video/mp4"
    },
    {
      "url": "https://resume-box.tail6a877d.ts.net/adarkroom-pr-31/handoff.json",
      "status": 200,
      "via": "WebFetch + api.microlink.io (external)"
    }
  ],
  "gif": "https://resume-box.tail6a877d.ts.net/adarkroom-pr-31/before-after.gif",
  "mp4": "https://resume-box.tail6a877d.ts.net/adarkroom-pr-31/before-after.mp4",
  "poster": "https://resume-box.tail6a877d.ts.net/adarkroom-pr-31/poster.png",
  "commit": "1ee642627224427ab56136e40ca8cf8a04228184",
  "base_commit": "1f0e6d15645be4bfb25e84ab962e5420acdf6c15",
  "merge_commit": "58afb452e299f60382d89cb700318d6d53b44714",
  "branch": "cursor/onboarding-goal-prompt-1599",
  "pr": "https://github.com/liush2yuxjtu/adarkroom/pull/31",
  "story_scores": [
    {
      "candidate": "A",
      "R1": 3,
      "R2": 4,
      "R3": 3,
      "R4": 3,
      "R5": 4,
      "R6": 3,
      "R7": 4,
      "total": 66
    },
    {
      "candidate": "B",
      "R1": 4,
      "R2": 5,
      "R3": 5,
      "R4": 4,
      "R5": 5,
      "R6": 4,
      "R7": 4,
      "total": 88
    },
    {
      "candidate": "C",
      "R1": 2,
      "R2": 4,
      "R3": 3,
      "R4": 2,
      "R5": 4,
      "R6": 4,
      "R7": 3,
      "total": 59
    },
    {
      "candidate": "新A",
      "R1": 4,
      "R2": 5,
      "R3": 3,
      "R4": 4,
      "R5": 3,
      "R6": 5,
      "R7": 2,
      "total": 72
    }
  ],
  "winner": "B",
  "shot_list": [
    {
      "id": "S1",
      "t_start": 0.0,
      "t_end": 0.6,
      "t_raw_start": 0.3,
      "beat": "B0 establish",
      "framing": "full",
      "zoom": 1.0,
      "crop_css": [
        0,
        0,
        1280,
        720
      ],
      "roi_css": [
        0,
        0,
        1280,
        720
      ],
      "roi_center_offset_pct": [
        0,
        0
      ],
      "roi_in_frame": true,
      "focus": "Before chip + whole 小黑屋 page",
      "pointer": "idle (off ROI)",
      "text_expected": [
        "小黑屋",
        "生火"
      ],
      "legibility": null,
      "legibility_px": null,
      "transition_in": "cut",
      "ease": "cosine, log-zoom",
      "hold_s": 0.6,
      "purpose": "Before build, fresh save, same viewport"
    },
    {
      "id": "T12",
      "t_start": 0.6,
      "t_end": 1.2,
      "t_raw_start": 0.9,
      "beat": "transition",
      "framing": "medium",
      "zoom": "1.0->3.05",
      "crop_css": [
        140,
        22,
        560,
        258
      ],
      "roi_css": [
        175,
        30,
        525,
        240
      ],
      "roi_center_offset_pct": [
        0.0,
        2.1
      ],
      "roi_in_frame": true,
      "focus": "log + 生火 button",
      "pointer": "idle",
      "text_expected": [],
      "legibility": null,
      "legibility_px": null,
      "transition_in": "push-in 0.6 s",
      "ease": "cosine, log-zoom",
      "hold_s": 0,
      "purpose": "cosine push-in onto changed region"
    },
    {
      "id": "S2",
      "t_start": 1.2,
      "t_end": 2.32,
      "t_raw_start": 1.5,
      "beat": "B1 before",
      "framing": "close",
      "zoom": 3.05,
      "crop_css": [
        140,
        22,
        560,
        258
      ],
      "roi_css": [
        175,
        30,
        525,
        240
      ],
      "roi_center_offset_pct": [
        0.0,
        2.1
      ],
      "roi_in_frame": true,
      "focus": "生火 (no goal line in log)",
      "pointer": "glide to 生火, click at 2.32 s (bottom-right of button)",
      "text_expected": [
        "醒来。头在痛。眼前模糊。去生火吧。",
        "生火"
      ],
      "legibility": "control_before",
      "legibility_px": {
        "metric": "cjk_glyph_height",
        "measured": 29,
        "threshold": 9,
        "frame": 20,
        "pass": true
      },
      "transition_in": "cut",
      "ease": "cosine, log-zoom",
      "hold_s": 1.12,
      "purpose": "Before: log has only the wake line, no persistent goal"
    },
    {
      "id": "S3",
      "t_start": 2.32,
      "t_end": 5.0,
      "t_raw_start": 2.62,
      "beat": "B3 result",
      "framing": "close",
      "zoom": 3.05,
      "crop_css": [
        140,
        22,
        560,
        258
      ],
      "roi_css": [
        175,
        30,
        525,
        240
      ],
      "roi_center_offset_pct": [
        0.0,
        2.1
      ],
      "roi_in_frame": true,
      "focus": "log 火光映出窗外 / 添柴 button",
      "pointer": "parked",
      "text_expected": [
        "火光映出窗外，投入黑暗之中。"
      ],
      "legibility": "log_before_result",
      "legibility_px": {
        "metric": "cjk_glyph_height",
        "measured": 26,
        "threshold": 7,
        "frame": 43,
        "pass": true
      },
      "transition_in": "cut",
      "ease": "cosine, log-zoom",
      "hold_s": 2.68,
      "purpose": "Before result: fire lit, still no next-step prompt"
    },
    {
      "id": "S4",
      "t_start": 5.0,
      "t_end": 5.6,
      "t_raw_start": 0.3,
      "beat": "B0 establish",
      "framing": "full",
      "zoom": 1.0,
      "crop_css": [
        0,
        0,
        1280,
        720
      ],
      "roi_css": [
        0,
        0,
        1280,
        720
      ],
      "roi_center_offset_pct": [
        0,
        0
      ],
      "roi_in_frame": true,
      "focus": "After chip + whole page",
      "pointer": "idle (off ROI)",
      "text_expected": [
        "火灭了，生火"
      ],
      "legibility": null,
      "legibility_px": null,
      "transition_in": "cut (Before->After)",
      "ease": "cosine, log-zoom",
      "hold_s": 0.6,
      "purpose": "After build, identical script and state"
    },
    {
      "id": "T45",
      "t_start": 5.6,
      "t_end": 6.2,
      "t_raw_start": 0.9,
      "beat": "transition",
      "framing": "medium",
      "zoom": "1.0->3.05",
      "crop_css": [
        140,
        22,
        560,
        258
      ],
      "roi_css": [
        175,
        30,
        525,
        240
      ],
      "roi_center_offset_pct": [
        0.0,
        2.1
      ],
      "roi_in_frame": true,
      "focus": "goal line + 生火",
      "pointer": "idle",
      "text_expected": [],
      "legibility": null,
      "legibility_px": null,
      "transition_in": "push-in 0.6 s",
      "ease": "cosine, log-zoom",
      "hold_s": 0,
      "purpose": "same camera move as Before for 1:1 comparison"
    },
    {
      "id": "S5",
      "t_start": 6.2,
      "t_end": 7.34,
      "t_raw_start": 1.5,
      "beat": "B2 action",
      "framing": "close",
      "zoom": 3.05,
      "crop_css": [
        140,
        22,
        560,
        258
      ],
      "roi_css": [
        175,
        30,
        525,
        240
      ],
      "roi_center_offset_pct": [
        0.0,
        2.1
      ],
      "roi_in_frame": true,
      "focus": "goal line 火灭了，生火 + 生火 button",
      "pointer": "glide to 生火, click at 7.34 s",
      "text_expected": [
        "火灭了，生火",
        "生火"
      ],
      "legibility": "goal_after_initial",
      "legibility_px": {
        "metric": "cjk_glyph_height",
        "measured": 25,
        "threshold": 16,
        "frame": 80,
        "pass": true
      },
      "transition_in": "cut",
      "ease": "cosine, log-zoom",
      "hold_s": 1.14,
      "purpose": "After: persistent goal line tells the player what to do"
    },
    {
      "id": "S6",
      "t_start": 7.34,
      "t_end": 11.0,
      "t_raw_start": 2.64,
      "beat": "B4 payoff",
      "framing": "close",
      "zoom": 3.05,
      "crop_css": [
        140,
        22,
        560,
        258
      ],
      "roi_css": [
        175,
        30,
        525,
        240
      ],
      "roi_center_offset_pct": [
        0.0,
        2.1
      ],
      "roi_in_frame": true,
      "focus": "goal line 火还在，添柴",
      "pointer": "parked",
      "text_expected": [
        "火还在，添柴"
      ],
      "legibility": "goal_after_updated",
      "legibility_px": {
        "metric": "cjk_glyph_height",
        "measured": 25,
        "threshold": 16,
        "frame": 97,
        "pass": true
      },
      "transition_in": "cut",
      "ease": "cosine, log-zoom",
      "hold_s": 3.58,
      "purpose": "Payoff: goal updates in place after acting; readable 3.58 s"
    }
  ],
  "legibility": {
    "verdict": "pass",
    "file": "runs/verify/legibility.json",
    "checks": [
      {
        "id": "control_before",
        "metric": "cjk_glyph_height (as cap height)",
        "measured_px": 29,
        "threshold_px": 9,
        "ocr": true,
        "ocr_text": "生火",
        "pass": true
      },
      {
        "id": "log_before_result",
        "metric": "cjk_glyph_height (as cap height)",
        "measured_px": 26,
        "threshold_px": 7,
        "ocr": true,
        "ocr_text": "火光上映出窗外",
        "pass": true
      },
      {
        "id": "goal_after_initial",
        "metric": "cjk_glyph_height (as cap height)",
        "measured_px": 25,
        "threshold_px": 16,
        "ocr": true,
        "ocr_text": "火灭了，生",
        "pass": true
      },
      {
        "id": "control_after",
        "metric": "cjk_glyph_height (as cap height)",
        "measured_px": 29,
        "threshold_px": 9,
        "ocr": true,
        "ocr_text": "生火",
        "pass": true
      },
      {
        "id": "goal_after_updated",
        "metric": "cjk_glyph_height (as cap height)",
        "measured_px": 25,
        "threshold_px": 16,
        "ocr": true,
        "ocr_text": "火还在，添",
        "pass": true
      }
    ],
    "readable_result_s": 3.58,
    "centering_pass": true,
    "story_test": {
      "independent": false,
      "pass": true,
      "answer": "PROVISIONAL (recorder self-read): Before — a dark-room text game; clicking 生火 lights the fire, log gets 火光映出窗外 but nothing says what to do next. After — the same screen shows a top line 火灭了，生火; after clicking 生火 the line changes to 火还在，添柴. For new players: a persistent next-goal prompt. Needs a fresh-context cold read of verify/cold-viewer-contact-sheet.png."
    }
  },
  "qa": {
    "verdict": "pass-with-notes",
    "hold_s": 3.58,
    "cjk_frames": "N/A (Chinese UI by design; CJK post-check not applicable)",
    "notes": "5/5 key texts OCR-matched with chi_sim (sim>=0.8) and 25-29 px CJK glyph height at delivered 800px (thresholds 16/9/7). Result 火还在，添柴 readable 7.42-11.0 s. MP4 crop-OCR at 9.0 s read 火还在，添集 (sim 0.83). Cold-viewer read only provisional."
  },
  "deviations": [
    "UI language: game UI is Chinese by design; English-UI hard rule cannot apply; CJK post-check N/A; OCR via tesseract chi_sim+eng; CJK full glyph height measured against cap-height thresholds.",
    "record_machine=box (headless Playwright Chromium 1248 chrome-headless-shell, playwright 1.56.1 via executablePath) instead of Mac mini / ui-demo / build_feature_media.py; derivatives encoded on box with scripts/camera.py.",
    "Capture: page.screenshot loop at DPR 2 (~12 fps, timestamped) resampled to 30 fps CFR GT (raw.mp4); recordVideo and CDP screencast rejected (scale bug / 1280 cap).",
    "Overlay: Before/After + sha7 chip added (user-requested for PR artifact); otherwise pure-screen; visible pointer is an injected DOM arrow (headless has no OS cursor).",
    "GIF is 11.0 s (Before 5 s + After 6 s) at 800x450, not 8 s/520 px: two sequential states each need establish + click + >=3 s hold; no speed-up.",
    "Build route: local static serve of godot/build/web via scripts/prepare-vercel.sh at base 1f0e6d1 and head 1ee6426 (python http.server with COOP/COEP); no per-commit Vercel deployment used (vercel.json disables git deploys except main/live branch; PR branch previews are skipped by vercel-ignore.sh).",
    "Telemetry requests (supabase / /api/*) aborted in Playwright so the recording does not pollute production playtest_events.",
    "ChatCut language/Mac-mini recording lock/stock footage + test-cutout + batch screening rules: N/A (browser game on box, no stock media, no ChatCut).",
    "Storage: per user steering, artifacts committed to private monorepo liush2yuxjtu/showcases (adarkroom-pr-before-after/), not feature-recorder. Nothing was pushed to feature-recorder.",
    "PR embed: adarkroom is PUBLIC and showcases is PRIVATE, so the PR body embeds the Funnel GIF URL; may not load in mainland China.",
    "Take verification frame strips are cropped to the ROI region (plus full-frame establish visible in contact sheets)."
  ],
  "artifacts": [
    "outputs/before-after.gif (800x450, 11.0s, 12fps, 563433 B)",
    "outputs/before-after.mp4 (H.264 yuv420p faststart, 800x450, 24fps, 245138 B, LFS)",
    "outputs/poster.png",
    "outputs/cold-viewer-contact-sheet.png",
    "outputs/legibility-strip.png",
    "outputs/mp4-contact-sheet.png",
    "outputs/strips/*",
    "runs/takes.log",
    "runs/shotlist.json",
    "runs/verify/legibility.json",
    "story/research.md",
    "story/story.md",
    "scripts/record.mjs",
    "scripts/camera.py",
    "scripts/edit.json",
    "scripts/verify_legibility_cjk.py",
    "recommendation.md"
  ],
  "known_weaknesses": [
    "Goal line uses the same small log typography (14px CSS); difference is textual, readers without Chinese see only \"a new line appears and changes\".",
    "Cold-viewer test not yet independent.",
    "Funnel (ts.net) may be unreachable from mainland China."
  ],
  "issues_for": {
    "parent": [
      "Run an independent cold-viewer read on verify/cold-viewer-contact-sheet.png (16 frames) with a fresh context."
    ]
  },
  "next": "Parent: fresh-context cold read of the 16-frame contact sheet; if it recovers 生火 → goal line 火灭了，生火 → 火还在，添柴, upgrade to ready.",
  "cold_viewer": {
    "verdict": "pass",
    "reader": "feature-recorder-independent",
    "note": "16-frame contact sheet recovers 生火 click → 火灭了，生火 → 火还在，添柴"
  }
}