Builds / EXP-007

EXP-007● BuildingPilotRunning on Netlify with drafts behind a password, and each page approved by me once I've checked it on the preview. Production means cutover: emilybuilds.ai pointed here and opened to search engines, every redirect re-checked on the live domain, and Super cancelled.▸ Under the hood

Nothing goes live unread: building a public site with AI agents, without losing control

I rebuilt this lab in code over three days, with Claude Code writing all of the code from briefs I worked out with Claude in a separate chat. Here's the setup that keeps an agent-built site honest, what still only showed up in a browser or on the live site, and the rules that came from mistakes.

This lab, rebuilt · Oct 2026

The question

If an AI agent can run and check its own work, what's left for me to do, and how do I keep control of what gets published?

Started
Oct 2026
Status
Building
Readiness
Pilot
Tools
Astro · Keystatic · Netlify · Claude Code · the stack

Under the hood

Timeline. Planned in a Claude chat from 29 October 2026. Claude Code started on 30 October: the first commit, the whole skeleton, at 14:08; the password on every non-production deploy by 15:42; and the first preview deploy at 20:53, once a new commit was pushed. On 31 October came the review panel, eleven 2025 posts migrated word for word, seven page drafts and the first eight reviews. Page-by-page edits continued through 2 November. Cutover from Super is due on 4 November 2026.

Stack (as of 2 November 2026)

  • Astro: a static site, with Markdoc for the long pages
  • Keystatic, in GitHub mode: the editor, on previews only and never in production; on the preview, every save commits to the preview branch
  • Netlify: hosting, branch deploys, Forms, and an edge function that puts a password on every deploy except production
  • GitHub: a private repository, and a GitHub App for signing in to Keystatic
  • Claude Code: writes all the code and loads content from the briefs, plus six reviewer subagents (Opus for disclosure, claims and live features; Sonnet for the rest)
  • Scripts in npm test: approval and placeholder checks on the production output, banned terms, secrets, redirects, contrast, and a house-style report
  • Namecheap: DNS stays where it was

The demo is the site you're reading. Everything AI-generated here is checked by AI reviewers, and anything that changes what you see on the site is approved by me.

In July 2025 I put the first version of this site live on Notion and Super.so, and wrote at the time: "When I get tired of paying Super £16/month (ouch!), I'll code it up properly." (Why that was the right call then.) In October 2026 I did, though the subscription was no longer the main reason. It's still where I show what I build with AI and how, and now building it is one of the experiments too. Two weeks earlier I'd built emilysas.com with a Claude agent that couldn't run what it wrote, so production quietly became the test environment. This rebuild was the second data point: the same stack (Astro, Keystatic and Netlify), but with Claude Code, which can build, preview and test its own work, writing all of the code from briefs I worked out with Claude in a separate chat, and a build log kept as I went.

How it's set up

  • Planning and building are separate sessions. The chat holds the plan: the build brief, page drafts, a decisions log and, for each round of page edits, a change file of exact before-and-after text. Claude Code does the building and keeps the log. The decisions log records whose idea each decision was, so the credit on these pages can be traced rather than remembered.
  • Nothing reaches the public site unread. Every edit I make in Keystatic commits to a long-lived preview branch, deployed behind a password. Production shows only what I've marked approved, and its build fails if a draft or a bracketed placeholder would leak into any page, feed or share image.
  • Six reviewers, each with a remit. As on Fold's review panel, each starts with a fresh context, reports and never fixes, and must say what it didn't check. The difference is where the risk sits. Fold's dangerous failures were in code and data; the lab is mostly words, so the two reviewers that block approval check disclosure (what must never be published) and claims (whether every number and date traces to a source). The production build enforces this: it fails if an approved page has no review, has changed since its last review, or still has a contradicted claim or a blocking or major disclosure finding that a later review hasn't closed and I haven't accepted with a reason. Unverified claims and minor findings warn but don't block.
  • Scripts for anything with a yes or no answer: banned terms, secrets, redirects, contrast, and whether every ledger row has a basis and every row that mentions hours or time says if it's elapsed or worked.

Last time's lessons, tested

emilysas.com ended with eight things I'd do differently. The most important was to give the agent eyes before giving it hands, and that one held. Claude Code ran its own builds and tests, and checked layout work in a browser at phone and laptop widths. The first commit was the whole skeleton, about 3,900 lines covering the content model, every template, the timeline and the redirects with their test, and my own time in that session and the next was under five minutes each, worked, by my estimate. The preview branch and its password were built in the second session, before any page copy existed. I did the accounts over the first evening and the next morning, and Claude Code kept the build log as it went, with each blocker's cost recorded within a day, from timestamps, rather than reconstructed from git history afterwards. Some haven't been tested yet, and one is plainly still open: outside eyes before launch. As of 2 November 2026, the only person who has read the lab is me.

What only showed up in a browser or on the live site

Eyes weren't enough on their own, because most of what went wrong lived between services, where no unit test reaches. Netlify made the new project Private by default, so production showed a Netlify login page. The repository had been added to an older GitHub App instead of the new one, which produced "Repo not found". Two more showed up earlier, in a real browser against a local copy of Netlify, before the site existed. Keystatic's own 401 responses made browsers forget the preview password, which took about 25 minutes, elapsed, to pin down. Keystatic also opens the repository's default branch, so edits made on the preview would have gone straight to main until /keystatic on the preview was redirected to its own branch. The most instructive failure was a deploy: the agent wrote the editor app's short name into the README, Netlify's secrets scan matched it to an environment variable, and deploys failed for over an hour, elapsed, mostly unnoticed, even though the value wasn't a secret.

Checks that passed when they shouldn't have

A script confirming that the timeline's thread panels were hidden passed while every panel was showing, because the stylesheet overrode the attribute it tested; only a screenshot showed it. In the same stretch, the build log recorded a narrow-screen fix as done before the failing test had been read, and had to be corrected. Neither was dramatic, but both are the failure this lab exists to examine: a confident report that nobody traced. Fold taught me the same lesson with a save check that reported "no errors" whenever it crashed.

The reviewers found their share. All eight reports in the first round (a full disclosure review and claims reviews of seven pages) came back with findings. Nothing sensitive had reached production, but three blockers were gaps in the approval gate itself: places where unapproved copy or images could have shipped. A claims review found the seed content showing verdicts from reviewers that had never run, with review dates to match. Those are fixed and recorded against the findings they close. Two disclosure findings were left for me to decide, and both are now closed in code: the editor no longer runs in production, and production publishes a redirect only once its target page is approved.

Rules that came from mistakes

The agents don't remember a correction from one session to the next, so a lesson only sticks once it becomes a standing rule. Two of the house rules came from this build. Claude Code must never run git clean or delete untracked files; it lists them and asks me instead. I also didn't want to lose an article or my own Keystatic edits to a reloaded draft, so the content file is now the master copy of every page, the drafts in the repo are frozen originals, and before overwriting a page the agent checks whether I've edited it since, and stops if I have.

The limits

  • The gate is partly an instruction. A production build fails if any unapproved content entry would ship, but only the builder's instructions stop it ticking Approved itself. Everything AI-generated here is checked by AI reviewers, and anything that changes what you see on the site is approved by me.
  • One of the six reviewers hasn't run yet: freshness, which sweeps the site monthly and starts after launch.
  • No outside reader yet. As of 2 November 2026, every check has been an agent's or mine.
  • The comparison with emilysas.com isn't like for like. That build's log was reconstructed from git history, so the same measures don't exist for both.

What I learned

  • Accounts and the seams between services still needed me. An agent that can test its own work removes most local failures; it can't log in to Netlify for me.
  • A passing check is a claim too. It needs the same tracing as a sentence on a page.
  • Rules beat memory. A correction an agent can't carry forward has to live in a file it reads every session.
  • Making got cheap, so the words became the work. Five of the seven change files on 1 November were page copy, each a list of exact edits.

If you're letting AI agents build or publish on your behalf and want to keep control of what goes out, I'd be glad to compare notes. Get in touch.

Then / Now

Aspectemilysas.com, mid-OctoberThis lab, two weeks later
Could the agent run what it wrote?No: it couldn't install packages, so errors only appeared on my laptop or when the host built itYes: Claude Code builds and tests its own changes, and checks layout work in a browser at phone and laptop widths
Where things got testedProduction quietly became the test environmentA long-lived preview branch behind a password; production shows only what I've approved
Hosting limitsAbout 25 deploys in a day used up the free plan on launch day, forcing an upgradeNetlify's Personal plan, $9 (about £7) a month, with drafts deployed to the preview
Accounts and sign-inThe editor's sign-in failed four times in a rowStill fiddly (the wrong GitHub App, a login mismatch, missing callback URLs): about 1h 20m on the clock over an evening and a morning
Checking claimsMe, after drafting: agent drafts named clients until a reviewer pointed it outA production build fails if an approved page has no current claims and disclosure review, or still has a contradicted claim or a blocking or major disclosure finding open
Build logReconstructed from git history afterwardsKept by Claude Code as the build went, with every time labelled elapsed or worked

Who did what

I framed

  • The aim: a lab that shows what I build with AI and how, with the rebuild itself as one of the experiments
  • The test: the same stack as emilysas.com, rebuilt with an agent that can run and preview its own work, logged as I went so the two can be compared
  • The ground rule: no copy goes live without my sign-off
  • The review panel: six reviewers modelled on Fold's, with disclosure and claims blocking approval
  • The structure: everything dated on a timeline, and organised by eight threads rather than by project
  • The archive rule: old posts keep their 2025 wording and voice

I set up the team

6 reviewers · 1 builder session · 1 planning session · Just me · 7 standing rules · 5 constraints

See the team ↓

I decided

  • Astro, Keystatic and Netlify, the same stack as emilysas.com, with a private repo and DNS staying at Namecheap
  • A password-protected preview branch for drafts
  • The approval gate, enforced in the production build: every approved page reviewed for claims and disclosure, and checked again whenever it changes
  • A decisions log recording whose idea each decision was, and every time in the build log labelled elapsed or worked
  • A Readiness badge on every build, in place of containment labels
  • Dropping the vegan checker, so Mullo takes the Try it slot
  • Keeping Keystatic out of production, so the editor runs only on previews
  • The project's name, emilybuilds.ai, and the repository's, from the agent's suggestion
  • The archive panel's layout from two options, private edit records, and approximate dates on the old posts

Claude built

  • Proposed, and I approved: the content file as the single master copy of every page, and never deleting untracked files
  • Proposed: stripping placeholders from production builds, as a second guard behind Approved, and Keystatic on the preview editing only that branch
  • Proposed, and I approved: an All notes page, a build check that every item has a thread, and a preview-only review queue
  • Proposed, and I approved: the archive intro panel, and mentioning only edits that change what a piece says
  • All of the code: every template, the timeline, the replay viewer, the password edge function, the checks and tests; the eleven migrations; every review report; and the build log

The team

How the team workedMe at the top, then lanes for Plans, Builds, Reviews. Arrows show briefs from me to Plans; specs from Plans to Builds; changes from Builds to Reviews; findings from Reviews to Builds; questions only I can answer from Reviews to me. Inside 7 standing rules and 5 constraints.How the team workedMe at the top, then lanes for Plans, Builds, Reviews. Arrows show briefs from me to Plans; specs from Plans to Builds; changes from Builds to Reviews; findings from Reviews to Builds; questions only I can answer from Reviews to me. Inside 7 standing rules and 5 constraints.

Agents and models

NameRoleModelWhat it was for
PlannerPlansClaude Opus 5.5, in a chatWorks out the build brief, page drafts, the decisions log and, for each round of page edits, a change file of exact before-and-after text
BuilderBuildsClaude Code, Opus 5.5Writes all the code and loads content from the briefs, runs the checks and the reviewers, and keeps the build log
Disclosure reviewerReviewsClaude OpusAnything I've ruled must never be published, read from the built production output; blocks approval
Claims reviewerReviewsClaude OpusTraces every number, date and claim to a source, and checks elapsed versus worked time; blocks approval
Live-demo reviewerReviewsClaude OpusFail-closed guards, the preview password, forms and the editor; first run on 2 November 2026
Proof reviewerReviewsClaude SonnetWhether a page proves what it claims, read as a hiring manager and as a sceptical peer; first run on 2 November 2026
Visitor QAReviewsClaude SonnetFirst-time visitor journeys on the preview at phone and laptop sizes, ending with a Safari checklist; first run on 2 November 2026
Freshness reviewerReviewsClaude SonnetA monthly sweep for stale dates, prices and Then / Now rows; not yet run

People

  • Me Frame each brief, set up the accounts, approve every page, and decide when the preview goes to production

Standing rules

  • No copy goes live without my sign-off: production shows only approved items, and its build fails if a placeholder or a draft would leak
  • Keystatic on the preview commits to the preview branch, which sits behind a password; only the exact production context is open
  • A production build fails if any approved page has no review, has changed since its last review, or has an open contradicted claim or a blocking or major disclosure finding; a finding closes when a later review closes it or I accept it with a reason
  • The decisions log records whose idea each decision was
  • The content file is the master copy; drafts in the repo are frozen originals
  • Never run git clean or delete untracked files: list them and ask me
  • Every time is labelled elapsed or worked, and square brackets are never filled by guessing

Constraints and unblocking

  • My Claude plan's allowance, shared with everything else I build, so each review picks a depth
  • Netlify's Personal plan for hosting, and no AI in the site itself, so no API spend
  • Super.so at $26 (about £19) a month until cutover, and $16 for any final month before the site is deleted
  • Netlify's secrets scan failed our deploys when an environment variable's value appeared in the repo, though it wasn't a secret
  • Unblocking: created the Netlify project and set it to Public, turned on branch deploys and form detection, set the environment variables, and created and installed the GitHub App with its callback URLs

Reviewers

  • Me Final say on every page, and on every finding a review leaves open; as of 2 November 2026, the only person to have read the lab

Tools

  • Keystatic Writing and editing pages without touching code, saved as commits
  • Netlify branch deploys and an edge function A password-protected preview of everything not yet approved
  • Claude Code subagents A fresh context for each reviewer, so the builder never grades its own work
  • Scripts in npm test Checks with a yes or no answer, run together in one command
  • A build log and a decisions log What happened, what each blocker cost, and whose idea each decision was

Ledger

ItemValueBasisNote
Commits127MeasuredOn the preview branch, 30 October 14:08 to 1 November 22:14: 113 changes, 7 merges and 7 saves from Keystatic.
CodeAbout 5,000 linesMeasuredTemplates, scripts, tests, the password edge function and the editor's config, at 22:14 on 1 November, all written by Claude Code. The first commit alone was about 3,200 on the same measure.
Active session timeAbout 6.1 hoursModelledElapsed, from Claude Code's transcripts, 30 October to 00:32 on 2 November: gaps under 10 minutes, parallel sessions counted once (10.4 hours at 30 minutes, 18.0 at 60). Includes Claude working unattended; excludes the planning chat and two sessions that worked in the Mullo repo.
My own time in Claude CodeAt least 2.1 hoursModelledWorked, a floor, over the same window: gaps under 10 minutes between my turns. Misses reading time and the planning chat.
Account setupAbout 1h 20mEstimatedElapsed, breaks not counted: Netlify, branch deploys, the GitHub App, environment variables, callback URLs and a login mismatch. I was also working on Mullo and Fold, so it isn't time on this build alone.
First commit to first preview deploy6h 45mMeasuredElapsed. A preview login that worked took until 09:18 the next morning.
First-round reviews8 reports, all with findingsMeasured31 October: a full disclosure review and claims reviews of seven pages. Nothing sensitive had reached production.
Running cost$9 (about £7) a month for hostingMeasuredNetlify's Personal plan. The site calls no AI. Super's subscription, $26 (about £19) a month and $16 for any final month before the site is deleted, ends at cutover; my Claude subscription is shared with everything else I build.
Measured
counted or timed directly
Modelled
estimated from a stated method
Upper bound
the most it could be
Estimated
my own estimate, not measured

Time figures say whether they are elapsed or worked. Time between commits is never presented as hours worked.

Non-sterling costs show the amount paid, with an approximate sterling figure at that month's average rate. Rates from HMRC's monthly exchange rates.

Outside the lab

What this would take in an organisation.

This is a publishing workflow as much as a build, and its controls are ones any regulated content team would recognise: drafts can't reach the public by default, claims are checked against their sources, and a named person approves anything that changes what readers see. With agents doing the making, that separation matters more, because a fluent wrong sentence now costs nothing to produce. In an organisation I'd keep the same three layers (a preview nobody can publish from, scripts for anything with a yes or no answer, and reviewers with a remit for judgement), then add what a solo builder can defer: a named owner for disclosure and for claims, and people outside the build reading it before launch. The other lesson travels too. Accounts, permissions and the seams between services still needed a person, so they belong on day one of any agent-built project, with the person who holds the access ready to clear the way.