{
  "status": "ready-with-notes",
  "user_story": "【小区物业维修工 老周】在【凌晨 2 点的业主群】用【Grok Bot 的 Colorfigures 透视 + Labels】完成了【给业主讲清楚「马桶为什么一直流水」】",
  "funnel_url": "https://toilet-running-cistern-rec.pages.dev/",
  "funnel_checks": [
    {
      "url": "https://toilet-running-cistern-rec.pages.dev/",
      "status": 200,
      "role": "page",
      "via": "curl -L from box"
    },
    {
      "url": "https://toilet-running-cistern-rec.pages.dev/desktop/demo.gif",
      "status": 200,
      "role": "gif",
      "via": "curl -L from box"
    },
    {
      "url": "https://toilet-running-cistern-rec.pages.dev/desktop/demo.mp4",
      "status": 200,
      "role": "mp4",
      "via": "curl -L from box"
    },
    {
      "url": "https://toilet-running-cistern-rec.pages.dev/handoff.json",
      "status": 200,
      "role": "handoff.json",
      "via": "curl -L from box"
    },
    {
      "url": "https://toilet-running-cistern-rec.pages.dev/mobile/demo.gif",
      "status": 200,
      "via": "curl -L from box"
    },
    {
      "url": "https://toilet-running-cistern-rec.pages.dev/mobile/demo.mp4",
      "status": 200,
      "via": "curl -L from box"
    }
  ],
  "gif": "https://toilet-running-cistern-rec.pages.dev/desktop/demo.gif",
  "mp4": "https://toilet-running-cistern-rec.pages.dev/desktop/demo.mp4",
  "poster": "https://toilet-running-cistern-rec.pages.dev/desktop/contact.png",
  "gif_mobile": "https://toilet-running-cistern-rec.pages.dev/mobile/demo.gif",
  "mp4_mobile": "https://toilet-running-cistern-rec.pages.dev/mobile/demo.mp4",
  "commit": "c2052cfb147c0abf212af75e75fe7e641a032a55",
  "branch": "feature/toilet-running-cistern-film-a",
  "pr": null,
  "story_scores": [
    {
      "candidate": "A",
      "R1": 5,
      "R2": 4,
      "R3": 4,
      "R4": 5,
      "R5": 5,
      "R6": 4,
      "R7": 4,
      "total": 74,
      "note": "LOCKED winner from STORIES.md — Film A; do not re-HITL"
    }
  ],
  "winner": "A",
  "shot_list": [
    {
      "id": "S0",
      "t_start": 0.0,
      "t_end": 1.4,
      "beat": "establish RUNNING+STUCK",
      "framing": "full",
      "zoom": 1.0,
      "roi_css": null,
      "focus": "whole cistern + status RUNNING",
      "pointer": "idle near Flush",
      "text_expected": [
        "RUNNING",
        "FLOAT",
        "FILL VALVE"
      ],
      "legibility_px": {
        "RUNNING": 25.5
      },
      "transition_in": "cut",
      "ease": "none",
      "hold_s": 1.4,
      "purpose": "before: overflow already running"
    },
    {
      "id": "S1",
      "t_start": 1.4,
      "t_end": 2.4,
      "beat": "zoom Flush",
      "framing": "close",
      "zoom": 1.25,
      "roi_css": ".stage",
      "focus": "Flush button",
      "pointer": "move to Flush",
      "text_expected": [
        "Flush"
      ],
      "legibility_px": {
        "Flush": 9.8
      },
      "transition_in": "ease",
      "ease": "ease-in-out",
      "hold_s": 0.5,
      "purpose": "aim click"
    },
    {
      "id": "S2",
      "t_start": 2.4,
      "t_end": 4.4,
      "beat": "Flush → overflow hold",
      "framing": "close",
      "zoom": 1.3,
      "roi_css": ".stage",
      "focus": "FLOAT/FILL VALVE + RUNNING water",
      "pointer": "click Flush",
      "text_expected": [
        "RUNNING",
        "FLOAT",
        "FILL VALVE"
      ],
      "legibility_px": {
        "RUNNING": 25.5
      },
      "transition_in": "cut",
      "ease": "none",
      "hold_s": 2.0,
      "purpose": "continuous overflow after Flush"
    },
    {
      "id": "S3",
      "t_start": 4.4,
      "t_end": 5.4,
      "beat": "zoom Fix float",
      "framing": "close",
      "zoom": 1.3,
      "roi_css": ".stage",
      "focus": "Fix float button",
      "pointer": "move to Fix float",
      "text_expected": [
        "Fix float"
      ],
      "legibility_px": {
        "Fix float": 9.8
      },
      "transition_in": "ease",
      "ease": "ease-in-out",
      "hold_s": 0.5,
      "purpose": "aim fix"
    },
    {
      "id": "S4",
      "t_start": 5.4,
      "t_end": 5.8,
      "beat": "Fix float click",
      "framing": "close",
      "zoom": 1.3,
      "roi_css": ".stage",
      "focus": "float rises / valve closes",
      "pointer": "click Fix float",
      "text_expected": [
        "QUIET",
        "FLOAT FREE"
      ],
      "legibility_px": {
        "QUIET": 25.5
      },
      "transition_in": "cut",
      "ease": "none",
      "hold_s": 0.4,
      "purpose": "state change"
    },
    {
      "id": "S5",
      "t_start": 5.8,
      "t_end": 9.1,
      "beat": "RESULT HOLD QUIET",
      "framing": "mid",
      "zoom": 1.3,
      "roi_css": ".stage",
      "focus": "QUIET + FLOAT FREE + still water",
      "pointer": "idle",
      "text_expected": [
        "QUIET",
        "FLOAT FREE"
      ],
      "legibility_px": {
        "QUIET": 25.5
      },
      "transition_in": "hold",
      "ease": "none",
      "hold_s": 3.3,
      "purpose": "result readable ≥3s"
    },
    {
      "id": "S6",
      "t_start": 9.1,
      "t_end": 9.53,
      "beat": "pull back",
      "framing": "full",
      "zoom": 1.0,
      "roi_css": null,
      "focus": "full figure quiet",
      "pointer": "idle",
      "text_expected": [
        "QUIET"
      ],
      "legibility_px": {
        "QUIET": 25.5
      },
      "transition_in": "ease",
      "ease": "ease-out",
      "hold_s": 0.4,
      "purpose": "end frame"
    }
  ],
  "legibility": {
    "verdict": "pass-with-notes",
    "file": "edits/legibility-summary.json",
    "checks": [
      {
        "id": "desktop_RUNNING",
        "metric": "cap_height_css_scaled_to_gif",
        "measured_px": 25.5,
        "threshold_px": 16,
        "ocr": "RUNNING",
        "pass": true,
        "note": "CSS 34px @1280 → GIF 960 = 25.5"
      },
      {
        "id": "desktop_QUIET",
        "metric": "cap_height_css_scaled_to_gif",
        "measured_px": 25.5,
        "threshold_px": 16,
        "ocr": "QUIET",
        "pass": true,
        "note": "visible on hold frames; OCR flaky on zoom crop"
      },
      {
        "id": "desktop_Flush",
        "metric": "xheight_css_scaled_to_gif",
        "measured_px": 9.8,
        "threshold_px": 9,
        "ocr": "Flush",
        "pass": true
      },
      {
        "id": "mobile_RUNNING",
        "metric": "cap_height_css",
        "measured_px": 34,
        "threshold_px": 16,
        "ocr": "RUNNING",
        "pass": true
      },
      {
        "id": "mobile_QUIET",
        "metric": "cap_height_css",
        "measured_px": 34,
        "threshold_px": 16,
        "ocr": "QUIET",
        "pass": true
      },
      {
        "id": "mobile_figure_FLOAT",
        "metric": "cap_height_css",
        "measured_px": 3.7,
        "threshold_px": 16,
        "ocr": "FLOAT",
        "pass": false,
        "note": "3D figure labels tiny on 390 viewport — product chrome; status hero text OK"
      }
    ],
    "readable_result_s": 3.32,
    "centering_pass": true,
    "story_test": {
      "independent": true,
      "pass": true,
      "answer": "provisional-FR: Flush starts/continues overflow (RUNNING+FLOAT STUCK labels); Fix float → QUIET + water stops. Cold-viewer contact sheet in outputs/*/cold-viewer-contact-sheet.png",
      "method": "FR contact-sheet review (independent human re-check recommended)"
    }
  },
  "qa": {
    "verdict": "pass-with-notes",
    "hold_s": 3.32,
    "cjk_frames": "none unexpected on buttons (intentional CJK banner/title on product: 业主群 / Fig.A1 title — not chrome regression)",
    "notes": [
      "Fixed isometric camera; never drag-rotated 3D",
      "Click path Anatomy: Flush → continuous overflow → Fix float → stop; RESULT HOLD ~3.32s",
      "No language toggle on site; English control labels kept; FLOAT/FILL VALVE English product labels",
      "Desktop GIF 3.6MB (slightly over 3MB soft target) for clarity",
      "Mobile 3D FLOAT/FILL VALVE labels ~3.7px CSS — below 16px gate; hero RUNNING/QUIET 34px pass"
    ]
  },
  "deviations": [
    "Recorded on box Playwright CDP (Mac mini Screen Recording TCC still missing) — as requested",
    "Story LOCKED — skipped story-research re-HITL",
    "Cold-viewer answer provisional by FR (contact sheet provided for independent re-check)",
    "Publish: Cloudflare Pages direct upload SUCCESS (toilet-running-cistern-rec.pages.dev) — no Worker+KV needed"
  ],
  "artifacts": [
    "anatomy-bot/toilet-running-cistern/outputs/desktop/{demo.mp4,demo.gif,cues.json,handoff.json,contact.png,cold-viewer-contact-sheet.png}",
    "anatomy-bot/toilet-running-cistern/outputs/mobile/{demo.mp4,demo.gif,cues.json,handoff.json,contact.png,cold-viewer-contact-sheet.png}",
    "anatomy-bot/toilet-running-cistern/outputs/handoff.json"
  ],
  "known_weaknesses": [
    "Mobile figure labels FLOAT/FILL VALVE ~3.7px at 390 CSS — product density, not recording scale alone",
    "Desktop GIF ~3.66MB",
    "OCR on zoomed late frames flaky; CSS-scaled cap height used for gate"
  ],
  "issues_for": {
    "f28cb932-9806-46f4-a18b-b076705795f8": [
      "UI_MP4+CUES ready for huashu→earshot; do not re-story",
      "Credit line for X draft (do not post from FR): @Aprilzz423 https://x.com/Aprilzz423/status/2112925055680442750",
      "Mobile 3D label px may need product tweak if earshot cut needs FLOAT readable on phone GIF"
    ]
  },
  "next": "Hand UI_MP4 + cues.json to huashu-motion for picture film; earshot SFX after; X-manager draft only (FR does not post)",
  "credit": "@Aprilzz423 https://x.com/Aprilzz423/status/2112925055680442750",
  "reply_to": "f28cb932-9806-46f4-a18b-b076705795f8",
  "product_url": "https://toilet-running-cistern.pages.dev/",
  "verify": "PASS with ?press=Flush@300,Fix%20float@2500",
  "take": "A-desktop-take2 / A-mobile-take2",
  "record_machine": "box",
  "camera": "FIXED isometric; CSS zoom/pan on .stage only — never orbit/drag 3D"
}
