CodePlate home

Agent evals · Godot Tower Defense

Godot Tower Defense: the eval log

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.2.3

This run tested v1.0.0. The version on sale is v1.2.3, which includes the fixes listed at the end of the record and has not had its own eval run.

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.

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

The requests

  1. Make it Candy Castle: my tiles, ant hill and castle, the gumdrop cannon, the worker and soldier ants, and candy names for everything.
  2. 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.
  3. Add the Nurse Ant (my sprite): it heals the ants near it. Put it into the later waves of a few levels.
  4. Add a 7th level: a long, twisty path through the candy kingdom, ending with a boss wave led by the Queen Ant (my sprite).
  5. 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.

Results

StepResultNotes
InterviewpassIt 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-themepassSwapped 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 Whippass (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 AntpassHealing 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 7passA 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 Rushpasscast_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)

  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.
  2. A check that legend decor frames exist in decor.png. The eval's art pack had fewer props, and frames past the end were silently clamped.
  3. 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 walk longer than a group's delay to 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.

  1. Re-theme
    • The new tiles are in via legend.json / assets/tiles/ (or by replacing the files), with variant counts right in assets.json. Ant hill, castle, cannon (3 frames), worker and soldier ants are in.
    • Names changed in content/, project.godot and the title. Ids kept (or the agent said why it changed them).
    • assets.json and CREDITS.md are updated, and there are screenshots.
  2. Licorice Whip: a new tower kind (a pulse/area kind) in Content.TOWER_KINDS / KIND_FIELDS and Battle._fire_towers(). It hits every target in range at once, uses no randf(), and plays the whip-crack effect from an event. It has a check, docs in content.md, a menu icon, and a balance report (and Bot.BUILD_ORDER considered).
  3. 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).
  4. Level 7: a valid ASCII map (long and twisty, no forks), waves ending with a Queen Ant boss wave, and the queen's art. The fairness check passes for level 7. The level select shows 7 cards, and there's a screenshot.
  5. Sugar Rush: a Battle command 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.

← Godot Tower Defense · Every eval log