diff --git a/CLAUDE.md b/CLAUDE.md index 58631a8..8d2a452 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -79,23 +79,33 @@ Skills live in the canonical library `mathias/skills` and are wired into this re ## Current build state (start here for the first task) -The repo is **scaffolded and intentionally RED**: +The repo is **green and shipping** — last tag `v0.4.0`. `task check` passes (fmt, vet, lint, +`go test -p 1 ./...`). Go is `1.26.1` (see `go.mod`). -- Clean Architecture skeleton exists: `internal/domain` (entities), `internal/ports` - (interfaces), `internal/usecase` (engine), `cmd/tapir` (entrypoint stub), - `internal/adapters` (empty — concrete adapters go here). -- `usecase.Engine.ProcessNewVideo` returns `ErrNotImplemented`. -- `test/acceptance/summarize_new_video_test.go` translates the first two Gherkin scenarios and - **fails** against the stub. `task check` is therefore red on `test`. -- **First build task:** implement `ProcessNewVideo` (resolve transcript -> summarize -> deliver to - sinks | skip on no-transcript) to make the acceptance tests green, following the `.feature` - files. Then add the AI-router `Summarizer` (copy `llm` per ADR-004), the YouTube `VideoSource` - adapter (captions-first), and the store + brain sinks. +- Clean Architecture core is implemented: `internal/domain` (entities), `internal/ports` + (interfaces), `internal/usecase.Engine.ProcessNewVideo` (resolve transcript → summarize → + deliver to sinks | skip on no-transcript). The acceptance tests in `test/acceptance/` are + green against it. +- Adapters present under `internal/adapters/`: `youtube` (captions-first `VideoSource`, + timedtext/InnerTube acquisition per ADR-010), `summarizer` + `llm` (the copied AI router, + Primary→Fallback per ADR-004), `store` (Postgres, golang-migrate migrations 001–006), + `secrets` (file-backed `SecretStore`). The brain HTTP sink (ADR-005) is the remaining + optional sink. +- Stage 1 is open (ADR-012): multi-user with **DB-enforced** isolation — Postgres RLS `FORCE`d + on all user-owned tables (migration 003), two-user isolation test in + `internal/adapters/store/rls_test.go`. Registration gate, per-user YouTube web connect, and + account management (disconnect / delete, ADR-013) all shipped. +- `cmd/tapir` subcommands: `list`, `show`, `auth` (interactive host-side OAuth), `run` (batch + watch→summarize), `serve` (the HTMX+Templ web reader/writer under `internal/web`, a new + transport over the unchanged engine/ports — ADR-003). `tapir env` prints config. +- **Build/run:** `task check` is the gate; `task build` produces the binary. Local dev uses + `StubAuth` (allow-all) and a `TAPIR_DB_DSN` Postgres; the deployed service uses Dex OIDC. -**Unverified setup items** (see `docs/homelab-integration.md`, marked `confirm`): the Go version -in `go.mod` (1.23 — match the koala runner; estate elsewhere uses 1.26.1), the brain-mcp URL, the -exact ESO secret-ref naming, and the summarization model alias. Resolve against the live cluster -before depending on them, and pin answers back into `docs/homelab-integration.md`. +**Setup facts** (resolved — see `docs/homelab-integration.md` for the live values): LiteLLM is +off-cluster at `koala:30401/v1/` with `LITELLM_MASTER_KEY` from 1Password; the summarization +model is config (`TAPIR_SUMMARIZER_MODEL`, default `koala/phi4-mini`), never hardcoded. The +brain-mcp base URL and ESO ref scheme are pinned in that doc; check it before wiring rather than +re-deriving. ## Provenance (where this design came from)