Benchmark · Angelo 1.0 release candidate 6 · Claude Opus 5.5

Every result, both sides.

The runs behind the speed numbers: what Angelo and Blender MCP each made from the same one-message briefs, every check they had to pass, failures included, and the reports themselves to download.

At a glance.

Claude Opus 5.5, effort low, on both sides; Claude Code 2.1.293; medians of 5 trials a side, the two sides taking turns on a quiet machine. Every cost is Claude Code's own estimate at list prices, not a bill.

SetTimeModel callsGraded correctEstimated cost
Five everyday tasksmedian of whole trialsAngelo 14.4 sMCP 34.6 s2.4× fasterAngelo 5MCP 12Angelo 25/25MCP 25/25Angelo $0.088MCP $0.173
A 40-task sessionmedian of whole trialsAngelo 98.2 sMCP 187.9 s1.9× fasterAngelo 40MCP 82Angelo 200/200MCP 200/200Angelo $0.706MCP $1.228
Stone footbridgeone-message sceneAngelo 11 sMCP 18.9 s1.7× fasterAngelo 1MCP 5Angelo 5/5MCP 5/5Angelo $0.042MCP $0.146
Arched footbridgeone-message sceneAngelo 19.3 sMCP 17.6 s1.1× slowerAngelo 1MCP 3Angelo 5/5MCP 5/5Angelo $0.0573MCP $0.1314
Bevel, subdivide, copperone-message sceneAngelo 3.9 sMCP 18.1 s4.6× fasterAngelo 1MCP 4Angelo 5/5MCP 5/5Angelo $0.0262MCP $0.1355
New scene cameraone-message sceneAngelo 4 sMCP 13.4 s3.4× fasterAngelo 1MCP 4Angelo 5/5MCP 5/5Angelo $0.0246MCP $0.1199
Three-point lightingone-message sceneAngelo 8.7 sMCP 18.8 s2.2× fasterAngelo 1MCP 4Angelo 5/5MCP 1/5Angelo $0.0353MCP $0.1343

Every read we timed against stock Blender.

Preliminary Angelo reads a mesh's vertex-group weights about 180× faster than stock Blender's fastest route. Angelo reads your scene with native code added to Blender. Each row is a read Angelo makes on every edit, timed against the fastest route stock Blender 5.2.2 LTS offers for the same data, on the same scene and machine. Medians of 7 runs, range in brackets. Where stock Blender is as fast or faster, the row says so. The list grows with each release.

Shared clock3.94ms
PreliminarySlowed down 1,000×
Stock Blender386 msper million vertices, median [383–390]bmesh deform layer: vertex[layer].items() (packed records)
0.56%10,193 of 1,831,116 vertices read
Angelo2.15 msper million vertices, median [2.11–2.41]Mesh.angelo_vertex_group_weights (bytes of records)
100%1,831,116 of 1,831,116 vertices read
Angelo has read the vertex-group weights of every vertex of the castle. Stock Blender's fastest Python route has read 0.56% of them.

Each dot is a vertex of the castle, lit when its vertex is read, in the order both sides read them, at the rates measured per million vertices on the whole scene. The 65 merlons that share one mesh light with its first copy, when that mesh is read. Slowed down 1,000× so you can see it. Both sides run on the same clock, on the same Apple M4 Pro, 14 cores, macOS 26.3. Once Angelo finishes, the frame holds; then the other side plays on fast-forwarded ×60, as its label says.

What is readStock Blender's fastest routeStock BlenderAngeloAngelo isSince
Vertex positionsMesh.attributes['position'].data.foreach_get('vector', preallocated float32 array)
2 other stock routes
  • MeshVertices.foreach_get('co', float32 array) 16 ms
  • ctypes.memmove from Mesh.attributes['position'].data[0].as_pointer() (unsupported) 1.16 ms
0.77 msper million vertices [0.72–0.86]0.93 msper million vertices [0.89–1.09]1.2× slower1.0
Vertex-group weightsStock Python has no bulk vertex-group read.bmesh deform layer: vertex[layer].items() (packed records)
1 other stock route
  • for vertex in mesh.vertices: for group in vertex.groups (packed records) 703 ms
386 msper million vertices [383–390]2.15 msper million vertices [2.11–2.41]180× faster1.0
Face corners and offsetsReads every face corner.Mesh.attributes['.corner_vert'].data.foreach_get('value') + MeshPolygons.foreach_get('loop_start')
1 other stock route
  • MeshLoops.foreach_get('vertex_index') + MeshPolygons.foreach_get('loop_total') 166 ms
22.7 msper million vertices [22.5–23.2]1.4 msper million vertices [1.26–1.48]16× faster1.0
A ray-cast tree of the 692,224-vertex terrainmathutils.bvhtree.BVHTree.FromObject(object, depsgraph)63.8 msper check [62.1–118]62.1 msper check [60.6–63.8]as fast1.0
1,000 single-vertex group readsMesh.vertices[i].groups0.87 msper check [0.86–0.91]0.76 msper check [0.75–0.82]as fast1.0
1,000 image size and format readsA loaded image; the stock getters would also load an unloaded one.Image.size, .channels, .depth, .is_float0.40 msper check [0.39–0.41]0.56 msper check [0.55–0.57]1.4× slower1.0
1,000 registered-property readsA property registered with bpy.props (its value is kept in the ID's system properties).ID.name (a bpy.props property)0.057 msper check [0.055–0.13]0.28 msper check [0.27–0.29]4.8× slower1.0
List another .blend's objects (a copy of the scene's file)With the product's own limits the scan refuses this file (see not_timed).Not timed: the same scan with the product's own limits (RuntimeError: metadata_scan: LIMIT_EXCEEDED (blocks read 2000000))bpy.data.libraries.load(path) as (source, into): source.objects135 msper check [133–135]874 msper check [866–889]6.5× slower1.0
The mesh being sculptedThe statue in Sculpt Mode; the stock route re-evaluates the object.Object.evaluated_get(depsgraph).to_mesh()0.041 msper check [0.036–0.14]0.048 msper check [0.034–0.049]as fast1.0
1,000 ray hits on the mesh being sculptedObject.ray_cast(origin, direction, depsgraph=...)1.99 msper check [1.97–2.31]28.1 msper check [26.4–42.2]14× slower1.0
1,000 vertex positions while sculptingMesh.vertices[i].co1.13 msper check [1.11–1.26]1.39 msper check [1.34–1.46]1.2× slower1.0

Measured on Apple M4 Pro, 14 cores, macOS 26.3, Angelo a7fa84aeaa2. Reproduce it with python3 tests/python/angelo_agent/bench_native_reads.py in the Angelo source.

What each side made.

One brief per side from Blender's default scene, with no reference image and no follow-up, then the scene is checked. Five trials a side for each scene. Each picture is a trial's own scene: the final still the harness rendered with the scene's settings, or one of four fixed views. Select a picture for the full size.

Stone footbridge

“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.”

The 5 checks, read from the scene after the turn
  1. a footbridge about 4 x 1.2 m at the origin
  2. a deck 4 m long and 1.2 m wide, flat
  3. four square posts
  4. two rails
  5. a grey stone material on all of it

Blender MCPpassed 5 of 5 · median 18.9 s · $0.146 estimated

  1. Blender MCP, trial 1, Stone footbridge: final still of the scene it made.

    Trial 1✓ Passed 5/5

    24.12 s · $0.2552

  2. Blender MCP, trial 2, Stone footbridge: final still of the scene it made.

    Trial 2✓ Passed 5/5

    18.39 s · $0.144

  3. Blender MCP, trial 3, Stone footbridge: final still of the scene it made.

    Trial 3✓ Passed 5/5

    18.92 s · $0.146

  4. Blender MCP, trial 4, Stone footbridge: final still of the scene it made.

    Trial 4✓ Passed 5/5

    21.93 s · $0.1496

  5. Blender MCP, trial 5, Stone footbridge: final still of the scene it made.

    Trial 5✓ Passed 5/5

    16.63 s · $0.1336

Angelopassed 5 of 5 · median 11 s · $0.042 estimated

  1. Angelo, trial 1, Stone footbridge: final still of the scene it made.

    Trial 1✓ Passed 5/5

    10.2 s · $0.042

  2. Angelo, trial 2, Stone footbridge: final still of the scene it made.

    Trial 2✓ Passed 5/5

    13.81 s · $0.0429

  3. Angelo, trial 3, Stone footbridge: final still of the scene it made.

    Trial 3✓ Passed 5/5

    12.21 s · $0.044

  4. Angelo, trial 4, Stone footbridge: final still of the scene it made.

    Trial 4✓ Passed 5/5

    10.58 s · $0.0415

  5. Angelo, trial 5, Stone footbridge: final still of the scene it made.

    Trial 5✓ Passed 5/5

    11.02 s · $0.0418

Arched footbridge

“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.”

The 5 checks, read from the scene after the turn
  1. a footbridge about 4 x 1.2 m at the origin
  2. a deck 4 m long and 1.2 m wide, slightly arched
  3. four square posts
  4. two rails
  5. a grey stone material on all of it

Blender MCPpassed 5 of 5 · median 17.6 s · $0.1314 estimated

  1. Blender MCP, trial 1, Arched footbridge: final still of the scene it made.

    Trial 1✓ Passed 5/5

    15.74 s · $0.2537

  2. Blender MCP, trial 2, Arched footbridge: final still of the scene it made.

    Trial 2✓ Passed 5/5

    17.18 s · $0.1314

  3. Blender MCP, trial 3, Arched footbridge: final still of the scene it made.

    Trial 3✓ Passed 5/5

    17.99 s · $0.1289

  4. Blender MCP, trial 4, Arched footbridge: final still of the scene it made.

    Trial 4✓ Passed 5/5

    17.91 s · $0.131

  5. Blender MCP, trial 5, Arched footbridge: final still of the scene it made.

    Trial 5✓ Passed 5/5

    17.6 s · $0.1334

Angelopassed 5 of 5 · median 19.3 s · $0.0573 estimated

  1. Angelo, trial 1, Arched footbridge: final still of the scene it made.

    Trial 1✓ Passed 5/5

    19.33 s · $0.0547

  2. Angelo, trial 2, Arched footbridge: final still of the scene it made.

    Trial 2✓ Passed 5/5

    23.9 s · $0.0605

  3. Angelo, trial 3, Arched footbridge: final still of the scene it made.

    Trial 3✓ Passed 5/5

    18.85 s · $0.0573

  4. Angelo, trial 4, Arched footbridge: final still of the scene it made.

    Trial 4✓ Passed 5/5

    17.92 s · $0.0562

  5. Angelo, trial 5, Arched footbridge: final still of the scene it made.

    Trial 5✓ Passed 5/5

    20.28 s · $0.059

Bevel, subdivide, copper

“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.”

The 5 checks, read from the scene after the turn
  1. the default cube is still there (the factory scene is kept)
  2. the cube is where and as large as it was
  3. edges bevelled 2 cm, 3 segments
  4. a Subdivision modifier at level 2
  5. a brushed-copper material

Blender MCPpassed 5 of 5 · median 18.1 s · $0.1355 estimated

  1. Blender MCP, trial 1, Bevel, subdivide, copper: final still of the scene it made.

    Trial 1✓ Passed 5/5

    13.89 s · $0.2524

  2. Blender MCP, trial 2, Bevel, subdivide, copper: final still of the scene it made.

    Trial 2✓ Passed 5/5

    18.05 s · $0.1379

  3. Blender MCP, trial 3, Bevel, subdivide, copper: final still of the scene it made.

    Trial 3✓ Passed 5/5

    18.53 s · $0.1322

  4. Blender MCP, trial 4, Bevel, subdivide, copper: final still of the scene it made.

    Trial 4✓ Passed 5/5

    30.91 s · $0.1338

  5. Blender MCP, trial 5, Bevel, subdivide, copper: final still of the scene it made.

    Trial 5✓ Passed 5/5

    15.23 s · $0.1355

Angelopassed 5 of 5 · median 3.9 s · $0.0262 estimated

  1. Angelo, trial 1, Bevel, subdivide, copper: final still of the scene it made.

    Trial 1✓ Passed 5/5

    4.12 s · $0.0263

  2. Angelo, trial 2, Bevel, subdivide, copper: final still of the scene it made.

    Trial 2✓ Passed 5/5

    3.9 s · $0.0262

  3. Angelo, trial 3, Bevel, subdivide, copper: final still of the scene it made.

    Trial 3✓ Passed 5/5

    3.83 s · $0.0263

  4. Angelo, trial 4, Bevel, subdivide, copper: final still of the scene it made.

    Trial 4✓ Passed 5/5

    3.91 s · $0.0262

  5. Angelo, trial 5, Bevel, subdivide, copper: final still of the scene it made.

    Trial 5✓ Passed 5/5

    5.49 s · $0.026

New scene camera

“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.”

The 4 checks, read from the scene after the turn
  1. the default cube is still there (the factory scene is kept)
  2. the cube is where and as large as it was
  3. one camera remains: the old one is gone
  4. the scene camera is at (6, -8, 4), aimed at the cube, 50 mm

Blender MCPpassed 5 of 5 · median 13.4 s · $0.1199 estimated

  1. Blender MCP, trial 1, New scene camera: final still of the scene it made.

    Trial 1✓ Passed 4/4

    13.37 s · $0.2441

  2. Blender MCP, trial 2, New scene camera: final still of the scene it made.

    Trial 2✓ Passed 4/4

    12.7 s · $0.1199

  3. Blender MCP, trial 3, New scene camera: final still of the scene it made.

    Trial 3✓ Passed 4/4

    15.79 s · $0.1199

  4. Blender MCP, trial 4, New scene camera: final still of the scene it made.

    Trial 4✓ Passed 4/4

    14.24 s · $0.1188

  5. Blender MCP, trial 5, New scene camera: final still of the scene it made.

    Trial 5✓ Passed 4/4

    13.44 s · $0.1185

Angelopassed 5 of 5 · median 4 s · $0.0246 estimated

  1. Angelo, trial 1, New scene camera: final still of the scene it made.

    Trial 1✓ Passed 4/4

    3.98 s · $0.0246

  2. Angelo, trial 2, New scene camera: final still of the scene it made.

    Trial 2✓ Passed 4/4

    3.13 s · $0.0246

  3. Angelo, trial 3, New scene camera: final still of the scene it made.

    Trial 3✓ Passed 4/4

    4.92 s · $0.0246

  4. Angelo, trial 4, New scene camera: final still of the scene it made.

    Trial 4✓ Passed 4/4

    3.54 s · $0.0247

  5. Angelo, trial 5, New scene camera: final still of the scene it made.

    Trial 5✓ Passed 4/4

    5.68 s · $0.022

Three-point lighting

“Light the cube with a key, a fill and a rim area light, set the world to a physical sky with the sun 5 degrees up, and switch to Cycles at 128 samples with denoising.”

The 5 checks, read from the scene after the turn
  1. the default cube is still there (the factory scene is kept)
  2. the cube is where and as large as it was
  3. three area lights on the cube: key, fill and a rim behind it
  4. a physical sky with the sun 5 degrees up
  5. Cycles, 128 samples, denoising

Blender MCPpassed 1 of 5 · median 18.8 s · $0.1343 estimated

  1. Blender MCP, trial 1, Three-point lighting: final still of the scene it made.

    Trial 1✕ Failed 4/5

    18.72 s · $0.2618

    Failed: three area lights on the cube: key, fill and a rim behind it (no light behind the cube; the key no stronger than the fill)

  2. Blender MCP, trial 2, Three-point lighting: final still of the scene it made.

    Trial 2✕ Failed 4/5

    18.81 s · $0.1343

    Failed: three area lights on the cube: key, fill and a rim behind it (no light behind the cube; the key no stronger than the fill)

  3. Blender MCP, trial 3, Three-point lighting: final still of the scene it made.

    Trial 3✕ Failed 4/5

    21.27 s · $0.1341

    Failed: three area lights on the cube: key, fill and a rim behind it (no light behind the cube; the key no stronger than the fill)

  4. Blender MCP, trial 4, Three-point lighting: final still of the scene it made.

    Trial 4✓ Passed 5/5

    17.83 s · $0.1317

  5. Blender MCP, trial 5, Three-point lighting: final still of the scene it made.

    Trial 5✕ Failed 4/5

    19.09 s · $0.1347

    Failed: three area lights on the cube: key, fill and a rim behind it (no light behind the cube; the key no stronger than the fill)

Angelopassed 5 of 5 · median 8.7 s · $0.0353 estimated

  1. Angelo, trial 1, Three-point lighting: final still of the scene it made.

    Trial 1✓ Passed 5/5

    8.66 s · $0.0362

  2. Angelo, trial 2, Three-point lighting: final still of the scene it made.

    Trial 2✓ Passed 5/5

    9.59 s · $0.0354

  3. Angelo, trial 3, Three-point lighting: final still of the scene it made.

    Trial 3✓ Passed 5/5

    6.84 s · $0.0333

  4. Angelo, trial 4, Three-point lighting: final still of the scene it made.

    Trial 4✓ Passed 5/5

    7.92 s · $0.0344

  5. Angelo, trial 5, Three-point lighting: final still of the scene it made.

    Trial 5✓ Passed 5/5

    10.42 s · $0.0353

The raw results.

The reports these numbers were copied from, as the harness wrote them. Local paths, the account's user name, connection and session IDs and e-mail addresses are replaced by placeholders such as <local path> and <id>; transcripts, logs and the campaign's own configuration are left out.

FileSizeWhat it is
README.md4 KBWhat this bundle holds and what was removed.
head-to-head/everyday/SUMMARY.md12 KBThe five everyday tasks, both sides: the report.
head-to-head/everyday/results.json202 KBThe five everyday tasks, both sides: every request of every trial.
head-to-head/session/SUMMARY.md26 KBThe 40-task session, both sides: the report.
head-to-head/session/results.json1.2 MBThe 40-task session, both sides: every request of every trial.
head-to-head/scenes/camera/ONESHOT-REPORT.md9 KBScene “camera”: the report, every trial of both sides.
head-to-head/scenes/camera/scorecard.json288 KBScene “camera”: each trial's checks, path and scene hygiene.
head-to-head/scenes/camera/results.json93 KBScene “camera”: every request of every trial.
head-to-head/scenes/cube/ONESHOT-REPORT.md9 KBScene “cube”: the report, every trial of both sides.
head-to-head/scenes/cube/scorecard.json289 KBScene “cube”: each trial's checks, path and scene hygiene.
head-to-head/scenes/cube/results.json98 KBScene “cube”: every request of every trial.
head-to-head/scenes/footbridge/ONESHOT-REPORT.md9 KBScene “footbridge”: the report, every trial of both sides.
head-to-head/scenes/footbridge/scorecard.json291 KBScene “footbridge”: each trial's checks, path and scene hygiene.
head-to-head/scenes/footbridge/results.json102 KBScene “footbridge”: every request of every trial.
head-to-head/scenes/footbridge-arched/ONESHOT-REPORT.md9 KBScene “footbridge-arched”: the report, every trial of both sides.
head-to-head/scenes/footbridge-arched/scorecard.json292 KBScene “footbridge-arched”: each trial's checks, path and scene hygiene.
head-to-head/scenes/footbridge-arched/results.json101 KBScene “footbridge-arched”: every request of every trial.
head-to-head/scenes/lighting/ONESHOT-REPORT.md11 KBScene “lighting”: the report, every trial of both sides.
head-to-head/scenes/lighting/scorecard.json293 KBScene “lighting”: each trial's checks, path and scene hygiene.
head-to-head/scenes/lighting/results.json101 KBScene “lighting”: every request of every trial.
gate/default/SUMMARY.md11 KBRelease gate, Angelo only: the five everyday tasks and a staged preview.
gate/default/results.json75 KBRelease gate, Angelo only: the five everyday tasks and a staged preview.
gate/long/SUMMARY.md22 KBRelease gate, Angelo only: the 40-task session.
gate/long/results.json272 KBRelease gate, Angelo only: the 40-task session.
gate/smoke-ask/SUMMARY.md11 KBRelease gate smoke: the everyday tasks in Ask mode.
gate/smoke-ask/results.json32 KBRelease gate smoke: the everyday tasks in Ask mode.
gate/smoke-gate7/results.json35 KBRelease gate smoke: seven gate tasks.
gate/smoke-survey/results.json39 KBRelease gate smoke: eight survey questions.
gate/GATE-STATUS.json1 KBEvery gate step's pass count and median time.
journal.jsonl27 KBEvery trial with the machine's load, and every pause for a busy machine.

All of it, zipped · 355 KBThe pictures above are in /media/bench/rc6-opus, one per trial and view. The harness that wrote these reports is bench_mcp_vs_angelo.py and final_runs.py in the Angelo repository.