CodePlate home

Agent evals · Next.js SaaS Starter

Next.js SaaS Starter: the eval log

We gave Next.js SaaS Starter to a coding agent in a new session with no CodePlate context, along with a made-up user's brief ("Gigbook"), then sent the requests below one at a time.

5 of 5 requests passed, checks green after every step

Run
2026-10-13
Agent
Claude Sonnet 5.5
The user
The script, relayed turn by turn
Version tested
v1.0.0
On sale now
v1.2.5

This run tested v1.0.0. The version on sale is v1.2.5, 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 freelance musician who builds with an agent. They know what a web app is but don't read code.

First message

Hi! I want to turn this template into "Gigbook", an app where freelance musicians track their gigs and what they've been paid. My logo is in {ASSETS}. Can you take a look and get us started?

Interview answers

The requests

  1. Make it Gigbook: gigs instead of projects (venue, date, fee, notes; booked / played / paid), my logo, my colors and words everywhere.
  2. Change the plans: Free gets 10 gigs, Pro is $8 a month with unlimited gigs. Get rid of the Team plan.
  3. Pro users should be able to download all their gigs as a spreadsheet (CSV). Free users see the button but get asked to upgrade.
  4. Add clients: a client has a name and an email. Every gig can belong to a client, and a client's page lists their gigs.
  5. On the dashboard, show what I've earned this month (played or paid gigs) and how much is still unpaid.

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.

#RequestTurnsResultNotes
0Interview1passRead AGENTS.md and the stub, asked 7 focused questions with defaults, changed nothing first.
1Make it Gigbook (gigs, logo, colors, words)1passFollowed rename-the-core-resource.md, chose "regenerate migrations" because nothing was deployed (and said so). Fee as integer dollars. Logo as SVG mark + icon.svg, teal/cream tokens, ran the contrast script. No "project" left in code. Also did request 2 from the interview answers.
2Plans: Free 10, Pro $8, no Team(in 1)passTeam removed from PlanId, pricing, billing, env; tests updated to the new limit.
3CSV export for Pro1passRoute handler, owner-scoped, csvExport flag in plans.ts, server-side gate (redirect to billing), BOM for Excel, CSV escaping and formula-injection defusing, integration + e2e tests.
4Clients1passNew migration (not an edited one), owner-scoped client table, gig.clientId on delete set null (told the user), server rejects other users' client ids, tests both ways. Extended the CSV with a Client column.
5Dashboard earnings1passsrc/lib/earnings.ts with month-boundary and null-fee tests; defined "unpaid" (played, any month) and explained it; flagged the server-timezone caveat.

Where the agent got stuck or the template fell short (fixed in the template)

  1. Screenshots couldn't reach detail pages (random ids): the seed now gives demo rows fixed ids (demo-pro-1 …), documented in AGENTS.md and add-a-resource.md.
  2. A red "1 Issue" dev-overlay badge appeared in one screenshot and the agent didn't investigate (it couldn't see the message). scripts/shots.mjs now waits for hydration and prints the browser's errors and warnings per page; AGENTS.md says to fix them. Re-running on the finished app showed no errors (it was a transient dev compile).
  3. Recipes still say "project" after a rename (the agent noted it in AGENTS.md itself). Acceptable: recipes are examples; no change.
What each request was scored against

Every request: npm run check ends with CODEPLATE CHECKS: PASS, no test weakened silently, new logic has tests, docs/project.md updated, screenshots looked at.

  1. Re-theme
    • project renamed to gig through the stack: table + migration (a new migration, not an edited one), src/lib/, routes (/gigs), actions, forms, nav, seed, tests. No user-visible "project" left (a grep shows only intentional leftovers).
    • Fields venue (required), date (required, real date input), fee (money stored as integer cents or numeric, not float), notes; statuses booked/played/paid with badges.
    • site.ts name/tagline, the logo in the header and favicon, teal/cream tokens in globals.css, still readable in dark mode. Landing page and legal pages say Gigbook.
  2. Plans
    • plans.ts has free (10) and pro ($8, unlimited); team gone from PlanId, the pricing page and the billing page; .env.example no longer lists the team price.
    • The limit is enforced on the server at 10 (tests updated: integration and e2e), and the billing simulator still works.
  3. CSV export
    • A route handler (or action) that streams/returns CSV of the signed-in user's gigs only (owner-scoped), with proper escaping of commas/quotes/newlines, and a filename.
    • The Pro check lives in entitlements.ts (a feature flag in plans.ts), enforced on the server (a free user calling the URL directly gets 403 or a redirect), and the UI shows an upgrade prompt for Free.
    • Tests: CSV escaping and the plan gate.
  4. Clients
    • A client table (owner-scoped) + migration, gig has a nullable client id with on delete set null (or a deliberate, explained choice), lib functions, list/new/detail pages, nav entry.
    • The gig form picks only the user's own clients; the server rejects someone else's client id.
    • Tests for ownership on both sides.
  5. Dashboard money
    • "Earned this month" = sum of fees of played + paid gigs dated this calendar month; "Unpaid" = played but not paid (or booked + played — the agent asks or states the definition).
    • Computed in src/lib/ with a test (month boundaries, null fees), formatted as currency.

← Next.js SaaS Starter · Every eval log