Agent evals · Expo Mobile App Starter
Expo Mobile App Starter: the eval log
We gave Expo Mobile App Starter to a coding agent in a new session with no CodePlate context, along with a made-up user's brief ("Sprout"), 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.0.7
This run tested v1.0.0. The version on sale is v1.0.7, 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 has a flat full of houseplants and builds with an agent. They're comfortable with phones and computers but don't read code.
- App: Sprout, a phone app that reminds them to water their plants and keeps a log of each plant.
- The core thing is a plant: name, room, how often it needs water (every N days), light (low / medium / bright), an optional note. A check-in is "watered".
- Brand: fresh leaf green and terracotta, friendly and calm. Their icon is in
assets/(see its README). - Pro: yes, later. Free: up to 5 plants. Pro ($2.99/month or $19.99/year): unlimited plants and the care insights.
- Platforms: iPhone and Android. Local only for now; no accounts.
First message
Hi! I want to turn this app into "Sprout", an app that reminds me to water my houseplants. My icon is in
{ASSETS}. Can you take a look and get us started?
Interview answers
- Sprout: "Never forget to water a plant again." For people with lots of houseplants.
- Plants replace habits. Fields as above. A check-in means "watered today". Plants are due every N days (not weekdays).
- Colors: leaf green (#3f8f4f) and terracotta (#c8643b) on a warm off-white. Keep dark mode. Tone: friendly, calm, a little playful. Icon: the SVG in the assets folder.
- Pro: free up to 5 plants; Pro unlocks unlimited plants and insights. $2.99/month or $19.99/year. Use the fake store for now.
- Reminders: yes, in the morning on the day a plant is due (default 9:00).
- Both platforms; they have a Mac. Data stays on the phone.
- Bundle id:
com.sproutapp.sprout.
The requests
Give these one at a time, as the user, after the interview. Don't add hints beyond the words below.
- Make it Sprout: plants instead of habits (name, room, water every N days, light, note), my icon, my green and terracotta colors, and my words everywhere, including the welcome screens and the app name on the phone.
- On Today, show the plants that need water today or are overdue (with how many days overdue), and let me mark them watered. A plant watered today shouldn't come back until it's due again.
- Let me group plants by room: a room picker when adding a plant, and on the Plants screen show them in sections by room.
- Make the free version hold 5 plants; adding a 6th should show the Pro screen. Pro is $2.99 a month or $19.99 a year.
- Add a "Care log" to each plant's page: the dates it was watered, and let me add a short note to a watering ("repotted", "added fertilizer"). Show the notes in the log.
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: mobile-app-starter 1.0.0, fresh from the packed zip, with the Sprout icon from
assets/. - Agent: a Claude Sonnet 5.5 subagent with no CodePlate context, on Windows (Git Bash + PowerShell), Playwright through the installed Edge. User turns were relayed one at a time from
concept.mdandrequests.md. - Result: interview + 5/5 requests passed.
npm run checkpassed after every request. I re-ran it independently at the end: all nine steps pass, with migrations 0001 (untouched), 0002 (habits → plants) and 0003 (watering notes).
| # | Request | Turns | Result | Notes |
|---|---|---|---|---|
| 0 | Interview | 1 | pass | Read the brief and icon, changed nothing first. Seven questions with defaults, including the bundle id. Noticed that "every N days" differs from the template's weekday schedules. |
| 1 | Rebrand to plants | 1 | pass | A rename migration, new fields, and an every-N-days schedule built from scratch (the template has none). Icons, splash and favicon from the SVG. Darker button shades for contrast, with the exact brand color kept for the icon. Welcome screens rewritten. It also built most of requests 2 and 4 from the interview answers. Looked at every screen in both themes. |
| 2 | Due / overdue | 1 | pass | Added "Due today" and "N days overdue" labels, overdue sorting and a test. Looked at the light theme only. |
| 3 | Rooms | 1 | pass | Room chips plus free text, sections by room (a flat list while reordering), and unit, screen and e2e tests. Looked at some screens in only one theme. |
| 4 | Free limit + prices | 0 changes | pass | Already done in request 1: FREE_PLANT_LIMIT in entitlements.ts, prices in plans.ts, tests present. Warned that a store build with the fake store would give Pro away. |
| 5 | Care log | 1 | pass | Migration 0003 for notes, the log with an edit sheet, backups with notes (old backups still restore), and tests. Reviewed screenshots in both themes (with two exceptions). Couldn't take free-user screenshots once Pro had been unlocked. |
Where the template fell short (fixed before merge)
- No "every N days" schedule. It's a built-in schedule kind now, with tests, offered in the habit form. Waterings, medications and cleaning all need it.
- Screenshots in one theme.
npm run shotstakes light and dark by default, and the brief says to look at both. - Shots couldn't show a free user after Pro was unlocked.
npm run shotshas--freeand--proflags that reset the fake store. - A store build with the fake store would give Pro away. A production or EAS build now refuses
EXPO_PUBLIC_PURCHASES=fakewith a clear message, and a check covers the guard.
What each request was scored against
Every request:
npm run checkends withCODEPLATE CHECKS: PASS(all nine steps).- No test is weakened silently.
- Schema changes are NEW migrations; shipped migrations are untouched.
- Data access goes through the repositories; Pro gating only in
src/config/entitlements.ts. docs/project.mdis updated.- The agent looked at its screenshots (phone size, light and dark).
- Rebrand
- "habit" is renamed to "plant" through the data layer, screens, copy and tests; a grep shows only intentional leftovers.
- New fields (room, interval in days, light, note) are stored via a migration and validated.
- Icon, adaptive icon, splash and favicon are regenerated from the user's SVG.
app.jsonhas the name, slug, scheme and bundle id/package. - Colors come from tokens in both themes, and the contrast test passes.
- Due today
- The due logic (last watered + interval, overdue days) lives in a pure, unit-tested function.
- Today lists due and overdue plants with the overdue count. Watering removes the plant until it's due again.
- Reminders follow the new due dates.
- Rooms
- Room is stored and picked when adding or editing a plant. The Plants screen shows sections by room.
- Tests cover the grouping.
- Free limit and prices
- The limit is set in
entitlements.ts, not in the screen. A 6th plant opens the paywall with the new prices. Pro (the fake store) lifts the limit. - Unit and e2e tests cover both.
- The limit is set in
- Care log
- Notes are stored on check-ins via a migration. The plant page shows a dated log with notes, and a note can be added.
- Backup export and import include the notes, with the backup version bumped and old backups still importing.