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.