diff --git a/AGENTS.md b/AGENTS.md index 0e5648d..731f08a 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -48,6 +48,14 @@ Engine (llama-swap) · Builtin-Routing-Gateway (`model: auto`) · MC2 (FastAPI + - **Gate vor Commit:** `python -m py_compile ` muss durchlaufen. - Wartung ist **sudo-frei** gedacht (systemctl --user). Wo doch sudo nötig ist (llama-swap = System-Dienst), sauber über die NOPASSWD-Whitelist / `password_required`-Rückgabe, nie hart failen. +- ‼️ **Die feingranularen sudoers.d-Regeln sind faktisch wirkungslos.** In `/etc/sudoers` steht + `hitonabi ALL=(ALL) NOPASSWD: ALL` — der Nutzer, unter dem alle MC2-Dienste laufen, darf ohnehin + alles passwortlos. `sudoers.d/mc2-autonomie` und `sudoers.d/mission-control` dokumentieren also, + was gebraucht *würde*, schränken aber nichts ein. Das ist eine bewusste Entscheidung für die + Single-User-Appliance; verlasse dich beim Bauen nicht darauf, dass eine Whitelist dich bremst. + Wer das wirklich härten will, kommt um einen eigenen Service-User nicht herum — die Pauschalzeile + einfach zu ziehen, bricht OS-Update, Config-Sync und den wöchentlichen Auto-Neustart still. + (Geprüft 27.08.2026; die doppelte Zeile wurde damals entfernt, Sicherung `/root/sudoers.bak-*`.) - Lokal (Windows) müssen Box-Shell-Befehle **harmlos fehlschlagen** statt zu crashen. ## Grenzen (Verdikt, eingehalten) diff --git a/README.md b/README.md index 014b8f9..70a34af 100644 --- a/README.md +++ b/README.md @@ -49,29 +49,33 @@ Wächtern geboren**: ## Modelle & Rollen -Gemessen auf der Box (Stand: August 2026, Vulkan b10502): +Gemessen auf der Box (Stand: 27.08.2026, Vulkan b10653): | 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 (131k Kontext) | -| `hermes` / `fast` | Qwen3.6-35B-A3B | **69,6–90 t/s** | Lucys Hirn **und** Sucher-Subagent. Immer warm | -| `debugger` / `doctor` | Muse-Glimmer-30B | **40–50 t/s** (DFlash) | Runtime-Debugger & Fehler-Diagnostiker (Multimodal) | -| `kritiker` | Devstral-Small-2-24B | **15,0 t/s** · Prefill **265–318 t/s** | Liest gegen — bewusst **fremde Modellfamilie** (Mistral statt Qwen, 16k Deckel) | +| `coder` | Qwen3.8-27B (dicht, 27B) | **12,7 t/s** | Plant und baut — der Haupt-Coder. **131k Kontext** (ganzer Slot), multimodal | +| `hermes` / `fast` | Qwen3.6-35B-A3B | **69,6–90 t/s** | Lucys Hirn **und** Sucher-Subagent. Immer warm, 65k/Slot | +| `debugger` | Muse-Glimmer-30B | **40–50 t/s** (DFlash) | Runtime-Debugger & Fehler-Diagnostiker (multimodal) | | `vision` | Qwen3-VL-30B-A3B | auf Abruf | Lucys Augen (On-Demand) | -| `scout` | GLM-4.6V-Flash | auf Abruf | Schneller Vision- und Tool-Allrounder | | `heavy` | gpt-oss-120b | nur nachts | Chef-Gutachter (4:30 Uhr). **Nie tagsüber** — verdrängt das warme Set | -| `dense-planer` | Qwen3.8-27B | **12,7 t/s** (On-Demand) | Dichtes 27B-Modell für tiefes Reasoning & 262k Kontext | -| `embed` · `reranker` | Qwen3 0.6B | immer warm | Gedächtnis + Feinsortierung | +| `embed` · `reranker` | Qwen3 0.6B | immer warm | Vektorsuche + 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). +> Sieben Rollen, mehr nicht. Frühere Fassungen listeten hier auch `kritiker`, `scout` und +> `dense-planer` — die Modell-Konsolidierung vom 19.08. hat sie entfernt (ein Coder, ein +> Agent-Hirn). Der dichte 27B ist seither nicht mehr „Planer" neben dem Coder, sondern **ist** +> der Coder. Details: `docs/wissen/STACK.md`. + +‼️ **Dichte Modelle sind auf dieser Box bandbreitengebunden.** Der Prefill bricht mit wachsendem +Kontext ein — beim früheren Kritiker (Devstral, dicht) waren bei 32k gemessene 63 t/s ≈ **9 Minuten +nur zum Lesen**, weshalb er hart auf 16k gedeckelt war. Das gilt weiter für jedes dichte Modell: +`coder` (Qwen3.8-27B) liefert ~12,7 t/s gegen ~90 t/s des MoE-Hirns — **kein Konfigfehler, sondern +das 215-GB/s-Limit der Plattform.** Der Kritiker selbst ist seit dem 19.08. nicht mehr im Stack. ‼️ **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 +(`groups.brains`) steht auf **`persistent: true`** (Verdrängungsschutz; live gegengeprüft +27.08.2026). Wichtig ist nicht der Schalter, sondern: **alles, was gleichzeitig warm sein muss, +gehört in DIESELBE Gruppe** — zwei Gruppen verdrängen sich gegenseitig, und `persistent` schützt +nicht davor (gemessen 25.07.). Details und Messwerte: [`docs/wissen/VERDIKTE.md`](docs/wissen/VERDIKTE.md). ## Qualitäts-Tore diff --git a/backend/config.py b/backend/config.py index af24707..d712ac8 100644 --- a/backend/config.py +++ b/backend/config.py @@ -105,8 +105,12 @@ BOX_CONSOLE_UPSTREAM = os.environ.get("MC_BOX_CONSOLE_UPSTREAM", "http://127.0.0 # Öffentlicher, gleicher-Ursprung-Pfad, unter dem MC2 die Konsole ausliefert (iframe-Ziel). BOX_CONSOLE_PATH = "/console/" # Eingebaute Hermes-Web-GUI (`hermes serve`/`dashboard` — die richtige Agent-Oberfläche mit -# Threads/Tool-Calls, die auch die Electron-Desktop-App umhüllt). Bindet NUR an Loopback -# (127.0.0.1:9119, kein Login — LAN-Trust wie Terminal/Konsole) und wird von MC2 same-origin unter +# Threads/Tool-Calls, die auch die Electron-Desktop-App umhüllt). ‼️ Sie bindet NICHT auf Loopback: +# ein systemd-Drop-in überschreibt `--host 127.0.0.1` mit `0.0.0.0` und setzt dafür ein +# Session-Token. Dass sie trotzdem nicht im LAN hängt, liegt allein an ufw (9119 ist nicht +# freigegeben — am 27.08.2026 von einem zweiten Rechner aus gegengeprüft). Wer die Firewall +# anfasst, öffnet damit auch diese Oberfläche. MC2 erreicht sie über Loopback und reicht sie +# same-origin unter # /hermes-ui/ durchgereicht (routers/hermes_ui.py). Anders als das ttyd-Terminal ist es eine volle # SPA → das Bundle wird mit Vite-base=/hermes-ui/ gebaut, damit Assets/API/WS unter dem Präfix # liegen; der Proxy streift /hermes-ui ab. Kein eigener Firewall-Port nötig. diff --git a/deploy/deploy.sh b/deploy/deploy.sh index 50c4f14..ab2073b 100644 --- a/deploy/deploy.sh +++ b/deploy/deploy.sh @@ -25,8 +25,8 @@ main() { # ‼️ ACHTUNG (27.08.2026): /etc/llama-swap/config.yaml ist die LEBENDE Wahrheit — MC2 # schreibt sie selbst (backend/services/llamaswap.py::write_config), sobald jemand über # die Oberfläche ein Modell hinzufügt oder eine Rolle ändert. deploy/llama-swap.config.yaml - # ist nur ein Abzug und hinkt regelmäßig hinterher (aktuell fehlt ihm z. B. der - # `kritiker`/Devstral-Eintrag, den STACK.md und der Modell-Katalog voraussetzen). + # ist nur ein Abzug und hinkt regelmäßig hinterher (erlebt: der Coder-Vollkontext aus 34a9862 + # stand tagelang nur live, nicht im Abzug — ein Deploy hätte ihn zurückgesetzt). # Bis hierher wurde die Live-Datei kommentarlos mit dem Abzug überschrieben — alles per # UI Hinzugefügte war nach jedem Deploy weg. Jetzt: erst sichern, dann kopieren, und die # Abweichung sichtbar machen. MC_DEPLOY_SKIP_SWAP_CONFIG=1 überspringt den Schritt ganz. diff --git a/docs/wissen/STACK.md b/docs/wissen/STACK.md index eb74bf2..f5c71ba 100644 --- a/docs/wissen/STACK.md +++ b/docs/wissen/STACK.md @@ -43,28 +43,35 @@ diese Datei. Wer sie ändert: erst messen, dann schreiben._ ## Modell-Stack (llama-swap, live 19.08.2026) -**Warm-Set (Gruppe `brains`, swap:false, persistent:false, alle ttl 0):** +**Warm-Set (Gruppe `brains`, swap:false, persistent:true, alle ttl 0):** Qwen3.6-35B-A3B + Qwen3-Embedding-0.6B + Qwen3-Reranker-0.6B. Sonst NICHTS dauerhaft warm. | Alias/Rolle | Modell | ttl | Notizen | |---|---|---|---| | `hermes` + `fast` | Qwen3.6-35B-A3B (UD-Q4_K_M, DFlash) | 0 | Agent-Hirn. `-c 131072 --parallel 2` → **65536/Slot**, KV **q8_0**, ~70–90 t/s | -| `coder` | Qwen3-Coder-Next (Q4_K_M) | 5400 | 131k ctx; Autonomer Coder & Builder (80B MoE, 51,5 t/s) | -| `debugger` / `doctor` | Muse-Glimmer-30B (Q4_K_XL, DFlash) | 600 | 65k ctx; Runtime-Diagnostik & Fehler-Debugger (Multimodal) | -| `kritiker` | Devstral-Small-2-24B (Q4_K_M) | 1800 | 16k ctx Deckel; Fremdblick-Code-Reviewer gegen Halluzinationen | -| `vision` | Qwen3-VL-30B-A3B (Q4_K_M) | 900 | Multimodal-Augen (On-Demand) | -| `scout` | GLM-4.6V-Flash (Q4_K_M) | 300 | Schneller Tool- und Vision-Allrounder | -| `heavy` | gpt-oss-120b (mxfp4) | 600 | 32k ctx; Chef-Gutachter (nur nachts / gezielter On-Demand Call) | -| `dense-planer` | Qwen3.8-27B (Q4_K_M, BF16 mmproj) | 300 | 65k ctx; Dichtes 27B-Modell für tiefes Planen & Multimodalität | -| `reranker` | Qwen3-Reranker-0.6B (q8_0, Mungert) | 0 | Gedächtnis-Sortierer (`/v1/rerank`) | -| `embed` | Qwen3-Embedding-0.6B (f16) | 0 | Vektorisierung für Chroma / Mem0 | +| `coder` | Qwen3.8-27B (Q4_K_M, mmproj BF16) | 5400 | **131072 ctx** — `--parallel 1`, der Coder bekommt den ganzen Slot (34a9862). Multimodal, ~12,7 t/s (dicht = bandbreitengebunden) | +| `debugger` | Muse-Glimmer-30B (Q4_K_XL, DFlash) | 600 | 65536 ctx; Runtime-Diagnostik & Fehler-Debugger (multimodal) | +| `vision` | Qwen3-VL-30B-A3B-Instruct (Q4_K_M) | 900 | 32768 ctx; Multimodal-Augen (On-Demand) | +| `heavy` | gpt-oss-120b (mxfp4) | 600 | 32768 ctx; Chef-Gutachter (nur nachts / gezielter On-Demand-Call) | +| `reranker` | Qwen3-Reranker-0.6B (q8_0, Mungert) | 0 | Sortiert Suchtreffer nach echter Relevanz (`/v1/rerank`) | +| `embed` | Qwen3-Embedding-0.6B (f16) | 0 | Vektorisierung für Suche/Sortierung | + +> **Diese sieben sind ALLES** — abgeglichen mit `/etc/llama-swap/config.yaml` am 27.08.2026. +> Frühere Tabellen führten zusätzlich `kritiker` (Devstral-Small-2-24B), `scout` (GLM-4.6V-Flash), +> `dense-planer` und `doctor`. Die gibt es nicht mehr: die Modell-Konsolidierung (`9a35be9`, 19.08.) +> warf sie aus llama-swap, und `fremdblick.sh` — der einzige Aufrufer des Kritikers — fiel mit dem +> MC2-Kahlschlag (`1e68f62`). Gewollt so: **ein Coder, ein Agent-Hirn.** `kritiker` und `scout` stehen +> weiterhin in `ROLE_IDS` (backend/services/llamaswap.py) — das ist die Liste besetzbarer Rollen, +> keine Zusage, dass sie besetzt sind. Config: `/etc/llama-swap/config.yaml` (sudo zum Schreiben). ## Hermes (Agent) -- **v0.20.4** (git-Install `~/.hermes/hermes-agent`), Config `~/.hermes/config.yaml`, Persona `~/.hermes/SOUL.md` = **Lucy**. -- **Bot Mode:** Unterstützt Multi-Bot-Roster (`Lucy` als Haupt-Agentin, `Coder` mit `Qwen3-Coder-Next`, `Debugger` mit `Muse-Glimmer-30B`). +- **v0.20.6** (2026.8.27, git-Install `~/.hermes/hermes-agent`), Config `~/.hermes/config.yaml`, Persona `~/.hermes/SOUL.md` = **Lucy**. +- **Bot-Roster: leer** (live geprüft 27.08.2026). Hermes *kann* mehrere Bots, genutzt wird es nicht — + die Profile fahren `hermes`, `fast` und `vision`. Frühere Fassungen behaupteten hier einen Roster + mit `Coder`/`Qwen3-Coder-Next` und `Debugger`; beides trifft nicht zu. - `approvals.mode: smart`, `approvals.cron_mode: deny`. - MCP-Server (aus `~/mission-control-v2/mcp/`): mission-control-stack, hermes-pc-control, hermes-web-fetch, mcp_voice. (`mission-control-memory` ist am 27.08.2026 entfallen — Hermes führt sein Gedächtnis selbst.)