<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>Gailleur Labs</title><description>Gailleur Labs is an AI-first company founded by Jean-Francois Gailleur, building Domi Agent — the Household Office. Software built by a team of AI agents alongside few people per team, documented sprint by sprint.</description><link>https://www.gailleur.com/</link><item><title>Domi, four months in: by the numbers</title><link>https://www.gailleur.com/blog/domi-four-months-by-the-numbers/</link><guid isPermaLink="true">https://www.gailleur.com/blog/domi-four-months-by-the-numbers/</guid><description>Four months of an agent-built product, measured: 123 days, 1,456 merged PRs across two repos, ~387k lines, 3,939 tests, and $23,845 of agent cost — plus the month the factory became a factory.</description><pubDate>Wed, 02 Sep 2026 13:00:00 GMT</pubDate></item><item><title>Domi, one month in: by the numbers</title><link>https://www.gailleur.com/blog/domi-one-month-by-the-numbers/</link><guid isPermaLink="true">https://www.gailleur.com/blog/domi-one-month-by-the-numbers/</guid><description>A point-in-time engineering snapshot of Domi after 30 days and 30 sprints — commits, code, tests, and bilingual surface, all reproducible from git.</description><pubDate>Mon, 01 Jun 2026 13:00:00 GMT</pubDate></item><item><title>Domi, three months in: by the numbers</title><link>https://www.gailleur.com/blog/domi-three-months-by-the-numbers/</link><guid isPermaLink="true">https://www.gailleur.com/blog/domi-three-months-by-the-numbers/</guid><description>Three months of a solo build, measured: 92 days, 1,035 merged PRs across two repos, ~288k lines, 2,317 tests, and $15,079 of agent cost.</description><pubDate>Sun, 02 Aug 2026 13:00:00 GMT</pubDate></item><item><title>Domi, two months in: by the numbers</title><link>https://www.gailleur.com/blog/domi-two-months-by-the-numbers/</link><guid isPermaLink="true">https://www.gailleur.com/blog/domi-two-months-by-the-numbers/</guid><description>A second point-in-time engineering snapshot of Domi — 60 days, ~652 PRs, ~200k lines, 1,519 tests — plus what June actually shipped and how month two compared to month one. All reproducible from git.</description><pubDate>Wed, 01 Jul 2026 13:00:00 GMT</pubDate></item><item><title>Sprint 1 — Auth got the foundation in</title><link>https://www.gailleur.com/blog/sprint-1-auth-got-the-foundation-in/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-1-auth-got-the-foundation-in/</guid><description>Auth.js v5 magic-link works in production. Postgres row-level security is set up but doesn&apos;t enforce yet. Schema&apos;s in, the foundation just isn&apos;t bearing weight yet. Plus three things that surprised me along the way.</description><pubDate>Mon, 04 May 2026 00:00:00 GMT</pubDate></item><item><title>Sprint 10 — the carries close</title><link>https://www.gailleur.com/blog/sprint-10-the-carries-close/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-10-the-carries-close/</guid><description>Five PRs out, all merged, no rollovers. The M8 cost-line UI carry finally closes after three sprints; four Phase 10 launch-surface items get pulled forward in the same sprint; the --custom migration footgun gets promoted from mental note to written convention after firing four times. Plus a stale-copy bug that lived on the public landing for five sprints — caught by a screenshot review, not by any automated gate.</description><pubDate>Mon, 11 May 2026 02:30:00 GMT</pubDate></item><item><title>Sprint 11 — paperwork day</title><link>https://www.gailleur.com/blog/sprint-11-paperwork-day/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-11-paperwork-day/</guid><description>Five issues, the legal surface, a per-day cost sparkline, a WCAG audit, the chat-roundtrip flake fix — and a project-board cleanup that surfaced the kind of process gap I&apos;m starting to expect every sprint. Same shape as the migration footgun, the public-surface review, the post-pubDate uniqueness: rule that wasn&apos;t written down, didn&apos;t matter at low volume, surfaced once accumulation made it visible.</description><pubDate>Mon, 11 May 2026 03:30:00 GMT</pubDate></item><item><title>Sprint 12 — the foundation was imaginary</title><link>https://www.gailleur.com/blog/sprint-12-the-foundation-was-imaginary/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-12-the-foundation-was-imaginary/</guid><description>The Sprint 12 primary was supposed to be a UI on top of an audit log. The pre-kickoff scope check found that the audit log didn&apos;t exist — 11 sprints of a non-negotiable convention with zero code backing it. Re-scoped to build the infrastructure, deferred the UI to S13. Plus a partition-routing PostgreSQL footgun that only fires when the grant is too restrictive.</description><pubDate>Tue, 12 May 2026 02:30:00 GMT</pubDate></item><item><title>Sprint 13 — the read side, and what protects it</title><link>https://www.gailleur.com/blog/sprint-13-the-read-side-and-what-protects-it/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-13-the-read-side-and-what-protects-it/</guid><description>S12 built the audit infrastructure that should have existed for 11 sprints. S13 put the read UI on top of it, finished the largest withAudit wiring, unblocked graph-viz with a spec doc, and — almost as an afterthought — wrote down the catalog of automatable invariants that 13 sprints of building had been implicit about. The audit story closes as a pair; the regression catalog formalizes what was always there.</description><pubDate>Wed, 13 May 2026 02:30:00 GMT</pubDate></item><item><title>Sprint 14 — promoting convention to code</title><link>https://www.gailleur.com/blog/sprint-14-promoting-convention-to-code/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-14-promoting-convention-to-code/</guid><description>Four PRs in one push. The audit story closes structurally — every domain mutation goes through withAudit. Two regression-suite backlog items shipped as CI gates rather than written rules. The knowledge-graph viz lands end-to-end from spec to implemented route. The through-line: written conventions that have bitten the pipeline finally graduate into code that fails before the violation costs anything.</description><pubDate>Wed, 13 May 2026 03:45:00 GMT</pubDate></item><item><title>Sprint 15 — the graph fills in</title><link>https://www.gailleur.com/blog/sprint-15-the-graph-fills-in/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-15-the-graph-fills-in/</guid><description>S14 shipped the knowledge-graph viz with empty-state copy promising &apos;tell Domi in chat or upload a document — your graph fills in.&apos; Then JF asked: how does that actually work? It didn&apos;t. S15 closes the gap: chat_proposals infrastructure + propose_member + propose_asset + confirm-then-write gate. After this sprint the graph viz&apos;s empty-state is a real promise, not a hopeful one.</description><pubDate>Wed, 13 May 2026 14:30:00 GMT</pubDate></item><item><title>Sprint 16 — the trio closes (and a docs detour)</title><link>https://www.gailleur.com/blog/sprint-16-the-trio-closes/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-16-the-trio-closes/</guid><description>Sprint 16 started as a four-tier plan, pivoted mid-sprint to API docs after JF asked for the OpenAPI inventory, then came back to the original plan and shipped all of it. Four PRs: API docs primary, escalation regression fix, propose_task (the third and final chat-driven create surface), UserPill on graph + settings. After S16 the chat-driven create trio (member, asset, task) is structurally complete. Also: tool-selection on a 10-tool catalog is meaningfully more sensitive than at 9.</description><pubDate>Fri, 15 May 2026 02:30:00 GMT</pubDate></item><item><title>Sprint 17 — the loop closes on itself</title><link>https://www.gailleur.com/blog/sprint-17-the-loop-closes-on-itself/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-17-the-loop-closes-on-itself/</guid><description>Sprint 17 shipped three PRs in a single evening: tasks list UI primary (the read side of the chat-driven create loop S15/S16 built), escalation eval stabilized at 10 tools after a first-attempt fix-one-break-another, and an API-docs CI gate that caught real drift on its first run. After S17 the chat-creates → /tasks-shows → complete-from-row loop works end-to-end. Also: prompt prefixes beat per-tool description tightening when the catalog grows.</description><pubDate>Fri, 15 May 2026 03:55:00 GMT</pubDate></item><item><title>Sprint 18 — the mobile unblock, and a V1.5 that wasn&apos;t</title><link>https://www.gailleur.com/blog/sprint-18-the-mobile-unblock-and-a-v1-5-that-wasnt/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-18-the-mobile-unblock-and-a-v1-5-that-wasnt/</guid><description>Sprint 18 shipped five PRs in one evening: camera capture in chat (the dogfood-defining mobile feature that&apos;s been carrying forward since S12), four regression-suite hardening PRs that closed half the open backlog, and one V1.5 feature pulled forward into V1 because the punt&apos;s framing had been wrong all along. Plus: when a research subagent&apos;s summary contradicts its own findings, trust the findings.</description><pubDate>Fri, 15 May 2026 06:00:00 GMT</pubDate></item><item><title>Sprint 19 — V1.5 is a smell</title><link>https://www.gailleur.com/blog/sprint-19-v1-5-is-a-smell/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-19-v1-5-is-a-smell/</guid><description>Sprint 19 shipped seven PRs in one evening. Three of them were V1.5 features pulled forward into V1 — and each one turned out smaller than the V1.5 framing implied. Plus: two regression-suite probes both caught real bugs on their first runs, including one the S17 PR description had explicitly claimed didn&apos;t exist.</description><pubDate>Sat, 16 May 2026 00:00:00 GMT</pubDate></item><item><title>Sprint 2 — three sprints in three days</title><link>https://www.gailleur.com/blog/sprint-2-three-sprints-in-three-days/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-2-three-sprints-in-three-days/</guid><description>Two milestones substantively closed in one sprint. RLS enforcing in production. The first real eval matrix says 5/5 pass on Haiku 4.5 for $0.0026. The schedule I scoped 72 hours ago is already wrong.</description><pubDate>Tue, 05 May 2026 13:00:00 GMT</pubDate></item><item><title>Sprint 20 — dropping the Matrix</title><link>https://www.gailleur.com/blog/sprint-20-dropping-the-matrix/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-20-dropping-the-matrix/</guid><description>Sprint 20 was the brand pivot. Domi&apos;s Matrix-on-dark hacker-tool aesthetic shipped to JF in S5; ten sprints of dogfood-shaping later, JF asked for something that &apos;provides confidence to the user&apos; instead. Seven PRs landed: design tokens + theme picker, full visual rework, Claude-style sidebar with multi-thread chat, mobile drawer, edit/archive members + assets, /documents browse page, and the cross-tenant doc-type proposals queue.</description><pubDate>Sat, 16 May 2026 06:00:00 GMT</pubDate></item><item><title>Sprint 21 — a green CI that was lying</title><link>https://www.gailleur.com/blog/sprint-21-a-green-ci-that-was-lying/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-21-a-green-ci-that-was-lying/</guid><description>Sprint 21&apos;s headline wasn&apos;t a feature — it was finally making the real-database integration suites run in CI instead of only on my laptop. The gate went live and immediately caught a prod incident, two latent test bugs, and an RLS bypass in the harness itself. Plus: Law 25 self-serve account deletion, many-to-many asset custodians, admin index, and a db-state-sync pre-merge gate.</description><pubDate>Tue, 19 May 2026 02:00:00 GMT</pubDate></item><item><title>Sprint 22 — the model catches up</title><link>https://www.gailleur.com/blog/sprint-22-the-model-catches-up/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-22-the-model-catches-up/</guid><description>Four PRs in two days shipped the Family Life Entity Model v0.2: a cross-tenant kind_registry pattern plus three new top-level entities (obligations, contacts, transactions). The household model now matches what a household actually has. The structural lessons earned in S21 — pre-merge gates, audit-then-mutate, per-file test UUIDs — paid out as zero rework on the foundations and zero failed deploys.</description><pubDate>Tue, 19 May 2026 03:00:00 GMT</pubDate></item><item><title>Sprint 23 — the curation surface</title><link>https://www.gailleur.com/blog/sprint-23-the-curation-surface/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-23-the-curation-surface/</guid><description>Phase C of the Family Life Entity Model landed: the /admin/kinds catalog where the platform admin can see and curate every classification across the data model — edit display names, promote tenant-tier kinds to builtin, mark dead ones deprecated. Four PRs (two planned, two hardening), 8 new tests, and a V1.5 follow-up filed for the cross-tenant audit attribution that this sprint deliberately deferred.</description><pubDate>Tue, 19 May 2026 03:15:00 GMT</pubDate></item><item><title>Sprint 24 — the asset that knows itself</title><link>https://www.gailleur.com/blog/sprint-24-the-asset-that-knows-itself/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-24-the-asset-that-knows-itself/</guid><description>Four PRs lit up the kind_registry + attributes_schema pattern on the original V1 asset table. JF&apos;s Mazda CX-5 now knows it&apos;s leased through 2029, has a VIN and a Quebec plate, has the registration PDF attached, has Alice as a custodian, and shows the photo JF snapped in the garage. The plumbing was built across S22 and S23; S24 wired it to the asset table the way S22 wired it to obligations, contacts, and transactions.</description><pubDate>Tue, 19 May 2026 03:30:00 GMT</pubDate></item><item><title>Sprint 25 — the architecture holds</title><link>https://www.gailleur.com/blog/sprint-25-the-architecture-holds/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-25-the-architecture-holds/</guid><description>Forty-seven product PRs in seven days. Dogfood week 1 produced a flood of screenshot-and-fix loops, every one of them closing a friction point JF could name. The test of the V1 ramp wasn&apos;t whether the architecture survived being designed; it&apos;s whether it survives being used. It did — every PR reused a shape from a prior sprint, nothing got refactored, no PR got reverted.</description><pubDate>Tue, 26 May 2026 03:30:00 GMT</pubDate></item><item><title>Sprint 26 — the loop measures itself</title><link>https://www.gailleur.com/blog/sprint-26-the-loop-measures-itself/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-26-the-loop-measures-itself/</guid><description>Seven PRs in one day. Speed Insights wired, perf script + week-1 numbers shipped, chat-route cost telemetry plugged (the gap that was understating COS by an order of magnitude), and four more dogfood papercuts smoothed. Both perf-side V1 success criteria PASS week one — but only because the measurement got honest in the same sprint.</description><pubDate>Tue, 26 May 2026 03:55:00 GMT</pubDate></item><item><title>Sprint 27 — the proactive layer wakes up</title><link>https://www.gailleur.com/blog/sprint-27-the-proactive-layer-wakes-up/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-27-the-proactive-layer-wakes-up/</guid><description>22 PRs over four days. The predict_task LLM role landed end-to-end in two callsites (document ingest + daily cron) with eval CI gating the prompt. Predictions now accumulate automatically at a per-tenant cadence the user picks. The V1 paperwork (threat model + PIA + DR runbook) got reconciled against shipped reality instead of v0.1 speculation. Plus chat-grounding that makes the assistant feel like it actually accumulates memory of the household.</description><pubDate>Fri, 29 May 2026 03:55:00 GMT</pubDate></item><item><title>Sprint 28 — the feature was already built</title><link>https://www.gailleur.com/blog/sprint-28-the-feature-was-already-built/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-28-the-feature-was-already-built/</guid><description>I sat down to build the sprint&apos;s headline feature — insurance that covers multiple assets — and found it already shipped. Schema, write path, detail UI, graph edges, settings, help docs: all there. My own working memory said it was unstarted, and described the wrong design. The real gap was one layer down: the chat could write the coverage links but couldn&apos;t read them back. Plus a Briefing surface that learned to write you a weekly brief, soft-delete finally rounded out across the graph, Sentry wired so dogfood 500s leave a stack trace instead of a screenshot, and a late, small catch that mirrored the big one — the asset &apos;level&apos; I shipped as a two-way class turned out to need real depth: a pool is level 2, the heat pump bolted to it is level 3.</description><pubDate>Sun, 31 May 2026 02:00:00 GMT</pubDate></item><item><title>Sprint 29 — The app audits itself</title><link>https://www.gailleur.com/blog/sprint-29-the-app-audits-itself/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-29-the-app-audits-itself/</guid><description>Killing the 4 MB upload wall with presigned direct-to-R2 uploads, and pointing 21 agents at the codebase to grade it against the AI-engineering book.</description><pubDate>Mon, 01 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Sprint 3 — the document loop closes</title><link>https://www.gailleur.com/blog/sprint-3-the-document-loop-closes/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-3-the-document-loop-closes/</guid><description>M3 done end to end: upload → R2 → vision-extract → confidence-gated auto-write into the canonical graph, all eval-baselined. Five for five on the first extract_document run on Sonnet 4.6 for $0.04. Four sprints in three calendar days.</description><pubDate>Tue, 05 May 2026 22:00:00 GMT</pubDate></item><item><title>Sprint 30 — The migration that lied</title><link>https://www.gailleur.com/blog/sprint-30-the-migration-that-lied/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-30-the-migration-that-lied/</guid><description>A single-day jumbo sprint to ship the top-8 of the self-audit roadmap — prompt-injection fencing, a versioned prompt catalog, an end-to-end eval bucket — and the migration that printed &apos;applied successfully&apos; twice while running zero DDL.</description><pubDate>Mon, 01 Jun 2026 01:00:00 GMT</pubDate></item><item><title>Sprint 31 — A month old, and already a major behind</title><link>https://www.gailleur.com/blog/sprint-31-a-month-old-and-a-major-behind/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-31-a-month-old-and-a-major-behind/</guid><description>An enabler sprint with no new features: a SQL-injection CVE in the ORM, the discovery that nothing was watching dependencies at all, and then the real surprise — a one-month-old codebase that already needed dozens of major version bumps. 45 PRs merged, ~80 triaged.</description><pubDate>Tue, 02 Jun 2026 13:00:00 GMT</pubDate></item><item><title>Sprint 32 — The dogfood writes the backlog</title><link>https://www.gailleur.com/blog/sprint-32-the-dogfood-writes-the-backlog/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-32-the-dogfood-writes-the-backlog/</guid><description>I stopped planning and started living in the app. Ten PRs later — richer tasks, list pages for assets and members, a chat-table fix, a configurable briefing — and a realization: the best roadmap input is just using the thing. Then I stepped back and wrote the roadmap the app had been dictating to me.</description><pubDate>Wed, 03 Jun 2026 22:00:00 GMT</pubDate></item><item><title>Sprint 33 — The extra-large jumbo, on a foundation that held</title><link>https://www.gailleur.com/blog/sprint-33-the-extra-large-jumbo/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-33-the-extra-large-jumbo/</guid><description>Three days, twenty-three PRs. An objective layer (Areas, Projects, Goals), guided onboarding that actually knows what it&apos;s missing, a live MCP server that ChatGPT and Claude can talk to over OAuth 2.1, and a fistful of dogfood fixes. The theme wasn&apos;t any one of those — it was how cheap each of them was to build because the foundation was already there.</description><pubDate>Fri, 05 Jun 2026 22:00:00 GMT</pubDate></item><item><title>Sprint 34 — Ask the house anything</title><link>https://www.gailleur.com/blog/sprint-34-ask-the-house-anything/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-34-ask-the-house-anything/</guid><description>Three days, forty-one PRs. The household graph learned to answer questions — both &apos;what did the vet say?&apos; (document RAG) and &apos;which contacts serve the cottage?&apos; (graph querying). Then the last two main entities landed — Events and Affiliations — and an overnight wave cleared most of the roadmap shortlist. The foundation paid out a second sprint in a row.</description><pubDate>Tue, 09 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Sprint 35 — knowing when to nag</title><link>https://www.gailleur.com/blog/sprint-35-knowing-when-to-nag/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-35-knowing-when-to-nag/</guid><description>I planned a quiet hardening sprint. Forty-six PRs later, Domi understands a contract well enough to know when to remind you — pay vs. renew, and never nag a monthly subscription — you can mark a bill Paid and it becomes a transaction, and it proposes obligations straight off your documents and email. The dogfood kept writing the backlog.</description><pubDate>Fri, 12 Jun 2026 00:00:00 GMT</pubDate></item><item><title>Sprint 36 — making room for other people</title><link>https://www.gailleur.com/blog/sprint-36-making-room/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-36-making-room/</guid><description>The sprint where I built the machinery to stop being the only one — the only user and the only developer. Household membership and sharing groups so more than one person can use Domi, a move into a real GitHub organization so more than one person can build it, the plan for a real production environment, and a three-bug saga that took three fixes to answer one small question. 39 PRs.</description><pubDate>Mon, 15 Jun 2026 01:00:00 GMT</pubDate></item><item><title>Sprint 37 — the long way to the front door</title><link>https://www.gailleur.com/blog/sprint-37-the-long-way-to-the-front-door/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-37-the-long-way-to-the-front-door/</guid><description>The sprint where Domi got ready to let other people in — and where I spent a week building an authentication system only to delete it. A real staging environment, a front door rebuilt twice, email invitations so a second person can finally hold an account, support for more than one country, and a long tail of bug fixes. 58 PRs.</description><pubDate>Sun, 21 Jun 2026 23:30:00 GMT</pubDate></item><item><title>Sprint 38 — a key of your own</title><link>https://www.gailleur.com/blog/sprint-38-a-key-of-your-own/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-38-a-key-of-your-own/</guid><description>The sprint that turns &apos;preparing for beta&apos; into &apos;open for beta&apos;: every household&apos;s data sealed under its own encryption key, a feature I shipped and then deleted, documents that finally answer hard questions, and recurring events done properly. Ninety-one PRs — and a debugging story that cost an evening.</description><pubDate>Tue, 30 Jun 2026 01:30:00 GMT</pubDate></item><item><title>Sprint 39 — ready for guests</title><link>https://www.gailleur.com/blog/sprint-39-ready-for-guests/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-39-ready-for-guests/</guid><description>Two weeks instead of one, and the theme wasn&apos;t a feature — it was hospitality: an app that explains itself, a real support inbox, locks on the door, invitations that respect how families actually share email, and the night I broke chat for everyone. One hundred and fifteen PRs.</description><pubDate>Mon, 13 Jul 2026 01:30:00 GMT</pubDate></item><item><title>Sprint 4 — the engine fires</title><link>https://www.gailleur.com/blog/sprint-4-the-engine-fires/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-4-the-engine-fires/</guid><description>M4 done end to end on the seasonal_window schedule kind. Quebec winter-tire law turns into a task in the database, with full provenance back to the regulated rule that produced it. Five sprints in five days.</description><pubDate>Thu, 07 May 2026 00:00:00 GMT</pubDate></item><item><title>Sprint 40 — add milk to the grocery list</title><link>https://www.gailleur.com/blog/sprint-40-add-milk-to-the-grocery-list/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-40-add-milk-to-the-grocery-list/</guid><description>The house learned to run errands: any AI assistant you trust can now write to your household — with a consent screen, an audit trail, and nothing destructive on the menu. Plus the week the eval failed correctly, and a bakery in Mont-Tremblant. Fifty-one PRs in seven days.</description><pubDate>Mon, 20 Jul 2026 03:15:00 GMT</pubDate></item><item><title>Sprint 41 — walk every room</title><link>https://www.gailleur.com/blog/sprint-41-walk-every-room/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-41-walk-every-room/</guid><description>The walkthrough sprint: every surface checked in both languages, the beta gate down to two directory submissions, a warranty on the sofa, nine agents running thirteen errands in one day, a weekend of honest paperwork, and the night Gmail push finally — actually — worked. Ninety-six PRs in nine days.</description><pubDate>Wed, 29 Jul 2026 03:30:00 GMT</pubDate></item><item><title>Sprint 42 — the handshake</title><link>https://www.gailleur.com/blog/sprint-42-the-handshake/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-42-the-handshake/</guid><description>The sprint the mobile app got a spine. Two Claude terminals — one on the web backend, one on the phone — built the whole native provider surface in a tight loop over a shared bridge: sign-in, offline sync, upload, chat. Offline turned out to be a protocol, not a cache. Sixty-five PRs, eleven migrations, two production promotes, and a running argument with myself about how much of the decision-making I was still doing.</description><pubDate>Sun, 02 Aug 2026 18:00:00 GMT</pubDate></item><item><title>Sprint 43 — the green test that lied</title><link>https://www.gailleur.com/blog/sprint-43-the-green-test-that-lied/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-43-the-green-test-that-lied/</guid><description>The sprint the mobile app got used. Once it ran against my real household on my real phone, it started finding bugs no test had — including one that had been hiding behind a passing test the whole time, because the test walked past the exact code path that was broken. Sixty-five PRs, twelve migrations, a fistful of production promotes, and a week-long lesson about the difference between green and covered.</description><pubDate>Sun, 09 Aug 2026 20:00:00 GMT</pubDate></item><item><title>Sprint 44 — a column nothing ever wrote</title><link>https://www.gailleur.com/blog/sprint-44-a-column-nothing-ever-wrote/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-44-a-column-nothing-ever-wrote/</guid><description>Four papercuts on my own Transactions page turned out to sit on top of four structural bugs: a column no callsite ever wrote to, a classification rule that never existed, a spend panel that summed nothing in particular, and a correction only an engineer could make. Sixteen PRs, three migrations, five production data repairs — and the household can now overrule Domi&apos;s filing decisions without me.</description><pubDate>Tue, 11 Aug 2026 13:00:00 GMT</pubDate></item><item><title>Sprint 45 — the phone gets the last word</title><link>https://www.gailleur.com/blog/sprint-45-the-phone-gets-the-last-word/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-45-the-phone-gets-the-last-word/</guid><description>Two AI agents negotiated a frozen data contract across a folder on my Mac — five binding clauses, a formal ack, a verbatim wire sample because one of them refused to trust prose. Everything merged, everything promoted, every test green. Then we asked the phone — and the phone answered, and then retracted its answer, because it wasn&apos;t running what everyone thought it was. Seventy-one PRs, six migrations, nine production promotes, and the best one-liner of the sprint: a publish is not an install.</description><pubDate>Tue, 18 Aug 2026 13:00:00 GMT</pubDate></item><item><title>Sprint 46 — the button that was there all along</title><link>https://www.gailleur.com/blog/sprint-46-the-button-that-was-there-all-along/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-46-the-button-that-was-there-all-along/</guid><description>A live-but-invisible feature is indistinguishable from an absent one — our own audit declared the request-an-invitation flow missing while it had been on production for 24 days. Also: an independent model now gates every merge and spent its first week catching a race condition, a silent data-loss bug and a weather-API semantics trap; the app got its face; and weather shipped twice with two different providers in one sprint.</description><pubDate>Sun, 23 Aug 2026 13:00:00 GMT</pubDate></item><item><title>Sprint 47 — the fix was never only where I put it</title><link>https://www.gailleur.com/blog/sprint-47-the-fix-was-never-only-where-i-put-it/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-47-the-fix-was-never-only-where-i-put-it/</guid><description>The AI reviewer on my pull requests stopped finding bugs in the product this sprint and started finding them in how I read code. Six times in a row on one change, every fix I made was correct and every one was incomplete — I kept repairing the exact line it named while the same mistake sat three functions away. What broke the loop was not a better review. It was a rule. Sixty-three PRs, five Sentry issues that had been fixed for a week and never were, and a test that refused to lie.</description><pubDate>Tue, 01 Sep 2026 01:00:00 GMT</pubDate></item><item><title>Sprint 5.5 — the polish round</title><link>https://www.gailleur.com/blog/sprint-5-5-the-polish-round/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-5-5-the-polish-round/</guid><description>A mini-sprint between 5 and 6 to close the gap between &apos;feature shipped&apos; and &apos;feature feels like a product&apos;. Nine PRs in six hours, driven by a user-flow spec that landed mid-Sprint-5 and named everything that wasn&apos;t yet done.</description><pubDate>Thu, 07 May 2026 03:30:00 GMT</pubDate></item><item><title>Sprint 5 — the cash-out</title><link>https://www.gailleur.com/blog/sprint-5-the-cash-out/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-5-the-cash-out/</guid><description>domiapp.ai went from &apos;static welcome page&apos; to &apos;real product&apos; this sprint. Magic-link signin, household onboarding, a streaming chat that knows about your tasks, documents, and predictions, file uploads, EN↔FR switcher, locale-pinned replies. 0.039 to grade the whole chat surface end to end.</description><pubDate>Thu, 07 May 2026 02:00:00 GMT</pubDate></item><item><title>Sprint 6 — making the cash-out durable</title><link>https://www.gailleur.com/blog/sprint-6-making-the-cash-out-durable/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-6-making-the-cash-out-durable/</guid><description>M6 closes Settings + persistence. Six PRs across two evenings, the first sprint where multiple PRs ran in parallel against shared foundations, and a small set of merge-friction lessons that came with that. The chat surface now persists, the user-pill &apos;Settings&apos; link goes somewhere real, and the bootstrap-DB cheat retires from the read path.</description><pubDate>Sat, 09 May 2026 02:00:00 GMT</pubDate></item><item><title>Sprint 7 — depth on demand</title><link>https://www.gailleur.com/blog/sprint-7-depth-on-demand/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-7-depth-on-demand/</guid><description>Chat-to-plan escalation. Five PRs across two evenings, the LLM abstraction&apos;s role layer earns its keep, and the chat surface goes from &apos;cheap and grounded&apos; to &apos;cheap and grounded by default, deep when the user asks for depth.&apos; 17 of 17 eval fixtures pass on Sonnet 4.6 — including the four that explicitly mustn&apos;t escalate.</description><pubDate>Sat, 09 May 2026 03:00:00 GMT</pubDate></item><item><title>Sprint 8 — the abstraction holds</title><link>https://www.gailleur.com/blog/sprint-8-the-abstraction-holds/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-8-the-abstraction-holds/</guid><description>Five PRs, one second provider, one cross-provider eval matrix demo. OpenAI ran the same 17 chat fixtures with the same prompts and tools as Anthropic at 94% accuracy and 52% the cost. The role-routed LLM abstraction that was scaffolded in Sprint 2 finally got tested for real, and it passed.</description><pubDate>Sun, 10 May 2026 02:00:00 GMT</pubDate></item><item><title>Sprint 9 — the inbox surfaces the gaps</title><link>https://www.gailleur.com/blog/sprint-9-the-inbox-surfaces-the-gaps/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-9-the-inbox-surfaces-the-gaps/</guid><description>Five planned issues ship the email connector. Live testing within the same sprint surfaces three more things worth fixing — forwarded emails were silently skipped, the allowlist catalog needed real Quebec coverage (28 → 227 entries), the chat surface needed slash commands so the catalog is discoverable. Using a thing tells you what&apos;s missing in a way no spec can.</description><pubDate>Sun, 10 May 2026 03:30:00 GMT</pubDate></item><item><title>Sprint M1 — repo to phone in three days</title><link>https://www.gailleur.com/blog/sprint-m1-repo-to-phone-in-three-days/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-m1-repo-to-phone-in-three-days/</guid><description>Domi&apos;s mobile workstream is born: a second repo, a second sprint stream, and a walking skeleton running on my iPhone by day three — with every piece of the supply chain (CI, EAS, Apple, Sentry, icons) proven before a single feature exists. Plus five version pins that each have a story.</description><pubDate>Fri, 31 Jul 2026 00:30:00 GMT</pubDate></item><item><title>Sprint M2 — the app becomes Domi</title><link>https://www.gailleur.com/blog/sprint-m2-the-app-becomes-domi/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-m2-the-app-becomes-domi/</guid><description>Two contract arcs — OAuth and offline sync — each ran spec to device-validated in a single day, negotiated agent-to-agent between two repos while I held the security gates. By last night my phone showed my real household, worked in airplane mode, and synced back. Thirty PRs in thirty hours, and the two bugs no CI could see.</description><pubDate>Fri, 31 Jul 2026 22:15:00 GMT</pubDate></item><item><title>Sprint M3 — dogfooding to the store runway</title><link>https://www.gailleur.com/blog/sprint-m3-dogfooding-to-the-store-runway/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-m3-dogfooding-to-the-store-runway/</guid><description>Nine days, 57 merged PRs: the mobile app grew its whole product surface, landed on TestFlight against production, gained offline editing — and then a week of me using it for real caught four bugs no CI could see, each fixed the same day, three of them within the hour over the air.</description><pubDate>Mon, 10 Aug 2026 01:05:00 GMT</pubDate></item><item><title>Sprint M4 — the app gets a face</title><link>https://www.gailleur.com/blog/sprint-m4-the-app-gets-a-face/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-m4-the-app-gets-a-face/</guid><description>The mobile app spent two weeks getting the thing it had never had: a palette, two typefaces, a dark mode that means something, and a screen reader that can name every control. Then my own phone found six defects no test could — including primary buttons sitting at 2.21:1 contrast, and a month grid quietly painting on top of the following week. Forty-four PRs, fourteen over-the-air updates, four agents on the bridge, one App Store name that changed three times in a day — and a release gate I have now failed to run for three sprints running. Next: weather, because the question I have every morning isn&apos;t what the weather is, it&apos;s what today requires of me.</description><pubDate>Sat, 22 Aug 2026 12:00:00 GMT</pubDate></item><item><title>Sprint M5 — the checklist that found things</title><link>https://www.gailleur.com/blog/sprint-m5-the-checklist-that-found-things/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-m5-the-checklist-that-found-things/</guid><description>Weather shipped end to end in about six hours across two repos, and the app&apos;s icons stopped being typographic characters. Then I finally spent the hour I&apos;d been avoiding for four sprints — running the offline release gates on a real phone — and it found two genuine defects in twenty minutes, including one where deleting the app and reinstalling it let me straight back in past Face ID. An AI reviewer joined the repo and went eleven for eleven on its first day, three of them catching bugs introduced while fixing its own previous finding. Fifteen PRs, and the App Store list is finally short enough to read out loud.</description><pubDate>Mon, 24 Aug 2026 13:00:00 GMT</pubDate></item><item><title>Sprint M6 — the bug was never where it said it was</title><link>https://www.gailleur.com/blog/sprint-m6-the-bug-was-never-where-it-said-it-was/</link><guid isPermaLink="true">https://www.gailleur.com/blog/sprint-m6-the-bug-was-never-where-it-said-it-was/</guid><description>Domi went to the App Store and came back the same day. Not a crash, not a guideline breach — Apple could not get into the app, because a form field was empty. Then the sprint turned into something more interesting: three separate error reports named a file that had nothing to do with the failure, and twice we believed them. The fix was not to the file. It was to understand why the report lied. Thirty-two PRs, 454 tests, and two bugs that only existed on a phone.</description><pubDate>Mon, 31 Aug 2026 13:00:00 GMT</pubDate></item><item><title>The agent that worked itself out of a job</title><link>https://www.gailleur.com/blog/the-agent-that-worked-itself-out-of-a-job/</link><guid isPermaLink="true">https://www.gailleur.com/blog/the-agent-that-worked-itself-out-of-a-job/</guid><description>We built an agent to supervise the other agents. Eight days later we retired it, because 88% of what looked like its judgement turned out to be a tool wearing its name. Then we gave one agent the authority to speak for the human, and worked out what stops it going rogue. Two experiments, one rule: delete the agent whose judgement was a query; empower the agent whose judgement was the point.</description><pubDate>Mon, 31 Aug 2026 22:00:00 GMT</pubDate></item><item><title>The design system I didn&apos;t buy</title><link>https://www.gailleur.com/blog/the-design-system-i-didnt-buy/</link><guid isPermaLink="true">https://www.gailleur.com/blog/the-design-system-i-didnt-buy/</guid><description>Domi&apos;s web front end is Next.js 15, React 19, Tailwind v4, and 42 components I wrote by hand — plus no tRPC, no Radix, and no component library at all. A tour of what&apos;s actually in there, why each choice was made, and the bill each one sends. Including the part where my own architecture doc said we used shadcn/ui for months, and nobody noticed we didn&apos;t.</description><pubDate>Fri, 14 Aug 2026 01:30:00 GMT</pubDate></item><item><title>Agent to Agent, removing the middleman</title><link>https://www.gailleur.com/blog/the-middleman-was-me/</link><guid isPermaLink="true">https://www.gailleur.com/blog/the-middleman-was-me/</guid><description>Domi is built by two AI agents in two terminals — one for the web/backend, one for the mobile app. For few days I was the courier between them, copy-pasting field names and fingerprints. Then I built them a bridge, modeled on the A2A agent-to-agent protocol, and watched them negotiate a full mobile OAuth contract without me — while a guardrail I&apos;d designed made one of them refuse a security build routed through the other. A field report on cutting the human out of the loop, on purpose to accelerate go to market.</description><pubDate>Fri, 31 Jul 2026 03:45:00 GMT</pubDate></item><item><title>The words the house thinks in — what an ontology is, and Domi&apos;s</title><link>https://www.gailleur.com/blog/the-words-the-house-thinks-in/</link><guid isPermaLink="true">https://www.gailleur.com/blog/the-words-the-house-thinks-in/</guid><description>A household AI is only as good as its vocabulary. What an ontology actually is, the five elements that make one, and — concretely — the seventeen nouns, fourteen links, and thirteen verbs Domi thinks with today.</description><pubDate>Tue, 14 Jul 2026 01:00:00 GMT</pubDate></item><item><title>Two agents and a folder</title><link>https://www.gailleur.com/blog/two-agents-and-a-folder/</link><guid isPermaLink="true">https://www.gailleur.com/blog/two-agents-and-a-folder/</guid><description>Before there was a software factory, there were two AI agents, two repos, and a shared folder on my Mac. No orchestrator, no framework — a JSONL inbox each and a set of rules about what they were allowed to believe. The rules turned out to be the product.</description><pubDate>Sat, 08 Aug 2026 01:00:00 GMT</pubDate></item><item><title>Two palettes, three typefaces, and a rule about numbers</title><link>https://www.gailleur.com/blog/two-palettes-three-typefaces/</link><guid isPermaLink="true">https://www.gailleur.com/blog/two-palettes-three-typefaces/</guid><description>Domi got a visual system this month. Not a theme — a contract: four palettes in OKLCh and hex, every pairing contrast-checked, both apps generating their theme files from the same JSON. Here is what it actually looks like, why there are two palettes instead of one, and the small rules that turned out to carry the most weight.</description><pubDate>Sat, 22 Aug 2026 22:00:00 GMT</pubDate></item><item><title>When Factory Agents Argue With Each Other</title><link>https://www.gailleur.com/blog/when-the-factory-argues-with-itself/</link><guid isPermaLink="true">https://www.gailleur.com/blog/when-the-factory-argues-with-itself/</guid><description>A one-sentence prompt fix took five rounds of review and three days to land. Three specialists genuinely disagreed. That&apos;s not a flaw in the process — it&apos;s why the specialists exist. It also means there&apos;s a real limit on how many you should add.</description><pubDate>Sat, 29 Aug 2026 18:30:00 GMT</pubDate></item><item><title>Where the Factory&apos;s Time Actually Goes</title><link>https://www.gailleur.com/blog/where-the-factorys-time-actually-goes/</link><guid isPermaLink="true">https://www.gailleur.com/blog/where-the-factorys-time-actually-goes/</guid><description>I assumed a faster factory meant more agents running in parallel. 150 merged PRs of measurement said the opposite: the median is already fast, the tail is the whole problem, and half of that tail I still can&apos;t diagnose.</description><pubDate>Sat, 29 Aug 2026 23:15:00 GMT</pubDate></item><item><title>Why I&apos;m building a software factory on the side</title><link>https://www.gailleur.com/blog/why-im-building-a-software-factory/</link><guid isPermaLink="true">https://www.gailleur.com/blog/why-im-building-a-software-factory/</guid><description>The real experiment isn&apos;t the product. It&apos;s the factory: what AI agents can actually carry, how you keep quality when they write everything, and what it takes to go fast without going loose. Run on my own time and my own money, so the learning transfers to an organisation of a few hundred people.</description><pubDate>Sun, 03 May 2026 13:00:00 GMT</pubDate></item><item><title>Why I&apos;m building Domi</title><link>https://www.gailleur.com/blog/why-im-building-domi/</link><guid isPermaLink="true">https://www.gailleur.com/blog/why-im-building-domi/</guid><description>An experiment in building software with AI agents needed a real product to be judged against — one with real data, real consequences, and someone who would notice immediately if it got worse. My own household turned out to be the most unforgiving customer available.</description><pubDate>Sun, 03 May 2026 14:00:00 GMT</pubDate></item></channel></rss>