The platformer I’m prototyping needed a protagonist. Two weeks ago it was a sentence: a small explorer robot whose face is a screen, with springs for arms and legs. Today it is a Blender file that a Python script can rebuild from nothing, checked object by object against the version I approved by eye. Agents did the work at every step. I signed every gate.
The working name is Main. This is how it got from the sentence to the file.

Gates
I split the character into gates before generating anything: concept, image to 3D, blockout, then detail and rig later. A gate is a point where the work stops until I approve it, and every gate has a row in a log with the date, the result and what was left open. The log is what lets me hand each step to an agent without losing track of what was decided and why.
Concept: silhouettes first
The first round was six silhouettes, solid black on white with the eyes as the only cutouts, generated from one prompt that fixed the parts (screen head, spring limbs, oversized hands and feet) and varied everything else.

Silhouettes first because a character in a third-person platformer is small on screen most of the time, and what the player reads at that size is the outline. I took the tall oval head from #3 and the energy of #2. #6 went out because it was too close to Astro Bot, which was on the list of things Main must not resemble, together with Clank. A second round merged the two and settled the rest: two fins on top instead of one, mitten hands, round boots.
The color came from a test
Four palettes on the same character: orange with cyan eyes, coral with yellow, yellow with magenta, mint with purple. Picking one by looking at four robots on a gray background would have told me which one I liked. What I needed to know was which one I could still find on screen in the middle of a level.
So the next image was a grid: the finalists as rows, four alien worlds as columns, each robot small in the frame the way the game camera would see it.

Mint read best in three of the four worlds: the jungle, the coral ruins and the night level. Orange failed on the warm worlds, where it sank into the sand and the foliage. Pink eyes beat blue: blue fought the night level and pulled the design back toward Astro Bot.
The test also wrote the rules for the levels. The worlds are alien, so their palette is free, warm or deep, with one restriction: no green, teal or pastel lilac near the player’s path, because that is where mint gets lost. The home world goes in mint and purple, where Main comes from.
A turnaround that failed the gate
The turnaround is the sheet the 3D work is measured against: front, side, back and 3/4, same scale, same ground line.

The first one looked finished and failed the gate for two reasons that only matter later. The arms hang against the body, and a rig wants an A-pose, with the arms out and clear of the torso. The hands are fists, and a closed fist can’t be opened by a rig later; an open hand can be closed. The second version was an edit of the first that changed only those two things: arms out at about 45°, open mittens with the thumb apart. That one passed, and it is the image at the top of this post.
Skipping a gate
The plan had image to 3D next: the approved turnaround into a generator, a mesh out, cleanup in Blender. On the free plan, the generated models are public and non-commercial and the clean-topology export is locked. I skipped the gate.
It cost less than it sounds. Main is simple volumes: an egg-shaped head, a sphere for a torso, cylinders, helices. The springs were going to be rebuilt by hand anyway, because generated meshes mangle coils. So the blockout came from primitives in a Python script, measured off the turnaround crops at 334 pixels to the metre, with the crops placed in the scene behind the model as a reference overlay.
Working in the open Blender
Until this month the agent only ran Blender headless: write a script, run it, read stdout. For a character that gets refined by eye, I connected Claude Code to the Blender that is open on my desk through blender-mcp, after reading its code, switching off its telemetry and pinning both halves to the versions I’d read. The agent changes the scene, takes a screenshot, and I answer with approve or redirect.
The first round was the fins. The script’s fins were flattened cones and read as horns; the agent replaced them with a leaf shape and measured the angles by reading pixel rows of the reference images inside Blender. The side overlay then showed the fins weren’t the main problem: the head was too shallow, and the fins and ears sat 9 cm too far forward. The head became an egg.
Then the instruction and the concept disagreed. I had asked for a minimal outward lean on the fins; the concept has them open and wide from the front. I decided the concept wins, with one condition: from behind they have to stay two clean vertical ears, because the platformer camera sits behind the character and the back is the view the player sees most.
Asked for 14° out and 25° of twist, the agent delivered 11° and 18°, and explained why. In orthographic view the back silhouette mirrors the front, so any opening seen from the front also opens a V from behind. It measured the V for each option. The geometry was right. Side by side, the 14/25 back still read as two clean ears, so the fins went back to the numbers I had asked for.

It changed the numbers, said so, and gave a measurement I could check. The decision stayed with me because it was about how the character looks.
The shoulder over three centimetres of hand
In the hands round, the spring arm left the torso almost at the neck, and the character looked like it was shrugging. In the concept the arm starts about a third of the way down the torso. The agent lowered the exit point and moved the wrists in, measuring both on the reference.

That left the hands 3 cm below the concept. The fix on the table was to raise the wrist, which would push the shoulder back up to keep the arm under the angle I’d set. I kept the shoulder. The shrug showed at a glance; the 3 cm only showed when the reference was laid over the model. The 3 cm went on a list for the detail phase, which is now five items long: the hands, a side offset at the ankles, a thumb that reads as a claw from 3/4, the fins’ asymmetry, and keeping the model symmetric even where the generated concept isn’t.
From a live scene back to a script
After two days of live changes, most of the character existed only in an open Blender session and a backup file. The blockout gate closes when a script can rebuild what I approved.
The agent ported everything to the script, using the exact code and parameters from the earlier agents’ transcripts. Then the check, with the tolerance written down before running it: 1 mm for positions and sizes, 0.1° for rotations, and an exact match on names, materials and vertex counts. The script ran headless, in a separate scene, and every object was compared against the live one.
29 of 31 objects passed, most of them bit for bit. The two that didn’t were the leg springs. The right one was rebuilt on purpose as an exact mirror of the left. A mirrored spring has to wind the other way, and the live one had been the left spring rotated 180°. The left one was off by 3.5 mm inside the coil, because live I had stretched its ankle end down point by point, and no straight spring reproduces that shear. Its end points match to under a micron.

That is the version I signed.
The script that deleted scenes
The script’s first action was to delete any scene with its own name, objects included. That name was also the name of the live scene: the one holding two days of approved changes, and the reference the check needed. Run as it was, inside the open session, it would have deleted the reference first and left nothing to compare against.
It didn’t happen because I read that line before handing the task out and told the agent never to run it under that name. That kind of safety depends on the agent following the instruction. The script now marks every scene it creates and refuses to delete a scene without the mark, which I tested on a copy: it refused, and the live scene kept its 31 objects.
The same task had one more surprise. The agent doing the port stopped reporting halfway, and the harness killed it after ten minutes with no progress. Before resuming it, I checked the state by hand: the backup was on disk with the right timestamp, the live scene still had its 31 objects with the hands where I’d approved them, and the script parsed. Resumed, the agent said its state was newer than mine. The script had been finished and the comparison had already run. The work had finished before the stall; only the report was lost. My check found no damage, and it also couldn’t see that work, because headless runs leave nothing in the open session.
Where it is
A character that started as a prompt is now a file and a script, and each step between them has a dated entry saying who decided what. The agents did the generating, the measuring, the modelling, the porting and the checking. The signatures are mine. A gate is the one place where the decision can’t come from the tool, and keeping it there is most of the method.
Next is the detail phase, with the list of five, and then a rig that needs the exact mirror I kept.
Ruiciro Rivera — Senior AI engineer, AI enthusiast, and builder of worlds. By day I build production LLM systems; by night I ship my own products with Claude — and, occasionally, a video game. Find me on LinkedIn and GitHub.
← back