<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"><channel><title>JF Gailleur</title><description>Solo dev log — building Domi, a life-management platform, in public. One sprint at a time.</description><link>https://www.gailleur.com/</link><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>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 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 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>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>The cognitive load of running a household isn&apos;t a productivity problem. It&apos;s a knowledge problem. Here&apos;s what I&apos;m building, and how, and why now.</description><pubDate>Sun, 03 May 2026 00:00:00 GMT</pubDate></item></channel></rss>