Files
Maven/HANDOFF-2026-08-15.md
T

4.3 KiB

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:

docker compose up -d --force-recreate mavsttd mavttsd mavpoll