progress: refresh for overnight-jul6 (calendar/weather/knowledge query surface)
Add the jul6 done-section (7 tasks), bump date/LOC/test counts (303 tests), and correct the now-stale gap claims: query surface #5 (calendar+weather+ knowledge landed), act allowlist #4 (seeded), dialogue scaffold #2 and memory interface #8 (exist but unwired/in-memory only). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+70
-17
@@ -1,13 +1,17 @@
|
|||||||
## Maven — current state (2026-07-05)
|
## Maven — current state (2026-07-06)
|
||||||
|
|
||||||
Consolidated status. The reactive↔proactive core is closed and testable through
|
Consolidated status. The reactive↔proactive core is closed and testable through
|
||||||
the web PWA. The SPEC's open items 1–7 are landed (protocol doc, away-channel
|
the web PWA. The SPEC's open items 1–7 are landed (protocol doc, away-channel
|
||||||
fallthrough, CalDAV poller, quiet-hours schedule, tools enable/disable, note RAG,
|
fallthrough, CalDAV poller, quiet-hours schedule, tools enable/disable, note RAG,
|
||||||
passkey step-up); item 8 (multi-user) is deliberately deferred — see the tail.
|
passkey step-up); item 8 (multi-user) is deliberately deferred — see the tail.
|
||||||
The two big infra gaps from the last revision are now closed on `overnight-jul5`:
|
The two big infra gaps from the jul5 revision are closed on `overnight-jul5`:
|
||||||
**at-rest encryption** (AES-256-GCM, tmpfs working copy — not sqlcipher, see
|
**at-rest encryption** (AES-256-GCM, tmpfs working copy — not sqlcipher, see
|
||||||
`internal/store/crypt.go`) and **Docker deployment** (one image, six daemon
|
`internal/store/crypt.go`) and **Docker deployment** (one image, six daemon
|
||||||
containers). ~14.6k LOC + ~8.1k test, 284 tests, `-race` in `make test`.
|
containers). The `overnight-jul6` session (now on `master`) closed the biggest
|
||||||
|
*query-surface* gaps — **calendar querying, general-knowledge answers, and
|
||||||
|
weather** — plus a populated homelab act allowlist and two pure scaffolds
|
||||||
|
(dialogue state, long-term-memory vector store). ~15.2k LOC + ~8.5k test, 303
|
||||||
|
tests, `-race` in `make test`.
|
||||||
|
|
||||||
### Access model
|
### Access model
|
||||||
|
|
||||||
@@ -93,7 +97,49 @@ Caveats / gotchas:
|
|||||||
by flipping the sign; as a presence-*here* signal it's inverted. desk_active +
|
by flipping the sign; as a presence-*here* signal it's inverted. desk_active +
|
||||||
page_heartbeat cover home presence.
|
page_heartbeat cover home presence.
|
||||||
|
|
||||||
### Done since last revision (overnight-jul5, 2026-07-05)
|
### Done since last revision (overnight-jul6, 2026-07-06)
|
||||||
|
|
||||||
|
Seven tasks (`SESSION-06-07-2026.md`), one commit each, merged to `master`.
|
||||||
|
This session was run through **opencode**, not Claude Code (co-author trailer).
|
||||||
|
|
||||||
|
- **Calendar querying (task 3)** — "что у меня завтра?" now answers from the
|
||||||
|
CalDAV facts the poller already writes. Added `store.CalendarEvents(from,to)`,
|
||||||
|
a RU date-scope parser («сегодня»/«завтра») in `router/slots.go`, and an
|
||||||
|
IPC `CalendarEvents` RPC (api/client/server/wire) feeding the `IntentQuery`
|
||||||
|
handler. Empty day → «на сегодня ничего нет». Previously calendar only *gated*
|
||||||
|
nudges; it's now queryable.
|
||||||
|
- **General-knowledge routing (task 4)** — when notes-RAG misses `queryMinScore`,
|
||||||
|
the query now falls through to the phraser with an anti-hallucination system
|
||||||
|
prompt (`router.KnowledgePrompt`, single tested source) instead of giving up.
|
||||||
|
Empty/errored/Stub phraser → «не знаю.», never a fabrication.
|
||||||
|
- **Weather (task 5)** — new `internal/weather/`: `Provider` interface, a stub
|
||||||
|
(«погода не настроена»), and a real **keyless Open-Meteo** provider (geocode +
|
||||||
|
current_weather, injectable `*http.Client`, mocked in tests — no live network).
|
||||||
|
Wired into `IntentQuery` (keywords погода/градус/температура) with a ~5s
|
||||||
|
context timeout; selected by `voice.weather.provider` ("open-meteo" | "" → stub).
|
||||||
|
- **Homelab act allowlist (task 2)** — `voice.tools` seeded with read-only acts
|
||||||
|
(`systemctl status`, `docker ps`, `uptime`, `df`, `free`, `journalctl` reads)
|
||||||
|
as `destructive:false` and mutating ones (restart/stop/start/reboot,
|
||||||
|
docker-restart/stop) as `destructive:true`. Guardrail verified: no dangerous
|
||||||
|
verb is `destructive:false`. RU phrasings seeded in `act.txt`.
|
||||||
|
- **Embedder config validation (task 1)** — a partially-filled `voice.embedder`
|
||||||
|
block (some of model/tokenizer/lib paths missing) is now a load error instead
|
||||||
|
of a silent fall-through to the Hash floor; the floor fallback logs explicitly.
|
||||||
|
- **Dialogue state scaffold (task 6)** — `internal/dialogue/`: `Session` +
|
||||||
|
TTL `SessionStore` + pure `InheritSlots`. **Library only — not wired** into the
|
||||||
|
live path (wiring left as the plan's optional BLOCKED tail). This is the
|
||||||
|
substrate for future multi-turn (gap #2), not conversation itself yet.
|
||||||
|
- **Long-term memory interface (task 7)** — `internal/memory/`: `Store` interface
|
||||||
|
+ `InMemoryStore` (cosine). Wired into `IntentNote`: after `WriteNote` the note
|
||||||
|
embedding is `Insert`ed best-effort (log-and-continue, never fails the write).
|
||||||
|
In-memory only — no external vector backend yet (gap #8 remains).
|
||||||
|
|
||||||
|
Follow-ups (Claude Code, post-merge): gofmt'd `handlers_test.go` (the jul6
|
||||||
|
verification commit left it misaligned, so `gofmt -l` still flagged it despite the
|
||||||
|
"all gates green" claim); deduped the task-4 knowledge prompt to the single tested
|
||||||
|
`router.KnowledgePrompt()`. Tree is now genuinely green (gofmt/vet/303 tests).
|
||||||
|
|
||||||
|
### Done since the jul5 revision (overnight-jul5, 2026-07-05)
|
||||||
|
|
||||||
The overnight session (`SESSION-05-07-2026.md`, 25 tasks) closed the previous
|
The overnight session (`SESSION-05-07-2026.md`, 25 tasks) closed the previous
|
||||||
"not built yet" items 1–3 and added feature depth:
|
"not built yet" items 1–3 and added feature depth:
|
||||||
@@ -177,7 +223,7 @@ Also fixed:
|
|||||||
semantic `query`.
|
semantic `query`.
|
||||||
Earlier: notes/query recall, `/dash` monitoring, `wg_handshake` poller (NO-OP).
|
Earlier: notes/query recall, `/dash` monitoring, `wg_handshake` poller (NO-OP).
|
||||||
|
|
||||||
### Gaps — why "voice assistant" is still aspirational (2026-07-05)
|
### Gaps — why "voice assistant" is still aspirational (2026-07-06)
|
||||||
|
|
||||||
What separates Maven today from the thing the spec describes. Dealbreakers
|
What separates Maven today from the thing the spec describes. Dealbreakers
|
||||||
first — these define the category:
|
first — these define the category:
|
||||||
@@ -188,29 +234,36 @@ first — these define the category:
|
|||||||
kitchen. Highest-leverage gap — a wake word + speaker device changes what
|
kitchen. Highest-leverage gap — a wake word + speaker device changes what
|
||||||
Maven *is*, not just how good it is. (Listening modes 2–3 in maven.md.)
|
Maven *is*, not just how good it is. (Listening modes 2–3 in maven.md.)
|
||||||
2. **No conversation.** The router classifies one utterance → one reply. No
|
2. **No conversation.** The router classifies one utterance → one reply. No
|
||||||
follow-ups, no anaphora ("а когда?"), no dialogue state beyond the 90s
|
follow-ups, no anaphora ("а когда?"). A dialogue-state scaffold exists
|
||||||
destructive-confirm park. The sub-1B phraser only words replies; nothing
|
(`internal/dialogue`, jul6 task 6 — session TTL + `InheritSlots`) but is
|
||||||
converses.
|
**not wired** into the live path; the only runtime multi-turn state is still
|
||||||
|
the 90s destructive-confirm park. The sub-1B phraser only words replies.
|
||||||
3. **Latency/shape of a turn.** Clip-based STT (record → upload → whisper →
|
3. **Latency/shape of a turn.** Clip-based STT (record → upload → whisper →
|
||||||
route → phrase → piper → play). No streaming either direction, no barge-in;
|
route → phrase → piper → play). No streaming either direction, no barge-in;
|
||||||
every exchange is a full round trip.
|
every exchange is a full round trip.
|
||||||
|
|
||||||
Capability-class gaps — built but thin:
|
Capability-class gaps — built but thin:
|
||||||
|
|
||||||
4. **Act surface is a handful of argv allowlist entries.** propose→enable
|
4. **Act surface is a small argv allowlist.** propose→enable works and the
|
||||||
works; until populated, "acts on your homelab" is mostly potential.
|
allowlist now ships a homelab starter set (jul6 task 2 — status/ps/uptime/
|
||||||
5. **Query answers cover notes + a few built-ins.** No weather, no calendar
|
df/free/logs read-only, restart/stop/reboot gated). Still bounded to what's
|
||||||
*querying* (calendar only gates nudges), no general knowledge; the
|
seeded; broadening it is config, not code.
|
||||||
cheatsheet promises more than the router delivers.
|
5. **Query answers now cover notes + calendar + weather + general knowledge**
|
||||||
|
(jul6 tasks 3/4/5). Calendar querying, keyless Open-Meteo weather, and a
|
||||||
|
phraser knowledge-fallback all landed; caveat — general-knowledge quality is
|
||||||
|
only as good as the sub-1B phraser, and weather needs `voice.weather.provider`
|
||||||
|
set. The cheatsheet and router are now roughly aligned.
|
||||||
6. **Routing quality depends on the ONNX embedder being configured** — the
|
6. **Routing quality depends on the ONNX embedder being configured** — the
|
||||||
HashEmbedder floor makes RU recall lexical/weak; many commands fall to
|
HashEmbedder floor makes RU recall lexical/weak; many commands fall to
|
||||||
"clarify".
|
"clarify".
|
||||||
7. **Presence is effectively one signal** (page_heartbeat); desk_active is
|
7. **Presence is effectively one signal** (page_heartbeat); desk_active is
|
||||||
still an undeployed script — "voice when near" routing runs on a guess.
|
still an undeployed script — "voice when near" routing runs on a guess.
|
||||||
8. **Long-term memory per spec (obsidian → chroma) doesn't exist** — sqlite
|
8. **Long-term memory per spec (obsidian → chroma) is still stubbed** — jul6
|
||||||
brute-force cosine over notes is recall, not personalization. Persona
|
task 7 added an `internal/memory` `Store` interface + an in-memory cosine
|
||||||
prompt and custom TTS voice (kami-picked, replaces the irina floor) are
|
impl, and note writes now insert into it best-effort, but there's no
|
||||||
still future items.
|
persistent/external vector backend and nothing reads it back yet. It's a
|
||||||
|
seam, not personalization. Persona prompt and custom TTS voice (kami-picked,
|
||||||
|
replaces the irina floor — [[custom-voice-training]]) are still future items.
|
||||||
|
|
||||||
Ops footnote: in the Docker deploy, voice-over-web needs mavend to bind its
|
Ops footnote: in the Docker deploy, voice-over-web needs mavend to bind its
|
||||||
voice server on 0.0.0.0:9100 — unverified on the target host; until then the
|
voice server on 0.0.0.0:9100 — unverified on the target host; until then the
|
||||||
|
|||||||
Reference in New Issue
Block a user