{
  "description": "Actual browser automation sequence, repeated five times per commit. Substitute fixture directory and authenticated app tab. Real composer upload queue and HTTP server; no mocked parsing or network.",
  "viewport": {
    "width": 1280,
    "height": 800
  },
  "theme": "light",
  "fixtureGenerator": "python3 generate.py <fixture-directory>",
  "preparation": [
    "Start each commit with T3CODE_DEV_SEED=0 vp run dev and a fresh isolated home.",
    "Open startup pairing URL in preview browser.",
    "Select Replay (dev) / Showcase; no agent turn is needed.",
    "Evaluate capture-timings.js once in each tab."
  ],
  "sequence": [
    {
      "tool": "preview_act",
      "action": "click",
      "selector": "button[aria-label='New thread']"
    },
    {
      "tool": "preview_evaluate",
      "expression": "window.uploadEvidence=[]"
    },
    {
      "tool": "preview_recording_start"
    },
    {
      "tool": "preview_evaluate",
      "expression": "new Promise(r=>setTimeout(r,500))"
    },
    {
      "tool": "preview_act",
      "action": "upload",
      "selector": "input[type=file]",
      "paths": [
        "<fixture-directory>/large-document.docx"
      ]
    },
    {
      "tool": "preview_act",
      "action": "upload",
      "selector": "input[type=file]",
      "paths": [
        "<fixture-directory>/notebook-1.ipynb",
        "<fixture-directory>/notebook-2.ipynb",
        "<fixture-directory>/notebook-3.ipynb",
        "<fixture-directory>/notebook-4.ipynb",
        "<fixture-directory>/notebook-5.ipynb",
        "<fixture-directory>/notebook-6.ipynb",
        "<fixture-directory>/notebook-7.ipynb"
      ]
    },
    {
      "tool": "preview_evaluate",
      "expression": "new Promise(resolve=>{const id=setInterval(()=>{if(window.uploadEvidence.length===8&&window.uploadEvidence.every(r=>r.end)){clearInterval(id);resolve(window.uploadEvidence)}},50)})"
    },
    {
      "tool": "preview_evaluate",
      "expression": "new Promise(r=>setTimeout(r,800))"
    },
    {
      "tool": "preview_recording_stop"
    }
  ],
  "notes": [
    "New pending attachment IDs on each run prevent sidecar reuse.",
    "Uploaded videos show one additional recorded run after the five measured runs, cropped to the composer and slowed to 0.25x. timings.json contains both the five-run sample and separate recordings data.",
    "All eight requests returned HTTP 204 in every measured run.",
    "DOCX is valid synthetic OOXML, 13,321,122 bytes, 30,000 paragraphs; extracted text reaches the normal one-million-character output limit.",
    "Run duration is first XHR open to final loadend, including the real client queue; not pure extraction CPU time.",
    "Initial one-batch exploratory uploads are excluded because notebook requests reached extraction before the large document. The measured sequence follows the requested two attachment actions."
  ]
}