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>
11 KiB
Agent context — Mathias workspace
Who I am
I'm Mathias, a digital product manager and technology consultant based in Sweden. I build software, research emerging tech, and deliver consulting engagements for clients under NDA. I work across AI/ML, financial automation, web applications, and climate/sustainability tech.
How I work with agents
- I think like a product manager — I care about why before how
- I want agents to be opinionated and push back, not just execute blindly
- I prefer concise responses; skip ceremony and get to the point
- When I say "build this", I mean production-quality with tests, not a demo
- Ask me before making irreversible changes or adding heavy dependencies
- I work with confidential client data — never send it to cloud APIs unless I explicitly say it's OK
Behavior rules
These rules apply to every task across every project, regardless of harness.
- No assumptions. Don't hide confusion — surface it. Surface tradeoffs explicitly. Think before coding; if the problem is unclear, ask or state assumptions before acting.
- Minimum viable code. Solve with the smallest change that works. Nothing speculative, no "while we're here" cleanups, no premature abstractions. Simplicity first.
- Surgical changes. Touch only what the task requires. Leave unrelated code, files, and formatting alone. Diffs should be small and reviewable.
- Goal-driven execution. Define clear success criteria up front for every task. Loop — implement, verify, refine — until those criteria are met. Don't claim completion without evidence (tests pass, command output, observed behavior).
- Branch-per-task for multi-agent repos. When another agent may be active on
the same repo, create a branch (
agent/<description>), commit there, and open a PR. Do not merge without explicit instruction from Mathias.
Default stack
| Layer | Default | Fallback | Last resort |
|---|---|---|---|
| Language | Go | Python | TypeScript, Java, C |
| UI | HTMX + Templ | Server-rendered HTML | React (only if SPA is justified) |
| Build | Task (taskfile.dev) | Make | — |
| Containers | Docker Compose (dev), k3s (prod) | — | — |
| DB | PostgreSQL + sqlc | SQLite | — |
| Search | Qdrant (vector), BM25 | — | — |
| Logging | slog (structured) | — | — |
| Testing | Table-driven, testify | — | — |
Exploratory: Rust, Zig — I'll tell you when I want these.
Code conventions
- Go style: golines, gofumpt, golangci-lint
- Errors:
fmt.Errorf("operation: %w", err)— never naked, never log-and-return - Naming: stdlib conventions, no stuttering
- Architecture: prefer stdlib over frameworks, constructor injection, env-var config parsed into typed structs
- Git: conventional commits (
feat:,fix:,chore:), one concern per PR, PR describes why not what - Security: no secrets in code, govulncheck before adding deps, SOPS for encrypted config
- Dependencies: prefer stdlib. testify, slog, templ, sqlc are pre-approved; anything else needs justification in the commit message
Infrastructure
Three machines on Tailscale:
| Machine | Role | Key specs |
|---|---|---|
| koala | GPU inference, heavy compute | RTX 5070, runs llama-swap, Qdrant |
| iguana | Services, builds | M2 Ultra Mac |
| flamingo | Daily driver, edge | Mac mini, ~/dev is here |
- Model routing: LiteLLM in front of llama-swap (local) + cloud APIs (when permitted)
- Orchestration: k3s cluster across all three machines
- Networking: Tailscale mesh
Project landscape
All development repos live at ~/dev/ (softlink from ~/Documents/local-dev/).
Organized in thematic folders:
| Folder | Focus | Count |
|---|---|---|
GO/ |
Go web frameworks, API integrations, learning projects | ~10 |
AI/ |
ML research, AI frameworks (FinRL, DSPy, crawl4ai) | ~6 |
AGENTS/ |
Autonomous agents, coding agents, MCP servers, infra | ~15 |
QKX/ |
Invoice processing, financial automation, payment systems | ~13 |
XT/ |
Climate data, sustainability (Klimatkollen, Garbo) | ~2 |
See ~/dev/PROJECT_SUMMARY.md for detailed descriptions of each project.
Key active projects
- super-koala (
AGENTS/) — multi-component agent stack with LangGraph, DSPy, MCP - azure-tiger (
QKX/) — invoice extraction → ISO 20022 payment instructions - gocrwl (
AGENTS/) — Go web crawler with containerized deployment - koala-ai-stack (
AGENTS/) — local AI server infrastructure management - klimatkollen (
XT/) — Swedish municipal climate data platform
Knowledge base
When available, agents can query the shared knowledge base:
- MCP:
mcp://hyperguild.<TAILNET>.ts.net:3100/knowledge - HTTP:
http://hyperguild.<TAILNET>.ts.net:3100/api/v1/search
- Scoping: defaults to
publiccollection; client projects filter to{client}+public
Client work rules
When working on a project tagged with a client name:
- Never send code, data, or context to cloud APIs — use local models only
- Never reference other client projects or their data
- Keep all artifacts within the client's git org / directory
- Treat everything as confidential unless told otherwise
Harness-agnostic principles
This context is designed to work with any AI coding tool:
- Claude Code, Cursor, Aider, Open WebUI, Charmbracelet Mods/Crush
- Pi Coding Agent, Mistral Vibe, Antigravity
- Any tool that accepts a system prompt or reads a markdown context file
The canonical source is always .context/AGENT.md (root) and .context/PROJECT.md (per-project).
Derived files are committed (see How context propagates below) so a git pull on any host yields full agent context with no setup.
How context propagates
Canonical sources of truth:
- Universal:
~/dev/.context/AGENT.md(this file) - Project:
<repo>/.context/PROJECT.md(per-repo)
Derived files (committed, regenerated by task context:sync):
CLAUDE.md,AGENTS.md,.cursorrules,.aider.conventions.md,.context/system-prompt.txt
Workflow:
- Edit a canonical file. Run
task context:sync. Commit canonical and derived together. Push. - On any other host,
git pullbrings both. Claude Code (tree-walking) usesCLAUDE.md; Crush / Pi / Antigravity (cwd-only) useAGENTS.md; Cursor uses.cursorrules; Aider uses.aider.conventions.md. task checkrunscontext:syncthen assertsgit status --porcelainis empty over the derived files (catches both modified-tracked drift and missing-untracked adapters). A drift fails the check with a message telling you to stage the regenerated files.
Behavior rules in this file and per-project rules in PROJECT.md apply
unconditionally on every host, every harness.
Engineering Skills
Shared engineering skills are available in ~/dev/.skills/. Load on demand via the index.
See ~/dev/.skills/SKILLS_INDEX.md for the full list with descriptions and "use when" triggers.
Key skills:
- TDD: always write tests first — load
tddskill - Code Review: load
code-reviewskill before any review - SOLID/Clean Code: load
solidorclean-codeskill for design work - Problem first: load
problem-analysisskill before coding non-trivial features
Project context
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-lintwith project config - Tests: table-driven, in
_test.gonext to source,testifyfor assertions - Errors: wrap with
fmt.Errorf("operation: %w", err), no naked returns - Naming: stdlib conventions, no stuttering (
http.Clientnothttp.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
govulncheckbefore adding
MCP endpoints
Two MCP servers are live, both reachable over Tailscale and via HTTPS domain:
brainathttps://brain-mcp.d-ma.be/mcp(NodePortkoala: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 staticBRAIN_MCP_TOKEN.routingathttp://koala:30310/mcp— Mode 2 routing pod. Advertisesreview,debug,retrospective,trainer; per-call routes to local model or Claude based on brain/pass-rate. Bearer auth viaROUTING_MCP_TOKEN(opt-in). Onlymode client-localregisters 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:
- Read this file and all
SKILL.mdfiles in.skills/before starting work - Run
task checkbefore committing (lint + test + vet) - If unsure about a convention, check
DECISIONS.mdor ask - Never modify files outside the project root without explicit permission
- When adding a dependency, explain why in the commit message
- For client projects: never send code or context to cloud APIs — use local models via LiteLLM