Process
How this site is made.
Every change to this site starts as a written plan, gets approved, built, checked by four automated gates, and closed with a record. Every decision about how it's put together is written down. You can retrace all of it.
- 49
- changes recorded, numbered 001–050, since January 2026
- 19
- decisions written down, numbered 0001–0020
- 3
- of those decisions later replaced — kept in the record, marked superseded
- 4
- automated gates on every pull request
The toolkit, by name
Every Claude Skill actually reached for while building this site — names only, never what's inside them. Drift them, drag one, or click to give it a nudge.
What a PR has to pass
- Record
Ships with its own AI-DLC paperwork, or CI rejects it.
- Build + Smoke
Every route loads in a real browser. Zero errors.
- Lighthouse
Accessibility, SEO, performance. No category drops.
- Factuality
Every number checked against its source repo.
- Record
Ships with its own AI-DLC paperwork, or CI rejects it.
- Build + Smoke
Every route loads in a real browser. Zero errors.
- Lighthouse
Accessibility, SEO, performance. No category drops.
- Factuality
Every number checked against its source repo.
How one change moves through
Inception
Once, at the start: write down what the site must do, how it's structured, and what it runs on. Everything after is measured against this baseline.
aidlc-docs/inception/
Plan
Every change gets a number and a short note: what changes against the baseline, and which files are expected to move.
aidlc-docs/efforts/NNN/requirements-delta.md
Approve
A person reads the plan and says go. The approval is logged, with the date.
aidlc-docs/audit.md
Build
The actual code and copy change. All text lives in one typed file and project write-ups in one folder, so nothing is buried inside components.
src/ · content/
Verify
The type-check and full build must pass. Then four automated gates run — the pipeline above. Nothing ships until all four are green.
npm run typecheck · aidlc-check.yml · quality-gates.yml · evals.yml
Decide and close
If the change altered how the site is put together, the reasoning becomes a numbered ADR. The change is marked complete and indexed, so the history reads in order.
docs/adr/ · effort-state.md · registry.md
Decisions, in one line each
- 0002
Publish as plain static files on GitHub Pages — nothing to host, patch, or pay for on a site that changes a few times a year.
- 0004
Keep every word of copy in one typed file — a renamed field fails the build instead of rendering as a blank.
- 0009
Let an automated check block undocumented change — the advisory version of this rule was skipped within hours; a gate is not.
- 0011
Rebuild the site from scratch on a new visual model — two redesigns on the old template hit the same ceiling; this decision replaces two earlier ones.
- 0012
Gate every change on a browser smoke test and Lighthouse scores — a build that succeeds can still ship a page that throws or an accessibility regression — it did, once; the gate catches both before merge.
- 0013
Check every number on this site against the source it came from — the write-ups were drafted by an AI from each project's own README; a claim it invented would look exactly like a true one. Now it fails the build.
- 0014
Publish a plain-text edition of the site for AI agents — an assistant reading this site should not have to scrape twenty styled pages to answer one question about my work.
Two earlier decisions (0001, 0010) were later reversed. They stay in the register, marked superseded, so the history stays honest and readable.
What's different here
- The /projects page is callable, not just readable.
- It registers a WebMCP tool (searchProjects) via document.modelContext — inert until a browser ships it, but wired, schema-declared and tested today. ↗
- AI agents get their own edition.
- llms.txt and llms-full.txt are generated at build time from the same content the site renders, so they can't drift. ↗
- Accessibility is 100 on every route, gated.
- Lighthouse CI runs on every PR. A contrast regression or a missing label fails the build before it ships. ↗
- The brain you scrolled through is 160 real MRI slices.
- Axial slices of the ICBM 152 Nonlinear Symmetric 2009a T1 template, rendered from the original NIfTI file. ↗
- Two earlier decisions were wrong. They're still in the record.
- ADRs 0001 and 0010 were superseded, not deleted. The history stays honest. ↗
I keep this page because the habit matters more than the website. It's the same discipline I use on a research pipeline: leave enough of a written trail that a reviewer can retrace every step without asking me. The site is the worked example you can open.