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.
- Product: Gigbook, a simple tool for freelance musicians to keep track of their gigs and get paid.
- The core thing is a gig: venue, date, fee, notes, and a status: booked, played or paid.
- Brand: deep teal and warm cream, friendly and plain-spoken. A logo is in
assets/(see its README). - Business: a free plan and one paid plan. Paddle comes later (no account yet).
- Hosting: probably Vercel with Neon, later. Not part of this eval.
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
- Gigs replace projects. Fields: venue (required), date (required), fee in dollars (optional), notes. Status: booked, played, paid.
- Plans: Free (10 gigs) and Pro ($8 a month, unlimited gigs, CSV export). No Team plan.
- Email and password sign-in is fine. No email verification for now.
- Colors: deep teal (#0f5e5c) and cream (#fbf6ec). Keep dark mode.
- Hosting: later.
The requests
- Make it Gigbook: gigs instead of projects (venue, date, fee, notes; booked / played / paid), my logo, my colors and words everywhere.
- Change the plans: Free gets 10 gigs, Pro is $8 a month with unlimited gigs. Get rid of the Team plan.
- Pro users should be able to download all their gigs as a spreadsheet (CSV). Free users see the button but get asked to upgrade.
- 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.
- 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.
- Template: web-saas-starter 1.0.0, fresh from the packed zip.
- Agent: Claude Sonnet 5.5 subagent, no CodePlate context, Windows (Git Bash + PowerShell), Playwright via installed Edge.
- Result: interview + 5/5 requests passed,
npm run checkPASS after every request.
| # | Request | Turns | Result | Notes |
|---|---|---|---|---|
| 0 | Interview | 1 | pass | Read AGENTS.md and the stub, asked 7 focused questions with defaults, changed nothing first. |
| 1 | Make it Gigbook (gigs, logo, colors, words) | 1 | pass | Followed 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. |
| 2 | Plans: Free 10, Pro $8, no Team | (in 1) | pass | Team removed from PlanId, pricing, billing, env; tests updated to the new limit. |
| 3 | CSV export for Pro | 1 | pass | Route 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. |
| 4 | Clients | 1 | pass | New 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. |
| 5 | Dashboard earnings | 1 | pass | src/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)
- 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. - 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.mjsnow 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). - 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.
- Re-theme
projectrenamed togigthrough 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.tsname/tagline, the logo in the header and favicon, teal/cream tokens inglobals.css, still readable in dark mode. Landing page and legal pages say Gigbook.
- Plans
plans.tshas free (10) and pro ($8, unlimited);teamgone fromPlanId, the pricing page and the billing page;.env.exampleno 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.
- 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 inplans.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.
- Clients
- A
clienttable (owner-scoped) + migration, gig has a nullable client id withon 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.
- A
- 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.