# One-shot test: Stone footbridge at the origin

Test `oneshot-mini-footbridge`: one message per side with no reference image, then nothing; model claude-opus-5-5, runtime claude, effort low; finished 2026-10-15T08:26:03+0900. Limits: 300 s for the turn, 3 USD at list prices.

## Result

| Side | Verdict | Closed checks | Pixel checks | Stop reason |
| --- | --- | --- | --- | --- |
| Blender MCP (Claude Code) 1 | PASSED | 5 / 5 | none asked | finished |
| Blender MCP (Claude Code) 2 | PASSED | 5 / 5 | none asked | finished |
| Blender MCP (Claude Code) 3 | PASSED | 5 / 5 | none asked | finished |
| Blender MCP (Claude Code) 4 | PASSED | 5 / 5 | none asked | finished |
| Blender MCP (Claude Code) 5 | PASSED | 5 / 5 | none asked | finished |
| Angelo 1 | PASSED | 5 / 5 | none asked | finished |
| Angelo 2 | PASSED | 5 / 5 | none asked | finished |
| Angelo 3 | PASSED | 5 / 5 | none asked | finished |
| Angelo 4 | PASSED | 5 / 5 | none asked | finished |
| Angelo 5 | PASSED | 5 / 5 | none asked | finished |

A side passes only when it ended its one turn by itself and every closed check and pixel check passed. No score judged by a model is counted.

This test asks for no still, so it has no pixel check; it starts from the factory scene and does not ask for it to be cleared.

## How each side got there

| Path metric | Blender MCP (Claude Code) 1 | Blender MCP (Claude Code) 2 | Blender MCP (Claude Code) 3 | Blender MCP (Claude Code) 4 | Blender MCP (Claude Code) 5 | Angelo 1 | Angelo 2 | Angelo 3 | Angelo 4 | Angelo 5 |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| Verdict (closed checks only) | passed | passed | passed | passed | passed | passed | passed | passed | passed | passed |
| Closed checks passed | 5 / 5 | 5 / 5 | 5 / 5 | 5 / 5 | 5 / 5 | 5 / 5 | 5 / 5 | 5 / 5 | 5 / 5 | 5 / 5 |
| Messages typed | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| Stop reason | finished | finished | finished | finished | finished | finished | finished | finished | finished | finished |
| Model requests | 4 | 5 | 5 | 5 | 4 | 1 | 1 | 1 | 1 | 1 |
| Rounds | 4 | 5 | 5 | 5 | 4 | 1 | 1 | 1 | 1 | 1 |
| Tool calls, by tool | 3: ToolSearch 1, execute_blender_code 1, get_objects_summary 1 | 4: execute_blender_code 3, ToolSearch 1 | 4: execute_blender_code 3, ToolSearch 1 | 4: execute_blender_code 2, ToolSearch 1, get_objects_summary 1 | 3: ToolSearch 1, execute_blender_code 1, get_objects_summary 1 | 2: StructuredOutput 1, angelo_scene_program 1 | 2: StructuredOutput 1, angelo_scene_program 1 | 2: StructuredOutput 1, angelo_scene_program 1 | 2: StructuredOutput 1, angelo_scene_program 1 | 2: StructuredOutput 1, angelo_scene_program 1 |
| Mutations: typed calls / script calls (typed share) | 0 / 1 (0 %) | 0 / 2 (0 %) | 0 / 2 (0 %) | 0 / 1 (0 %) | 0 / 1 (0 %) | 1 / 0 (100 %) | 1 / 0 (100 %) | 1 / 0 (100 %) | 1 / 0 (100 %) | 1 / 0 (100 %) |
| Scripts by category | geometry 1, materials 1 | materials 2, geometry 1, objects 1 | objects 2, geometry 1, materials 1 | geometry 1, materials 1, objects 1 | geometry 1, materials 1 | none | none | none | none | none |
| Why each script (from the request's own steps) / scripts that raised | – | – | – | – | – | none / 0 | none / 0 | none / 0 | none / 0 | none / 0 |
| Each mutation in order | script (geometry, materials) | script (objects); script (geometry, materials); script (materials) | script (objects); script (geometry, materials); script (objects) | script (geometry, materials); script (objects) | script (geometry, materials) | typed angelo_scene_program (8 ops) | typed angelo_scene_program (8 ops) | typed angelo_scene_program (8 ops) | typed angelo_scene_program (8 ops) | typed angelo_scene_program (8 ops) |
| Lookups before the first change, by tool | 2: ToolSearch 1, get_objects_summary 1 | 1: ToolSearch 1 | 1: ToolSearch 1 | 2: ToolSearch 1, get_objects_summary 1 | 2: ToolSearch 1, get_objects_summary 1 | 0 | 0 | 0 | 0 | 0 |
| Capability lookups / lookup rounds / rejected plans | – | – | – | – | – | 0 / 0 / 0 | 0 / 0 / 0 | 0 / 0 / 0 | 0 / 0 / 0 | 0 / 0 / 0 |
| Approvals asked / approved / declined | no approval gate | no approval gate | no approval gate | no approval gate | no approval gate | 0 / 0 / 0 | 0 / 0 / 0 | 0 / 0 / 0 | 0 / 0 / 0 | 0 / 0 / 0 |
| Seconds waited on approvals | – | – | – | – | – | 0.0 | 0.0 | 0.0 | 0.0 | 0.0 |
| Declined by the harness's approval policy (not a product failure) | – | – | – | – | – | none | none | none | none | none |
| Errors: total / recovered in the turn / ended the turn | 0 / 0 / 0 | 1 / 1 / 0 | 1 / 1 / 0 | 1 / 1 / 0 | 0 / 0 / 0 | 0 / 0 / 0 | 0 / 0 / 0 | 0 / 0 / 0 | 0 / 0 / 0 | 0 / 0 / 0 |
| Looked at an image of its own result | 0 image(s); reached the model: 0 | 0 image(s); reached the model: 0 | 0 image(s); reached the model: 0 | 0 image(s); reached the model: 0 | 0 image(s); reached the model: 0 | 0 image(s); reached the model: 0 | 0 image(s); reached the model: 0 | 0 image(s); reached the model: 0 | 0 image(s); reached the model: 0 | 0 image(s); reached the model: 0 |
| Looked at its result after its last edit | no | no | no | no | no | no | no | no | no | no |
| Rendered in the turn | no | no | no | no | no | no | no | no | no | no |
| Saw its final render | unknown | unknown | unknown | unknown | unknown | unknown | unknown | unknown | unknown | unknown |
| Time to first visible activity, s | 3.81 | 1.71 | 1.64 | 4.01 | 1.54 | 10.11 | 12.58 | 10.53 | 9.81 | 10.18 |
| Wall time, s | 24.12 | 18.39 | 18.92 | 21.93 | 16.63 | 10.2 | 13.81 | 12.21 | 10.58 | 11.02 |
| Tokens in (of which cached) / out | 149295 (123353) / 1153 | 186798 (177015) / 1519 | 187102 (177104) / 1532 | 188199 (177865) / 1572 | 149372 (139522) / 1345 | 36201 (34543) / 1091 | 36197 (34543) / 1138 | 36198 (34543) / 1192 | 36198 (34543) / 1066 | 36196 (34543) / 1083 |
| Output tokens | 1153 | 1519 | 1532 | 1572 | 1345 | 1091 | 1138 | 1192 | 1066 | 1083 |
| Cost at list prices, USD (runtime's own estimate) | 0.1774 (0.2552346) | 0.1147 (0.144007) | 0.116 (0.1460048) | 0.1187 (0.149645) | 0.104 (0.1335724) | 0.042 (0.041985) | 0.0429 (0.042893) | 0.044 (0.043981) | 0.0415 (0.041461) | 0.0418 (0.041785) |

Angelo 1. Intended path: one message: yes (1 typed); error-ended turns: 0 (stop reason: finished); mutations by typed tools: 100 % (1 of 1 calls); checks passed: 5 of 5.

Angelo 2. Intended path: one message: yes (1 typed); error-ended turns: 0 (stop reason: finished); mutations by typed tools: 100 % (1 of 1 calls); checks passed: 5 of 5.

Angelo 3. Intended path: one message: yes (1 typed); error-ended turns: 0 (stop reason: finished); mutations by typed tools: 100 % (1 of 1 calls); checks passed: 5 of 5.

Angelo 4. Intended path: one message: yes (1 typed); error-ended turns: 0 (stop reason: finished); mutations by typed tools: 100 % (1 of 1 calls); checks passed: 5 of 5.

Angelo 5. Intended path: one message: yes (1 typed); error-ended turns: 0 (stop reason: finished); mutations by typed tools: 100 % (1 of 1 calls); checks passed: 5 of 5.

## Over the trials

Each cell after the pass count is the median over the side's trials, then the least and the most in brackets. One trial is a sample of one: read a difference between sides against these ranges.

| Side | Passed | Seconds | Output tokens | Typed share of mutations | Lookups before the first change | Cost, list USD | How the turns ended |
| --- | --- | --- | --- | --- | --- | --- | --- |
| Blender MCP (Claude Code) | 5 of 5 | 18.9 [16.6-24.1] | 1519 [1153-1572] | 0 % [0 %-0 %] | 2 [1-2] | 0.116 [0.104-0.1774] | finished 5 |
| Angelo | 5 of 5 | 11 [10.2-13.8] | 1091 [1066-1192] | 100 % [100 %-100 %] | 0 [0-0] | 0.042 [0.0415-0.044] | finished 5 |

## Why a side did not pass

- **Blender MCP (Claude Code) 1**: passed.
- **Blender MCP (Claude Code) 2**: passed.
- **Blender MCP (Claude Code) 3**: passed.
- **Blender MCP (Claude Code) 4**: passed.
- **Blender MCP (Claude Code) 5**: passed.
- **Angelo 1**: passed.
- **Angelo 2**: passed.
- **Angelo 3**: passed.
- **Angelo 4**: passed.
- **Angelo 5**: passed.

## The brief

Sent once to each side, unchanged (SHA-256 81f5ccb4deb7901033bffffc66c6bf99027685dbb394eb7175bcbd71de75d744):

> Add a stone footbridge at the origin: a deck 4 m long and 1.2 m wide, four square posts and two rails, in a grey stone material.

## References

None: the message is text only.

## What the other side's client was allowed

- every tool of the Blender MCP server (model-written Python included, unrestricted)
- Claude Code's Read tool on image files anywhere, and its read-only file tools in its working folder and in the trial folder (stock Blender's working and temporary folder): it can open the images it rendered
- the reference images also as files in its working folder
- anything else that would prompt (shell, edits, web) is denied and counted: nobody answers prompts

## Not recorded

Shown as "unknown" above, and what records each:

- `angelo.final_render_seen`: whether the agent saw the still it rendered: recorded by add-ons whose job records carry a shown mark; without it only a job-rendered still is known (not seen inside the turn)

## Opinion (never counted)

No model-judged comparison was run. People judge the pictures in `oneshot-report.html`.

