{
  "status": "ready-with-notes",
  "user_story": "【做 Web agent 的前端】在 Tiny Stay 演示里用 WebMCP 工具芯片 + MCP Apps 卡片，走完订房：点松木双人、写备注、consequential 二次确认后得到 TS-WM3PM0",
  "funnel_url": "https://webmcp-scaffold-rec.pages.dev/",
  "funnel_checks": [
    {
      "url": "https://webmcp-scaffold-rec.pages.dev/",
      "status": 200,
      "bytes": 1765,
      "content_type": "text/html; charset=utf-8",
      "expect_bytes": 1765,
      "bytes_match": true,
      "magic_ok": true
    },
    {
      "url": "https://webmcp-scaffold-rec.pages.dev/demo.gif",
      "status": 200,
      "bytes": 2101231,
      "content_type": "image/gif",
      "expect_bytes": 2101231,
      "bytes_match": true,
      "magic_ok": true
    },
    {
      "url": "https://webmcp-scaffold-rec.pages.dev/demo.mp4",
      "status": 200,
      "bytes": 1594381,
      "content_type": "video/mp4",
      "expect_bytes": 1594381,
      "bytes_match": true,
      "magic_ok": true
    },
    {
      "url": "https://webmcp-scaffold-rec.pages.dev/handoff.json",
      "status": 200,
      "bytes": 10291,
      "content_type": "application/json; charset=utf-8",
      "expect_bytes": 10291,
      "bytes_match": true,
      "magic_ok": true
    },
    {
      "url": "https://70bfd160.webmcp-scaffold-rec.pages.dev/",
      "status": 0,
      "bytes": 0,
      "content_type": null
    },
    {
      "url": "https://70bfd160.webmcp-scaffold-rec.pages.dev/demo.gif",
      "status": 0,
      "bytes": 0,
      "content_type": null
    },
    {
      "url": "https://70bfd160.webmcp-scaffold-rec.pages.dev/demo.mp4",
      "status": 0,
      "bytes": 0,
      "content_type": null
    },
    {
      "url": "https://70bfd160.webmcp-scaffold-rec.pages.dev/handoff.json",
      "status": 0,
      "bytes": 0,
      "content_type": null
    }
  ],
  "gif": {
    "path": "edits/v2/demo.gif",
    "bytes": 2101231,
    "sha256": "516c7c6bc0ccfe05fe4bd4cf8a210baca10bb3389f6634d384a05ea80d8389ed"
  },
  "mp4": {
    "path": "edits/v2/demo.mp4",
    "bytes": 1594381,
    "sha256": "de5dfc4dfe8b1a4ef9defa53a1797e4ce0697141d70ecfcdb0e1b4d42ee1bf09",
    "codec": "h264 yuv420p",
    "size": "944x1080"
  },
  "poster": "runs/take2/verify/final_t5.jpg",
  "commit": "ee095091388ad94e3e25885ecd535293e543f02c",
  "branch": "feat/webmcp-scaffold-rec",
  "pr": null,
  "story_scores": [
    {
      "id": "A",
      "one_liner": "【前端】以前【agent 工具直接执行拦不住】→ 用【consequential + 卡内二次确认】现在【点确认才出 TS- 码】",
      "R1": 4,
      "R2": 5,
      "R3": 5,
      "R4": 4,
      "R5": 5,
      "R6": 4,
      "R7": 4,
      "total": 90
    },
    {
      "id": "B",
      "one_liner": "【聊天产品开发】以前【agent 只能回文字】→ 用【MCP Apps 房间卡】现在【对话里点松木双人更新草稿】",
      "R1": 5,
      "R2": 5,
      "R3": 4,
      "R4": 4,
      "R5": 5,
      "R6": 4,
      "R7": 5,
      "total": 91
    },
    {
      "id": "C",
      "one_liner": "【安全工程师】以前【分不清只读/改数据】→ 用【READONLY/MUTATE/UNTRUSTED/CONSEQUENTIAL 徽章】现在【气泡旁标风险】",
      "R1": 3,
      "R2": 4,
      "R3": 3,
      "R4": 3,
      "R5": 5,
      "R6": 4,
      "R7": 4,
      "total": 72
    },
    {
      "id": "D",
      "one_liner": "组合固定脚本：iframe卡+徽章+二次确认+TS码（请求方脚本）",
      "R1": 4,
      "R2": 3,
      "R3": 5,
      "R4": 4,
      "R5": 5,
      "R6": 4,
      "R7": 3,
      "total": 83,
      "winner": true
    }
  ],
  "winner": "D",
  "story_hitl": {
    "status": "approved",
    "approved_by": "approved_by_requesting_bot",
    "chosen": "D",
    "suggested": "B"
  },
  "qa": {
    "verdict": "pass-with-notes",
    "hold_s": 3.5,
    "cjk_frames": "expected (zh-Hans product UI; logged deviation)",
    "must_haves": {
      "dark_chassis": true,
      "tool_chip_protocol": true,
      "ui_address_bar": true,
      "consequential_second_confirm": true,
      "ts_code": "TS-WM3PM0",
      "mock_banner": true
    },
    "notes": "Viewport 960×1100 required for nested #ok force-click (shorter viewports failed). Camera zoom on each chip/iframe/confirm. TS code clearest ~t=25s after scroll."
  },
  "shot_list": [
    {
      "id": "S1",
      "t_start": 0.0,
      "t_end": 3.0,
      "beat": "establish",
      "framing": "full",
      "zoom": 1.0,
      "roi": "shell+dark chassis",
      "focus": "banner Mock polyfill + Tiny Stay",
      "pointer": "idle",
      "text_expected": [
        "Tiny Stay",
        "Mock polyfill",
        "看看今晚有什么房"
      ],
      "legibility_px": {
        "hero_cap": 18
      },
      "transition": "hold",
      "ease": "cosine",
      "hold_s": 2.5,
      "purpose": "dark chassis + mock banner context"
    },
    {
      "id": "S2",
      "t_start": 3.0,
      "t_end": 5.0,
      "beat": "chip_rooms",
      "framing": "close",
      "zoom": 1.55,
      "roi": "suggestion chips",
      "focus": "看看今晚有什么房",
      "pointer": "click",
      "text_expected": [
        "看看今晚有什么房"
      ],
      "legibility_px": {
        "control_x": 10
      },
      "transition": "zoom-in",
      "ease": "cosine",
      "hold_s": 0.5,
      "purpose": "chip click"
    },
    {
      "id": "S3",
      "t_start": 5.0,
      "t_end": 7.0,
      "beat": "rooms_card",
      "framing": "close",
      "zoom": 1.65,
      "roi": "MCP app frame",
      "focus": "ui://tiny-stay/rooms.html + list_rooms READONLY",
      "pointer": "near",
      "text_expected": [
        "list_rooms",
        "READONLY",
        "ui://tiny-stay/rooms.html",
        "松木双人"
      ],
      "legibility_px": {
        "hero_cap": 16,
        "control_x": 9
      },
      "transition": "pan",
      "ease": "cosine",
      "hold_s": 1.2,
      "purpose": "protocol chip + ui:// chrome"
    },
    {
      "id": "S4",
      "t_start": 7.0,
      "t_end": 10.5,
      "beat": "pick_pine",
      "framing": "close",
      "zoom": 1.85,
      "roi": "room button",
      "focus": "松木双人 pine-02",
      "pointer": "click",
      "text_expected": [
        "松木双人",
        "pine-02"
      ],
      "legibility_px": {
        "control_x": 10
      },
      "transition": "zoom",
      "ease": "cosine",
      "hold_s": 1.5,
      "purpose": "iframe room pick"
    },
    {
      "id": "S5",
      "t_start": 10.5,
      "t_end": 14.5,
      "beat": "note_untrusted",
      "framing": "close",
      "zoom": 1.7,
      "roi": "draft card",
      "focus": "UNTRUSTED note + ui://draft",
      "pointer": "click then hold",
      "text_expected": [
        "帮我写入备注",
        "UNTRUSTED",
        "update_draft",
        "MUTATE"
      ],
      "legibility_px": {
        "control_x": 9
      },
      "transition": "zoom",
      "ease": "cosine",
      "hold_s": 2.0,
      "purpose": "untrusted annotation"
    },
    {
      "id": "S6",
      "t_start": 14.5,
      "t_end": 19.5,
      "beat": "consequential",
      "framing": "close",
      "zoom": 1.75,
      "roi": "confirm card",
      "focus": "confirm_booking CONSEQUENTIAL + card before TS",
      "pointer": "click chip",
      "text_expected": [
        "确认预订",
        "CONSEQUENTIAL",
        "confirm_booking"
      ],
      "legibility_px": {
        "control_x": 9
      },
      "transition": "zoom",
      "ease": "cosine",
      "hold_s": 2.0,
      "purpose": "consequential gate, no TS yet"
    },
    {
      "id": "S7",
      "t_start": 19.5,
      "t_end": 25.0,
      "beat": "payoff",
      "framing": "close",
      "zoom": 2.0,
      "roi": "in-card confirm + code",
      "focus": "in-card 确认预订 → TS-WM3PM0",
      "pointer": "click #ok",
      "text_expected": [
        "确认预订",
        "TS-WM3PM0",
        "ui://tiny-stay/confirm.html"
      ],
      "legibility_px": {
        "hero_cap": 16,
        "cta_x": 8
      },
      "transition": "zoom",
      "ease": "cosine",
      "hold_s": 3.5,
      "purpose": "second confirm + confirmation code"
    },
    {
      "id": "S8",
      "t_start": 25.0,
      "t_end": 28.64,
      "beat": "drawer",
      "framing": "medium",
      "zoom": 1.45,
      "roi": "drawer",
      "focus": "工具 / 类型 tools list",
      "pointer": "click",
      "text_expected": [
        "工具 / 类型",
        "confirm_booking",
        "webmcp-types"
      ],
      "legibility_px": {
        "control_x": 9
      },
      "transition": "pan",
      "ease": "cosine",
      "hold_s": 2.5,
      "purpose": "brief developer drawer"
    }
  ],
  "deviations": [
    "UI language is Chinese (zh-Hans); skill default English UI waived by requester — logged.",
    "Chip data-prompt for note is '帮我写入备注：靠窗安静' (label still 帮我写入备注).",
    "Badge text MUTATE (not ROUTINE MUTATE) on live site.",
    "Subtitle on live: 'WebMCP 工具 · MCP Apps · ui:// iframe' (brief said 'WebMCP + MCP Apps').",
    "story_hitl: approved_by_requesting_bot locked story D over score-leader B.",
    "record_machine=box (Playwright CDP), not Mac mini.",
    "clip_test_cutout n/a (no stock footage).",
    "GIF delivered ~28.6s full cut (not 8s window) per ~30s brief."
  ],
  "artifacts": [
    "edits/v2/demo.mp4",
    "edits/v2/demo.gif",
    "runs/take2/handoff.json",
    "raw/take2/gt.mp4",
    "raw/take2/markers.json"
  ],
  "known_weaknesses": [
    "TS code sits low in chat; clearest after scroll ~t=25s",
    "GIF 3.1MiB needs KV for Pages 4MiB deploy limit"
  ],
  "issues_for": {},
  "next": "Parent: share Pages preview with requester; optional PR to showcases.",
  "step0": {
    "title": "Tiny Stay · WebMCP + MCP Apps",
    "h1_or_header": "Tiny Stay\nWebMCP 工具 · MCP Apps 对话卡片 · 脚本化助手\n工具 / 类型",
    "banner_mock_polyfill": true,
    "chips": [
      "看看今晚有什么房",
      "帮我写入备注",
      "确认预订",
      "看看当前草稿"
    ],
    "chip_have": {
      "看看今晚有什么房": true,
      "帮我写入备注": true,
      "确认预订": true
    },
    "drawer_btn": 0,
    "iframes_initial": 0,
    "intro_tiny_stay": 3,
    "header_html": "\n      <div>\n        <h1>Tiny Stay</h1>\n        <div class=\"sub\">WebMCP 工具 · MCP Apps 对话卡片 · 脚本化助手</div>\n      </div>\n      <button type=\"button\" class=\"icon-btn\" id=\"drawer-toggle\" aria-label=\"开发者抽屉\">工具 / 类型</button>\n    ",
    "body_snip": "Mock polyfill — not native WebMCP; enable chrome://flags/#enable-webmcp-testing or Origin Trial for real API · Agent is scripted (no API keys)\nTiny Stay\nWebMCP 工具 · MCP Apps 对话卡片 · 脚本化助手\n工具 / 类型\n你好，我是 Tiny Stay 的脚本化助手（无模型、无 API 花费）。工具通过 WebMCP document.modelContext 注册；结果以 MCP Apps（ui:// + sandboxed iframe + postMessage JSON-RPC）嵌在对话里。\n看看今晚有什么房\n帮我写入备注\n确认预订\n看看当前草稿\n发送\nTools · webmcp-types\n关闭\nconfirm_booking consequential\nget_draft readOnly untrusted\nlist_rooms readOnly\nupdate_draft routine-mutate\n重新注册\nAbort 注销\n重置演示\n\ntypes snippet · npm webmcp-types\n\n/// <reference types=\"webmcp-types\" />\nawait document.modelContext.registerTool({\n  name: \"list_rooms\",\n  description: \"…\",\n  inputSchema: { type: \"object\", properties: { … } } as const,\n  annotations: { readOnlyHint: true },\n  // MCP Apps: _meta.",
    "iframes_after_rooms": 1,
    "pine_visible": true,
    "readonly_badge": 4
  },
  "confirmation_code": "TS-WM3PM0",
  "source": {
    "url": "https://webmcp-scaffold.pages.dev/",
    "title": "Tiny Stay · WebMCP + MCP Apps",
    "pr": "#15",
    "merge": "4b9384e"
  }
}