Updates MCP endpoints section: supervisor retired, brain gets HTTPS domain + Dex JWT auth + brain_answer/brain_classify. Regenerate all derived adapter files via context:sync. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
83 lines
3.4 KiB
Markdown
83 lines
3.4 KiB
Markdown
# Project context
|
|
|
|
<!-- Canonical project context. Edit this, run `task context:sync`.
|
|
Root agent context from ~/dev/.context/AGENT.md is automatically
|
|
prepended for harnesses that don't walk the directory tree. -->
|
|
|
|
## Identity
|
|
|
|
- **Name**: supervisor
|
|
- **Owner**: Mathias
|
|
- **Client**: personal
|
|
- **Repo**:
|
|
- **Status**: active
|
|
|
|
## Stack
|
|
|
|
- **Primary language**: Go
|
|
- **UI layer**: HTMX + Templ (when applicable)
|
|
- **Fallback languages**: Python, TypeScript (justify in PR if used)
|
|
- **Build**: Task (taskfile.dev), not Make
|
|
- **Containers**: Docker (compose for dev, k3s for deploy)
|
|
- **Target infra**: koala (GPU workloads), iguana (services), flamingo (edge)
|
|
|
|
## Conventions
|
|
|
|
### Code style
|
|
- Go: follow `golines`, `gofumpt`, `golangci-lint` with project config
|
|
- Tests: table-driven, in `_test.go` next to source, `testify` for assertions
|
|
- Errors: wrap with `fmt.Errorf("operation: %w", err)`, no naked returns
|
|
- Naming: stdlib conventions, no stuttering (`http.Client` not `http.HTTPClient`)
|
|
|
|
### Architecture preferences
|
|
- Prefer standard library over frameworks (net/http over gin/echo)
|
|
- Dependency injection via constructor functions, not containers
|
|
- Configuration via environment variables, parsed at startup into a typed struct
|
|
- Structured logging via `slog`
|
|
|
|
### Git
|
|
- Conventional commits: `feat:`, `fix:`, `chore:`, `docs:`, `refactor:`
|
|
- Branch naming: `feat/short-description`, `fix/short-description`
|
|
- PRs: one concern per PR, description explains *why* not *what*
|
|
|
|
### Security
|
|
- No secrets in code, ever — use env vars or SOPS-encrypted files
|
|
- Client data never leaves local network unless explicitly cleared
|
|
- Dependencies: audit with `govulncheck` before adding
|
|
|
|
## MCP endpoints
|
|
|
|
Two MCP servers are live, both reachable over Tailscale and via HTTPS domain:
|
|
|
|
- **`brain`** at `https://brain-mcp.d-ma.be/mcp` (NodePort `koala:30330`) —
|
|
`brain_query`, `brain_write`, `brain_ingest`, `brain_ingest_raw`,
|
|
`brain_answer`, `brain_classify`, `session_log`. Hosted by the ingestion
|
|
service. Auth: Dex JWT (claude.ai OAuth) or static `BRAIN_MCP_TOKEN`.
|
|
- **`routing`** at `http://koala:30310/mcp` — Mode 2 routing pod. Advertises
|
|
`review`, `debug`, `retrospective`, `trainer`; per-call routes to local model
|
|
or Claude based on brain `/pass-rate`. Bearer auth via `ROUTING_MCP_TOKEN`
|
|
(opt-in). Only `mode client-local` registers this endpoint.
|
|
|
|
The supervisor MCP (`koala:30320`) was retired in Plan 7 (2026-05-12). Its
|
|
skill workers (`tdd`, `spec`) are now SKILL.md files; routed skills moved to
|
|
the routing pod; brain tools moved to the brain MCP.
|
|
|
|
The brain HTTP REST API (`/query`, `/write`, `/ingest`, `/ingest-raw`,
|
|
`/ingest-path`, `/backfill-refs`, `/pass-rate`) remains available on port 3300
|
|
for shell scripts and non-MCP clients.
|
|
|
|
`brain_answer(query)` performs BM25 retrieval + LLM synthesis (berget.ai
|
|
gemma4:31b → iguana fallback). `brain_classify(text)` infers doc type, title,
|
|
and tags. Both require `BRAIN_LLM_PRIMARY_URL` to be set in the ingestion pod.
|
|
|
|
## Agent instructions
|
|
|
|
When acting as a coding agent on this project:
|
|
|
|
1. Read this file and all `SKILL.md` files in `.skills/` before starting work
|
|
2. Run `task check` before committing (lint + test + vet)
|
|
3. If unsure about a convention, check `DECISIONS.md` or ask
|
|
4. Never modify files outside the project root without explicit permission
|
|
5. When adding a dependency, explain why in the commit message
|
|
6. For client projects: never send code or context to cloud APIs — use local models via LiteLLM
|