Desk comparison, 28 September 2026
Three AI agent setups each did all 187 file tasks three times, and every answer was checked with the same rules: 1,683 answers in total, none left out.
Proto is built by ERP.AI, which also runs this benchmark; Codex is OpenAI's coding agent. The two setups on GPT-6 sol share the model, its settings and the account, so their difference comes from the agent. The tasks were available while Proto was developed, and the three rounds did not all run under the same machine load, so compare task times with care. These results are separate from the 16 September results.
Frozen and raw scores
| System | Frozen pass rate | Frozen / 561 | By repetition | All 3 / 187 | Raw / 561 | Timed out | Median min | p90 min |
|---|---|---|---|---|---|---|---|---|
| Proto / DeepSeek V4.1 Flash Proto CLI, unreleased build · DeepSeek API direct, high reasoning, temperature 0.7 | 502 | 171 · 168 · 163 | 147 | 444 | 1 | 1.30 | 3.12 | |
| Proto / GPT-6 sol Proto CLI, unreleased build · ChatGPT subscription through the Codex sign-in, high reasoning | 495 | 165 · 167 · 163 | 153 | 443 | 1 | 1.91 | 3.63 | |
| Codex / GPT-6 sol Codex CLI 0.158.0-alpha.2.1 · ChatGPT subscription, high reasoning, CLI-managed sampling | 487 | 162 · 162 · 163 | 144 | 440 | 0 | 1.48 | 3.98 |
Proto / GPT-6 sol minus Codex / GPT-6 sol is +1.43 percentage points under the frozen scorer. A paired, task-clustered bootstrap (20,000 resamples, seed 20260928) gives a descriptive 95% interval of −1.78 to +4.81 points. The two share model gpt-6-sol and reasoning high. The interval describes variation across these tasks; it excludes related task families, evaluator selection and deployment shift.
The same supplied inputs are used in each repetition, so variation here measures execution repeatability, not performance on new business cases. Task times depend on what else was running (see Provenance).
By category
| Category | Tasks | Proto DeepSeek | Proto GPT-6 | Codex |
|---|---|---|---|---|
| Spreadsheet | 41 | 116 / 123 | 120 / 123 | 115 / 123 |
| Bookkeeping | 36 | 94 / 108 | 95 / 108 | 92 / 108 |
| Reports | 30 | 78 / 90 | 67 / 90 | 68 / 90 |
| Reformatting | 26 | 73 / 78 | 75 / 78 | 77 / 78 |
| Extraction | 26 | 73 / 78 | 71 / 78 | 72 / 78 |
| Drafting | 19 | 51 / 57 | 44 / 57 | 40 / 57 |
| Tooling | 9 | 17 / 27 | 23 / 27 | 23 / 27 |
Categories hold between 9 and 41 tasks, so one attempt moves a category rate by several points.
What the frozen scorer changed
The runner recorded original verdicts at execution time. The same frozen package used for the release, scoring/frozen-v7, then scored each retained output. These are evaluator changes on the same artifacts, not reruns or repairs.
| System | Pass → pass | Fail → pass | Ungraded → pass | Pass → fail | Fail → fail | Ungraded → fail | Net pass change |
|---|---|---|---|---|---|---|---|
| Proto / DeepSeek V4.1 Flash | 444 | 55 | 3 | 0 | 58 | 1 | +58 |
| Proto / GPT-6 sol | 442 | 50 | 3 | 1 | 65 | 0 | +52 |
| Codex / GPT-6 sol | 439 | 45 | 3 | 1 | 73 | 0 | +47 |
| System | Nonzero exit | Passing, abnormal exit | Raw grader errors | Frozen grader errors | Missing usage |
|---|---|---|---|---|---|
| Proto / DeepSeek V4.1 Flash | 1 | 1 | 4 | 0 | 0 |
| Proto / GPT-6 sol | 1 | 0 | 3 | 0 | 0 |
| Codex / GPT-6 sol | 0 | 0 | 3 | 0 | 0 |
Resource use
| System | Input tokens | Cached input | Uncached input | Output tokens | Summed task time (h) |
|---|---|---|---|---|---|
| Proto / DeepSeek V4.1 Flash | 300.1M | 275.3M | 24.8M | 10.9M | 16.6 |
| Proto / GPT-6 sol | 172.7M | 153.4M | 19.3M | 2.8M | 21.4 |
| Codex / GPT-6 sol | 92.8M | 81.6M | 11.2M | 3.0M | 19.6 |
No cost estimates are published for this campaign. The frozen pricing table has no gpt-6-sol or direct DeepSeek V4.1 Flash rate. Codex CLI results had been priced at gpt-5.6-sol rates because of a default model label, so those figures are omitted rather than published mispriced. Both gpt-6-sol cells used a ChatGPT subscription, which is not billed per token. Token usage for the Proto cells comes from Proto's provider traces and for Codex from the CLI's reported turn usage. Codex CLI results carried the usage extractor's default model label gpt-5.6-sol; the CLI's own session context records gpt-6-sol at high effort, so that key is renamed in usage.by_model. Summed durations measure occupied task time, not elapsed campaign time under concurrency.
Per-task matrix
One square per repetition. Green is a frozen pass; a green square with a hollow centre passed under the frozen scorer but was originally failed or ungraded; grey is a fail; a hollow grey centre is a timeout. 0 tasks passed for no system; 114 passed for every system.
Provenance
| Campaign | complete-desk-comparison-2026-09-28, three repetitions, executed 2026-09-28T05:29:42Z to 2026-09-29T10:48:25Z |
| Ledger SHA-256 | 76b6ecc00c541d0100f945899d9d768ff3c31a9b98eedb546f9d83ba1d0a7ebd |
| Scorer manifest SHA-256 | b4720db00f2a55461ca70767a4baf8dd2d25aa9d301e8fe22ea13d21ccca358f |
| Configuration: Proto / GPT-6 sol | system: Proto CLI, headless one-shot run (-y), Uninterrupted modebuild: Proto runtime bundle built from Proto commit 3bbb33f8e plus unreleased changes: the open prompt-cache change erphq/proto#601 and working-tree changes later committed as 9cdfcb545..1103377dc. Proto's source is private; bundle_sha256 identifies the buildbundle_sha256: 046142d9363378c3384a4980a07dca71246a903ffe12ae2468c59ac34b4294afmodel: gpt-6-solprovider: ChatGPT subscription through Codex OAuth, the same account as codex-sol6reasoning: highsampling: provider defaultadapter: harnesses/proto-sol6-sub.sh (calls harnesses/proto-sub.sh)home: llmProvider codex, selectedModel openai-codex/gpt-6-sol; no ERP.AI sign-inconcurrency: 4 for every repetition |
| Configuration: Codex / GPT-6 sol | system: Codex CLI execcli_version: 0.158.0-alpha.2.1model: gpt-6-solprovider: ChatGPT subscription, the same account as proto-sol6-subreasoning: highsampling: CLI-managedadapter: harnesses/codex-sol6.shhome: minimal CODEX_HOME: sign-in plus a config with apps and plugins offconcurrency: 4 for every repetition |
| Configuration: Proto / DeepSeek V4.1 Flash | system: Proto CLI, headless one-shot run (-y)build: the same Proto bundle as proto-sol6-subbundle_sha256: 046142d9363378c3384a4980a07dca71246a903ffe12ae2468c59ac34b4294afmodel: DeepSeek V4.1 Flash (API model deepseek-flash)provider: DeepSeek API, directreasoning: hightemperature: 0.7max_tokens: 65536adapter: harnesses/proto-deepseek-direct.sh (its header comment predates this campaign; the build is identified by bundle_sha256)home: custom provider at api.deepseek.com; the home holds an ERP.AI sign-in bootstrap, but no ERP.AI actions were offered in its requestsconcurrency: 8 for every repetition |
| Conditions by repetition | Repetition 1 ran on 28 September 05:29-07:33 UTC with all three systems side by side. Repetitions 2 and 3 of Codex and of Proto on DeepSeek ran side by side from 28 September 20:57 to 29 September 00:45 UTC. Repetitions 2 and 3 of Proto on gpt-6-sol ran alone on 29 September. All used the same images, adapters and homes. |
| Evidence verification | Every attempt: the receipt names this run, its original_result_sha256 equals the hash of the original result.json, and it was scored by the frozen conservative-v7 package. |
| Excluded | Proto + gpt-6-sol attempts that made no model request because the provider rejected the sign-in (68) are not in the ledger; each affected task was rerun to completion. Also excluded: development runs on task subsets, smoke runs, pilots, raw traces and credentials. |
Verify the published data with python bench/export_desk_campaign.py --verify. It checks the complete task × system × repetition matrix, the summary arithmetic, the paired bootstrap, the ledger hash and every file in the frozen scorer package against the attempt ledger, summary and provenance. It does not regrade the original artifacts, which remain private; their hashes are in the ledger.