# Stack-Wahrheiten — Maschinen, Dienste, Modelle, Automatik _Stand 24.09.2026. Quellen: Code in `main` (`4cd856b`: Units, `deploy/llama-swap.config.yaml`, Skripte) und die Prüfberichte vom 24.09.2026 (live auf der Box gelesen). Bei Widerspruch zu anderen Dokumenten gewinnt diese Datei. Wer sie ändert: erst messen, dann schreiben, Datum dazu._ ## Maschinen und Zugänge | Was | Wo | Stand | |---|---|---| | **KI-Box** — Bosgame M5, AMD Ryzen AI MAX+ 395 (gfx1151), 128 GB gemeinsamer Speicher (~122 GB nutzbar) | `hitonabi@192.168.178.151` (SSH) · Ubuntu 26.04.1 · Zeitzone Europe/Berlin | 24.09. | | **Windows-PC** (Dev-PC, OpenChamber) | `192.168.178.22` | 23.09. | | **Proxmox-Host** | `192.168.178.108` · Container 100 AdGuard, 101 NPMplus, 102 NetBird, 103 PVE Scripts Local, 104 Gitea, 105 PBS · VM 106 Arcane (Docker, u. a. NerdQuiz) | 24.09. | | **Gitea** | `192.168.178.153` · HTTP `:3000` · SSH `:2222`, Benutzer `gitea` | 21.08. | | **PBS** | `192.168.178.156:8007` | 07/2026, nicht neu geprüft | | **QNAP** | `192.168.178.62` | 07/2026, nicht neu geprüft | ## Repos - **Homelab Orchestrator / Box-Wart (dieses Repo):** PC `F:\Coding Stuff\mission-control-2` ↔ Gitea `Hitonabi/mission-control-v2` ↔ Box `~/mission-control-v2`. Auf Gitea nur `main` plus zwei Archiv-Tags (`git tag -l 'archiv/*'`). `frontend/dist` ist committet (die Box baut kein Frontend). - **Lucy (Desktop-App):** `F:\Coding Stuff\lucy` ↔ `Hitonabi/lucy` (Electron, eigenes Repo). ## Dienste auf der Box | Unit | Art | Port | Aufgabe | 24.09. | |---|---|---|---|---| | `llama-swap` | System | `:8080` | Modell-Router, startet je Modell einen `llama-server` (Vulkan, `/opt/llamacpp-vulkan`), liest die Config mit `--watch-config` | läuft | | `mission-control-2` | User | `:9001` | Box-Wart: Oberfläche, 60 `/api`-Routen, `/v1`-Weiterleitung, `/hermes-ui/`, Erinnerungen | läuft | | `mc2-gateway` | User | `127.0.0.1:9010` | `/v1`-Datenpfad: `model: auto`, Bild-Weiche | läuft | | `mc2-steward` | User | – | Wächter und Re-Warm (hält das Hirn geladen) | läuft | | `hermes-gateway` | User | `:8642` | Hermes Agent „Lucy", Telegram | läuft | | `hermes-builtin-ui` | User | `:9119` | Hermes-Dashboard, in MC2 unter `/hermes-ui/` | läuft | | `lucy-stimme` | User | `127.0.0.1:8021` | Lucys Stimme (pocket-tts `german_24l`) | läuft | | `voice-service` | User | `127.0.0.1:8650` | Spracherkennung für Lucy-Desktop | schläft | | `box-console` | User | `7682` (nur lo) | Web-Konsole (ttyd) | schläft | „Schläft" = `systemctl --user disable --now` (User-Entscheid 24.09.): kein Fehler für den Wächter, in der Oberfläche grau mit Knopf „Wecken". Die Android-App (Phase 5) braucht die Spracherkennung wieder. Versionen (Prüfbericht 24.09.): llama.cpp b11147, llama-swap v257, Hermes Agent v0.21.4, Python 3.14 im Box-Wart-venv, Kernel 7.0.0-34 (seit dem Neustart am 24.09. 14:51). ‼ User-Units per SSH nur mit `export XDG_RUNTIME_DIR=/run/user/$(id -u)` vor `systemctl --user`. Units im Repo (`deploy/`, spielt `deploy.sh` aus): `mission-control-2` (+ Override), `mc2-gateway`, `mc2-steward` (+ Warm-Set-Drop-in), `lucy-stimme`, `voice-service`, `box-console` und die Paare `mc2-radar`, `mc2-backup`, `mc2-morgenmeldung`, `mc2-autoupdate`, `projekte-sync` (.service/.timer). Nicht im Repo: `llama-swap.service` samt Drop-ins (Inhalt: [WIEDERAUFBAU.md](../WIEDERAUFBAU.md), Anhang A), `hermes-gateway.service` (legt Hermes an) und `hermes-builtin-ui.service` samt Drop-ins. Seit 24.09. liegen alle User-Units und die llama-swap-Drop-ins als Kopie in jeder Sicherung. ## Modelle (llama-swap, Config vom 24.09.2026) Warm ist nur das Hirn (Gruppe `brains`: `swap: false`, `persistent: true`, `exclusive: false`). Alles andere lädt bei Bedarf und geht nach Ablauf von `ttl` (Sekunden) wieder raus. | Modell | Alias | Gruppe | ttl | Kontext | Tempo (13k Kontext) | Anmerkung | |---|---|---|---|---|---|---| | Qwen3.6-35B-A3B | `hermes`, `fast` | `brains` | 0 | 2 × 65 536 | 100,8 t/s (Prüfstand 17.09.) | **Hirn** (MoE, 3B aktiv), DFlash-Draft, KV q8_0, `--reasoning-budget 2048` | | Qwen3.6-35B-A3B, Bild-Zwilling (Eintrag `…-Bild`) | `vision` | `bild` | 900 | 65 536 | 67,9 t/s (Probe 24.09.) | gleiche Gewichte plus Projektor, ohne Draft | | Qwen3.8-27B | `coder`, `heavy` | – | 5400 | 131 072 | 30,4 t/s (Prüfstand 17.09.) | **Coder** (dicht), DFlash2-Draft; ohne Draft ~12,6 t/s | | Qwen3.8-27B, Bild-Zwilling (Eintrag `…-Bild`) | `coder-bild` | `bild` | 900 | 131 072 | 12,5 t/s (Probe 24.09.) | gleiche Gewichte plus Projektor, ohne Draft | | Muse-Glimmer-30B | `debugger` | – | 600 | 65 536 | – | Rolle entfällt (Entscheid 23.09.), Löschkandidat | | Qwen3-Embedding-0.6B | `embed` | – | 300 | 8 192 | – | schläft seit 24.09. (lädt bei Bedarf) | | Qwen3-Reranker-0.6B | `reranker` | – | 300 | 8 192 | – | schläft seit 24.09. (lädt bei Bedarf) | | gpt-oss-120b | – | – | 600 | 32 768 | – | ohne Rolle seit 04.09., Löschkandidat (60 GB) | | Qwen3-VL-30B-A3B | – | – | 900 | 32 768 | – | ohne Rolle seit 24.09., Löschkandidat | - Hirn und Coder laufen seit 17.09. als Varianten der Basismodelle (Prüfstand: Hirn 100,8 statt 92,8 t/s, Coder 30,4 statt 26,2 t/s). Die Originale liegen als Rückweg auf der Platte (`Qwen3.6-35B-A3B-MTP-GGUF`, `Qwen3.8-27B-GGUF`). - Reserve-Hirn: Nemotron 3.5 Lightning 30B-A3B (Prüfstand 17.09.: 91,8 t/s, Werkzeuge 3/3), liegt unter `/srv/models/Nemotron-3.5-Lightning-30B-A3B-GGUF/`, ohne Eintrag. - Bilder: Das Gateway schickt eine Anfrage mit Bild im aktuellen Schritt an den Zwilling der Rolle; ältere Bilder beschreibt `vision` einmal als Text. Grund: llama.cpp kann Draft und Bild nicht zusammen (HTTP 500, b11057 und b11157 geprüft). - Speicherregel: Warm-Set plus größtes Bedarfsmodell ≤ ~115 GB. Schlimmster Fall heute laut Config: Warm-Set 27 + Coder 29 + ein Zwilling ~25 GB ≈ 81 GB. - Dichte Modelle sind bandbreitengebunden (~215 GB/s): 17 GB Gewichte ÷ 215 GB/s ≈ 12,6 t/s ohne Draft. - Clients sprechen Modelle nur über **Rollen-Aliase** an, nie über Eintragsnamen (die ändern sich beim Tausch). Config: `/etc/llama-swap/config.yaml` ist die lebende Wahrheit (Oberfläche und Radar schreiben sie), `deploy/llama-swap.config.yaml` nur der Abzug im Repo. Regeln dazu: [ARCHITEKTUR.md](../ARCHITEKTUR.md). ## Hermes (Agent „Lucy") - **v0.21.4** (Prüfbericht 24.09.), Git-Install in `~/.hermes/hermes-agent`, Config `~/.hermes/config.yaml`, Persona `~/.hermes/SOUL.md`, Gedächtnis `~/.hermes/memories/` (Hermes führt es selbst; alleinige Gedächtnis-Wahrheit). - Hirn über `mc2-gateway` (`:9010`); Bilder seit 24.09. über `model.supports_vision: true` und die Bild-Weiche. - `approvals.mode: 'off'`, `approvals.cron_mode: auto` — User-Entscheid, bestätigt 17.09.2026. - MCP-Server: aktiv `hermes-web-fetch` (`mcp/mcp_web.py`) und `mission-control-voice` (`mcp/mcp_voice.py`); aus seit 24.09. `hermes-pc-control` (`mcp/mcp_pc.py`, dazu die PC-Aufgabe `HermesPCExecutor`) und `mission-control-stack` (`mcp/mcp_mc.py`). - Plugin `mc2-web-lesen` (`deploy/hermes-plugins/`): liest Webseiten für `web_extract` lokal (`web.extract_backend: mc2-lesen`). - Skills aus dem Repo: `betrieb-playbook`, `pc-pfad-cache` (`deploy.sh` kopiert sie nach `~/.hermes/skills/`); abgelöste Skills liegen in `~/.hermes/skills-archiv/`. - Hermes-Crons (`bash -lc 'hermes cron list'`): „Daily News Report" (täglich 07:00), „KI und Stack Radar" (Sa 08:00). „Updates am Sonntag" ist seit 24.09. pausiert — das macht jetzt `mc2-autoupdate.timer`. ## Automatik (was von allein läuft) | Wann | Was | Wie | Details | |---|---|---|---| | jede Minute | Wächter: Dienste, Timer, Hermes-Jobs, Kern, Platte, festgehaltene Updates | `mc2-steward` | [BETRIEB.md](../BETRIEB.md) | | alle 90 s | Re-Warm: lädt das Hirn nach, wenn nichts geladen ist | `mc2-steward` | [ARCHITEKTUR.md](../ARCHITEKTUR.md) | | stündlich (+≤5 min) | `projekte-sync`: `~/projekte` mit Gitea abgleichen (nur fast-forward) | Timer | [BETRIEB.md](../BETRIEB.md) | | 00:30 | Modell-Radar: Suche (≤1× am Tag), Test im Fenster 00:30–02:30 | `mc2-radar.timer` | [RADAR.md](../RADAR.md) | | ~03:00 | NerdQuiz-Nachtlauf (Arcane) fragt das Hirn direkt über `:8080` | extern | [RADAR.md](../RADAR.md) | | 03:30 (+≤5 min) | Sicherung, danach Kopie auf den Proxmox-Host | `mc2-backup.timer` | [BETRIEB.md](../BETRIEB.md) | | So 04:30 (+≤10 min) | Updates: llama-swap → Motor → Hermes, Neustart nur So 04:00–06:59 | `mc2-autoupdate.timer` | [UPDATES.md](../UPDATES.md) | | 07:00 | Morgenmeldung: nachts Gesammeltes als eine Telegram-Nachricht | `mc2-morgenmeldung.timer` | [BETRIEB.md](../BETRIEB.md) | | 07:00 | Daily News Report (Text und Sprachnachricht) | Hermes-Cron | [deploy/jobs/README.md](../../deploy/jobs/README.md) | | Sa 08:00 | KI und Stack Radar | Hermes-Cron | [RADAR.md](../RADAR.md) | | laufend | OS-Sicherheitsupdates | unattended-upgrades | [UPDATES.md](../UPDATES.md) | ## Coding-Bahn (OpenChamber) - OpenChamber läuft am PC mit seiner eigenen OpenCode-CLI; die Dateien liegen lokal unter `F:\Coding Stuff\…`. - Von der Box kommt nur das Modell: Provider `aibox` → `http://192.168.178.151:9001/v1`, Rollen-Aliase (`build` = `coder`, `plan`/`review` = `heavy`, `explore` und `small_model` = `hermes`). Vorlage der PC-Config: `deploy/opencode-config/`. - Push nach Gitea über SSH (`:2222`, Benutzer `gitea`). `deploy/push-und-sync.ps1` stößt danach `projekte-sync` auf der Box sofort an. - `projekte-sync` zieht `mission-control-v2` absichtlich nicht: Der Box-Checkout wird nur über `deploy/deploy.sh` aktualisiert. ## Sicherheit (ein Satz) Der Box-Wart hat keine Anmeldung (User-Entscheid 24.09.), schreibende `/api`-Aufrufe fremder Webseiten lehnt die Herkunftsprüfung ab (`backend/services/herkunft.py`), und Security-Config (approvals, Tokens, ufw, command_allowlist, sudoers) ändert niemand ohne ausdrückliches User-Ja. ## Deploy und Sicherung (Kurzform) - Deploy: `main` auf Gitea, dann auf der Box `bash ~/mission-control-v2/deploy/deploy.sh` — zweistufig, mit Prüftor, Rückweg und Log `/srv/models/mc2-deploy.log`. Details: [BETRIEB.md](../BETRIEB.md). - Sicherung: täglich, 14 Stück unter `/srv/models/mc2-backups/`, Kopie auf dem Proxmox-Host, Zurückspielen per Oberfläche oder `deploy/restore.sh`. Details: [BETRIEB.md](../BETRIEB.md).