Domi, five months in: by the numbers


Five months ago I started posting these: one month in, two, three, four. Here’s the five-month mark, same method. Every number comes from the GitHub API, git and ccusage, with the commands at the bottom.

Month four was the first one where the factory changed more than the product. Month five is the first one where the factory’s numbers went down: fewer pull requests, slower merges, and a higher cost for each one. So this post has three parts: the numbers, the factory, and what September brought for Domi.

The headline

One-hundred-fifty-three calendar days. Sprints S0 through S50, with S51 opening. S48, S49 and S50 closed in September, and on the phone M7, M8 and M9. Across both repos: 2,142 commits and 1,746 pull requests merged.

Merged pull requests per month, May–September 2026 Stacked bars. May 312 (domi). Jun 357 (domi). Jul 366 total: 328 domi plus 38 domi-mobile. Aug 421 total: 271 domi plus 150 domi-mobile. Sep 290 total: 233 domi plus 57 domi-mobile. 0 100 200 300 400 500 May: 312 domi PRs 312 May Jun: 357 domi PRs 357 Jun Jul: 328 domi PRs Jul: 38 domi-mobile PRs 38 mobile 366 Jul Aug: 271 domi PRs Aug: 150 domi-mobile PRs 150 mobile 421 Aug Sep: 233 domi PRs Sep: 57 domi-mobile PRs 57 mobile 290 Sep domi domi-mobile
Merged pull requests per month. September's 290 is the lowest month yet, and the first in which both repos fell at once.
Monthdomidomi-mobileCombinedPer calendar day
May312—31210.1
June357—35711.9
July3283836611.8
August27115042113.6
September233572909.7

September is the lowest month in the series: 290 merged PRs, 31% fewer than August. Both repos fell together, which has not happened before. domi dropped from 271 to 233. domi-mobile fell from 150 to 57, because the phone’s August was a construction month and much of its September was an answer to Apple. That kind of work is largely writing, waiting and verifying, not code.

The shared PR/issue numbering pool in domi climbed from #1882 to #2166, 284 new numbers against 451 in August.

Week by week

Merged pull requests per week, May–September 2026 Stacked bars over 22 weeks. The peak is still the week of Jul 27 at 155: 111 domi plus 44 mobile. September weeks: 88 (72 domi + 16 mobile, including Aug 31), 70 (48 + 22), 40 (36 + 4), 76 (66 + 10). 0 40 80 120 160 Week of 4/27: 1 domi PRs 4/27 Week of 5/4: 76 domi PRs 5/4 Week of 5/11: 70 domi PRs 5/11 Week of 5/18: 62 domi PRs 5/18 Week of 5/25: 107 domi PRs 107 5/25 Week of 6/1: 114 domi PRs 114 6/1 Week of 6/8: 84 domi PRs 6/8 Week of 6/15: 57 domi PRs 6/15 Week of 6/22: 76 domi PRs 6/22 Week of 6/29: 55 domi PRs 6/29 Week of 7/6: 84 domi PRs 7/6 Week of 7/13: 50 domi PRs 7/13 Week of 7/20: 52 domi PRs 7/20 Week of 7/27: 111 domi PRs Week of 7/27: 44 domi-mobile PRs 155 7/27 Week of 8/3: 65 domi PRs Week of 8/3: 53 domi-mobile PRs 118 8/3 Week of 8/10: 66 domi PRs Week of 8/10: 9 domi-mobile PRs 8/10 Week of 8/17: 76 domi PRs Week of 8/17: 48 domi-mobile PRs 124 8/17 Week of 8/24: 62 domi PRs Week of 8/24: 34 domi-mobile PRs 8/24 Week of 8/31: 72 domi PRs Week of 8/31: 16 domi-mobile PRs 8/31 Week of 9/7: 48 domi PRs Week of 9/7: 22 domi-mobile PRs 9/7 Week of 9/14: 36 domi PRs Week of 9/14: 4 domi-mobile PRs 9/14 Week of 9/21: 66 domi PRs Week of 9/21: 10 domi-mobile PRs 9/21 May June July August September domi domi-mobile
Merged pull requests per week, Monday-start, through the week of September 21. The week of August 31 includes that Monday (10 PRs); September 28–30 added 26 more, off the end of the chart.

Twenty-two weeks. September’s are 88, 70, 40 and 76, and the 40, the week of September 14, is the lowest full week since the bootstrap one. It was also the week of the feature built during a meeting. Fewer pull requests landed that week. They were not smaller ones.

The sawtooth from June and August is still there, heavy week then lighter week. What changed is the height. August’s floor was 75. September’s ceiling is 88.

The code

The authored surface is code plus docs, excluding generated JSON like lockfiles and i18n bundles. It is now about 444,000 lines across both repos, up 15% on the month. September added 55,581 lines and removed 5,510 in domi, and 6,491 / 1,058 in the mobile repo.

Languagedomi (files / LoC)mobile (files / LoC)Combined LoC
TypeScript1,349 / 267,173114 / 20,610287,783
React TSX296 / 61,39326 / 7,67369,066
Markdown213 / 42,31533 / 4,21546,530
MDX (help site)388 / 15,813—15,813
SQL migrations203 / 7,335—7,335
YAML + OpenAPI35 / 16,9887 / 66117,649

The code subset (TypeScript, TSX and SQL) is 364,184 lines across 1,988 files combined: 335,901 in domi, up from 291,676, and 28,283 in mobile, up from 24,177. The authored surface grew 83% in June, 39% in July, 34% in August, and 15% in September. That is the first month where the deceleration is steep enough to call a change of phase. The product is being finished more than it is being extended.

Tests and gates

4,773 test cases across 506 files combined: 4,328 in domi (up from 3,576) and 445 in the mobile repo (up from 363). Tests grew 21% against the code’s 15%. That makes five months in a row of tests outrunning the thing they test, and September is the month that rule mattered most. Three of September’s sprint write-ups are about a change that took twelve review rounds, six review rounds, or turned out to be correct at the wrong moment. Sprint 49’s alone took its concurrency tests from nine to fifteen.

203 Drizzle migrations (was 179). 29 GitHub Actions workflows combined, up from 28: one new gate, in a month after one that added twelve.

The bilingual surface

English and French from day one, still CI-hard-failed on drift. 3,005 translation keys in each locale, exactly matched (up from 2,752), and 386 help pages split evenly, 193 each (up from 354).

What it cost to build

This is the cost of the coding agents working alongside me, measured with ccusage against local session logs. It is not the product’s own runtime AI usage, which is a different and much smaller number. And it is a list-price figure: what those tokens would cost at the published API rates. The real bill is further down.

September cost $8,818.06 in Claude across 30 active days: 11.83 billion all-in tokens, almost all of it cache reads. That’s about $294 per active day. The heaviest single day was $1,049.66 on September 6, the last weekend of Sprint 48. On top of that, $222.74 of GPT went mostly to the AI reviewer that reads every pull request, which moved onto this machine in the first week of September, and a little to drafting. All in, $9,040.80.

MonthClaude costActive days
May$4,418.0029
June$4,935.7530
July$5,724.9022
August$8,765.9329
September$8,818.0630

Nearly flat: up 0.6% on August, for 6.6% more tokens. That is the smallest month-on-month rise in the series (June was up 12%, July 16%, August 53%), and the per-model table says why.

Model (September)CostShare$ per 1M all-in tokensCache-read share
Claude Fable 5$3,253.5636.0%$1.41398.0%
Claude Opus 5$2,158.7323.9%$0.73997.7%
Claude Opus 4.8$1,480.2816.4%$0.72797.9%
Claude Opus 5.5$847.379.4%$0.28699.1%
Claude Fable 5.1$543.756.0%$1.18195.6%
Claude Sonnet 5$533.955.9%$0.46793.2%
GPT (review, drafting)$222.742.5%——

Opus 5.5 carried the same volume of tokens as Opus 5, about 2.9 billion each, for less than 40% of the money. Its cost per million all-in tokens is the lowest in this table, and below anything in August’s. By September 26 every station in the factory ran on it, so September has only a few days of the full effect. October will show the rest.

Which repo spent it

Same line-level split as last time. Every session-log line carries its own working directory, so tokens are summed per repo and each model’s cost is allocated in proportion. The per-model token totals reconcile with ccusage exactly.

Repo (September)All-in tokensCostShare
domi7.67B$5,907.3667.0%
software-factory2.97B$2,055.3223.3%
domi-mobile0.67B$450.505.1%
this website0.40B$367.104.2%
domi-design50M$20.360.2%
domi-product60M$16.980.2%

The second row is the story of the month. The factory’s own repo, the machinery that builds Domi rather than Domi, went from $593 in August to $2,055 in September: three and a half times, and nearly a quarter of everything. The next section is what that money bought.

Cost per merged PR: $30.41 overall, up from $20.82. Split by repo: $25.35 in domi (was $24.00) and $7.90 in domi-mobile (was $7.38). The product repos barely moved. The headline number rose because the same bill bought fewer pull requests, and the difference went to the factory. Leave the factory’s own row out and it is $23.32 per PR.

And the real bill

Every dollar figure above is notional. The agents run on flat subscriptions, so the tokens are not billed one by one. The factory’s ledger also records what was actually paid, and this is the first of these posts to print it: $604.45 for all of September, which is the subscriptions plus $254.45 of GitHub Actions minutes (46,139 of them). August was $496.74, with 27,803 minutes. The subscriptions did not change; the CI minutes went up by two thirds. That’s the whole factory, every station and every repo.

So: $9,040.80 at list price, $604.45 in fact. The first number is the right one for comparing months and models. The second is what it costs to run a software company of one person and eight agents for thirty days.

Five months in, the build has cost $32,662.64 at Claude list price, about $213 a day across 153 days, for every repo on the machine.

Five months at a glance

Flow — what each month produced:

Per monthMayJuneJulyAugustSeptember
PRs merged312357366421290 (233 + 57 mobile)
Commits696348390427281 (230 + 51 mobile)
Production releases—8423112
Active working days2930222930
Build cost (Claude)$4,418.00$4,935.75$5,724.90$8,765.93$8,818.06
Cost per merged PR$14.16$13.83$15.64$20.82$30.41

Stock — where things stood at each month’s end:

At month endMayJuneJulyAugustSeptember (domi)September (combined)
Authored LOC~109,700~200,500~288,000~387,000~411,000~444,000
Code (TS+TSX+SQL)81,510155,402229,843315,853335,901364,184
Test cases8891,5192,3173,9394,3284,773
Test files89184272414453506
Migrations48111154179203203
i18n keys (each locale)7901,6512,3962,7523,0053,005
Help pages74144268354386386
CI workflows91015282629
Cumulative PRs3126691,0351,456—1,746

From August on, the stock columns are combined across both repos.

The trend across five months: the monthly PR total down for the first time, 9.7 merged PRs a calendar day against 10–14 before; code growth halving, from a third a month to a sixth; tests outrunning code for the fifth month straight; gates flat after doubling; releases down to a dozen, from about one a day; and the bill nearly flat, up 0.6%, with the per-PR cost up mostly because the factory spent a quarter of it on itself.

The factory, month five

August was the month the factory got a spine. September was the month it got rules, and rules are slower than improvisation. That is most of the explanation for the numbers above.

What changed, in the order it happened:

  • My decisions got a ledger. Work reaches the stations through one queue, in my own words, and my answers are recorded on the task. In September that queue took 171 asks from me, up from 38 in its first five days of existence in August. It also recorded 78 rulings, 138 tasks done, 45 cancelled and 19 reopened. A message from one agent claiming I approved something is still only a message. The ruling on the task is the approval.
  • The laws became a floor. Every action an agent can take now carries a tier, and the permission check refuses to grant anything that could reach production, people’s data or money without me. Nothing changed hands when this landed. It made the existing rules impossible to loosen by accident.
  • The clocks. The stations talk over a local bridge, and in September it carried 2,496 messages, up from 1,434. The new part is that a third of them came from clocks rather than agents: 478 from a loop that wakes the owner of a pull request when a review asks for changes, 205 from one that lists requests nobody has answered, 100 from one that lists the work that is blocked and for how long. In August, pull requests with changes requested sat for days because nothing told their owner. In September a clock did.
  • One way to merge. Since September 26, a station merges with a single command that checks it has the right, checks the tests are green on the exact version being merged, and merges that version and nothing newer. 26 merges went through it before the month ended.
  • A health check for the whole plant, every two minutes, restarting anything it can restart without losing work. It never restarts an agent that is alive, because a quiet agent and a busy one look the same from outside. Then, on September 29, it read its own stale heartbeat after a pause, decided it had hung, and shut itself down. The factory ran a day without its healer. The fix is that the one thing the healer cannot heal is itself.
  • Every station on Opus 5.5, from September 26. That is the cost line above.
  • Agents can hand work to each other, since September 23, inside limits the tool enforces. It was used zero times in September. The first delegation happened this week, for this post.

The factory’s own repo merged 37 pull requests in September (39 in August), and its median time to merge is under a minute.

What the gains were. Not speed. Median time from opening a pull request to merging it went up: from 21 minutes to 55 in domi, and from 7 minutes to 45 on the phone. The tail went up too. What September bought was a different set of things:

  • A feature from a spoken sentence, twice, in under an hour each. In mid-September, one sentence said to a room became a live feature in 42 minutes. On September 29, a travel-city weather picker went from the ask to staging in about 40 minutes, built by two stations in parallel because one sent the other the contract fifty seconds after I spoke. Both are told in full elsewhere: the meeting and Sprint 50.
  • A board I can believe. When a station is waiting on me, it says so, instead of looking stalled. When something is owed, a clock says so. When something merges, it was green on the version that merged.
  • A real number. For four months I published notional dollars with a caveat. September is the first month with the actual bill next to them.

The cost of all that was a quarter of the month’s budget and a third of its throughput. Whether that trade keeps paying is October’s question.

September for Domi

The numbers above are the product’s and the factory’s. This is what happened to Domi itself, the part I’d remember if the tables were lost.

The wins

  • Connector governance went live. Any household member’s connected mailbox can be paused or removed. When someone asks to delete their account, everything pauses for thirty days while they can still change their mind. It took twelve review rounds, told here.
  • The Briefing page got a live snapshot of the household: members, assets, documents, open tasks and what is coming this week. It was built in forty-two minutes during a meeting.
  • The daily email got properly good: a Today section at the top, completed items struck through rather than vanishing, the weather in it, and Mondays that read like Mondays.
  • A privacy flaw was closed: an image pasted inside a private note was readable by any member of the household. It is fixed in production, and the same pattern was swept out of everywhere else it appeared.
  • Consent can no longer be skipped, and the whole-household export can now be requested, built and delivered.
  • Invoices turn into things to do: an unpaid invoice gets its own “Pay” task, and marking it paid works.
  • Weather follows you. Pick a travel city and the weather page and calendar use it, until you press “Back to home”. On the web, it is live.
  • Twelve production releases, from v1.0.184 to v1.0.204, and 24 new database migrations, each one through the same automated staging-to-production path.

The challenges

  • Billing is built and switched off. The subscription flow works end to end, and it is not live in production. That was deliberate, and it is still not on.
  • The phone did not ship. Apple sent the last submission back, for a reason that was fixed on a web page rather than in the app, and the reply to Apple lost two sentences that would have told them something untrue. The iOS app has not been publicly released. The phone half of the travel city is merged and has not yet been tried on a device.
  • Correct, and correct in time. A security guard on the phone was right, reviewed as right and tested as right, and still showed a signed-out phone someone else’s tasks for about a second, because it ran after the first frame. No test could see it. A person launching the app did. It never reached the public. It is told here.
  • Six concurrency bugs in one fix. Moving charges between expense types went six rounds with the reviewer, each round finding a real race. The seventh finding was a design decision, not a bug, so it went to me. It is told here.
  • An instrument broke. The per-pull-request cost ledger I introduced last month cannot currently price a single pull request. That is why this post divides by the month again.

What it adds up to

Month one built the system. Month two made it safe to open. Month three opened it. Month four was the month the factory became a factory. Month five is the month the factory slowed down to become trustworthy. Fewer pull requests, slower merges, a quarter of the money spent on the machine rather than the product. And a bill that, for the first time in five months, barely moved.

What I’d underline from September is the release count: twelve, against thirty-one. The month’s work was billing, consent, connector governance and a privacy sweep. Work like that goes out less often, and I would rather show that in the chart than hide it.

One-hundred-fifty-three evenings. $32,663 at list price, and $604 in real money this month. Two repos, one household, eight stations.

Same commands next milestone.


Reproducible: the GitHub search API for PR counts (is:pr is:merged merged:2026-09-01..2026-09-30, UTC month boundary), git log --format=%cd bucketed by calendar month for commits, git ls-files at the September 30 commit for lines of code (the six file types in the table, lockfiles excluded), grep -cE '^\s*(it|test)\(' across *.test.ts(x) files for test cases, gh run list --workflow=promote-prod.yml --status success for releases, and ccusage for build cost, captured by pnpm usage:snapshot into the committed monthly snapshot in the domi repo’s docs/metrics/usage/ (September captured in commit faf80643, gailleur/domi#2169). The per-repo split reads the cwd on each session-log line. The real-spend figure is factory cost --month 2026-09.