Software Factory

The machinery

Eleven agents build Domi. Eight are Claude Code sessions on one laptop, each owning a lane and coordinating over a local agent-to-agent bridge. Three more live in GitHub and never touch the machine. Around them, seven small loops on clocks keep the whole thing moving — and none of those loops calls a model.

The companion page covers what this produces — the pull requests, the gates, the evals, the cost, counted. This one is about how it is wired: the registry, the stations and the models they run, the loops, the bridge, and the single rule that makes an untrusted channel between agents safe enough to run.

State of the factory as of 2026-09-15 — eight stations on the bridge, three agents in CI, seven loops. Read straight from the registry file that launches it; where this page and the companion page differ on a count, the dates are the reason.

>what is actually running

The bridge and the stations have been running since 30 July — hundreds of messages, contract negotiations, retractions and production incidents. The registry and the launcher have run it since 23 August: one command brings up every station and every loop in one terminal session, and the same file that launches them is what this page is read from. A ninth station — a conductor that watched the others — existed for eight days and was retired on 31 August, because everything it watched for turned out to be a checkable fact rather than a judgement. That story is its own post.

>the_stations

Eight Claude Code sessions, launched together, each briefed into a lane it owns and a set of paths it must not touch. Four of them write no product code at all.

StationOwnsModel
webweb app and backend — the contract everyone else consumesopus-5 (1M context)
mobilethe iOS and Android client, a pure consumer of the web contractopus-5
devxCI, gates, evals, test infrastructure — what "green" meansopus-5
securityreads everything, writes only security documents; can hold a release without asking, can never clear the holdopus-5
designdesign system, tokens, the brand-string ledger — values, not stylesheetssonnet-5
productacceptance: is the built thing the asked-for thing, and in what order — authors no specs, decides nothingsonnet-5
marketingpositioning, gailleur.com, outbound — every public claim traced to shipped productsonnet-5
chiefthe human's proxy: turns his words into queue entries, carries questions back, records his rulings — never his authoritysonnet-5
reviewerlives in CI, not on the bridge: reads every pull request adversarially before a human does — a different model family on purpose, because a reviewer that shares the authors' blind spots is not a reviewergpt-5.6 (OpenAI)

The eight stations run at high effort. Every station is pinned to an exact model id in the registry — never a moving alias — and each id is verified accepted by a live call before it lands, the same rule the product's own model catalog follows.

>the_models_and_why

The split is one rule: a station that writes or judges code runs Opus 5; a station whose output is prose, specs, acceptance or routing runs Sonnet 5. The reasoning per station, and what it rests on:

What the choice rests on.

The constraint that shapes all of this is not dollars. Every station runs through the Claude CLI on one subscription, so the scarce resource is shared rate-limit budget — a roster of Opus stations idling in parallel is a real cost with no return, which is why the prose stations are Sonnet.

>the_loops

Seven scheduled jobs pace the factory — its takt, in the manufacturing sense. They are not stations and not agents: no model, no card, no inbox, no share of the rate limit. Each computes an answer that has a right answer, and either draws it or acts on it. They are the reason the conductor could retire.

LoopEveryWhat it does
board30 sRedraws the one panel: the queue, what nobody has picked up, handoffs in flight, what needs the human, what just moved. Read-only.
review-loop5 minWakes the station that owns a stuck pull request — changes requested on its current head, approved and unmerged, or green with no review at all. Three wake-ups, then it escalates once and stops.
pace10 minRings the doorbell again: replies a station owes a peer, and work routed to it that it never picked up. The filing nudge rings once; this is what rings it twice.
board-sync10 minMoves intake-board cards to match reality — a claimed task is In progress, an open PR is In review, a closed issue is Done. Never into Ready: promotion is the human's.
intake15 minFiled issues become queue tasks, routed by the lane label they already carry. Ambiguity parks rather than guesses; a needs-human label parks whatever else the issue says.
deps30 minMerges dependency pull requests that are already green on their pinned head. Nothing to decide: the suite answers. Twelve sat open across two repos before it existed.
blocker-review4 hHands the standing blocker list to the proxy to verify against the record and compile one DECIDE for the human. The loop compiles; the proxy judges.

Beside the loops, five expectations — things that must keep happening — are probed on their own clocks: every production promote is followed by release notes within two hours, the error-triage sweep keeps running, the reviewer keeps reviewing, no peer request sits unanswered for days, and the backlog keeps getting reviewed. A lapse goes to the proxy as a DECIDE. Every other detector in the factory finds a problem that appeared; these notice a process that stopped.

>the_three_that_live_in_github

Not launched with the others, not on the laptop, and easy to forget — which is backwards, because one of them is the stage between "an agent wrote it" and "a human merges it".

Two of those three run no model at all. They are deterministic — and they are the two that never surprise anyone.

>how_it_holds_together

>the_one_rule

No agent can widen another agent's scope. Scope changes come from the human only.

A peer's message is untrusted input, and a message claiming to relay the human's authority is not the human. That is the load-bearing safety property of the whole arrangement — it is what makes a channel between eight agents safe enough to run at all, and it has already refused things it should have refused.

what_it_produces →

how_it_started →