{
 "model": "claude-haiku-5-5",
 "category": "stress-agents-vision-cli",
 "scenarios": [
  {
   "id": "h1-same-project-4x",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "All four concurrent drivers exited 0 with turn-complete and four distinct valid sessions. Each session records only its own output: d1 src/inventory.js, d2 test/extra.test.js, d3 docs/USAGE.md, d4 none. All 3 snapshot sha256 values match, and each output's last version matches the file on disk, so no write was lost. Recompute $0.01230915, diff 0.",
   "notes": "No 429 or 529. d4's `npm test 2>&1` settled failed with its own exit status because the seed's 5 tests fail, which is correct. I reran test/extra.test.js: 5 of 7 pass. The 2 failures probably come from the seed's lowStock bug, which no task asked to fix; I did not confirm them per test. learned/patterns.json has npm test with 4 runs, 0 successes, 0 broken, plus node --test test/extra.test.js with 1 run, 0 successes. That matches the commands (one failed run, the rest piped through tail or grep). Cache read ratio 0.905."
  },
  {
   "id": "h2-burst-12",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "All 12 drivers completed in 4.1-5.3 s each (scenario 11 s, one HOME). There are 12 valid sessions in 12 project folders, and each p*/notes.txt holds its three facts and matches its snapshot. Each session mentions only its own folder. Recompute $0.009726815, diff 0.",
   "notes": "The burst drew no 429, 529, overload, retry or reply-restart, so rate-limit handling was not exercised. Three sessions took 3 requests because the model made its write and read in separate replies. Cache read ratio 0.944."
  },
  {
   "id": "h3-same-home-8-medium",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "All 8 drivers completed on one HOME. I reran node --test in m1-m8 and all pass (12, 12, 8, 20, 22, 17, 18, 31 tests). No session mentions another session's folder, and every output's last version matches disk. Recompute $0.03658061, diff 0.",
   "notes": "The failed calls were all genuine and correctly labelled: m1's first test run (a real diacritics failure), m1's FileEdit whose edit 2 of 4 was not found (all-or-nothing, nothing applied), and m8's `git status | head; cat package.json` chain ending in exit 1. The model fixed m1 itself. Learned patterns match the commands: `node --test 2>&1` counts as worked, and piped runs are counted without a success."
  },
  {
   "id": "h4-resume-race",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "r1 won the lock and added the remove() comment, exiting 0. r2 exited 1 after 87 ms. inventory.js holds only r1's comment, and the saved session has 8 messages (seed turn plus r1's turn), all paired. Recompute $0.001241875, diff 0.",
   "notes": "The refusal is clear: 'Session 27d965ac-… is open in another G-Code process (pid 81491). Close it there first, or start a new chat.' Nothing was lost or clobbered, and r2's message was never accepted into the session. This is the designed behaviour."
  },
  {
   "id": "h5-rapid-messages",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "All five messages were sent within 1 ms and ran as five ordered turns, each with turn-complete and none lost. On disk a.txt='1!', b.txt='2', c.txt='3', and the final listing reports the same. Recompute $0.00248336, diff 0.",
   "notes": "The controls frame came first. The saved user turns 1-5 are in sent order, and turns 2-4 carry the expected session-memory context block. Steer frames were not exercised. Cache read ratio 0.980."
  },
  {
   "id": "e1-subagents-audit",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "Three parallel explore sub-agents returned their findings, and the parent wrote REVIEW.md. Only REVIEW.md changed, and nothing was installed. Usage sums correctly: 5+13+4 sub-agent replies plus 6 parent requests equals the saved 28. Recompute $0.213360315, diff 0.",
   "notes": "The Agent running frames show useful progress ('FileRead: index.html', 'Glob complete: …', 'Still thinking'), and 3 terminal complete states follow. There were no Failed calls lines, so the 160-character cap change was not exercised, and the 100-reply and 400-call limits were not approached. The most expensive part was the model's reasoning (133K output, 101K of it reasoning). One sub-agent chose 10 WebFetch calls to bundlephobia, which REVIEW.md discloses. I spot-checked the generation-count claim against Home.tsx:64 and About.tsx:64 and it holds."
  },
  {
   "id": "e2-subagents-write",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "Two general sub-agents wrote strings.js and dates.js with tests under inherited bypass, and the parent wrote package.json and index.js. I reran npm test: 84/84 pass. All 6 outputs have absent baselines and sha256 values matching disk. Usage sums correctly: 6+4+5=15 requests. Recompute $0.024056685, diff 0.",
   "notes": "There were no conflicting writes. Each sub-agent's 'Files changed' lists exactly its own two files, relative to the project. Progress frames read correctly, including the sub-agent's 'Still thinking (20s)'. No failed calls occurred, so the cap change was not exercised. My npm test ran under my normal HOME, so npm may have added a log under ~/.npm/_logs; I wrote no scratch files."
  },
  {
   "id": "e3-workflow",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "The project's workflows.enabled was not honoured. A system frame and stderr name the ignored file and say only ~/.gcode/settings.json can turn it on. ToolSearch returned Workflow as available:false with the same reason. The model explained this, ran node --test (0 tests) and offered options. Recompute $0.001862085, diff 0.",
   "notes": "The request carried 31 tools with no Workflow, no approvals appeared and no project file changed. The refusal reads clearly. The model reported that '0 tests' is empty rather than a pass, and asked instead of doing the work without Workflow, which the task allowed."
  },
  {
   "id": "f1-screenshots",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "FileRead returned image blocks for 19 images (4 originals, 15 crops). NOTES.md cites real content; I opened home-desktop.png and about-desktop.png and confirmed the three lot names, the 'No images were harmed' footer, the 0%/0 stats and the ER/HR portrait initials. Recompute $0.02584765, diff 0.",
   "notes": "The fitImages change was not exercised live. The model stopped at 19 images (limit 20) with about 18 MB of messages (limit 32 MiB), so there were no removals, no 'already holds' note and no system frame. Reading microcompact.ts, its logic matches the brief, but this run does not prove it. Cache read ratio is 0.929, above round 18's 0.669, with cacheInvalidations 0; the model's lower image count explains that, so it is not evidence for the fix. No request went over a limit. The one failed call was a genuine PIL ModuleNotFoundError. The model's first crops went to /tmp/crops, which already held files from earlier runs (shared /tmp, environment), and it then switched to /tmp/r19crops."
  },
  {
   "id": "f2-big-image",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "The 48 MB, 4000×4000 noise PNG was refused before any API call with 'Image is 45.8 MiB, over the 5 MiB inline limit. Resize or compress the image.' There was no crash or 400. The model got the dimensions from file and sips, viewed a downscaled copy and a crop, and described noise correctly. Recompute $0.0028865, diff 0.",
   "notes": "The image was refused, not downscaled by G-Code, and the model made its own preview under /tmp and deleted it afterwards. The size error and the model's bad sips option, whose `ls` ended in exit 1, both settled as failed with correct text. huge.png is unchanged."
  },
  {
   "id": "f3-image-to-html",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "The hero was built as index.html and styles.css. A good BrowserPlan settled complete, BrowserPlanCheck passed and all 6 BrowserVerify runs passed 5/5. The last verified entry's sha256 matches the final index.html, and the final screenshot resembles the source layout. Recompute $0.085356435, diff 0.",
   "notes": "The text check passed first time on an h1 using <br>, observed as 'Grown in the mist, shipped green.', and the page was never rewritten to satisfy a check. The Google Fonts request appears under blockedRequests with errors [] and the explanatory note. A subfolder entry, a bad server.path and a 404 URL were not exercised, and neither was a BrowserPlan refusal. A real invalid-JSON FileEdit occurred (missing new_string key) and settled refused, without tool-use or tool-result frames, paired in the session. Its message says 'character 432 of 2,823', and I checked that against inputPreview: 1-based position 432 is the `}` after `\"\"`, the text before and after is right, and the echo is capped at 2000 with '[823 more characters]'. The model retried validly. The session held 14 images, so fitImages did not run, and cache read ratio is 0.959. The 2 failed Bash calls are the model's own IndexError scripts."
  },
  {
   "id": "i1-headless-p",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "Headless -p exited 0 with no signal, using the saved key, because the runner removes ANTHROPIC_API_KEY from the environment. fizzbuzz.js works; I reran it and it prints correctly. The session is valid with paired calls. Recompute $0.00067631, diff 0.",
   "notes": "stdout is one result frame and stderr only the provider line, with no key in either; a pattern scan of the run folder found no key-shaped string. No permission denials. Scenario checks text names snapshot3, which is stale; the frozen snapshot10zc code was reviewed instead."
  },
  {
   "id": "i2-headless-bg-left",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "Headless -p started the server in the background, curl returned 200 'ok', and it exited 0. Afterwards result.json records port 8950 free and empty leftovers, and my own pgrep and lsof found nothing. Recompute $0.0008238, diff 0.",
   "notes": "The background notice tells the model the run stops its tasks when it ends, and the final answer says so correctly. The exact stop time (about 1.5 s) cannot be read from the saved evidence; only the free port after exit is recorded. No permission denials."
  }
 ]
}