How I build

AI agents write almost all of my code. I make the design decisions, and mechanical checks run before I merge.

The checks

Claude Code and Codex write the code. One gate script runs before every push and again in CI, and the agent's Stop hook runs it too. In List my Life, CI runs on every pull request, and I merge on green. Hooks block --no-verify, lint-suppression comments and deleted tests.

In List my Life, 89 of 89 commits outside merges are co-authored with Claude, and 101 of 102 CI runs are green, as of 30 September 2026.

Test first

On singio, a songwriting tool, every feature starts as a written specification. The failing test is committed before any implementation exists. The commits labelled committed red make up twenty-five of its eighty-three commits. Each holds only the spec, the decision record and the tests. A separate commit then makes them pass. Faking that would take a rewrite of the history.

These repositories are private, so you cannot check this yourself. I can show the log in an interview, and the commands behind every number on this page are written down.

Rules that fail the build

singio's product runtime contains no language model. Harmony generation is deterministic, because a musician needs the same chords on the same melody twice. The engine has three static-analysis rules that make it a build failure to import an inference SDK into it.

On Antragslotse, a tool in development for German disability-benefit applicants, the layering is held by nine build-failing dependency rules, among them domain-is-pure and adapters-never-import-app. In Vergabeautomat, a rule blocks coalescing the retired total score to zero. A zero would read as a measured score the system never computed.

A gate that passed a planted key

In Sourceling, my retrieval prototype, both CI workflows were set to run the secret scanner in the mode that writes its baseline. I planted a live-format AWS key in a tracked file and ran the scan: it passed and rewrote its own baseline. The fix was the checking form of the command, pinned by a test.

Since then I show each gate failing on a known violation before I trust it. On singio, one script injects a real violation for each gate and asserts a non-zero exit.

In development

papierkram is a Rust PDF toolkit for mobile. It runs a gate with mutation testing and a measured engine bake-off. tilt-orb is a Godot game. Both are in development.

Where it stops

It is one project, and it is recent. singio has twenty-five test-first commits. The other three repositories have none.

It did not reduce my rework in any way these numbers show. Over each project's first eighty-three commits, singio has seven fixes against thirty-five features. Sourceling, with no test-first commits, has ten fixes against forty-five features. The two ratios are almost the same. The oldest of the four, Vergabeautomat, opened with fifty-one fixes against six features.

It is all solo work. The reviewer is an agent I configured, and no second engineer has argued with these rules. Several written gates are not wired yet. The scale is modest: Docker Compose on a VPS.