{
 "model": "claude-haiku-5-5",
 "category": "build",
 "scenarios": [
  {
   "id": "a1-static-site",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "Built the 5-page Panaderia Sol site with css/styles.css, js/main.js, the js/validate.js ES module, data/menu.json and 6 SVGs. I reran node --test (20/20 pass). Every href/src resolves to an existing file, and main.js has the Escape/Arrow lightbox and the fetch of menu.json. The agent checked all pages with curl (200) on a background http.server, then stopped it with TaskStop (exit 143, tasks frame 'stopped'). Port 8700 is free.",
   "notes": "35 tool calls in one turn (34 frames plus one refused call), 1 turn-complete, exit 0, empty .err, no leftovers. One BrowserPlan was refused for invalid input ('Not run: invalid input for \"BrowserPlan\": - plan.steps[0]: unknown key kind') and saved as state 'refused'. As designed, it has a tool-result frame and no tool-use frame. 3 BrowserVerify runs passed (16/33/33 checks). 41 outputs, all absent:true, and each one's last version sha matches the file on disk. All saved tool_use blocks are paired. Cost recomputed from usageTotals is $0.0504722 (matches). Cache reads 879,400 over 15 requests; 31 tools, TeamMemoryWrite present, no AskUserQuestion, no mcp__ tools, Skill catalog holds the 6 bundled skills. Heartbeats ran every 15 s (20 s to 1m35s) and stopped when reasoning output arrived. learned/patterns.json is correct under D17-1: 'node --test' (from `| tail; echo`) and 'mkdir -p ... && node --test' (from `| tail`) each have runs 1, successes 0, since the exit status is unknown. No GPCI, no DSH or auth folder."
  },
  {
   "id": "a2-vite-react",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "Scaffolded Vite react-ts non-interactively and installed. Started the dev server in the background on 8705 with --strictPort and checked it with curl (200 text/html). Changed the h1 to 'Hello from G-Code' and confirmed the served /src/App.tsx contains it. Left the server running as asked: the final tasks frame shows it running. I ran tsc -p tsconfig.app.json --noEmit, which is clean. result.json leftovers are empty after the driver exited, and port 8705 is free now.",
   "notes": "9 tool calls, all paired; exit 0; turn-complete. Cost recomputed = $0.00410825 (matches); cache reads 139,125. 19 outputs from the Bash scaffold and FileEdit; App.tsx has two versions (scaffold, then edit) with an absent baseline, which is correct because it was created in this turn. No verification command ran, so there is no learned file, which is correct. GPCI grep hits are only random base64 in the npm cache."
  },
  {
   "id": "a3-vite-build-preview",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "Scaffolded Vite vanilla-ts, installed, and added a coffee-origins section (Yirgacheffe, Huila, Antigua) to src/main.ts. npm run build passed (EXIT=0). dist/ has index.html and assets/index-*.js, and I found the origins in the bundle; tsc --noEmit is clean. The agent served dist on 8710 in the background, checked index.html and the JS asset with curl (200, byte-identical), stopped the server with TaskStop and confirmed the port was closed.",
   "notes": "Baseline check: main.ts was created by the scaffold within the turn, so the baseline is absent:true and versions[0] holds the original scaffold content (setupCounter, hero) before the edit. That is the expected Changes behaviour. The agent wrote temp files to /tmp and removed them. Cost recomputed = $0.00448082 (matches). Learned 'npm run build' from `2>&1 | tail -30; echo` has runs 1, successes 0 (status unknown), which is correct under D17-1. The dist output is not in Changes, presumably because .gitignore lists it."
  },
  {
   "id": "a4-canvas-game",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "Built the Snake game: index.html, game.js (ES module) and logic.js with an injectable RNG. I ran npm test (node --test test/logic.test.js): 65/65 pass. The agent fixed the package.json test glob, then iterated test-edit-retest until everything passed. The failure guard did not interrupt, and the turn completed normally.",
   "notes": "One FileEdit failed for real ('Edit 8 of 10: String to replace not found…', whitespace hint with line numbers) and stays state 'failed'; the model recovered. One BrowserVerify passed with 26 checks. Cost recomputed = $0.048622655 (matches); cache reads 1.05M over 20 requests. Learned key `cd \"<abs path>\" && npm test` has runs 2, successes 0 (both runs piped to tail), which is correct. The two longer commands were dropped because their keys exceed 160 characters, as designed. The key keeps the absolute cd prefix; that is cosmetic and by design. Heartbeats stopped once output arrived."
  },
  {
   "id": "a5-md-docs",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "Wrote a zero-dependency build.mjs (markdown subset, shared layout, nav, TOC) and test/build.test.mjs. I ran npm test: 37/37 pass. site/ has all 6 HTML files, and their saved output versions match disk after my rerun.",
   "notes": "Seed content shows the known harness printf issue: backticks were eaten, so the content has no fenced code and is missing the topic word ('about  with'). That is a harness issue, not G-Code. scenarios.json says effort medium, but driver.config and the controls frame say high, as the task brief states. 9 outputs; build.mjs has two versions with an absent baseline. Cost recomputed = $0.042224975 (matches). Learned: 'npm test' has runs 3, successes 0 (all `| tail`), and 'npm run build' has runs 1, successes 1 (`&& ls ...`, success-only), both correct under D17-1. One 'Still waiting for the model (20s)' frame appeared before any reasoning; the text is correct."
  },
  {
   "id": "a6-express-api",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "npm init plus express 5.3.0 installed; server.js has in-memory /api/notes CRUD and public/index.html. The agent ran it in the background on 8725, exercised create/list/update/delete/404 and the static page with curl, then stopped it with TaskStop (exit 143) and confirmed it was down. I started it myself on 18725: POST 201, GET 200, PUT 200, DELETE 204, missing note 404, GET / 200. I then killed it, and the port is free.",
   "notes": "10 tool calls, all paired; cost recomputed = $0.005316505 (matches). The only check-like command was `node --check`, which is not a verification, so there is no learned file. Correct."
  },
  {
   "id": "a7-chinese-site",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "Four Chinese pages share styles.css, and menu.js fetches menu.json and shows CNY prices. I reran check.mjs: all 4 pages pass lang=zh-CN and <title>. All project files decode as UTF-8 with no U+FFFD or mojibake. The saved session and log have zero U+FFFD, and the final summary is in Chinese.",
   "notes": "Two BrowserVerify runs failed because of the model's plans: a 'value' check on <html>, and a non-unique .dish-price selector (strict mode). Each was reported with a single 'Error:' prefix and kept state 'failed' (they ran). The third plan passed 10/10. One English progress sentence in the middle of the reply is model text, not engine text. Cost recomputed = $0.020657275 (matches). There was no 浏览器…验证 trigger in the message, so no skill block, which is correct."
  },
  {
   "id": "j1-todo-fullstack",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "Built the Node http server with a JSON file store, REST API and a vanilla JS frontend. I ran npm test: 50/50 pass (the tests use an ephemeral port). The agent started the app in the background on 8955, ran curl against the main endpoints, removed its smoke-test todo, and stopped the app with TaskStop (exit 0 through its SIGTERM handler). BrowserVerify passed 36 checks.",
   "notes": "The model loaded the browser-verify Skill explicitly: state complete, no approval. One BrowserPlan had arguments that were not valid JSON; it settled as 'refused' ('nothing was executed') through toolProgress and has no tool-result frame in the driver log, but the saved session pairs it. A second BrowserPlan was refused inside call() ('Entry must be a project HTML file … does not exist'; it threw from inspectBrowserPlan in browser/validation.ts) and settled 'failed'. That is consistent with 'ran and returned an error', though it is borderline: medium confidence that this is intended. Cost recomputed = $0.041878675 (matches). Learned 'npm test' has runs 1, successes 0 (`| tail`), which is correct."
  },
  {
   "id": "j2-cli-tool",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "Wrote csvstat.mjs (RFC-style quotes, embedded commas and newlines), scripts/generate-sample.mjs (2,000 rows) and tests. I ran npm test: 30/30 pass. I ran `node csvstat.mjs sample.csv`: exit 0, 2000 rows by 9 columns, with per-column count, distinct and min/max.",
   "notes": "The model chose a 'mixed' type for the salary column (it has n/a rows) and still reports min/max. That is the model's choice. Cost recomputed = $0.01661363 (matches). Learned key 'node scripts/generate-sample.mjs && node --test test/csvstat.test.mjs' has runs 1, successes 0 (`| tail`); D17-1 node --test recognition works."
  },
  {
   "id": "j7-sonnet-sanity",
   "status": "pass",
   "product_defects": [],
   "task_outcome": "TABLE.md lists the 8 planets with diameter and moons. The agent's node -e check printed 8 data rows and PASS, and I confirmed TABLE.md has 8 data rows.",
   "notes": "Baseline: 2 requests, 2 tool calls, 14 s, $0.001330925 (recomputed, matches), cache reads 24,395 (ratio 0.91). Effort is high per driver.config, while scenarios.json says medium. That is expected per the task brief, which says High for all except g8/g9."
  }
 ]
}