Software Factory
The machinery
Nine agents build Domi. Six 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 at all.
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, the bridge, and the single rule that makes an untrusted channel between agents safe enough to run.
State of the factory as of 2026-08-23 — six stations on the bridge, three agents in CI. The companion page counts to 2026-08-22, before the conductor station existed; where the two pages differ on how many agents there are, the dates are the reason.
>what is actually running
Worth separating, because the two halves have very different mileage.
The bridge and the stations are real and have been running for weeks. Agents have been coordinating over this channel since 30 July, through hundreds of messages, contract negotiations, retractions and production incidents. That part is battle-tested and the companion page counts it.
The launcher, the registry and the conductor are days old, and the one-command start has never been executed. Not once. They are built, not yet run in anger. This page says so rather than letting a reader assume otherwise, and it will say something different the day that changes.
>the_stations
Six Claude Code sessions, launched together, each briefed into a lane it owns and a set of paths it must not touch.
| Station | Owns | Model |
|---|---|---|
| conductor | keeps the other five in time — pane and inbox health, the blocked-handoff ledger | haiku-4.5, low effort |
| web | web app and backend — the contract everyone else consumes | opus-5 (1M) |
| mobile | the iOS and Android client | opus-5 |
| design | design system, tokens, the brand ledger | sonnet-5 |
| devx | CI, gates, evals, test infrastructure — what "green" means | opus-5 |
| marketing | positioning, gailleur.com, outbound | sonnet-5 |
Every station is pinned to an exact model version in the registry — never a moving alias — shown here in short form. Each station's model is verified accepted by a live call before it lands, the same rule the product's own model catalog follows. The conductor drops to low effort deliberately: it reads JSON on a timer and never writes code. The scarce resource is shared rate-limit budget, not dollars.
>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".
- The reviewer. Reads a pull request against the original wording of the issue it claims to close — skipping drafts, bot and docs-only changes — offline and read-only, and fails the check if it has nothing to say. It runs a different model family on purpose: every station is a Claude agent, and a reviewer that shares the authors' blind spots is not a reviewer.
- Error triage. Files one deduplicated ticket per new production error, with evidence attached, on a schedule.
- Dependency updates. Opens the upgrade pull requests.
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
- One registry. A single JSON file is both the source of truth and the configuration: who exists, which model, which effort, which working directory, which inbox — and the exact prompt each agent is launched with. Adding a station is a registry entry, a card and a brief, never an edit to the launcher.
- A card per station. What it owns, what it must not touch, what it publishes to peers, what it needs from them — and, load-bearing, what it may do on a peer's word versus what it must bring to a human first.
- A conductor, not a manager. This factory runs on frozen contracts — a station announces, the consumer acknowledges, then it lands — so stations block on each other by design. Which means its characteristic failure is not a dead agent but two healthy agents out of time with each other, and a liveness check reports that as six green lights. The first health run found nineteen live unanswered handoffs, the oldest about five and a half days, and it was a contract acknowledgement — while every station was alive and busy. The metaphor draws its own limit: a conductor cues entrances, it does not write the score. It never assigns work, sets priority, restarts a station, or merges anything.
- One report format. Every agent reports as DECIDE → DO → FYI. Rulings first, because they are blocking another agent and cost a human seconds to answer; then work only a person can do — secrets, production, a physical device; then what happened. The rule that gives it teeth: a decision an agent took that was the human's to take goes in DECIDE, retroactively. Nothing gets moved to FYI because it is awkward.
- A bridge, not a socket. The stations coordinate over a local agent-to-agent bridge modeled on Google's Agent2Agent (A2A) protocol — the same vocabulary and task lifecycle: agent cards, tasks moving through submitted, working, completed, failed or input-required, message parts, artifacts. It runs entirely on one machine over append-only files: no agent servers, no HTTP, no discovery endpoints, nothing leaving the laptop. That is also why it survives a crashed agent, a closed terminal and a reboot — the medium is files. Borrowing A2A's shape rather than inventing one means it can port to real A2A transport later without redesigning the conversation.
>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 nine agents safe enough to run at all, and it has already refused things it should have refused.