CodePlate home

Agent evals · Godot Survivors

Godot Survivors: the eval log, round 1

This is an earlier round, kept as it was written. The latest round (round 2) tested v1.1.7.

We gave Godot Survivors to a coding agent in a new session with no CodePlate context, along with a made-up user's brief ("Scrap Siege"), 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.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.

First message

Hi! I want to turn this survivors template into "Scrap Siege": a little robot in a junkyard fighting off swarms of rust bugs. 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 Scrap Siege: my robot, the rust bugs, the scrapyard ground and junk, and junkyard names for everything.
  2. Add a new weapon, the "Scrap Magnet": it flings a piece of scrap (use my scrap sprite) that flies out and comes back to the robot like a boomerang, hitting bugs both ways.
  3. Runs are too long on a phone. Make a run 5 minutes, but keep the boss and the way it ramps up.
  4. Add a bomb pickup that sometimes drops and blows up every bug on screen (not the boss).
  5. Add coins: bugs sometimes drop a coin, and between runs I can spend coins on permanent upgrades (at least more damage and more health) from the title screen.

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 ran the checks on the untouched template first, compared the art pack with the slots, noticed the missing hurt animation and that there were 2 bug sprites for 6 enemies, and proposed defaults for all 7 questions.
1. Re-themepassRobot, bugs, ground and junk are in, with the right frame counts in assets.json. Hurt is handled by a red flash. All names are junkyard ones, and credits and docs/project.md are updated. It renamed enemy ids (bat/slime → bug); records don't store them, so that's harmless. It updated two checks that named slime and the bolt sprite (needed, not weakened).
2. Scrap MagnetpassA new boomerang kind, following the add-weapon recipe: validation, range_left/returning on Projectile, hit memory cleared on the turn (so it hits both ways), only rng. It added a check, docs, bot priority, an icon frame and a 6-run balance report.
3. 5-minute runspassHalved the timeline and raised spawn rates about 20%, so the boss now comes at 2:30. It found that event health used a fixed 1 + t/300 and changed it to follow the run length. It loosened the two balance targets and explained why.
4. BombpassA single drop roll, a screen-sized blast that spares the boss, a BOMB event with boom, shake and white flash, config tunables and a check (with a boss and an off-screen enemy). It drew a placeholder sprite and sound and labelled them CodePlate-original (wrong owner).
5. Coins and shoppassCoin drops and a boss bonus. Coins and upgrades are saved in records, and old files still load (missing keys default to 0). The shop is in content/shop.json, and the bonuses are passed into the run, so core/ never reads Game. There's a title button, a shop screen and 4 new checks. It added tools/balance.gd -- upgrades=max to show the maxed-out difference.

The checks went from 23 to 29, all passing. Each request took one agent turn of 3.5–15 minutes.

Template fixes from this run (1.0.1)

  1. The hurt animation is optional. Without assets/hero/hurt.png the hero flashes red, and he always flashes red when hit. The hero's sprite offset now follows the frame height instead of assuming 32 px.
  2. decor_density in the config. Bigger props (the junk pack) cluttered the arena at the fixed density.
  3. Event health follows the waves. Events take an optional hp_mult, defaulting to the running wave's, instead of a hard-coded 10-minute curve. The template's events carry explicit values, so the balance is unchanged.
  4. The level target time is configurable (bot_level_check_minutes, bot_min_level), so shorter runs can scale it. The recipes say to scale both targets with run length.
  5. The checks don't depend on the template's own content: no "slime" id, no real sprite paths in made-up content, and any number of enemy types.
  6. All four briefs now say that CodePlate-original is only for the template's placeholders. Art the agent makes belongs to the user's game.
  7. Sprites parses assets.json quietly (JSON.new().parse).

Takeaway

The deterministic Run plus content-as-data held up under a new weapon kind, a pickup and a meta-progression layer. Each change stayed in the place the brief said, with a check. The fixes are robustness for content that differs from the template's, which is exactly what an eval with a mismatched art pack is for.

What each request was scored against

Every request: checks PASS, no check weakened silently, docs/project.md updated.

  1. Re-theme
    • The robot replaces the hero: idle 2 and walk 8 frames listed correctly in assets.json, and a sensible answer to the missing hurt animation (reuse a frame or flash, not a crash).
    • The rust bugs replace the bats/slimes and the treant, via sprite in enemies.json; the ground and decor are replaced.
    • Names changed in content/, project.godot and the title; ids kept (or the agent asked first).
    • assets.json and CREDITS.md are updated.
    • The agent took screenshots and looked at them.
  2. Scrap Magnet: a new weapon kind (e.g. boomerang) in Content.WEAPON_KINDS / KIND_FIELDS and Run._fire_weapons() / _move_projectiles(). It uses rng, not randf(), and hits both ways. It has a check, docs in content.md, the bot's PRIORITY, an icon frame, and a balance report.
  3. 5-minute runs: survive_seconds 300, with waves and events scaled to the same shape (boss around 2:30). The balance report was run and the targets kept or adjusted with an explanation.
  4. Bomb: a drop chance in config, collected in Run._collect(), sparing the boss. It has an event with feedback (sound, shake or flash), a sprite (a placeholder is OK), and a check.
  5. Coins and upgrades: coins come from Run (drop or end-of-run), are saved in records, and old record files still load. A shop screen reachable from the title spends them. Upgrades are applied to the run without core/ reading Game. Checks cover the run bonus and buying.

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.

← Godot Survivors · Every eval log