# Mission Control 2.0 Steuerzentrale des lokalen KI-Stacks auf dem **Bosgame M5** (AMD Ryzen AI MAX+ 395 „Strix Halo", 122 GB Unified Memory, **keine dedizierte GPU** — llama.cpp über **Vulkan/RADV**). Läuft live als sudo-freier systemd-User-Dienst und ist auf **Autonomie** ausgelegt: Die Box wartet sich selbst, prüft sich selbst und meldet sich, wenn etwas nicht stimmt. > **100 % lokal.** Kein Cloud-Modell, kein externer Dienst im Datenpfad. ## Die drei Bahnen | Bahn | Was sie tut | Wo | |---|---|---| | **Steuerzentrale** | Modelle, Routing, Wartung, Gedächtnis, Ideen-Queue, Auftragsbuch | MC2 `:9001` | | **Coding** | Zed + OpenCode am Tag, `opencode-lauf.sh` in der Nacht — **ein Regelwerk, zwei Auslöser** | Governor `:8100` | | **Lucy** | Sprach-Companion mit 3D-Avatar, Augen und Ohren | eigenes Repo `Hitonabi/lucy` | Lucy holt ihr Hirn über MC2, spricht aber nie durch den Governor — ein Gespräch ist keine Bau-Sitzung und wird nie unterbrochen. ## Ports & Dienste | Port | Dienst | Erreichbar | |---|---|---| | `9001` | **MC2** (FastAPI + React) — Cockpit, API, Konsole | LAN | | `8100` | **Governor** — Token-Wächter vor dem Gateway | LAN | | `8080` | **llama-swap** — Modell-Router | LAN | | `9010` | `mc2-gateway` — `/v1`-Datenpfad (`model: auto`, Bild-Weiche) | loopback | | `8642` · `9119` | Hermes-Gateway · Hermes-Web-UI | loopback | | `8765` · `8650` | Mem0-Sidecar · Voice-Sidecar (STT/TTS) | loopback | | `7682` | ttyd — Box-Konsole, same-origin unter `/console/` | loopback | Units in [`deploy/`](deploy/): `mission-control-2` · `mc2-gateway` · `mc2-steward` · `governor` · `mem0-service` · `voice-service` · `box-console` · `hermes-builtin-ui` + Timer für Backup, Auto-Update, Self-Smoke und Bagatell-Annahme. `llama-swap` läuft als System-Unit. ## Der Weg einer Idee ``` Idee in MC2 → Gitea-Repo (mit CI-Ampel + VERIFY) → in Zed bauen → Ampel → main └── oder nachts: Hermes-Cron → opencode-lauf.sh → dieselben Regeln ``` Jedes neue Repo wird von [`deploy/gitea-repo-create.sh`](deploy/gitea-repo-create.sh) **mit beiden Wächtern geboren**: - **`.gitea/workflows/ci.yml`** — die Außen-Prüfung nach dem Push (Gitea Actions) - **`VERIFY`** — die Innen-Prüfung: eine Zeile, wie man das Projekt testet. Das OpenCode-Plugin führt sie nach jeder Etappe aus und gibt rote Tests dem Agenten **sofort** zurück, statt sie erst der CI zu zeigen. Keine `VERIFY`-Datei = Prüf-Tor aus. ## Modelle & Rollen Gemessen auf der Box (25.07.2026, Vulkan, Q4): | Rolle | Modell | Tempo | Aufgabe | |---|---|---|---| | `coder` | Qwen3-Coder-Next (80B-A3B) | **51,5 t/s** · Prefill **754 t/s** | Plant und baut — Kopf der Coding-Mannschaft | | `hermes` / `fast` | Qwen3.6-35B-A3B | **69,6 t/s** | Lucys Hirn **und** der Sucher-Subagent. Immer warm | | `kritiker` | Devstral-Small-2-24B | **15,0 t/s** · Prefill **265–318 t/s** | Liest gegen — bewusst **fremde Modellfamilie** (Mistral statt Qwen) | | `vision` | Qwen3-VL-30B-A3B | auf Abruf | Lucys Augen | | `heavy` | gpt-oss-120b | nur nachts | Chef-Gutachter (4:30). **Nie tagsüber** — verdrängt das warme Set | | `embed` · `reranker` | Qwen3 0.6B | immer warm | Gedächtnis + Feinsortierung | ‼️ **Der Kritiker ist bewusst auf 16k Kontext gedeckelt.** Devstral ist ein *dichtes* Modell — auf dieser bandbreitenbegrenzten Box bricht sein Prefill mit wachsendem Kontext ein (bei 32k gemessene 63 t/s ≈ **9 Minuten nur zum Lesen**). Mit dem 16k-Deckel bleibt der schlimmste Fall je Review unter einer Minute. Deshalb ist er der **Gegenleser für Etappen**, nicht der Coder — als Coder ist er auf dieser Box disqualifiziert (siehe VERDIKTE). ‼️ **Speicher-Regel:** `Warm-Set + größtes On-Demand-Modell ≤ ~115 GB`. Die ko-residente Gruppe (`groups.brains` in der llama-swap-Config) muss **`persistent: false`** sein — sonst räumt llama-swap vor einem großen Modell nicht ab und der Kernel schießt Prozesse ab. Details und Messwerte: [`docs/wissen/VERDIKTE.md`](docs/wissen/VERDIKTE.md). ## Qualitäts-Tore 1. **Werkzeug-Zaun** ([`deploy/opencode/plugin/`](deploy/opencode/plugin/)) — blockt `git push`, `rm -rf`, `sudo`, `curl | sh` und Fremd-Hosts im Agentenlauf. 2. **Prüf-Tor** — `VERIFY` nach jeder Etappe; rot → der Agent repariert selbst weiter (max. 3 Runden). 3. **Governor** ([`deploy/governor/`](deploy/governor/)) — zählt Tokens ehrlich (aus den echten `usage.prompt_tokens` jeder Antwort, selbstkalibrierend). Bei ~45.000: Savepoint schreiben und Sitzung sauber beenden. Bei ~50.000: harter Riegel. Sichtbar als Kachel im Cockpit. 4. **CI-Ampel** — Lint (ruff) · Import/Syntax (compileall) · Frontend-Build. Läuft bei jedem Push. Gemeinsame Lehre dahinter: **Wissen lebt in Datei + git, nicht im schrumpfenden Chat-Kontext.** Kontext-Komprimierung löscht still die Regeln mit. ## Selbsterhaltung - **Health-Wächter** (`sentry`) + **Warm-Set-Wächter** (`warmer`, per Env abschaltbar) - **Updates mit Fangnetz** — Backup → Update → Postcheck → bei Fehler **Auto-Rollback + Pin** - **Melde-Briefkasten** (`/api/voice/announce`) — alles, was die Box von sich aus sagen will; Lucy pollt ihn und spricht es. Absender `loop` = Coding-Ereignisse - **Gedächtnis** — Mem0-Sidecar, auto-lernend, semantisch, mit Auto-Dedupe - Tägliche Self-Smokes, Zeitmaschine (Snapshot + Ein-Klick-Restore), Chronik der autonomen Taten ## API (Auswahl) `health · models/* · discover · fit · groups · routing/* · system/* · maintenance/* · connect · memory/* · agent/* · **governor** · ideen/* · auftragsbuch/* · chronik · eigenleben · wissen · zeitmaschine/* · reminders/* · voice/* · events (SSE)` OpenAI-kompatibel: `/v1/chat/completions`, `/v1/completions`. MCP-Server: [`mcp/`](mcp/). ## Entwickeln ```bash # Backend cd backend python -m venv .venv && .venv/Scripts/python -m pip install -r requirements.txt # Windows .venv/Scripts/python -m uvicorn app:app --port 9000 # Frontend (Dev, proxyt /api → :9000) cd frontend && npm install && npm run dev # http://localhost:5173 # Frontend (Build → wird vom Backend ausgeliefert) cd frontend && npm run build # → frontend/dist ``` `frontend/dist` **wird mitcommittet** — die Box hat kein Node; Deploy ist ein `git pull` plus Dienst-Neustart. Vor jedem Commit lohnt der Ampel-Vorlauf: `ruff check .` und `npm run build`. ## Env-Vars (Auswahl) | Variable | Default | Zweck | |---|---|---| | `MC_PORT` | `9000` | MC-Backend-Port (**die Unit auf der Box setzt `9001`**) | | `MC_LLAMA_SWAP_URL` | `http://127.0.0.1:8080` | Engine/Router | | `MC_CONFIG_PATH` | `/etc/llama-swap/config.yaml` | llama-swap-Config | | `MC_V1_UPSTREAM` | – | gesetzt → `/v1` geht an `mc2-gateway` (`:9010`) statt in-process | | `MC_GOVERNOR_URL` | `http://127.0.0.1:8100` | Token-Wächter für die Cockpit-Kachel | | `MC_ENGINE_PATH` | `/opt/llamacpp-vulkan` | aktive Engine (Vulkan-Build) | | `MC_REWARM_ENABLED` | `1` | Warm-Set-Wächter (auf der Box bewusst `0`) | | `MC_DRAFTS_DIR` · `MC_SPEC_TYPE` | `$MODELS/drafts` · `draft-simple` | Spekulatives Dekodieren | Governor-eigene Schalter (`GOV_THRESHOLD`, `GOV_HARD_CEILING`, `GOV_EXEMPT_MODELS`, …): [`deploy/governor/README.md`](deploy/governor/README.md). ## Weiterlesen | Dokument | Inhalt | |---|---| | [`docs/BEDIENUNG.md`](docs/BEDIENUNG.md) | Wie man MC2 benutzt | | [`docs/RUNBOOK.md`](docs/RUNBOOK.md) · [`docs/DISASTER_RECOVERY.md`](docs/DISASTER_RECOVERY.md) | Betrieb, Störungen, Wiederherstellung | | [`docs/HERMES_SETUP.md`](docs/HERMES_SETUP.md) | Hermes-Agent, Profile, Crons | | [`docs/AUFTRAGSBUCH.md`](docs/AUFTRAGSBUCH.md) | Vorschlags-Inbox und das Ein-Klick-Gate | | [`docs/wissen/VERDIKTE.md`](docs/wissen/VERDIKTE.md) | **Finale Technik-Entscheide — nicht neu aufrollen** | | [`docs/wissen/FALLEN.md`](docs/wissen/FALLEN.md) · [`docs/wissen/OFFENE-FAEDEN.md`](docs/wissen/OFFENE-FAEDEN.md) | Stolpersteine · offene Punkte | | [`deploy/opencode/README.md`](deploy/opencode/README.md) | Coding-Bahn: Mannschaft, Verteilung, Fallen | | [`AGENTS.md`](AGENTS.md) | Arbeitsregeln für Agenten in diesem Repo |