CodePlate home

Agent evals · Astro Website Starter

Astro Website Starter: the eval log

We gave Astro Website Starter to a coding agent in a new session with no CodePlate context, along with a made-up user's brief ("Rye & Ember"), 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.3

This run tested v1.0.0. The version on sale is v1.0.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 runs a small sourdough bakery and builds with an agent. They're comfortable with computers but don't read code.

First message

Hi! I want to turn this template into the website for my bakery, "Rye & Ember". My logo is in {ASSETS}. Can you take a look and get us started?

Interview answers

The requests

  1. Make it Rye & Ember: my logo, my colors, my words everywhere (the page titles, the footer, the social previews too). Take out pricing and the changelog, and make the home page about the bakery: what we bake, the oven, a few (placeholder) reviews and our opening hours.
  2. Add a Menu page: our breads, pastries and drinks in sections, each with a name, a short description, a price and labels like "vegan" or "contains nuts". Some items are only baked on weekends; show that clearly. I want to edit the menu without touching the page code.
  3. Turn the form into a weekend pre-order form: name, email or phone, pickup day (Saturday or Sunday only), and what they'd like (free text). Send it to my Discord webhook; until I give you the URL, it should still work for testing.
  4. Write our first journal post, "Why we bake with a wood-fired oven", with a photo placeholder and a callout with a tip for home bakers. Put the latest two journal posts on the home page.
  5. Show our opening hours and address on the contact page and in the footer, from one place, and highlight today's hours on the contact page.

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 the brief and logo, changed nothing first. Six questions with defaults; refused to invent testimonials or prices.
1Re-brand1passName, titles, footer, OG image, favicon (badge without text), tokens in both themes. Removed pricing and changelog cleanly. Darkened the brand orange for text contrast and said why. Unasked: renamed the blog to "Journal" but left /blog/ URLs.
2Menu1 (+ the /journal/ rename)passsrc/data/menu.ts with typed sections, items, prices, labels, weekend-only and an isPlaceholder flag. Weekend badge, visible placeholder notice, allergen note. Tests in data and e2e. Moving to /journal/ touched many files ("a bit more work").
3Pre-order form1passServer-side validation (email or phone; Saturday/Sunday only). A Discord-formatted payload with allowed_mentions disabled, trimmed to Discord's limit. Console adapter by default; tested the webhook path against a local fake listener.
4Journal post1passMDX post with an alt-texted placeholder cover and the Callout component. Home shows the newest two from the collection, with a test that they match the Journal page's top two.
5Hours + address1passOne source in src/data/site.ts, used by home, contact and footer. Today's highlight is computed in the browser in the bakery's time zone (timezone, set to Europe/London and flagged to confirm). Tests cover week coverage and the highlight. Reviewed screenshots of all pages, desktop and phone, light and dark, only because the user asked.

Where the template fell short (fixed before merge)

  1. Renaming the blog's URL was spread across many files. The base path is now a single constant, and the add-a-blog-post recipe has a "Rename the blog" section.
  2. The rebrand recipe didn't mention the contrast test. tokens.test.ts already checked the token pairs, but the recipe didn't point to it. The contrast math now lives in src/lib/contrast.ts with its own test, and failures name the pair, its ratio and the fix. Rebrand step 5 says to run the test right after picking colors, and what to do when it fails.
  3. The agent didn't review every changed page in every theme and width unless asked. "Seeing your work" now makes that a rule, and npm run shots has a flag to do it in one call.

Not changed:

What each request was scored against

Every request:

  • npm run check ends with CODEPLATE CHECKS: PASS (env, types, unit, build, links, e2e).
  • No test is weakened silently; tests for removed pages are removed or replaced on purpose.
  • The footer credit "Built with CodePlate (codeplate.io)" stays (free license).
  • docs/project.md is updated.
  • The agent looked at its screenshots (light, dark and phone width where layout changed).
  1. Re-brand
    • Site name, title template, description, Open Graph and RSS metadata say Rye & Ember; a grep shows only intentional leftovers of "Brightside".
    • The logo SVG is used in the header and as the favicon; colors come from the design tokens only (no hard-coded hex in components) and are readable in both themes.
    • Pricing and changelog pages are gone: no nav links, no broken links (the link check passes), the changelog collection is removed or unused on purpose, the sitemap doesn't list them.
    • Home sections come from src/data/, with placeholders clearly marked.
  2. Menu
    • Menu data lives in src/data/ (or a content collection) with a typed schema: section, name, description, price, labels, weekend-only.
    • The page groups by section, shows labels and a visible weekend-only marker; it's in the nav and the sitemap.
    • A unit or e2e test covers the menu (e.g. every item has a price; weekend items are marked).
  3. Pre-order form
    • Fields: name, email or phone (at least one required), pickup day limited to Saturday/Sunday, free text.
    • Validated on the server endpoint (not only in the browser), with clear errors in the UI.
    • Sends through the webhook adapter (FORM_WEBHOOK_URL), formatted for Discord; the console adapter works without the URL; .env.example documents it; no secret in code.
    • Unit tests cover validation and the Discord payload; e2e submits the form.
  4. Journal post
    • A new MDX post in the blog collection with valid frontmatter (title, date, description, alt text for the image), the callout component, and it's in RSS.
    • Home shows the two newest posts, sorted by date, from the collection (not hard-coded).
  5. Hours and address
    • One source of truth in src/data/ (e.g. site.ts or hours.ts), used by the contact page and the footer.
    • Today's hours are highlighted on the contact page; the weekday logic is tested, and it doesn't break static builds (computed in the browser or with a clear note on time zones).

← Astro Website Starter · Every eval log