{
 "model": "claude-haiku-5-5",
 "category": "stress-agents-vision-cli",
 "scenarios": [
  {
   "id": "h1-same-project-4x",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "All 4 drivers started within 2 ms of each other on one project and one HOME. 4 distinct valid sessions, every driver exited 0 with turn-complete. d1 added JSDoc (code unchanged apart from blank lines), d2 wrote test/extra.test.js, d3 wrote docs/USAGE.md, d4 ran npm test and summarised 5/5 failing seed tests. writes.jsonl has one entry per write with the right session. Each .snap file's sha256 matches its name and the final files. I ran npm test: 12 tests, 4 pass, 8 fail, all failures from the intentionally buggy seed plus d2's spec tests against it. No lost writes. Recomputed cost $0.013060125 matches.",
   "notes": "d4's Bash npm test settled 'failed' (exit 1). That is correct. The shared learned/patterns.json holds both runs. Commands over 160 characters (d2 at 163, d3 at 180) were skipped by design (COMMAND_LENGTH). No race or lost update seen."
  },
  {
   "id": "h2-burst-12",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "12/12 drivers completed in about 5.5 s of wall time (result.json says 11 s), all exit 0. 12 valid sessions under 12 project keys in the shared HOME. Each pN/notes.txt has 3 lines. Every session's file paths point only at its own pN. Recomputed cost $0.009558075 matches over 27 requests.",
   "notes": "No 429, 529, overload, retry or reply-restart frames appeared, so rate-limit handling was not exercised. 3 sessions took 3 requests and 9 took 2: the model either batched write and read in one reply or did them in sequence."
  },
  {
   "id": "h3-same-home-8-medium",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "8/8 modules built, all exit 0. I ran node --test in each folder: slugify 11/11, roman 17/17, luhn 11/11, wordcount 22/22, date-diff 23/23, temperature 14/14, queue 26/26, LRU 22/22. 8 valid sessions with 8 project keys. No session's context mentions another project folder. Recomputed cost $0.034697495 matches.",
   "notes": "No cross-talk. There is no separate session index file in HOME: the per-project folders are the index, and they are consistent."
  },
  {
   "id": "h4-resume-race",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "The first driver created session ae855575. r2 won the lock: resumed, made one FileEdit adding a comment to add(), exit 0. r1 was refused with exit 1 and 'Fatal: Session ae855575-… is open in another G-Code process (pid 5194). Close it there first, or start a new chat.' (store.ts:259). The saved session holds both turns in order and inventory.js has only the add() comment. No lock file left, no data loss. Cost $0.001194145 matches.",
   "notes": "Works as designed: the refusal message is clear, and the loser never touched the session."
  },
  {
   "id": "h5-rapid-messages",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "All 5 messages were sent at the same millisecond. The controls frame came before the first request. 5 turn-complete frames arrived in order, and saved messages alternate user/assistant in the original order. Files are a.txt='1!', b.txt='2', c.txt='3' with no newlines and no interleaving. Exit 0. Cost $0.00255169 matches over 11 requests.",
   "notes": "The queue delivered every message, none lost. The final turn's 4 reads ran in parallel."
  },
  {
   "id": "e1-subagents-audit",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "Three parallel Agent calls (subagent_type explore, no approvals) returned plain-text results with '[Sub-agent run]' blocks: 18 calls in 5 replies, 33 calls in 7 replies, 18 calls in 7 replies. The parent's usageTotals of 29 requests equals 10 parent replies plus 19 sub-agent replies, and recomputed cost $0.10086533 matches. REVIEW.md (166 lines) has P0/P1/P2 priorities and marks which items were re-checked. Tool pairs match and exit is 0.",
   "notes": "One sub-agent Grep failed because the model put two directories in one path. It was listed under Failed calls as 'ripgrep: rg: …' (G-Code's own prefix plus rg's message; cosmetic only). Sub-agent calls show only in the Agent result and in status frames, as known. Heartbeat 'Still thinking' frames appeared during long reasoning. The 100-reply and 400-call limits are still in AgentTool.ts:136 and failureBudget.ts:165; neither limit was reached."
  },
  {
   "id": "e2-subagents-write",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "Two general sub-agents ran under inherited bypass with no approvals. One wrote strings.js and strings.test.js (then edited the test), the other wrote dates.js and dates.test.js. The parent wrote package.json and index.js. I ran node --test: 59/59 pass. The outputs frame lists all 6 files, each version's sha256 matches its snapshot, and the latest matches disk. writes.jsonl gives each sub-agent its own writer id. No conflicting writes. 15 requests = 6 parent + 4 + 5 sub-agent replies, and cost $0.019827115 matches.",
   "notes": "The sub-agent's own failed Bash calls (an ls of missing files, a first failing test run) appear correctly under Failed calls. The model fixed a wrong expected value in a test, not in the implementation."
  },
  {
   "id": "e3-workflow",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "The project-level workflows.enabled was ignored. A clear system frame and a stderr line said only ~/.gcode/settings.json can enable workflows. ToolSearch returned Workflow as unavailable with the same reason. The model explained this, ran npm test (ENOENT, no package.json), changed no files and offered two options. Exit 0. Cost $0.001784805 matches.",
   "notes": "31 tools, Skill catalog present, no Workflow, MCP or DeferredToolCall tools. Possible low-severity learning-quality observation, not a failure: the model ran `npm test 2>&1; echo \"exit: $?\"`. The trailing echo hides npm's ENOENT exit code, so learned/patterns.json records it as successes 1/runs 1. Its confidence (0.67) is above SHOW_FROM, so a future new conversation would list it as trusted. This follows the documented 'exit 0 = success' rule and was not visible in this run."
  },
  {
   "id": "f1-screenshots",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "FileRead returned real image blocks: the 4 originals with 'Shown to you at about …' scale notes, plus 10 crops. I opened products-desktop.png and home-desktop.png myself. NOTES.md matches what is visible: the pale yellow hero headline washing out over the sky, lot art repeating in washed/honey/natural/experimental pairs, an empty bottom-right grid slot, struck-through 'Sold out', El Mirador's description wrapping, and faint 'Showing 8 of 8 lots'. Exit 0, cost $0.0146287 matches.",
   "notes": "The model wrote its crops to /tmp/crops, outside the project; bypass allows this. That leaves files in /tmp but no processes."
  },
  {
   "id": "f2-big-image",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "FileRead of the 45.8 MiB 4000×4000 PNG returned a clear error, 'Image is 45.8 MiB, over the 5 MiB inline limit. Resize or compress the image.', with no API 400 and no crash. The model then got the dimensions with file and sips, made a 1000×1000 preview and correctly described random colour noise. Exit 0, cost $0.001918385 matches.",
   "notes": "The oversize read settled 'failed', not 'refused'. That fits the code (FileReadTool.ts:216 is a runtime error after stat, not a permission refusal), and the message is clear. The model left .gcode/huge-preview.png and told the user about it."
  },
  {
   "id": "f3-image-to-html",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "index.html and styles.css recreate the hero faithfully (nav pill, yellow italic headline, sun, hills, dark base, two CTAs); I checked the final BrowserVerify screenshot. BrowserVerify passed twice: 5/5 assertions, 6/6 checks. The text check observed 'Grown in the mist, shipped green.' from 'Grown in<br>the mist,<br>shipped green.', so <br> counted as a space and the model did not rewrite the page for the check. blockedRequests lists only the Google Fonts stylesheet, and errors is []. Cleanup closed the browser and preview server. Exit 0, cost $0.04228176 matches.",
   "notes": "The first BrowserPlan call was invalid input. It settled as refused, with a tool-result frame and no tool-use frame (by design), and listed one issue per line. One Bash failed because PIL was missing, correctly marked failed. Subfolder entry, a bad server.path and a 404 URL were not exercised. No skill block was loaded: the message matches no trigger. Scratch files went to /tmp/f3, which the model removed."
  },
  {
   "id": "i1-headless-p",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "Headless -p exited 0. stdout is a single result JSON with cache_read_ratio. fizzbuzz.js printed the correct 1..30 FizzBuzz when I ran it. The saved session is valid: FileWrite and Bash both complete, 2 requests with cache reads. No key appears in any file of these 13 runs.",
   "notes": "No permission_denials field, which is correct because there were none (cli.ts:367). stderr shows only the provider line."
  },
  {
   "id": "i2-headless-bg-left",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "Headless -p exited 0. The server started with run_in_background (bg-aac8bf14), curl got 200 'ok', and TaskOutput was read. After exit, port 8950 is free (afterExit and my own lsof check) and no server.mjs process is left. Leftovers are empty. Cost $0.001048125 matches.",
   "notes": "The model told the user correctly that a one-shot run stops background tasks."
  }
 ]
}