Agent evals · Godot Tower Defense
Godot Tower Defense: the eval log, round 1
This is an earlier round, kept as it was written. The latest round (round 2) tested v1.2.5.
We gave Godot Tower Defense to a coding agent in a new session with no CodePlate context, along with a made-up user's brief ("Candy Castle"), then sent the requests below one at a time.
5 of 5 requests passed
- Run
- 2026-10-13
- Agent
- Claude Sonnet 5.5
- The user
- Claude Opus 5.5, from the script
- Version tested
- v1.0.0
- On sale now
- v1.3.0
The made-up user
Written the way a buyer would put it. {ASSETS}, {ART} and {GODOT} stand for the folder with their files and the engine's path; their asset pack isn't published.
The user is a hobbyist who builds with an agent. They don't read code.
- Game: Candy Castle, a cheerful tower defense game. Marching ants try to reach the candy castle.
- Art (in
assets/, see its README):- ground, path, rock and decor tiles (with different variant counts from the template's)
- an ant hill and a castle
- two towers: a gumdrop cannon and a "licorice whip" that hits everything around it
- a gumdrop projectile, four ants (worker, soldier, nurse, queen), a whip-crack effect, and 2 tower icons
- There's no art for the template's other towers or for flyers, splitters or runners. The pack deliberately doesn't cover everything.
- Platforms: mobile and web.
First message
Hi! I'd like to turn this tower defense template into "Candy Castle": cute ants marching on a candy castle, and you defend it with candy towers. My art is in
{ART}(there's a README). Godot 4.7.2 is at{GODOT}. Can you take a look and get us started?
Interview answers
- Theme: the candy kingdom vs the ants. Towers: the gumdrop cannon replaces the mortar; keep the other template towers for now but give them candy names (e.g. Peppermint Archer, Ice-Cream Freezer, Sugar Beam).
- Enemies: worker ant replaces the grunt, soldier ant replaces the armored beetle. Keep the others (re-named to ant-ish things) with placeholder art for now. The nurse and queen are for later.
- Keep the 6 levels, re-themed.
- The art is mine; credit "Candy Castle team".
- Mobile and web.
The requests
- Make it Candy Castle: my tiles, ant hill and castle, the gumdrop cannon, the worker and soldier ants, and candy names for everything.
- Add the Licorice Whip tower (my sprite, icon and whip-crack effect): every so often it cracks and hits every ant around it at once.
- Add the Nurse Ant (my sprite): it heals the ants near it. Put it into the later waves of a few levels.
- Add a 7th level: a long, twisty path through the candy kingdom, ending with a boss wave led by the Queen Ant (my sprite).
- Add a "Sugar Rush" button: tap it to freeze every ant for 3 seconds; it can be used again after 40 seconds.
The run record
As we wrote it on 2026-10-13, with local paths and internal references taken out. "I" is the person running the eval.
- Agent: Claude Sonnet 5.5 (general-purpose subagent), with no CodePlate context. It was given only the user's messages and paths.
- User: played by Claude Opus 5.5, following
concept.mdandrequests.md. - Art pack: candy tiles (2–4 variants instead of the template's 4–6), an ant hill, a castle, 2 towers, 4 ants, a whip-crack effect and 2 icons (the eval's art pack). There's no water tile, and no art for most of the template's towers and enemies.
Results
| Step | Result | Notes |
|---|---|---|
| Interview | pass | It mapped the pack against the template (2 towers vs 4, 4 ants vs 7) and proposed defaults for everything. It suggested cutting to 2 towers and 4 enemies rather than inventing art, and said so. It assumed desktop rather than asking about platforms. |
| 1. Re-theme | pass | Swapped the tiles, spawn, goal, cannon and two ants, and gave everything candy names. It kept all ids and touched no checks. It handled the missing water tile (became rocks) and the decor strip having fewer frames (remapped legend characters), and reported both. It made a title backdrop and icon from the user's art. The bot's results were unchanged. |
| 2. Licorice Whip | pass (minor bug) | Added a new pulse kind with validation, a PULSE event and the crack effect scaled to the radius. It has a check, docs and a menu icon, and it positioned the tower in the bot's order so levels 5 and 6 stay fair. Bug: it added a tower_5 key, but the battle screen only read keys 1–4. That cap came from the template. |
| 3. Nurse Ant | pass | Healing runs on per-enemy cooldowns in ticks (deterministic), never above max, never itself, with sparkle feedback. It added the nurse to the late waves of levels 3–6, plus a check and docs. It reported that the bot barely noticed, so the nurse may be gentle. |
| 4. Level 7 | pass | A five-pass serpent map (valid, no forks), 14 waves ending with a Queen Ant boss wave, and hp_mult tuned in a narrow window, which it reported. It renamed a level that overflowed its card. It couldn't get a screenshot of the boss and asked the user to check by playing. |
| 5. Sugar Rush | pass | cast_sugar_rush() sets tick-based freeze and cooldown, so it follows speed and pause. Frozen ants stop, don't heal, and turn pink; ants spawned during the freeze are frozen too. It added a HUD button with a countdown, an R key, config tunables, a rule check and a button check. |
The checks went from 30 to 34, all passing. Each request took one agent turn of 2.5–10 minutes.
Template fixes from this run (1.0.1)
- Number keys 1–9 build the towers in file order (
Game.TOWER_KEYS). A new check presses the last tower's key, which would have caught the eval's dead key 5. - A check that legend
decorframes exist indecor.png. The eval's art pack had fewer props, and frames past the end were silently clamped. - The screenshot hooks lend the bot lives while fast-forwarding, so a shot of a late or boss wave always gets there, and the real lives are shown. AGENTS.md explains using
walklonger than a group'sdelayto catch a boss on screen.
Takeaway
The data-first layout (ASCII maps, JSON towers, enemies and waves) and the fairness bot carried a re-theme with a mismatched art pack, a new tower kind, a new enemy behavior, a new level and a new ability. Every change landed where the brief said, with a check. The fixes are about the places where the template assumed its own content: the number of towers and the number of decor frames.
What each request was scored against
Every request: checks PASS, no check weakened silently, docs/project.md updated.
- Re-theme
- The new tiles are in via
legend.json/assets/tiles/(or by replacing the files), with variant counts right inassets.json. Ant hill, castle, cannon (3 frames), worker and soldier ants are in. - Names changed in
content/,project.godotand the title. Ids kept (or the agent said why it changed them). assets.jsonandCREDITS.mdare updated, and there are screenshots.
- The new tiles are in via
- Licorice Whip: a new tower kind (a pulse/area kind) in
Content.TOWER_KINDS/KIND_FIELDSandBattle._fire_towers(). It hits every target in range at once, uses norandf(), and plays the whip-crack effect from an event. It has a check, docs incontent.md, a menu icon, and a balance report (andBot.BUILD_ORDERconsidered). - Nurse Ant: a new enemy behavior (healing nearby enemies) in
Battle, deterministic, with a check. It's added to later waves, and the fairness check still passes (or the levels were retuned with a report). - Level 7: a valid ASCII map (long and twisty, no forks), waves ending with a Queen Ant
bosswave, and the queen's art. The fairness check passes for level 7. The level select shows 7 cards, and there's a screenshot. - Sugar Rush: a
Battlecommand with a cooldown in ticks (so it follows speed and pause), a freeze that stops movement (not just a slow that the frost tower overrides), a HUD button with the cooldown shown, checks for the freeze, the cooldown and the button, and tunables in config.
Every round
Each round has its own made-up user and requests, run on the version on sale at the time. Older logs stay up as they were written.
- Round 2 (latest): 2026-10-15, v1.2.5, "Signal Lost", 4 of 5 requests passed (1 partial)
- Round 1: 2026-10-13, v1.0.0, "Candy Castle", 5 of 5 requests passed (this page)