beyond the model and tts work, the useful additions are mostly around **reliability, context, and reach**, not more intelligence. ## highest-value additions ### 1. unified event intake maven should receive normalized events from: * praxis * calendar * telegram * local notifications * system/service health * manual checklists * eventually email bridges one internal envelope: ```go type Event struct { Source string Kind string EntityIDs []string Title string Body string Priority string OccurredAt time.Time Payload json.RawMessage } ``` this gives digestion one stable input instead of source-specific logic. --- ### 2. explicit morning routine engine — **core engine done (2026-07-20)** `internal/morning` — pure checklist engine, mirrors `internal/loop`/ `internal/routine`'s no-I/O contract. `Evaluate(routine, facts, now)` answers "what's still missing" any time (order-independent — checks facts, not sequence); `Due(routines, facts, last, now)` fires the once-per-day nag only at `NudgeAt` (defaults to window end) and only when something's unevidenced, with a `last`-map dedupe identical in shape to `routine.Due`'s cold-start/ last-fire tracking. Evidence is just a fact timestamped inside today's window — manual (voice-tapped) and inferred (another daemon writing the same key) are indistinguishable, satisfying the manual/inferred requirement for free. Weekday/weekend variants are two `Routine`s with different `Weekdays` sets under different names. Wired into `config.MorningRoutineConfig` + `cmd/mavend/tick.go`'s `fireMorningRoutines` (reads only the fact keys the configured items reference, dispatches through the normal severity/presence routing table, body is literal joined item labels — not LLM-phrased, same no-hallucination rationale as cron routines). 13 unit tests in `internal/morning/morning_test.go`. Added since (2026-07-20, same day): a read-only `/morning` page in mavweb — `ipc.CoreAPI.MorningStatus` (new wire method, mirrors `TickTrace`'s daemon-cache-only shape: the store adapter errors, `daemonAPI` serves it from a `tickLoop.morningStatus` closure) returns each routine's active/window/ per-item done state, server-rendered same as `/trace` (no live-update loop — checklist state moves on minutes, not seconds). Not yet done: no config wired in `deploy/mavend.json` (no morning routines configured on homesrv yet — add items there when the medicine/water/pets fact keys the phone/desktop write are settled), no voice query path for "what did I miss this morning" (Evaluate supports it; nothing calls it yet), no way to create/edit routines from the web UI — construction still means hand-editing config, deliberately deferred: routines are operator-declared config (like cron routines), and a CRUD editor would mean moving them to a DB table + hot-reload, a bigger change than this pass. not ordinary reminders. support: * required morning items * order-independent completion * soft time windows * skipped-step detection * one nudge, not repeated spam * manual and inferred completion evidence * weekend/weekday variants example: ```text 08:00–11:00 - medicine - water - pets - check praxis attention ``` maven should know what is still missing, not merely fire four timers. --- ### 3. cross-device presence **status (2026-07-20):** the hysteresis engine and 3 of the listed signals are already built and wired live: `internal/store/presence.go` (noisy-OR combiner + Schmitt-trigger bucket resolve), fed by `desk_active` (workstation, via `scripts/desk-active.sh` posting to `/api/signal`), `page_heartbeat` (mavweb tab, `app.js`), and `wg_handshake` (`mavpoll` polling `wg show`) — threaded into the tick loop via `internal/loop/gather.go`. Not done: phone-reachable, homesrv-available, audio-output, and active-maven-client signals from the list below are still missing. a small presence daemon on each trusted device: * workstation active/idle * phone reachable * homesrv available * last keyboard/mouse activity * wireguard presence * current audio output * active maven client mavend receives only compact state, not raw activity logs. useful for: * choosing delivery channel * suppressing voice while away * surfacing reminders when you return * knowing whether an agent result should be spoken or sent as text --- ### 4. interruption policy — **done (2026-07-20), turned out to already be built** audited the existing code before writing anything new: `internal/loop.Gate` already answers deliver_now vs. drop (quiet-hours/cooldown/snooze/presence/ calendar-busy), and `cmd/mavend/tick.go`'s `digestQ` + `config.DigestConfig` already implement queue/digest (low-severity nudges batch into one notification, flushed on window elapsed or max-items reached). The four outcomes below were already covered by these two mechanisms; nothing new to build for the core policy. Gap that *was* real: `deploy/mavend.json` had no `digest` block, so batching was disabled in prod despite being fully implemented. Fixed — see the config change alongside this note. before delivering anything, evaluate: ```text urgency current activity quiet hours recent nudges available channels whether already surfaced ``` result: ```text deliver_now queue digest drop ``` this prevents maven from becoming annoying once praxis and other sources start producing more data. --- ### 5. entity-aware memory — **done (2026-07-20)** `03fa52d`/`9876187` (Vikunja #279): facts gain `Subject`/`EntityID`/ `ResolutionState`; an async enrichment worker resolves free-text subjects to canonical Nexus entity_ids (mirrors Praxis's enrichment pattern). Ambiguous or unreachable Nexus never guesses — the fact stays `pending` or terminal `ambiguous`. Voice-tapped facts (`IntentFact`) now flow into the enrichment queue automatically via an optional `Subject` field on `WriteFactReq` (old callers unaffected). Landed alongside this in the same session (not originally on this list, but closes the plumbing gaps the last brief flagged for Nexus/Praxis maturity): a typed Praxis lifecycle client (`398997f` — surface/acknowledge/resolve/ ignore/pin; fixes the surfaced≠acknowledged gap where reading an item aloud left no trace), correlation-ID/version headers on the Nexus/Praxis clients (`b743860`), entity-scoped Praxis attention queries (`0579ef9`), a durable delivery outbox with begin-before-send/complete-after semantics (`29f23e3`+`9ff726e` — closes a duplicate-send-on-crash bug), fail-closed handling on ambiguous IPC mutation outcomes and Nexus/Hexis dependency errors (`838fde1`+`d9fa4d6`), and a reusable fake-ecosystem test harness with fault injection (`c932cd8`). connect maven memory to nexus ids. instead of: ```text key = "кошачий фонтан" ``` store: ```text entity_id = ent_pet_water_fountain predicate = refilled_at value = 2026-07-19T... ``` benefits: * stable russian/english aliases * fewer duplicate facts * better “when did i last…” queries * easier routine detection * cleaner praxis correlation --- ### 6. bounded follow-up state for short continuations: * “yes” * “tomorrow” * “the second one” * “not that project” * “do it later” store explicit pending state instead of relying on chat history: ```go type PendingInteraction struct { Kind string Candidates []string Args json.RawMessage ExpiresAt time.Time } ``` this matters a lot for a 1.7b model. --- ### 7. evaluation lab — **skipped for now (2026-07-20)** runs on a different machine (GPU box), and CPT is currently in progress there — deprioritized until the training pipeline has a checkpoint to gate. Not abandoned, just off the immediate list. before every new checkpoint or lora deploy: * routing accuracy * slot accuracy * malformed json rate * russian/english mixed input * ambiguous entity handling * reminder vs note vs fact * direct answer vs tool call * confirmation safety * phrasing quality * latency and ram also replay real anonymized traces against old and new checkpoints. this should be a hard deployment gate. --- ### 8. replayable full-system simulator fake: * clock * presence * caldav * telegram * praxis * nexus * hexis * stt * tts * llama-server scenario: ```text 08:30 user appears 08:35 medicine not completed 08:40 correx agent waits 08:45 calendar sync stale 08:50 user says “what did i miss?” ``` assert: * what tools were called * what was surfaced * what stayed unresolved * what maven said * what was not executed this will save more time than another feature daemon. --- ## useful second-wave additions ### voice session quality * barge-in * interrupt tts on wake word * partial stt display * confidence-aware clarification * retry only failed stt segment * per-room microphone profiles * noise-floor calibration * short response mode when speaking ### notification bridge framework small adapters for: * ntfy * telegram * matrix * web push * android notification forwarding * local dbus notifications normalize into maven/praxis events instead of treating each as a separate feature. ### local knowledge ingestion * markdown/docs ingestion * git repo summaries * project decision records * conversation exports * provenance and source links * incremental reindexing keep this read-only and separate from personal fact memory. ### service self-diagnostics `maven doctor`: * socket reachability * model health * stt/tts readiness * embedder availability * caldav freshness * telegram poll state * praxis/nexus/hexis reachability * db integrity * disk usage * recent failures ### config and secret management * schema-validated config * config migration * secret references instead of inline values * dry-run validation * redacted config dump * per-daemon health config * startup dependency report --- ## things i would not build yet * autonomous multi-step planning * large external reasoner * generic workflow engine * self-editing memory * automatic hexis actions from praxis * emotion simulation beyond phrasing * full home-assistant replacement * more model layers before routing is stable ## recommended order **status as of 2026-07-20:** 1. ~~evaluation lab~~ — **skipped, GPU-box work, deprioritized while CPT is in progress** 2. ~~entity-aware memory~~ — **done** (`03fa52d`/`9876187`, plus adjacent Nexus/Praxis plumbing hardening — see item 5 above) 3. ~~morning routine engine~~ — **core engine done** (`internal/morning` + `cmd/mavend` wiring — see item 2 above; not yet configured on homesrv, no voice query, no web UI) 4. interruption/delivery policy 5. presence agents 6. unified event intake 7. full-system simulator 8. notification bridges 9. knowledge ingestion 10. voice-session polish the main goal should be: **maven reliably knows what is happening, knows what you meant, and chooses the least annoying correct response**. everything else can wait.