{
 "use_case": "walkthrough-to-quote",
 "title": "Walkthrough-to-quote: a narrated repaint walk of a bedroom and hallway, priced from a painter's own sheet",
 "about": "A 53-second walkthrough of a rendered bedroom and hallway, narrated by a stock synthetic voice. The narrator gives the bedroom's size (twelve by fourteen, eight-foot ceiling), asks for the walls, the trim and both closet doors, points at peeling paint, never mentions a water stain the camera shows on the ceiling, and asks for a guest-bath ceiling that is never filmed. The draft must list the stain as a seen-only line and the guest-bath ceiling as a said-only line, use the size said on camera for the bedroom, cite a keyframe for every line, price only from the painter's sheet with arithmetic that re-computes exactly, and seal a record that verifies and fails once changed.",
 "licence": "Synthetic: rooms rendered with three.js (MIT) from a scripted scene written for Decosa, narrated by the Kokoro-82M stock voice am_michael (Apache-2.0). No real homes, people or voices. Video, transcript and price sheet CC0; part of decosa-api, AGPL-3.0-or-later.",
 "inputs": [
  {"file": "inputs/walkthrough.mp4", "what": "The walkthrough video (MP4, 53 s, 1280x720, with narration)."},
  {"file": "inputs/transcript.json", "what": "The narration as timed lines, as the diarizer transcribed it; sent with the video so the rehearsal does not need a speech-to-text service."},
  {"file": "inputs/prices.csv", "what": "A fictional painter's price sheet (code, description, unit, unit_price). The quote may only use these rows."}
 ],
 "steps": [
  {"id": "draft", "method": "POST", "path": "/walkthrough/draft", "timeout": 400,
   "body": {"video_b64": {"$b64": "inputs/walkthrough.mp4"}, "transcript": {"$file": "inputs/transcript.json"}, "price_sheet_csv": {"$file": "inputs/prices.csv"},
            "title": "Repaint: main bedroom and hallway", "stream": false}},
  {"id": "arithmetic", "method": "POST", "path": "/walkthrough/check-arithmetic", "auth": false,
   "body": {"quote": {"$ref": "draft.report"}, "price_sheet_csv": {"$file": "inputs/prices.csv"}}},
  {"id": "bad_sheet", "method": "POST", "path": "/walkthrough/draft", "expect_status": 400,
   "body": {"video_b64": {"$b64": "inputs/walkthrough.mp4"}, "price_sheet_csv": "code,unit\nPNT-WALL,sq ft"}},
  {"id": "verify", "method": "POST", "path": "/record/verify", "auth": false, "body": {"record": {"$ref": "draft.record"}}},
  {"id": "tampered", "method": "POST", "path": "/record/verify", "auth": false, "body": {"record": {"$ref": "draft.record"}},
   "tamper": {"at": "record.statement.count", "set": 99}}
 ],
 "checks": [
  {"says": "the ceiling water stain (shown, never said) is a seen-only line", "path": "draft.report.lines[work~stain].basis", "any_equals": "seen"},
  {"says": "the guest-bath ceiling (said, never filmed) is a said-only line", "path": "draft.report.lines[area~bath].basis", "any_equals": "said"},
  {"says": "the bedroom's length is the one said on camera (14 ft)", "path": "draft.report.areas[name~bedroom].said_dims.length.value", "any_equals": 14},
  {"says": "every line has a keyframe", "path": "draft.report.lines[keyframe=null]", "count": 0},
  {"says": "at least five scope lines", "path": "draft.report.counts.lines", "min": 5},
  {"says": "every quantity is said, estimated with a method, per room or missing: none is made up", "path": "draft.report.lines.quantity.source", "all_in": ["said", "estimated", "per_area", "missing"]},
  {"says": "the arithmetic re-computes exactly from the price sheet", "path": "arithmetic.ok", "equals": true},
  {"says": "a price sheet without the required columns is refused", "path": "bad_sheet.error", "contains": "columns"},
  {"says": "the signed record of the arithmetic verifies", "path": "verify.ok", "equals": true},
  {"says": "the record fails once it is changed", "path": "tampered.ok", "equals": false},
  {"says": "every model call has a signed receipt", "receipts": "signed", "min": 3}
 ]
}
