How I work

AI-assisted development, inside guard rails the CI enforces.

I build software with AI coding agents every day, mostly Claude Code. Most of that work is not prompting. It is making a codebase legible to the agent, and making its mistakes fail loudly instead of quietly.

Download the harness PDF

A hierarchy of instructions

A root instruction file holds the repository-wide rules. Each area has its own file, and a deeper file overrides the root for its subtree. Agent-specific files only point back to the shared ones, so different coding agents read the same rules and nothing is maintained twice. When an agent knows the failure mode behind a rule, it applies the rule to cases nobody listed, so every non-obvious rule carries its reason.

  • AGENTS.mdrepository rules: no magic values, lint green, dependency age
  • ├─ backend/AGENTS.mdAPI, database, auth, validation
  • ├─ frontend/AGENTS.mdrouting, state, styling, testing
  • └─ CLAUDE.mdpointer back to the AGENTS.md files

Rules become checks

A rule an agent can ignore is a suggestion. A recurring mistake becomes a check that fails: the build does not compile until generated database types exist, a CI job fails when an API contract drifts from its schema, an ESLint rule rejects hand-written SQL transactions outside the database layer, Stylelint rejects hardcoded colours, and a dependency published yesterday cannot be installed by hand.

A real failure, not a hypothetical one: Stylelint rejecting a hardcoded color.
$ npm run lint:styles

app/components/Example/Example.scss
  12:3  ✖ Unexpected hex color "#f5a623"   color-no-hex

1 problem (1 error, 0 warnings)

Gates on every change

Every pull request runs lint, tests and a build, on backend and frontend, plus a job that fails if a generated contract is out of date. The CI token is read-only by default, so code from a pull request never inherits write access.

Gates on generated documents

Agents generate documents as well as code, and a document can be wrong in ways no unit test sees. My CVs are generated from typed configuration and rendered to PDF, and every one has to pass a gate before it is sent: exactly one page, a minimum number of clickable links, a word budget, required skills present, forbidden words absent.

Reusable skills

Eleven skills, shared across the coding agents I use. Each one is a procedure with its own guard rails: component and store scaffolding, user stories in a project's exact format, a UI and UX audit that drives a real browser across three screen widths and only applies the fixes that pass lint and tests, and a security audit.

Proof, not a claim

I ported this same template to Rust and to Go, each in one to two days, AI-assisted. This site is built the same way, and once it is public, its repository is the example.