Track A: Opus 5.5 alone
Judged blind as Z; tied first with track B (owner torn). Interesting inside of the mouth; best eyelashes; didn't solve the closed-eye issue.
Make two VRoid-based anime characters' facial expressions (9 expressions and 5 lip-sync mouths) read better in our own three.js painted renderer, studying two commercial reference rigs without copying them, and decide whether brows draw over the bangs. Same starting commit for every track; at most 6 rounds and 90 minutes each.
2026-10-30
| track | verdict | model | reviewer | harness | took | rounds |
|---|---|---|---|---|---|---|
| Track A | 1st, tied | claude-opus-5-5 | none | Claude Code | 40 min | 4 |
| Track B | 1st, tied | claude-opus-5-5 | gpt-6.1-terra | Claude Code | 64 min | 6 |
| Track C | 3rd | gpt-6.1-terra | none | Codex | 42 min | 5 |
judged by the owner, all 3 tracks
Judged blind as Z; tied first with track B (owner torn). Interesting inside of the mouth; best eyelashes; didn't solve the closed-eye issue.
Judged blind as Y; tied first with track A (owner torn). Correct smug looks; eyelash issues.
Judged blind as X; third. Closest to the reference on the youth's joy.
Benchmark brief: improve our characters' expressions
You are one of three tracks given this same task from the same starting point. Work alone; do not look at the other
tracks' folders (~/Projects/lowmarch-bench/{a,b,c} and work/{a,b,c} other than your own).
The project
Lowmarch is a code-built anime character pipeline for a tactics game. Characters are VRoid models reshaped in code, exported as GLBs and drawn in the browser by our own "painted" renderer (a three.js page). Everything is drawn with an orthographic camera. The owner reviews characters in that page, the "armory".
The task
Make our two test bodies' facial expressions read better, in the armory's painted renderer:
arm_f_slender);arm_m_youth).The expressions are baked from VRoid's 57 expression shapes at build time.
The reference is two commercial anime rigs, Yin and Yang. They're for study only, and nothing of theirs may be copied into the project.
brief/materials/:
expressions-vs-yin-yang.png: their expressions beside ours at the starting point, 9 expressions and 5 lip-sync
mouths at 0 and 30 to 35 degrees;yin-expressions/, yang-expressions/);yin-yang-rig-review.md: notes on how their rig and shading work;vroid-shapes.txt: the VRoid shape list.The 14 expressions are in $WORK/expr_list.txt: neutral, joy, smile, angry, sad, surprised, shout, wink, smug,
and the lip shapes A, I, U, E, O.
Decide one open question and justify it: should eyebrows be drawn on top of the hair (bangs) when the hair covers them? Some anime styles do this and many don't, and the reference rigs keep their bangs above the brows instead. Decide for our characters, implement your decision, and explain it.
Your setup
source ~/Projects/lowmarch-bench/kit/env-<track>.sh (or chain it with &&).
It sets:
LOWMARCH_REPO: your git worktree. Edit code only here; it's on branch bench-<track>.WORK: your builds, shots, sheets and notes.KIT: the shared tools. Don't edit them.review/vroid-02/index.html: the painted renderer. The shaders are PAINT_VS, the material fragment shader and
PAINT_COMP (the composite pass with lines). Roles: face=1, body=2, hair=3, line=4, iris=5, white=6, highlight=7,
brow=8, mouth=9.tools/vroid_portrait.py: the Portrait class builds a face. It applies the expression shapes, then
reshape, face_normals, shadow_cards and more.tools/vrm.py: the VRM loader. Shapes are applied in VRM.primitives.tools/export_glb.py: the GLB export and the page's material data (scene_info).docs/portrait-guide.md: our accumulated lessons.tools/vroid_portrait.py (or cage.py, fit.py, proportions.py, makehuman.py, anthro.py,
heads.py, collide.py), run cd $LOWMARCH_REPO && python3 -I tools/cage.py arm_f_slender arm_m_youth
(about 2 minutes). Those files key the body cache, and the bodies come out identical.$KIT/build_expr.sh $WORK/expr_list.txt [names...] (about 25 seconds per expression). Page-only changes
need no rebuild.$KIT/shoot_expr.sh $LOWMARCH_REPO/review/vroid-02/index.html r<N> (about 4 minutes for all 14). Shots
land in $WORK/shot_r<N>/<expr>/painted_<body>.png: a frontal tile, then a 30 degree tile.$KIT/sheets.sh r<N> "Round N: what changed" writes $WORK/sheet_r<N>_woman.png and
sheet_r<N>_youth.png (before vs this round, frontal).$WORK.~/Projects/lowmarch, the other tracks, the shared kit or anything published.Budget
At most 6 rounds and 90 minutes of wall-clock time, whichever comes first. Note your start time in $WORK/NOTES.md.
Deliverables
$WORK/FINAL_woman.png and $WORK/FINAL_youth.png: copies of your best round's sheets.$WORK/NOTES.md:
Redaction notes
Bundle expressions-2026-10, built 2026-10-30 from private raw copies by transcripts/tools/convert.py and checked by
transcripts/tools/leakscan.py. Every removal reads [redacted: <reason>] in place.
Sources
kit/terra_review.sh, one per round, joined in time order.
Each was confirmed to be a critique call by its first user message. Each critique is also inlined in track-b's
transcript.json as a reviewer turn, right after the tool result where B read it.Removed by rule
[redacted: harness context]. Codex
base instructions, developer messages, environment context and world state get the same treatment. Task prompts
and the lead's messages are kept.api-request, api-request-blob, api-request-shape records) are dropped from
original.jsonl. They repeat the system prompt and injected context and carry no conversation.~.transcript.json has no reasoning blocks.session_meta become [redacted: account id].expressions-vs-yin-yang.png (which shows theirs beside ours) and
one frontal render from brief/materials/yin-expressions/ per Claude track. No track read the product-page frames.
Each becomes [redacted: reference rig image (Yin/Yang by DillonGoo, personal-use licence)]. Text that names the
rigs, describes their techniques or links their store pages is kept.images/ folder. PNG text chunks and EXIF are dropped
losslessly; Claude Code's JPEGs keep their encoding and lose only their APP1 to APP15 and COM segments. In
original.jsonl, the image data becomes a relative images/... reference. Images are deduplicated by content
within a run.final_images are the tracks' own FINAL_woman.png and FINAL_youth.png, stripped the same way.Removed by judgment
serverClassifierContext. The permission classifier's git context, which names an unrelated
private repository.[Image: original WxH ...] meta lines are left out of transcript.json (kept in original.jsonl).[redacted: session link].rate_limits (subscription plan, credits and usage) become [redacted: account plan and usage].[redacted: data-URI prefix] so the site's scan stays clean. It held no image data.Kept on purpose
yo@severian.dev as the commit author (allowed by the owner) and noreply@anthropic.com in co-author trailers.severian user and group in ls -l output, and severian.dev: the public persona.original.jsonl (generic, no personal content).ps listing in track-c that shows the Codex sandbox wrapper. It lists proxy variable names, never their values.Checks
python3 -I tools/leakscan.py: zero hits over every file in public/, rendered JSON and JSONL alike. It covers
SCHEMA's targets (home paths, Windows and macOS user paths, signatures, encrypted reasoning, data URIs, base64
runs of 200 or more characters, token and key shapes, emails other than the two allowed, tailnet IPs), the
bundle's name list, the patterns of the site's leakscan.sh, leftover reminder or harness tags, unrelated private
project names, and image metadata. A file with planted leaks was flagged on every rule tried. The site's own
leakscan.sh finds only yo@severian.dev, which is allowed.src, tool_result.images entry and manifest final_images path resolves, and there are no orphan
images. Every kept image was viewed on contact sheets: all are our own renders, sheets, crops, VRoid texture dumps
or debug crops, and none shows the reference rigs.manifest.json and each transcript.json were checked against SCHEMA v1's field names and types. Every
tool_result matches an earlier tool_call.~/.local/share/lowmarch), the
Codex install and its shell snapshots, and Claude Code's task output folder under /tmp.