# One-shot test: Slightly arched stone footbridge at the origin

Test `oneshot-mini-footbridge-arched`: one message per side with no reference image, then nothing; model claude-opus-5-5, runtime claude, effort low; finished 2026-10-15T08:30:59+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 | 3 | 3 | 3 | 3 | 3 | 1 | 1 | 1 | 1 | 1 |
| Rounds | 3 | 3 | 3 | 3 | 3 | 1 | 1 | 1 | 1 | 1 |
| Tool calls, by tool | 2: ToolSearch 1, execute_blender_code 1 | 2: ToolSearch 1, execute_blender_code 1 | 2: ToolSearch 1, execute_blender_code 1 | 2: ToolSearch 1, execute_blender_code 1 | 2: ToolSearch 1, execute_blender_code 1 | 3: StructuredOutput 1, angelo_execute_python 1, angelo_scene_program 1 | 3: StructuredOutput 1, angelo_execute_python 1, angelo_scene_program 1 | 2: StructuredOutput 1, angelo_scene_program 1 | 3: StructuredOutput 1, angelo_execute_python 1, angelo_scene_program 1 | 3: StructuredOutput 1, angelo_execute_python 1, angelo_scene_program 1 |
| Mutations: typed calls / script calls (typed share) | 0 / 1 (0 %) | 0 / 1 (0 %) | 0 / 0 (–) | 0 / 1 (0 %) | 0 / 1 (0 %) | 1 / 1 (50 %) | 1 / 1 (50 %) | 1 / 0 (100 %) | 1 / 1 (50 %) | 1 / 1 (50 %) |
| Scripts by category | geometry 1, materials 1 | geometry 1, materials 1 | geometry 1, materials 1 | geometry 1, materials 1 | geometry 1, materials 1 | geometry 1, materials 1 | geometry 1, materials 1 | none | geometry 1, materials 1 | geometry 1, materials 1 |
| Why each script (from the request's own steps) / scripts that raised | – | – | – | – | – | after typed work 1 / 0 | after typed work 1 / 0 | none / 0 | after typed work 1 / 0 | after typed work 1 / 0 |
| Each mutation in order | script (geometry, materials) | script (geometry, materials) | script (geometry, materials) | script (geometry, materials) | script (geometry, materials) | typed angelo_scene_program (7 ops); script (geometry, materials) | typed angelo_scene_program (7 ops); script (geometry, materials) | typed angelo_scene_program (10 ops) | typed angelo_scene_program (7 ops); script (geometry, materials) | typed angelo_scene_program (7 ops); script (geometry, materials) |
| Lookups before the first change, by tool | 1: ToolSearch 1 | 1: ToolSearch 1 | 1: ToolSearch 1 | 1: ToolSearch 1 | 1: ToolSearch 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 | 0 / 0 / 0 | 1 / 0 / 1 | 0 / 0 / 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 | 1.47 | 1.42 | 1.62 | 1.75 | 1.86 | 17.55 | 22.72 | 17.64 | 16.17 | 18.48 |
| Wall time, s | 15.74 | 17.18 | 17.99 | 17.91 | 17.6 | 19.33 | 23.9 | 18.85 | 17.92 | 20.28 |
| Tokens in (of which cached) / out | 111606 (85800) / 1507 | 111726 (101974) / 1650 | 111606 (101974) / 1574 | 111746 (101974) / 1623 | 111818 (101974) / 1714 | 36208 (34543) / 1723 | 36208 (34543) / 2013 | 36209 (34543) / 1853 | 36206 (34543) / 1802 | 36209 (34543) / 1939 |
| Output tokens | 1507 | 1650 | 1574 | 1623 | 1714 | 1723 | 2013 | 1853 | 1802 | 1939 |
| Cost at list prices, USD (runtime's own estimate) | 0.1763 (0.253724) | 0.1021 (0.1313868) | 0.1 (0.12890680000000002) | 0.1017 (0.1310068) | 0.1039 (0.13340280000000002) | 0.0547 (0.054681) | 0.0605 (0.060481) | 0.0573 (0.057289) | 0.0562 (0.056245) | 0.059 (0.059009) |

Angelo 1. Intended path: one message: yes (1 typed); error-ended turns: 0 (stop reason: finished); mutations by typed tools: 50 % (1 of 2 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: 50 % (1 of 2 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: 50 % (1 of 2 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: 50 % (1 of 2 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 | 17.6 [15.7-18] | 1623 [1507-1714] | 0 % [0 %-0 %] (1 no mutation) | 1 [1-1] | 0.1021 [0.1-0.1763] | finished 5 |
| Angelo | 5 of 5 | 19.3 [17.9-23.9] | 1853 [1723-2013] | 50 % [50 %-100 %] | 0 [0-0] | 0.0573 [0.0547-0.0605] | 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 1bbd9d176984f23051d9e1455e9c6a42ad22acf4756345e3ceb6e22751a0cef4):

> Add a slightly arched 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`.

