# One-shot test: A new scene camera aimed at the cube

Test `oneshot-mini-camera`: one message per side with no reference image, then nothing; model claude-opus-5-5, runtime claude, effort low; finished 2026-10-15T08:38:07+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 | 4 / 4 | none asked | finished |
| Blender MCP (Claude Code) 2 | PASSED | 4 / 4 | none asked | finished |
| Blender MCP (Claude Code) 3 | PASSED | 4 / 4 | none asked | finished |
| Blender MCP (Claude Code) 4 | PASSED | 4 / 4 | none asked | finished |
| Blender MCP (Claude Code) 5 | PASSED | 4 / 4 | none asked | finished |
| Angelo 1 | PASSED | 4 / 4 | none asked | finished |
| Angelo 2 | PASSED | 4 / 4 | none asked | finished |
| Angelo 3 | PASSED | 4 / 4 | none asked | finished |
| Angelo 4 | PASSED | 4 / 4 | none asked | finished |
| Angelo 5 | PASSED | 4 / 4 | 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 | 4 / 4 | 4 / 4 | 4 / 4 | 4 / 4 | 4 / 4 | 4 / 4 | 4 / 4 | 4 / 4 | 4 / 4 | 4 / 4 |
| 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: execute_blender_code 2, ToolSearch 1 | 3: execute_blender_code 2, ToolSearch 1 | 3: execute_blender_code 2, ToolSearch 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 / 2 (0 %) | 0 / 2 (0 %) | 0 / 2 (0 %) | 1 / 0 (100 %) | 1 / 0 (100 %) | 1 / 0 (100 %) | 1 / 0 (100 %) | 1 / 0 (100 %) |
| Scripts by category | camera_lighting 1, objects 1 | camera_lighting 1, objects 1 | camera_lighting 1, objects 1 | camera_lighting 1, objects 1 | camera_lighting 1, objects 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 (objects); script (camera_lighting) | script (objects); script (camera_lighting) | script (objects); script (camera_lighting) | script (objects); script (camera_lighting) | script (objects); script (camera_lighting) | 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 | 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 | 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 | 2.88 | 2.4 | 5.13 | 3.01 | 2.79 | 3.93 | 3.07 | 4.87 | 3.49 | 5.63 |
| Wall time, s | 13.37 | 12.7 | 15.79 | 14.24 | 13.44 | 3.98 | 3.13 | 4.92 | 3.54 | 5.68 |
| Tokens in (of which cached) / out | 148319 (122937) / 823 | 148374 (139109) / 901 | 148399 (139105) / 889 | 148358 (139105) / 851 | 148317 (139105) / 850 | 36192 (34543) / 227 | 36194 (34543) / 226 | 36191 (34543) / 227 | 36195 (34543) / 227 | 35865 (34543) / 227 |
| Output tokens | 823 | 901 | 889 | 851 | 850 | 227 | 226 | 227 | 227 | 227 |
| Cost at list prices, USD (runtime's own estimate) | 0.1679 (0.24407140000000002) | 0.0922 (0.1199298) | 0.0921 (0.119921) | 0.0911 (0.118833) | 0.0909 (0.11848500000000001) | 0.0246 (0.024633) | 0.0246 (0.024629) | 0.0246 (0.024625) | 0.0247 (0.024657) | 0.022 (0.022017) |

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: 4 of 4.

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: 4 of 4.

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: 4 of 4.

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: 4 of 4.

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: 4 of 4.

## 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 | 13.4 [12.7-15.8] | 851 [823-901] | 0 % [0 %-0 %] | 1 [1-1] | 0.0921 [0.0909-0.1679] | finished 5 |
| Angelo | 5 of 5 | 4 [3.1-5.7] | 227 [226-227] | 100 % [100 %-100 %] | 0 [0-0] | 0.0246 [0.022-0.0247] | 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 4e7bac3a0c213db67758717d42bcc8d61358e37ea8e6ba8e9cb04f8dca1a17d8):

> Add a camera at (6, -8, 4) aimed at the cube with a 50 mm lens, make it the scene camera, then delete the old camera.

## 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`.

