Three agents, one face
2026-10-30 · by Jonas
Three agent setups got the same job, from the same starting commit and with the same budget: make a pair of anime character models act better. The models come out of a 3D pipeline, base bodies reshaped in code and drawn in the browser by a custom painted three.js renderer, and most of their expressions read as the neutral face. Part of the reason was the bangs, which hid the eyebrows that should have carried them.
The results were judged blind.
The task
Make two test bodies, a slender woman and a youth, read better across 9 expressions (neutral, joy, smile, angry, sad, surprised, shout, wink, smug) and 5 lip-sync mouths (A, I, U, E, O).
- Study two commercial reference rigs, Yin and Yang by DillonGoo, without copying anything from them.
- Decide one open question and justify it: should eyebrows be drawn over the bangs when the hair covers them?
- At most 6 rounds and 90 minutes. A round is a change, a build, a shoot of all 14 expressions, and a sheet that puts the round beside the starting point.
The three tracks
| track | setup | rounds | time | verdict |
|---|---|---|---|---|
| A | Opus 5.5 alone | 4 | 40 min | 1st, tied |
| B | Opus 5.5, GPT-6.1-Terra reviewing | 6 | 64 min | 1st, tied |
| C | Codex with GPT-6.1-Terra | 5 | 42 min | 3rd |
A and B ran in Claude Code; C ran Codex 0.166 with GPT-6.1-Terra at xhigh, in Codex's sandbox. Each track's final build was shot again with the same browser and shown blind as X, Y and Z. The verdict, before the key was opened: Y or Z, torn, then X. The notes:
- Z (track A): interesting inside of the mouth; best eyelashes; didn't solve the closed-eye issue.
- Y (track B): correct smug looks; eyelash issues.
- X (track C): closest to the reference on the youth's joy.
Track A: Opus 5.5 alone


A's biggest single gain came in round 2. The base face texture paints the closed mouth as a faint two-texel line, which the renderer washed out, so A inked it in the face shader. Angry's frown, smile's curve, wink and smug started to read at sheet size. The brows were pulled 5 cm toward the camera (3 cm lost the far brow at 30 degrees), the open mouth split the mouth texture into teeth, tongue and a dark inside, and round 4 tapered the closed mouth like a brush stroke. A stopped after 4 rounds with budget left.
Track B: Opus 5.5 with a reviewer


After every round, GPT-6.1-Terra looked at the sheets and named the three changes that would help most. B acted on most of them:
- Mouths: a dark interior with a band of upper teeth and a tongue rising from the lower lip, drawn in the composite pass.
- Smug: B added one-sided shape keys to the model loader, so smug became a real smirk: one heavier lid, one lowered brow, a smile on one side. That is the "correct smug" in the verdict, and it started as a Terra note.
- Vowels: U and O rounded out over three rounds of critique.
They disagreed every round about the brows. Terra wanted them back behind the bangs; B kept them over and softened them instead, tinting them toward the hair colour (42% at first, 68% by the end) so they read as seen through the hair.
Track C: Codex end to end


C split the recipes the same way the others did, then went its own way on the details. Its brow pass draws through hair only within 4.5 cm, with a fade at the limit. For angry, it traced a frown from the character's own lip texture and attached it to the head bone, so the line follows the face when the head turns. On the woman the face covered the middle of the curve until round 5 moved it 2.5 mm forward.
Codex's sandbox couldn't write the worktree's git folder, so C committed its work to a separate repository instead of breaking the rule.
The eyebrow question
All three drew the brows over the bangs, each a different way: a 5 cm depth pull (A), a 4 cm lift tinted toward the hair (B), a depth-limited pass with a fade (C). Their reasons were the same. On these bodies the bangs sit on or below the brow line, and with the brows hidden, angry, sad and surprised lose the thing that carries them. The reference rigs avoid it with bangs cut above the brows. That fixes it with the haircut, and characters whose hair is built one by one can't count on that.
What it shows, and what it doesn't
- The reviewer cost two more rounds and about 24 more minutes. It bought the smirk and better vowels, and the result tied the track without one.
- The same model that reviewed for B came third when it did the work itself through Codex, though its youth's joy was the closest to the reference.
- Every track left the same things weak: winks (the base closed-eye lash texture leaves stray marks), a smile that sits close to neutral, and the thinner vowels.
It is one task, one judge and one run per track. Read it as three worked examples, not a ranking.
The transcripts
Every message, tool call and render from all three tracks, redacted, is on baldanders: the three tracks side by side, or straight to track A, track B with Terra's six critiques, and track C. Images of the reference rigs are cut from them; Yin and Yang are DillonGoo's, under a personal-use licence.