# Handoff Master is at `5cae33a`, pushed, tree clean apart from this file. Working on master raw by the owner's call: no branch, `--no-verify` on every commit with the reason in the body. ## Landed this session Twelve commits pushed. Nine were the previous session's tree, already described in the commit log. Three are new: - `78a9c61` `docs/spec.md`, 51 capabilities with a DoD each. - `02e3d27` `docs/roadmap.md`, seven milestones, plus both pointer rows in `CLAUDE.md`. - `5cae33a` honesty split into three milestones, five capabilities deferred past v1. **Read `docs/spec.md` and `docs/roadmap.md` before anything else.** Every decision from this session is in them. This file holds only what they do not. ## The two documents `docs/spec.md` is the union of the 39 audited rows (`docs/evals/2026-08-13-capability-audit.md`) and the owner's 18-item v1 list. Twelve of his items had no audit row, so the file has 51 entries. Each entry carries three parts. State is a reference to the living doc that owns it. DoD is a plain list observable on the running box. Scenario names a file in `cmd/mavend/testdata/scenarios/`. `docs/roadmap.md` orders them into nine milestones. Honesty, then reach, then breadth. Not ordered by code work, because none of the four broken capabilities is a code defect. ## Decided, do not re-ask - **v1 is a voice assistant, minimum viable.** Each DoD is written at "voice-reachable and honest", not "feature-complete". - **Honesty splits into three.** M1 the turn path, M2 memory he cannot correct, M3 step-up. M1 and M2 touch different code and owe different docs. Step-up is configuration, not honesty, and sits before M4 because M4 is what first makes acts real. - **Five capabilities deferred past v1** (owner's call, 2026-08-15): speaker recognition, smart home, bluetooth control, model swap, self-update. Bluetooth was on the v1 list and came off it. Their spec entries keep their DoD. - **A milestone closes its own doc gaps and writes its own scenarios.** Neither becomes a milestone of its own. Otherwise the 17 missing docs and 46 missing scenario files collect at the end. - **Learning means behavioral, not weights.** Stored outcomes only. No adapter, no training set. - **Email and calendar need the product decision before deploying.** Both are built and neither is in `docker-compose.yml`. That is M8. ## Findings the spec pass produced - **Recurring reminders do not exist on the spoken path.** `store.Reminder` carries `Cron` and `ipc.CreateReminder` takes one. `grep "Cron:" --include='*.go'` outside tests returns only `internal/ipc/client.go`, `internal/ipc/storeapi.go` and `cmd/mavend/tick_routines.go`, and the last is routines, a separate mechanism. Pills, the dog, the vet and the kibble are unbuilt on top of finished storage and delivery. This is M6. - **Seventeen capabilities have no living doc.** Memory is the worst cluster: facts, notes and the digestion worker have no owning document at all. - **Webhooks barely exist.** The only one in the tree is `internal/delivery/telegramsink/intake.go`, Telegram's own inbound hook. - **Command chaining does not exist.** The `chain` in `internal/router` is the world chain and the source chain. - **Desk notifications are inbound only.** `ambient:notif` reads his desktop. There is no outbound desk reach, and which direction he meant is undecided. - **Only 5 of 51 spec entries cite a scenario that exists.** ## Not filed, and this is the risk Vikunja returned 503 across this session and the last, so **none of this has a task id**. The three commits above are tagged `V-719`, which is the reminder-cancellation task, not this work. Retag or file when Vikunja is back. Unfiled, listed again at the end of `docs/roadmap.md`: 1. The capability audit itself, headed "unfiled". 2. Remember-versus-query misroute, two of seven audit probes. 3. The masculine reply on the wire, caught live while `CheckFeminine` passed. 4. Recurring reminders having no caller. 5. The seventeen capabilities with no living doc. 6. The 46 scenario files the spec names and does not have. ## Next Open a session on M1, which is three gate items on the turn path and owes no new doc. If Vikunja is up, file the six above first and give M1 a real id. One command still outstanding from the last session, cheap and unrelated: ```sh docker compose up -d --force-recreate mavsttd mavttsd mavpoll ```