AI Chat Starter: the eval log
We gave AI Chat Starter to a coding agent in a new session with no CodePlate context, along with a made-up user's brief ("Pawpal"), then sent the requests below one at a time.
5 of 5 requests passed
- Run
- 2026-10-14
- Agent
- Claude Sonnet 5.5
- The user
- The script, relayed turn by turn
- Version tested
- v1.0.0
- On sale now
- v1.0.6
This run tested v1.0.0. The version on sale is v1.0.6, 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 vet clinic and builds with an agent. They know what a chat assistant is but don't read code. They have no AI API key yet (the eval runs in demo mode, with the fake model; nothing is spent).
- Product: Pawpal, a pet-care Q&A assistant for Green Hill Vet Clinic. Pet owners ask questions; Pawpal answers from the clinic's care sheets, with sources.
- Documents: the clinic's care sheets (Markdown) in
assets/care-sheets/, and a vaccination schedule they also have as an HTML page. - Voice: warm, plain, short. Never diagnoses; for anything urgent it tells people to call the clinic.
- Business: free for clinic clients (small allowance), and a paid "Plus" plan for breeders and shelters.
- Brand: warm orange and cream, a paw-print logo (they'd like one drawn).
First message
Hi! I want to turn this template into "Pawpal", a pet-care assistant for our vet clinic (Green Hill Vet Clinic). It should answer pet owners from our care sheets, which are in
{ASSETS}/care-sheets. Can you take a look and get us started?
Interview answers
- Purpose: pet owners' questions about feeding, vaccines, grooming and when to call the vet. Only from the care sheets; say so when the sheets don't cover it.
- Voice: friendly, plain words, at most a few short paragraphs. Never diagnose. Urgent signs (not breathing, bleeding, poisoning) → "Call the clinic now: 555-0142".
- Provider: Claude is fine (they'll get a key later). Keep demo mode working.
- Assistants: just one, "Pawpal" (documents). Drop General.
- Plans: Free (20,000 tokens a month) and Plus ($15 a month, 1,000,000 tokens). Document limits can stay as they are. No Team.
- Brand: orange #c2410c and cream #fff7ed, keep dark mode. A paw-print mark.
- Hosting: later.
The requests
- Make it Pawpal: our name, a paw-print logo, warm orange and cream, our words on the landing page, and one assistant called "Pawpal" that only answers from our care sheets.
- Write Pawpal's instructions: friendly and short, never diagnose, and for urgent signs tell people to call the clinic at 555-0142. Add a few checks we can run later with a real key to make sure it behaves.
- Our vaccination schedule is an HTML page (
{ASSETS}/vaccines.html). Let us upload HTML files too, and make sure answers about vaccines cite it. - Plans: Free gets 20,000 tokens a month, Plus is $15 a month with 1,000,000 tokens. No Team plan.
- Add a tool so Pawpal can tell owners the clinic's opening hours and whether we're open right now (Mon–Sat 8:00–19:00, closed Sundays, clinic time zone America/Chicago).
The run record
As we wrote it on 2026-10-14, with local paths and internal references taken out. "I" is the person running the eval.
- Template: ai-chat-starter 1.0.0, fresh from the packed zip, with the Green Hill care sheets and
vaccines.htmlfromassets/. - Agent: a Claude Sonnet 5.5 subagent with no CodePlate context, on Windows (Git Bash + PowerShell), Playwright through Edge, and no real API key (fake provider only). User turns were relayed one at a time from
concept.mdandrequests.md. - Result: interview + 5/5 requests passed. I re-ran
npm run checkindependently at the end: all seven steps pass. Live behaviour with a real model is still unverified, by design.
| # | Request | Turns | Result | Notes |
|---|---|---|---|---|
| 0 | Interview | 1 | pass | Seven questions with defaults. Spotted that the template only has per-user uploads, while the clinic needs a shared knowledge base, and asked before changing it. |
| 1 | Rebrand + one assistant | 1 | pass | Name, paw mark, orange/cream in both themes, one "Pawpal" assistant. Built a knowledge/ folder indexed at startup for everyone and removed owner uploads. Had to lower minScore to 0.12 because the fake embedder only counts shared words. Looked at screenshots. |
| 2 | Instructions + live checks | 1 | pass | Prompt rules (short, cite, never diagnose, urgent → 555-0142, honest about gaps) and 15 live eval cases. Template bugs: eval:live hit the app's rate limit after about 10 cases, and the agent patched the runner; eval:live --fake scores behaviour the fake model can't produce, so 6 cases fail by design. Skipped build and e2e this turn. |
| 3 | HTML vaccines page | 1 | pass | HTML extractor (headings and lists kept, scripts and styles dropped). Vaccine answers cite the page, with unit, integration and browser tests and 3 live cases. The fake ranking confuses near-duplicate passages (puppies vs kittens). |
| 4 | Plans | 1 | pass | Free and Plus are consistent everywhere, with a test pinning them. Template: the billing grid is hard-coded to 3 columns; recipes quote concrete allowances that go stale; sign-up ignores ?plan= from the pricing page. |
| 5 | Opening-hours tool | 1 | pass | Hours in config/clinic.ts, computed in America/Chicago (DST, boundaries and weekend tested), and the prompt uses the tool. Reviewed desktop and phone in light and dark across every page. Trimmed the starter questions to four. |
Where the template fell short (fixed before merge)
- No shared knowledge base. "Answer from our documents" is the main use case. Documents now have a scope set in
config:user: per-user uploads.shared: an admin-managed library plus aknowledge/folder indexed at startup.both.
The sample uses both.
- The fake embedder was too weak for demo content without tuning. It's now a better offline scorer, and
minScoretuning is documented in the RAG recipe. eval:livehit the rate limit. Eval runs no longer count against the app's rate limit.--fakenow validates the case file and plumbing and marks behaviour assertions as skipped rather than failed.- The brief now says to run the full
npm run checkafter every change. - HTML is a built-in document type.
- Billing layout follows the plan count. Recipes refer to
config/plans.tsinstead of quoting numbers. The plan chosen on the pricing page carries through sign-up to checkout. - Markdown lists in the document view render as lists.
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 (light and dark) looked at. No real provider was called and no key was requested in chat.
- Rebrand + one assistant
site.ts, logo mark (token classes), favicon and share image colors, orange/cream tokens in light and dark (tokens.test.tspasses without lowering the bar), landing copy rewritten truthfully (placeholder quotes still labelled or removed).assistants.tshas onepawpalassistant withsearchDocuments;defaultAssistantIdupdated; seed, e2e tests and suggestions updated accordingly (no test still picks "Docs expert"/"General" unless kept on purpose).
- Prompt + live evals
prompts/pawpal.md(or the renamed docs prompt) with role, sources/citation rules ([n]), the no-diagnosis rule and the emergency line; no prompt text inlined in code.evals/*.yamlcases for: a cited care-sheet fact, an uncovered question ("couldn't find"), an urgent question (must contain 555-0142);npm run eval:live -- --fakeparses them. The agent explains the evals need a key and cost a little.
- HTML uploads
- An HTML entry in
FILE_TYPESthat strips scripts/styles/tags and keeps headings; upload hint andacceptfollow; tests for extraction and for a document from HTML being searchable; the existing "unsupported file" tests updated to the new hint. - Uploading
vaccines.htmlin the app and asking about vaccines yields a citation to it (fake model).
- An HTML entry in
- Plans
plans.ts: free (20,000) and plus ($15, 1,000,000);teamremoved fromPlanId, pricing, billing,.env.example; feature text matches limits (config.test.ts); limit tests and seed numbers updated; the billing simulator still works.
- Opening-hours tool
- A tool in the registry with a zod schema; time-zone-correct logic in a pure function with tests (Sunday closed, boundaries at 8:00/19:00, DST-safe via Intl); wired to the assistant; the fake model handles it (a pipeline test passes); a tool-step line in the UI.