diff --git a/CLAUDE.md b/CLAUDE.md index 141db1f..f69a422 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -53,7 +53,7 @@ CGO daemons (`mavend`, `mavsttd`, `mavttsd`, `mavenclient`) need the vendored to and libs wired through the Makefile — **do not** call `go build` on them bare, use `make`: ```sh -make build # all 9 binaries +make build # all 11 binaries make build-web # single daemon (pure-Go ones: web/waked/poll/caldav build without CGO) make test # go test -race across ./internal/... ./cmd/... with CGO env set ``` @@ -82,13 +82,31 @@ Pure-Go packages (`router`, `memory`, `mavweb`, …) run under a plain `go test | `mavpoll` | Environment poller: netdata alarms, uptime-kuma, zenmoney, wireguard presence. Writes facts, sends nothing. Telegram is `internal/delivery/telegramsink`, not this. | | `mavcaldav` | CalDAV calendar sync. | | `mavmaild` | Mail reader (IMAP, read-only). Holds the IMAP password; core never sees it. | +| `mavgpud` | GPU supervisor. **Runs on workpc, not homesrv** — own unit, `deploy/mavgpud.service`. Keeps llama-server loaded while the card is free (V-488). Maven never asks it for anything, it reads `/health` through `llm.Pair`. | +| `mavupdate` | Not a daemon. Operator CLI a human runs on the box to deploy a new build. | + +Two more binaries have no Makefile target and are built with `go run` or `go build` when +they are needed. Neither is deployed. + +| Binary | Role | +|---|---| +| `mavseal` | Recovery tool. Encrypts a live tmpfs working copy back to the ciphertext file when mavend was killed before `defer st.Close()` sealed it. | +| `labelgen` | Runs the stage 0 grammars over utterances and prints JSONL, the training data for the routing heads (V-546). | Daemons are wired socket-to-socket, not linked. `internal/ipc` is the client/server wire protocol; the config in `deploy/mavend.json` (with `${VAR}` env expansion from gitignored `deploy/telegram.env`) sets socket paths, model paths, and the phraser/embedder blocks. -**Seven of the nine run on homesrv. `mavwaked` and `mavenclient` do not, and that is the -decision, not an oversight** (Vikunja #463, `docs/plans/17-where-the-voice-loop-runs.md`). +**`docker-compose.yml` runs five: `mavend`, `mavsttd`, `mavttsd`, `mavweb`, `mavpoll`.** +Count against compose, not against the table. Four of the nine daemons are absent, and each +absence has a different reason. + +`mavmaild` is commented out in compose, with the reason written beside it: it needs a mail +account and this box has none. `mavcaldav` appears nowhere at all, and unlike the other +three that is an oversight rather than a decision (V-644). + +**`mavwaked` and `mavenclient` are absent by decision, not oversight** (Vikunja #463, +`docs/plans/17-where-the-voice-loop-runs.md`). homesrv has a microphone — it is a laptop — but it is in the wrong room, so a wake-word daemon there listens to nobody. They belong on a client machine where the owner is standing.