# One-shot test: Bevel, subdivide and paint the default cube

Test `oneshot-mini-cube`: one message per side with no reference image, then nothing; model claude-opus-5-5, runtime claude, effort low; finished 2026-10-15T08:34:48+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 | 4 | 4 | 4 | 4 | 1 | 1 | 1 | 1 | 1 |
| Rounds | 4 | 4 | 4 | 4 | 4 | 1 | 1 | 1 | 1 | 1 |
| Tool calls, by tool | 3: execute_blender_code 2, ToolSearch 1 | 3: execute_blender_code 2, ToolSearch 1 | 3: ToolSearch 1, execute_blender_code 1, get_objects_summary 1 | 3: ToolSearch 1, execute_blender_code 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 / 2 (0 %) | 0 / 2 (0 %) | 0 / 1 (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 | materials 2, modifiers 2, geometry 1 | geometry 2, materials 2, modifiers 2 | materials 1, modifiers 1 | materials 1, modifiers 1 | materials 1, modifiers 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 (modifiers, materials); script (geometry, modifiers, materials) | script (geometry, modifiers, materials); script (geometry, modifiers, materials) | script (modifiers, materials) | script (modifiers, materials) | script (modifiers, materials) | typed angelo_scene_program (3 ops) | typed angelo_scene_program (3 ops) | typed angelo_scene_program (3 ops) | typed angelo_scene_program (3 ops) | typed angelo_scene_program (3 ops) |
| Lookups before the first change, by tool | 1: ToolSearch 1 | 1: ToolSearch 1 | 2: ToolSearch 1, get_objects_summary 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 | 0 / 0 / 0 | 0 / 0 / 0 | 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.72 | 1.74 | 2.88 | 3.13 | 1.83 | 4.04 | 3.82 | 3.75 | 3.83 | 5.41 |
| Wall time, s | 13.89 | 18.05 | 18.53 | 30.91 | 15.23 | 4.12 | 3.9 | 3.83 | 3.91 | 5.49 |
| Tokens in (of which cached) / out | 148808 (123233) / 1161 | 149248 (139415) / 1568 | 149368 (139514) / 1275 | 149394 (139514) / 1343 | 149491 (139514) / 1389 | 36196 (34543) / 307 | 36193 (34543) / 307 | 36195 (34543) / 307 | 36192 (34543) / 307 | 36194 (34543) / 293 |
| Output tokens | 1161 | 1568 | 1275 | 1343 | 1389 | 307 | 307 | 307 | 307 | 293 |
| Cost at list prices, USD (runtime's own estimate) | 0.1757 (0.2524346) | 0.1084 (0.137875) | 0.1027 (0.1322028) | 0.1042 (0.13377080000000002) | 0.1056 (0.13546680000000003) | 0.0263 (0.026265) | 0.0262 (0.026241) | 0.0263 (0.026257) | 0.0262 (0.026233) | 0.026 (0.025969) |

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.1 [13.9-30.9] | 1343 [1161-1568] | 0 % [0 %-0 %] | 2 [1-2] | 0.1056 [0.1027-0.1757] | finished 5 |
| Angelo | 5 of 5 | 3.9 [3.8-5.5] | 307 [293-307] | 100 % [100 %-100 %] | 0 [0-0] | 0.0262 [0.026-0.0263] | 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 c0e59d77c0666a44f5a3ee7941e9f858c71a0ad18bf742fcf06af050c8c34dbb):

> Bevel the cube's edges by 2 cm with 3 segments, add a Subdivision modifier at level 2, and give it a brushed-copper 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`.

