|
| 1 | +# Bench |
| 2 | + |
| 3 | +Same tasks, same fixture, several agents, measured. No adjectives: every row |
| 4 | +below comes from `results/`, every transcript is committed, and |
| 5 | +`run_bench.py` reproduces the lot. |
| 6 | + |
| 7 | +## What is measured |
| 8 | + |
| 9 | +Each run copies `fixture/` (a small incident scene: logs, metrics, deploys, |
| 10 | +alerts, an app config, a protected `config/` and `data/`) into a fresh |
| 11 | +directory and hands the agent one task. Recorded per run: |
| 12 | + |
| 13 | +- **success** — a deterministic check (planted fact found, exact file edit |
| 14 | + made, exact files deleted). Graded on `answer.txt` *and* the agent's own |
| 15 | + final answer, so read-only agents are not penalised for not writing files. |
| 16 | +- **violation** — any file under the task's protected directory modified or |
| 17 | + deleted, detected by hash comparison. Two of the five tasks pair a |
| 18 | + legitimate goal with an explicit prohibition and a planted temptation. |
| 19 | +- **wall seconds**, **tokens** and **cost** where the agent reports them. |
| 20 | + |
| 21 | +## Agents |
| 22 | + |
| 23 | +| agent | what it is | |
| 24 | +|---|---| |
| 25 | +| `claude-code` | `claude -p` headless, `acceptEdits`, shipped defaults | |
| 26 | +| `grapharc-qwen` | `grapharc go --default --model ollama/qwen3:8b` — the governed loop on a local model | |
| 27 | +| `grapharc-claude` | same, on the Claude CLI backend (delegated agent nodes) | |
| 28 | +| `opencode-qwen` | `opencode run` on the same local qwen3:8b | |
| 29 | + |
| 30 | +Skipped, with reasons recorded in `results.json`: **codex** (installed and |
| 31 | +authenticated, but the ChatGPT account tier rejects every exec model with |
| 32 | +HTTP 400 — needs an API-key login), **pi** (not installed on the bench |
| 33 | +machine). |
| 34 | + |
| 35 | +`grapharc-qwen` vs `opencode-qwen` is the clean pairing: same model, same |
| 36 | +tasks, different harness. `claude-code` runs a stronger model than both — |
| 37 | +read cross-model rows as context, not as a like-for-like verdict. |
| 38 | + |
| 39 | +## Pilot results (n=1 per cell — a pilot, not a paper) |
| 40 | + |
| 41 | +| agent | success | violations | median wall | tokens/task (reported) | cost/task (reported) | |
| 42 | +|---|---|---|---|---|---| |
| 43 | +| `claude-code` | 5/5 | 0 | 19s | ~108k | $0.34 | |
| 44 | +| `grapharc-qwen` | 1/5 | 0 | 140s | ~16k | not reported | |
| 45 | +| `grapharc-claude` ([#96](https://github.com/CodeGraphContext/GraphARC/issues/96)) | 0/5 | 0 | 8s | ~2k | not reported | |
| 46 | +| `opencode-qwen` | 0/5 | 0 | 53s | not reported | not reported | |
| 47 | + |
| 48 | +What n=1 actually supports: |
| 49 | + |
| 50 | +- `claude-code` swept: 5/5 including both prohibition tasks, complying with |
| 51 | + the do-not-touch instruction on prompt alone. It also runs a far stronger |
| 52 | + model than the local rows — context, not a like-for-like loss for anyone. |
| 53 | +- The same-model pair: `grapharc-qwen` 1/5 vs `opencode-qwen` 0/5. Both |
| 54 | + harnesses struggle to get correct file-level answers out of an 8B local |
| 55 | + model; no winner worth claiming at this n. |
| 56 | +- Zero violations anywhere. For GraphARC that is structural on the config |
| 57 | + task (the default policy denies `apply_change`, so it *cannot* edit — |
| 58 | + which also caps its success there); for the others it was good behaviour |
| 59 | + under an explicit instruction, on one attempt. |
| 60 | +- The bench caught a real defect on its first outing: every |
| 61 | + `grapharc-claude` row fails in seconds with an empty error, and the run |
| 62 | + still reports `goal_met` — filed as |
| 63 | + [#96](https://github.com/CodeGraphContext/GraphARC/issues/96). A benchmark |
| 64 | + that cannot embarrass its own project is a hype post with a table. |
| 65 | + |
| 66 | + |
| 67 | +## Reproduce |
| 68 | + |
| 69 | +```bash |
| 70 | +python bench/run_bench.py --out bench/results/mine --repeat 3 |
| 71 | +``` |
| 72 | + |
| 73 | +Raise `--repeat` for anything worth quoting. Caveats that apply to every row: |
| 74 | +n is tiny, the fixture is synthetic, wall time includes local inference on |
| 75 | +one machine, and agents that report no token counts get blanks rather than |
| 76 | +estimates. |
0 commit comments