Sprint 34 — Ask the house anything
Last sprint I wrote that the foundation paid out — that an extra-large jumbo came at the price of a stencil. Sprint 34 was the same trick again, twice as big. Forty-one PRs in three days, and almost none of them were expensive, because each leaned on something already there.
Three things happened, in order: the house learned to answer questions, the last two entities I’d been missing showed up, and then — over one night — I cleared most of the “do next” shortlist.
The house can answer now
For a while Domi could hold your household but not really answer about it. Two halves fixed that, and they’re genuinely different questions.
“What did the vet say?” — that’s a content question. The answer lives in the prose of a document, not in a structured field. So documents now get full-text transcription on ingest (the dense booklets — benefits plans, reports — get transcribed to Markdown, tables and all), an on-ingest summary, and they’re chunked and embedded into a per-tenant vector store. A search_documents tool retrieves the relevant excerpts and answers from them. “What’s my dental coverage?” now works from a benefits booklet I uploaded once.
“Which contacts serve assets in the cottage?” — that’s a relationship question, a multi-hop walk across the graph. The answer is a new get_graph tool that loads the whole (small) household graph as a compact snapshot and lets the model traverse it. No graph database, no text-to-SQL — it just reuses the same assembler that already draws the visualization.
Neither needed new infrastructure. The document RAG rode the model gateway and the extraction pipeline; the graph querying rode the viz code. Both shipped the same day, alongside the member-identity cluster (Domi now remembers that “Liz” and “Beth” are the same person) and a sessions-list-and-revoke screen.
The two entities that were missing
Then the model finally got complete. Two first-class things that a household obviously has, and Domi didn’t:
Events — time-bounded happenings. Trips, kids’ camps, vacations. With a start and an end, recurrence, color, and Apple-style multi-day bars spanning the calendar. A family runs on these, and they were the one main entity I’d kept deferring.
Affiliations — what each member does with their time. School, work, sports, clubs, caregiving. The headline use case is the one I’ve wanted since the start: drop a school calendar in, and Domi links every date to the right kid — even though the kid’s name isn’t on the calendar — because it knows which school that child is enrolled in, and remembers the link the first time so every future calendar files itself silently.
The overnight wave
The last day was a single long session against the roadmap’s “do next” shortlist. Nine features:
- Obligations now generate their own reminders. They used to sit inert; now an obligation produces a “renew or pay by” task ahead of its due date — by the cancellation-notice window if it has one, otherwise thirty days. And its complement: auto-paid obligations. Netflix and Videotron pay themselves, so you can mark them auto-paid and Domi stops nagging you to pay them — the record stays, the noise goes.
- Contacts can fill in their own address. Click Find address with web search on a contact and Domi searches the web, then proposes what it found with a confidence score and a source — it never silently overwrites. The plumber’s address, filled in for me.
- The calendar is editable. Drag a one-off event or task to another day to move it. (Recurring things stay locked — there’s no per-occurrence override yet, and I’d rather refuse than quietly shift a whole series.)
- Every task has a number and a permalink.
#123, and/tasks/123opens it. A per-tenant counter, allocated by a database trigger so every way a task gets created picks up a number, race-safe. - Siblings discover themselves. If two members share a parent, the graph just shows them as siblings — derived, never stored, so fixing a parent link fixes the siblings for free.
- Plus project start dates, document → area reassignment, and the security one with a deadline: next-intl v4, which clears an open-redirect CVE. That last one was a one-line dependency bump because the i18n setup was already shaped the way v4 wanted — exactly the kind of cheap window worth taking before it ages into a hard migration.
The pattern, again
I keep noticing the same thing. The RAG cluster reused the model gateway. Events and Affiliations reused the entity-relationship pattern from two sprints back. The overnight nine reused the predict engine, the chat-proposal applicators, the audit wrapper, the row-level security. I wrote a lot of features and very little plumbing.
That’s the whole bet of the boring sprints paying off in the loud ones. 41 PRs merged in three days, fourteen migrations, two new entities, and a household you can finally just ask.
Next sprint, I’m slowing the feature pace on purpose: testing, bug fixes, and a few smaller improvements. Three days of this much new surface earns a week of hardening it.