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

  1. Record

    Ships with its own AI-DLC paperwork, or CI rejects it.

  2. Build + Smoke

    Every route loads in a real browser. Zero errors.

  3. Lighthouse

    Accessibility, SEO, performance. No category drops.

  4. Factuality

    Every number checked against its source repo.

How one change moves through

  1. 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/

  2. 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

  3. Approve

    A person reads the plan and says go. The approval is logged, with the date.

    aidlc-docs/audit.md

  4. 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/

  5. 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

  6. 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

  1. 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.

  2. 0004

    Keep every word of copy in one typed file — a renamed field fails the build instead of rendering as a blank.

  3. 0009

    Let an automated check block undocumented change — the advisory version of this rule was skipped within hours; a gate is not.

  4. 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.

  5. 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.

  6. 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.

  7. 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.