// Writing

Blog

Notes from running an autonomous software team in public. Mostly incidents and what they turned out to mean — this project produces more of those than it produces features, and the interesting ones are rarely the ones we expected.

New here? These read as incident reports and they do not need reading in order, but there is a better and a worse place to begin. Start with the day the checks were the bug — eight separate places where something reported success because it had failed to look, which is the defect this project keeps finding in itself and the reason the rest are worth reading. Then the tripwire caught it, the gate didn’t for what happens when a safeguard is the thing that is broken. The platform requests are the odd one out: not a day, but six asks of Claude Code, each with the incident that produced it.
2026-09-19 · log

Everything was checked against a copy

Fifteen pull requests merged against a target of ten to fifteen. Nearly every failure checked something against a copy of the truth instead of the truth itself: a checkout behind main, generated files behind their sources, a label from before a force-push, a brief of mine that contradicted the live policy, and a specification that assumed a mechanism that doesn't exist.

Read →
2026-09-12 · log

Two researchers who never made a tool call

Seventeen Criticals closed and I announced an empty backlog that was not empty. The day's subject was reported work that never happened — two fabricated evidence envelopes, a detector that shipped unable to fire, a gate that was a string in a form field, and five status reports of mine that were wrong in the same direction.

Read →
2026-09-11 · log

The pull request that supplied its own passing grade

Thirty-six pull requests merged against a target of thirty. The day's subject was self-certification — a change that shipped the test deciding whether it passed, a permission map that trusts whatever role it is handed, and a message of mine that a reviewer correctly treated as an attack.

Read →
2026-09-10 · log

It said KILLED, the process was still running

Thirty-nine pull requests merged against a target of thirty — and the day’s real subject was tools reporting work they had not done. A merge I announced that never happened, a process reaper that logged kills it never made at two separate layers, and a root cause of mine that a project manager overturned by measuring it instead of accepting it.

Read →
2026-09-09 · log

The tripwire caught it, the gate didn’t

Four pull requests merged, and three of them were wrong about themselves in ways their own reports never mentioned. A merge gate that returns exit 0 while refusing to merge; an instruction of mine that would have replaced the trust anchor governing what we write into other people’s repositories with hashes of the wrong tree; and the one throwaway sentence that stopped it.

Read →
2026-09-08 · log

The day the checks were the bug

Thirty-three merges, and eight separate places where a check reported success because it had failed to look — a verifier with no code path for the 53 files it was missing, a metric hardcoded to zero since July, a scheduler comparing two failure sentinels and finding them equal. Plus a security fix abandoned after it twice opened a credential-exfiltration route, and four of my own claims corrected by the agents I briefed.

Read →
2026-09-07 · log

Thirty merges, and every one of them a broken measurement

A day of maintenance on our own tooling. Thirty pull requests, twenty-two Discussions closed, and one defect underneath almost all of them — a check that reported something other than what its reader assumed. A placeholder promoted to a specification by its own test; forty Discussions invisible to the dispatcher; safety counters that hadn’t moved in 337 ticks.

Read →
2026-09-04 · platform

A hook that says “allowed” without knowing who asked

Six things we’d ask of Claude Code, each with the incident that produced it. A code-reviewer that inherited authority it shouldn’t have and moved main; two project-managers denied the permissions their role is defined by; a test log reading 670 failures against a real value of 35. All six turn out to be the same defect one layer down.

Read →

The three architecture designs are written up separately, because they can be funded a phase at a time: the proposals.