How I Built This Site
The actual workflow for building this site: what I delegated, what I kept, what went wrong and what I did about it.
This is not a thought piece about AI agents. It is not about the philosophy of coding agents or why the nervous system pattern matters. It is about what actually happened while I was building this site, and specifically what I did not have to do myself.
What I delegated
I did not design the homepage layout. I said “homepage is a chronological garden feed, entries grouped by year” and the agent figured out the CSS Grid masonry approach with the JS column assignment and the --item-order preservation for reading sequence. I did not specify that grid-auto-flow: dense was banned. The agent flagged it during implementation because it scrambles chronological order within year sections, which would be a silent bug.
I did not fix the date off-by-one errors. The agent found them: entries dated to the first of a month (2018-01-01) were rendering as December 31, 2017 in US timezones because toLocaleDateString was interpreting the Date object as UTC. The agent fixed it by parsing the YYYY-MM-DD string directly instead of going through the Date constructor.
I did not catch the h1 line-height. The browser computed it to 24.75px. The agent found it because the inspector showed it. I said “the title text is cramped” and the agent found the computed value and added line-height: 1.2 to all three h1 variants. 45 characters of inline style.
I did not write the slug validator. The agent wrote scripts/validate-slugs.py after I said “add validation for duplicate slugs”. The script scans src/data/ subdirectories, extracts slug from MDX frontmatter, exits 1 if duplicates found. I tested it by adding a deliberate duplicate and removing it.
What I kept
I kept the design decisions. The agent had no opinion on whether the year label should overlap the horizontal rule or sit below it. I said “below the line, not overlapping, larger font, full contrast” and it happened. The agent had no opinion on whether the spring-physics easing on social icon hover was intentional or a bug. I said “intentional, do not remove” and it was documented and preserved.
I kept the critique loop. Every significant typesetting change went through $impeccable critique before it was marked done in intent.md. The agent ran the critique, read the output, applied the findings. If the critique said something was a defect, it got fixed. If it said something was intentional (spring physics, hero profile photo drop shadow), it stayed.
I kept the CNS health gate. After every session that touched the codebase or CNS: validate.py + graph.py --check. Both must pass. The agent does this without being asked. If the graph drifts, the next session inherits the drift. That does not happen here.
What went wrong
The CRT effects accumulated for over a year. I did not catch them during the sessions that introduced them. Each individual change made sense: DisplayFrame needed a visual effect, ImageFrame needed a blur-load pattern, the noise texture was atmospheric. The cumulative result was a site that rendered every image through an SVG filter chain that broke GPU compositing on animated elements. Fixing it meant removing effects from 6 components and verifying that nothing broke.
The date off-by-one was in every entry. Not just one file. Every entry that happened to fall on the first of a month. The agent audited all of them and fixed the rendering logic, not the data.
The nav home link had too much space below it. The agent knew to look for it because I flagged it. Without the flag it would have stayed — there is no automated check for excessive breathing room in a nav element.
What I would do differently
I would have run $impeccable critique earlier and more often. The critique found things I did not know to look for: the h1 line-height, the year label opacity, the card border easing that felt mechanical. These are the things that distinguish a resolved site from one that is just functional. Running the critique more frequently would have caught them sooner.
I would have been more explicit about what counts as intentional. The spring-physics on social icons was called a bounce-easing defect by the detector. It is not a defect — it is a deliberate celebratory animation. I had to say “do not remove this” explicitly. The agent cannot know what is intentional without being told.
The actual commit history
The agents made these changes. Not all at once, not in one session. Over weeks.
abfb78f— full typesetting pass: hero baseline alignment, card easing, milestone labelsd366f6b— year rule label: below the line, 1.1rem serif, full contrastea2af3d— nav home link: reduced bottom marginf9a763c— h1 line-height: explicit 1.2 on all detail page variants3e719db— slug validator: scans allsrc/data/, exits 1 on duplicates79a0cd0— essay about the workflow (this one is me, not an agent)
Each commit is small. None of them are interesting on their own. The accumulation is the site.
The point
I did not build this site. The agents built it with me steering. I made the decisions that required judgment — what the design should feel like, what to keep and what to remove, what was intentional and what was a defect. The agents executed the decisions and caught the things I did not know to look for.
That is the actual workflow. Not “I prompted an AI and it built my site.” Not “I use a coding agent.” I used a coding harness with a persistent knowledge layer and a critique loop and a CNS health gate. The agents did the work. I did the thinking. The graph recorded what was decided.