01Hybrid recall
Recall fuses two legs, SQLite FTS5 keyword search and an ObjectBox HNSW vector index, with reciprocal rank fusion at k = 60 over an over-fetch of 100. ObjectBox cannot load its native library under flutter test, so I unit-test the fusion arithmetic against an exact brute-force store, and an on-device integration test asserts that HNSW agrees with brute force on ordering. On a spoken "forget that", I delete the vector before the row, because the other order orphans an embedding with nothing left to find it from.
02A bystander bug
Anyone else speaking in the room would make the companion stop and listen to them. Lowering the provider's onset sensitivity did reject bystanders, and I took it back out five days later because it also dropped the user's own quiet turns: eight to twelve seconds of dead air each time the watchdog rescued one. I have the gate pinned back to high, my current attempt sits behind a flag that is off by default, and the framework knobs that look relevant are dead code, because a realtime model doing its own turn detection reaches interruption through a path with no duration test in it.
03Classified, not spoken
Every user turn is classified on the server, launched beside the model turn so it never blocks a reply. The verdict type has no field that can carry the transcript, so a log line or a crash report cannot acquire one by accident; it returns a tier and a label from a closed vocabulary. What the user hears is a scripted constant the app already holds, never generated text.
04Consent at egress
Thirteen capabilities, from cloud voice and always-listening microphone to calendar, inbox, health and contacts, pass through a consent gate before any outbound call. A denied capability means the call is not made, rather than made and its result discarded, and the enforcement test asserts a call count of zero. I keep calendar read and calendar write deliberately separate, because cancelling a meeting emails guests who never installed the app.
05Selling a voice
The marketing site I built under the working name Willster plays the product instead of describing it: one continuous scripted morning, thirty beats and twenty-six pre-rendered clips over 1:48, with a receipt filling in beside it as the conversation runs. A voice-mode model can paraphrase a line, and a paraphrase silently desynchronises every caption, so my build script checks the returned transcript against the script before accepting a clip, measures its real duration with ffprobe and writes the timings back into source. Captions, animation and voice therefore run off one clock, and I bound the page by the product's own rules as well, taken from statute rather than taste: no countdown, no waitlist counter, no scarcity in the pricing section.