dictate v3 — from captured voice to executed action

One line: fix the three capture bugs this weekend, replace the Telegram transcript-flood with three-line action cards that agents actually execute, and close the loop with a daily triage that is deliberately not another to-do system.

Source: your five drive-time dictations tonight (2026-07-17, 04:00–04:55 UTC) — recovered from OB1 and the blob queue. Two of them were still sitting unconsumed in the queue when I looked, which is itself a finding: the consumer cron runs every 30 minutes, so "sent" can mean "invisible for up to 30 minutes." Noted in the roadmap.


The bugs — P0, in root-cause order

1. The lost message (the worst one). You dictated, the screen went off during the transcribe-then-route step, and the entire memo evaporated — you had to re-dictate from memory. Root cause: nothing persists until routing completes, and the foreground page dies when the screen does. The fix (sharpened by the critique — persisting after transcription returns would still lose the audio if the screen dies during the transcribe fetch): capture during recording. Audio chunks write to the existing dictate-offline IndexedDB as they're produced (ondataavailable), a wake lock holds the screen through recording, and transcription + routing become idempotent, retryable jobs on an already-saved record — never gates to saving. Screen dies mid-anything → reopen shows "1 unfinished memo," and the job resumes. A dictation becomes as unlosable as a photo, because it's saved before it's even finished being spoken.

2. No new memo after send-to-agent. The state machine dead-ends at sent — there's no path back to idle. Fix: after send, auto-reset to ready-to-record, and a New memo control visible in every state. One state-transition bug, one afternoon.

3. Android Auto missing. dictate-auto is a sideloaded personal APK (Car App Library, IOT category) — it does not install itself and does not survive some updates. Action: verify what's installed on the phone, re-sideload the current APK from dictate.arnao.ai/dictate-auto.apk, and add a version-check line to the nightly site audit so "Auto silently missing" becomes a detected condition instead of a discovery at 70mph. The v1.1 queue (steering-wheel MediaSession control, auto-chunk) is where the driver-friendly buttons land.

Telegram: the action card, not the flood

You asked for this before and it didn't take — the transcript still floods the chat. The v3 contract, enforced at the sender (the dictate pipeline), not by politeness:

The action loop — explicitly not another to-do system

Your constraint, kept as a design rule: "I don't want to create another to-do system… I want these to end up in a place where I'm reminded about the more important, and somehow these are getting done." So nothing here creates a list you tend. The loop:

  1. On arrival, the model triages every dictation (your "go right directly to the model" instinct) — and the critique's ruling is adopted as the design: the safe class auto-executes without a tap. You dictate while driving; a card that needs a tap arrives exactly when you can't tap it — the tap-gate would defeat the product. Auto-execute: anything reversible and contained in your own systems (log to OB1, draft docs, research, code to a branch, calendar entries, podcast queue) — worst case, you delete an artifact. Never auto-execute: anything crossing the blast-radius boundary (messages to other humans, Signal sends, purchases, deploys, deletes) — worst case, you apologize to a person. Mechanics: per-destination allowlist + a confidence floor (below it, degrade to the tap-gated card); every auto-executed card edits to ✓ with result and [Undo] — Undo, not confidence scores, is what makes auto-execution trustworthy. Target: median taps per dictation = 0.
  2. One daily rollup, inside the Morning Brief you already read — not a new surface: yesterday's dictations, what got executed (with results), what's waiting, max three "important and stalled" items resurfaced. The same rollup feeds the podcast so the day's notes literally come back to you as audio.
  3. Mortality, again: anything untouched for 7 days auto-archives to OB1 with a one-line burial note in the brief. Nothing accumulates. The system's promise is the inverse of a to-do app's: it forgets safely so you don't have to hold it.
  4. The bet is instrumented, not assumed: the Morning Brief tracks executed-vs-buried ratio for daily items and the lost-memo rate. If important things are quietly dying at day 7, that shows up in two weeks — not when you find yourself opening a notes app again.

The gap the critique caught that nothing above fixes: the system captures hands-free but confirms hands-required — every result is a visual card the driver can't read. So P2 closes the loop in voice: execution results come back as TTS through Android Auto ("Captured. Two actions running. One needs a decision when you stop"), and a spoken "yes" / "later" stands in for the tap on boundary-crossing actions. Same modality in as out.

Consumer lag fix rides along: the 30-minute blob-queue cron drops to 5 minutes, or better, the pipeline POSTs the consumer directly on upload (queue stays as the safety net).

Roadmap

Self-critique — Fable adversarial pass

Full text: fable-critique-20260717.md. What it caught and what changed: