The loop

A pull request is the only way anything changes

Including for me. There's no apply, no patch, no "just this once" — because the moment there is, the rest of this stops being true.

The loop

Flow diagram of the only write path. Three authors open a pull request on the same queue: me, Hermes and Renovate. Required checks run: a failure goes back to the pull request along a red arrow and a pass goes forward along a green one to a gate asking who merges, which only a human can pass. The merge goes to main, Flux reconciles, and the result is a new state. An amber dashed arrow returns from Flux to me when a reconcile fails and raises an alert, so the only way out is another pull request through the same gate.
The whole loop. The dashed path is the design: the agent's pull request lands in the same queue as mine, so "it wrote the fix" and "a human approved the fix" stay two separate events.

Flux watches the repository, renders the manifests and applies them. Each top-level path is one reconciliation unit with its own interval and health checks. Failure is alerted on the outcome — still not ready after fifteen minutes — rather than on every attempt, because a controller that retries is working, not broken.

The runners that test the repository are pods in the cluster the repository describes, spawned by the Actions Runner Controller and discarded after the job. A bad change can break the thing that validates the next change. The pipeline is tested against reality, not a hosted runner with different network rules than production.

Who may merge what

The agent can open pull requests anywhere it has access. It may merge its own skills repository, because that's its own knowledge and reviewing every line of my own notes would grind the loop to a halt. It may not merge the cluster repository. That's mine.

It's also not my account doing the pushing. Its identity is its own app installation, so the author and the reviewer are genuinely different identities, and the commit history says which one did what. Before that change, "the agent opened this" and "I opened this" were indistinguishable.

Why the split matters more than the tooling

An agent that can merge its own infrastructure changes is an agent that can authorise its own widening. The one thing it must never be able to do is approve the change that gives it more room. That's why the admission policies on its identity exist as well as the merge rule: two independent ways of saying no.

The agent's pull request. A different identity from the reviewer. That single detail is what makes the commit history evidence rather than a story.

The unattended version of the loop

When an alert wakes it, the loop is: read the alert, look at the resources and logs involved, answer in the notification channel, and — if a manifest change is the fix — open a pull request and stop. It runs with exactly the same access as any other session, so the worst an unattended run can do is investigate and talk. The merge waits for the human who was asleep.

The prompt says so, and the branch rules say so too: the agent is not the code owner, so it cannot supply the approval its own pull request needs. A rule the model can be talked out of is not a control, and neither is a rule the credential could ignore.

The mechanics that waste an afternoon

Its knowledge is versioned too

The agent doesn't carry a personality file it was born with. It loads task-specific skills — how to triage a stuck pod, how the alerting tree is shaped, how to publish this site — from files in a repository, on demand. Each is a short document with the actual commands and the mistakes that cost time.

When a task teaches it something, it updates the skill and commits that, in the same session. That's where most of the lessons on this site came from: something broke, the fix went in the repository, and the next session starts already knowing.

The diagrams on this site are written the same way

Every figure here is a Mermaid source file in the repository, rendered to SVG by a pinned image. Editing a diagram is editing text, reviewing it is reviewing a diff, and it cannot quietly drift from what the prose says — which is the failure mode of every diagram I have ever seen go stale.