I wanted a Three.js game set in Geneva's old town to look more like Animal Crossing. Instead of letting one model do everything, I split the job: Claude Opus looks at screenshots and writes a plan, and DeepSeek's coding agent dsh writes the code. A round costs about $0.80. When Opus also wrote the code, a round cost about $2.80.
The loop
- Build the game and take the same screenshot with Playwright.
- Opus (high effort, read-only) compares it with the previous round and two reference stills. The first line of its answer is
CLOSER: current,previousorsame. Then it writes a plan for exactly two changes, with hex colors, values and file names. - If the answer is
previous, roll the code back. dshruns the plan through acpx with maximum reasoning and no time limit. It can open the screenshots too.
acpx --cwd <repo> --approve-all --format json \ --agent "dsh --profile acp --patch dsh-acp.patch.yml" \ exec --config-option reasoning_effort=max "<task + plan>"
Three loops, same start
| Who codes | Opus score by round | Cost | Time |
|---|---|---|---|
| Opus | 4.2 → 5.6 → 5.6 → 5.0 | $8.50 | 37 min |
| dsh, 30 min cap | 5.3 → 5.2 → 5.3 → 5.5 | $2.12 | 93 min |
| dsh, no cap, camera locked | 5.2 → 5.6 → 5.7 → 5.7 | $2.45 | 83 min |
Opus cost is Claude Code's own total_cost_usd. dsh cost is tokens × DeepSeek's off-peak list price over every dsh session, including reviewer sub-sessions it started itself: (input × 0.15 + output × 0.6 + cache_read × 0.003) / 1e6. The last loop used 1.39M input, 0.89M output and 154M cache-read tokens.
What mattered
- Compare, don't just score. An earlier loop scored every round 4.2 while the picture kept changing. "Which is closer, this or the last one?" caught a real regression.
- Lock the camera. Left alone, dsh made the scene "more Animal Crossing" by moving the camera overhead. The sky and buildings dropped out of the frame, and rounds stopped being comparable.
- No time cap on the coder. A 30-minute limit cut dsh off mid-task twice. Without it, each round finished on its own in 23 to 27 minutes and 143 to 190 tool calls.
- Tell the planner who builds. Opus writes more concrete plans when it knows a cheaper agent will carry them out.
What it missed
A hanging flower pot floats in mid-air in every frame. It was in the starting code, and the reviewer only judged the look. Layout bugs need their own line in the review prompt. The rollback branch also never fired in the dsh loops, so it is still untested.
Script, plans and diffs: github.com/kyupark/opus-plans-deepseek-builds