From 59631601b9628308ef652dab567b2d54d7535985 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 24 Sep 2026 15:31:00 +0200 Subject: [PATCH 1/5] doku: Historisches ins Archiv, Ueberfluessiges geloescht - 19 Dateien nach docs/archiv/ mit Datumspraefix (JJJJ-MM-TT-): SAVEPOINT, Autonomie-, Optimierungs- und TTS-Plan, Review 02.07., ZeroClaw-Auftrag und -Ergebnis, Hermes-Setup, Gemini-Briefing, Antigravity-Review-Prompt, Zielbild, Uebergabe Drei Welten, Umbauplan Abloesung, Hermes-Werkzeuge, Raphael, die drei Dateien aus docs/aufgaben und der Skill-Text gitea-workflow. - Die alte Liste OFFENE-FAEDEN (Stand 04.09.) ebenfalls ins Archiv; sie enthaelt die Lucy-Faeden, die sonst verloren gingen. Die neue Liste folgt im naechsten Schritt. - Geloescht (kein eigenes Wissen, Git-Historie reicht): docs/memory/* (4 Kopien der Claude-Notizen vom Juni), STATUS, CUTOVER, AUDIT_KICKOFF, CLAUDE_CODE_BRIEF, UPGRADE und skills/orchestrator.md (Quelle war der Skill selbst). - Formatfehler im Archiv behoben: uebrig gebliebene -Tags im Optimierungsplan und im ZeroClaw-Auftrag; toter Link auf GEDAECHTNIS-BEREICHE.md zeigt jetzt auf die Git-Historie (geloescht am 07.08., c3851f8). Co-Authored-By: Claude Opus 5.5 --- docs/AUDIT_KICKOFF.md | 75 ------- docs/CLAUDE_CODE_BRIEF_lucy-brain-role.md | 106 ---------- docs/CUTOVER.md | 45 ---- docs/STATUS.md | 57 ----- docs/UPGRADE.md | 35 ---- .../2026-06-30-lucy-tts-plan.md} | 0 .../2026-06-30-optimierungsplan.md} | 1 - .../2026-06-30-zeroclaw-poc-auftrag.md} | 1 - .../2026-06-30-zeroclaw-poc-ergebnis.md} | 0 .../2026-07-02-autonomie-plan.md} | 0 .../2026-07-02-komplett-review.md} | 0 .../2026-07-06-antigravity-review-prompt.md} | 0 .../2026-07-10-gemini-briefing.md} | 0 .../2026-07-10-zielbild-abloesung.md} | 0 .../2026-07-15-umbauplan-abloesung.md} | 0 .../2026-07-19-uebergabe-drei-welten.md} | 2 +- .../2026-07-21-skill-gitea-workflow.md} | 0 .../2026-08-07-hermes-setup.md} | 0 .../2026-08-20-referenz-check.sh} | 0 ...2026-08-20-referenzaufgabe-mem0-ausbau.md} | 0 .../archiv/2026-08-20-savepoint.md | 0 .../2026-08-21-hermes-werkzeuge.md} | 0 .../2026-08-21-umbau-openchamber.md} | 0 .../2026-09-04-offene-faeden-alt.md} | 0 .../2026-09-04-raphael-lucy-innere-stimme.md} | 0 docs/memory/project-hermes-setup.md | 75 ------- docs/memory/project-mc2-architecture.md | 78 ------- docs/memory/project-pending-tasks.md | 51 ----- docs/memory/project-stack-state.md | 76 ------- docs/skills/orchestrator.md | 198 ------------------ 30 files changed, 1 insertion(+), 799 deletions(-) delete mode 100644 docs/AUDIT_KICKOFF.md delete mode 100644 docs/CLAUDE_CODE_BRIEF_lucy-brain-role.md delete mode 100644 docs/CUTOVER.md delete mode 100644 docs/STATUS.md delete mode 100644 docs/UPGRADE.md rename docs/{LUCY_TTS_PLAN.md => archiv/2026-06-30-lucy-tts-plan.md} (100%) rename docs/{OPTIMIZATION_PLAN.md => archiv/2026-06-30-optimierungsplan.md} (99%) rename docs/{ZEROCLAW_POC_BRIEF.md => archiv/2026-06-30-zeroclaw-poc-auftrag.md} (98%) rename docs/{ZEROCLAW_POC_RESULTS.md => archiv/2026-06-30-zeroclaw-poc-ergebnis.md} (100%) rename docs/{AUTONOMIE_PLAN.md => archiv/2026-07-02-autonomie-plan.md} (100%) rename docs/{REVIEW_2026-07-02.md => archiv/2026-07-02-komplett-review.md} (100%) rename docs/{ANTIGRAVITY_REVIEW.md => archiv/2026-07-06-antigravity-review-prompt.md} (100%) rename docs/{GEMINI_BRIEFING.md => archiv/2026-07-10-gemini-briefing.md} (100%) rename docs/{wissen/ZIELBILD.md => archiv/2026-07-10-zielbild-abloesung.md} (100%) rename docs/{wissen/UMBAUPLAN-ABLOESUNG.md => archiv/2026-07-15-umbauplan-abloesung.md} (100%) rename docs/{wissen/UEBERGABE-DREI-WELTEN.md => archiv/2026-07-19-uebergabe-drei-welten.md} (97%) rename docs/{skills/gitea-workflow.md => archiv/2026-07-21-skill-gitea-workflow.md} (100%) rename docs/{HERMES_SETUP.md => archiv/2026-08-07-hermes-setup.md} (100%) rename docs/{aufgaben/referenz-check.sh => archiv/2026-08-20-referenz-check.sh} (100%) rename docs/{aufgaben/referenzaufgabe-mem0-ausbau.md => archiv/2026-08-20-referenzaufgabe-mem0-ausbau.md} (100%) rename SAVEPOINT.md => docs/archiv/2026-08-20-savepoint.md (100%) rename docs/{wissen/HERMES-WERKZEUGE.md => archiv/2026-08-21-hermes-werkzeuge.md} (100%) rename docs/{aufgaben/umbau-openchamber.md => archiv/2026-08-21-umbau-openchamber.md} (100%) rename docs/{wissen/OFFENE-FAEDEN.md => archiv/2026-09-04-offene-faeden-alt.md} (100%) rename docs/{wissen/RAPHAEL.md => archiv/2026-09-04-raphael-lucy-innere-stimme.md} (100%) delete mode 100644 docs/memory/project-hermes-setup.md delete mode 100644 docs/memory/project-mc2-architecture.md delete mode 100644 docs/memory/project-pending-tasks.md delete mode 100644 docs/memory/project-stack-state.md delete mode 100644 docs/skills/orchestrator.md diff --git a/docs/AUDIT_KICKOFF.md b/docs/AUDIT_KICKOFF.md deleted file mode 100644 index d97220d..0000000 --- a/docs/AUDIT_KICKOFF.md +++ /dev/null @@ -1,75 +0,0 @@ -# Kickoff: Voll-Audit MC2 (Front+Backend) + Box-SSH + Optimierungsplan - -> Für eine **frische Claude-Code-Session mit echtem Terminal** (direkter SSH-Zugang zur Box). -> Aufgabe vom Nutzer: front/backend komplett scannen (IST-Zustand), via SSH auf die Box gehen -> (ausdrücklich erlaubt), und am Ende einen **sauberen, strukturierten Plan** liefern, wie es -> weitergeht — inkl. Optimierungen für ALLE LLM-Rollen und einem **neuen `scout`-Modell**. -> Erst auditieren/planen — keine destruktiven Änderungen ohne Plan-Freigabe. - -## Zugänge -- **Repo (Dev-PC):** `F:\Coding Stuff\mission-control-2` (Windows). Auf der Box: `~/mission-control-v2`. -- **Box:** `ssh hitonabi@192.168.178.151` (key-based, funktioniert non-interaktiv). Hostname - `tobisniceaiarbeitstier`, AMD Ryzen AI MAX+ 395 (Strix Halo), 122 GB RAM, GTT ~124 GB, Vulkan/RADV. -- **Wichtige Box-Pfade:** `/etc/llama-swap/config.yaml` (Engine, `-watch-config`), - `~/.hermes/config.yaml` (Hermes-Agent = Lucys Hirn), `/srv/models/` (GGUFs), - `/opt/llamacpp-vulkan/llama-server` (Engine v9843). -- **Dienste (systemd --user):** `hermes-gateway` (:8642), `hermes-webui` (:8787), llama-swap (:8080), - MC2-Gateway (:9001). Live-Logs: `journalctl --user -u hermes-gateway -f`. - -## Architektur (verifiziert 30.06.2026) -- **llama-swap** (:8080) lädt GGUFs; Rollen = llama-swap **`aliases`**; Warm-Bleiben über - `groups: { brains: { swap:false } }` + `ttl`. -- **MC2-Gateway** (:9001/v1, FastAPI) mit virtuellen Lanes `chat`(→fast/heavy) & `coding`(→coder_lite/coder). - Code: `backend/services/router_logic.py`, `routing_policy.py`, `roles.py`, `llamaswap.py`, `budget.py`, - `fit.py`; Router `backend/routers/{models,routing,voice}.py`. Frontend: `frontend/src/views/ModelsView.tsx`, - `components/models/*`, `SystemDrawer.tsx`. -- **Hermes-Agent** (:8642) = Lucys Hirn (`~/.hermes/config.yaml: model.default`), Delegation `heavy`. -- **Lucy-Client** (`client/lucy-desktop`, Electron) spawnt lokal pocket-tts (:8130); Persona+Umlaut-Logik - im Client (`renderer/src/config.ts`, `lib/voice/useVoiceAgent.ts`). -- **Features sind eigene Rollen** (hirn-unabhängig): Sehen=`Qwen3-VL-8B`, Hören=Whisper(`stt`), - Sprechen=pocket-tts, Embedding=`Qwen3-Embedding-0.6B`(ttl 0, immer warm), Gedächtnis=Mem0/MCP. - -## Modelle / Rollen (Stand jetzt) -| Rolle (alias) | Modell | aktiv | ctt/ttl | Notiz | -|---|---|---|---|---| -| fast | Qwen3.6-35B-A3B | 3B | ttl 0, --parallel 2, mmproj | chat-Lane Default | -| heavy | Qwen3.5-122B-A10B | 10B | ttl 600 | Delegation-Ziel | -| coder | Qwen3-Coder-Next | — | ttl 600, spec draft-simple (Qwen3-0.6B) | | -| coder_lite | Qwen3-Coder-30B-A3B | 3B | ttl 300 | coding-Lane Default | -| vision | Qwen3-VL-8B-Instruct | — | ttl 300 | Screen-Beschreibung | -| (embedding) | Qwen3-Embedding-0.6B | — | ttl 0 | immer warm | -| **brain (NEU, Lucy)** | **gemma-4-26B-A4B-it** | 4B | ttl 0, **noch Alias `scout`** | Hermes default seit 30.06. | - -## Bereits gemacht (30.06.) -- Lucys Hirn `fast` → **`gemma-4-26B-A4B-it`** (`~/.hermes/config.yaml model.default`, Backup - `~/.hermes/config.yaml.gemma-swap.bak`, hermes-gateway neu gestartet, verifiziert). -- Umlaut-Fix: Client-Stammliste erweitert (`useVoiceAgent.ts`) **und** Server-Netz `_fix_umlauts` - (`client/lucy-tts/pocket_server.py`). Hermes-System-Prompt fordert echte Umlaute (Client-Persona). -- pocket-tts getunt: A1 safetensors-Voice-Cache, A2 Referenz-Cleaning, B3 FP-Gate skip kurze Audios, - FAST_FIRST (kurzer 1. Chunk, TTFB ~1,3s), seriell (WORKERS=0) als Default. Details: `docs/LUCY_TTS_PLAN.md`. - -## Offene Probleme / Aufgaben -1. **Brain-Rolle fehlt als Konzept.** gemma läuft als Alias `scout`, ist NICHT in `brains: swap:false` - → unter Speicherdruck evakuierbar trotz ttl 0. Detail-Brief: **`docs/CLAUDE_CODE_BRIEF_lucy-brain-role.md`** - (Backend+Frontend-Umbau: erstklassige `brain`-Rolle, auto-warm/ko-resident, Hermes-Sync). -2. **`scout`-Rolle jetzt vakant** (gemma war scout, ist jetzt Hirn). **Neues scout-Modell suchen:** - multimodaler Allrounder, klein/MoE (schnell, KO-Residenz-freundlich), Tools wünschenswert. Tagesaktuell - recherchieren + Empfehlung. -3. **MTP-Speculative-Decoding für gemma** (1,5–2× Durchsatz, 0 Qualitätsverlust): Engine kann `draft-mtp` - ✓; MTP-Drafter `gemma-4-26B-A4B-it-assistant` (~0,4B) muss nach `/srv/models/`, gemma-cmd ergänzen - (`-md --spec-type draft-mtp --spec-draft-n-max/-n-min`; **alte** `--draft-max/-min` - sind entfernt!). MC2-UI/Backend kennt MTP-Drafter nicht (zeigte „Vocab ?") → erweitern. (Im Brain-Brief.) -4. **Optimierung ALLER Rollen prüfen:** je Modell ctx/quant/ttl/Warm-Gruppe/Parallelität/Spec-Decoding - (MTP für Gemma; Draft-Eignung für Qwen-Modelle) gegen das GTT-/RAM-Budget (~124 GB) und reale t/s - auf Strix Halo (bandbreitenlimitiert → MoE bevorzugt; dichte Modelle langsam). KO-Residenz-Set - sinnvoll definieren (was muss gleichzeitig warm sein für Lucy + IDE-Coding?). - -## Deliverable -Ein **strukturierter Plan** (z.B. `docs/OPTIMIZATION_PLAN.md`): IST-Zustand → konkrete Maßnahmen je Rolle -(mit Begründung/Zahlen) → Reihenfolge/Risiko/Revert → offene Entscheidungen. Erst Plan, dann Umsetzung -nach Freigabe. Alles reversibel (Config-Backups vor jeder Änderung). - -## Leitplanken -- Features (Sehen/Hören/Sprechen/Embedding/Gedächtnis) + IDE-Lanes dürfen NICHT brechen. -- Vor jeder Box-Config-Änderung Backup; llama-swap reloadt per `-watch-config`. -- Keine destruktiven Aktionen ohne Plan-Freigabe des Nutzers. diff --git a/docs/CLAUDE_CODE_BRIEF_lucy-brain-role.md b/docs/CLAUDE_CODE_BRIEF_lucy-brain-role.md deleted file mode 100644 index 463dd79..0000000 --- a/docs/CLAUDE_CODE_BRIEF_lucy-brain-role.md +++ /dev/null @@ -1,106 +0,0 @@ -# Claude-Code-Auftrag: „Brain"-Rolle für Lucy (Front- + Backend-Umbau) - -> Ziel: Lucys Hirn (aktuell `gemma-4-26B-A4B-it`) als **erstklassige, dauer-warme Rolle** im MC2-Stack -> verankern — statt es als `scout` zu führen, das nach `ttl` entladen wird. Features (Sehen/Hören/ -> Sprechen/Embedding) dürfen NICHT verloren gehen, KO-Residenz + Budget müssen sauber bleiben. - -## Kontext / Architektur (Ist-Zustand, verifiziert 30.06.) -- **Engine:** llama-swap (config: `/etc/llama-swap/config.yaml` auf der Box, läuft mit `-watch-config`). - Rollen werden als llama-swap **`aliases`** gesetzt; Warm-Bleiben über `groups:` (eine Gruppe - `brains: { swap: false }`) + `ttl`. Installierte Modelle: `Qwen3.6-35B-A3B` (fast, ttl 0), - `Qwen3.5-122B-A10B` (heavy, ttl 600), `Qwen3-Coder-Next` (coder, ttl 600), - `Qwen3-Coder-30B-A3B-Instruct` (coder_lite, ttl 300), `Qwen3-VL-8B-Instruct` (vision, ttl 300), - `Qwen3-Embedding-0.6B` (ttl 0 = immer warm), `gemma-4-26B-A4B-it` (ttl 180). -- **Gateway:** MC2 builtin auf `:9001/v1` mit virtuellen Lanes `chat` (→ fast/heavy) und - `coding` (→ coder_lite/coder). Code: `backend/services/router_logic.py`, `routing_policy.py`. - **Lucy nutzt die Lanes NICHT** — sie ist der Hermes-Agent. -- **Lucy-Hirn:** Hermes-Agent (`:8642`), Brain = `~/.hermes/config.yaml` → `model.default` - (jetzt `gemma-4-26B-A4B-it`), Delegation = `heavy`. Persona/Prompt kommt aus dem **Client** - (`client/lucy-desktop/src/renderer/src/config.ts`), nicht aus der Box-Config. -- **Hardware:** Strix Halo (Ryzen AI Max+ 395), 122 GB, GTT ~124 GB, bandbreitenlimitiert → - MoE mit wenig aktiven Params ist schnell, dichte Modelle langsam. - -## Root-Cause des Bugs -1. Kanonische Rollen `ROLE_IDS = {fast, heavy, coder, vision, scout}` — **keine `brain`/Agent-Rolle**. - (Kommentar im Code: „kein agent/reasoning mehr".) -2. Es gibt keine Verknüpfung „Hirn-Modell ⇒ muss warm bleiben". gemma trägt den Alias `scout`, - ist NICHT in der `brains`-Gruppe, `ttl 180` → entlädt im Leerlauf → Lucy lädt kalt nach (~5–10 s). -3. `roles.py` referenziert noch eine `hermes`-Rolle, die in `ROLE_IDS` nicht existiert → Inkonsistenz. - -## Aufgabe - -### Backend (`backend/`) -1. **Neue erstklassige Rolle `brain` einführen** (oder `hermes` reaktivieren) und in ALLEN - Quellen synchronisieren (heute dupliziert!): - - `services/llamaswap.py` → `ROLE_IDS` - - `services/sources.py` → `ROLE_IDS` + Titel/Icon (analog `scout: {title, icon}`) - - `services/maintenance.py` (Modell-Upgrade-Rollenliste) - - `services/roles.py` → `_capability_suit`/`_pref`/`_reason` für `brain` (Tools Pflicht, - mittlere Größe + MoE bevorzugt, niedrige Latenz). `hermes`-Altlast bereinigen. -2. **Rolle `brain` ⇒ automatisch warm + ko-resident.** Beim Zuweisen der `brain`-Rolle - (`POST /api/models/{model_id}/role`, `routers/models.py`): - - Modell via `set_group("brains", members=[...], swap=False, persist=True)` in die Warm-Gruppe - aufnehmen (bestehender Helper in `llamaswap.py`). - - `ttl: 0` setzen (oder hoch), vorheriges Brain-Modell aus `brains` entfernen + ttl entspannen. - - Embedding (`Qwen3-Embedding-0.6B`, ttl 0) MUSS warm bleiben — nicht verdrängen. -3. **Single Source of Truth für „Lucys Hirn":** beim Setzen der `brain`-Rolle auch Hermes' - `~/.hermes/config.yaml` → `model.default` auf das Modell setzen + `systemctl --user restart - hermes-gateway` (mit Backup der config). So bleibt MC2-UI-Auswahl ↔ Hermes-Brain konsistent. -4. **Budget/KO-Residenz-Safety:** Brain(warm) + Embedding(warm) + on-demand Vision + Coder müssen - in GTT (~124 GB) passen. `services/budget.py`/`fit.py` nutzen, bei OOM warnen (nicht hart laden). -5. **Lanes/IDEs unangetastet lassen:** chat/coding-Routing (`router_logic.py`) bleibt wie es ist; - `fast` bleibt für die chat-Lane warm. - -### Frontend (`frontend/src/`) -1. **Rollen-Taxonomie** um `brain` erweitern (Badges/Titel/Icon) — Duplikat zur Backend-Liste - finden & angleichen (`components/models/*`, `views/ModelsView.tsx`, evtl. `ModelBadges.ROLES`). - gemma darf NICHT mehr als `scout` erscheinen. -2. **Rollen-Zuweisungs-Modal:** `brain` auswählbar; Warm-/KO-Residenz-Status anzeigen - (ist das Brain in `brains`? warm? ttl?). Empfehlung via bestehendem `/api/roles/{role}/recommend`. -3. **Warm-Set / GTT-Budget sichtbar machen** (Dashboard/Models): was ist gerade ko-resident, - passt es ins Budget? (nutzt `/api/models` `running` + budget-Infos). -4. Optional: „Lucy-Hirn"-Selector, der die `brain`-Rolle setzt (treibt Backend #2 + #3). - -### Zusatz: MTP-Speculative-Decoding für Gemma (Durchsatz für agentische Arbeit) -Lucy ist ein **voller Agent** (Tools/MCP/PC-Control/Vision/Delegation) — Durchsatz zählt, nicht nur -TTFB. Gemma 4 bringt **MTP** (Multi-Token-Prediction) mit → 1,5–2× schneller bei null Qualitätsverlust. -- **Engine kann es bereits:** `llama-server` v9843 listet `--spec-type … draft-mtp …`. ✓ -- **Vocab-kompatibler „Draft" = Gemmas eigener MTP-Kopf** `gemma-4-26B-A4B-it-assistant` (~0,4B, - identischer Tokenizer per Konstruktion). Quelle z.B. `unsloth/gemma-4-26B-A4B-it-GGUF` (enthält den - MTP-Drafter, PR ggml-org/llama.cpp#23398). Muss nach `/srv/models/...` geladen werden (noch nicht da). -- **Flag-Änderung beachten:** `--draft-max/--draft-min` sind ENTFERNT → `--spec-draft-n-max` / - `--spec-draft-n-min`. Drafter laden via `-md --spec-type draft-mtp`. Exakte Flags - des Builds mit `llama-server --help` gegenprüfen. -- **MC2-Bug:** die Spec-Draft-Auswahl (UI + Backend) kennt **nur klassische Drafts** (vergleicht stur - `n_vocab`/`pre`) und bot fälschlich nur den Qwen-Draft an („Vocab ?"). **Erweitern:** MTP-Drafter - (`gemma4_assistant`-Arch) als gültigen, vocab-kompatiblen Draft erkennen, den passenden `-assistant`- - GGUF anbieten, und beim Aktivieren `-md … --spec-type draft-mtp --spec-draft-n-max/-n-min` in die - llama-swap-cmd schreiben. Co-Residenz: Drafter ~0,4B → vernachlässigbar. - -## Akzeptanzkriterien -- [ ] `gemma-4-26B-A4B-it` wird in der UI als **`brain`** geführt (nicht `scout`). -- [ ] Es bleibt **warm**: in `brains: swap:false`, `ttl 0`; überlebt > alter ttl Leerlauf - (Verifikation: `curl :8080/running` nach >5 Min Idle zeigt das Modell weiterhin `ready`). -- [ ] Lucy antwortet ohne Kalt-Nachladen nach Leerlauf. -- [ ] Vision (`Qwen3-VL-8B`), Embedding (`Qwen3-Embedding-0.6B`), Coder bleiben funktionsfähig & - ko-resident; **kein OOM**; IDE-Lanes (chat/coding) unverändert. -- [ ] Brain-Wechsel in der UI aktualisiert llama-swap (Warm-Gruppe) UND Hermes `model.default` - (+ Restart), reversibel (Backup). - -## Sofort-Hotfix (unabhängig vom Umbau — macht Lucy JETZT warm) -Auf der Box, bis der saubere Umbau steht: -```bash -# gemma als immer-warm + in die brains-Gruppe (Backup zuerst!) -cp /etc/llama-swap/config.yaml /etc/llama-swap/config.yaml.bak -# gemma ttl 180 -> 0 und groups.brains.members um gemma-4-26B-A4B-it ergänzen -# (manuell editieren oder via MC2 set_group), dann: -# llama-swap reloadt per -watch-config automatisch. -``` - -## Wichtige Dateien (Einstieg) -- Backend: `services/llamaswap.py` (Rollen=aliases, `set_role_alias`, `set_group`, `register_model`), - `services/roles.py`, `services/sources.py`, `services/routing_policy.py`, - `services/router_logic.py`, `services/budget.py`, `services/fit.py`, `routers/models.py`, - `routers/routing.py`. -- Frontend: `views/ModelsView.tsx`, `components/models/*`, `components/SystemDrawer.tsx`. -- Box (nicht im Repo): `/etc/llama-swap/config.yaml`, `~/.hermes/config.yaml`. diff --git a/docs/CUTOVER.md b/docs/CUTOVER.md deleted file mode 100644 index 759ded0..0000000 --- a/docs/CUTOVER.md +++ /dev/null @@ -1,45 +0,0 @@ -# Cutover — Stand & Anleitung - -## Was auf der Box LÄUFT (verifiziert) -- **MC2** auf `:9001` (sudo-freier User-Dienst, `~/mission-control-v2`). Update: `deploy/deploy.sh`. -- **Modelle/Rollen:** `fast` = Qwen3.6-35B-A3B, `heavy` = Qwen3.5-122B-A10B, `coder` = Qwen3-Coder-30B, - `vision` = Qwen3-VL-8B, `scout` = Qwen3-8B, `hermes` = Hermes-4-14B (immer warm, ttl 99999). Alle - tool-fähig (`--jinja` wo nötig). Legacy `manager`/`reviewer` entfernt. -- **Gateway (eingebaut, `:9001/v1`, OpenAI-kompatibel):** `model: auto` → kurz/Standard = `fast`, - lang/komplex = `heavy`. End-to-End verifiziert. -- **Hermes:** **eigenes festes Hirn = Hermes-4-14B** (`model.model: hermes`) + **Delegation an `heavy`**. - `model:auto` ist NUR für Vibe Coding/IDEs, nicht Hermes. MCP verdrahtet: `mission-control-memory` + - `mission-control-stack`. Verifiziert: „bist du da?" → 3s, sauber, kein Thrash. -- **Gedächtnis vereinheitlicht:** MC2 nutzt die bestehende DB (`mission-control-memory.db`) — geteilte - „Verfassung" für Cockpit, Hermes, IDEs. -- **Cockpit-Features:** HF-Link/Suche-Install (W2), Rollen/ctx/löschen-UX (W3), Wartung (W8: OS/Engine- - Update, Restart, Reboot, Logs, dyn. Modell-Upgrades), Bedien-Anleitung (BEDIENUNG.md + Hilfe-Link). - -## Thrash-Fix (war der „Hermes ist dumm"-Grund) -Ursache war NICHT das Modell/die Session, sondern **kaputte/Cloud-Tools im Toolset** (browser ohne Chrome -→ Loop, vision auf Text, natives memory falsch aufgerufen). Global abgeschaltet über -`agent.disabled_toolsets` in `~/.hermes/config.yaml` (Achtung: `hermes tools disable` greift nur cli, -NICHT den api_server). Natives memory zusätzlich aus (`memory.memory_enabled:false`); geteiltes -Gedächtnis bleibt via MCP. Behaltene Tools: web/terminal/file/code_execution/skills/todo/session_search/ -clarify/delegation/cronjob + 2 MCP. - -## Cutover-Schritte -1. v2 läuft bereits auf `:9001` parallel — alles dort testen: `http://192.168.178.151:9001`. -2. Vibe-Coding-Tools auf den Gateway zeigen (Verbinden-Tab → `:9001/v1`, `model: auto`). -3. **v1 stilllegen** — bereits erledigt: `hermes-dashboard` (:9119) disabled (killte 4 v1-MCP-Zombies). - **Noch offen (braucht dein sudo, NOPASSWD deckt nur `restart`):** - ``` - sudo systemctl disable --now mission-control # v1-Cockpit :9000 aus - ``` - `llama-swap` (System) + `hermes-gateway` (User) bleiben — die nutzt v2 weiter. -4. Optional v2 auf den „Haupt"-Port legen — `MC_PORT` in der mc2-Unit. -5. Backup vorher: Cockpit → System → „Backup jetzt". - -## Offene Tuning-/Setup-Punkte (kein Blocker) -1. **nesquena hermes-webui** (:8787) installieren (Plan Block C) → „Hermes öffnen" zeigt darauf statt :9119. -2. **Ko-Residenz** `hermes`+`fast` (swap:false, Plan Block E) — GTT beobachten, bei OOM-Nähe zurück. -3. **SSH→Windows** (voller PC-Zugriff): OpenSSH-Server am Windows-PC + Key `id_ed25519_hermes_agent`. -4. **sudoers erweitern** (`apt-get`, `reboot`) → OS-Update/Reboot klicki-bunti (Zeilen in BEDIENUNG.md). -5. **Delegation an heavy** ist konfiguriert; triggert modell-diskretionär bei echt harten Teilaufgaben. - -> v1 bleibt bis zum `disable` lauffähig — Cutover ist reversibel (`sudo systemctl enable --now mission-control`). diff --git a/docs/STATUS.md b/docs/STATUS.md deleted file mode 100644 index 42b5a70..0000000 --- a/docs/STATUS.md +++ /dev/null @@ -1,57 +0,0 @@ -# Mission Control 2.0 — Status & Resume-Guide - -> So machst du jederzeit nahtlos weiter. Der vollständige Architektur-Plan liegt in -> `C:\Users\TobisPC\.claude\plans\piped-cuddling-sloth.md` (genehmigt). - -## Wo das Projekt lebt -- **Code:** `F:\Coding Stuff\mission-control-2` (Windows-Dev-PC) + Gitea-Remote - `https://git.tobisniceshomelab.ddnsfree.com/Hitonabi/mission-control-v2` (Branch `main`). -- **v1** (`F:\Coding Stuff\mission-control`) wird abgelöst (Cutover läuft, s.u.). -- **Box** (Bosgame, `192.168.178.151`): **MC2 LIVE auf :9001** als sudo-freier systemd-USER-Dienst - (`~/mission-control-v2`, Update via `deploy/deploy.sh`). - -## Gateway = builtin (NICHT LiteLLM) -LiteLLM verlangt Python <3.14; die Box hat nur 3.14 (uvloop+orjson scheitern). Der **eingebaute -Gateway** (`:9001/v1`, OpenAI-kompatibel) liefert `model:auto` (kurz→`fast`, komplex→`heavy`) + -Streaming und ist E2E verifiziert. Vertrag (OpenAI-API) bleibt austauschbar. - -## Phasen-Fortschritt -- [x] **Phase 0 — Gerüst:** FastAPI + React/shadcn-Shell (Cmd+K, Dark, PWA). Live auf Box. -- [x] **Phase 1 — Engine + Routing:** Compute (fit/caps/sources), Discover (live HF), Engine-Write - (register + groups), **builtin Gateway** `model:auto`, Modelle&Routing-UI. Box-verifiziert. -- [x] **Phase 2 — System/OS + Connect:** Metriken, Dienste, Self-Update, Connect-Snippets → Gateway. -- [x] **Phase 3 — Memory + MCP:** Memory-UI, `mcp_memory.py` + `mcp_mc.py` (Stack-Management). -- [x] **Phase 4 — Hermes-Schicht:** Agent-Status + AgentView; **Box: Hermes verdrahtet** (eigenes Hirn, - MCP memory+stack). hermes-webui (nesquena) = Block C offen. -- [x] **Phase 5 — Betrieb/Politur:** Backup, Services-Health, Observability-Links, Theme-Toggle. -- [x] **W1–W8** (Audit-Arbeitspaket): Thrash-Fix, HF-Install, Rollen-UX, BEDIENUNG.md, Wartung. ✅ -- [~] **Phase 6 — Cutover:** läuft (s.u.). v1-Dashboard+Zombies weg; v1 :9000 Stop offen (User-sudo). - -## Hermes-Hirn (Entscheidung 2026-06-25) -Hermes hat ein **eigenes festes Hirn = Hermes-4-14B** (`model.model: hermes`, ttl 99999 = immer warm) -+ **interne Delegation an `heavy`** (Qwen3.5-122B) für harte Teilaufgaben. **`model:auto` ist NUR -Gateway/Vibe-Coding**, nicht Hermes. Verifiziert: „bist du da?" → **3s, sauber, kein Thrash**. - -## Box-Stand (Session 2026-06-25) -- **8 Modelle**, Rollen sauber: `fast` (Qwen3.6-35B-A3B), `heavy` (Qwen3.5-122B-A10B), `coder` - (Qwen3-Coder-30B), `vision` (Qwen3-VL-8B), `scout` (Qwen3-8B), `hermes` (Hermes-4-14B). Legacy - `manager`/`reviewer`-Aliase entfernt (Modelle bleiben per Realname ladbar). -- **Thrash behoben** (war NICHT die Session): kaputte Tools global via `agent.disabled_toolsets` - abgeschaltet (browser/vision/computer_use/image_gen/tts/video*/memory). Details: Memory - `hermes-thrash-rootcause-fix`. **`hermes tools disable` greift NICHT am api_server** — nur die config. -- **Cutover teilweise:** `hermes-dashboard` (:9119) disabled (killte 4 v1-MCP-Zombies); - **v1 `mission-control.service` (:9000) läuft noch** → `sudo systemctl disable --now mission-control`. -- MCP nutzt `/opt/mission-control/.venv/bin/python` (hat `mcp`-Modul) für v2-Skripte → /opt-Dir bleibt. - -## Nächste Schritte (siehe Plan „Nächste Schritte" + docs/CUTOVER.md) -- **Block C:** nesquena hermes-webui (:8787) installieren → „Hermes öffnen" zeigt darauf. -- **Block E:** Ko-Residenz `hermes`+`fast` (swap:false) testen, GTT beobachten. -- **User-sudo:** v1 :9000 stoppen; sudoers für apt-get/reboot erweitern (OS-Update/Reboot). -- Offen/user-seitig: SSH→Windows (OpenSSH am PC), v1-Passwort-Hygiene (Git-Historie). - -## Lokal entwickeln/verifizieren -```bash -cd backend && .venv/Scripts/python -m uvicorn app:app --port 9000 # Backend -cd frontend && npm run dev # http://localhost:5173 -cd frontend && npm run build # Prod-Build (committet) -``` diff --git a/docs/UPGRADE.md b/docs/UPGRADE.md deleted file mode 100644 index 7b8bc7e..0000000 --- a/docs/UPGRADE.md +++ /dev/null @@ -1,35 +0,0 @@ -# Upgrades & Versions-Pins - -## Warum Pins -Der Mem0-Sidecar nutzt mem0-**Interna** (NoThink-LLM-Swap, Roh-Zugriff auf die Chroma-Collection -für den Graphen, Annahmen übers Result-Format). Ein unkontrolliertes mem0/chromadb-Upgrade kann das -**still brechen**. Darum sind die Versionen in `mem0_service/requirements.txt` gepinnt — Upgrades -passieren nur absichtlich. - -## Isolation (warum ein Upgrade nicht alles mitreißt) -- mem0 lebt in `~/.mem0/venv` (Python 3.12) — getrennt vom MC2-Backend (3.14). -- Die stabile Grenze nach außen ist **`/api/memory`**. UI, MCP (IDEs) und der Hermes-Provider - reden NUR damit, nie direkt mit mem0. Ein mem0-Upgrade betrifft also **nur den Sidecar**. - -## mem0 / chromadb sicher upgraden -```bash -cd ~/mission-control-v2 -bash deploy/backup.sh # 1. Backup -# 2. Pin anheben in mem0_service/requirements.txt (z.B. mem0ai==X.Y.Z) -uv pip install --python ~/.mem0/venv/bin/python -r mem0_service/requirements.txt # 3. installieren -~/.mem0/venv/bin/python mem0_service/smoke_test.py # 4. Smoke-Test (Wegwerf-Collection) -``` -- **Grün** → `systemctl --user restart mem0-service`, fertig. -- **Rot** → entweder den Sidecar (`mem0_service/app.py`) an die neue mem0-API anpassen, oder Pin - zurücksetzen und alten Stand per `deploy/restore.sh latest` wiederherstellen. - -## Weitere Upgrade-Fallen -- **Embed-Modell wechseln** = andere Vektor-Dimension → Chroma muss **neu indiziert** werden - (alle Fakten neu einbetten). Aktuell: Qwen3-Embedding-0.6B / 1024 Dim. -- **reagraph** ist auf **4.22.0** gepinnt — 4.23+ braucht `@react-three/fiber` v9 = React 19, - das Projekt ist React 18 (Crash „reading 'S'" sonst). -- **Nach Hermes-Upgrades**: prüfen, dass `~/.hermes/plugins/mc2-memory` noch lädt und `sync_turn` - feuert — die `MemoryProvider`-ABC könnte sich ändern (ein Turn über den Gateway, dann - `curl /api/memory` checken). -- **OS/Engine-Updates** (apt, llama.cpp) laufen separat über die UI (Wartungs-Drawer) und sind - von mem0 entkoppelt. diff --git a/docs/LUCY_TTS_PLAN.md b/docs/archiv/2026-06-30-lucy-tts-plan.md similarity index 100% rename from docs/LUCY_TTS_PLAN.md rename to docs/archiv/2026-06-30-lucy-tts-plan.md diff --git a/docs/OPTIMIZATION_PLAN.md b/docs/archiv/2026-06-30-optimierungsplan.md similarity index 99% rename from docs/OPTIMIZATION_PLAN.md rename to docs/archiv/2026-06-30-optimierungsplan.md index f063e9d..e8f8d17 100644 --- a/docs/OPTIMIZATION_PLAN.md +++ b/docs/archiv/2026-06-30-optimierungsplan.md @@ -297,4 +297,3 @@ on-demand-Modelle laufen allein). Kein Box-Risiko, nur genauere ctx-Empfehlungen W1/W2 macht sie sogar robuster (kein OOM mehr). - Vor jeder Box-Config-Änderung Backup; llama-swap reloadt per `-watch-config`. - **Keine destruktiven Aktionen ohne Freigabe dieses Plans.** - diff --git a/docs/ZEROCLAW_POC_BRIEF.md b/docs/archiv/2026-06-30-zeroclaw-poc-auftrag.md similarity index 98% rename from docs/ZEROCLAW_POC_BRIEF.md rename to docs/archiv/2026-06-30-zeroclaw-poc-auftrag.md index 841dc6f..cc8e659 100644 --- a/docs/ZEROCLAW_POC_BRIEF.md +++ b/docs/archiv/2026-06-30-zeroclaw-poc-auftrag.md @@ -80,4 +80,3 @@ Modell-Pflaster. - **Hermes/Lucy bleibt live** — PoC läuft isoliert (eigener Port, eigene Memory-Datei). Null Risiko. - Vor Box-Config-Änderungen Backup; llama-swap reloadt per `-watch-config`. - Erst messen (Prompt-Größe + Latenz), dann über vollen Umzug entscheiden. - diff --git a/docs/ZEROCLAW_POC_RESULTS.md b/docs/archiv/2026-06-30-zeroclaw-poc-ergebnis.md similarity index 100% rename from docs/ZEROCLAW_POC_RESULTS.md rename to docs/archiv/2026-06-30-zeroclaw-poc-ergebnis.md diff --git a/docs/AUTONOMIE_PLAN.md b/docs/archiv/2026-07-02-autonomie-plan.md similarity index 100% rename from docs/AUTONOMIE_PLAN.md rename to docs/archiv/2026-07-02-autonomie-plan.md diff --git a/docs/REVIEW_2026-07-02.md b/docs/archiv/2026-07-02-komplett-review.md similarity index 100% rename from docs/REVIEW_2026-07-02.md rename to docs/archiv/2026-07-02-komplett-review.md diff --git a/docs/ANTIGRAVITY_REVIEW.md b/docs/archiv/2026-07-06-antigravity-review-prompt.md similarity index 100% rename from docs/ANTIGRAVITY_REVIEW.md rename to docs/archiv/2026-07-06-antigravity-review-prompt.md diff --git a/docs/GEMINI_BRIEFING.md b/docs/archiv/2026-07-10-gemini-briefing.md similarity index 100% rename from docs/GEMINI_BRIEFING.md rename to docs/archiv/2026-07-10-gemini-briefing.md diff --git a/docs/wissen/ZIELBILD.md b/docs/archiv/2026-07-10-zielbild-abloesung.md similarity index 100% rename from docs/wissen/ZIELBILD.md rename to docs/archiv/2026-07-10-zielbild-abloesung.md diff --git a/docs/wissen/UMBAUPLAN-ABLOESUNG.md b/docs/archiv/2026-07-15-umbauplan-abloesung.md similarity index 100% rename from docs/wissen/UMBAUPLAN-ABLOESUNG.md rename to docs/archiv/2026-07-15-umbauplan-abloesung.md diff --git a/docs/wissen/UEBERGABE-DREI-WELTEN.md b/docs/archiv/2026-07-19-uebergabe-drei-welten.md similarity index 97% rename from docs/wissen/UEBERGABE-DREI-WELTEN.md rename to docs/archiv/2026-07-19-uebergabe-drei-welten.md index e8ff8c5..6add4ce 100644 --- a/docs/wissen/UEBERGABE-DREI-WELTEN.md +++ b/docs/archiv/2026-07-19-uebergabe-drei-welten.md @@ -39,7 +39,7 @@ Playbook-Karte an `betrieb`. Beweis 19.07.: Homepage-Deploy auf LXC 106 in 92 s 5. **Gedächtnis-Bereiche** statt zweitem mem0: neue Fakten tragen `bereich: alltag|projekt`; `GET /memory?bereich=` filtert (Alt-Fakten laufen immer mit). Einmal-Cron `gedaechtnis-check` (16.08. 09:10) prüft Schutt und legt bei Bedarf SELBST die - Werkstatt-Karte an — Bauauftrag komplett in [GEDAECHTNIS-BEREICHE.md](GEDAECHTNIS-BEREICHE.md). + Werkstatt-Karte an — Bauauftrag komplett in `docs/wissen/GEDAECHTNIS-BEREICHE.md` (am 07.08.2026 gelöscht, Commit `c3851f8`; nur noch in der Git-Historie). 6. **Sicherheit:** Gitea-Registrierung AUS (app.ini `[service]` in CT 104 — Achtung: `deploy/gitea_app.ini.example` setzt den Key fälschlich in `[security]`, Gitea ignoriert das stumm!). ~157 GB Müll von der Box (u. a. 103 GB HF-Cache), Hermes Desktop komplett diff --git a/docs/skills/gitea-workflow.md b/docs/archiv/2026-07-21-skill-gitea-workflow.md similarity index 100% rename from docs/skills/gitea-workflow.md rename to docs/archiv/2026-07-21-skill-gitea-workflow.md diff --git a/docs/HERMES_SETUP.md b/docs/archiv/2026-08-07-hermes-setup.md similarity index 100% rename from docs/HERMES_SETUP.md rename to docs/archiv/2026-08-07-hermes-setup.md diff --git a/docs/aufgaben/referenz-check.sh b/docs/archiv/2026-08-20-referenz-check.sh similarity index 100% rename from docs/aufgaben/referenz-check.sh rename to docs/archiv/2026-08-20-referenz-check.sh diff --git a/docs/aufgaben/referenzaufgabe-mem0-ausbau.md b/docs/archiv/2026-08-20-referenzaufgabe-mem0-ausbau.md similarity index 100% rename from docs/aufgaben/referenzaufgabe-mem0-ausbau.md rename to docs/archiv/2026-08-20-referenzaufgabe-mem0-ausbau.md diff --git a/SAVEPOINT.md b/docs/archiv/2026-08-20-savepoint.md similarity index 100% rename from SAVEPOINT.md rename to docs/archiv/2026-08-20-savepoint.md diff --git a/docs/wissen/HERMES-WERKZEUGE.md b/docs/archiv/2026-08-21-hermes-werkzeuge.md similarity index 100% rename from docs/wissen/HERMES-WERKZEUGE.md rename to docs/archiv/2026-08-21-hermes-werkzeuge.md diff --git a/docs/aufgaben/umbau-openchamber.md b/docs/archiv/2026-08-21-umbau-openchamber.md similarity index 100% rename from docs/aufgaben/umbau-openchamber.md rename to docs/archiv/2026-08-21-umbau-openchamber.md diff --git a/docs/wissen/OFFENE-FAEDEN.md b/docs/archiv/2026-09-04-offene-faeden-alt.md similarity index 100% rename from docs/wissen/OFFENE-FAEDEN.md rename to docs/archiv/2026-09-04-offene-faeden-alt.md diff --git a/docs/wissen/RAPHAEL.md b/docs/archiv/2026-09-04-raphael-lucy-innere-stimme.md similarity index 100% rename from docs/wissen/RAPHAEL.md rename to docs/archiv/2026-09-04-raphael-lucy-innere-stimme.md diff --git a/docs/memory/project-hermes-setup.md b/docs/memory/project-hermes-setup.md deleted file mode 100644 index 834b593..0000000 --- a/docs/memory/project-hermes-setup.md +++ /dev/null @@ -1,75 +0,0 @@ -> ⚠️ **TEILS VERALTET (Juni 2026, Archiv).** Aktueller Hermes-Stand (v0.18.2, delegation, -> Toolset-Diät, Desktop): [docs/wissen/STACK.md](../wissen/STACK.md) + -> [docs/wissen/FALLEN.md](../wissen/FALLEN.md). Der Zwei-Ebenen-Toolset-Gotcha hier gilt weiter. - ---- -name: project-hermes-setup -description: "Hermes Agent — vollständige Verdrahtung, MCP-Server, Telegram, PC-Executor (Stand 2026-06-27)" -metadata: - node_type: memory - type: project - originSessionId: e6bf38ac-b5dc-4aaa-80c3-ad8dd078a1fe ---- - -## Hermes-Version & Ort -- **Version:** v0.17.0 (2026-06-19), NousResearch/hermes-agent -- **Repo:** `https://github.com/NousResearch/hermes-agent.git` -- **Install-Pfad Box:** `~/.hermes/hermes-agent/` -- **Venv:** `~/.hermes/hermes-agent/venv/bin/python` -- **Config:** `~/.hermes/config.yaml` - ---- - -## Hermes-Hirn -- **Brain:** `model.model: hermes` → Hermes-4-14B (immer warm, TTL=0) -- **Delegation:** `heavy` für harte Teilaufgaben (Qwen3.5-122B) -- **NICHT model:auto** — das ist nur für IDE/Vibe-Coding - ---- - -## MCP-Server (in ~/.hermes/config.yaml) -| Name | Script | Zweck | -|---|---|---| -| `mission-control-memory` | `mcp/mcp_memory.py` | Geteiltes Gedächtnis (SQLite) | -| `mission-control-stack` | `mcp/mcp_mc.py` | MC2 Stack-Management | -| `hermes-pc-control` | `mcp/mcp_pc.py` | PC-Steuerung via executor.py | -| `hermes-web-fetch` | `mcp/mcp_web.py` | Web-Fetch via trafilatura | - -Alle MCP-Skripte liegen in `~/mission-control-v2/mcp/` auf der Box. -`mcp_pc.py` und `mcp_web.py` laufen mit Hermes-Venv (nicht MC2-Venv → Python 3.11 Kompatibilität). - -**PC_EXECUTOR_URL:** `http://192.168.178.98:7777` (als Env-Var in hermes config) - ---- - -## PC Executor (Windows PC) -- **Datei:** `client/hermes-pc/executor.py` (FastAPI, Port 7777) -- **Starten:** `client\hermes-pc\start.bat` auf dem Windows-PC (manuell, kein Autostart) -- **Health:** `GET http://192.168.178.98:7777/health` -- **Endpoints:** `/shell`, `/screenshot`, `/type`, `/key`, `/open`, `/search` -- **Autostart noch nicht eingerichtet** → per start.bat starten wenn Hermes PC-Zugriff braucht - ---- - -## Telegram-Integration -- **Bot-Token:** in `~/.hermes/.env` (`TELEGRAM_BOT_TOKEN`) -- **Erlaubte User-ID:** 6150562984 -- **Platform-Toolsets:** telegram hat alle Tools (terminal, file, web, code_execution, delegation, todo, skills, session_search, hermes-telegram) -- Slash-Befehle der CLI funktionieren auch im Telegram-Bot - ---- - -## Abgeschaltete Tools (Thrash-Prevention) -`agent.disabled_toolsets: [browser, vision, computer_use, image_gen, tts, video, video_gen, memory]` -`tool_loop_guardrails.hard_stop_enabled: true` - -**Why:** Browser-Tool ohne Chrome → Endlos-Loop; Cloud-Tools nicht vorhanden → Loop. -Native memory deaktiviert (`memory.memory_enabled: false`); geteiltes Gedächtnis läuft via MCP. - ---- - -## Web-Suche -- `web.search_backend: ddgs` (DuckDuckGo, kein API-Key) -- `web.extract_backend: ddgs` — aber ddgs kann NICHT extrahieren! -- **Echte Extraktion:** über `hermes-web-fetch` MCP-Server (trafilatura, kein API-Key) -- trafilatura installiert in Hermes-Venv: `pip install trafilatura` diff --git a/docs/memory/project-mc2-architecture.md b/docs/memory/project-mc2-architecture.md deleted file mode 100644 index e15ffad..0000000 --- a/docs/memory/project-mc2-architecture.md +++ /dev/null @@ -1,78 +0,0 @@ -> ⚠️ **TEILS VERALTET (Juni 2026, Archiv).** Aktuelle Dienste/Ports/Modelle: -> [docs/wissen/STACK.md](../wissen/STACK.md) · Fallen: [docs/wissen/FALLEN.md](../wissen/FALLEN.md). -> Die Schichten-/Key-File-Übersicht hier stimmt im Kern noch. - ---- -name: project-mc2-architecture -description: "MC2 Architektur — Schichten, Key-Files, API-Endpunkte, wichtige Eigenheiten" -metadata: - node_type: memory - type: project - originSessionId: e6bf38ac-b5dc-4aaa-80c3-ad8dd078a1fe ---- - -## Stack-Schichten -``` -Windows PC (192.168.178.98) - └─ executor.py :7777 ← PC-Steuerung (FastAPI, manuell via start.bat) - -AI Box (192.168.178.151) — Ryzen AI MAX+ 395, 122GB unified RAM - ├─ llama-swap :8080 ← Engine (ROCm/HIP, lemonade-sdk/llamacpp-rocm) - ├─ mission-control-2 :9001 ← MC2 (FastAPI + React, user-service) - │ └─ /v1 ← Builtin Gateway (model:auto, OpenAI-kompatibel) - ├─ hermes-gateway :8642 ← Hermes Agent (NousResearch, user-service) - │ ├─ mcp_pc.py ← MCP → executor.py auf Windows PC - │ ├─ mcp_web.py ← MCP → trafilatura Web-Fetch - │ ├─ mcp_memory.py ← MCP → SQLite Gedächtnis - │ └─ mcp_mc.py ← MCP → MC2 Stack-Management - └─ hermes-webui :8787 ← nesquena hermes-webui (user-service) - -Proxmox (192.168.178.108) ← LXCs: adguard(100) npmplus(101) netbird(102) gitea(104) -``` - ---- - -## MC2 Key-Files -| Datei | Zweck | -|---|---| -| `backend/app.py` | FastAPI Einstieg, Router-Mounting | -| `backend/config.py` | Alle Env-Vars (LLAMA_SWAP_URL, HERMES_*, PC_EXECUTOR_URL, etc.) | -| `backend/services/agent.py` | `/api/agent/status` (gateway/webui/telegram/mcp/pc) | -| `backend/services/llamaswap.py` | llama-swap API, ROLE_IDS, Modell-CRUD | -| `backend/services/maintenance.py` | Updates, Logs, Restart, ROLE_MAP | -| `backend/services/sources.py` | CATEGORIES für Discover (roles: vision/coder/agent/scout) | -| `backend/gateway/gateway_proxy.py` | Builtin OpenAI-Gateway, model:auto Routing | -| `frontend/src/lib/api.ts` | TypeScript-Interfaces für alle API-Responses | -| `frontend/src/lib/queries.ts` | React-Query Hooks (useModels, useAgentStatus, etc.) | -| `mcp/mcp_pc.py` | PC-Control MCP-Server | -| `mcp/mcp_web.py` | Web-Fetch MCP-Server (trafilatura) | -| `mcp/mcp_memory.py` | Shared Memory MCP-Server | - ---- - -## Wichtige Eigenheiten / Gotchas -- **Python 3.14 auf Box** → LiteLLM unmöglich (uvloop scheitert). MC2 hat eigenen Gateway. -- **mcp_pc.py / mcp_web.py müssen Hermes-Venv nutzen** (nicht MC2-Venv). Python 3.11 vs 3.14 TaskGroup-Kompatibilität. -- **Builtin-Gateway Port:** MC2 läuft auf `:9001`, der `/v1`-Endpunkt ist Teil von MC2 (nicht separater Dienst). -- **MC_PORT vs tatsächlicher Port:** In Env ist `MC_PORT=9000`, aber der User-Service hört auf `:9001` (Port in Unit-Definition). Beim SSH-Deploy immer `:9001` verwenden. -- **llama-swap Config braucht sudo** zum Schreiben (`/etc/llama-swap/config.yaml`), aber `hitonabi` ist in `adm`-Gruppe → journalctl ohne sudo lesbar. -- **ROLE_IDS** in llamaswap.py = `{"vision", "coder", "agent", "scout"}` (reasoning entfernt 2026-06-27). -- **Discover-CATEGORIES** in sources.py: vision / coder / agent / scout (kein reasoning mehr). -- **API_SERVER_KEY:** in `~/.hermes/.env` auf der Box - ---- - -## /api/agent/status Felder (Stand 2026-06-27) -```python -{ - "gateway_reachable": bool, # Hermes :8642 - "webui_reachable": bool, # hermes-webui :8787 - "brain_model": str, # aus ~/.hermes/config.yaml - "has_config": bool, - "has_skills": bool, - "has_memories": bool, - "telegram_enabled": bool, # TELEGRAM_BOT_TOKEN gesetzt? - "mcp_server_count": int, # enabled MCP-Server in config.yaml - "pc_executor_reachable": bool # 192.168.178.98:7777/health -} -``` diff --git a/docs/memory/project-pending-tasks.md b/docs/memory/project-pending-tasks.md deleted file mode 100644 index 85b7ebb..0000000 --- a/docs/memory/project-pending-tasks.md +++ /dev/null @@ -1,51 +0,0 @@ -> ⚠️ **VERALTET (Stand 27.06.2026, Archiv).** Die einzige gepflegte Liste offener Punkte ist -> [docs/wissen/OFFENE-FAEDEN.md](../wissen/OFFENE-FAEDEN.md). - ---- -name: project-pending-tasks -description: Offene Tasks und bekannte Baustellen im MC2-Projekt (Stand 2026-06-27) -metadata: - node_type: memory - type: project - originSessionId: e6bf38ac-b5dc-4aaa-80c3-ad8dd078a1fe ---- - -## Offen / Pending - -### WebUI-Ersatz (LobeChat oder Alternative) -- hermes-webui (nesquena) läuft aktuell auf `:8787` -- Plan war: LobeChat als Docker-Container auf Proxmox LXC 105 -- Deploy-Artefakte liegen in `deploy/lobechat/` (docker-compose.yml, .env.example) -- **Noch nicht deployed** — LXC existiert noch nicht -- User erwähnte "AnywhereLLM" — unklar ob er AnythingLLM meint oder LobeChat; klären - -### Update-Checks in "Updates & Pflege" -- **Hermes Agent Updates:** Hermes v0.17.0 aus NousResearch/hermes-agent (GitHub) - - GitHub API: `https://api.github.com/repos/NousResearch/hermes-agent/releases/latest` - - Installierte Version via `hermes --version` ermitteln - - Noch nicht implementiert in `backend/services/maintenance.py` -- **WebUI Updates:** abhängig von welchem WebUI (LobeChat/hermes-webui/AnythingLLM) - - Noch nicht implementiert - -### PC Executor Windows Autostart -- `executor.py` läuft aktuell nur wenn `start.bat` manuell gestartet wird -- Kein Windows Startup-Task eingerichtet - -### Docs/README veraltet -- `README.md`, `docs/STATUS.md`, `docs/CUTOVER.md`, `docs/HERMES_SETUP.md` beschreiben - noch den Zustand vor Hermes-Unchaining, PC-Executor, MCP-Servern, Reasoning-Entfernung -- Sollten in einer Session aktualisiert werden - ---- - -## Erledigte größere Meilensteine (diese + letzte Session) -- ✅ Hermes unchained: Telegram + alle Tools + MCP-Server + PC-Steuerung -- ✅ mcp_pc.py + executor.py (PC-Zugriff via MCP) -- ✅ mcp_web.py (trafilatura Web-Extraktion) -- ✅ Reasoning-Modell entfernt (Nemotron, 25 GB freigegeben) -- ✅ UI-Audit: AgentStatusCard 2x2 + Telegram/MCP/PC-Status -- ✅ UI-Audit: PC-Executor-Karte (ersetzt SSH-Bypass-Karte) -- ✅ UI-Audit: incomplete-Badge + Load-Button disabled -- ✅ UI-Audit: TokenStatsCard "Juni 2026" entfernt -- ✅ LobeChat Deploy-Artefakte committed (deploy/lobechat/) -- ✅ Alter hermes-agent Daemon-Code entfernt (war obsolet) diff --git a/docs/memory/project-stack-state.md b/docs/memory/project-stack-state.md deleted file mode 100644 index 347b4ae..0000000 --- a/docs/memory/project-stack-state.md +++ /dev/null @@ -1,76 +0,0 @@ -> ⚠️ **VERALTET (Stand 27.06.2026, Archiv).** Die aktuelle, live-verifizierte Wahrheit -> steht in [docs/wissen/STACK.md](../wissen/STACK.md). Diese Datei nur noch als Historie lesen. - ---- -name: project-stack-state -description: "Aktueller Stand des MC2-Projekts — Infrastruktur, Modelle, Dienste, Git-State (Stand 2026-06-27)" -metadata: - node_type: memory - type: project - originSessionId: e6bf38ac-b5dc-4aaa-80c3-ad8dd078a1fe ---- - -## Wo alles liegt -- **Code lokal:** `F:\Coding Stuff\mission-control-2` (Windows-Dev-PC) -- **Git-Remote:** `https://git.tobisniceshomelab.ddnsfree.com/Hitonabi/mission-control-v2` (Branch `main`) -- **AI Box:** `hitonabi@192.168.178.151` — MC2 live auf `:9001` als User-Dienst -- **Deploy:** `ssh hitonabi@192.168.178.151 "bash ~/mission-control-v2/deploy/deploy.sh"` -- **Windows PC:** `192.168.178.98` (Tobis PC) -- **Proxmox:** `root@192.168.178.108:8006` (Passwort in Keepass) - -**Why:** Ist die einzige Quelle der Wahrheit für Verbindungsdaten. -**How to apply:** Vor SSH/Deploy immer diese IPs nutzen, nicht raten. - ---- - -## Dienste auf der AI Box (Stand 2026-06-27) -| Dienst | Port | Beschreibung | -|---|---|---| -| `llama-swap` (system) | `:8080` | Engine, **Vulkan/RADV** (seit 2026-06-27, vorher ROCm/HIP) | - -### Engine-Backend: Vulkan/RADV (Cutover 2026-06-27) -- **Gemessen:** RADV schlägt ROCm/HIP auf gfx1151 bei tg um **+12–22 %** (fast 53→65 t/s roh), Prefill gleich. - „ROCm gewinnt Prefill" gilt hier NICHT; auch bei 32K Tiefe bleibt RADV vorn. hipBLASLt bringt nichts. -- **Setup:** Vulkan-llama.cpp (offizieller Build b9821) in `/opt/llamacpp-vulkan`; Symlink - `/usr/local/bin/llama-server` → dorthin; systemd Drop-in `/etc/systemd/system/llama-swap.service.d/vulkan.conf` - mit `LD_LIBRARY_PATH=/opt/llamacpp-vulkan`. Treiber: `mesa-vulkan-drivers` (RADV STRIX_HALO, Mesa 26.0.3). -- **ROCm-Build bleibt** unter `/opt/llamacpp` (lemonade llamacpp-rocm) als Rollback liegen. -- **Rollback:** `sudo ln -sfn /opt/llamacpp/llama-server /usr/local/bin/llama-server` + Drop-in löschen + `sudo systemctl daemon-reload && sudo systemctl restart llama-swap`. -- **ACHTUNG maintenance.py:** `_engine_update_available()` trackt noch `lemonade-sdk/llamacpp-rocm` — passt nicht - mehr zum aktiven Vulkan-Build (b9821 von ggml-org/llama.cpp). Engine-Update-Quelle anpassen. -- **Spec-Draft (2026-06-27 gefixt):** `qwen2.5-1.5b` war vocab-inkompatibel mit Qwen3.6 UND `--spec-type` fehlte - → war inaktiv. Auch Qwen3-0.6B ist mit Qwen3.6 inkompatibel → **`fast` läuft jetzt ohne Draft** (kein - kompatibler verfügbar). **`coder` (Qwen3-Coder-Next)**: Qwen3-0.6B IST kompatibel → Draft - `/srv/models/drafts/Qwen3-0.6B-Q8_0.gguf` + `--spec-type draft-simple`, **0,75 Akzeptanz** (echter Coding-Speedup). - Alter `qwen2.5-1.5b-instruct-q4_k_m.gguf` in drafts/ ist jetzt ungenutzt (löschbar, 1,1 GB). -- **Modell-cmds (config.yaml):** llama.cpp dieser Generation braucht `--spec-type` zusätzlich zu - `--spec-draft-model`, sonst ist Spec inaktiv. Drafts müssen **exakt vocab-gleich** zum Target sein. -| `mission-control-2` (user) | `:9001` | MC2 Backend + Frontend | -| `hermes-gateway` (user) | `:8642` | Hermes Agent API | -| `hermes-webui` (user) | `:8787` | nesquena hermes-webui | - -MC2-Gateway auf `:9001/v1` ist der OpenAI-kompatible Endpunkt für IDEs (model:auto). - ---- - -## Modell-Stack (llama-swap, Stand 2026-06-27) -| Alias | Modell | TTL | Besonderheit | -|---|---|---|---| -| `hermes` | Hermes-4-14B (Q6_K) | 0 (immer warm) | Agent-Hirn, in brains-Gruppe | -| `fast` | Qwen3.6-35B-A3B (Q4_K_M) | 0 (immer warm) | MoE, Vision, SPEC-Draft, 2 Slots; in brains-Gruppe | -| `vision` | Qwen3-VL-2B-Instruct (Q4_K_M) | 0 (immer warm) | Tiny Vision; in brains-Gruppe | -| `heavy` | Qwen3.5-122B-A10B (Q4_K_M) | 600s | MoE, 32k ctx | -| `coder` | Qwen3-Coder-Next (Q4_K_M) | 600s | SPEC-Draft, 2 Slots | -| `scout` | gemma-4-26B-A4B-it (Q4_K_M) | 180s | Multimodal | - -`reasoning`-Rolle wurde entfernt (Nemotron gelöscht, 25 GB freigegeben, 2026-06-27). -brains-Gruppe hat `swap:false, persist:true` → hermes/fast/vision bleiben immer resident. - -**Config-Pfad auf Box:** `/etc/llama-swap/config.yaml` - ---- - -## Git-Stand -- Lokal, Gitea und AI Box alle synchron auf `main` -- Working tree clean (Stand nach letztem Push) -- Push nur via **PowerShell-Tool** mit `dangerouslyDisableSandbox:true` (kein Bash-Push → GCM-Auth-Problem) diff --git a/docs/skills/orchestrator.md b/docs/skills/orchestrator.md deleted file mode 100644 index 17e4e77..0000000 --- a/docs/skills/orchestrator.md +++ /dev/null @@ -1,198 +0,0 @@ -# orchestrator — Auftraege managen, nicht selbst ausfuehren - -> **Kurz:** Wenn ein Auftrag zu gross fuer einen Rutsch ist, zerlegt der Orchestrator-Skill ihn in Teil-Tasks, delegiert diese seriel an Worker-Modelle, integriert die Ergebnisse, laesst sie von zwei Zweitgutachtern pruefen und gibt dem Commander einen Vorschlag zur Entscheidung — der Orchestrator schreibt nie selbst Code. - -## Was der Skill tut - -Der Skill beschreibt ein Manager-Modell, das komplexe Auftraege in klar abgegrenzte Teil-Tasks zerlegt, jeden Teil seriel (nacheinander) an ein passendes Worker-Modell delegiert, die Ergebnisse einsammelt und zusammensetzt, sie durch ein Zwei-Kritiker-Gate prueft und als Telegram-Vorschlag zurueckgibt. Der Commander entscheidet, ob er annimmt oder verwirft. Der Orchestrator selbst baut und deployt **nie** etwas. - -## Wann er zum Einsatz kommt - -| Situation | Aktion | -|---|---| -| Auftrag ist zu gross fuer einen Rutsch (2-4 Teil-Tasks) | Orchestrator (diese Datei) | -| Auftrag ist klein und einfach | Direkt bearbeiten, kein Orchestrator | -| Auftrag ist zu gross (breite Architektur-Aenderung, viele Module) | Etappen-Plan: in lauffaehige Teilprojekte zerlegen | -| Nur ein einziger Code-Review-Schritt ist nötig | Werkstatt-Skill (`wartung`) | - -## Konfiguration - -### Vorhandene Skripte (immer mit vollem Pfad!) - -| Skript | Pfad | Aufgabe | -|---|---|---| -| Worker | `~/.hermes/scripts/worker.sh` | Delegiert einen Teil-Task an ein Worker-Modell (Ein-Schuss) | -| Fremdkritik | `~/.hermes/scripts/fremdblick.sh` | Laesst den zusammengesetzten Diff von einem zweiten Modell gegengelesen | - -**Wichtig:** Beide Skripte liegen NICHT auf dem PATH — sie muessen IMMER mit vollem Pfad aufgerufen werden. Glaubst du, sie fehlen: erst `ls -la ~/.hermes/scripts/worker.sh` ausfuehren. - -### Worker-Modelle - -| Rolle | Modell | Warum | -|---|---|---| -| Planung | `gpt-oss-120b` (heavy) | Fuer die initiale Architektur-Planung (laedt ~15s, stört Lucys Latenz gewollt — Hintergrundprozess) | -| Code-Bau | `Qwen3-Coder-Next` | Klein, passend neben dem Warm-Set, ideal fuer Teil-Task-Umsetzung | - -### Arbeitsverzeichnis - -Worktrees liegen unter `~/.hermes/worktrees/` (nicht `/tmp` — ueberlebt keinen Reboot). Die Live-Instanz `~/mission-control-v2` bleibt **unberuehrt** — immer im Worktree arbeiten. - -## Arbeitsablauf (Schritt-für-Schritt) - -### 1. Beratung & Zerlegen - -Bevor du selbst Tasks aufteilst, befragst du zwingend `gpt-oss-120b` nach einem Architektur-Plan: - -```bash -printf '%s' "Auftrag: " | \ - WORKER_MODEL=gpt-oss-120b WORKER_ROLE=plan \ - ~/.hermes/scripts/worker.sh > /tmp/orch-plan.txt -``` - -Lies den Plan und zerlege den Auftrag in eine geordnete, nummerierte Liste von Teil-Tasks (2-4). - -### 2. Worktree anlegen - -```bash -mkdir -p ~/.hermes/worktrees && cd ~/mission-control-v2 && \ - git fetch -q origin && \ - git worktree add ~/.hermes/worktrees/orch- \ - -b orchestrator/ origin/main -mkdir -p ~/.hermes/worktrees/orch--work -``` - -Der Slug ist ein kurzer Kebab-Case-Name des Auftrags (z. B. `login-fix`). - -### 3. Teil-Tasks seriel an Worker delegieren - -Fuer jeden Bau-Teil-Task: - -```bash -printf '%s' "" | \ - WORKER_ROLE=build \ - ~/.hermes/scripts/worker.sh > \ - ~/.hermes/worktrees/orch--work/.out -``` - -- Die Ausgabe beginnt mit `FEHLT:` → zu wenig Kontext, nachliefern und erneut rufen. -- Enthaltene Code-Zaunen (` ``` `) oder Prosa entfernen, sauberes Artefakt bleibt. -- **Du** schreibst das Artefakt mit deinen Datei-Tools an seinen Platz im Worktree. -- **Schreibziel-Pflicht:** Jedes write_file/patch MUSS mit `~/.hermes/worktrees/orch-/` beginnen. - -### 4. Integrieren + Self-Gate - -Die Worker liefern Bausteine — du sorgst dafuer, dass sie zusammenpassen (Imports, Verdrahtung, Namen). - -- **Python:** `python3 -m py_compile ` (Tests wenn moeglich mitlaufen lassen) -- **Shell:** `bash -n ` -- **Frontend:** im Worktree `cd frontend && npm install && npm run build`, neues `frontend/dist` MIT-committen - -**Live-Checkout unberuehrt (zwei Beweise):** - -```bash -git -C ~/mission-control-v2 status --porcelain -uno # MUSS LEER sein -curl -sf http://127.0.0.1:9001/api/health # MUSS Gruen zeigen -``` - -### 5. Zwei-Kritiker-Gate - -Zwei Zweitgutachter mit je anderer Staerke lesen den **gesamten** Diff gegen `origin/main`: - -Zuerst ALLES stagen: - -```bash -git -C ~/.hermes/worktrees/orch- add -A -``` - -Dann die Eingabe bauen: - -```bash -EINGABE="AUFTRAG (im Wortlaut): - - -ZERLEGUNG (deine Teil-Tasks, je 1 Zeile): -<1..n> - -GIT-DIFF des Worktrees: -$(git -C ~/.hermes/worktrees/orch- diff --cached origin/main)" -``` - -**Kritik A — Kompetenz** (`Qwen3-Coder-Next`, noch warm): - -```bash -printf '%s' "$EINGABE" | FREMDBLICK_MODE=code \ - ~/.hermes/scripts/fremdblick.sh -``` - -**Kritik B — Fremd-Blick** (`GLM-4.6V-Flash`, andere Modellfamilie): - -```bash -printf '%s' "$EINGABE" | FREMDBLICK_MODE=code \ - FREMDBLICK_MODEL=GLM-4.6V-Flash FREMDBLICK_MAXTOK=3000 \ - ~/.hermes/scripts/fremdblick.sh -``` - -**Gate-Regel (streng):** - -| Urteil | Aktion | -|---|---| -| Beide `FREIGABE` | Vorschlag erstellen | -| Einer `ABGELEHNT` | Nachbessern (max. 2 Runden), dann erneut gaten | -| Einer `FREIGABE-MIT-VORBEHALT` | Vorbehalte im Vorschlag ehrlich ausweisen | -| Kritiker fiel aus (`FEHLGESCHLAGEN`) | Einmal wiederholen, sonst "⚠ Kritik X fiel aus" vermerken | - -**Wichtig:** Ein Kritiker sagt JEWEILS `ABGELEHNT` oder `FREIGABE` oder `FREIGABE-MIT-VORBEHALT`. Sagt AUCH NUR EINER `ABGELEHNT` → nachbessern. Nur wenn BEIDE tragen → Vorschlag. - -### 6. Telegram-Vorschlag - -```bash -bash ~/mission-control-v2/deploy/notify.sh -s "[Orchestrator]" "" -``` - -Der Vorschhalt enthaelt: -- 1-2 Saetze: was gebaut wurde, was der Commander entscheiden soll -- Die Zerlegung (welcher Teil-Task an welches Worker-Modell) -- Geaenderte/neue Dateien · Kern des Diffs -- Self-Gate-Ergebnis · Kritiker-Urteil KONKRET (nicht nur "ok") -- Branch-Name · Frage "merge oder verwerfen?" - -### 7. Nichts loeschen - -Worktree + Branch + rohe Worker-Ausgaben bleiben liegen, bis der Commander entschieden hat. - -## Leitplanken (nicht verhandelbar) - -- **Du delegierst, du baust NICHT selbst.** Jedes Bau-Artefakt MUSS aus einem `worker.sh`-Aufruf stammen. Selbstgebaut = gescheiterter Lauf. -- **"Task zu klein" ist KEIN Freibrief.** Planung, Delegation oder Zwei-Kritiker-Gate NICHT eigenmaechtig ueberspringen — auch nicht "transparent angesagt". -- **Propose-only.** Am Ende steht IMMER ein Telegram-Vorschlag; die Entscheidung trifft der Commander. NIEMALS auf `main` committen, mergen oder deployen. -- **Nur im Worktree arbeiten.** Die Live-Instanz `~/mission-control-v2` bleibt unberuehrt. -- **Security-Config ist TABU:** keine Tokens, approvals, ufw, sudoers, ssh-Keys anfassen. -- **Hermes-first:** Bevor ein Teil-Task NEUE Infrastruktur baut, pruefe ob hermes-agent das nativ kann. - -## Pitfalls - -| Falle | Vermeidung | -|---|---| -| Code selbst schreiben statt Worker zu delegieren | Jedes Artefakt MUSS worker.sh-Quelle haben | -| In Live-Checkout schreiben statt Worktree | Schreibziel muss mit `~/.hermes/worktrees/` beginnen | -| `/tmp` fuer Worktrees nutzen | `~/.hermes/worktrees/` — ueberlebt Reboots | -| `git diff` ohne `add -A` → Kritiker sehen LEEREN Diff | Immer zuerst `git add -A`, dann `git diff --cached` | -| Zu wenig Kontext fuer Worker → `FEHLT:` | Betroffene Datei/Ausschnitt + Beispiel + genaue Signatur mitgeben | -| Grosse Artefakte in Antwort kippen → Output-Limit | In Dateien schreiben, Pfade + 1-Zeilen-Zusammenfassung in Antwort | -| Fremdblick-Skript nicht gefunden | Immer vollen Pfad `~/.hermes/scripts/fremdblick.sh` verwenden | -| Lockfile-Dreck beim Frontend-Build | Nach `npm install`: `git checkout -- frontend/package-lock.json` falls nicht geaendert | -| Nur Health-Curl als Beweis | `git status --porcelain -uno` MUSS LEER sein (Health-Curl allein reicht NICHT) | - -## Konsistenz mit MC2-Konventionen - -- **Sprache:** Deutsch, direkt, kein Marketing-Sprech. -- **Struktur:** Kurze Beschreibung → Wann einsetzen → Konfiguration → Arbeitsablauf → Pitfalls → Konsistenz. -- **Querverweise:** Verweise auf Werkstatt-Skill, Auftragsbuch, Worker- und Fremdkritik-Skripte. -- **Tabellen:** Wo sinnvoll (Situationen, Modelle, Gate-Regeln, Pitfalls) als Tabelle formatiert. -- **Code-Blöcke:** Alle Befehle als bash-Code-Blöcke mit klaren Variablen-Platzhaltern. -- **Keine Secrets:** Tokens und Pfade werden referenziert, nicht ausgeschrieben. -- **Leitplanken:** Nicht-verhandelbare Regeln als eigene Sektion, um Delegationstreue zu erzwingen. - ---- - -_Diese Datei wurde als Skill-Dokumentation im MC2-Repo erstellt. Sie ist Teil der Skills-Docs in `docs/skills/`._ From 24e6dd81baaa1832953385c3c6ab1a98392565fd Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 24 Sep 2026 15:38:10 +0200 Subject: [PATCH 2/5] doku: Wissen auf den Box-Wart-Stand (STACK, VERDIKTE, FALLEN, ARBEITSWEISE, OFFENE-FAEDEN) - STACK.md: Stand 24.09. - Dienste mit Zustand (Konsole und Spracherkennung schlafen), Units im Repo und nur auf der Box, Modelltabelle aus der Config vom 24.09. (Hirn, Coder, zwei Bild-Zwillinge, brains mit exclusive: false), Hermes v0.21.4 mit MCP-Stand nach der Diaet, vollstaendiger Automatik-Fahrplan (Timer, Hermes-Crons, NerdQuiz 03:00), Coding-Bahn OpenChamber, Sicherheit in einem Satz. - VERDIKTE.md: Box-Wart-Verdikte vom 23./24.09. ergaenzt (Umbau statt Neubau, zwei Instanzen, Homelab-Rechte und -Updates, keine Anmeldung, Nachtruhe, Timer, Box-Diaet, Radar-Leitplanken, Bild-Zwillinge, exclusive: false); Ueberholtes in eine Tabelle "Ueberholt (mit Datum)"; Formatfehler (Zeilen mit "|-") beseitigt. - FALLEN.md: neue Fallen (Persistent=true, Abzug ueberschreibt lebende Config, Jobs sterben bei MC2-Neustart, exclusive, Draft+Bild=500, Hermes-Cron als Updater, write_file, web_extract, Gitea-SSH-Benutzer); Werkstatt-, Kritiker-, Delegations- und Desktop-Fallen gestrichen. - ARBEITSWEISE.md mit GRENZEN.md zusammengelegt; Flaechen-Tabelle fuer Box-Wart, Homelab-Teil, Lucy, Hermes, Telegram, OpenChamber, Android-App. - OFFENE-FAEDEN.md neu: Phasen 0-5 laut Plan (Phase 1 laeuft, Oberflaeche und Doku offen) und 13 offene Einzelpunkte, alle am Code in main belegt. Co-Authored-By: Claude Opus 5.5 --- docs/wissen/ARBEITSWEISE.md | 118 +++++++++------- docs/wissen/FALLEN.md | 243 +++++++++++++++----------------- docs/wissen/GRENZEN.md | 43 ------ docs/wissen/OFFENE-FAEDEN.md | 79 +++++++++++ docs/wissen/STACK.md | 250 ++++++++++++++++----------------- docs/wissen/VERDIKTE.md | 264 +++++++++++++++++------------------ 6 files changed, 509 insertions(+), 488 deletions(-) delete mode 100644 docs/wissen/GRENZEN.md create mode 100644 docs/wissen/OFFENE-FAEDEN.md diff --git a/docs/wissen/ARBEITSWEISE.md b/docs/wissen/ARBEITSWEISE.md index c281caa..5198ca4 100644 --- a/docs/wissen/ARBEITSWEISE.md +++ b/docs/wissen/ARBEITSWEISE.md @@ -1,65 +1,75 @@ -# Arbeitsweise — wer der User ist und wie hier gearbeitet wird +# Arbeitsweise — wer der User ist, wie hier gearbeitet wird, was wohin gehört -_Kuratiert 10.07.2026. Gilt für JEDEN Agenten, der an diesem System arbeitet -(Box-Hermes, Hermes Desktop, Gemini/Antigravity, künftige)._ +_Stand 24.09.2026. Gilt für jeden Agenten, der an diesem System arbeitet (Claude Code, OpenChamber/OpenCode, +Lucy auf der Box). Enthält seit 24.09. auch die frühere Grenzen-Landkarte._ -## Der User (Hitonabi / „Commander") +## Der User (Hitonabi, „Commander") -- **Kein Software-Entwickler.** Selbstbild: „ich mache keine Updates". Er fasst keine - Konsole an und drückt keine Update-Knöpfe — alles muss ohne ihn funktionieren oder - per Knopf/Lucy/Telegram bedienbar sein. -- **GUI-first / „klicki bunti":** visuelle, klickbare Oberflächen sind sein Geschmack; - Terminal-Lösungen sind Fremdkörper. Sein Referenz-Erlebnis ist der - Antigravity-Agent-Manager-Stil: Aufträge verteilen, Agenten zuschauen, Diffs abnicken. -- **Produkt-Instinkt ernst nehmen:** seine „naiven" Fragen treffen oft den Kern - (Marketing-Filter → Fan-out-Kritiker; „alles autonom" → Appliance-Prinzip; - „Update verpassen?" → Radar). Vorschläge ernsthaft prüfen, nie abtun. -- Sprache: **Deutsch**, locker, direkt. Lucy nennt ihn „Commander". -- **Nordstern (wörtlich):** „Das komplette System muss AUTONOM funktionieren — in 6 Monaten - ohne Claude darf nichts brachliegen." Robustheit/Autonomie schlägt Features. +- **Kein Software-Entwickler.** Er fasst keine Konsole an und macht keine Updates von Hand. Alles muss ohne ihn + laufen oder per Knopf, Lucy oder Telegram bedienbar sein. +- **GUI-first:** klickbare Oberflächen statt Terminal. Sein Wunsch-Erlebnis: Aufträge verteilen, zusehen, Ergebnisse + abnicken. +- **Produkt-Instinkt ernst nehmen:** Seine einfachen Fragen treffen oft den Kern. Vorschläge ernsthaft prüfen, nie + abtun. +- **Sprache:** Deutsch, locker, direkt. Er schreibt oft roh und knapp. Lucy nennt ihn „Commander". +- **Nordstern (wörtlich):** „Das komplette System muss AUTONOM funktionieren — in 6 Monaten ohne Claude darf nichts + brachliegen." Robustheit und Autonomie schlagen Features. -## Die nicht verhandelbaren Regeln +## Die Regeln -1. **Verifizieren vor Behaupten.** Vor jeder Aussage/Änderung auf der Box messen - (SSH, Logs, curl, bench) statt aus Doku/Memory/Web zu schließen. Der Agenten-Erzählung - (auch der eigenen) nie glauben — Transcripts, worker.log, git-Status sind Beweise. - Mehrere erste Befunde kippten erst bei sauberer Gegenprobe. -2. **Scope challengen.** Ein Tool-/Technik-Vorschlag (auch vom User) ist kein - Umsetzungsbefehl: erst Use-Case klären, bei erkennbarer Fehlannahme kurz stoppen und - warnen. Lehrbuch-Best-Practice ≠ unser Use-Case (Beispiele: LobeChat, Tool Search). -3. **Propose-only + Mensch-Gate.** Jede Code-Zeile geht als Branch nach Gitea; gemergt wird nur vom User (Ampel grün). - Merge/Deploy NIE ohne grünes Gate. Bagatell-Klassen ohne Klick sind ausschließlich: - Doku/Wiki/Vault/Chronik/tote Dateien — nichts mit Code-Logik, immer Morgenlage-Bericht. -4. **Security-Config NIE ohne explizites User-Ja** (approvals, Tokens, ufw, sudoers, - command_allowlist). Direkt-Push auf main braucht ebenfalls ein explizites Ja. -5. **Fremd-Modell-Kritiker als Korrektiv.** Wer baut, benotet nicht selbst. - Zwei-Kritiker-Gate (Coder-Next + GLM), Urteil nach der Regel - **REPRODUZIERT-ODER-ABGELEHNT** — Freispruch nur mit belegtem Vorher/Nachher. -6. **Hermes-first vor Eigenbau.** Vor jedem Neubau prüfen, ob Hermes es nativ kann - (Eigenbau-Landkarte im Vault → `hermes --help`); Befund in den Vorschlag schreiben. - Hermes-Quellcode wird NIE gepatcht/geforkt. -7. **Alles reversibel:** Branch + Backup + Zeitmaschine + Pin-Register. Nichts bauen, - was Lucys ~1-s-Sprech-Latenz oder das Warm-Set gefährdet. -8. **Deutsch für alles User-Sichtbare** (Meldungen, Skills, Summaries, Karten). - Erste Zeile von Meldungen idealerweise: „Musst du etwas tun? NEIN/JA: …" +1. **Verifizieren vor Behaupten.** Vor jeder Aussage oder Änderung an der Box messen (SSH, Logs, `curl`, Messlauf), + statt aus Doku, Gedächtnis oder Web zu schließen. Der Erzählung eines Agenten (auch der eigenen) nie glauben: + Protokolle, Git-Stand und Messwerte sind Beweise. +2. **Scope challengen.** Ein Technik-Vorschlag (auch vom User) ist kein Bauauftrag: erst den Zweck klären, bei einer + erkennbaren Fehlannahme kurz stoppen und warnen. Lehrbuch-Praxis ist nicht automatisch unser Fall. +3. **Branch, Prüftor, dann Merge.** Nie direkt auf `main` arbeiten. `bash deploy/pruefen.sh` muss grün sein. + Claude darf bei grünen Prüfläufen selbst mergen und deployen (User-Entscheid 23./24.09.). Ein Direkt-Push auf + `main` ohne Branch braucht ein ausdrückliches Ja. +4. **Security-Config nie ohne ausdrückliches User-Ja** (approvals, Tokens, ufw, sudoers, command_allowlist). +5. **Endgültig löschen nur per User-Klick** (Modelle, Dateien und Reste auf der Box). Vorschlagen ja, selbst löschen nein. +6. **Hermes-first vor Eigenbau.** Vor jedem Neubau prüfen, ob Hermes es kann (`hermes --help`, Config, Plugins). + Hermes-Quellcode wird nie gepatcht oder geforkt. +7. **Alles reversibel:** Branch, Sicherung, Festhalten (Pin-Register). Nichts bauen, was Lucys Sprech-Latenz oder das + warme Hirn gefährdet. +8. **Deutsch für alles, was der User sieht** (Oberfläche, Meldungen, Skills, Zusammenfassungen, Commit-Messages). + Die erste Zeile einer Meldung sagt am besten, ob er etwas tun muss. +9. **Doku folgt dem Code.** Wer Verhalten ändert, zieht README, `docs/` und `deploy/jobs/README.md` im selben Branch + nach (Pflegeregeln: [docs/README.md](../README.md)). -## Rollen-Abgrenzung der Türen +## Die Flächen — was gehört wohin -- **Lucy (Electron-App)** = Zuruf, Voice, Begleitung — schlanke api_server-Lane, nicht mästen. -- **Hermes Desktop** = Arbeit: Projekte, Coding, Review, lange Threads (cli-Lane). - Faustregel: „Repo oder >2 Minuten → Desktop". -- **Telegram** = mobil + Melde-/Freigabe-Kanal (Alarmkette, Cron-Delivery). -- **MC2-Web-UI** = Verwaltung, Ideen, Chronik/Zeitmaschine, Wissen. - **Steuerpult, kein Chat** — Gesprächs-/Voice-Funktionen gehören zu Lucy/Telegram, nicht in MC2. -- **Gemini/Antigravity** = Notfall + Außen-Review, siehe [GEMINI_BRIEFING](../GEMINI_BRIEFING.md). +**Kern in einem Satz:** Box-Wart = Steuerpult (anschauen, klicken) · Lucy = Stimme und Gespräch · Hermes = das +Agenten-Fundament darunter (Quelle tabu) · Telegram = mobil melden · OpenChamber = Coding am PC. -**Bevor du ein Feature baust: [GRENZEN.md](GRENZEN.md)** — die volle „was gehört wohin"-Landkarte -inkl. Code-Ebenen (MC2 vs. Lucy vs. Hermes-Config/Skill/Hook, Quelle tabu) und der roten Linien. +| Fläche | Ort | Gehört hierhin | Gehört nicht hierhin | +|---|---|---|---| +| **Box-Wart** (MC2) | dieses Repo, `:9001` | Updates, Wächter-Hinweise, Modelle, Radar, Aufräumen, Dienste und Protokolle, Sicherungen, Einstellungen | ein Chat- oder Gesprächsfenster | +| **Homelab-Teil** (ab Phase 2) | gleiche Software als Container auf dem Proxmox-PC | Homelab-Geräte, deren Updates per Knopf, Erreichbarkeit | Dinge der KI-Box (die bleiben beim Box-Wart) | +| **Lucy** (Desktop-App) | Repo `F:\Coding Stuff\lucy` (Electron) | Sprache, Gespräch, proaktive Meldungen aus dem Briefkasten | Verwaltungs- und Update-Knöpfe | +| **Hermes** (Agent „Lucy" auf der Box) | `~/.hermes/` | Verhalten über `config.yaml`, `SOUL.md`, Skills, Plugins, MCP-Server | Änderungen am Quellcode in `~/.hermes/hermes-agent/` | +| **Telegram** | Hermes-Plattform | Meldungen empfangen, mit Lucy schreiben | eigene Oberflächen | +| **OpenChamber** | PC, Dateien unter `F:\Coding Stuff\…` | Coding; Modelle kommen von der Box über `:9001/v1` | Box-Verwaltung | +| **Android-App** (Phase 5) | noch offen | Push, Cockpit, Updates freigeben, Lucy per Sprache | – | + +**Schnell-Entscheid „Ich will X bauen":** + +- etwas anzeigen, verwalten, per Knopf auslösen → Box-Wart (Backend-Router dünn, Logik in `backend/services/`). +- reden, hören, proaktiv melden → Lucy. +- wie der Agent sich verhält (Werkzeug, Prompt, Fähigkeit) → Hermes-Config, `SOUL.md`, Skill, Plugin oder MCP-Server. +- etwas mobil melden → `deploy/notify.sh` (Telegram und Briefkasten in einem Aufruf). +- Wissen oder Doku ablegen → `docs/` in diesem Repo. + +**Rote Linien:** + +- Kein Chat im Box-Wart. Keine Update-Knöpfe in Lucy. +- Nie den Hermes-Quellcode ändern. +- Nie im Box-Checkout `~/mission-control-v2` von Hand ändern oder committen; neuer Code kommt nur über Gitea und + `deploy/deploy.sh`. +- Keine Doku in Lucys Gedächtnis kippen: Es lernt selbst und ist kein Ablageort. ## Wissens-Orte -- `docs/wissen/` (dieses Verzeichnis) = kuratierte Projekt-Wahrheit für alle Agenten. -- `AGENTS.md` (beide Repos) = verbindliche Bau-Regeln je Repo (lesen Zed/Kilo/Hermes nativ). -- `~/wissens-vault/` = Lucys Lernschicht (Träume, Radar, Eigenbau-Landkarte) — git-versioniert, - im MC2-UI als Wissens-Tab. -- Mem0 (`:8765`) = das LIVE-Gedächtnis (auto-lernend, semantisch) — kein Ablageort für Doku. +- `docs/` in diesem Repo = kuratierte Projekt-Wahrheit für alle Agenten (Index: [docs/README.md](../README.md)). +- `AGENTS.md` (hier und im Lucy-Repo) = verbindliche Bau-Regeln; OpenCode und Claude Code lesen sie selbst. +- `~/.hermes/memories/` = Lucys Gedächtnis; Hermes führt es selbst. +- Das Claude-Gedächtnis am PC = Arbeitsnotizen der Claude-Sitzungen, nicht verbindlich. Was bleiben soll, gehört hierher. diff --git a/docs/wissen/FALLEN.md b/docs/wissen/FALLEN.md index f8f501b..b59d5d0 100644 --- a/docs/wissen/FALLEN.md +++ b/docs/wissen/FALLEN.md @@ -1,140 +1,129 @@ # Betriebs-Fallen — hart erarbeitet, nicht nochmal reintreten -_Kuratiert 10.07.2026. Jede Falle hat hier mindestens einmal real Zeit gekostet. -Neue Fallen: hier eintragen, mit Datum und Symptom._ +_Stand 24.09.2026. Jede Falle hat mindestens einmal real Zeit gekostet. Neue Fallen hier eintragen, mit Datum +und Symptom; Erledigtes streichen (die Git-Historie behält es)._ -## Git & Deploy +## Git und Deploy -- **deploy.sh resettet sich SELBST mitten im Lauf.** Es macht früh `git reset --hard - origin/main`; bash liest aber aus dem alten File-Descriptor weiter → neue Install-Schritte - (z. B. neue `cp`-Zeilen) greifen beim ERSTEN Deploy nach der Änderung NICHT. - → deploy.sh ein ZWEITES Mal laufen lassen oder Artefakte von Hand nachinstallieren. - Danach IMMER verifizieren, dass die neuen Dateien/Units wirklich da sind. -- **deploy.sh-enable-Zeilen können User-Entscheide zurückdrehen.** Beispiel mc2-autoupdate: - „einmalig deaktiviert" wurde von jedem Deploy still re-enabled, bis die Zeile raus war. - Bei Entscheiden der Form „X bleibt aus" immer deploy.sh gegenprüfen. -- **Paralleler Git-Zugriff auf den Shared-Checkout:** Mehrere Agenten/Sessions arbeiten - zeitweise im selben `F:\`-Verzeichnis — HEAD kann unter einem wandern, uncommittete Edits - verschwinden. → Änderungen sofort committen; zum Landen auf main einen ISOLIERTEN Worktree - nutzen: `git worktree add --detach origin/main` → cherry-pick → rebase → - `git push origin HEAD:main` → Worktree weg. -- **Gitea-Push:** nur via PowerShell/GCM (Bash-Tool scheitert an der Credential-Auth); - „Failed to authenticate user" heißt oft nur „3 s warten, Retry" — Auth ist flatterhaft. - Wenn der nicht-interaktive Push hart scheitert: User pusht EINMAL interaktiv, danach geht's. -- **CRLF:** Box-git hat `core.autocrlf false` + `.gitattributes` erzwingt LF für - `*.sh/*.service/*.timer` — sonst `pipefail\r`-Abbrüche. Windows-Pipe auf die Box: - CR-Falle (`sed 's/\r$//'`). -- **Stale `index.lock`** im Box-Repo nach Deploy-Abbruch: Alter prüfen, dann löschen. -- **`hermes` ist über SSH nicht im PATH** → immer `bash -lc 'hermes …'`. -- **Werkstatt-Orphan-Branches („refusing to merge unrelated histories"):** macht ein - Worker `git init`/Shallow statt voll zu klonen, entsteht ein Branch OHNE gemeinsamen - Vorfahren — Erkennungsmuster auf der Karte: **Diff „0 Dateien" + „hinter main" ≈ ganze - Historie** (z. B. 386). Merge ist NIE möglich; oft ist der Inhalt obendrein Müll - (~/.hermes-Dateien statt Repo-Dateien). (Historisch: das Auftragsbuch markierte solche Branches; es ist seit 04.09.2026 - ausgebaut.) Erkennung heute: `git merge-base main ` leer → Branch verwerfen. Prävention steht in der werkstatt-SOUL (voll klonen + merge-base-Selbstcheck). -- **Ehrlich-veraltete Branches (echter Merge-Konflikt):** vor dem Merge `git rebase main` - auf dem Branch; kollidiert auch das, Branch verwerfen und die Idee frisch aufsetzen. +- **Timer mit `Persistent=true` holen verpasste Läufe beim ersten Einschalten sofort nach (24.09.).** + `mc2-autoupdate.timer` war seit August aus; beim `enable --now` lief der Sonntagslauf an einem Donnerstag um 14:51 + und startete die Box neu. Seitdem startet `autoupdate.sh` die Box nur So 04:00–06:59 neu, und `deploy.sh` startet + den Timer nur, wenn er nicht schon läuft. +- **Wer den llama-swap-Abzug im Repo ändert, überschreibt beim Deploy die lebende Config komplett (24.09.).** + Was Oberfläche oder Radar seitdem eingetragen haben, ist dann weg (Sicherung: `/etc/llama-swap/config.yaml.bak-*`, + die letzten 5). Vorher `diff /etc/llama-swap/config.yaml deploy/llama-swap.config.yaml` und den lebenden Stand ins + Repo holen. `MC_DEPLOY_SKIP_SWAP_CONFIG=1` lässt die Config ganz in Ruhe. Bis 24.09. überschrieb jeder Deploy sie + bei jeder Abweichung und startete den Motor neu. +- **Ein Neustart von MC2 bricht laufende Update- und Download-Jobs ab (24.09.).** Sie leben im MC2-Prozess. + `deploy.sh` verschiebt den Deploy deshalb, solange ein Job läuft (`MC_DEPLOY_TROTZDEM=1` erzwingt). +- **`deploy.sh` schaltet alles in `AKTIV` wieder ein.** Wer einen Dienst oder Timer dauerhaft aus haben will, nimmt + ihn dort heraus, sonst dreht der nächste Deploy den User-Entscheid zurück (mit `mc2-autoupdate` schon passiert). + Schlafende Units (`box-console`, `voice-service`) stehen nur in `UNITS`. +- **Den Box-Checkout nie von Hand ändern.** Stufe 1 holt `main` nur per fast-forward; geänderte oder eigene Commits im + Checkout lassen den Deploy scheitern, bevor er etwas umstellt. +- **Paralleler Git-Zugriff auf den geteilten Checkout am PC:** Mehrere Agenten arbeiten zeitweise im selben + `F:\`-Verzeichnis, HEAD kann wandern. Änderungen sofort committen; zum Landen einen isolierten Worktree nutzen + (`git worktree add --detach origin/main` → cherry-pick → `git push origin HEAD:main` → Worktree weg). +- **Gitea-SSH: Benutzer `gitea`, nicht `git`, Port 2222 (21.08.).** Mit `git@` kommt nur + `Permission denied (publickey)`, der Grund steht nur im Gitea-Log. Bei vielen Schlüsseln am PC `IdentitiesOnly yes` + setzen, sonst bricht Gitea vorher ab. Bei Aussetzern: Push mit Retry. +- **Repo-Name aus der Remote-URL, nicht aus dem Ordnernamen (21.08.):** lokal `mission-control-2`, auf Gitea + `mission-control-v2` (`deploy/push-und-sync.ps1` liest die URL). +- **CRLF:** `.gitattributes` erzwingt LF für `*.sh`, `*.service`, `*.timer` und `deploy/**/*.py`, sonst bricht bash an + `pipefail\r`. Was per Pipe vom Windows-PC auf die Box geht: `sed 's/\r$//'`. +- **Stale `index.lock`** im Box-Repo nach einem abgebrochenen Deploy: Alter prüfen, dann löschen. +- **Veraltete Branches mit echtem Konflikt:** vor dem Merge `git rebase main`; kollidiert auch das, Branch verwerfen + und neu aufsetzen. +- **Untracked Dateien fehlen in `git diff`:** Wer Änderungen prüfen lässt, erst `git add -A`, dann `git diff --cached`. -## Box / systemd / llama-swap +## Box, systemd, llama-swap -- **User-Units über SSH:** erst `export XDG_RUNTIME_DIR=/run/user/$(id -u)`, sonst sieht - `systemctl --user` nichts. -- **llama-swap:** Schutz-Key heißt **`persistent:`** — `persist:` wird still ignoriert - (dieser Tippfehler hat wochenlang den Verdrängungsschutz deaktiviert). `persistent` - schützt NUR gegen Verdrängung, NICHT gegen ttl-Selbstentladen → **jedes brains-Mitglied - braucht ttl:0.** Nach jedem Config-Reload (auch scp!) ist das Warm-Set LEER → Mini-Requests - an hermes/embed(/reranker) schicken. -- **`warmup.sh` liegt als Root-Kopie** unter `/usr/local/bin/llama-swap-warmup.sh` und wird - vom sudo-freien deploy.sh NICHT aktualisiert → nach Änderung manuell `sudo install`. -- **llama-swap NIE neustarten**, wenn es nicht sein muss (Warm-Set weg = Lucy-Latenz). -- **Nie zwei ~70-GB-Benches direkt nacheinander** (OOM-Kill beim zweiten). -- **Box ist deutschsprachig (de_DE):** jeder CLI-Output-Parser braucht `LC_ALL=C` - (apt sagt sonst „aktualisierbar von:" statt „upgradable from:"). -- **`pkill -f` über SSH matcht die eigene Remote-Shell** → Muster als `'[g]en…'` klammern. -- **Deploy restartet voice-service** → Übernacht-Jobs mit STT-QA-Gate brauchen - Wiederanlauf-Logik (Backoff-Retry im hear()-Pfad). -- **llama.cpp streicht Flags ohne Vorwarnung:** `--no-mmap` gibt es seit b10936 nicht mehr - (`error: invalid argument`) → JEDES Modell stirbt 2 s nach dem Start, llama-swap meldet nur - „upstream command exited prematurely", der Stack-Check nur „rot". Ersatz: `--load-mode none` - (gleiche Leistung, gemessen 17.09.2026: Coder 32 t/s, Hirn 85 t/s). Vor einem Engine-Sprung - jede Config-Kommandozeile mit dem neuen `llama-server` parsen lassen (Port 5899, `timeout 6`, - `${PORT}` ersetzen) — Argumentfehler kommen sofort, vor dem Laden. +- **User-Units über SSH:** erst `export XDG_RUNTIME_DIR=/run/user/$(id -u)`, sonst sieht `systemctl --user` nichts. +- **Ohne `exclusive: false` ist eine llama-swap-Gruppe exklusiv (24.09.).** Jede Anfrage ans Hirn entlud den Coder + samt Prompt-Cache; OpenChamber rechnete danach den ganzen Vorlauf neu. +- **Draft und Bild in einem `llama-server` ergeben HTTP 500 (04.09., bestätigt 24.09.):** „failed to process + speculative batch", geprüft mit b11057 und b11157, auch mit `speculative.n_max=0` je Anfrage. Lösung: + Bild-Zwillinge ohne Draft. +- **llama-swap versteht nur `persistent:`**, `persist:` ignoriert es still (MC2 liest `persist`, deshalb stehen beide + in der Config). `persistent` schützt nur vor Verdrängung, nicht vor dem ttl-Entladen: Warm-Mitglieder brauchen + `ttl: 0`. Nach jedem Config-Reload ist alles entladen; der Steward wärmt das Hirn nach. +- **`warmup.sh` liegt als Root-Kopie** unter `/usr/local/bin/llama-swap-warmup.sh`; `deploy.sh` aktualisiert sie nicht. + Nach einer Änderung: `sudo install -m 0755 deploy/warmup.sh /usr/local/bin/llama-swap-warmup.sh`. +- **llama-swap nie ohne Not neu starten:** Alle Modelle sind danach entladen, Lucy antwortet langsam. +- **Nie zwei ~70-GB-Messungen direkt nacheinander** (OOM-Kill beim zweiten). +- **llama.cpp streicht Flags ohne Vorwarnung (17.09.):** `--no-mmap` gibt es seit b10936 nicht mehr; jedes Modell + stirbt 2 s nach dem Start, llama-swap meldet nur „upstream command exited prematurely". Ersatz: `--load-mode none`. + Vor einem Engine-Sprung jede Config-Kommandozeile mit dem neuen `llama-server` parsen lassen (Port 5899, + `timeout 6`, `${PORT}` ersetzen). +- **Die Box ist deutschsprachig (de_DE):** Parser von CLI-Ausgaben brauchen `LC_ALL=C` (apt sagt sonst + „aktualisierbar von:"). +- **`pkill -f` über SSH trifft die eigene Remote-Shell** → Muster klammern (`'[g]en…'`). +- **Einmal-Dienste hinter Timern fallen still aus (07.–23.09.):** `projekte-sync` scheiterte 16 Tage lang stündlich an + einem leeren Gitea-Repo, niemand merkte es. Seit 23.09. meldet der Wächter gescheiterte Timer-Läufe. ## Hermes -- **Toolsets haben ZWEI Ebenen:** aktiv = NICHT in `agent.disabled_toolsets` UND in - `platform_toolsets.`. api_server (Voice) hat eine bewusste Diät-Allowlist; - MCP-Server sind namentlich allowlistbar (Key `mcp_servers`, snake_case). - `hermes prompt-size` ist Allowlist-BLIND — echte Kontrolle nur per Live-Call. -- **`MINIMUM_CONTEXT_LENGTH = 64000`:** Modelle mit kleinerem Kontext (heavy 32k, vision 32k) - sind als delegate_task-Ziel tot — der Fehler kann STILL ausfallen. Fremd-Kritik deshalb via - fremdblick.sh (Ein-Schuss), nie via Delegation. -- **delegate_task läuft top-level IMMER background** → in `hermes -z`/Cron-Ein-Schuss stirbt - das Kind mit dem Prozess. Nur langlebige Sessions (Chat/Desktop/Telegram) profitieren. -- **Cron-Fallen:** kein TZ-Feld (next_run_at = System-TZ zum Anlege-Zeitpunkt; nach - TZ-Wechsel `cron edit --schedule ""` zum Neuberechnen) · Prompt/Positionsargumente - MÜSSEN vor die Flags · `--script` allein reicht nicht (braucht Prompt oder Skill) · - Cron-Kontext hat `HERMES_CRON_SESSION=1` (`approvals.cron_mode` ist seit dem KISS-Umbau `auto`, nicht mehr `deny`). -- **Feed-Skripte: Pipe + Heredoc gleichzeitig = Heredoc gewinnt stdin** → JSON via Temp-Datei - übergeben. Außerdem ehrlichen Blind-Pfad einbauen (API kaputt → „AUSGEFALLEN", nicht „0 Funde"). -- **Hooks:** Consent persistiert NUR über CLI-/Gateway-Start mit `HERMES_ACCEPT_HOOKS=1`; - `hermes hooks test` schreibt die Allowlist NICHT; Skript-Änderung invalidiert Consent (mtime). -- **GLM-Modelle sind Reasoning-Modelle:** content kommt NACH reasoning_content → - max_tokens großzügig (fremdblick: FREMDBLICK_MAXTOK bis 4500), sonst leeres Urteil. -- **Manager-Konfabulation:** Das Hirn überspringt Delegation gern „aus Bequemlichkeit" mit - erfundener Begründung („worker.sh existiert nicht"). Gegenmittel: worker.log als harter - Nachweis + Skill-Regel „du baust NICHT selbst" + Transcript prüfen, nie der Erzählung glauben. -- **Kritiker == Worker = blinder Fleck** („benotet eigene Hausaufgaben") → Zwei-Kritiker-Gate, - Urteil REPRODUZIERT-ODER-ABGELEHNT. -- **stage-vor-Diff:** untracked Dateien → `git diff origin/main` leer → Kritiker prüfen NICHTS. - Erst `git add -A`, dann `git diff --cached`, „Diff leer → STOPP". -- **Werkstatt-Gate:** `git -C ~/mission-control-v2 status --porcelain -uno` MUSS leer sein - (curl /api/health allein ist ein Loch — alter Code läuft im RAM weiter). -- **`hermes update` meldet Exit 1 trotz Erfolg:** nach seinem eigenen Gateway-Neustart erwartet es - Zeilen vom „Fleet version check"; unter systemd kommen keine → Exit 1 (#93406). Der MC2-Job - bricht dann die `&&`-Kette ab (kein doctor, UI ohne `/hermes-ui/`-Basis), autoupdate.sh rollt - zurück und PINNT — obwohl der Gehirn-Check grün war (06. und 17.09.2026). Deshalb - `--no-gateway-restart`: Neustart und Urteil gehören dem Job. Pins stehen in - `/srv/models/mc2-pins.json` und werden NUR von Hand gelöst — gepinnt = still eingefroren. +- **Ein Updater darf nicht als Kind von Hermes laufen (20.09.).** Der Hermes-Cron „Updates am Sonntag" startete beim + Hermes-Update das eigene Gateway neu: 180 s Drain, dann Exit FAILURE. Seit 24.09. läuft das Update als eigener Timer. +- **`hermes update` meldet Exit 1 trotz Erfolg (06. und 17.09.):** Nach dem eigenen Gateway-Neustart wartet es auf + Zeilen des „Fleet version check", unter systemd kommen keine. Die Update-Kette brach ab, `autoupdate.sh` rollte + zurück und hielt Hermes fest, obwohl der Gehirn-Check grün war. Deshalb `--no-gateway-restart`: Neustart und Urteil + gehören dem Job. +- **Festgehalten heißt still eingefroren (06.–17.09.):** Motor und Hermes bekamen elf Tage keine Updates. Seit 23.09. + zeigt der Wächter jeden festgehaltenen Baustein als Hinweis mit Knopf „Freigeben". +- **Werkzeugsätze haben zwei Ebenen:** aktiv ist, was nicht in `agent.disabled_toolsets` steht UND in + `platform_toolsets.`. Cron-Jobs hatten bis 21.08. die volle Werkzeugkiste, weil + `platform_toolsets.cron` fehlte (heute `[web, terminal]`). `hermes prompt-size` ist für die Allowlist blind; echte + Kontrolle nur per Live-Aufruf. +- **Wer einen Werkzeugsatz abschaltet, muss `SOUL.md` mitlesen (21.08.):** Dort standen noch Anweisungen, die auf + abgeschaltete Werkzeuge zeigten. +- **Cron-Fallen:** kein TZ-Feld (`next_run_at` = System-TZ beim Anlegen; nach einem TZ-Wechsel + `hermes cron edit --schedule ""`); Prompt und Positionsargumente vor die Flags; `--script` allein reicht nicht + (braucht Prompt oder Skill); Cron-Kontext hat `HERMES_CRON_SESSION=1`. `hermes cron edit "text"` speichert + nichts, der Prompt muss über `--prompt` kommen (21.08.). +- **`hermes` ist über SSH nicht im PATH** → `bash -lc 'hermes …'`. +- **Hermes' `terminal`-Werkzeug bricht nach 30 s ab (22.08.):** Der Agent hielt den Aufruf für gescheitert und rief + `news-melden.sh` ein zweites Mal auf, der Bericht kam doppelt. Das Skript kehrt deshalb sofort zurück und sperrt + Doppelversand. +- **Hermes' `write_file` überschreibt keine vorhandene Datei (23.09.):** Lag der Bericht vom Vortag noch in `/tmp`, + scheiterte jeder Morgenlauf erst an „Refusing to overwrite". `news-melden.sh` räumt den Bericht jetzt weg. +- **`web_extract` wertet kurze Seiten als Fehler (24.09.):** Hermes hängt an jedes Ergebnis ein leeres `"error"`-Feld + und prüft nur die ersten 500 Zeichen. Der Wächter zählt mehrzeilige `"results"`-Treffer deshalb nicht als + Werkzeugfehler. +- **Lucys Stimme ist `lucy-stimme` auf `:8021`, nicht `voice-service` auf `:8650` (21.08.):** Dort sind nur + Cloud-Stimmen geladen. +- **Reasoning-Modelle:** `content` kommt nach `reasoning_content`; `max_tokens` großzügig setzen (für + Werkzeug-Aufrufe ≥ 1500), sonst bleibt die Antwort leer. +- **Hooks:** Die Zustimmung bleibt nur über einen CLI- oder Gateway-Start mit `HERMES_ACCEPT_HOOKS=1` erhalten; + `hermes hooks test` schreibt die Allowlist nicht; eine Skript-Änderung macht die Zustimmung ungültig (mtime). +- **Feed-Skripte: Pipe und Heredoc zugleich, dann gewinnt der Heredoc stdin** → JSON über eine Temp-Datei übergeben. + Einen ehrlichen Ausfallpfad einbauen (API kaputt → „AUSGEFALLEN", nicht „0 Funde"). +## Windows-PC -## Lucy / Windows-PC +- **Git-Bash hat kein `python3` (Store-Alias, 24.09.):** `deploy/pruefen.sh` nimmt `backend/.venv/Scripts/python.exe`; + `ruff` liegt global. +- **`sed` mit `$` und `\n` über PowerShell zerlegt sich ohne Fehlermeldung (21.08.).** In einzelne Ersetzungen + aufteilen und danach nachsehen. +- **`Start-Process -ArgumentList` quotet nicht (PS 5.1):** Pfade mit Leerzeichen zerbrechen, die gestartete PowerShell + stirbt still. Anführungszeichen ins Element einbetten: `'-File','"F:\Coding Stuff\…\skript.ps1"'`. +- **`\"` in f-String-Ausdrücken ist seit Python 3.12 ein SyntaxError** (die Box hat 3.14). Werte vorher in Variablen + ziehen. +- **pythonw + subprocess ohne `CREATE_NO_WINDOW`:** Jedes gestartete Konsolenprogramm bekommt ein sichtbares Fenster. +- **PC-Aufgabe `HermesPCExecutor`** (seit 24.09. aus) läuft aus dem Repo mit pythonw; nach einer Änderung an + `executor.py` die Aufgabe neu starten. Logs in `%LOCALAPPDATA%\HermesPCExecutor\`. +- **MSIX-Sandbox der Claude-Desktop-Werkzeuge:** Schreibzugriffe nach `AppData\Local\` landen in + `AppData\Local\Packages\Claude_*\LocalCache\`. Windows-Apps nie über Agent-Werkzeuge installieren; den Installer + startet der User per Doppelklick. -- **file://-Fallen im Electron-Build:** Asset-Pfade relativ; `import()` verzeiht KEINE - relativen Prefixe (onnxruntime-WASM brauchte `new URL("vad/", document.baseURI)`) — - fetch täuscht, import() nicht. -- **Lucy IMMER über `Lucy-Neustart.bat` neu starten** — hartes Kill hinterlässt - pocket_server-Waisen auf :8130 („Stimme startet nicht"); die BATs killen Waisen mit. -- `LUCY_WORKERS=2` (User-Env) — 4 Worker = ~4×1,9 GB Stimm-Modell-Kopien. -- Gerade `"` in config.ts-Prompt-Strings zerschießen den String → immer „…" nutzen. -- Zustands-Features IMMER mit sichtbarem Zustand + Sofort-Feedback bauen — der User testet - blind per Produkt-Gefühl. -- **Executor-Task** `HermesPCExecutor` läuft aus dem Repo mit pythonw → nach - executor.py-Änderung Task neu starten; Logs in `%LOCALAPPDATA%\HermesPCExecutor\`. -- **`Start-Process -ArgumentList` quotet NICHT** (PS 5.1): Elemente werden mit Leerzeichen - zusammengefügt — ein Pfad wie `F:\Coding Stuff\…` zerbricht, die gespawnte powershell - stirbt STILL (kein Fenster, kein Log). → Anführungszeichen ins Element einbetten: - `'-File','"F:\Coding Stuff\…\skript.ps1"'`. Kostete den ersten Lucy-Annahme-Lauf (12.07.). -- **`\"` in f-String-AUSDRÜCKEN ist seit Python 3.12 ein SyntaxError** (Alt-Stil - `f"{d.get(\"x\")}"` lief nur pre-3.12; Box hat 3.14). In bash-eingebetteten - `python3 -c '…'`-Snippets braucht es die Escapes eh nicht (single-quoted) — Werte vorab - in Variablen ziehen statt Quote-Akrobatik. Kostete denselben Lauf (Poll parste nie). -- **pythonw + subprocess ohne `CREATE_NO_WINDOW`** = jedes gespawnte Konsolenprogramm - bekommt ein SICHTBARES Fenster (Executor-Polling blitzte im 10-s-Takt auf dem Desktop). -- **MSIX-Sandbox-Falle (Claude-Desktop-Tools):** Tools der Claude-App laufen im - MSIX-Container — Writes nach `AppData\Local\` landen in - `AppData\Local\Packages\Claude_*\LocalCache\` (Merge-Read täuscht!). Windows-Apps NIE über - Agent-Tools nach AppData installieren/verwalten; Installer startet der USER per Doppelklick. - Die Packages-Kopie ist KEINE Dublette, sondern die virtualisierte echte Install. -- **Hermes Desktop:** NIE „Update / Repair install" klicken (pullt main, desynchronisiert - das Runtime-Repo → Boot-Fehler). Bei „tot": `git status -uno` im Runtime-Repo; Fehler - stehen in `logs/bootstrap-*.log`, nicht in desktop.log. +## Lucy (Desktop-App) -## Colab / Training (Mini-Stimme) - -- Live-Drive-Sync JE Epoche einbauen (Session-Tod frisst sonst das Training). -- Notebook-Zellen vor Abgabe ast-prüfen; Colab-Patches nie durch Shell-Heredocs. -- **QA-Gate für synthetische Datensätze:** jeden Clip durch STT-Roundtrip — der ungeprüfte - XTTS-Datensatz war komplett unbrauchbar (sogar whisper-medium verstand ihn falsch). -- Kokoro-Output peakt >1.0 → Peak-Normalisierung 0.95 + Onset-Trim/Fade-In gehören in - JEDE künftige KokoroTtsEngine. +- **file://-Fallen im Electron-Build:** Asset-Pfade relativ; `import()` verzeiht keine relativen Präfixe + (`new URL("vad/", document.baseURI)`). +- **Lucy immer über `Lucy-Neustart.bat` neu starten:** Hartes Beenden hinterlässt Waisen auf `:8130`. +- `LUCY_WORKERS=2` (User-Env): 4 Worker bedeuten ~4 × 1,9 GB Kopien des Stimm-Modells. +- Gerade `"` in Prompt-Strings von `config.ts` zerschießen den String → „…" nutzen. +- Zustands-Features immer mit sichtbarem Zustand und Sofort-Feedback bauen: Der User testet nach Produkt-Gefühl. +- **Training der Mini-Stimme (Colab):** Drive-Sync je Epoche; Notebook-Zellen vor Abgabe per `ast` prüfen; + synthetische Datensätze per STT-Rundlauf prüfen (der XTTS-Datensatz war unbrauchbar); Kokoro-Ausgabe auf 0,95 + normalisieren. diff --git a/docs/wissen/GRENZEN.md b/docs/wissen/GRENZEN.md deleted file mode 100644 index 90c0867..0000000 --- a/docs/wissen/GRENZEN.md +++ /dev/null @@ -1,43 +0,0 @@ -# Grenzen-Landkarte — was gehört wohin - -_Angelegt 13.07.2026 (Faden 6). Für JEDEN Agenten, der hier baut: bevor du ein Feature -umsetzt, kläre WOHIN es gehört. Das System hat mehrere Flächen mit klaren Aufgaben — eine -Funktion an der falschen Fläche ist Murks, auch wenn sie „funktioniert"._ - -**Der Kern in einem Satz:** **MC2 = Steuerpult** (verwalten, klicken, zusehen) · -**Lucy = Chat & Stimme** (reden, begleiten) · **Hermes = das Agenten-Fundament darunter -(Quelle TABU)** · **Telegram = mobil melden/freigeben** · **Hermes Desktop = am PC arbeiten**. - -## Die Flächen — was gehört hin, was NICHT - -| Fläche | Code/Ort | ✅ Gehört hierhin | ❌ Gehört NICHT hierhin | -|---|---|---|---| -| **MC2 – Steuerpult** | `~/mission-control-v2` (backend Py + frontend React) `:9001` | Verwaltung, Chronik/Zeitmaschine, Wissens-Tab, Modelle/Rollen, System-Status/Logs, Ideen-Queue-**Eingabe**, Wartung/Updates | **Ein Chat-/Gesprächsfenster** oder ein Konversations-Assistent — dafür ist Lucy/Telegram/Hermes-Desktop da. MC2 wird angeschaut und geklickt, nicht „zugetextet". | -| **Lucy – Chat & Stimme** | eigenes Repo `F:\Coding Stuff\lucy` (Electron, `lucy-desktop/`+`lucy-tts/`) | Voice/Zuruf, Gespräch (innere Stimme, kein Avatar seit 04.09.2026), proaktive Meldungen, Wake-Word/Barge-in, Zettelkasten | **Verwaltungs-/Wartungs-Oberfläche** (Update-Knöpfe, System-Logs) — das ist MC2. Lucy bleibt schlank (~1-s-Sprech-Latenz schützen). | -| **Hermes – Agenten-Fundament** | `~/.hermes/hermes-agent` (Framework), `~/.hermes/config.yaml`, `SOUL.md`, `skills/`, `agent-hooks/`, `mcp/` | Agenten-VERHALTEN ändern: über **Config, SOUL, Skills, Hooks, MCP-Server, Plugins** | **Quellcode patchen/forken — NIEMALS.** Kein Edit in `~/.hermes/hermes-agent/`. Fehlt ein Feature nativ → Config/Skill/Hook/MCP drumherum, nicht die Engine ändern. | -| **Telegram** | Hermes-Platform-Lane | mobil: Meldungen empfangen, Freigaben/Zurufe, Alarmkette, Cron-Delivery | Kein Bau-Ziel für UIs. Ist ein Kanal, keine App. | -| **Hermes Desktop** | PC-Hermes, Profil `pc`, Hirn = Box `:9001/v1` | Arbeit am PC: Projekte, Coding, Review, lange Threads. Faustregel „Repo oder >2 Min → Desktop". | Nicht mit Lucy verwechseln (Zuruf/Voice) — Desktop ist die Werkbank. | - -## „Ich will X bauen — wohin?" (Schnell-Entscheid) - -- **Etwas verwalten/anzeigen/klicken (Status, Logs, Modelle, Backups, Updates)** → **MC2** (backend + frontend). -- **Reden/hören/begleiten (Sprache, Gespräch, Avatar, proaktiv melden)** → **Lucy** (eigenes Repo). -- **Wie der Agent SICH VERHÄLT (Routing, Prompts, neue Fähigkeit, Werkzeug, Guardrail)** → - **Hermes drumherum**: `config.yaml` / `SOUL.md` / ein **Skill** / ein **Hook** (`agent-hooks/`) / - ein **MCP-Server** (`mcp/`). **Nie** die Hermes-Quelle. (Beispiel Faden 5: Box-Wissen kam per - `pre_llm_call`-Hook — `deploy/agent-hooks/box-steckbrief-inject.sh` — in jeden Worker, nicht per Engine-Patch.) -- **Etwas mobil melden/freigeben** → **Telegram**-Lane (Kanal, keine neue UI). -- **Wissen/Doku ablegen** → `docs/wissen/` (Projekt-Wahrheit) oder `~/wissens-vault/` (Lucys - Lernschicht). **Nicht** ins Mem0/Live-Gedächtnis (das ist auto-lernend, kein Ablageort). - -## Häufige Grenz-Verwechslungen (die roten Linien) - -- ❌ **Chat-UI/Assistent in MC2** → gehört zu Lucy/Telegram/Hermes-Desktop. MC2 ist Steuerpult. -- ❌ **Verwaltungs-/Update-Buttons in Lucy** → gehören ins MC2-Steuerpult. -- ❌ **Hermes-Quellcode ändern** (`~/.hermes/hermes-agent/…`) → nur Config/SOUL/Skill/Hook/MCP. -- ❌ **Am Live-Checkout `~/mission-control-v2` schreiben/committen** → immer frischer Klon im - Task-Workspace (siehe [FALLEN.md](FALLEN.md), werkstatt-SOUL). -- ❌ **Doku ins Mem0 kippen** → `docs/wissen/` oder Vault. - -Verwandt: [ARBEITSWEISE.md](ARBEITSWEISE.md) (Rollen-Abgrenzung der Türen), [STACK.md](STACK.md) -(Dienste/Ports), [VERDIKTE.md](VERDIKTE.md) (Hermes-first, kein Fork). diff --git a/docs/wissen/OFFENE-FAEDEN.md b/docs/wissen/OFFENE-FAEDEN.md new file mode 100644 index 0000000..8bfdf32 --- /dev/null +++ b/docs/wissen/OFFENE-FAEDEN.md @@ -0,0 +1,79 @@ +# Offene Fäden — die eine Liste + +_Stand 24.09.2026. Neues hier rein, Erledigtes raus (die Git-Historie behält es). Entschiedenes steht in +[VERDIKTE.md](VERDIKTE.md), nicht hier. Die Liste bis 04.09.2026, samt den Lucy-Fäden, liegt im Archiv: +[2026-09-04-offene-faeden-alt.md](../archiv/2026-09-04-offene-faeden-alt.md)._ + +## Fahrplan zum Homelab Orchestrator (Plan vom 24.09.2026) + +Phase 1 läuft: Box-Diät, Backend, Deploy mit Prüftor und Rückweg und das Sonntags-Update als Timer sind live +(`main` = `4cd856b`). Offen sind die Oberfläche (Branch `wartung/phase1d-frontend`) und die Doku (Branch +`doku/phase1e-neuordnung`). + +| Phase | Inhalt | Abnahme | Stand | +|---|---|---|---| +| 0 · Sofort | Nachtmeldungen sammeln und um 07:00 schicken, Dringendes sofort; Sicherung mit Lucys Gedächtnis, `SOUL.md`, Skills, Cron-Skripten und Box-Wart-Zustand; Token-Datei aus dem Repo; Git aufgeräumt | Testmeldung nachts landet in der 07:00-Meldung, dringende kommt sofort; Sicherung enthält das Gedächtnis; auf Gitea nur `main` und Archiv-Tags | erledigt 24.09. | +| 1 · Box-Wart 1.0 | Ballast raus (tote Routen, Module, Deploy-Dateien, Skills); Konsole, Spracherkennung, PC-Fernsteuerung, Embedding und Reranker schlafen; riskante Stellen behoben; Deploy mit Rückweg und Prüftor; Sonntags-Update als Timer; Oberfläche; Doku neu | alle Prüfläufe grün, keine toten Routen; ein absichtlich kaputter Deploy rollt sich selbst zurück; Sonntags-Update ohne Hermes-Hänger; Doku beschreibt den Box-Wart | läuft (Oberfläche, Doku offen) | +| 2 · Kern und zweite Instanz | zentrales Einstellungs-Objekt, SQLite, Worker mit Job-Engine, Adapter-Schnittstelle mit der Box als erstem Adapter; Oberfläche „Homelab Orchestrator" mit den Bereichen Box-Wart und Homelab; Container auf dem Proxmox-PC (nach User-OK), beide Instanzen prüfen sich gegenseitig | Box-Wart verhält sich wie vorher (Tests); ein Update-Lauf überlebt einen Neustart; stoppt eine Instanz, meldet die andere es auf Telegram | offen | +| 3 · Homelab sehen | Proxmox-API mit Leseschlüssel (nach User-OK); Inventar: Host, 6 Container, Arcane-VM mit Docker; offene Updates je Gerät (Host-Pakete per Proxmox-Webhook, App-Versionen, Arcane-API); Erreichbarkeit je Dienst; Anzeige „Rückweg: Snapshot oder Backup"; neue Container per Etikett | Übersicht zeigt alle 8 Geräte mit Update-Stand; ein gestoppter Dienst erzeugt einen Hinweis | offen | +| 4 · Jetzt updaten | Ausführer auf dem Proxmox-Host (nach User-OK) für Etikett `community-script` oder `watcher`, ohne `watcher-aus`; Knopf je Gerät: Snapshot, Update, Erreichbarkeits-Check, Erfolgsmeldung; rot → zurückrollen und melden; PBS mit Backup statt Snapshot; Host-Updates mit Warnung, Neustart getrennt; Docker über Arcane, zuerst als Probelauf | ein Update mit absichtlich rotem Check rollt sich selbst zurück und meldet es; nach einem Host-Neustart meldet die KI-Box, dass alles wieder läuft | offen | +| 5 · Android-App | Push, Cockpit und Übersicht, Updates unterwegs freigeben, Lucy per Sprache mit Live-Modus; weckt Spracherkennung und Stimme | wird zu Beginn der Phase festgelegt | offen, eigenes Projekt | + +Hintergrund zur Homelab-Technik: [ARCHITEKTUR.md](../ARCHITEKTUR.md), Abschnitt „Ausblick". + +## Offene Einzelpunkte (Box-Wart) + +1. **Der Wächter prüft die schlafende Spracherkennung weiter.** `pruefe_kern()` in + `backend/services/waechter.py` fragt `voice-service` (`:8650/health`) ohne Schlaf-Ausnahme ab. Solange der Dienst + schläft, ist ein roter Hinweis „Der Hör-Dienst antwortet nicht" samt Telegram-Meldung zu erwarten. Auf der Box + prüfen, dann die Probe an `schlaeft()` koppeln. +2. **Ein Modelltausch schreibt die llama-swap-Config mehrfach.** „Übernehmen" im Radar trägt das Modell unter einer + Sperre ein; Hirn-Umstellung, Aliase `fast`/`heavy` und ttl folgen als eigene Schreibvorgänge. Jeder lädt + llama-swap neu und entlädt alle Modelle. Ziel: ein Schreibvorgang je Tausch. +3. **Jobs überleben noch keinen MC2-Neustart.** Update- und Download-Jobs sind Kindprozesse von MC2; `deploy.sh` + verschiebt deshalb. Verschwindet der Hermes-Job, wartet `autoupdate.sh` 20 Minuten und geht dann in + Selbstreparatur und Rückweg. Lösung in Phase 2 (Worker). +4. **Session-Token des Hermes-Dashboards (nur mit User-Ja).** Das Drop-in + `hermes-builtin-ui.service.d/session-token.conf` aus der früheren Desktop-Anbindung ist weiter gesetzt; `backup.sh` + und `restore.sh` sichern es samt Kopie `desktop-gateway-token`. Entfernen ist Security-Config. +5. **Rote Wächter-Hinweise warten nachts bis 07:00.** Der Wächter meldet mit Betreff „[Box-Problem]" ohne `-d`; zwischen + 00:00 und 06:59 landet das in der Morgenmeldung. Klären, ob Rot sofort raus soll. +6. **Die gekürzte Morgenmeldung verweist auf „Cockpit unter Meldungen".** Diesen Bereich gibt es nicht. Der volle + Stapel liegt in `~/.hermes/night-queue.txt.zuletzt-gesendet`, jede Meldung zusätzlich in Lucys Briefkasten. +7. **Code verweist auf verschobene Doku:** `deploy/mc2-backup.service` (`Documentation=` auf `docs/BACKUP.md`), + `backend/services/backup.py` (`docs/BACKUP.md`), `backend/services/maintenance.py` (`docs/BEDIENUNG.md`, + sudoers-Hinweis), `backend/services/agent.py` (`docs/HERMES_SETUP.md`), `backend/services/llamaswap.py` + (`docs/OPTIMIZATION_PLAN.md`). Beim nächsten Code-Commit auf `docs/BETRIEB.md`, `docs/ARCHITEKTUR.md` bzw. + das Archiv umstellen. +8. **Oberfläche (Phase 1d):** Updates-Seite mit Urteil und Paketliste, ehrliche Lade- und Fehlerzustände, Rückfragen, + Aufträge aller Gruppen. Heute erscheinen Downloads nicht unter „Updates", obwohl die Modellsuche das ankündigt. +9. **Units nur auf der Box:** `hermes-builtin-ui.service` samt Drop-ins und die llama-swap-Drop-ins (darunter + `warmset.conf`) liegen nicht im Repo; seit 24.09. stehen sie als Kopie in jeder Sicherung. +10. **Ungepinnte Abhängigkeiten:** `backend/requirements.txt` nur mit `>=`, jeder Deploy zieht die neueste Version. + Was nachweislich zusammen lief, steht in `known-good/` jeder Sicherung. +11. **Der Wächter hält das Hirn für bereit, sobald irgendein Modell läuft** (`pruefe_kern()`). Ein abgestürztes Hirn + neben einem geladenen Coder bliebe unbemerkt. Klären, ob gewollt. +12. **Radar „Jetzt suchen" läuft synchron** und kann Minuten dauern; `POST /api/models/{id}/load` meldet `ok`, egal + was die Engine antwortet. +13. **Kleinkram im Code:** `mcp/mcp_mc.py` (MCP aus) ruft die nie vorhandene Route `/api/routing/route`; + `hermes-postcheck.sh` warnt bei jedem Lauf über den entfernten Patch-Träger; `voice_service/app.py` nennt + faster-whisper statt Parakeet; `.aiexclude` gilt nur Antigravity. + +## Aufräumen auf der Box (nur per User-Klick) + +- Modelle ohne Rolle (Modelle-Seite, „Aufräumen"): gpt-oss-120b (60 GB), Qwen3-VL-30B-A3B (19 GB), Muse-Glimmer-30B, + alte Drafts. Die Originale von Hirn und Coder sind der Rückweg, Nemotron ist Reserve: beides bewusst entscheiden. +- Reste neben dem Betrieb (Prüfbericht 24.09.): rund 10 GB Test- und venv-Ordner im Home-Verzeichnis, alte Skripte in + `~/.hermes/scripts` (`deploy.sh` legt neue dazu, räumt alte nicht weg), das inaktive Plugin `mc2-memory`, + `~/.hermes/PINNED_VERSION` (veraltet; Pins stehen in `/srv/models/mc2-pins.json`), zwei fremde Dateien im + Hermes-Quellbaum, alte Worktrees unter `~/.hermes/worktrees` und `~/projekte/mc2-referenz`, abgeschaltete + Alt-Units in `~/.config/systemd/user`. + +## Beobachten + +- **25.09. 00:30:** Radar-Neutest Ornith-1.5-35B-A3B (Hirn), jetzt mit Draft-Varianten. **01.10.:** Qwen3.8-Flash-Next + (Coder, passt nur knapp). +- **So 27.09. 04:30:** erster regulärer Sonntagslauf über den Timer; der Bericht kommt mit der Morgenmeldung um 07:00, + der Verlauf steht auf der Updates-Seite. +- **Daily News 07:00:** Die `web_extract`-Werkzeugfehler sollten mit dem Plugin `mc2-web-lesen` verschwunden sein + (Hermes am 24.09. neu gestartet). diff --git a/docs/wissen/STACK.md b/docs/wissen/STACK.md index 2b3233c..2205766 100644 --- a/docs/wissen/STACK.md +++ b/docs/wissen/STACK.md @@ -1,148 +1,140 @@ -# Stack-Wahrheiten — Infrastruktur, Dienste, Modelle +# Stack-Wahrheiten — Maschinen, Dienste, Modelle, Automatik -_Live gegen die Box verifiziert am **19.08.2026** (Dienste-Liste, llama-swap-Config, hermes ---version, /api/health); Engine, Hermes und llama-swap-Config nachgemessen am **17.09.2026** -(llama.cpp b11026, Hermes v0.21.3, `--load-mode none`). Bei Widerspruch zu älteren Docs gewinnt -diese Datei. Wer sie ändert: erst messen, dann schreiben._ +_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 & Zugänge +## Maschinen und Zugänge -| Was | Wo | -|---|---| -| **AI Box** (Bosgame M5, Ryzen AI MAX+ 395, 128 GB unified) | `hitonabi@192.168.178.151` (SSH); Zeitzone **Europe/Berlin** | -| **Windows-PC** („Tobis PC", 9070 XT) | `192.168.178.98` — PC-Executor `:7777` (Task `HermesPCExecutor`, Bearer-Token) | -| **Proxmox** | `root@192.168.178.108:8006` (PW in Keepass) — LXCs: adguard(100), npmplus(101), netbird(102), gitea(104), PBS(105) | -| **PBS** (Proxmox Backup Server) | `192.168.178.156:8007`, Datastore `qnap` | -| **QNAP TS-228A** „TobiNAS" | `192.168.178.62` — Freigabe `/Backup` per NFSv3 exklusiv an pve | -| **Gitea** | `git.tobisniceshomelab.ddnsfree.com` (lokal `192.168.178.153:3000`); Push-to-Create AUS | +| 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 -- **MC2:** `F:\Coding Stuff\mission-control-2` ↔ Gitea `Hitonabi/mission-control-v2` ↔ Box - `~/mission-control-v2` (nur Branch `main`). Enthält backend, frontend (dist committet!), - Sidecars, deploy, hermes-Plugin, `client/hermes-pc`. -- **Lucy:** `F:\Coding Stuff\lucy` ↔ `Hitonabi/lucy` (privat; lucy-desktop/ + lucy-tts/). -- **Wissens-Vault:** `~/wissens-vault/` auf der Box (eigenes git; Lucys Lernschicht: - Träume, Radar-Funde, **Eigenbau-Landkarte**, Skill-Kandidaten). Im MC2-UI als Wissens-Tab. +- **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 (live 19.08.2026) +## Dienste auf der Box -| Dienst | Port | Zweck | -|---|---|---| -| `llama-swap` (System-Dienst) | `:8080` | Modell-Router; Engine = llama.cpp **Vulkan/RADV** (`/opt/llamacpp-vulkan`, b11026 seit 17.09.) | -| `mission-control-2` (User) | `:9001` | MC2 Cockpit (FastAPI + React Frontend) & Steuerpult | -| `mc2-gateway` (User) | `:9010` | `/v1`-Datenpfad (model:auto Routing + native Bildweiche) | -| `mc2-steward` (User) | — | Hintergrundwächter (Re-Warm, Health-Sentry, Mem0-Dedupe) | -| `hermes-gateway` (User) | `:8642` | Hermes Agent Core API (v0.21.3, Bot Mode) | -| `hermes-builtin-ui` (User) | `:9119` (loopback) | Eingebaute Hermes-GUI; LAN-Zugang via MC2-Proxy `/hermes-ui/` | -| `mem0-service` (User) | `:8765` | Semantischer Chroma-Gedächtnis-Sidecar | -| `voice-service` (User) | `:8650` | STT (faster-whisper) + TTS (Piper/Chatterbox) | -| `box-console` (User) | `:7682` | ttyd-Login-Shell hinter MC2-Proxy | +| 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 | -**Stillgelegt:** `hermes-terminal` (:7681), `hermes-webui` (:8787) und alter `governor` (:8100). -⚠️ User-Units per SSH nur sichtbar mit `export XDG_RUNTIME_DIR=/run/user/$(id -u)` vor `systemctl --user`. +„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`. -## Modell-Stack (llama-swap, live 19.08.2026) +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. -**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. +## Modelle (llama-swap, Config vom 24.09.2026) -| Alias/Rolle | Modell | ttl | Notizen | +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 | |---|---|---|---| -| `hermes` + `fast` | Qwen3.6-35B-A3B **Uncensored** (HauhauCS Aggressive, Q4_K_M, giocom-DFlash) — seit 17.09.2026 | 0 | Agent-Hirn. `-c 131072 --parallel 2` → **65536/Slot**, KV **q8_0**, ~94–101 t/s (Prüfstand 17.09.). Original (MTP-GGUF UD-Q4_K_M) liegt daneben, Rückweg = Pfad | -| `coder` | Qwen3.8-27B **Uncensored** (JonathanColetti/Heretic, Q4_K_M, eigene mmproj F16) — seit 17.09.2026 | 5400 | **131072 ctx** — `--parallel 1`, der Coder bekommt den ganzen Slot (34a9862). Multimodal, **~32 t/s mit DFlash2-Draft** (17.09.), ohne Draft 12,7 (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` | **= Qwen3.8-27B** (zweiter Alias des Coders, seit 04.09.) | 5400 | Planen/Review (OpenChamber) + chat-Lane des Gateways. gpt-oss-120b (60 GB, AA-Index 24 vs 52) liegt ohne Rolle als Rollback bereit, direkt als `gpt-oss-120b` ansprechbar | -| `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 | +| 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) | -> **Diese sieben sind ALLES** — abgeglichen mit `/etc/llama-swap/config.yaml` am 27.08.2026 (Pfade 17.09.2026). -> -> **Prüfstand 17.09.2026** (`deploy/bench/pruefstand-hirn.py`; Kandidat auf `:5899`, Hermes spricht per `--provider pruefstand` -> aus `providers:` der Hermes-Config dagegen — Live-Stack bleibt unberührt): Uncensored-3.6 = 100,8 t/s @13k (Original 92,8), -> Tools 11/12, Hermes-Smoke grün · Uncensored-27B = 30,4 t/s @13k (Original 26,2), Tools 6/6, Coding 3/3 · **Nemotron 3.5 Lightning -> 30B-A3B** (Q4_0 + MTP-Draft, `/srv/models/Nemotron-3.5-Lightning-30B-A3B-GGUF/`) = Hirn-Klasse: 10,5 s Prefill @13k, 91,8 t/s, -> Tools 3/3, Hermes grün — liegt als Reserve-Kandidat bereit, nicht besetzt. ‼ **Bild + DFlash2 = HTTP 500** („failed to process -> speculative batch") beim Coder — Vorbestand seit 04.09., unabhängig vom Modell; Bilder laufen über die Gateway-Bildweiche zu `vision`. -> 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. +## Coding-Bahn (OpenChamber) -Config: `/etc/llama-swap/config.yaml` (sudo zum Schreiben). +- 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. -## Hermes (Agent) +## Sicherheit (ein Satz) -- **v0.21.3** (2026.9.14; git-Install `~/.hermes/hermes-agent`, main @ dd13b475 vom 17.09.2026), 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: 'off'`, `approvals.cron_mode: auto` — **User-Entscheid** (so seit spätestens dem KISS-Umbau - 21.08.2026, bestätigt 17.09.2026: „approvals bleibt off"). Lucy fragt nicht nach Freigaben; die Grenze ziehen - ufw, PC-Executor-Token und command_allowlist (siehe Security). Frühere Fassungen nannten `smart`/`deny` (Stand 03.07.). -- Config-Schema **v45** (migriert 17.09.2026): `connections`-Toolset (Nous-Konnektoren, `manage_connections`) bewusst in - `agent.disabled_toolsets`; Curator archiviert ungenutzte Skills nach 30 Tagen (`skills/.archive/`, `hermes curator restore`). -- 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.) +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. -## Automatik-Fahrplan (was nachts von allein läuft) +## Deploy und Sicherung (Kurzform) -| Zeit | Was | -|---|---| -| 02:30 | PBS sichert alle Proxmox-LXCs | -| 03:15 | **Traum-Cron** (dreaming-feed.sh → Wissens-Vault, fremdblick-Gate, propose-only) | -| 03:30 | Tarball-Backup (Configs+Secrets+`~/.hermes/cron`+state → `/srv/models/mc2-backups`, 14 Tage; rsync-Spiegel → Proxmox) | -| 03:50 | PBS-Host-Backup der Box (`host/aibox`: hermes+vault+llamaswap.pxar) | -| 04:30 | **Chef-Gutachter** (gpt-oss richtet über die autonome Arbeit → Morgenlage) | -| 05:15 Mo | **Release-Radar** (hermes-Releases gegen die Eigenbau-Landkarte; erster Lauf 13.07.) | -| 05:15 Sa | **Trend-Radar** (Live-Puls ALLER Modell-Rollen + Engine-A/B gegen neuen llama.cpp-Build + Watch-Liste [ROCm/MMQ/Community-Grid] + HF-Kandidaten-Suche → max. 1 Prüfstand-Kandidat/Woche; Frühwarnung vor dem So-Auto-Update) | -| 01:00 So | **Prüfstand** (volles Programm für Modell-Kandidaten: echte Coding-/Agenten-/Recherche-/Deutsch-/Vision-Prüfungen + Tempo auf :5899 gegen die Amtsinhaber-Baseline; Download-Deckel 35 GB, Cache räumt sich selbst, Ergebnis = Karte — Rollen-Wechsel bleibt Commander-Klick. Erkennt Engine-Drift → Tempo-Baseline-Refresh) | -| 06:40, 1. d. M. | **Restore-Probe** (stellt WIRKLICH wieder her: PBS-Canary aus hermes.pxar via --pattern + Tarball-Probe + Frische-Check < 36 h; ⚠️-Alarm, wenn ein Backup nicht zurückkommt) | -| 06:40, 2. d. M. | **Venv-Audit** (pip outdated + pip-audit-CVEs für voice-venv; Funde = Karte, Update bleibt Commander-Entscheid) | -| 07:00 | QNAP-Volume-Snapshot (7 behalten) | -| 07:15 | self-smoke (Gateway/Tools/Voice/:9119; Alarm nur bei Rot) | -| 08:00 | Daily-Briefing | -| 09:00, 1. d. M. | Monats-Review (radar-selbstkritik-wrapper.sh = Evolution-Radar + Selbstkritik) | -| 10 9, 16.08. | **Gedaechtnis-Check** (einmalig: Gedächtnis-Schutt räumen, alte Einträge bereinigen) | -| So 04:30 | **Auto-Update** Router→Engine→Hermes (Fangnetz: Backup→Postcheck→Auto-Rollback+Pin) | - -**Sonntags-Update = Hermes-Cron `0ec52231783b`** (`~/.hermes/scripts/sonntags-update.sh` → -`deploy/autoupdate.sh`, seit dem KISS-Umbau 21.08.); `mc2-autoupdate.timer` ist disabled — gewollt. -Fremd-Software-Updates (Router/Engine/Hermes) dürfen automatisch laufen (User-Entscheid 10.07.); der -User klickt sie zusätzlich oft manuell im Wartungs-Drawer. Rot ⇒ Rollback + Pin in -`/srv/models/mc2-pins.json`; gepinnte Ebenen werden **still übersprungen**, bis der Pin von Hand -gelöst wird (06.–17.09.2026 stand die Box so zwei Wochen still). Manueller Lauf: `bash deploy/autoupdate.sh`. -OS-Sicherheitsupdates laufen separat via unattended-upgrades. - -## Security (Stufe 0, live) - -PC-Executor nur mit Bearer `HERMES_PC_TOKEN` (fail-closed) · ufw default deny, nur -LAN→22/9001/8080 (+Alt-Port 7681) · Prompt-Injection-Guard `mcp/guard.py` (wrappt -Web-/Bildschirm-Text) · mc2-memory lernt nicht aus untrusted Turns · command_allowlist = -5 exakt gepinnte curls (fnmatch; Shell-Operatoren hart geblockt — NIE offenes `curl *`) · -Box-sudo ist **NOPASSWD: ALL** (live `sudo -n -l`, 04.09. und 17.09.2026); die alte Whitelist in -`/etc/sudoers.d/mc2-autonomie` (update-engine/swap, Dienst-Restarts, journalctl) steht daneben weiter. -**Security-Config (approvals/Tokens/ufw) NIE ohne explizites User-Ja ändern.** - -## Deploy & Pipeline - -- **Standard-Weg für Box-Arbeit (seit 04.09.2026 der EINZIGE):** Vorschlags-Branch auf Gitea - (`wartung/*`, `doku/*`, `feature/*`) → Ampel-CI grün → **der User merged auf main** → - `deploy.sh` auf der Box. Das Auftragsbuch (Karten-Klick, detached Annahme-Runner, Bagatell- - Annahme, Lucy-Annahme über den PC-Executor) ist ausgebaut — es war seit 02.08. ungenutzt. -- Deploy: main auf Gitea pushen → `ssh … 'bash ~/mission-control-v2/deploy/deploy.sh'` - ODER `POST :9001/api/system/self-update` (restart meldet ok:false — harmlos, /api/health prüfen). -- deploy.sh macht `git reset --hard origin/main` (main MUSS vorher auf Gitea liegen) und baut - KEIN Frontend → dist lokal bauen + committen. Fallen: [FALLEN.md](FALLEN.md). - -## Backup/Restore (3 Schichten, alle live) - -1. **Tarball** täglich 03:30 → `/srv/models/mc2-backups/` + rsync-Spiegel auf Proxmox; - Restore: `bash deploy/restore.sh --list | latest` (macht vorher Sicherheits-Backup). - In der UI: Zeitmaschine (Ein-Klick-Restore). -2. **PBS** (LXCs 02:30, Box-Host 03:50), Prune 7d/4w/3m, Verify So 06:00. -3. **QNAP-Snapshots** täglich 07:00 als Ransomware-Netz. -Bare-Metal: `docs/DISASTER_RECOVERY.md`. Mensch-Anleitung: `docs/RUNBOOK.md`. +- 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). diff --git a/docs/wissen/VERDIKTE.md b/docs/wissen/VERDIKTE.md index 0e8b174..1de2955 100644 --- a/docs/wissen/VERDIKTE.md +++ b/docs/wissen/VERDIKTE.md @@ -1,149 +1,143 @@ -# Finale Verdikte — nicht neu aufrollen ohne neuen, belegten Anlass +# Verdikte — entschieden, nicht neu aufrollen -_Kuratiert 10.07.2026 aus dem Claude-Projektgedächtnis. Jedes Verdikt trägt sein Warum und -(wo sinnvoll) die Wiedervorlage-Bedingung. Wer eines kippen will, braucht eine MESSUNG oder -einen User-Entscheid — kein „Best Practice sagt aber…" (siehe ARBEITSWEISE.md)._ +_Stand 24.09.2026. Jedes Verdikt nennt Datum und Grund. Wer eines kippen will, braucht eine neue Messung +oder einen User-Entscheid (siehe [ARBEITSWEISE.md](ARBEITSWEISE.md)). Abgelöstes steht unten unter +„Überholt (mit Datum)": ersetzt, nicht gelöscht._ -## Richtung & Architektur +## Richtung -- **MC3-Neubau VERWORFEN (03.07.), „MC2 Final" ERSETZT durch „MC2 lebt" (10.07.).** - Kein Basisstation-Neubau; seit dem Ablösungs-Entscheid wird MC2 über die - Queue→Karte→Klick-Pipeline weiterentwickelt statt eingefroren. Siehe [ZIELBILD.md](ZIELBILD.md). -- **Agent-Runtime: Hermes bleibt.** ZeroClaw-PoC gebaut + abgerissen (01.07.) — der echte - Latenz-Fix war das Hirn (gemma→Qwen3.6), nicht die Runtime. (ZeroClaw-Messwerte für den - Fall „Hermes-Latenz wird wieder Thema": `docs/ZEROCLAW_POC_RESULTS.md`.) -- **Memory-Layer: Mem0 ENTFERNT (07.08.2026).** Hermes-Agent ist die Single Source of Truth für Gedächtnis und Autonomie. -- **Telegram bleibt DER Mobil-Kanal; WhatsApp VERWORFEN (09.07.).** Baileys-Bridge = Meta-ToS- - Verstoß mit Bann-Risiko auf der Privatnummer + fragiler Dauerprozess; Alarmkette/Crons sind - simple Bot-API-Calls. Neu bewerten nur bei offizieller Personal-Bot-API. -- **Multi-Profil Lucy/Werkstatt auf der Box: NICHT nötig (09.07.).** `tui_gateway` lädt hart den - `cli`-Bucket, Lucy läuft über `api_server` — die Trennung existiert auf Platform-Ebene. - (Das PC-Profil des Hermes Desktop ist ein ANDERER Fall: eigene Maschine.) -- **MoA-Preset NICHT adoptiert.** Lädt mehrere Modell-Slots parallel — RAM ist der Engpass. - Das sequenzielle Zwei-Kritiker-Gate (Coder-Next + GLM) ist E2E-bewährt und RAM-schonend. -- **worker.sh bleibt; natives `delegate_task` nur für interaktive Arbeit (10.07.).** - delegate_task kann KEINE Modellwahl pro Aufruf und läuft top-level IMMER background - (stirbt in der `-z`-Lane mit dem Prozess). `delegation.model: coder` ist live — - Fan-out funktioniert E2E in langlebigen Sessions (Desktop/Telegram/Chat). -- **Kein heavy/gpt-oss im heißen Pfad.** heavy läuft mit 32k (< Hermes-Floor 64k) und 60 GB - Kaltladen. Als Ein-Schuss-Completion (Chef-Gutachter, Radar-Analyst, Orchestrator-Planung) - ok — als delegate_task-Ziel oder Pro-Schritt-Worker nie. +- **Box-Wart (23.09.):** MC2 ist nur noch Updater, Wächter und Modell-Radar der KI-Box. Coding läuft in + OpenChamber; Ideen, Wissen, Chronik, Skills-Ansicht, Verbinden und Konsole sind aus der Oberfläche raus. + Bedienung im Browser an PC und Handy, Oberfläche im Stil „Cockpit" (Warnlampen, Instrumente). +- **Umbau statt Neubau (24.09.):** Wächter, Updates mit Rückweg und Festhalten, getrennte Prozesse, Cockpit und + Gateway tragen. Neu gebaut wird hinter Schnittstellen: Job-Engine, Einstellungen, Verlauf (Plan: + [OFFENE-FAEDEN.md](OFFENE-FAEDEN.md)). Einen Neubau („MC3") hatte der User schon am 03.07. verworfen. +- **Homelab Orchestrator (24.09.):** zwei Instanzen, eine Oberfläche. Der Box-Wart bleibt auf der KI-Box, der + Homelab-Teil läuft als Container auf dem Proxmox-PC, beide prüfen sich gegenseitig. „Box-Wart" bleibt der + Name des Bereichs für die KI-Box. +- **Homelab-Umfang und Rechte (24.09.):** Proxmox-Host, 6 Container, Arcane mit Docker, KI-Box, nichts weiter. + Proxmox nur über eine Lese-API und einen kleinen Ausführer auf dem Host. Dabei ist, was das Etikett + `community-script` oder `watcher` trägt; `watcher-aus` nimmt ein Gerät aus. Schlüssel und Ausführer erst nach + User-OK. +- **Homelab-Updates nur per Knopf (24.09.):** „Jetzt updaten" je Gerät, mit Erfolgsmeldung und + Erreichbarkeits-Check; ist der Check rot, rollt der Homelab-Teil selbst zurück und meldet es. Host-Updates + mit Warnung, Neustart getrennt; die KI-Box prüft danach, ob der Host wieder läuft. +- **Keine Anmeldung (24.09.):** nur eine unsichtbare Herkunftsprüfung, damit fremde Webseiten keine Knöpfe + auslösen (`backend/services/herkunft.py`). +- **Android-App am Ende (24.09., Phase 5):** Push, Cockpit, Updates freigeben, Lucy per Sprache mit Live-Modus. +- **Die Coding-Oberfläche heißt „OpenChamber" (24.09.).** Die Gemini-/Antigravity-Doku und SAVEPOINT liegen im + Archiv. +- **Merge und Deploy (23./24.09.):** Claude darf selbst mergen und deployen, sobald alle Prüfläufe grün sind. +- **Agent-Runtime: Hermes bleibt (01.07.).** Ein ZeroClaw-Test wurde gebaut und wieder abgerissen; der + Latenz-Gewinn kam vom Hirn, nicht von der Runtime ([Messwerte](../archiv/2026-06-30-zeroclaw-poc-ergebnis.md)). +- **Hermes führt sein Gedächtnis selbst (07.08.).** Es ist die einzige Gedächtnis-Wahrheit; der Box-Wart hat + keinen eigenen Gedächtnis-Dienst. +- **Telegram bleibt der Mobil-Kanal, WhatsApp ist verworfen (09.07.):** Die inoffizielle Bridge bedeutet + Bann-Risiko auf der Privatnummer und einen zusätzlichen Dauerprozess. Neu bewerten nur bei einer offiziellen + Personal-Bot-API. -## Engine & Modelle (Box, gfx1151) +## Betrieb des Box-Warts -- **Vulkan/RADV schlägt ROCm** (+12–22 % tg, Cutover 27.06., mehrfach bestätigt; Recheck-Stand - 09.07.: hält weiter, einziger ROCm-Vorteil = Langkontext-Prefill auf gpt-oss). - **Wiedervorlage: ROCm-Recheck 20.–25.07.2026** (Box-Reminder gesetzt) — falls dann Bedarf: - NUR Hybrid für heavy/coder erwägen, **das Hirn bleibt in jedem Szenario auf Vulkan.** -- **Lucys Hirn: Qwen3.6-35B-A3B mit DFlash-Spec-Draft (seit 22.07.)** — löste draft-mtp ab: - A/B/C prod-gleich gemessen 61,7 (ohne) / 81–83 (MTP) / 86–90 t/s (DFlash), live eingependelt - 89–94. Draft: `giocom-…-DFlash-Q8_0.gguf` (Mainline-kompatibel; abhinand-Konvertierung ist es - NICHT — fehlendes `target_layers`-Metadatum). Rollback-Backup `config.yaml.bak-dflash-*`. - KV **q8_0** (Entscheid 07.07.: Qualität > ein paar GB; der q4_k-Commit lief nie live). - `--parallel 2` = bewusster Trade (Lernen blockiert nie den nächsten Voice-Turn). -- **DFlash je Rolle (gemessen 22.07., nicht neu aufrollen):** coder NEIN — 44–50 t/s mit Draft - (Q8 wie BF16) vs. 59–60 ohne, trotz 68–76 % Akzeptanz: 3B-aktiv-Decode ist billiger als das - Draften. heavy WARTET — gpt-oss-120b-Draft konvertiert (liegt in `/srv/models/DFlash-drafts/`), - aber Engine b10087 lädt die Arch nicht („expected 123, got 91“ = Extra-Tensoren unbekannt); - nach Engine-Update erneut probieren. vision/scout: keine Drafts veröffentlicht. - Eigenbau-Rezept: z-lab-safetensors + `convert_hf_to_gguf.py --target-model-dir `; - ⚠️ `llama-quantize` verwirft DFlash-Sondertensoren bei Nicht-Standard-Archs. -- **coder-Lane: Qwen3-Coder-Next, FINAL** („bleiben bei dem was wir haben, nachweislich - besser"). Qwen3.6-27B dense gebencht + verworfen (tg 12,7 t/s = 4–7× langsamer). -|- **hipEngine + strix-halo-toolboxes/TheRock: beobachten, nicht adoptieren.** hipEngine - (natives HIP, nur Qwen3.6, >2× Prefill) ist jung; kyuz0-Toolboxes lösen ein Problem, das - die Box nicht hat. Radar/Reminder wachen; Adoption nur nach eigenem brain-bench. -|- **Vision-Rolle: GLM-4.6V-Flash bleibt Amtsinhaber.** Qwen-AgentWorld-35B geprüft (Prüfstand - t_9daf088f, Speed: tg 26,8 t/s / pp 339,1, Vision: 0/1 korrekt). Qualität deutlich unter - GLM-4.6V-Flash, kein Aufsteiger — **abgelehnt**. Wiedervorlage nur bei neuer Version mit - nachweislich > 50 % Vision-Rate. -|- **dist/ im Git ist ABSICHT.** Box hat kein Node; Deploy = `git reset --hard` + committetes - `frontend/dist`. NICHT gitignoren. +- **Der Wächter behebt Einfaches selbst (23.09.):** Abgestürzte Dienste (`failed`) startet er neu, höchstens 2× je + Stunde. Gestoppte Dienste meldet er nur. Schlafende (abgeschaltet und nicht im Autostart, 24.09.) sind kein Befund. +- **Updates automatisch sonntags 04:30 (23.09.),** seit 24.09. über `mc2-autoupdate.timer` statt Hermes-Cron: Als + Kind des Hermes-Gateways hing der Lauf beim Hermes-Update am eigenen Neustart (20.09.: 180 s, Fehlschlag). +- **Neustart der Box nur im Wartungsfenster So 04:00–06:59 (24.09.).** `MC_AUTOUPDATE_REBOOT_JETZT=1` erzwingt ihn. +- **Nachtruhe für Meldungen (24.09.):** `notify.sh` sammelt 00:00–06:59, um 07:00 kommt eine Morgenmeldung. + Dringendes geht sofort raus. +- **Deploy zweistufig mit Prüftor und Rückweg (24.09.):** `deploy/pruefen.sh` ersetzt die CI-Ampel. +- **llama-swap-Config (24.09.):** Die lebende Datei `/etc/llama-swap/config.yaml` ist die Wahrheit. Der Repo-Abzug + überschreibt sie nur, wenn er sich im selben Deploy geändert hat. Geschrieben wird nur unter der Config-Sperre. +- **Box-Diät (24.09.):** Konsole und Spracherkennung schlafen (nicht gelöscht). PC-Fernsteuerung (MCP + `hermes-pc-control`, PC-Aufgabe `HermesPCExecutor`) und MCP `mission-control-stack` sind aus. 10 alte Skills liegen + in `~/.hermes/skills-archiv`. Embedding und Reranker schlafen (ttl 300); warm ist nur das Hirn. +- **Sicherung mit Lucys Gedächtnis (24.09.):** Der Tarball enthält `memories/`, `SOUL.md`, Skills, Cron-Skripte, + Box-Wart-Zustand, Units und Stimmreferenz. `restore.sh` spielt Gedächtnis und Zustand nur zurück, wenn sie fehlen + oder mit `--mit-gedaechtnis`. +- **Endgültig gelöscht wird nur per User-Klick (23.09.):** Modelle im Aufräumen-Panel, Reste auf der Box ebenso. +- **Git (24.09.):** nur `main` plus Archiv-Tags. Ungemergtes, das weg soll, erst als Tag `archiv/` sichern. +- **Approvals bleiben aus (17.09.):** `approvals.mode: 'off'`, `approvals.cron_mode: auto`. +- **Erinnerungen und Wecker laufen im Box-Wart** (`backend/services/reminders.py`), nicht als Hermes-Cron. +- **Hermes-Quellcode nie forken oder patchen; Hermes' interne Prompts bleiben Englisch (03.07.).** Deutsch kommt aus + `SOUL.md`; alles, was der User sieht, ist Deutsch. +- **Tool Search nicht auf `on` (04.07.):** Es spart Cloud-Tokens, kostet lokal Latenz (gemessen 15,1 s statt 5–7 s). -## Lucy (Voice-App) +## Modell-Radar (23./24.09.) -- **Shell: Electron, nicht Tauri.** Alle harten Features (Klick-Durchlass-Overlay, Capture, - Loopback, Tray, TTS-Spawn) existieren in Electron; Tauri fehlt Region-Klick-Durchlass. -- **Stimme: pocket-tts bleibt Default, bis die Mini-Lucy (Kokoro-Finetune) den Live-Test - gewinnt.** Qwen3-TTS-1.7B (RTF ~14), Chatterbox („zu delayed"), F5 (nicht streamfähig) — - alle verworfen. Mini-Lucy v1 gewann alles Messbare (TTFB 0,45 s vs 1,72 s), scheiterte aber - am Live-K.o. „nicht multilingual" → v2-Training läuft (Stand 10.07.). Umschalter in der App. -- **STT läuft auf der BOX** (Parakeet-TDT v3, 0,3–0,8 s, praktisch fehlerfreies Deutsch), - lokaler Whisper nur als Lazy-Fallback. Gemini hatte das 07.07. still auf PC-CPU umgebaut — - zurückgedreht, Messung gewann. -- **Kein Multi-Agent in der Voice-Lane** (3× Latenz-Falle). Multi-Agent JA für Radar - (Fan-out) und Werkstatt (Worker/Reviewer). +- Zwei Rollen: Hirn und Coder. Höchstens drei Modelle; eine dritte Rolle nur bei nachgewiesenem Mehrwert. Der + Debugger entfällt (23.09.). +- Das Radar testet selbst: nachts 00:30–02:30 (um 03:00 braucht NerdQuiz das Hirn), höchstens ein neuer Kandidat + pro Woche, nur was neben das Warm-Set passt. Durchgefallene werden gelöscht; getauscht wird erst per Knopf + „Übernehmen" (23.09.). +- Hirn und Coder müssen Bilder verstehen, auch mitten in Agenten-Aufgaben (23.09.). +- Fairer Vergleich (24.09.): Jeder Kandidat misst mit seiner schnellsten Draft-Variante (ohne, eingebauter + MTP-Kopf, Draft des heutigen Modells); das heutige Modell misst mit seinem Draft. +- Jev (TypeSafe AI) ist nicht relevant (24.09.): nur Cloud-API, liefert nur Wahrscheinlichkeiten, passt in keine Rolle. -## Hermes-Betrieb +## Engine und Modelle (Box, gfx1151) -- **Hermes-Quellcode NIE forken/patchen; interne Prompts bleiben ENGLISCH.** Deutsch kommt - aus SOUL.md (verifiziert); alles User-Sichtbare (Meldungen, Skills, Summaries) = deutsch. -- **Tool Search NICHT auf `on`** (steht auf `auto`, schläft de facto). Es optimiert - Cloud-Token-Kosten; wir optimieren lokale Latenz mit Prompt-Caching — `on` war gemessen - LANGSAMER (15,1 s statt 5–7 s). -- **Zed ACP / Hermes-im-Editor: NICHT machen.** Editor-Agent + Box-coder-Modell + AGENTS.md - ist der Sweet Spot; Hermes dazwischen = 70-KB-Prompt-Overhead. (Zed selbst ist inzwischen - vom PC entfernt — Hermes Desktop übernahm.) -- **Approvals bleiben AUS** (`approvals.mode: 'off'`, `cron_mode: auto`; so seit spätestens dem KISS-Umbau - 21.08.2026, vom User am 17.09.2026 bestätigt). Die Schutzlinie liegt außen — ufw, PC-Executor-Token, - command_allowlist — nicht in der Freigabe-Frage. *Überholt damit:* „`approvals.cron_mode: deny` bleibt" - (Autonomie-Härtung 1c, Option A: Gefahr-Befehle + execute_code im Cron-Kontext geblockt, interaktiv `smart`). -- **Fremd-Kritik via `fremdblick.sh`** (Ein-Schuss an leichtes Fremdmodell), NIE via - delegate_task→heavy (64k-Floor + Lade-Tod). Raster: prose=GLM-4.7-Flash (kritiker), - code=Coder-Next. Harte Regel: **REPRODUZIERT-ODER-ABGELEHNT** — Freispruch nur mit - belegtem Vorher/Nachher. -- **Erinnerungen/Wecker laufen deterministisch in UNSERER Schicht** (services/reminders.py), - bewusst ohne Hermes-cron. +- **Vulkan/RADV schlägt ROCm** (+12–22 % Generierung, seit 27.06. mehrfach bestätigt). ROCm-Recheck 24.07.: Der + Vulkan-Prefill hält bei 32k noch 488 t/s, kein ROCm-Bau. Wiedervorlage nur bei neuem Langkontext-Support der + Engine oder einem reinen HIP-Modell. **Das Hirn bleibt in jedem Fall auf Vulkan.** +- **hipEngine und strix-halo-toolboxes: beobachten, nicht übernehmen (03.07.).** Übernahme nur nach eigener Messung. +- **Hirn: Qwen3.6-35B-A3B** (MoE, 3B aktiv) mit DFlash-Draft (seit 22.07.), KV q8_0 (07.07.: Qualität vor ein paar + GB), `--parallel 2` = zwei Slots à 65k (Nebenlast blockiert keinen Sprach-Turn), `--reasoning-budget 2048` (17.09.). +- **Dichte Modelle nie als Hirn (17.07.):** bandbreitengebunden, ~12 statt ~100 t/s. Das Radar lässt als Hirn nur + Modelle mit höchstens 12B aktiven Parametern zu. +- **Coder: Qwen3.8-27B mit DFlash2-Draft (04.09.):** 12,6 → 31 t/s. `heavy` ist seit 04.09. derselbe Coder. +- **Varianten der Basismodelle (17.09.):** Hirn und Coder laufen als Varianten (Prüfstand: 100,8 statt 92,8 t/s bzw. + 30,4 statt 26,2 t/s). Die Originale bleiben als Rückweg. Nemotron 3.5 Lightning 30B-A3B ist eine gleichwertige + Hirn-Reserve, nicht besetzt. +- **Bild-Zwillinge (24.09.):** Bilder gehen an Zwillinge ohne Draft (`vision`, `coder-bild`), weil llama.cpp Draft + und Bild nicht zusammen kann (HTTP 500, b11057 und b11157 geprüft). +- **`brains` mit `exclusive: false` (24.09.):** Ohne den Schlüssel ist eine llama-swap-Gruppe exklusiv, und jede + Hirn-Anfrage entlud den Coder. Gruppe `bild`: `swap: true` (höchstens ein Zwilling geladen), `exclusive: false`. +- **Eine Gruppe für alles gleichzeitig Warme (25.07.):** Zwei ko-residente Gruppen verdrängen sich. Speicherregel: + Warm-Set plus größtes Bedarfsmodell ≤ ~115 GB (bei 107 GB Warm-Set plus 20 GB folgte ein Kernel-OOM). +- **`frontend/dist` im Git ist Absicht:** Die Box hat kein Node; der Deploy holt `main` per fast-forward. +- **MoA-Preset nicht übernommen (09.07.):** lädt mehrere Modelle parallel, RAM ist der Engpass. + +## Lucy (Desktop-App, eigenes Repo) + +- **Electron, nicht Tauri:** Klick-Durchlass-Overlay, Capture, Loopback und Tray gibt es nur in Electron. +- **Stimme: pocket-tts `german_24l` bleibt.** Qwen3-TTS-1.7B, Chatterbox und F5 sind verworfen (Latenz, kein + Streaming). Seit 04.09. kommt Lucys Stimme von der Box (`lucy-stimme`, in MC2 unter `/api/lucy/stimme/*`), auch + für die Sprachnachricht der Daily News. +- **Spracherkennung läuft auf der Box** (Parakeet-TDT v3, 0,3–0,8 s), nicht am PC. Der Dienst schläft seit 24.09. + bis zur Android-App. +- **Kein Multi-Agent im Sprachweg** (dreifache Latenz). +- **Smart Turn v3:** Audio links auffüllen; die Ausgabe ist empirisch P(unfertig). Läuft im Sprach-Sidecar (`/turn`). ## Sonstiges -- **LobeChat/WebUI-Ersatz verworfen** (Multi-User-Fehlpassung — Lehre: Scope challengen). -- **Smart Turn v3:** Audio LINKS padden; Output ist empirisch **P(unfertig)** — Doku behauptet - das Gegenteil. Läuft im Voice-Sidecar (/turn, ~110 ms). -- **Lokaler GPU-Klon (9070 XT):** Stack = llama.cpp-Vulkan + llama-swap, NICHT Lemonade - (deprecated Python, Server blockiert, Hybrid unsupported). Zweck/Umfang offen. -- **Aussortiert (tot):** Kyutai-Streaming-STT (nur EN/FR) · Unmute-Voll-Stack · LXC 105 (alt) · - WebUI-Update-Checks · openWakeWord (Wake-Gate ist STT-basiert). +- **LobeChat/WebUI-Ersatz verworfen** (Mehrbenutzer-Design passt nicht; Lehre: Scope challengen). +- **Lokaler GPU-Klon (9070 XT):** wenn, dann llama.cpp-Vulkan + llama-swap, nicht Lemonade. Zweck offen. +- **Aussortiert:** Kyutai-Streaming-STT (nur EN/FR), Unmute-Voll-Stack, openWakeWord (Wake-Gate ist STT-basiert). -## Prüfstand 24.07.2026 — Coder-Backend + Modell (ROCm-Recheck erledigt) +## Überholt (mit Datum) -Gemessen mit llama-bench (Vulkan/RADV, Q4_K_M, -fa on) auf der Box (Ryzen AI Max+ 395): - -| Test | Coder-Next 80B-A3B | Devstral Small 2 24B dense | -| -------------- | ------------------ | -------------------------- | -| pp2048 @ 0 | 702 t/s | 468 t/s | -| tg64 @ 0 | 59 t/s | 15 t/s | -| pp2048 @ 8192 | 638 t/s | 315 t/s | -| tg64 @ 8192 | 55 t/s | 14 t/s | -| pp2048 @ 32768 | 488 t/s | 63 t/s (7,7x langsamer) | -| tg64 @ 32768 | 47 t/s | 11 t/s (4,2x langsamer) | - -- **Backend bleibt Vulkan (ROCm-Recheck 24.07. erledigt).** Vulkan-Prefill haelt bei 32K - noch 488 t/s — der einzige ROCm-Vorteil (Langkontext-Prefill) ist auf dieser Box kein - Engpass. Der Autor des fuehrenden ROCm/Strix-Halo-Rezepts ist im Juli 2026 selbst zu - Vulkan zurueckgekehrt (+28% Decode). Kein ROCm-Bau — Produktiv-Risiko fuer null Gewinn. - Wiedervorlage nur bei neuem Engine-Langkontext-Support oder einem reinen HIP-Modell. -- **Coder bleibt Qwen3-Coder-Next — jetzt gemessen bestaetigt.** Devstral Small 2 (einziger - neuer agentisch trainierter Dense-Kandidat) ist 4x langsamer bei Generierung und bricht - beim 32K-Prefill auf 63 t/s ein (~9 min um einen 32K-Kontext zu lesen). Fuer agentisches - Coden auf dieser Box disqualifiziert — Reliabilitaet war nicht einmal noetig als Argument. -- **Der Coder ist nicht langsam (59 t/s).** Das Fassaden-/Halluzinations-Problem ist kein - Speed- und kein Backend-Problem und wird weder durch Modelltausch noch ROCm geloest. Es - ist Reliabilitaet = Modellklasse + Harness. Naechster Hebel: Post-Edit-Verify-Hook, - kleine Etappen/frische Threads, Eskalation der harten 20% an Frontier. -- **Devstral Small 2 ist der KRITIKER, nicht der Coder — mit hartem 16k-Deckel (25.07.).** - Das Verdikt „als Coder disqualifiziert" (24.07.) bleibt unveraendert richtig. Neu ist nur die - ENGE Rolle: Gegenlesen einer Etappe. Gemessen am 25.07. auf der Box: Generierung 15,0 t/s - (Coder 51,5), Prefill 265-318 t/s (Coder 754). Der Prefill bricht mit der Kontextlaenge ein - (32k -> 63 t/s = ~9 min nur zum Lesen), deshalb ist der Kritiker in llama-swap UND in beiden - opencode.json auf **16384** gedeckelt: schlimmster Fall je Review bleibt unter einer Minute. - Der Nutzen liegt nicht im Tempo, sondern in der FREMDEN Modellfamilie — ein Mistral-Modell hat - andere blinde Flecken als der Qwen-Coder. Alternative GLM-4.7-Flash (MoE, schnellerer Prefill) - bleibt eine Zeile Config entfernt, kostet aber ~9 Punkte SWE-bench (59,2 vs. 68,0). -- **llama-swap haelt nur EINE Gruppe resident, und `persistent: true` ist gefaehrlich (25.07.).** - Zwei ko-residente Gruppen verdraengen sich gegenseitig — alles, was gleichzeitig warm sein muss, - gehoert in DIESELBE Gruppe (`brains`). `persistent: true` hindert llama-swap daran, vor einem - grossen On-Demand-Modell abzuraeumen: mit 107 GB Warm-Set + Vision (20 GB) folgte ein - **Kernel-OOM** (llama-server abgeschossen). Regel: `Warm-Set + groesstes On-Demand-Modell - <= ~115 GB` UND `persistent: false`. Danach lud vision in 10 s statt 117 s + Absturz. - Kontext-Halbierung spart bei Qwen3-Next uebrigens **0 GB** (Hybrid-Attention, winziger KV). +| Seit | Was galt | Was heute gilt | +|---|---|---| +| 24.09. | Sonntags-Update als Hermes-Cron (21.08.) | `mc2-autoupdate.timer`; der Hermes-Cron ist pausiert | +| 24.09. | CI-Ampel in Gitea Actions (22.07.); der Runner war seit 28.08. tot | Prüftor `deploy/pruefen.sh` am PC und im Deploy | +| 24.09. | `vision` = Qwen3-VL-30B-A3B (seit 20.08.), davor GLM-4.6V-Flash | Bild-Zwillinge von Hirn und Coder | +| 24.09. | Regel `persistent: false` für `brains` (25.07., nach dem OOM mit 107 GB Warm-Set) | Warm-Set ist nur das Hirn; `brains` mit `persistent: true` und `exclusive: false` | +| 24.09. | Embedding und Reranker immer warm (für die Gedächtnis-Suche) | schlafen, ttl 300 | +| 24.09. | Hermes-Aufgabenbrett (Kanban) mit Verteiler im Gateway | Werkzeugsatz seit 21.08. aus, Verteiler (`kanban.dispatch_in_gateway`) seit 24.09. aus | +| 24.09. | Werkstatt-Profil, `worker.sh`, Orchestrator- und Konzept-Skills, Agent-Hooks | Profile seit 19.08. archiviert, Dateien am 24.09. aus dem Repo | +| 24.09. | Governor (erst Dienst `:8100`, dann OpenCode-Plugin `mc2-governor.ts`) | am PC seit 22.08. abgeschaltet, Plugin am 24.09. aus dem Repo | +| 24.09. | Gemini über Antigravity als Notfall- und Review-Partner (10.07.) | Doku im Archiv | +| 24.09. | Referenz-Branch des Gedächtnis-Ausbaus | Tag `archiv/referenz-mem0-ausbau` | +| 23.09. | „MC2 lebt" (10.07.): Ideen-Queue → Karte → Klick, Auftragsbuch mit Bagatell-Annahme | Box-Wart; das Auftragsbuch war am 04.09. ausgebaut | +| 23.09. | Pins nur von Hand lösen (`jq` per SSH) | Knopf „Freigeben" (Wächter-Hinweis und Updates-Seite) | +| 04.09. | `heavy` = gpt-oss-120b (03.07.), „nie im heißen Pfad" | `heavy` = Qwen3.8-27B; gpt-oss-120b ohne Rolle | +| 21.08. | Hermes Desktop als Arbeits-Tür (09.07.); davor Zed-Agent mit Box-Modell (04.07.: kein Zed ACP) | OpenChamber am PC | +| 21.08. | Nachtprogramm aus Traum, Chef-Gutachter, Release- und Trend-Radar, Prüfstand-Cron, Restore-Probe, Selbsttest, Briefing | drei Hermes-Jobs (KISS-Umbau), seit 24.09. Timer für Updates und Morgenmeldung | +| 21.08. | natives Fan-out mit `delegation.model: coder` (10.07.) | Werkzeugsatz `delegation` aus | +| 21.08. | `approvals.cron_mode: deny` (Autonomie-Härtung, Juli) | `off`/`auto`, bestätigt 17.09. | +| 21.08. | Box-Host-Sicherung nach PBS (`pbs-backup.timer`) | aus (lief rot); der Tarball ist die Sicherung | +| 21.08. | Zwei-Kritiker-Gate (Coder-Next + GLM) über `fremdblick.sh` | entfallen mit Modell-Konsolidierung (19.08.) und KISS-Umbau | +| 19.08. | Kritiker Devstral Small 2 mit 16k-Deckel (25.07.), Rollen `scout` und `dense-planer` | ein Coder, ein Hirn | +| 19.08. | Coder Qwen3-Coder-Next „final" (24.07.); „Coder ohne DFlash" (22.07.) | Qwen3.8-27B, seit 04.09. mit DFlash2 | +| 07.08. | Gedächtnis-Sidecar Mem0 (`:8765`) samt Memory-MCP und Plugin | Hermes führt sein Gedächtnis selbst; am 27.08. restlos ausgebaut | +| 24.07. | ROCm-Recheck 20.–25.07. als Wiedervorlage | erledigt, Vulkan bleibt | From f4bbdad311334cf90c3c732d31c9dc386f111edc Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 24 Sep 2026 17:37:09 +0200 Subject: [PATCH 3/5] doku: Betriebsdoku neu (ARCHITEKTUR, BETRIEB, UPDATES, RADAR, WIEDERAUFBAU) - ARCHITEKTUR.md (neu): Prozesse und Units, Rollen box/homelab und Partner-Instanz aus Phase 2a (kern/einstellungen.py, kern/zeit.py, kern/partner.py, /api/partner), Modell-Rollen, Bild-Weiche, wer welche Datei schreibt (inkl. mc2-quittiert.json), Meldeweg mit Telegram-Zweitweg, alle 62 /api-Routen, Herkunftspruefung, kurzer Ausblick Homelab-Teil. - BETRIEB.md (neu, loest RUNBOOK.md und BACKUP.md ab): Handgriffe, Meldungen und Betreffzeilen, Waechter-Regeln (Partner nach 5 Takten, Spracherkennung nur wenn wach, Ausblenden-Knopf), Dienste schlafen/wecken, zweistufiger Deploy mit Prueftor, Sicherung und Zurueckspielen, Notfall, Pfade auf der Box. - UPDATES.md (neu): Sonntags-Kette per Timer, Postchecks, Festhalten und Freigeben, Handbetrieb, Update-Verlauf, Fallen. - RADAR.md (neu): Modell-Radar (Leitplanken, Nachtablauf, Pruefstand, Uebernehmen/Verwerfen, Merkliste) und Stack-Radar. - WIEDERAUFBAU.md (neu, loest DISASTER_RECOVERY.md ab): entschlackte Schrittfolge, Anhang A (llama-swap-Unit und Drop-ins) behalten. Stand der Aussagen: Code in main 75611be. Co-Authored-By: Claude Opus 5.5 --- docs/ARCHITEKTUR.md | 177 +++++++++++++++++++++ docs/BACKUP.md | 62 -------- docs/BETRIEB.md | 234 +++++++++++++++++++++++++++ docs/DISASTER_RECOVERY.md | 325 -------------------------------------- docs/RADAR.md | 104 ++++++++++++ docs/RUNBOOK.md | 85 ---------- docs/UPDATES.md | 109 +++++++++++++ docs/WIEDERAUFBAU.md | 108 +++++++++++++ 8 files changed, 732 insertions(+), 472 deletions(-) create mode 100644 docs/ARCHITEKTUR.md delete mode 100644 docs/BACKUP.md create mode 100644 docs/BETRIEB.md delete mode 100644 docs/DISASTER_RECOVERY.md create mode 100644 docs/RADAR.md delete mode 100644 docs/RUNBOOK.md create mode 100644 docs/UPDATES.md create mode 100644 docs/WIEDERAUFBAU.md diff --git a/docs/ARCHITEKTUR.md b/docs/ARCHITEKTUR.md new file mode 100644 index 0000000..80bc5ab --- /dev/null +++ b/docs/ARCHITEKTUR.md @@ -0,0 +1,177 @@ +# Architektur des Homelab Orchestrators (Teil Box-Wart) + +_Stand 24.09.2026, Code in `main` = `75611be`. Für Agenten und Techniker. Versionen, Ports und Modelle mit +Messwerten: [wissen/STACK.md](wissen/STACK.md)._ + +Der Homelab Orchestrator (vormals Mission Control 2, kurz „MC2") hat zwei Bereiche: „Box-Wart" für die KI-Box und +„Homelab" für den Proxmox-PC. Zwei Instanzen, eine Oberfläche: Dieselbe Codebasis läuft auf der KI-Box (Rolle `box`) +und später als Container auf dem Proxmox-PC (Rolle `homelab`). Die Homelab-Instanz ist noch nicht eingerichtet +(Phase 3, braucht User-OK); dieses Dokument beschreibt deshalb vor allem die Rolle `box`. + +Der Box-Wart hält die KI-Box aktuell, passt auf sie auf und sucht bessere Modelle. Er besteht aus vier eigenen +Python-Prozessen, einer Bash-Schicht für Updates, Sicherung und Meldungen und aus Zustandsdateien unter +`/srv/models`. Er steuert zwei fremde Programme: llama-swap mit llama.cpp (die Modelle) und Hermes (der Agent „Lucy" +mit Telegram). + +## Überblick + +```mermaid +flowchart LR + subgraph Netz["Heimnetz"] + BR["Browser (PC, Handy)"] + OC["OpenChamber (PC)"] + LD["Lucy-Desktop (PC)"] + NQ["NerdQuiz (Arcane)"] + end + subgraph Box["KI-Box"] + MC2["MC2 :9001
Oberfläche, /api"] + GW["mc2-gateway :9010
/v1, Bild-Weiche"] + ST["mc2-steward
Wächter, Re-Warm"] + RD["mc2-radar
00:30"] + HE["Hermes :8642
Lucy, Telegram"] + LS["llama-swap :8080"] + end + BR --> MC2 + OC -->|/v1| MC2 + LD -->|/api, /v1| MC2 + MC2 -->|/v1 roh| GW + HE -->|/v1| GW + GW --> LS + NQ -->|/v1, Alias fast| LS + RD -->|Baseline| LS + ST -.->|prüft| MC2 +``` + +Alle Modell-Anfragen enden bei llama-swap, das je Modell einen `llama-server` startet. NerdQuiz geht als einziger +Client an MC2 vorbei direkt auf `:8080`. Nur den Radar-Kandidaten startet der Radar-Lauf nachts als eigenen +`llama-server` auf `:5899`, neben llama-swap. + +## Prozesse + +| Prozess (Unit) | Einstieg | Aufgabe | Eigener Zustand | +|---|---|---|---| +| `mission-control-2` (`:9001`) | `backend/app.py` | Oberfläche aus `frontend/dist`; 62 `/api`-Routen; reicht `/v1` roh an den Gateway weiter (`MC_V1_UPSTREAM`); reicht das Hermes-Dashboard unter `/hermes-ui/` durch (HTTP und WebSocket); Erinnerungen; Update- und Download-Jobs als Kindprozesse (`services/jobengine.py`) | Briefkasten, Erinnerungen, Routing-Policy, Hugging-Face-Zugang, ausgeblendete Hinweise | +| `mc2-gateway` (`127.0.0.1:9010`) | `backend/gateway_app.py` | `/v1` mit `model: auto` und Bild-Weiche, Kontext-Warnung, `/gw/health` | Token-Zähler (`~/.hermes/token_stats.json`) | +| `mc2-steward` | `backend/steward.py` | Re-Warm (alle 90 s, lädt das Hirn nach, wenn nichts geladen ist), Config-Watch (5 s), Wächter (jede Minute) | `mc2-waechter.json` (einziger Schreiber) | +| `mc2-radar` (Timer 00:30) | `backend/radar_lauf.py` | Suche und Nachttest neuer Modelle | `mc2-radar.json`, Baseline, `/srv/models/radar/` | +| Bash-Schicht | `deploy/*.sh` | Updates (`autoupdate.sh` mit `update-swap.sh`, `update-engine.sh`, Postchecks, `self-repair.sh`), Sicherung (`backup.sh`, `restore.sh`), Meldungen (`notify.sh`, `morgenmeldung.sh`), Vorwärmen (`warmup.sh`), `projekte-sync.sh`, Deploy (`deploy.sh`, `pruefen.sh`) | Pins, Meldeprotokoll, Nacht-Warteschlange, Deploy-Log | + +Alle vier Python-Prozesse teilen die flachen Pakete `backend/services/` und `backend/kern/` (Import über +`PYTHONPATH` und `WorkingDirectory` der Units). Router bleiben dünn, die Logik liegt in `backend/services/` +(siehe `AGENTS.md`). + +**Warum getrennte Prozesse** (Umbau v3, 15.07.): Der Gateway ist klein, wird kaum angefasst und startet sich +selbst neu (`Restart=always`, `TimeoutStopSec=5`). MC2 darf deshalb neu starten, ohne dass Anfragen von Lucy und +OpenChamber abreißen. Der Steward überlebt MC2-Neustarts und kann MC2 selbst überwachen. Rückweg ist jeweils eine +Zeile in `deploy/mission-control-2.service` (`MC_V1_UPSTREAM` bzw. `MC_REWARM_ENABLED=0`/`MC_SENTRY_ENABLED=0` +entfernen). + +Fremde Dienste, die der Box-Wart nur steuert oder überwacht: `llama-swap` (System-Unit, `--watch-config`), +`hermes-gateway`, `hermes-builtin-ui`, `lucy-stimme`, `voice-service` und `box-console` (beide schlafen seit 24.09.). + +## Rollen und Partner-Instanz (seit 24.09., Phase 2a) + +- **`backend/kern/einstellungen.py`:** `MC_ROLLE` (`box` oder `homelab`, Standard `box`), `MC_INSTANZ` (Anzeigename, + Standard „Box-Wart" bzw. „Homelab"), `MC_DATEN_DIR` (Zustandsdateien; Standard `/srv/models` auf der Box, + `/var/lib/mc2` im Homelab), `MC_PARTNER_URL` (Basis-URL der anderen Instanz, leer = keine) und `MC_PARTNER_NAME`. +- **`backend/kern/zeit.py`:** die eine Zeitzone `MC_LOCAL_TZ` (Standard `Europe/Berlin`) statt einer Kopie je Modul. +- **`backend/kern/partner.py`:** Lebenszeichen der anderen Instanz über deren `/api/health` (5 s Zeitlimit, 15 s + zwischengespeichert). +- **Rolle `box`** hängt alle Box-Router ein. **Rolle `homelab`** lädt nur `/api/health` und `/api/partner`; die + Homelab-Router folgen in Phase 3. `steward.py` betreibt Re-Warm und Config-Watch nur in der Rolle `box`; der + Wächter prüft im Homelab nur Platte und Partner. +- **`/api/health`** nennt `rolle` und `instanz`; `engine_reachable`, `gateway_reachable` und `brain` gibt es nur auf + der Box. +- **`GET /api/partner`** liefert das Lebenszeichen der anderen Instanz. **`/api/partner/`** reicht an + `/api/` weiter (alle Methoden, nach der Herkunftsprüfung). `partner/…` und `stream` werden nicht + weitergereicht: Zwei Instanzen sollen sich keine Anfrage endlos zureichen, und der Live-Strom würde offen bleiben. +- **Wächter:** Antwortet die andere Instanz nicht, entsteht der Hinweis „ antwortet nicht", rot erst nach + `MC_WAECHTER_PARTNER_TAKTE` = 5 Takten, damit ein Neustart kein Alarm ist. +- Die Units setzen weder `MC_ROLLE` noch `MC_PARTNER_URL`: Die Box läuft in der Rolle `box` und ohne Partner, bis die + zweite Instanz eingerichtet ist. + +## Modelle und Modell-Rollen + +- **Rollen-Aliase statt Namen:** Clients fragen `hermes`/`fast` (Hirn), `coder`/`heavy` (Coder), `vision` und + `coder-bild` (Bild-Zwillinge), `embed`, `reranker`. Die Eintragsnamen ändern sich beim Tausch, die Aliase nicht. +- **Gruppen:** `brains` (`swap: false`, `persistent: true`, `exclusive: false`) enthält nur das Hirn, es bleibt + geladen. `bild` (`swap: true`, `exclusive: false`) enthält die zwei Zwillinge, höchstens einer ist geladen. + Alles andere lädt bei Bedarf und geht nach `ttl` wieder raus. +- **Bild-Weiche** (`routers/gateway_proxy.py`, `services/router_logic.py`): Hat der aktuelle Schritt ein Bild, geht + die Anfrage an den Zwilling der Rolle (Coder-Ziele an `coder-bild`, alles andere an `vision`). Ältere Bilder + beschreibt `vision` einmal als Text (Cache je Bild), damit der Rest beim schnellen Modell mit Draft bleibt. +- **`model: auto`** ist die Chat-Spur: normal `fast`, bei langen oder schweren Anfragen `heavy` (Schwellen in der + Routing-Policy `mc2-routing.json`, ohne Datei gelten die Env-Defaults). +- **Warm halten:** `warmup.sh` (Root-Kopie in `/usr/local/bin/llama-swap-warmup.sh`) läuft nach jedem Start von + llama-swap. Danach übernimmt der Re-Warm im Steward; welches Modell warm bleibt, sagt `MC_WARMSET` im Drop-in + `mc2-steward.service.d/warmset.conf` (heute nur das Hirn). +- **Speicherregel:** Warm-Set plus größtes Bedarfsmodell ≤ ~115 GB, sonst droht ein Kernel-OOM. + +## Wer schreibt was + +| Datei | Schreiber | Regel | +|---|---|---| +| `/etc/llama-swap/config.yaml` | MC2 (Modelle, Rollen, Aufräumen, Hirn-Umstellung), Radar („Übernehmen"), `deploy.sh`, `restore.sh` | Die lebende Datei ist die Wahrheit. MC2 schreibt nur unter `llamaswap.config_sperre()` (Thread-Sperre plus `flock` auf `.mc2-config.lock`) und atomar. `deploy.sh` überschreibt nur, wenn sich `deploy/llama-swap.config.yaml` im selben Deploy geändert hat. Jede Änderung lädt llama-swap neu und entlädt alle Modelle. | +| `~/.hermes/config.yaml` | Hermes; MC2 nur bei der Hirn-Umstellung; `autoupdate.sh` und `restore.sh` beim Rückweg; `self-repair.sh` | MC2 ändert nur `model.default`/`model.model`, atomar, vorher `config.yaml.bak-hirn-`; bei einem Lesefehler schreibt es nichts. | +| `mc2-steward.service.d/warmset.conf` | `deploy.sh`; das Radar beim Übernehmen eines neuen Hirns | Das Radar tauscht den Namen in `MC_WARMSET` und startet den Steward neu. | +| `/srv/models/mc2-waechter.json` | nur der Steward | MC2 liest und führt Knöpfe aus; der nächste Takt sieht das Ergebnis. Der Ordner folgt `MC_DATEN_DIR`. | +| `/srv/models/mc2-quittiert.json` | nur MC2 (Knopf „Ausblenden bis zum nächsten Lauf") | Der Steward liest; ein ausgeblendeter Werkzeugfehler-Hinweis kommt wieder, wenn der nächste Lauf des Jobs erneut Fehler hat. | +| `/srv/models/mc2-radar.json` (+ `mc2-radar-baseline.json`) | Radar-Lauf und MC2 | jede Änderung unter `flock`, atomar | +| `/srv/models/mc2-pins.json` | `autoupdate.sh` hält fest; MC2 gibt frei | Format: Baustein → `pinned`, `version`, `grund`, `datum` | +| `/srv/models/mc2-announce.json` (Briefkasten, 200 Einträge) | nur MC2 | Steward und Gateway liefern per HTTP (`MC_ANNOUNCE_HTTP`), `notify.sh` per `POST /api/voice/announce` | +| `/srv/models/mc2-reminders.json` | nur MC2 | Erinnerungs-Schleife und `/api/reminders` im selben Prozess | +| `/srv/models/mc2-geheimnisse.json` | MC2 (Einstellungen) | Hugging-Face-Zugang, Rechte 0600 | +| `/srv/models/mc2-discover.json` | MC2, Radar | Cache der Hugging-Face-Entdeckung (12 h) | +| `/srv/models/mc2-deploy.log` | `deploy.sh` | eine Zeile je Deploy, auch gescheiterte | +| `~/mc2-notify.log` | `notify.sh` (anhängen), `morgenmeldung.sh` (über 3 MB auf 2 MB kürzen) | Quelle des Update-Verlaufs; der Wortlaut „QUEUED für Morgen-Digest" muss bleiben | +| `~/.hermes/night-queue.txt` | `notify.sh` (anhängen), `morgenmeldung.sh` (übernehmen, senden) | nicht gesendeter Stapel bleibt als `.senden` liegen | + +## Meldeweg + +`deploy/notify.sh` ist der eine Meldeweg: Die Meldung geht in Lucys Briefkasten (`POST /api/voice/announce`) und an +Telegram. Zwischen 00:00 und 06:59 sammelt `notify.sh` alles Nicht-Dringende in der Nacht-Warteschlange; +`morgenmeldung.sh` (Timer 07:00) schickt es als eine Nachricht. Dringend ist `-d`, ein Betreff mit „Alarm" oder +„Notfall" oder ein Text, der mit „KRITISCH" beginnt. Lucy-Desktop fragt den Briefkasten ab +(`/api/voice/announcements`) und spricht neue Einträge. + +Telegram hat zwei Wege: zuerst `hermes send --to telegram`; scheitert das oder fehlt Hermes (die Homelab-Instanz hat +keins), geht die Meldung direkt an die Telegram-Bot-API (seit 24.09., live bewiesen 15:41). Die Zugangsdaten liest +`notify.sh` aus der Datei in `MC_TELEGRAM_ENV` (Standard `~/.hermes/.env`: `TELEGRAM_BOT_TOKEN`, +`TELEGRAM_HOME_CHANNEL`, optional `TELEGRAM_HOME_CHANNEL_THREAD_ID`) und gibt das Token über stdin an `curl`, damit +es nicht in der Prozessliste steht. Erst wenn beide Wege scheitern, bleiben Protokoll und `wall` +(`MC_NOTIFY_OHNE_WALL=1` schaltet `wall` ab). Einzelheiten und Betreffzeilen: [BETRIEB.md](BETRIEB.md). + +## Schnittstellen + +In der Rolle `box` 62 Routen unter `/api`: 60 des Box-Warts (seit 24.09., vorher 95) und 2 für die +Partner-Instanz. In der Rolle `homelab` gibt es nur `/api/health` und die Partner-Routen. + +| Gruppe | Routen | +|---|---| +| Cockpit (`routers/boxwart.py`) | `GET /start`, `GET /hinweise`, `POST /hinweise/{id}/aktion/{aktion}`, `GET /modelle/nutzung`, `GET /updates/verlauf`, `POST /updates/festgehalten/{baustein}/freigeben`, `GET /modelle/aufraeumen`, `POST /modelle/aufraeumen/loeschen` | +| Radar (`routers/radar.py`) | `GET /radar`, `POST /radar/suche`, `POST /radar/{id}/uebernehmen`, `POST /radar/{id}/verwerfen` | +| Modelle (`routers/models.py`) | `GET /models`, `GET /discover`, `POST /models/register`, `GET /hf/search`, `GET /hf/quants`, `POST /models/install`, `GET /jobs`, `POST /jobs/{id}/cancel`, `POST /models/{id}/role`, `POST /models/unload`, `POST /models/{id}/unload`, `POST /models/{id}/load`, `DELETE /models/{id}` | +| Wartung (`routers/maintenance.py`) | `GET /maintenance/updates`, `GET /maintenance/update-details`, `POST` `check-updates`, `os-update`, `engine-update`, `swap-update`, `hermes-update`, `update-all`, `restart`; `GET /maintenance/logs`; `GET`/`POST /maintenance/geheimnisse` | +| System (`routers/system.py`) | `GET /system/status`, `GET /system/services`, `POST /system/backup`, `GET /system/backups`, `POST /system/restart`, `GET /system/token-stats` | +| Lucy und Sprache (`routers/voice.py`) | `POST /alarm`, `POST /voice/announce`, `GET /voice/announcements`, `POST /voice/stt`, `POST /voice/turn`, `POST /voice/chat`, `GET /lucy/stimme/health`, `POST /lucy/stimme/tts`, `POST /lucy/stimme/tts/stream` | +| Sonstiges | `GET /health`, `GET /stream` (Live-Strom, SSE), `GET /routing`, `GET`/`POST /reminders`, `DELETE /reminders/{id}`, `GET /zeitmaschine`, `POST /zeitmaschine/restore` | +| Partner (`routers/partner.py`) | `GET /partner` (Lebenszeichen), `/partner/{pfad}` (Durchreiche, alle Methoden) | + +Dazu `/v1/*` (Weiterleitung an den Gateway), `/hermes-ui/` und die Auslieferung der Oberfläche. Unbekannte +`/api`-Pfade liefern einen Fehler (bei `GET` 404) statt der Startseite. Die MCP-Server in `mcp/` sprechen dieselben +Routen. + +**Herkunftsprüfung** (`backend/services/herkunft.py`, statt Anmeldung): Schreibende Aufrufe (`POST`, `PUT`, `PATCH`, +`DELETE`) auf `/api/` mit dem `Origin` einer fremden Webseite lehnt MC2 mit 403 ab. Erlaubt bleiben Aufrufe ohne +`Origin` (Skripte, `curl`), `Origin: null` bzw. `file://` (Lucy-Desktop), dieselbe Adresse wie die Oberfläche und die +Entwicklungs-Ports 5173, 5180, 5181. `/v1` ist nicht betroffen. + +## Ausblick: der Homelab-Teil (Phasen 3 und 4) + +Stand der Recherche vom 24.09.2026: Community-Script-Container aktualisiert man im Container mit `update`, ohne +Rückfragen mit `PHS_SILENT=1`; die installierte Version steht in `/root/.`. Die Proxmox-API kann keine Befehle +in Containern ausführen und gibt die Liste der Host-Updates nur mit Schreibrecht heraus. Deshalb: ein Lese-Schlüssel, +ein Proxmox-Webhook für Host-Pakete und ein kleiner Ausführer auf dem Host mit festen Aktionen. Container mit +Bind-Mount (z. B. PBS) lassen sich nicht snapshotten, dort gilt „Backup statt Snapshot". Arcane meldet Image-Updates +über eine eigene API mit Schlüssel. Ein Exit-Code 0 beweist kein gelungenes Update; geprüft wird unabhängig +(HTTP-Probe, Dienststatus, Version). Fahrplan: [wissen/OFFENE-FAEDEN.md](wissen/OFFENE-FAEDEN.md). diff --git a/docs/BACKUP.md b/docs/BACKUP.md deleted file mode 100644 index d8ccfb4..0000000 --- a/docs/BACKUP.md +++ /dev/null @@ -1,62 +0,0 @@ -# Backup & Restore - -Sichert den **nicht wiederherstellbaren Zustand** der AI-Box. Code kommt aus Git, -Modelle sind neu ladbar — gesichert wird nur, was sonst weg wäre. - -## Was im Backup ist -- **Gedächtnis:** `/srv/models/mem0/` (Chroma-Vektoren + `history.db`) -- **Hermes:** `~/.hermes/config.yaml`, `~/.hermes/.env` (**Secrets!**), `~/.hermes/plugins/` -- **Engine:** `/etc/llama-swap/config.yaml` - -Nicht enthalten (bewusst): GGUF-Modelle, MC2-Code (Git), venvs, systemd-Units (aus `deploy.sh`). - -Jedes Backup ist ein Tarball `mc2-state-.tar.gz` unter `/srv/models/mc2-backups/`, -`chmod 600` (enthält `.env`). Es werden die letzten **14** behalten. - -## Off-Box-Spiegel (C12) — zweite Kopie WEG von der Box -Nach jedem lokalen Backup spiegelt `backup.sh` die Tarballs per `rsync` auf ein **zweites Gerät** -(Default: **Proxmox-Host** `root@192.168.178.108:/var/lib/vz/mc2-backups`). Stirbt die NVMe der -Box, liegen die Backups noch auf dem Proxmox. Die Retention (14) wird per `--delete` mitgezogen, -`chmod 600` bleibt erhalten. Der Off-Box-Sync ist **best-effort**: schlägt er fehl, gilt das -lokale Backup trotzdem als erfolgreich (Warnung im Log). - -- **Auth:** eigener SSH-Key `~/.ssh/mc2_offsite` (nur für dieses Backup), im Proxmox in - `root/.ssh/authorized_keys` **gehärtet** eingetragen: `from=""`, kein Port-/Agent-/ - X11-Forwarding, kein PTY → der Key kann nur rsync-Backup, keinen Voll-Root-Fernzugang. -- **Ziel/Key überschreibbar:** `MC_BACKUP_OFFSITE` (leer = Off-Box aus) und `MC_BACKUP_OFFSITE_KEY`. - -## Backup erstellen -- **Automatisch:** systemd-Timer `mc2-backup.timer`, täglich ~03:30. Status: - `systemctl --user list-timers mc2-backup.timer` -- **Manuell (Box):** `bash ~/mission-control-v2/deploy/backup.sh` -- **UI:** Wartungs-Drawer → „Snapshot erstellen" - -## Wiederherstellen (Restore) -Restore läuft **nur per CLI auf der Box** (bewusst — er stoppt Dienste und überschreibt Configs). -Vor dem Zurückspielen macht das Skript automatisch ein Sicherheits-Backup des aktuellen Zustands. - -```bash -cd ~/mission-control-v2 -bash deploy/restore.sh --list # vorhandene Backups anzeigen -bash deploy/restore.sh --dry-run latest # zeigen, was passieren würde -bash deploy/restore.sh latest # neuestes wiederherstellen (mit Rückfrage) -bash deploy/restore.sh mc2-state-YYYYMMDD-HHMMSS.tar.gz # bestimmtes Backup -``` - -Ablauf: Sicherheits-Backup → Dienste stoppen (`mem0-service`, `mission-control-2`, -`hermes-gateway`) → Dateien zurückspielen (mem0 wird **ersetzt**, Configs überschrieben) → -Dienste starten → Health-Check. - -### Wenn die Box-Platte tot ist (Off-Box-Restore) -`restore.sh` kennt den Off-Box-Spiegel: fehlt ein Backup lokal, holt es sich das Skript -automatisch vom Proxmox. Kein manuelles Kopieren nötig. - -```bash -bash deploy/restore.sh --list # zeigt lokal UND Off-Box (Proxmox) -bash deploy/restore.sh --pull-offsite # ganzen Off-Box-Bestand nach lokal spiegeln -bash deploy/restore.sh latest # zieht das jüngste — vom Proxmox, falls lokal leer -``` - -## Erledigt -- **Off-Box-Spiegel (C12):** rsync auf den Proxmox-Host, live E2E verifiziert (2026-07-03). - Box ist Bare Metal (kein Proxmox-Gast → kein vzdump), daher aktiver Push statt vzdump-Pull. diff --git a/docs/BETRIEB.md b/docs/BETRIEB.md new file mode 100644 index 0000000..0529d65 --- /dev/null +++ b/docs/BETRIEB.md @@ -0,0 +1,234 @@ +# Betrieb — Handgriffe, Meldungen, Wächter, Deploy, Sicherung, Notfall + +_Stand 24.09.2026, Code in `main` = `75611be`. Für Techniker und Agenten. Gilt für die Instanz auf der KI-Box +(Rolle `box`); die Homelab-Instanz ist noch nicht eingerichtet. Die Bedienung für den User steht in +[BEDIENUNG.md](BEDIENUNG.md), die Update-Kette in [UPDATES.md](UPDATES.md), das Modell-Radar in [RADAR.md](RADAR.md)._ + +## Handgriffe (SSH auf die Box) + +```bash +ssh hitonabi@192.168.178.151 +export XDG_RUNTIME_DIR=/run/user/$(id -u) # sonst sieht systemctl --user nichts +systemctl --user status mission-control-2 mc2-gateway mc2-steward +systemctl --user list-timers # Radar, Sicherung, Updates, Morgenmeldung, projekte-sync +journalctl --user -u mc2-steward -n 100 # Wächter; ebenso mc2-radar, mc2-autoupdate, mc2-backup +curl -s http://127.0.0.1:9001/api/health # Gesamtzustand, Rolle und Instanz +curl -s http://127.0.0.1:9001/api/partner # Lebenszeichen der anderen Instanz (falls eingerichtet) +curl -s http://127.0.0.1:9010/gw/health # Gateway und Motor +bash -lc 'hermes cron list' # Hermes-Jobs (hermes ist über SSH nicht im PATH) +tail -n 50 ~/mc2-notify.log # was zuletzt gemeldet wurde +tail -n 5 /srv/models/mc2-deploy.log # welcher Stand seit wann live ist +sudo journalctl -u llama-swap -n 100 # Motor (System-Dienst) +``` + +## Meldungen + +- **Ein Weg:** `bash ~/mission-control-v2/deploy/notify.sh [-d] [-s "[Betreff]"] "Text"` legt die Meldung in Lucys + Briefkasten und schickt sie an Telegram. Protokoll: `~/mc2-notify.log`, je Meldung eine Zeile mit `OK telegram`, + `OK telegram direkt`, `QUEUED für Morgen-Digest` oder `FALLBACK (…)`. Den Wortlaut nicht ändern: + `backend/services/update_verlauf.py` liest ihn. +- **Zwei Wege zu Telegram (seit 24.09.):** zuerst `hermes send`. Scheitert das oder fehlt Hermes, geht die Meldung + direkt an die Telegram-Bot-API; die Zugangsdaten (`TELEGRAM_BOT_TOKEN`, `TELEGRAM_HOME_CHANNEL`, optional + `TELEGRAM_HOME_CHANNEL_THREAD_ID`) liest `notify.sh` aus der Datei in `MC_TELEGRAM_ENV` (Standard `~/.hermes/.env`). + Das Token steht dabei nicht in der Prozessliste. Live bewiesen am 24.09. um 15:41. +- **Nachtruhe:** 00:00–06:59 landet alles Nicht-Dringende in `~/.hermes/night-queue.txt`. Dringend ist `-d`, ein + Betreff mit „Alarm" oder „Notfall" oder ein Text, der mit „KRITISCH" beginnt. +- **Morgenmeldung:** `mc2-morgenmeldung.timer` (07:00) startet `deploy/morgenmeldung.sh`. Es schickt eine Nachricht + „Guten Morgen, Commander. Heute Nacht gab es N Meldungen" mit höchstens 3500 Zeichen. Drei Versuche im Abstand von + 60 s; scheitert Telegram, bleibt der Stapel als `night-queue.txt.senden` liegen und kommt mit der nächsten + Morgenmeldung. Zuletzt Gesendetes: `night-queue.txt.zuletzt-gesendet`. Das Skript kürzt außerdem + `~/mc2-notify.log` ab 3 MB auf die letzten 2 MB. +- **Scheitern beide Wege,** steht die Meldung mit `FALLBACK` im Protokoll und geht per `wall` an die + Box-Konsolen (`MC_NOTIFY_OHNE_WALL=1` schaltet `wall` ab). +- **Testen:** `bash ~/mission-control-v2/deploy/notify.sh -s "[Test]" "Testmeldung"`; nachts landet sie in der + Warteschlange, mit `-d` kommt sie sofort. + +| Betreff | Absender | Inhalt | +|---|---|---| +| `[Box-Update]` | `autoupdate.sh`, `jobs/sonntags-update.sh` | Ergebnis je Baustein, Wochenbericht, Neustart-Ankündigung; beginnt der Text mit „KRITISCH", ist es dringend | +| `[Box-Problem]` | Wächter | neuer roter Hinweis; nach 6 h erneut mit „Immer noch:" | +| `[Box wieder ok]` | Wächter | ein gemeldeter roter Hinweis ist erledigt | +| `[Homelab-Problem]` / `[Homelab wieder ok]` | Wächter der Homelab-Instanz | wie oben, sobald diese Instanz läuft | +| `[Modell-Radar]` | `backend/radar_lauf.py` | ein Kandidat hat den Nachttest bestanden | +| `[Stack-Radar]` | `jobs/stack-radar.sh` | Samstagsbericht | +| `[Morgenmeldung]` | `morgenmeldung.sh` | Sammelmeldung der Nacht, 07:00 | +| `[Alarm] Deploy` | `deploy.sh` | Deploy gescheitert, der alte Stand läuft wieder (dringend) | +| ohne Betreff | `jobs/news-melden.sh` | Daily News Report, danach die Sprachnachricht | + +## Wächter (`backend/services/waechter.py`, im `mc2-steward`) + +Takt jede Minute, der erste 60 s nach dem Start. Ein Befund wird nach 2 Takten zum Hinweis; Timer-, Job-, +Platten- und Pin-Befunde sofort, die Partner-Instanz erst nach 5 Takten (`MC_WAECHTER_PARTNER_TAKTE`, ein Neustart +soll kein Alarm sein). + +| Prüfung | Rot | Gelb | +|---|---|---| +| Dienste (systemd) | `llama-swap`, `hermes-gateway`, `mc2-gateway`, `mission-control-2` | `voice-service`, `lucy-stimme`, `hermes-builtin-ui` | +| Timer-Läufe | `mc2-backup`, `mc2-morgenmeldung`, `mc2-autoupdate` | `projekte-sync`, `mc2-radar` | +| Hermes-Jobs | fehlgeschlagener Job mit „update" im Namen | andere fehlgeschlagene Jobs; Werkzeugfehler im letzten Lauf | +| Kern (HTTP) | Motor, Hirn, Hermes, MC2, Gateway antworten nicht; die Spracherkennung nur, wenn sie nicht schläft | – | +| Platte (`MC_DATEN_DIR`, auf der Box `/srv/models`) | ab 90 % | ab 80 % | +| Festgehaltene Updates | – | jeder Pin | +| Partner-Instanz (nur mit `MC_PARTNER_URL`) | „ antwortet nicht" | – | +| Abgestürzte Prüfung | – | „Eine Prüfung des Wächters lief nicht" | + +In der Rolle `homelab` prüft der Wächter bisher nur Platte und Partner und meldet mit „[Homelab-Problem]". + +- **Selbstreparatur:** Nur ein abgestürzter Dienst (`ActiveState=failed`) wird neu gestartet, höchstens 2× je Stunde + und Hinweis. Ein gestoppter Dienst (`inactive`) wird nur gemeldet. Ein schlafender Dienst (`inactive` und + `disabled`) ist kein Befund. +- **Während eines Updates** (ein Prozess `autoupdate.sh`, `update-engine.sh`, `update-swap.sh` oder `hermes … update` + läuft) prüft er Dienste und Kern nicht und repariert nichts. Die Oberfläche zeigt dann „Update läuft". +- **Meldungen:** Rote Hinweise gehen an Telegram und in den Briefkasten, bei Fortbestand alle 6 h erneut; nachts gilt + die Nachtruhe. Gelbe Hinweise stehen nur in der Oberfläche. +- **Knöpfe am Hinweis:** „Neu starten" bzw. „Starten", „Protokoll", „Jetzt erneut laufen lassen" (Timer), + „Erneut ausführen" (`hermes cron run`), „Freigeben" (Pin), „Ausblenden bis zum nächsten Lauf" (Werkzeugfehler + eines Jobs; MC2 merkt sich den Lauf in `/srv/models/mc2-quittiert.json`, hat der nächste Lauf wieder Fehler, + erscheint der Hinweis erneut). +- Der Wächter ist der einzige Schreiber von `/srv/models/mc2-waechter.json`. Ist sein letzter Takt älter als + 5 Minuten, zeigt die Startseite „Wächter schweigt". + +## Dienste schlafen legen und wecken + +- Schlafen legen: `systemctl --user disable --now ` (seit 24.09.: `box-console`, `voice-service`). +- Wecken bis zum nächsten Neustart der Box: Knopf „Wecken" unter „Dienste und Protokolle" oder + `systemctl --user start `. +- Dauerhaft wecken: `systemctl --user enable --now `; für einen Neuaufbau die Unit zusätzlich in `AKTIV` in + `deploy/deploy.sh` eintragen. + +## Deploy + +Voraussetzung: Der Stand liegt in `main` auf Gitea (Branch, Prüftor grün, Merge). Dann auf der Box: + +```bash +bash ~/mission-control-v2/deploy/deploy.sh +``` + +**Stufe 1** (die bisherige Fassung des Skripts): Sperre gegen einen zweiten Deploy (`flock` auf +`$XDG_RUNTIME_DIR/mc2-deploy.lock`). Laufen Update- oder Download-Jobs (`/api/jobs`), bricht der Deploy ab. Dann den +alten Stand merken, `git fetch` und `git merge --ff-only origin/main` und die neue Fassung als Stufe 2 starten. + +**Stufe 2** (die neue Fassung): + +1. `pip install` aus `backend/requirements.txt` und `backend/requirements-dev.txt`. +2. Prüftor `deploy/pruefen.sh`. +3. llama-swap-Config nur, wenn sich `deploy/llama-swap.config.yaml` in diesem Deploy geändert hat: Sicherung + `/etc/llama-swap/config.yaml.bak-` (die letzten 5 bleiben), dann ersetzen. llama-swap lädt dank + `--watch-config` selbst neu. Weicht die lebende Datei nur ab, gibt es einen Hinweis und sonst nichts. +4. Alle Repo-Units nach `~/.config/systemd/user/`, dazu die Drop-ins `mc2-steward.service.d/warmset.conf` und + `mission-control-2.service.d/override.conf`; `daemon-reload`; `enable` für die Units in `AKTIV`; Timer starten + (den Update-Timer nur, wenn er noch nicht läuft). +5. Cron-Skripte `deploy/jobs/*.sh` und `*.py` nach `~/.hermes/scripts/`. +6. Skills `deploy/skills/*` nach `~/.hermes/skills//`, abgelöste Skills nach + `~/.hermes/skills-archiv/`. Plugins `deploy/hermes-plugins/*` nach `~/.hermes/plugins/`; aktiviert werden sie + einmalig von Hand, Hermes startet der Deploy nicht neu. +7. Neustart von `mc2-gateway`, `mission-control-2` und `mc2-steward`, dann bis zu 60 s Nachprüfung: `/api/health`, + `/gw/health`, Steward aktiv. + +Erfolg: eine Zeile in `/srv/models/mc2-deploy.log` und „Deploy ist live". Scheitert ein Schritt: +`git reset --hard` auf den alten Stand, llama-swap-Config zurück (falls ersetzt), Dienste neu, Zeile `GESCHEITERT` im +Log und die dringende Meldung „[Alarm] Deploy". + +Schalter: `MC_DEPLOY_TROTZDEM=1` (trotz laufender Jobs), `MC_DEPLOY_OHNE_TESTS=1` (Prüftor überspringen, nur im +Notfall), `MC_DEPLOY_SKIP_SWAP_CONFIG=1` (llama-swap-Config nie anfassen). + +Nicht Teil des Deploys: das Frontend bauen (`frontend/dist` kommt fertig aus Git), die Root-Kopie von `warmup.sh`, +Neustarts von llama-swap und Hermes. + +**Prüftor** `deploy/pruefen.sh` (am PC vor dem Push, auf der Box im Deploy): Shell-Syntax (`bash -n` für +`deploy/*.sh` und `deploy/jobs/*.sh`), Python-Syntax aller versionierten `.py` außerhalb von `frontend/`, +`ruff check .` (nur wo ruff installiert ist; `requirements-dev.txt` bringt nur pytest mit), Import von `app`, +`gateway_app`, `steward` und `radar_lauf`, dann `pytest backend/tests`. Die Frontend-Prüfungen (`npm run lint`, +`npm test`, `npm run build`) laufen nur am PC. + +## Sicherung + +- **Wann:** `mc2-backup.timer` täglich 03:30 (+≤5 min); außerdem vor jedem Hermes-Update, vor jedem Zurückspielen und + per Knopf „Jetzt sichern". Von Hand: `bash ~/mission-control-v2/deploy/backup.sh`. +- **Wohin:** `/srv/models/mc2-backups/mc2-state-.tar.gz`, Rechte 600 (enthält `~/.hermes/.env`), die letzten 14 + bleiben. Danach Spiegel per `rsync --delete` auf den Proxmox-Host (`/var/lib/vz/mc2-backups`, eigener Schlüssel + `~/.ssh/mc2_offsite`; Ziel und Schlüssel über `MC_BACKUP_OFFSITE` und `MC_BACKUP_OFFSITE_KEY`). Scheitert der + Spiegel, gilt die lokale Sicherung trotzdem. +- **Inhalt:** + - aus `~/.hermes`: `config.yaml`, `.env`, `plugins/`, `cron/`, `state/`; seit 24.09. auch `memories/` (Lucys + Gedächtnis), `SOUL.md`, `skills/` und `scripts/`; dazu Reste der früheren Desktop-Anbindung (`agent-hooks/`, + `shell-hooks-allowlist.json`, `desktop-gateway-token`, `pc-paths.yaml`, Drop-in `session-token.conf`); + - `/etc/llama-swap/config.yaml`; + - der Box-Wart-Zustand `/srv/models/mc2-*.json`; + - die Units aus `~/.config/systemd/user/` und `/etc/systemd/system/llama-swap.service.d/` (nur zum Nachschlagen, + `restore.sh` spielt sie nicht zurück); + - Lucys Stimmreferenz `~/.lucy-stimme/app/ref.wav`; + - `known-good/`: `pip freeze` je venv, Versionen (OS, Kernel, MC2- und Hermes-Commit, llama.cpp, llama-swap) und + die Liste der Modelldateien. +- Eine Sicherung ist seit 24.09. rund 12 MB groß. +- **Nicht enthalten:** Modelle (neu ladbar), Code (Git), venvs, `~/.ssh` (auch nicht der Spiegel-Schlüssel). +- **Weitere Schichten:** Die Sicherung der Box nach PBS (`pbs-backup.timer`) ist seit 21.08. aus. PBS sichert die + Proxmox-Container, das QNAP macht Snapshots; beides läuft auf den anderen Geräten und ist hier nicht geprüft. + +## Zurückspielen + +- **Per Oberfläche:** Updates → Sicherungen → „Zurückspielen". MC2 startet `restore.sh --yes ` als eigene + systemd-Unit (`mc2-restore-`), weil `restore.sh` MC2 selbst stoppt. +- **Per SSH:** + +```bash +cd ~/mission-control-v2 +bash deploy/restore.sh --list # lokal und auf dem Proxmox-Host +bash deploy/restore.sh --dry-run latest # zeigt, was passieren würde +bash deploy/restore.sh latest # mit Rückfrage; --yes ohne +bash deploy/restore.sh --mit-gedaechtnis latest # Gedächtnis und Zustand auch überschreiben +bash deploy/restore.sh --pull-offsite # alle Sicherungen vom Proxmox-Host holen +``` + +Ablauf: Sicherheits-Sicherung des jetzigen Stands → Dienste `mission-control-2`, `mc2-gateway`, `mc2-steward`, +`hermes-gateway` stoppen → Hermes-Config, `.env`, Plugins, `cron/`, `state/`, llama-swap-Config und die Desktop-Reste +zurück → Gedächtnis, `SOUL.md`, Skills, Cron-Skripte und `mc2-*.json` nur, wenn sie fehlen oder mit +`--mit-gedaechtnis` → Dienste starten → `/api/health`. Fehlt eine Sicherung lokal, holt `restore.sh` sie vom +Proxmox-Host. Sicherungen von vor dem 27.08. enthalten noch das Verzeichnis des abgelösten Gedächtnis-Dienstes; es wird +nicht zurückgespielt. + +## Notfall + +**Box tot oder Oberfläche weg:** + +1. Strom und Netz prüfen, die Box einmal per Knopf neu starten. Alles startet von selbst (systemd, Linger). Nach 2–3 + Minuten `http://192.168.178.151:9001` öffnen. +2. Oberfläche immer noch weg: per SSH `systemctl --user status mission-control-2` und + `journalctl --user -u mission-control-2 -n 100`. Hilft ein Neustart der Dienste nicht: + `bash ~/mission-control-v2/deploy/restore.sh latest`. +3. Totalschaden (neue Platte, neue Hardware): [WIEDERAUFBAU.md](WIEDERAUFBAU.md). + +**Deploy kaputt:** `deploy.sh` rollt selbst zurück. Von Hand: den vorigen Commit aus `/srv/models/mc2-deploy.log` +nehmen, `git -C ~/mission-control-v2 reset --hard ` und +`systemctl --user restart mc2-gateway mission-control-2 mc2-steward`. + +**llama-swap-Config kaputt:** `ls -t /etc/llama-swap/config.yaml.bak-*`, die passende Sicherung nach +`/etc/llama-swap/config.yaml` kopieren; llama-swap lädt selbst neu. Ältere Stände stecken in jeder Sicherung. + +**Motor startet keine Modelle:** `sudo journalctl -u llama-swap -n 100`. Nach einem Engine-Sprung ist die typische +Ursache ein gestrichenes Flag ([wissen/FALLEN.md](wissen/FALLEN.md)). Den vorigen Build hebt `update-engine.sh` in +`/opt/llamacpp-vulkan.bak` auf, die vorige llama-swap-Version `update-swap.sh` in `/usr/local/bin/llama-swap.bak`. + +**Hermes kaputt:** `journalctl --user -u hermes-gateway -n 100`, dann `bash ~/mission-control-v2/deploy/hermes-postcheck.sh`. +Rückweg wie in [UPDATES.md](UPDATES.md): alter Commit in `~/.hermes/hermes-agent`, Config aus der letzten Sicherung, +`systemctl --user restart hermes-gateway`. + +**Festgehaltener Baustein:** Knopf „Freigeben" (Startseite oder Updates-Seite); der nächste Sonntagslauf versucht das +Update erneut. + +## Wo was liegt (Box) + +| Pfad | Inhalt | +|---|---| +| `~/mission-control-v2` | Checkout von `main` (nur über `deploy.sh` ändern) | +| `~/mission-control-v2/backend/.venv` | Python-Umgebung des Box-Warts (Python 3.14) | +| `~/.config/systemd/user/` | User-Units und Drop-ins | +| `/srv/models/` | Modelle, Box-Wart-Zustand (`mc2-*.json`), Sicherungen (`mc2-backups/`), Radar-Downloads (`radar/`) | +| `/etc/llama-swap/config.yaml` | lebende llama-swap-Config (+ `.bak-*`) | +| `/opt/llamacpp-vulkan/`, `/usr/local/bin/llama-server` | Motor (llama.cpp Vulkan) | +| `/usr/local/bin/llama-swap`, `/usr/local/bin/llama-swap-warmup.sh` | Router und Vorwärm-Skript (Root-Kopie) | +| `~/.hermes/` | Hermes: Code (`hermes-agent/`), `config.yaml`, `.env`, `SOUL.md`, `memories/`, `skills/`, `scripts/`, `cron/`, `logs/` | +| `~/.lucy-stimme/` | Lucys Stimme (pocket-tts), Referenz `app/ref.wav` | +| `~/.voice/` | Umgebung der Spracherkennung (`voice_service/install.sh`) | +| `~/projekte/` | Spiegel der Gitea-Repos (`projekte-sync`) | +| `~/mc2-notify.log`, `~/.hermes/night-queue.txt` | Meldeprotokoll, Nacht-Warteschlange | diff --git a/docs/DISASTER_RECOVERY.md b/docs/DISASTER_RECOVERY.md deleted file mode 100644 index de56a06..0000000 --- a/docs/DISASTER_RECOVERY.md +++ /dev/null @@ -1,325 +0,0 @@ -# Konzept: Bare-Metal-Wiederaufbau + First-Run-Wizard (VOLLSTÄNDIG) - -> **Zweck:** Plan für den „hard crash"-Fall — die Box (`tobisniceaiarbeitstier`, Ubuntu 26.04, -> AMD Ryzen AI MAX+ 395 / gfx1151, 122 GB RAM) muss von **null** wiederherstellbar sein. -> **Anspruch:** *ALLES* ist erfasst — Engine, Hermes-Konfig 1:1, Voice/Klonstimme, -> Memory, Browser, MCP, Skills, Secrets. Pro Komponente entscheidet der Nutzer im Wizard: -> **1:1 zurück** · **neu/Default** · **weglassen**. -> -> Dieses Dokument ist die **Spezifikation für eine künftige Implementierungs-Session** — es baut -> noch nichts. Stand: 2026-06-28. - ---- - -## 1. Leitprinzip: 1:1 ODER modular — der Nutzer wählt - -Der Wizard behandelt jede Komponente als **eigene Kachel mit drei Modi**: - -| Modus | Bedeutung | -|---|---| -| 📦 **1:1 aus Backup** | Exakter alter Zustand wird zurückgespielt (Configs, Daten, Klonstimme). | -| 🆕 **Neu / Default** | Frische Installation mit sinnvollen Defaults (z.B. entfesseltes Hermes-Profil). | -| ⏭️ **Weglassen** | Komponente wird (vorerst) nicht installiert. | - -Ein „Alles 1:1"-Knopf wählt überall 📦 (wo ein Backup existiert), sonst 🆕. So bekommt der Nutzer -entweder den exakten alten Stand oder kann gezielt entrümpeln. - ---- - -## 2. Was es schon gibt (wiederverwenden) - -| Asset | Datei | Deckt ab | -|---|---|---| -| Code-Deploy | `deploy/deploy.sh` | git pull + venvs + Units + Restart. **Setzt Engine/llama-swap/Dirs/venvs voraus.** | -| Zustands-Backup | `deploy/backup.sh` + `mc2-backup.{service,timer}` | **Aktuell** (live): mem0, `~/.hermes/{config.yaml,.env,plugins}`, llama-swap-config. Retention 14. **Für echtes 1:1 zu erweitern** — fertiges Snippet in **Anhang B** (§5). | -| Restore | `deploy/restore.sh` | Spielt Tarball zurück (mit Pre-Restore-Sicherung). | -| Engine | `deploy/provision-engine.sh` | llama.cpp Vulkan/RADV-Build (root). | -| Voice-Setup | `voice_service/install.sh` | venv + Piper-Binary + dt. Piper-Stimmen + Chatterbox (best-effort). | -| Updates | `deploy/update-engine.sh`, `update-swap.sh` | Laufende Engine/Router-Updates. | -| Postchecks | `deploy/stack-postcheck.sh`, `hermes-postcheck.sh` | Funktionsprüfung → Wizard-Verifikationsschritt. | - ---- - -## 3. VOLLSTÄNDIGER Komponenten-Katalog - -> **Scan-verifiziert (2026-06-28)** gegen `backend/config.py`, alle `backend/services/*` & `routers/*`, -> `frontend/src/{nav.ts,views,components/voice}`, `voice_service/app.py`, `mem0_service/`, `deploy/*`. -> Alle persistenten Schreibpfade, Dienste, Secrets und Env-Vars sind unten erfasst. - -Legende Restore-Quelle: 📦 = aus Backup-Tarball · ⬇️ = Re-Download/Install (Skript) · 🌐 = Git · -🔑 = Secret (Nutzer/Generieren) · 🆕 = im Wizard neu gewählt. -„Im Backup?" = deckt der **aktuelle** `backup.sh` es ab. - -### A · OS & System (L0, root/sudo, einmalig) -| Komponente | Ort | Quelle | Im Backup? | -|---|---|---|---| -| Ubuntu 26.04, User `hitonabi`, `enable-linger` | — | ⬇️ manuell | n/a | -| System-Pakete: python3.14+venv, git, curl, jq, ttyd, uv | — | ⬇️ apt/curl | nein | -| Vulkan-Stack: mesa-vulkan-drivers, libvulkan1, vulkan-tools | — | ⬇️ apt | nein | -| Chrome-Libs (Browser): `agent-browser install --with-deps` | — | ⬇️ apt | nein | -| Verzeichnis-Layout: `/srv/models/{,mem0,mc2-backups,drafts}`, `/etc/llama-swap/` | — | ⬇️ mkdir+chown | nein | - -### B · Inferenz-Engine + Router (L1, root) -| Komponente | Ort | Quelle | Im Backup? | -|---|---|---|---| -| llama.cpp (Vulkan) → `llama-server` | `/opt/llamacpp-vulkan`, `/usr/local/bin/llama-server` | ⬇️ provision-engine.sh / update-engine.sh (ggml-org Release) | nein (re-build) | -| **llama-swap** Binary (Router `:8080`) | `/usr/local/bin/llama-swap` | ⬇️ **bekannt:** `mostlygeek/llama-swap`-Release (Rezept in `update-swap.sh`) | nein (re-download) | -| **llama-swap systemd-System-Unit** | `/etc/systemd/system/llama-swap.service` (+ `.d/` Drop-ins) | ⬇️ Bootstrap legt sie an — **kompletter Unit-Inhalt in Anhang A** (von der Box abgegriffen; Drop-ins via provision-engine.sh) | nein | -| llama-swap-Config (Modelle/Rollen) | `/etc/llama-swap/config.yaml` | 📦 | **ja** | -| Draft-Modelle (Spec-Decoding) | `/srv/models/drafts/` | ⬇️ Re-Download | nein | - -### C · MC2-App (L2, userspace) -| Komponente | Ort | Quelle | Im Backup? | -|---|---|---|---| -| MC2-Code | `~/mission-control-v2` | 🌐 Git (Gitea) | n/a | -| Backend-venv (Python 3.14) | `backend/.venv` | ⬇️ deploy.sh | nein (rebuild) | -| Frontend (gebaut) | `frontend/dist` | 🌐 Git | n/a | -| systemd-User-Dienst `mission-control-2` (`:9001`) | `~/.config/systemd/user/` | ⬇️ deploy.sh | nein | - -### D · 3D-Avatar — **ausgebaut (28.08.2026)** - -MC2 hat keinen Avatar mehr. `frontend/public/avatar.vrm` (24,5 MB) lag im Auslieferungsordner, -wurde aber von keiner Zeile des Frontends referenziert — der Renderer `Avatar3D.tsx` war schon -vorher verschwunden. Beides ist beim v3-Umbau (Etappe P0) entfernt worden; damit fällt auch die -`.gitignore`-Sonderregel und der Direkt-Deploy-Schritt weg. **Nichts wiederherzustellen.** - -### E · Voice-Sidecar (STT + TTS + Klonstimme) -| Komponente | Ort | Quelle | Im Backup? | -|---|---|---|---| -| Voice-venv (Python 3.12) | `~/.voice/venv` | ⬇️ install.sh | nein (rebuild) | -| STT (faster-whisper Modell) | `~/.voice/` (Cache) | ⬇️ install.sh / 1. Start | nein | -| Piper-Binary + dt. Stimmen (thorsten/kerstin) | `~/.voice/piper`, `~/.voice/voices` | ⬇️ install.sh | nein | -| Chatterbox (Premium-TTS, CPU-torch) | venv | ⬇️ install.sh (best-effort) | nein | -| **Klonstimme / Voice-Referenz-Audio** (Nutzer) | `~/.voice/refs/ref.wav` (`VOICE_REFS_DIR`, `/api/voice/reference`) | 📦 | **nein → Anhang B** | -| ElevenLabs-Key | `~/.hermes/.env` | 🔑 | ja | -| Stimm-/Lautstärke-Wahl | Browser-`localStorage` (pro Gerät) | 🆕 client | n/a | -| Dienst `voice-service` (`:8650`) | systemd-User | ⬇️ deploy.sh | nein | - -### F · Mem0 (Langzeitgedächtnis) -| Komponente | Ort | Quelle | Im Backup? | -|---|---|---|---| -| Mem0-venv (Python 3.12, uv) | `~/.mem0/venv` | ⬇️ deploy.sh | nein (rebuild) | -| **Gedächtnis-Daten (Chroma + history.db)** | `/srv/models/mem0/` | 📦 | **ja** | -| Hermes-Memory-Plugin | `~/.hermes/plugins/mc2-memory/` | 📦/🌐 | ja | -| Dienst `mem0-service` (`:8765`) | systemd-User | ⬇️ deploy.sh | nein | - -### G · Hermes-Agent (das Herz) -| Komponente | Ort | Quelle | Im Backup? | -|---|---|---|---| -| Hermes-Code | `~/.hermes/hermes-agent` | 🌐 Git (NousResearch) | nein (re-clone) | -| Bundled Node v22 | `~/.hermes/node/bin` | ⬇️ (kommt mit Hermes) | nein | -| Hermes-venv | `~/.hermes/hermes-agent/venv` | ⬇️ rebuild | nein | -| **`config.yaml` 1:1** (Toolsets, MCP, Engine, Browser, Personalities, alles) | `~/.hermes/config.yaml` | 📦 | **ja** | -| **`.env` (Secrets: TELEGRAM_BOT_TOKEN, API_SERVER_KEY, ElevenLabs …)** | `~/.hermes/.env` | 📦/🔑 | **ja** | -| Plugins | `~/.hermes/plugins/` | 📦 | ja | -| **Skills (eigene)** | `~/.hermes/skills/` (45M; `.hub`-Cache re-downloadbar) | 📦 | **nein → Anhang B (ohne .hub)** | -| Sessions/History (optional) | `~/.hermes/sessions/` (856K) | 📦 | **nein → Anhang B** | -| Checkpoints (optional) | `~/.hermes/checkpoints/` (existiert nicht) | ⏭️ skip | nein | -| **Token-/Ersparnis-Statistik** | `~/.hermes/token_stats.json` | 📦 | **nein → Anhang B** | -| Dienst `hermes-gateway` (`:8642`) | systemd-User | ⬇️ | nein | -| Desktop-Gateway `hermes-builtin-ui` (`:9119`) | systemd-User | ⬇️ deploy.sh | nein | -| Desktop-Gateway-Token-Drop-in | `~/.config/systemd/user/hermes-builtin-ui.service.d/session-token.conf` | 🔑 neu erzeugen (Wert auch in `~/.hermes/desktop-gateway-token`, chmod 600) | **nein** | -| Desktop-Gateway-Token-Kopie | `~/.hermes/desktop-gateway-token` (chmod 600) | 🔑 | **nein** | - -### H · MCP-Server (4) -| Komponente | Ort | Quelle | Im Backup? | -|---|---|---|---| -| `mission-control-memory`, `-stack` (MC2-venv) | `~/mission-control-v2/mcp/*.py` | 🌐 Git | über config.yaml | -| `hermes-pc-control`, `hermes-web-fetch` (Hermes-venv) | dito | 🌐 Git | über config.yaml | -| MCP-Verdrahtung | `~/.hermes/config.yaml → mcp_servers` | 📦 | ja | - -### I · Browser-Stack -| Komponente | Ort | Quelle | Im Backup? | -|---|---|---|---| -| agent-browser (npm global) | `~/.local/...`, symlink `~/.hermes/node/bin` | ⬇️ npm i -g | nein | -| Chrome (engine) + System-Libs | `~/.agent-browser/browsers/` + apt-Libs | ⬇️ install --with-deps | nein | -| lightpanda (optional, leicht) | `~/.local/bin/lightpanda` | ⬇️ Download | nein | -| Browser-Verdrahtung (engine=chrome, toolset) | `~/.hermes/config.yaml` | 📦 | ja | - -### J · Modelle (GGUF — der große Brocken) -| Komponente | Ort | Quelle | Im Backup? | -|---|---|---|---| -| GGUF-Modelle (Brain, fast, heavy, coder, vision, embedding …) | `/srv/models/` | ⬇️ Re-Download aus llama-swap-Manifest | **nein (zu groß, bewusst)** | - -### K · Extern (anderer Rechner) -| Komponente | Ort | Quelle | Im Backup? | -|---|---|---|---| -| PC-Executor (Windows) | `client/hermes-pc/` → Scheduled Task | 🌐 Git + Task | n/a (anderer Host) | -| Hermes Desktop (Windows-App) | `%LOCALAPPDATA%\hermes` + `connection.json` in `%APPDATA%\Hermes\` | ⬇️ Hermes-Setup.exe + Remote-URL/Token neu eintragen | n/a (anderer Host) | - ---- - -## 4. Ziel-Architektur - -### 4.1 `deploy/bootstrap.sh` — orchestrierter From-Zero-Lauf -- **Idempotent & resumierbar** (Schritt-Marker in `~/.mc2-bootstrap.state`). -- **Getrennt nach sudo-Bedarf**: `bootstrap-root.sh` (L0+L1, bewusst mit sudo) + `bootstrap.sh` - (L2+, sudo-frei = Kern ist `deploy.sh`). Passt zum Nordstern „Runtime ohne sudo". -- **Mündet in den Wizard**: startet MC2 im First-Run-Modus, gibt Wizard-URL aus. - -Phasen: `0 Vorflug → 1[sudo] System+Dirs → 2[sudo] Engine+llama-swap → 3 Code(MC2+Hermes+Node) -→ 4 venvs(backend/mem0/voice/hermes) → 5 Browser → 6 deploy.sh(Units/enable/restart) -→ 7 Restore(optional) → 8 Wizard hoch + postcheck`. - -### 4.2 First-Run-Wizard (browserbasiert, von MC2 serviert) -MC2 erkennt unkonfigurierten Zustand → Frontend-Route `/setup` statt Dashboard. Schritte: - -1. **Systemcheck** — Live-Ampel je Komponente aus §3 (`GET /api/setup/status` + `…/system/services`). -2. **Restore-Quelle wählen** — Backup-Tarball erkennen → globaler Modus „Alles 1:1" / „selektiv" / „frisch". -3. **Komponenten-Auswahl (Kernstück)** — pro Katalog-Eintrag aus §3 eine Kachel mit - 📦/🆕/⏭️ (siehe §1). Zeigt Größe + ob Backup-Daten vorhanden. -4. **Netzwerk & Identität** — Box-IP (→ `HERMES_TERMINAL_URL`, `PC_EXECUTOR_URL`), Hostname. -5. **Secrets** 🔑 — `TELEGRAM_BOT_TOKEN`, erlaubte User-ID, `API_SERVER_KEY` (oder generieren), - ElevenLabs-Key → `~/.hermes/.env` (chmod 600). Bei 📦 vorbefüllt aus Backup. -6. **Hermes-Profil** — Brain-Alias + Toolset-Profil (Default = entfesselt: vision/tts/memory/browser - an, image_gen/video aus — siehe [[project-hermes-setup]]). Bei 📦 = exakte alte `config.yaml`. -7. **Voice** — Stimme/Klonstimme - (📦 Referenz-Audio zurück, oder neu aufnehmen/hochladen). -8. **Modelle** — aus llama-swap-Manifest automatisch nachladen (`POST /api/models/install`, - Fortschritt `GET /api/jobs`) ODER geführte Discover-Neuauswahl. Reihenfolge: Brain → heavy → Rest. -9. **Externe Checkliste** — PC-Executor (Windows-Task), Hermes Desktop (App + Token) als Haken. -10. **Verifikation & Abschluss** — `stack-postcheck.sh` + `hermes-postcheck.sh` → grün/rot-Liste → Dashboard. - -**Technik:** neuer Router `backend/routers/setup.py` -(`GET /api/setup/status`, `POST /api/setup/{secrets,network,hermes,components,finish}`). -First-Run-Gate: MC2 prüft beim Boot Marker `~/.mc2-setup-done` bzw. Pflicht-Secrets → leitet auf `/setup`. - ---- - -## 5. Backup-Scope für echtes 1:1 ERWEITERN (umzusetzen — Snippet in Anhang B) - -Der **aktuelle** `backup.sh` (live auf der Box, unverändert) reicht für „1:1" nicht. Für die Bau-Session -liegt das **fertige Erweiterungs-Snippet in Anhang B** — es ergänzt den Tarball um: - -- **Voice-Klonstimme** → `~/.voice/refs/` (`ref.wav`) -- **Token-/Ersparnis-Statistik** → `~/.hermes/token_stats.json` -- **Hermes-Skills** → `~/.hermes/skills/` (re-downloadbarer `.hub`-Cache per `tar --exclude` ausgelassen) -- **Hermes-Sessions/History** → `~/.hermes/sessions/` - -Restore soll skills/sessions **mergen** (frisch geladenen `.hub` nicht überschreiben) und `voice-service` -mit neu starten. - -**Offen bleibt:** nichts — der letzte offene Punkt (eigene Avatare) ist mit dem Avatar-Ausbau erledigt (§3·D). - -**Bewusst NICHT im Backup (re-downloadbar/rebuildbar):** Piper-Stimmen (install.sh), `.hub`-Skill-Cache, -`/srv/models/mc2-discover.json` (Cache), `/srv/models/mc2-memory.db` (Legacy-Migration), alle venvs, GGUF-Modelle. - -→ Aufgabe der Bau-Session: `backup.sh` + `restore.sh` um diese Pfade erweitern (mit klarer -„opt-in für große/optionale Teile"-Logik), und den MANIFEST-Inhalt entsprechend. - ---- - -## 6. Secrets-Strategie -- Single Source: `~/.hermes/.env` (chmod 600), im Tarball (selbst 600). -- Rebuild ohne Backup → Wizard-Schritt 5 erzeugt sie. `API_SERVER_KEY` generierbar; Telegram/ElevenLabs liefert Nutzer. -- Nie ins Git, nie in Logs, nie in die MC2-DB. **Off-Box-Spiegelung des Tarballs noch offen** ([[mc2-backup-restore]]). - -## 7. Modell-Strategie -- **A (empfohlen):** `/etc/llama-swap/config.yaml` (im Backup) listet alle Modelle → Wizard leitet Repos/Quants ab und lädt automatisch (`/api/models/install`). „Ein Klick, lädt über Nacht." -- **B:** geführte Discover-Neuauswahl je Rolle. Reihenfolge Brain → heavy → Rest, danach `warmup.sh`. - ---- - -## 8. Implementierungs-Reihenfolge (neue Session) -1. ✅ **Box-Verifikation erledigt (2026-06-28, nur gelesen — nichts verändert):** llama-swap.service-Inhalt - in **Anhang A**; skills/sessions/refs/token_stats existieren (Pfade in §3 verifiziert); Backup-Erweiterung - als fertiges Snippet in **Anhang B**. **Keine offenen Box-Fragen mehr** außer §10·3–6. → mit Schritt 2 starten. -2. `backup.sh`/`restore.sh` um die 1:1-Lücken erweitern (§5). -3. `deploy/bootstrap.sh` + `bootstrap-root.sh` (Phasen, State-Marker); llama-swap-Install skripten. -4. `backend/routers/setup.py` + First-Run-Gate. -5. Frontend `/setup`-Wizard (Schritte 1–10), Komponenten-Auswahl als Kernstück; bestehende Views - (Cockpit/AgentView/Sprechen) wiederverwenden. -6. Modell-Restore-aus-Manifest. -7. **Abnahme in frischer VM** (§9). - -Vorschlag: 2–4 zuerst (Skelett lauffähig), Wizard danach. Branch + PR. - -## 9. Abnahmekriterien -- Frisches Ubuntu 26.04 → `bootstrap-root.sh` + `bootstrap.sh` → laufender Stack, kein Spezialwissen. -- Postchecks grün; Telegram, Voice (inkl. Klonstimme bei 📦), Browser funktionieren. -- „Alles 1:1" stellt mem0, Hermes-config.yaml, Secrets, Klonstimme, Skills exakt wieder her. -- Selektiver Modus: einzelne Komponenten ⏭️ überspringbar, Stack läuft trotzdem. -- Idempotenz: zweiter Lauf = No-op. - -## 10. Offene Entscheidungen (vor dem Bau) -1. ~~llama-swap systemd-Unit-Inhalt~~ → **geklärt: kompletter Unit in Anhang A** (in der Bau-Session anlegen). -2. ~~Voice-Referenz-Audio-Ort~~ → **geklärt: `~/.voice/refs/`** (Backup-Snippet in Anhang B, in der Bau-Session umsetzen). -3. ~~**Eigene Avatare**~~ — entfallen: Avatar am 28.08.2026 ausgebaut (§3·D). -4. **Off-Box-Backup-Ziel** (NAS/2. Platte/Cloud) — [[mc2-backup-restore]]. -5. **Python 3.14** auf frischem Ubuntu beschaffen (deadsnakes?). -6. **Bootstrap-sudo-Modell**: getrenntes `bootstrap-root.sh` (empfohlen) vs. interaktives sudo. - -## 11. Referenzen -- `backend/config.py`, [[project-mc2-architecture]], [[project-stack-state]] -- [[project-hermes-setup]], `docs/HERMES_SETUP.md` (entfesseltes Profil, Browser, PC-Executor) -- [[voice-sprechen-feature]] (Voice + 3D-Avatar), [[mem0-memory-architecture]], [[mc2-backup-restore]] -- `deploy/{deploy,backup,restore,provision-engine,stack-postcheck,warmup}.sh`, `voice_service/install.sh` - ---- - -## Anhang A — `llama-swap.service` (1:1 von der Box abgegriffen, 2026-06-28) - -Base-Unit nach `/etc/systemd/system/llama-swap.service` (root). User/GFX sind boxspezifisch -(hitonabi, gfx1151 → HSA 11.5.1) — auf anderer Hardware anpassen. Die `.d/`-Drop-ins -(`vulkan.conf`, `warmup.conf`) legt `provision-engine.sh` an. - -```ini -[Unit] -Description=llama-swap (lokaler LLM Router) -After=network-online.target -Wants=network-online.target - -[Service] -Type=simple -User=hitonabi -Environment=HSA_OVERRIDE_GFX_VERSION=11.5.1 -Environment=PATH=/usr/local/bin:/usr/bin:/bin -ExecStart=/usr/local/bin/llama-swap --config /etc/llama-swap/config.yaml --listen 0.0.0.0:8080 --watch-config -Restart=on-failure -RestartSec=3 - -[Install] -WantedBy=multi-user.target -``` -```ini -# /etc/systemd/system/llama-swap.service.d/vulkan.conf -[Service] -Environment=LD_LIBRARY_PATH=/opt/llamacpp-vulkan -``` -```ini -# /etc/systemd/system/llama-swap.service.d/warmup.conf -[Service] -ExecStartPost=-/usr/local/bin/llama-swap-warmup.sh -``` - -**Erstinstall-Reihenfolge:** `bash deploy/update-swap.sh` (Binary) → Unit kopieren → -`sudo bash deploy/provision-engine.sh` (Engine+Drop-ins) → `sudo systemctl enable --now llama-swap`. - ---- - -## Anhang B — Backup-Scope-Erweiterung für echtes 1:1 (fertiges Snippet) - -In `deploy/backup.sh` ergänzen (Variablen oben: `VOICE="${VOICE_HOME:-$HOME/.voice}"`, -Stage zusätzlich `"$STAGE/voice"`): - -```bash -# 1:1-Erweiterung (scan-verifiziert 2026-06-28): -[ -f "$HERMES/token_stats.json" ] && cp -a "$HERMES/token_stats.json" "$STAGE/hermes/" || true -[ -d "$HERMES/skills" ] && cp -a "$HERMES/skills" "$STAGE/hermes/skills" || true -[ -d "$HERMES/sessions" ] && cp -a "$HERMES/sessions" "$STAGE/hermes/sessions" || true -[ -d "$VOICE/refs" ] && cp -a "$VOICE/refs" "$STAGE/voice/refs" || true -``` -tar-Aufruf um den re-downloadbaren Skill-Cache erleichtern: -```bash -tar --exclude='./hermes/skills/.hub' -czf "$OUT" -C "$STAGE" . -``` -In `deploy/restore.sh` spiegelbildlich (skills/sessions **mergen**, nicht ersetzen) und -`voice-service` mit neustarten: -```bash -VOICE="${VOICE_HOME:-$HOME/.voice}" -SERVICES="mem0-service voice-service mission-control-2 hermes-gateway" -[ -f "$STAGE/hermes/token_stats.json" ] && cp -a "$STAGE/hermes/token_stats.json" "$HERMES/" -[ -d "$STAGE/hermes/skills" ] && { mkdir -p "$HERMES/skills"; cp -a "$STAGE/hermes/skills/." "$HERMES/skills/"; } -[ -d "$STAGE/hermes/sessions" ] && { mkdir -p "$HERMES/sessions"; cp -a "$STAGE/hermes/sessions/." "$HERMES/sessions/"; } -[ -d "$STAGE/voice/refs" ] && { mkdir -p "$VOICE/refs"; cp -a "$STAGE/voice/refs/." "$VOICE/refs/"; } -``` diff --git a/docs/RADAR.md b/docs/RADAR.md new file mode 100644 index 0000000..ce81af6 --- /dev/null +++ b/docs/RADAR.md @@ -0,0 +1,104 @@ +# Radar — Modell-Radar, Stack-Radar, Prüfstand + +_Stand 24.09.2026, Code in `main` = `75611be`. Für Techniker und Agenten._ + +Es gibt zwei Radare mit getrennten Aufgaben: + +- **Modell-Radar** (Box-Wart, `mc2-radar.timer` um 00:30): sucht und testet neue Modelle für Hirn und Coder selbst. + Getauscht wird nur per Knopf „Übernehmen". +- **Stack-Radar** (Hermes-Cron „KI und Stack Radar", Sa 08:00): Wochenbericht über den Zustand der Box und über + Neuigkeiten draußen (Releases, Entwurfsmodelle). Er testet und ändert nichts. + +## Modell-Radar + +Code: `backend/services/radar.py`, Nachtlauf `backend/radar_lauf.py`, Messungen `deploy/bench/pruefstand.py`, +Merkliste `deploy/radar-watchlist.json`. Zustand: `/srv/models/mc2-radar.json`, Baseline +`/srv/models/mc2-radar-baseline.json`, Downloads `/srv/models/radar//`. Protokoll: +`journalctl --user -u mc2-radar`. + +### Leitplanken (User-Entscheid 23.09.) + +- Zwei Rollen: Hirn (Alias `hermes`) und Coder (Alias `coder`), jede mit Bild-Zwilling (`vision` bzw. `coder-bild`). +- Tests nur nachts 00:30–02:30, höchstens ein neuer Kandidat pro Woche. Um 03:00 braucht der NerdQuiz-Nachtlauf das + Hirn. +- Nur was neben das Warm-Set passt: 27 GB Warm-Set plus Kandidat mit KV-Cache ≤ 115 GB, gerechnet mit dem Kontext + aus dem Betrieb (131 072; passt das nicht, stufenweise kleiner, nie unter 32 768). Ab 90 % des Budgets heißt es + „passt knapp". +- Pflicht: GGUF plus Bild-Projektor (mmproj), mindestens 20B Parameter; als Hirn höchstens 12B aktive Parameter + (dichte Modelle nie als Hirn). Die installierte Engine muss die Architektur kennen, und die Platte darf nach dem + Download nicht über 80 % liegen. +- Durchgefallene werden gelöscht, Bestandene bleiben liegen. Getauscht wird erst mit „Übernehmen". + +### Ablauf einer Nacht + +1. Um 00:30 startet `mc2-radar.service` (`Persistent=true`, holt einen verpassten Lauf nach). +2. **Suche**, höchstens einmal am Tag: zuerst die Merkliste in ihrer Reihenfolge, dann die Hugging-Face-Entdeckung + (höchstens 3 Funde je Rolle). Jeder Fund wird bewertet: Dateien, Größe, Engine-Unterstützung, Speicher. Der Knopf + „Jetzt suchen" macht dasselbe sofort (läuft synchron und kann Minuten dauern). +3. **Offene Urteile nachholen:** Kandidaten mit Status „getestet", bei denen die Vergleichsmessung fehlte. +4. **Test**, wenn ein Kandidat dran ist: + 1. Download nach `/srv/models/radar//`. + 2. Baseline des heutigen Modells der Rolle über llama-swap (gecacht, höchstens monatlich neu gemessen). + 3. In llama-swap bleibt nur das Warm-Set; ein Aufpasser entlädt Modelle, die nachts nachgeladen werden (etwa den + Coder). + 4. Draft-Varianten kurz messen: ohne Draft, eingebauter MTP-Kopf, Draft des heutigen Modells (nur bei gleicher + Architektur und genug Speicher). Ein Draft aus der Merkliste wird allein genommen. + 5. Mit der schnellsten Variante den Prüfstand fahren; der Kandidat läuft als eigener `llama-server` auf `:5899`. + 6. Bild-Probe über einen Zwilling ohne Draft, dann das Urteil. +5. **Frist:** Die Messungen prüfen das Fensterende 02:30 selbst. 5 Minuten danach zieht die Notbremse + (Kandidaten-Server und Download stoppen, der Prozess endet hart). `RuntimeMaxSec=2h10min` beendet die Unit + spätestens um 02:40 samt `llama-server`. +6. **Bestanden:** Meldung „[Modell-Radar] … hat den Nachttest bestanden"; nachts landet sie in der Morgenmeldung. + +Status eines Kandidaten: neu → wartet → getestet → bestanden oder durchgefallen → uebernommen oder verworfen. +Höchstens 3 Versuche je Kandidat; ein Abbruch, für den der Kandidat nichts kann, zählt nicht als Versuch. + +### Prüfstand (`deploy/bench/pruefstand.py`) + +- Der Kandidat läuft als eigener `llama-server` auf `127.0.0.1:5899`; der Live-Stack bleibt unberührt. +- **Hirn:** Tempo kurz und bei 13k Kontext (Prefill, Decode, Draft-Akzeptanz), Werkzeug-Aufrufe zwischen ~100 + Werkzeugen mit ~12k Kontext, Deutsch- und JSON-Probe. +- **Coder:** Tempo, Werkzeug-Aufrufe eines Coding-Agenten, 10 kleine Programmieraufgaben mit Unit-Tests in einem + Temp-Ordner mit Zeitlimit. +- **Bild:** ein im Code gezeichnetes Bild (Formen, Farben, Text), einmal direkt, einmal mitten in einer + Werkzeug-Aufgabe. +- **Urteil:** bestanden = keine Verschlechterung bei den Pflichtwerten UND mindestens ein echter Vorteil. +- **Handbetrieb:** `deploy/bench/pruefstand-hirn.py` misst Kandidaten mit festen Pfaden gegen die Live-Modelle, + optional mit einem Werkzeug-Test durch den echten Hermes (Provider `pruefstand` in der Hermes-Config). + +### Übernehmen und Verwerfen (Seite „Modelle") + +**Übernehmen** geht nur bei Status „bestanden" und nicht während eines Nachtlaufs: + +1. Der Ordner wandert von `/srv/models/radar/` nach `/srv/models/`. +2. Eintrag in llama-swap mit dem getesteten Draft und den Betriebs-Flags der Rolle, ohne Projektor. Dazu der + Bild-Zwilling `-Bild` in der Gruppe `bild` (ttl 900). Der alte Zwilling fliegt aus der Config, seine + Dateien bleiben. +3. **Hirn:** Alias `hermes`, Gruppe `brains`, ttl 0, `model.default` in der Hermes-Config; Hermes startet dafür kurz + neu. Der Alias `fast` wandert mit, `MC_WARMSET` im Steward-Drop-in wird umgestellt und der Steward neu gestartet. + **Coder:** Rolle `coder`; `heavy` wandert mit, die ttl des alten Coders wird übernommen. +4. Das alte Modell bleibt auf der Platte (Aufräumen-Panel). + +**Verwerfen:** Die heruntergeladenen Dateien werden gelöscht, und das Radar testet dieses Modell nie wieder. + +Ein Tausch schreibt die llama-swap-Config heute noch mehrmals (offener Punkt in +[wissen/OFFENE-FAEDEN.md](wissen/OFFENE-FAEDEN.md)). + +### Merkliste + +`deploy/radar-watchlist.json`, Felder je Eintrag: `name`, `rolle` (`hirn` oder `coder`), `repo`, `quant` (Standard +Q4_K_M), `eng` (passt nur knapp), `notiz`, `ueberspringen` (Grund, dann kein Test), optional `draft` und `flags`. +Merkliste und Hugging-Face-Entdeckung zusammen ergeben die Warteschlange; Merkliste zuerst. + +## Stack-Radar (Hermes-Cron „KI und Stack Radar", Sa 08:00) + +- `deploy/jobs/stack-radar.sh` sammelt Fakten und meldet selbst über `notify.sh` mit Betreff „[Stack-Radar]". +- `deploy/jobs/stack-ist.sh` prüft Ergebnisse statt Lebenszeichen: Lösen die Rollen-Aliase auf? Lief der letzte + Timer gut? Ist die Sicherung jünger als zwei Tage? +- `deploy/jobs/stack-upstream.py` schaut nach draußen: Releases, gemergte PRs, neue Entwurfsmodelle und Modelle der + Familien, die die Box fährt; verglichen mit dem letzten Lauf (`~/.hermes/state/stack-upstream.json`). Liste: + `deploy/trend-radar-watchlist.json`. +- Das Hirn (`fast`) schreibt aus den Fakten einen kurzen Bericht; es darf nichts dazuerfinden. Antwortet es nicht, + gehen die roten Rohbefunde trotzdem raus. +- Grundsatz: „Fakten sammelt ein Skript, Prosa schreibt das Modell." Mehr in + [deploy/jobs/README.md](../deploy/jobs/README.md). diff --git a/docs/RUNBOOK.md b/docs/RUNBOOK.md deleted file mode 100644 index 25c5a99..0000000 --- a/docs/RUNBOOK.md +++ /dev/null @@ -1,85 +0,0 @@ -# RUNBOOK — Die Box in 1 Seite (für Menschen, ohne KI-Hilfe) - -**Grundsatz:** Die Box wartet sich selbst. Du bekommst Telegram-Nachrichten und antwortest -höchstens „mach". Dieses Blatt ist NUR für den Fall, dass etwas klemmt. - -## Was die Telegram-Meldungen bedeuten - -| Meldung | Bedeutung | Dein Handgriff | -|---|---|---| -| „… aktualisiert … grün" | Update eingespielt, alles geprüft | keiner | -| „… zurückgerollt … GEPINNT" | Update war schlecht, alte Version läuft wieder | keiner (läuft stabil weiter) | -| „KRITISCH: …" | Update UND Rollback kaputt | siehe „Box tot?" unten | -| „🛰️ Evolution-Radar …" | monatlicher Chancen-Report | lesen; bei Interesse „mach" antworten | -| „[Werkstatt] … Vorschlag liegt bereit" | Box hat einen Fix vorbereitet | Branch auf Gitea ansehen → Ampel grün? → selbst auf main mergen → `deploy.sh` | - -## Box tot / Weboberfläche weg? - -1. **Strom/Netz prüfen**, dann Box **einmal neu starten** (Power-Knopf). Alles startet von selbst - (systemd, reboot-fest). 2–3 Minuten warten, dann `http://192.168.178.151:9001` aufrufen. -2. Immer noch tot → per SSH (PC, PowerShell): `ssh hitonabi@192.168.178.151` - dann: `bash ~/mission-control-v2/deploy/restore.sh` (nimmt automatisch das letzte Backup, - liegt in `/srv/models/mc2-backups/`, 14 Tage Vorrat, täglich 03:30 Uhr). -3. Totalschaden (neue Platte/Hardware) → `docs/DISASTER_RECOVERY.md` (Bootstrap von Null). - -## Lucy (am PC) - -- Start: Desktop-Verknüpfung **„Lucy"** (startet den eingefrorenen Produktiv-Build). -- Hängt? `F:\Coding Stuff\lucy\lucy-desktop\Lucy-Neustart.bat` doppelklicken. -- Lucy ist EINGEFROREN — Änderungen macht nur die Werkstatt (Telegram-Vorschlag abwarten). - -## Automatik-Fahrplan (läuft ohne dich) - -- **Nachts:** 03:15 Traum (Wissens-Vault) · 03:30 Backup · 03:50 PBS-Backup · - 04:30 Chef-Gutachter (Morgenlage) · 07:15 Selbsttest · 08:00 Daily-Briefing -- **So 04:30** Auto-Update (Router→Engine→Hermes) mit Rollback+Pin-Fangnetz (dein Ok 10.07.; - manuell geht's jederzeit über den Wartungs-Drawer) -- **Mo 05:15** Release-Radar (Hermes-Neuerungen) · **Monatlich 1., 09:00** Monats-Review - (Evolution-Radar + Selbstkritik) auf Telegram -- **Sa 05:15** Trend-Radar (misst alle Modelle, vergleicht neue Engine-Builds, sucht - bessere Modell-Kandidaten; beobachtet auch Electron/pocket-tts für den PC) · - **So 01:00** Prüfstand (testet gefundene Kandidaten nachts mit echten Aufgaben durch — - das Ergebnis kommt als Karte, DU entscheidest über Wechsel) -- **Monatlich 1., 06:40** Restore-Probe (stellt eine Datei WIRKLICH aus PBS + Tarball - wieder her — meldet laut, falls ein Backup nicht zurückkommt) · **Monatlich 2., 06:40** - Venv-Audit (prüft die Python-Nebendienste auf bekannte Sicherheitslücken → Karte) - -## Pinnwand: eine Ebene ist „GEPINNT" — was heißt das? - -Ein Update hat den Selbsttest gerissen; die Box bleibt bewusst auf der alten Version. Das ist -ein STABILER Dauerzustand, kein Fehler. Pin ansehen / lösen (per SSH): - - cat /srv/models/mc2-pins.json - jq 'del(.hermes)' /srv/models/mc2-pins.json > /tmp/p && mv /tmp/p /srv/models/mc2-pins.json - # (statt .hermes: .engine oder .swap) — nächster So-Lauf versucht das Update erneut - -## Wann Gemini rufen (der Notfall- und Review-Partner) - -Seit dem Claude-Abo-Ende ist **Gemini (in der Antigravity-App am PC)** dein externer Helfer. -Du brauchst ihn NUR in zwei Fällen — den Alltag macht die Box selbst: - -1. **Notfall:** Die Box ist kaputt UND die Schritte unter „Box tot?" (oben) haben nicht - geholfen — oder Lucy/Telegram melden wiederholt „KRITISCH". -2. **Außen-Review:** Du willst einen Fremd-Blick auf die Arbeit der Box (z. B. alle paar - Monate oder vor einem großen Umbau). - -**So rufst du ihn:** Antigravity öffnen → Projektordner `F:\Coding Stuff\mission-control-2` -→ als erste Nachricht schreiben: **„Lies docs/GEMINI_BRIEFING.md und dann [dein Problem]."** -Für ein Review stattdessen: „Lies docs/GEMINI_BRIEFING.md und führe das Review aus -docs/ANTIGRAVITY_REVIEW.md durch." - -**Grenzen (stehen auch in seinem Briefing):** Gemini schlägt vor, DU klickst/entscheidest. -Er darf Security-Sachen nur melden, nie ändern. Wenn er etwas über die Box behauptet, -darf er es nur nach echtem Test behaupten — im Zweifel nachfragen „hast du das gemessen?". - -## Einmalige sudo-Session — ✅ erledigt (02.07.2026) - -Sudo-Freischaltung für Engine/Router-Updates, unattended-upgrades und v1-Aufräumen sind -durch (`/etc/sudoers.d/mc2-autonomie` liegt). Nichts mehr zu tun. - -## Nützliche Handgriffe (SSH) - - curl -s http://127.0.0.1:9001/api/health # Gesamtzustand (brain ready?) - bash ~/mission-control-v2/deploy/autoupdate.sh # Update-Lauf sofort statt Sonntag - bash ~/mission-control-v2/deploy/notify.sh "test" # Meldeweg testen (muss auf Telegram ankommen) - tail ~/mc2-notify.log # was wurde zuletzt gemeldet diff --git a/docs/UPDATES.md b/docs/UPDATES.md new file mode 100644 index 0000000..401d669 --- /dev/null +++ b/docs/UPDATES.md @@ -0,0 +1,109 @@ +# Updates — die Sonntags-Kette, Festhalten, Freigeben + +_Stand 24.09.2026, Code in `main` = `75611be`. Für Techniker und Agenten; für den User: Seite „Updates" in +[BEDIENUNG.md](BEDIENUNG.md)._ + +Die Box aktualisiert ihre Fremd-Software jeden Sonntag selbst: erst llama-swap, dann den Motor (llama.cpp), dann +Hermes. Jeder Baustein wird danach geprüft; ist die Prüfung rot, rollt die Box zurück und hält den Baustein fest, bis +ihn jemand freigibt. Sicherheitsupdates des Betriebssystems laufen getrennt über unattended-upgrades. Modelle wechseln +nie automatisch (Modell-Radar, Knopf „Übernehmen"). + +## Ablauf + +```mermaid +flowchart TD + T["mc2-autoupdate.timer
So 04:30 (+≤10 min)"] --> S["jobs/sonntags-update.sh"] + S --> A["autoupdate.sh"] + A --> R["1 · llama-swap
update-swap.sh"] + R --> E["2 · Motor
update-engine.sh"] + E --> H["3 · Hermes
Job über MC2"] + H --> W["Wochenbericht
[Box-Update]"] + W --> N{"Neustart nötig?
nur So 04–07 Uhr"} +``` + +1. `mc2-autoupdate.timer` (`Persistent=true`, bis 10 min Zufallsverzug) startet `mc2-autoupdate.service` + (einmaliger Lauf nach `mc2-backup.service`, Zeitlimit 3 h). Die Unit ruft `deploy/jobs/sonntags-update.sh`, das + `deploy/autoupdate.sh` startet und nur dann selbst meldet, wenn `autoupdate.sh` mit Fehler endet (letzte 15 + Zeilen). Der Hermes-Cron „Updates am Sonntag" ist seit 24.09. pausiert. +2. `autoupdate.sh` bricht mit Meldung ab, wenn MC2 (`/api/health`) nicht antwortet. +3. **llama-swap und Motor:** Ein festgehaltener Baustein wird übersprungen. Sonst liefert + `GET /api/maintenance/update-details?kind=swap` bzw. `kind=engine` die installierte und die neueste Version. Gibt es + Neues, läuft `sudo -n bash deploy/update-swap.sh` bzw. `update-engine.sh` (fehlt die sudo-Freigabe, wartet der + Baustein mit Hinweis). Die Skripte sichern die alte Version (`/usr/local/bin/llama-swap.bak`, + `/opt/llamacpp-vulkan.bak`), stoppen llama-swap, tauschen, starten und prüfen mit `stack-postcheck.sh`. + Ergebnis 0 = eingespielt, 1 = zurückgerollt (Baustein wird festgehalten, Meldung), 2 = Update und Rückweg + gescheitert (Meldung „KRITISCH", dringend). +4. **Hermes:** Ein festgehaltener Hermes wird übersprungen. Sonst sagt `update-details?kind=hermes`, wie viele + Commits Hermes zurückliegt. `autoupdate.sh` startet `POST /api/maintenance/hermes-update` und wartet bis zu + 20 Minuten. Der Job: Sicherung → Dashboard stoppen → `hermes update --yes --no-gateway-restart` → `hermes doctor` → + Dashboard-Oberfläche mit Basis `/hermes-ui/` bauen → `hermes-gateway` und `hermes-builtin-ui` neu starten → + `hermes-postcheck.sh`. + - Grün: Meldung. + - Rot oder Zeitlimit: erst `self-repair.sh` (kommentiert eindeutige, nicht sicherheitsrelevante Config-Schlüssel + aus, an denen die neue Version scheitert; der Gehirn-Check muss danach grün sein). + - Hilft das nicht: Rückweg — `git reset --hard` auf den alten Commit in `~/.hermes/hermes-agent`, `config.yaml` und + `.env` aus der letzten Sicherung, Neustart, Gehirn-Check. Grün: Hermes wird festgehalten, Meldung. Sonst + „KRITISCH" (dringend). +5. **Wochenbericht** „Commander, die Wochenpflege der Box ist durch" mit einer Zeile je Baustein. +6. **Neustart**, wenn Ubuntu ihn verlangt (`/var/run/reboot-required`), nur sonntags 04:00–06:59; außerhalb gibt es + nur eine Ankündigung. Vorher prüft das Skript: Linger an, keine laufenden Jobs, `mission-control-2`, + `mc2-gateway` und `mc2-steward` im Autostart; sonst Meldung statt Neustart. `MC_AUTOUPDATE_REBOOT=0` schaltet den + Neustart ab, `MC_AUTOUPDATE_REBOOT_JETZT=1` erzwingt ihn außerhalb des Fensters. + +Nachts landen alle Meldungen außer „KRITISCH" in der Morgenmeldung um 07:00. + +## Prüfungen nach dem Update + +- **`stack-postcheck.sh`** (nach llama-swap, Motor und Betriebssystem): llama-swap aktiv; `/v1/models` antwortet + (bis 120 s); das Hirn liefert eine echte Antwort (1 Token); das Embedding-Modell liefert Vektoren; MC2 meldet den + Motor erreichbar; Gateway gesund; Steward aktiv. +- **`hermes-postcheck.sh`** (nach Hermes): keine Config-Warnungen im Gateway-Log der letzten 3 Minuten; Werkzeug-Test + durch den echten Agenten (`echo postcheck-ok`, bis 3 Versuche); Sprach-Test über `/api/voice/chat` (bis 3 + Versuche); Browser-Werkzeug `agent-browser` lauffähig (einen toten Link setzt das Skript selbst neu). + +## Festhalten und Freigeben + +- Rot mit grünem Rückweg ergibt einen Eintrag in `/srv/models/mc2-pins.json`: + `{"": {"pinned": true, "version": …, "grund": …, "datum": …}}` mit den Bausteinen `swap`, `engine`, + `hermes`. Künftige Sonntage überspringen ihn. +- Der Wächter zeigt jeden festgehaltenen Baustein als gelben Hinweis „… bekommt keine Updates mehr" mit Knopf + „Freigeben"; die Updates-Seite zeigt ihn ebenso. Freigeben löscht den Eintrag + (`POST /api/updates/festgehalten/{baustein}/freigeben`); der nächste Sonntag versucht das Update erneut. +- Warum sichtbar: Vom 06. bis 17.09. hielt die Box Motor und Hermes fest, ohne dass es jemand merkte, elf Tage ohne + Updates. + +## Von Hand + +- **Seite „Updates":** „Nach Neuem suchen" (`apt-get update`), je Baustein „Aktualisieren", „Alles jetzt + aktualisieren" (mit Rückfrage). Es läuft immer nur ein Wartungs-Job; ein zweiter Klick startet kein zweites Update. +- **„Alles jetzt aktualisieren"** kettet in einem Job, was ansteht: Motor → llama-swap → Hermes → Betriebssystem + (`apt-get upgrade`, danach `stack-postcheck.sh`). Scheitert ein Teil, stoppt die Kette. +- **Zeitlimits der Jobs:** Suche 15 min, Betriebssystem 90 min, Motor 60 min, llama-swap 30 min, Hermes 45 min, alles + zusammen 3 h. „Abbrechen" beendet die ganze Prozessgruppe. +- **Per SSH:** `bash ~/mission-control-v2/deploy/autoupdate.sh` (neu gestartet wird trotzdem nur im Wartungsfenster). +- Kann eine Update-Prüfung nicht prüfen (Netz, API, apt), zeigt die Oberfläche „Prüfung unklar" statt „aktuell". + Nach jedem Update prüft sie sofort neu. +- Update-Jobs leben im MC2-Prozess; ein Neustart von MC2 bricht sie ab. Der Deploy wartet deshalb. + +## Update-Verlauf + +`backend/services/update_verlauf.py` baut den Verlauf der Updates-Seite aus `~/mc2-notify.log`. Es liest die Zeilen +`OK telegram`, `OK telegram direkt` (Zweitweg über die Bot-API), `QUEUED für Morgen-Digest` und `FALLBACK (…)`. +Meldungen mit weniger als 45 Minuten Abstand gehören zu einem Lauf; die Morgenmeldung zählt nicht als eigener Lauf. +Der Wortlaut der Meldungen von `autoupdate.sh` und der Protokolleinträge muss deshalb bleiben: Eine Umformulierung +bricht den Verlauf ohne Fehlermeldung. + +## Betriebssystem + +Sicherheitsupdates spielt `unattended-upgrades` ein. Wartet danach ein Kernel oder libc auf den Neustart, startet der +Sonntagslauf die Box im Wartungsfenster neu. Weitere Pakete: Knopf „Aktualisieren" beim Baustein Betriebssystem. + +## Fallen + +- llama.cpp hat `--no-mmap` gestrichen (seit b10936); die Config nutzt `--load-mode none`. Vor einem Engine-Sprung + die Config-Zeilen mit dem neuen `llama-server` prüfen. +- `hermes update` meldet Exit 1 trotz Erfolg, deshalb `--no-gateway-restart`. +- Ein Timer mit `Persistent=true` holt verpasste Läufe beim Einschalten sofort nach (24.09.: Neustart um 14:51). +- Der Updater läuft nicht mehr als Hermes-Cron (20.09.: Hermes startete sich beim eigenen Update neu). + +Einzelheiten: [wissen/FALLEN.md](wissen/FALLEN.md). diff --git a/docs/WIEDERAUFBAU.md b/docs/WIEDERAUFBAU.md new file mode 100644 index 0000000..8d68cd8 --- /dev/null +++ b/docs/WIEDERAUFBAU.md @@ -0,0 +1,108 @@ +# Wiederaufbau — die KI-Box von null + +_Stand 24.09.2026. Für den Totalschaden (neue Platte, neue Hardware). Für kleinere Störungen gilt +[BETRIEB.md](BETRIEB.md), Abschnitt „Notfall"._ + +Die Reihenfolge stammt aus dem Konzept vom 28.06.2026, aktualisiert auf den Stand vom 24.09.; auf einer frischen Box +geprobt wurde sie nie. Das dort geplante Bootstrap-Skript mit Einrichtungs-Assistent wurde nie gebaut; der Volltext +steht in der Git-Historie (`docs/DISASTER_RECOVERY.md`, letzter Stand 28.08.2026). + +## Was woher zurückkommt + +| Teil | Quelle | +|---|---| +| Code des Box-Warts | Gitea, `main` | +| Hermes: `config.yaml`, `.env`, Plugins, `cron/`, `state/`, Gedächtnis (`memories/`), `SOUL.md`, Skills, Cron-Skripte | Sicherung (Tarball) | +| llama-swap-Config, Box-Wart-Zustand (`/srv/models/mc2-*.json`) | Sicherung | +| Units und Drop-ins, auch die nicht im Repo liegenden | Sicherung, Ordner `systemd/` (zum Nachschlagen), dazu `deploy/` im Repo | +| Lucys Stimmreferenz | Sicherung, `lucy-stimme/ref.wav` | +| Versionen, die zusammen liefen | Sicherung, `known-good/` | +| Modelle | neu laden; die Pfade stehen in der llama-swap-Config | +| Engine, llama-swap, Hermes, Python-Umgebungen | neu installieren | + +## Schritte + +1. **Sicherung besorgen.** Die Tarballs liegen auch auf dem Proxmox-Host unter `/var/lib/vz/mc2-backups`. Der + Spiegel-Schlüssel `~/.ssh/mc2_offsite` steckt nicht in der Sicherung: Den neuesten Tarball von Hand holen (z. B. + vom PC per `scp`) oder den Schlüssel neu einrichten (Security-Config, nur mit User-Ja). +2. **Grundsystem:** Ubuntu 26.04, Benutzer `hitonabi`, Zeitzone `Europe/Berlin`, + `sudo loginctl enable-linger hitonabi` (ohne Linger starten die User-Dienste nach einem Neustart nicht). Pakete: + Python 3.14 mit venv (Bezugsquelle offen, prüfen), git, curl, jq, rsync, ffmpeg (Sprachnachricht der Daily News), + ttyd (Konsole). Die Vulkan-Treiber installiert Schritt 5. +3. **Ordner:** `/srv/models` und `/etc/llama-swap` anlegen und `hitonabi` geben + (`sudo chown -R hitonabi:hitonabi /srv/models /etc/llama-swap`); MC2 schreibt die llama-swap-Config selbst. +4. **Code und Python-Umgebung:** + `git clone ssh://gitea@192.168.178.153:2222/Hitonabi/mission-control-v2.git ~/mission-control-v2` (der + SSH-Schlüssel der Box muss in Gitea hinterlegt sein), dann `python3.14 -m venv backend/.venv` und + `backend/.venv/bin/pip install -r backend/requirements.txt -r backend/requirements-dev.txt`. Was nachweislich + zusammen lief: `known-good/pip-backend.txt` aus der Sicherung. +5. **Engine und llama-swap** (root): `sudo bash deploy/update-swap.sh` (Binary nach `/usr/local/bin/llama-swap`), + Unit aus Anhang A nach `/etc/systemd/system/llama-swap.service`, `sudo bash deploy/provision-engine.sh` + (Vulkan-Treiber, llama.cpp-Build nach `/opt/llamacpp-vulkan`, Drop-ins `vulkan.conf` und `warmup.conf`, + `/usr/local/bin/llama-swap-warmup.sh`), dann `sudo systemctl enable --now llama-swap`. Das dritte Drop-in + `warmset.conf` liegt nur in der Sicherung (`systemd/llama-swap.service.d/`). +6. **Hermes** neu installieren (Git-Install nach `~/.hermes/hermes-agent`; welcher Stand lief, steht in + `known-good/versions.txt`). Den Dienst `hermes-gateway` legt Hermes selbst an; `hermes-builtin-ui.service` samt + Drop-ins aus `systemd/user/` der Sicherung übernehmen. +7. **Zustand zurückspielen:** Tarball nach `/srv/models/mc2-backups/` legen, dann + `bash deploy/restore.sh --yes `. Auf einer leeren Box kommen auch Gedächtnis, `SOUL.md`, Skills, + Cron-Skripte und `mc2-*.json` zurück, weil sie fehlen. +8. **Lucys Stimme:** `~/.lucy-stimme/` (pocket-tts mit `pocket_server.py`) neu einrichten; das Programm stammt aus dem + Lucy-Repo, die Referenz `ref.wav` aus der Sicherung. Offen: Die Einrichtungsschritte sind nirgends beschrieben. +9. **Deploy:** `bash deploy/deploy.sh` spielt alle Repo-Units, Drop-ins, Cron-Skripte, Skills und Plugins aus, + aktiviert Dienste und Timer und prüft nach. Das Plugin `mc2-web-lesen` ist nach dem Restore schon in der + Hermes-Config aktiv; sonst einmalig `hermes plugins enable mc2-web-lesen` und + `hermes config set web.extract_backend mc2-lesen`. +10. **Modelle laden:** Die Pfade stehen in der zurückgespielten llama-swap-Config (`-m`, `--mmproj`, + `--spec-draft-model`); `known-good/models.txt` listet die Dateien mit Größe. Zuerst das Hirn, dann den Coder, dann + die Drafts. Die Bild-Zwillinge nutzen dieselben Gewichte, brauchen also nur ihren Projektor. Laden über die + Oberfläche („Modelle selbst suchen") oder mit + `backend/.venv/bin/hf download --local-dir /srv/models/`. +11. **Prüfen:** `bash deploy/stack-postcheck.sh`, `bash deploy/hermes-postcheck.sh`, dann + `http://192.168.178.151:9001` öffnen: Alle Warnlampen sollen grün sein. +12. **Spracherkennung** (schläft, nur bei Bedarf): `bash voice_service/install.sh` legt `~/.voice/venv` an; aktivieren + mit `systemctl --user enable --now voice-service`. + +## Anhang A — `llama-swap.service` + +Von der Box abgegriffen am 28.06.2026, seitdem nicht neu verglichen. Benutzer und `HSA_OVERRIDE_GFX_VERSION` sind +boxspezifisch. Nach `/etc/systemd/system/llama-swap.service` (root): + +```ini +[Unit] +Description=llama-swap (lokaler LLM Router) +After=network-online.target +Wants=network-online.target + +[Service] +Type=simple +User=hitonabi +Environment=HSA_OVERRIDE_GFX_VERSION=11.5.1 +Environment=PATH=/usr/local/bin:/usr/bin:/bin +ExecStart=/usr/local/bin/llama-swap --config /etc/llama-swap/config.yaml --listen 0.0.0.0:8080 --watch-config +Restart=on-failure +RestartSec=3 + +[Install] +WantedBy=multi-user.target +``` + +Drop-ins, die `deploy/provision-engine.sh` anlegt: + +```ini +# /etc/systemd/system/llama-swap.service.d/vulkan.conf +[Service] +Environment=LD_LIBRARY_PATH=/opt/llamacpp-vulkan +``` + +```ini +# /etc/systemd/system/llama-swap.service.d/warmup.conf +[Service] +ExecStartPost=-/usr/local/bin/llama-swap-warmup.sh +``` + +Das Drop-in `warmset.conf` (laut Prüfbericht vom 24.09. `MC_WARMUP_MODELS=fast`) steht in keinem Skript; es kommt +aus der Sicherung. + +**Erstinstallation in dieser Reihenfolge:** `sudo bash deploy/update-swap.sh` (Binary) → Unit anlegen → +`sudo bash deploy/provision-engine.sh` (Engine und Drop-ins) → `sudo systemctl enable --now llama-swap`. From 424aaada27c2dae301911abeab562fe7a1db9dcd Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 24 Sep 2026 17:41:25 +0200 Subject: [PATCH 4/5] doku: Einstieg neu (README, docs/README, BEDIENUNG), Jobs-Uebersicht, AGENTS korrigiert MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - README.md: eine Seite zum Homelab Orchestrator - Bereiche Box-Wart und Homelab, zwei Instanzen, Seiten der Oberflaeche, was von allein laeuft, Dienste und Ports, Entwickeln mit Prueftor, Links. Ersetzt die alte MC2-Seite (Mem0, Ideen-Queue, entfernte Routen, alte Modelltabelle, kaputte Tabellen). - docs/README.md (loest docs/wissen/README.md ab): Index, Lesereihenfolge, Archiv-Uebersicht, Pflegeregeln. - docs/BEDIENUNG.md: fuer den User neu geschrieben - Start, Updates, Modelle, Dienste, Einstellungen, jede Telegram-Nachricht mit Bedeutung und Handgriff, "wenn etwas hakt". - deploy/jobs/README.md: alle Jobs und Timer (Modell-Radar, NerdQuiz-Nachtlauf 03:00, Updates wieder per Timer), Ausbringen macht deploy.sh, Daily-News-Kette auf dem Stand vom 23./24.09. - AGENTS.md: Coding-Oberflaeche heisst OpenChamber; der Verweis auf .agents/mcp_config.json (am 24.09. geloescht) ersetzt durch den tatsaechlichen Weg ueber :9001/v1; Titel mit dem neuen Produktnamen. - Archivdatei der Referenzaufgabe umbenannt (…-gedaechtnis-ausbau.md), damit der Index keine Altnamen traegt. Co-Authored-By: Claude Opus 5.5 --- AGENTS.md | 6 +- README.md | 201 +++++--------- deploy/jobs/README.md | 258 ++++++------------ docs/BEDIENUNG.md | 156 +++++++---- docs/README.md | 89 ++++++ ...-20-referenzaufgabe-gedaechtnis-ausbau.md} | 0 docs/wissen/README.md | 39 --- 7 files changed, 348 insertions(+), 401 deletions(-) create mode 100644 docs/README.md rename docs/archiv/{2026-08-20-referenzaufgabe-mem0-ausbau.md => 2026-08-20-referenzaufgabe-gedaechtnis-ausbau.md} (100%) delete mode 100644 docs/wissen/README.md diff --git a/AGENTS.md b/AGENTS.md index 54c8916..8395c12 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,4 +1,4 @@ -# AGENTS.md — Mission Control 2.0 +# AGENTS.md — Homelab Orchestrator (vormals Mission Control 2.0) Projekt-Geschmack für Coding-Agenten (Kilo Code, Claude Code lesen diese Datei). Kurz gehalten, nur die Wahrheiten, die man sonst schmerzhaft lernt. Details: `README.md`, `docs/`. @@ -34,9 +34,9 @@ Engine (llama-swap) · Builtin-Routing-Gateway (`model: auto`) · MC2 (FastAPI + - **Nie direkt auf `main` arbeiten.** Immer Branch (`wartung/...`), Gate grün, dann Merge/Deploy. ## Agentic IDE & Vibe Coding -- **Zero Middle-Layers:** Coding passiert zu 100% lokal auf dem Dev-PC in der **OpenCode Desktop IDE**. +- **Zero Middle-Layers:** Coding passiert zu 100% lokal auf dem Dev-PC in **OpenChamber** (mit eigener OpenCode-CLI). - Es gibt keinen Zed-Workflow, keine OpenCode-CLI-Mittelschicht und keinen Governor mehr. -- Der Agent in OpenCode Desktop nutzt via MCP (`.agents/mcp_config.json`) die API der Box (`:9001/v1`), um autonom Projekte zu bauen. +- Der Agent in OpenChamber nutzt die Modelle der Box über `http://192.168.178.151:9001/v1` (Provider `aibox`, nur Rollen-Aliase; Vorlage der PC-Config: `deploy/opencode-config/`). - **Prüftor:** `bash deploy/pruefen.sh` (Shell-/Python-Syntax, ruff, Importe, pytest) muss vor jedem Push grün sein. Der Deploy auf der Box führt es vor dem Umschalten noch einmal aus; rot = automatisch zurück auf den alten Stand. diff --git a/README.md b/README.md index cae2c50..8f4767c 100644 --- a/README.md +++ b/README.md @@ -1,148 +1,89 @@ -# Mission Control 2.0 +# Homelab Orchestrator -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. +Ein Steuerpult fürs Heimnetz, das sich selbst wartet. Zwei Bereiche, eine Oberfläche: -> **100 % lokal.** Kein Cloud-Modell, kein externer Dienst im Datenpfad. +- **Box-Wart** betreut die KI-Box (Bosgame M5, AMD Ryzen AI MAX+ 395, 128 GB gemeinsamer Speicher, llama.cpp über + Vulkan): hält sie aktuell, passt auf sie auf und sucht bessere Modelle. Live seit 23.09.2026. +- **Homelab** soll den Proxmox-PC mit seinen Containern und Arcane (Docker) betreuen: offene Updates zeigen, per + Knopf einspielen, danach die Erreichbarkeit prüfen. In Arbeit ([Fahrplan](docs/wissen/OFFENE-FAEDEN.md)). -## Die drei Bahnen +Dieselbe Codebasis läuft als zwei Instanzen: auf der KI-Box (Rolle `box`) und später als Container auf dem +Proxmox-PC (Rolle `homelab`); beide prüfen sich gegenseitig. Repo, Dienste und Dateien tragen noch den alten Namen +„Mission Control 2" (`mission-control-v2`, `mission-control-2`, `mc2-*`). Alles läuft lokal, kein Cloud-Modell im +Datenpfad. -| Bahn | Was sie tut | Wo | +## Oberfläche + +Im Heimnetz `http://192.168.178.151:9001`, am PC oder am Handy. + +| Seite | Inhalt | +|---|---| +| **Start** | Warnlampen, Instrumente (Speicher, Temperatur, Platte, Laufzeit), Checkliste mit den Hinweisen des Wächters und ihren Knöpfen, Flugplan (was lief, was kommt), Radar-Kasten | +| **Updates** | Bausteine Betriebssystem, Motor (llama.cpp), llama-swap und Hermes; Verlauf der Update-Läufe; Sicherungen | +| **Modelle** | Speicher, Rollen Hirn und Coder, wer die Modelle nutzt, Modell-Radar, Aufräumen, Modelle selbst suchen | +| oben rechts bzw. „Mehr" | Hermes-Dashboard, Dienste und Protokolle, Einstellungen | + +Anleitung für den Alltag: [docs/BEDIENUNG.md](docs/BEDIENUNG.md). + +## Was von allein läuft + +- **Wächter** (jede Minute): Dienste, Timer, Hermes-Jobs, Kern, Platte, festgehaltene Updates und die + Partner-Instanz. Abgestürzte Dienste startet er selbst neu (höchstens 2× je Stunde), Rotes meldet er per Telegram. +- **Updates** sonntags 04:30: llama-swap → Motor → Hermes, danach Prüfung; rot → zurück und festhalten. Die Box + startet nur sonntags zwischen 04:00 und 06:59 neu. +- **Modell-Radar** nachts 00:30–02:30: sucht Kandidaten für Hirn und Coder und testet höchstens einen pro Woche; + übernommen wird nur per Knopf. +- **Sicherung** täglich gegen 03:30, 14 Stück, Kopie auf dem Proxmox-Host. +- **Meldungen** gehen an Telegram und in Lucys Briefkasten; nachts gesammelt, um 07:00 als eine Morgenmeldung, + Dringendes sofort. + +Alle Zeiten: [docs/wissen/STACK.md](docs/wissen/STACK.md), Abschnitt „Automatik". + +## Dienste und Ports (KI-Box) + +| Port | Unit | Aufgabe | |---|---|---| -| **Steuerzentrale** | Modelle, Routing, Wartung, Gedächtnis, Ideen-Queue | MC2 `:9001` | -| **Coding** | Agentic IDE (z.B. OpenCode Desktop) auf Dev-PC via lokaler API + MCP | 100% lokal | -| **Lucy** | Innere Stimme am PC (HUD, kein Avatar) und auf Telegram — eine Stimme, ein Hirn | eigenes Repo `Hitonabi/lucy` | +| `9001` | `mission-control-2` | Oberfläche, `/api`, `/v1` für Lucy und OpenChamber, Hermes-Dashboard unter `/hermes-ui/` | +| `9010` (nur lokal) | `mc2-gateway` | `/v1`-Datenpfad: `model: auto`, Bild-Weiche | +| – | `mc2-steward` | Wächter und Re-Warm | +| `8080` | `llama-swap` (System-Dienst) | Modell-Router, startet je Modell einen `llama-server` | +| `8642` | `hermes-gateway` | Hermes Agent „Lucy", Telegram | +| `9119` | `hermes-builtin-ui` | Hermes-Dashboard | +| `8021` (nur lokal) | `lucy-stimme` | Lucys Stimme | +| `8650` (nur lokal) | `voice-service` | Spracherkennung (schläft seit 24.09.) | +| `7682` (nur lokal) | `box-console` | Web-Konsole (schläft seit 24.09.) | -Lucy holt ihr Hirn direkt über das MC2-Gateway (`:9010/v1`) mit nativer Bildweiche und Voice-Streaming. - -## Ports & Dienste - -| Port | Dienst | Erreichbar | -|---|---|---| -| `9001` | **MC2** (FastAPI + React) — Cockpit, API, Konsole | 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` · -`mem0-service` · `voice-service` · `box-console` · `hermes-builtin-ui` + Timer für Backup, -Auto-Update und Self-Smoke. `llama-swap` läuft als System-Unit. - -## Die Bau-Pipeline - -``` -Idee in MC2 → Gitea-Repo (mit CI-Ampel + VERIFY) → in Agentic IDE bauen → Ampel → main - └── autonomes Vibe Coding via OpenCode Desktop + MCP -``` - -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. Die Agentic IDE - führt sie im Mix-Ansatz vor jedem Push aus, um Code-Fehler ("Quality Gap") abzufangen. - Keine `VERIFY`-Datei = Prüf-Tor aus. - -## Modelle & Rollen - -Gemessen auf der Box (Stand: 27.08.2026, Vulkan b10653): - -| Rolle | Modell | Tempo | Aufgabe | -|---|---|---|---| -| `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) | -| `heavy` | gpt-oss-120b | nur nachts | Chef-Gutachter (4:30 Uhr). **Nie tagsüber** — verdrängt das warme Set | -| `embed` · `reranker` | Qwen3 0.6B | immer warm | Vektorsuche + Feinsortierung | - -> 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`) 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 - -1. **Prüf-Tor** — `VERIFY` nach jeder Etappe; rot → der Agent (OpenCode Desktop) repariert lokal nach. -2. **CI-Ampel** — Lint (ruff) · Import/Syntax (compileall) · Frontend-Build. Läuft in Gitea. - -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/* · ideen/* · lucy/stimme/* · chronik · eigenleben · wissen · -zeitmaschine/* · reminders/* · voice/* · events (SSE)` -OpenAI-kompatibel: `/v1/chat/completions`, `/v1/completions`. MCP-Server: [`mcp/`](mcp/). +Dazu die Timer `mc2-radar`, `mc2-backup`, `mc2-morgenmeldung`, `mc2-autoupdate` und `projekte-sync`. Die Unit-Dateien +liegen in [`deploy/`](deploy/). ## Entwickeln ```bash -# Backend +# Backend lokal auf :9000 (Windows) cd backend -python -m venv .venv && .venv/Scripts/python -m pip install -r requirements.txt # Windows +python -m venv .venv +.venv/Scripts/python -m pip install -r requirements.txt -r requirements-dev.txt .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 (Vite leitet /api an :9000 weiter; MC_API_TARGET=http://192.168.178.151:9001 zeigt auf die Box) +cd frontend && npm ci && npm run dev ``` -`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`. +Vor jedem Push: `bash deploy/pruefen.sh` (Shell- und Python-Syntax, `ruff check .`, Importe, `pytest backend/tests`); +bei Frontend-Änderungen zusätzlich `npm run lint`, `npm test` und `npm run build` in `frontend/`, und das neue +`frontend/dist` mitcommitten, denn die Box baut kein Frontend. Gearbeitet wird auf einem Branch; `main` liegt auf +Gitea (`ssh://gitea@192.168.178.153:2222/Hitonabi/mission-control-v2.git`), danach auf der Box +`bash ~/mission-control-v2/deploy/deploy.sh`. Regeln für Agenten: [AGENTS.md](AGENTS.md). -## Env-Vars (Auswahl) +## Doku -| Variable | Default | Zweck | +| Dokument | Für | Inhalt | |---|---|---| -| `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_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 | - - - -## 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/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 | - -| [`AGENTS.md`](AGENTS.md) | Arbeitsregeln für Agenten in diesem Repo | +| [docs/README.md](docs/README.md) | alle | Index, Lesereihenfolge, Pflegeregeln | +| [docs/BEDIENUNG.md](docs/BEDIENUNG.md) | User | Oberfläche und Telegram-Nachrichten | +| [docs/ARCHITEKTUR.md](docs/ARCHITEKTUR.md) | Agenten, Technik | Prozesse, Rollen, Datenwege, wer was schreibt | +| [docs/BETRIEB.md](docs/BETRIEB.md) | Agenten, Technik | Handgriffe, Meldungen, Wächter, Deploy, Sicherung, Notfall | +| [docs/UPDATES.md](docs/UPDATES.md) | Agenten, Technik | Sonntags-Update, Festhalten, Freigeben | +| [docs/RADAR.md](docs/RADAR.md) | Agenten, Technik | Modell-Radar, Stack-Radar, Prüfstand | +| [docs/WIEDERAUFBAU.md](docs/WIEDERAUFBAU.md) | Technik | die KI-Box von null aufbauen | +| [docs/wissen/](docs/wissen/) | Agenten | Stand, Verdikte, Fallen, Arbeitsweise, offene Fäden | diff --git a/deploy/jobs/README.md b/deploy/jobs/README.md index faa637f..24ea2c5 100644 --- a/deploy/jobs/README.md +++ b/deploy/jobs/README.md @@ -1,199 +1,103 @@ -# Die drei Jobs (KISS-Umbau, 21.08.2026) +# Automatik der Box: Hermes-Jobs und Timer -Vorher: **4 Hermes-Crons + 6 systemd-Timer**, verteilt auf zwei Mechanismen. -Deshalb fiel am 20.08. tagelang niemandem auf, dass ein Waechter fehlte — -niemand schaut an zwei Orten nach. +_Stand 24.09.2026 (erster Stand: KISS-Umbau 21.08.2026)._ -Jetzt: **drei Jobs, ein Ort.** `hermes cron list` zeigt die gesamte Automatik. +Bis zum 20.08. liefen 4 Hermes-Crons und 6 systemd-Timer nebeneinander; dass ein Wächter fehlte, fiel tagelang +niemandem auf, weil niemand an zwei Orten nachsah. Seitdem gibt es wenige, klar getrennte Jobs, und die Startseite +des Box-Warts zeigt Hermes-Jobs und Timer zusammen im **Flugplan**. -| Job | Wann | Art | Skript | -|---|---|---|---| -| **Daily News Report** | taeglich 07:00 | Agent + Websuche | — | -| **KI und Stack Radar** | samstags 08:00 | `--no-agent` | `stack-radar.sh` → `stack-ist.sh` | -| **Updates am Sonntag** | sonntags 04:30 | `--no-agent` | `sonntags-update.sh` → `autoupdate.sh` | +## Was läuft -Daneben laufen als stille Rohrleitung weiter: `mc2-backup` (03:33) und -`projekte-sync` (stuendlich). Die melden sich nie, die sichern und synchronisieren nur. +| Job | Wann | Mechanismus | Skript | Meldet | +|---|---|---|---|---| +| **Daily News Report** | täglich 07:00 | Hermes-Cron, Agent mit Websuche | `news-melden.sh` | Text und Sprachnachricht | +| **KI und Stack Radar** | samstags 08:00 | Hermes-Cron, `--no-agent` | `stack-radar.sh` → `stack-ist.sh`, `stack-upstream.py` | immer, Betreff `[Stack-Radar]` | +| **Updates am Sonntag** | sonntags 04:30 (+≤10 min) | systemd-Timer `mc2-autoupdate.timer` | `sonntags-update.sh` → `deploy/autoupdate.sh` | `[Box-Update]` | +| Modell-Radar | täglich 00:30, Test bis 02:30 | systemd-Timer `mc2-radar.timer` | `backend/radar_lauf.py` | nur „bestanden" (`[Modell-Radar]`) | +| Sicherung | täglich 03:30 (+≤5 min) | systemd-Timer `mc2-backup.timer` | `deploy/backup.sh` | nein; einen Fehlschlag meldet der Wächter | +| Morgenmeldung | täglich 07:00 | systemd-Timer `mc2-morgenmeldung.timer` | `deploy/morgenmeldung.sh` | die Sammelmeldung der Nacht | +| projekte-sync | stündlich | systemd-Timer `projekte-sync.timer` | `deploy/projekte-sync.sh` | nein | +| NerdQuiz-Nachtlauf | ~03:00 | extern: NerdQuiz auf Arcane fragt das Hirn direkt über llama-swap (`:8080`) | – | – | + +- **Updates laufen seit 24.09. wieder per Timer.** Der Hermes-Cron „Updates am Sonntag" ist pausiert: Als Kind des + Hermes-Gateways hing der Updater am eigenen Neustart, wenn er Hermes aktualisierte (20.09.: 180 s, Fehlschlag). +- **Das Modell-Radar endet um 02:30,** weil der NerdQuiz-Nachtlauf um 03:00 das Hirn braucht. Den Nachtlauf erkennt + der Flugplan an den nächtlichen Anfragen (Modell-Nutzung aus dem Journal von llama-swap). +- Übersicht auf der Box: `bash -lc 'hermes cron list'` (Hermes-Jobs), `systemctl --user list-timers` (Timer). ## Der Entwurfsgrundsatz > **Fakten sammelt ein Skript, Prosa schreibt das Modell.** -Der alte Selbsttest war am 20.08. gruen, waehrend vier Dinge kaputt waren: das -Kritiker-Gate zeigte seit einem Tag auf ein umbenanntes Modell (404), Lucys -`SOUL.md` war blockiert, das Dashboard stand ohne Passwort offen, die CI war rot. -Er hatte geprueft, ob Dienste **antworten** — nicht, ob sie **stimmen**. +Der alte Selbsttest war am 20.08. grün, während vier Dinge kaputt waren: Das Kritiker-Gate zeigte seit einem Tag auf +ein umbenanntes Modell (404), Lucys `SOUL.md` war blockiert, das Dashboard stand ohne Passwort offen, die CI war rot. +Er hatte geprüft, ob Dienste **antworten**, nicht, ob sie **stimmen**. -`stack-ist.sh` prueft deshalb Ergebnisse: loesen die Rollen-Aliase noch auf? Ist -der letzte Timer-Lauf gutgegangen? Ist eine Sicherung juenger als zwei Tage? -Liefert die oeffentliche Adresse Daten ohne Anmeldung? Beim ersten Lauf hat es -sofort zwei echte Befunde gefunden. +`stack-ist.sh` prüft deshalb Ergebnisse: Lösen die Rollen-Aliase noch auf? Ist der letzte Timer-Lauf gutgegangen? +Ist eine Sicherung jünger als zwei Tage? `stack-upstream.py` vergleicht Neuigkeiten draußen (Releases, gemergte PRs, +neue Entwurfsmodelle) mit dem letzten Lauf. -## Kugelsicher heisst konkret +## Kugelsicher heißt konkret -- **Das Modell steht nicht im kritischen Pfad.** Antwortet es nicht, gehen die - Rohbefunde trotzdem raus. Nur die Prosa faellt weg, nie die Meldung. -- **Es meldet immer.** „Alles gruen" ist ein Ergebnis, kein Grund zu schweigen. -- **Kein `set -e`.** Ein einzelner fehlschlagender Test darf den Bericht nicht - abschneiden. -- **Ein Melderweg:** `deploy/notify.sh` erreicht Telegram **und** Lucys - Briefkasten (aus dem sie spricht) in einem Aufruf. Die Jobs laufen mit - `--deliver local`, damit Hermes nicht ein zweites Mal sendet. -- **Kein Fuellmaterial.** Die Prompts verbieten ausgedachte Vorschlaege - ausdruecklich — ein Bericht mit Fuellmaterial wird nicht gelesen, und dann - auch der echte Befund nicht. +- **Das Modell steht nicht im kritischen Pfad.** Antwortet es nicht, gehen die Rohbefunde trotzdem raus; nur die + Prosa fällt weg, nie die Meldung. +- **Es meldet immer.** „Alles grün" ist ein Ergebnis, kein Grund zu schweigen. +- **Kein `set -e`.** Ein einzelner fehlschlagender Test darf den Bericht nicht abschneiden. +- **Ein Meldeweg:** `deploy/notify.sh` erreicht Telegram **und** Lucys Briefkasten in einem Aufruf; scheitert + `hermes send`, geht es direkt an die Telegram-Bot-API. Nachts (00:00–06:59) sammelt es bis zur Morgenmeldung um + 07:00, Dringendes geht sofort. Die Hermes-Jobs laufen mit `--deliver local`, damit Hermes nicht ein zweites Mal + sendet. +- **Kein Füllmaterial.** Die Prompts verbieten ausgedachte Vorschläge: Ein Bericht mit Füllmaterial wird nicht + gelesen, und dann auch der echte Befund nicht. +- **Werkzeuge der Cron-Jobs:** `platform_toolsets.cron` = `[web, terminal]`; mehr braucht der Nachrichtenbericht nicht. ## Ausbringen -Die Skripte muessen unter `~/.hermes/scripts/` liegen (Vorgabe von `hermes cron --script`). -Quelle ist dieses Verzeichnis: +Die Skripte müssen unter `~/.hermes/scripts/` liegen (Vorgabe von `hermes cron --script`). Das macht seit 24.09. +`deploy/deploy.sh` (Stufe 2): Es installiert `deploy/jobs/*.sh` und `deploy/jobs/*.py` aus dem Box-Checkout nach +`~/.hermes/scripts/`, ausführbar und mit LF-Zeilenenden. Kopieren per `scp` von Hand entfällt. Alte Skripte in +`~/.hermes/scripts/` räumt der Deploy nicht weg. -```bash -scp deploy/jobs/*.sh hitonabi@192.168.178.151:/home/hitonabi/.hermes/scripts/ -ssh hitonabi@192.168.178.151 'cd ~/.hermes/scripts && sed -i "s/\r$//" *.sh && chmod +x *.sh' -``` +## Daily News: Text und Stimme -‼️ Das `sed` ist Pflicht: vom Windows-PC kopierte Dateien haben CRLF, und bash -scheitert daran mit unverstaendlichen Meldungen. +- **Persona statt Stilvorgaben:** Der Job-Prompt bleibt kurz. Emojis, Ton und die Anrede „Commander" kommen aus + `~/.hermes/SOUL.md`. Wer im Prompt Stil verbietet, überstimmt die Persona (21.08. so passiert). +- **Ablauf:** Der Agent schreibt zwei Dateien, `/tmp/news-text.md` (mit Emojis, Links, Formatierung) und + `/tmp/news-sprich.txt` (3–4 Sätze zum Vorlesen), und ruft einmal `news-melden.sh` auf. Das Skript schickt den Text + über `notify.sh`, räumt den Bericht weg und startet die Stimme abgekoppelt: `lucy-stimme` (`:8021`, pocket-tts + `german_24l`) → WAV → OGG/Opus mit ffmpeg → `hermes send --to telegram "MEDIA:…"` (eine echte Sprachnachricht). +- **Sofort zurück:** Hermes' `terminal`-Werkzeug bricht nach 30 s ab. Das Skript kehrt deshalb sofort zurück und + sperrt denselben Bericht 2 Stunden gegen Doppelversand (22.08.: der Text kam einmal doppelt). +- **Aufräumen:** Hermes' `write_file` überschreibt keine vorhandene Datei. Bliebe der Bericht vom Vortag liegen, + scheiterte der nächste Lauf (23.09.). +- **Nicht `voice-service` (`:8650`) nehmen:** Dort sind nur Cloud-Stimmen geladen, nicht Lucy. +- Fällt die Stimme aus, geht der Text trotzdem raus. -## Abgeschaltet am 21.08. +## Kugelsicher-Regeln für Hermes-Crons + +- `hermes cron edit "text"` speichert nichts; der Prompt muss über `--prompt` kommen. Nach jeder Änderung in + `~/.hermes/cron/jobs.json` nachsehen. +- Alte Job-Fassungen liegen in jeder Sicherung: + `tar -xzf /srv/models/mc2-backups/mc2-state-*.tar.gz ./hermes/cron/jobs.json`. +- Tagesaktualität muss man erzwingen: Datum per `date` feststellen lassen, mehrere Suchen verlangen, Meldungen ohne + belegbares Datum verwerfen. +- Wer einen Werkzeugsatz abschaltet, muss `SOUL.md` mitlesen: Dort standen am 21.08. noch Anweisungen auf + abgeschaltete Werkzeuge. + +## Abgeschaltet am 21.08. (KISS-Umbau) | Weg | Warum | |---|---| -| Cron `morgen-digest` | geht im Daily News Report auf | -| Cron `tech-radar` | geht im Stack Radar auf | -| Cron `nacht-wartung` | pruefte Lebenszeichen, nicht Ergebnisse | -| Cron `wissens-sync` | **war nie gelaufen** — kein `last_run_at` | -| Timer `mc2-bagatell` | **15 Naechte hintereinander „0 eingespielt"** | -| Timer `mc2-selfsmoke` | geht in `stack-ist.sh` auf | -| Timer `pbs-backup` | doppelt zu `mc2-backup` und seit 21.08. rot (`/srv/models/mem0` gibt es nicht mehr) | -| Timer `mc2-autoupdate` | wird jetzt vom Cron „Updates am Sonntag" gestartet | +| Cron `morgen-digest` | ging im Daily News Report auf | +| Cron `tech-radar` | ging im Stack-Radar auf | +| Cron `nacht-wartung` | prüfte Lebenszeichen, nicht Ergebnisse | +| Cron `wissens-sync` | war nie gelaufen (kein `last_run_at`) | +| Timer `mc2-bagatell` | 15 Nächte hintereinander „0 eingespielt" | +| Timer `mc2-selfsmoke` | ging in `stack-ist.sh` auf | +| Timer `pbs-backup` | doppelt zu `mc2-backup` und seit 21.08. rot (sein Quellordner fiel mit dem alten Gedächtnis-Dienst weg) | +| Timer `mc2-autoupdate` | vom 21.08. bis 24.09. startete der Cron „Updates am Sonntag" das Update; seit 24.09. wieder der Timer | -Die Unit-Dateien liegen noch da, nur `disable`d — Rueckbau ist ein Befehl. - ---- - -## Nachtrag 21.08.: Persona, Quellen-Links und Stimme - -**Fehler, den ich gemacht hatte:** Mein erster Prompt fuer den Daily News Report -schrieb woertlich *„keine Emojis, keine Aufzaehlungspunkte, keine -Ueberschriften-Deko"* — und hat damit genau das wegoptimiert, was den Bericht -vorher gut machte. - -★★ **Die Formatierung kam nie aus dem Job-Prompt.** Die alten Prompts waren -kurz (*„eine praegnante 3-Punkte-Zusammenfassung an den Commander"*). Emojis, -Ton und die Anrede stehen in **`~/.hermes/SOUL.md`** — Lucys Persona: - -> Du sprichst den Nutzer IMMER mit **Commander** an. -> Locker, herzlich, schlagfertig, charmant, selbstbewusst. - -**Lehre: den Job-Prompt kurz halten und die Persona arbeiten lassen.** Wer im -Prompt Stil verbietet, ueberstimmt die Persona — und merkt es erst, wenn die -Nachricht seelenlos ankommt. - -### Stimme in Telegram - -`hermes send` kann **`MEDIA:`**. Damit geht eine fertige Audiodatei als -Anhang nach Telegram. `deploy/jobs/news-melden.sh` macht daraus einen Aufruf: - -``` -Agent schreibt zwei Dateien - /tmp/news-text.md (Emojis, Links, Formatierung) -> notify.sh -> Telegram + Briefkasten - /tmp/news-sprich.txt (3-4 Saetze, nichts Vorlesbares fehlt) -> :8650/tts -> WAV -> hermes send MEDIA: -``` - -‼️ **Nicht Hermes' eingebautes TTS nehmen.** Das steht auf `tts.provider: edge` -mit `en-US-AriaNeural` — englisch. Lucys echte Stimme ist MC2s `voice-service` -auf `:8650` (Piper `de_DE-thorsten-medium`). Deshalb ruft das Skript den -Sidecar direkt per curl. - -‼️ **Kein ffmpeg noetig.** Telegram nimmt die WAV direkt an. Fuer eine echte -Sprachnachricht mit Wellenform braeuchte es OGG/Opus und damit ffmpeg — bewusst -nicht installiert, eine Abhaengigkeit weniger. - -Der Agent ruft **einen** Befehl auf, alles danach ist deterministisch. Faellt -die Stimme aus, geht der Text trotzdem raus. - -### ‼️ Folgefehler der Werkzeug-Abschaltung — gefunden und behoben - -Nach dem Abschalten von `kanban` und `delegation` standen in `SOUL.md` noch -zwei Anweisungen, die ins Leere zeigten: *„rufst du sofort dein Werkzeug -delegate_task auf"* und *„Ideen traegst du sofort im Kanban-Auftragsbuch ein"*. -Genau die Klasse stiller Defekt, die am 19.08. das Kritiker-Gate zerlegt hat. -Beide Abschnitte ersetzt (Sicherung: `~/.hermes/SOUL.md.bak-20260821`). - -**Merke: wer einen Werkzeugsatz abschaltet, muss `SOUL.md` mitlesen.** - -### Kugelsicher-Regeln, die dazugekommen sind - -- `hermes cron edit "text"` **speichert nichts** — der Prompt muss ueber - **`--prompt`** kommen. Ohne Flag gibt der Befehl den Text nur aus und die - alte Fassung bleibt stehen. Nach jeder Aenderung in `jobs.json` nachsehen. -- Alte Job-Fassungen liegen im Zustands-Backup: - `tar -xzf /srv/models/mc2-backups/mc2-state-*.tar.gz ./hermes/cron/jobs.json` -- Tagesaktualitaet muss man erzwingen: Datum per `date` feststellen lassen, - mehrere Suchen verlangen, und Meldungen ohne belegbares Datum verwerfen. - ---- - -## Nachtrag 3 (21.08.): Lucys ECHTE Stimme, echte Sprachnachricht - -### Der Fehler: :8650 ist nicht Lucy - -Ich hatte `/tts` auf MC2s `voice-service` (`:8650`) ohne Angabe von Engine und -Stimme aufgerufen. Dessen `/health` sagt: - -``` -"engines":["elevenlabs","edge"] -``` - -Piper und Chatterbox sind dort **gar nicht geladen** — die Vorgabe fiel auf die -erste verfuegbare: ElevenLabs *„Artoria DE · Saber · Hermes-Stimme"*. Das ist -**Hermes' Stimme**, nicht Lucys. Deutsch und weiblich, deshalb faellt es nicht -sofort auf. Beide verfuegbaren Engines sind ausserdem **Cloud** — gegen die -100-%-lokal-Praemisse. - -### Lucys Stimme: `lucy-stimme.service` auf `:8021` - -| | | -|---|---| -| Engine | **Kyutai pocket-tts 2.1.0** (neueste, seit 04.05. unveraendert) | -| Modell | **`german_24l`** — die volle Fassung, nicht die destillierte | -| Stimme | geklont aus `ref.mp3`, gecacht in `lucy_voice.safetensors` (44 MB) | -| Laeuft | `~/.lucy-stimme/`, systemd-**user**-Dienst, `enable`d, CPU | -| Start | ~48 s Ladezeit, danach ~5 s fuer 3,7 s Audio | - -Mitgezogen wurde die **ganze Abstimmung**, nicht nur das Modell: `text_norm.py` -(Symbole/Pfade/URLs → Zahlen → Akronyme), Emotions-Voreinstellungen mit -Anlaufwoertern, Umlaut-Wortliste, Hochpass auf der Referenz, kalibrierter Pegel. -Ohne die klingt pocket nicht wie Lucy. - -‼️ Der Sweep im TTS-Plan (*„seriell schlaegt parallel"*) wurde auf einem **9700X** -gemessen. Die Box ist ein Ryzen AI MAX+ 395 — das Ergebnis ist **nicht -uebertragen**, nur uebernommen. Wer Tempo braucht, misst neu. - -### Recherche 21.08.: pocket bleibt - -Nichts seit Mai schlaegt es auf dieser Achse. Die Alternativen sind 5–17× groesser: -Qwen3-TTS 0,6–1,7 Mrd. (Apache 2.0, Deutsch, 3-Sekunden-Klon), NeuTTS Air 0,5 Mrd. -(GGUF), CosyVoice2 0,5 Mrd. — gegen pockets **100 Mio.** Fuer einen taeglichen -Sprachnachrichten-Job auf CPU ist das der falsche Handel. -**Ihr wart bereits auf dem neuesten Stand** — nichts zu aktualisieren. - -### Echte Sprachnachricht braucht OGG/Opus - -Eine WAV kommt in Telegram als **Dateianhang** an. Fuer das runde Sprachmemo mit -Wellenform braucht es OGG/Opus — dafuer wurde **ffmpeg installiert** (8.0.1): - -```bash -ffmpeg -y -i ton.wav -c:a libopus -b:a 32k -ar 48000 -ac 1 ton.ogg -hermes send --to telegram "MEDIA:ton.ogg" -``` - -Ganze Kette (Text + Stimme + Versand) gemessen: **10 Sekunden**. - -### Altlast am Rande - -`F:\Coding Stuff\lucy\lucy-tts\Lucy-Startklar.bat` zeigt auf -`mission-control-2\client\lucy-tts` — den Ordner gibt es seit der Repo-Trennung -nicht mehr. +Die Unit-Dateien der abgeschalteten Timer liegen auf der Box noch (disabled), im Repo nicht mehr; `mc2-autoupdate` +läuft wieder und liegt im Repo. Die Morgenmeldung um +07:00 (`mc2-morgenmeldung.timer`, seit 24.09.) ersetzt den alten Morgen-Digest nicht inhaltlich: Sie liefert nur die +nachts gesammelten Meldungen aus. diff --git a/docs/BEDIENUNG.md b/docs/BEDIENUNG.md index 5226f06..172f4dd 100644 --- a/docs/BEDIENUNG.md +++ b/docs/BEDIENUNG.md @@ -1,64 +1,116 @@ -# Mission Control 2.0 — Bedienung (kurz & klartext) +# Bedienung — der Box-Wart im Alltag -**Öffnen:** `http://192.168.178.151:9001` (vom Windows-PC im LAN). Dark/Light-Umschalter oben rechts, -**Cmd/Strg+K** springt zu jedem Bereich. +_Stand 24.09.2026. Für dich als Nutzer. Technische Einzelheiten stehen in [BETRIEB.md](BETRIEB.md)._ -> Im Alltag fasst du MC kaum an: `model: auto` + Auto-Swap laden Modelle selbst. Du öffnest es, um ein -> Modell zu installieren/tauschen, die Auslastung zu prüfen, Gedächtnis zu pflegen oder ein Tool zu verbinden. +**Kurz gesagt:** Die KI-Box kümmert sich selbst um sich. Du bekommst Nachrichten auf Telegram. Handeln musst du nur, +wenn eine Nachricht es sagt oder auf der Startseite etwas gelb oder rot leuchtet. -## Die Bereiche (Sidebar, Stand 09.07.2026) -- **Cockpit** — deine Box auf einen Blick (Status, Leistung, Morgenlage, Erinnerungen). -- **Modelle** — Speicherleiste, installierte Modelle + neue finden/laden, Rollen (hermes/fast/heavy/…). -- **Gedächtnis** — geteilte Fakten/Regeln, die ALLE Tools (Hermes, Desktop, PC) via MCP lesen/schreiben. -- **Wissen** — Lucys Wissens-Vault (Traum-Notizen, `[[verlinkt]]` navigierbar). -- **Chronik** — was die Box von allein getan hat + Zeitmaschine (Ein-Klick-Restore). -- **Verbinden** — fertige Anbindungs-Snippets (Hermes Desktop · Kilo Code · Claude Code). -- **Hermes** — Agent-Status & Verdrahtung; „Hermes-GUI öffnen" zeigt die eingebaute Weboberfläche. -- **Konsole** — direkte Box-Shell (SSH-artig) im Browser. -- **Anleitung** — Schritt-für-Schritt-Einrichtung. +Der Homelab Orchestrator bekommt später einen zweiten Bereich für den Proxmox-PC („Homelab"). Heute gibt es nur den +Bereich für die KI-Box, den Box-Wart. -> **Zum Arbeiten mit dem Agenten** (Coding, Projekte, lange Threads) nutzt du die -> **Hermes-Desktop-App am PC** — MC2 ist der Maschinenraum der Box. Wie die App andockt: -> `docs/HERMES_SETUP.md`, Abschnitt „Hermes Desktop (PC) anbinden". +## So kommst du hin -## Modell installieren -**Tab „Modelle & Routing" → „Modelle finden":** -- **Kuratiert:** auf einer Empfehlungs-Karte „Installieren" klicken (⭐ = beste Wahl je Kategorie). -- **Eigenes (HuggingFace):** oben **HF-URL oder `org/repo`** einfügen → „Quants laden" → Quant wählen → - „Installieren". Oder die **Suchleiste** nutzen → Treffer anklicken → Quant → Installieren. -- Der Download läuft als Job mit **Fortschrittsbalken** oben; llama-swap pflegt das Modell automatisch ein. +Im Heimnetz im Browser `http://192.168.178.151:9001` öffnen, am PC oder am Handy. Oben (am Handy unten) stehen die +drei Seiten **Start**, **Updates** und **Modelle**. Rechts oben (am Handy unter **Mehr**) findest du das +Hermes-Dashboard, **Dienste und Protokolle** und die **Einstellungen**. -## LLM tauschen (z.B. anderes „fast"-Hirn) -„Modelle & Routing" → **„Installiert"**: in der Zeile des Modells im **Rollen-Dropdown** -`fast` (bzw. `heavy`/`coder`/`vision`/`scout`) wählen → der Alias wandert auf dieses Modell. -- `model: auto` nutzt ab sofort dieses Modell als schnelles/schweres Hirn — für Hermes **und** Vibe Coding. -- **Kontext** ändern: auf die Kontext-Zahl (✎) klicken. **Entfernen:** 🗑 (GGUF-Datei bleibt erhalten). -- „Auto-Swap" = llama-swap lädt automatisch, was gerade angefragt wird; du musst nichts laden/entladen. +Wichtige Knöpfe fragen vorher nach. Was du auslöst, bestätigt eine kurze Meldung unten rechts. -## Agent/IDE verbinden (Arbeiten am eigenen PC) -„Verbinden" → Eintrag wählen → Snippet/Anleitung kopieren. **Hermes Desktop** (Standard) dockt -remote an die Box an (Gateway-URL über den MC2-Proxy, Token liegt auf der Box — -siehe `docs/HERMES_SETUP.md`). **Kilo Code** und **Claude Code** zeigen auf -`http://192.168.178.151:9001/v1`. Memory-MCP-Snippet separat einfügen → geteiltes Gedächtnis. -(Zed ist abgeschafft — Hermes Desktop hat die IDE-Rolle übernommen, 09.07.2026.) +## Start -## Gedächtnis pflegen -„Gedächtnis": Fakt/Regel hinzufügen (Kategorie wählen), suchen/filtern, **🧹 Aufräumen** entfernt Dubletten. -Das ist die geteilte „Verfassung" für alle Tools. +- **Große Leuchte oben links:** + - grün „Alles in Ordnung": nichts zu tun; + - gelb „Achtung" mit der Zahl der Hinweise: bei Gelegenheit ansehen; + - rot „Störung": jetzt ansehen; + - blau „Update läuft": die Box aktualisiert sich gerade, Hinweise ruhen bis zum Ende; + - grau „Wächter schweigt": der Aufpasser der Box hat sich seit über 5 Minuten nicht gemeldet. + Ein Klick auf die gelbe oder rote Leuchte springt zur Checkliste. +- **Warnlampen:** Motor (die Software, die die KI-Modelle rechnet), Hirn (Lucys Modell), Coder (das Modell zum + Programmieren; „auf Abruf" ist normal), Hermes (Lucys Agent), Jobs, Sicherung (gelb, wenn die letzte älter als + 36 Stunden ist), Platte (gelb ab 80 %, rot ab 90 %), Updates. +- **Instrumente:** Speicher, Temperatur, Platte und die Zeit seit dem letzten Neustart. +- **Checkliste:** alles, was der Wächter gefunden hat. „Jetzt" heißt sofort ansehen, „Prüfen" heißt bei Gelegenheit. + Unter jedem Punkt stehen Knöpfe, zum Beispiel „Neu starten", „Protokoll" (was der Dienst zuletzt geschrieben hat), + „Erneut ausführen", „Freigeben" oder „Ausblenden bis zum nächsten Lauf". Einen abgestürzten Dienst startet die Box + meist schon selbst neu. +- **Flugplan:** was heute schon lief und was als Nächstes kommt, etwa Sicherung, Modell-Radar, Morgenmeldung und die + Updates am Sonntag. +- **Radar-Kasten:** ob das Modell-Radar gerade einen Kandidaten hat; „Ansehen" führt zur Seite Modelle. -## Wartung & Backup -„System" → **Wartung & Updates**: Badge (offene OS-Pakete / Engine / Modell-Upgrades), Buttons -**OS aktualisieren · Engine aktualisieren · Engine neu starten · Reboot**, Modell-Upgrade-Vorschläge -(1-Klick), **Backup jetzt** (Gedächtnis-DB + Configs), Dienste-Health. +## Updates -`Engine neu starten`, Logs & Modell-Upgrades laufen sofort (NOPASSWD vorhanden). **OS-Update + Reboot** -brauchen einmalig erweiterte sudoers — `sudo visudo`, ergänze: -``` -hitonabi ALL=(root) NOPASSWD: /usr/bin/apt-get, /usr/sbin/reboot -``` -(Engine-Update: `MC_ENGINE_UPDATE_CMD` in der mc2-Unit setzen — Befehl, der /opt/llamacpp aktualisiert.) -Danach ist die komplette Wartung klicki-bunti, ohne Passwort. +- Jede Zeile ist ein Baustein: Betriebssystem, Motor (llama.cpp), llama-swap, Hermes. Du siehst, was läuft, was neu + wäre und was sich ändert. +- Jeden Sonntag um 04:30 aktualisiert sich die Box von selbst; vorher sichert sie, danach prüft sie. Du musst nichts + tun. +- „Nach Neuem suchen" schaut sofort nach. „Aktualisieren" spielt einen Baustein sofort ein, „Alles jetzt + aktualisieren" alle nacheinander. Lucy ist dabei ein paar Minuten nicht erreichbar. +- **Festgehalten:** Ging ein Update schief, hat die Box die alte Version zurückgeholt und hält den Baustein fest. Sie + läuft stabil weiter, bekommt für diesen Baustein aber keine Updates mehr. „Freigeben" heißt: am nächsten Sonntag + noch einmal versuchen. +- **Prüfung unklar:** Die Box konnte nicht nachsehen, zum Beispiel ohne Internet. Später „Nach Neuem suchen" drücken. +- **Verlauf:** was die letzten Update-Läufe gebracht haben, je Baustein. +- **Sicherungen:** täglich gegen 03:30, mit Kopie auf einem zweiten Gerät. „Jetzt sichern" macht sofort eine. + „Zurückspielen" setzt die Einstellungen von Hermes und llama-swap auf den Stand dieser Sicherung; vorher sichert die + Box den jetzigen Stand. Lucys Gedächtnis bleibt dabei erhalten. + +## Modelle + +- **Speicher:** wie voll der Arbeitsspeicher ist. Die gelbe Linie bei etwa 115 GB ist die Grenze; darüber wird es eng. +- **Hirn** (für Lucy, NerdQuiz und OpenChamber bei Kleinkram) und **Coder** (für OpenChamber zum Planen und Bauen): + welches Modell die Rolle hat, ob es gerade geladen ist und ob es Bilder versteht. „Jetzt laden" lädt es vorab. Die + „Dritte Rolle" bleibt frei, bis ein Modell dort nachweislich etwas bringt. +- **Wer nutzt die Modelle:** Anfragen der letzten 7 Tage je Absender und je Stunde. +- **Modell-Radar:** Die Box sucht selbst nach besseren Modellen und testet nachts zwischen 00:30 und 02:30 höchstens + eines pro Woche. „Bestanden" heißt: besser als das heutige Modell. Dann entscheidest du: + - „Übernehmen" tauscht das Modell. Beim Hirn ist Lucy etwa eine Minute weg; das alte Modell bleibt auf der Platte. + - „Verwerfen" löscht die Dateien, und das Radar testet dieses Modell nie wieder. + - „Jetzt suchen" sucht sofort (das kann ein paar Minuten dauern). +- **Weitere Einträge:** alle übrigen Modelle. „Modelle selbst suchen" findet Modelle auf Hugging Face und lädt sie. +- **Aufräumen:** Modelle und Ordner, die gerade niemand nutzt, mit Größe und Hinweis. Die Box löscht nie von selbst. + „Löschen" ist endgültig; zurück ginge es nur mit einem neuen Download. + +## Dienste und Protokolle + +Die Liste aller Dienste der Box: grün = läuft, rot = antwortet nicht, grau = schläft (bewusst abgeschaltet). +„Protokoll" zeigt, was der Dienst zuletzt geschrieben hat. „Neu starten" startet ihn neu; „Wecken" weckt einen +schlafenden Dienst bis zum nächsten Neustart der Box. Die Spracherkennung und die Konsole schlafen seit 24.09. mit +Absicht; die Android-App wird sie später wieder brauchen. + +## Einstellungen + +- **Hugging-Face-Zugang:** nötig für gesperrte Modelle und für schnellere Downloads. Eintragen, speichern, bei Bedarf + löschen. +- **Hermes-Dashboard:** öffnet die eigene Oberfläche von Hermes (Chat, Sitzungen, Cron-Jobs). Hermes fragt nach + seiner eigenen Anmeldung. + +## Nachrichten auf Telegram + +Nachts zwischen 0 und 7 Uhr sammelt die Box alles und schickt es um 7 Uhr als eine Nachricht („Guten Morgen, +Commander. Heute Nacht gab es …"). Sofort kommen nachts nur dringende Nachrichten. + +| Nachricht | Bedeutung | Was du tust | +|---|---|---| +| „[Morgenmeldung] Guten Morgen, Commander …" | alles aus der Nacht in einer Nachricht | lesen | +| „[Box-Update] … aktualisiert … alles läuft" | Update eingespielt und geprüft | nichts | +| „[Box-Update] Commander, die Wochenpflege der Box ist durch" | Sonntagsbericht, eine Zeile je Baustein | lesen | +| „[Box-Update] … fehlgeschlagen … zurückgerollt … GEPINNT" | Update ging schief, die alte Version läuft wieder, der Baustein ist festgehalten | nichts nötig; bei Gelegenheit unter Updates „Freigeben" | +| „[Box-Update] KRITISCH: …" (sofort, auch nachts) | Update und Rückweg sind gescheitert | Box ansehen (unten), Hilfe holen | +| „[Box-Update] Neustart steht an … Wartungsfenster" | ein Neustart wartet auf Sonntag früh | nichts | +| „[Box-Update] Die Box startet jetzt neu …" | geplanter Neustart am Sonntag früh | nichts; sie ist ein paar Minuten weg | +| „[Box-Update] Sonntags-Update mit Fehler beendet" oder „Auto-Update abgebrochen" | der Update-Lauf selbst ist abgebrochen, nichts wurde eingespielt | Seite Updates ansehen, Hilfe holen | +| „[Box-Problem] …" | der Wächter hat etwas Rotes gefunden | Startseite öffnen, in der Checkliste den Knopf drücken | +| „[Box wieder ok] Erledigt: …" | das Problem ist weg | nichts | +| „[Modell-Radar] … hat den Nachttest bestanden" | ein besseres Modell wartet | Seite Modelle: „Übernehmen" oder „Verwerfen" | +| „[Stack-Radar] …" (samstags) | Wochenbericht über die Box und Neuigkeiten | lesen | +| Daily News (07:00, Text und Sprachnachricht) | die Nachrichten des Tages von Lucy | lesen oder hören | +| „[Alarm] Deploy …" (sofort) | eine neue Version des Box-Warts ließ sich nicht einspielen, die alte läuft wieder | nichts sofort; Bescheid geben | ## Wenn etwas hakt -- Modell antwortet nicht → „System" → Dienste-Health (Engine online?) + Engine-Logs-Link (llama-swap `/ui`). -- Hermes langsam/komisch → im Hermes-WebUI **neuen Chat** starten (frische Session); Details: `docs/CUTOVER.md`. + +- **Die Seite lädt nicht:** die Box einmal mit dem Knopf am Gerät neu starten, 2–3 Minuten warten, die Seite neu + laden. Hilft das nicht: Hilfe holen (für Techniker: [BETRIEB.md](BETRIEB.md), Abschnitt „Notfall"). +- **Die Leuchte ist rot:** in der Checkliste den ersten Knopf drücken, meist „Neu starten". Nach einer Minute prüft + der Wächter erneut. +- **Lucy antwortet nicht:** die Lampen Hirn und Hermes ansehen; unter „Dienste und Protokolle" Hermes neu starten. +- **Ein Baustein bleibt festgehalten:** unter Updates „Freigeben". diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..7038cf1 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,89 @@ +# Doku — Index, Lesereihenfolge, Pflegeregeln + +_Stand 24.09.2026. Das Projekt heißt „Homelab Orchestrator"; der Bereich für die KI-Box heißt „Box-Wart", der für +den Proxmox-PC „Homelab". Bei Widerspruch gilt: Code vor Doku, [wissen/STACK.md](wissen/STACK.md) vor anderen +Dokumenten, aktuelle Doku vor dem Archiv._ + +## Lesereihenfolge + +**Frischer Agent:** + +1. [../AGENTS.md](../AGENTS.md): verbindliche Bau-Regeln. +2. [wissen/ARBEITSWEISE.md](wissen/ARBEITSWEISE.md): wer der User ist, die Regeln, was wohin gehört. +3. [wissen/STACK.md](wissen/STACK.md): Maschinen, Dienste, Modelle, Automatik. +4. [ARCHITEKTUR.md](ARCHITEKTUR.md): wie die Teile zusammenhängen. +5. [wissen/VERDIKTE.md](wissen/VERDIKTE.md): was entschieden ist. +6. [wissen/FALLEN.md](wissen/FALLEN.md): vor jeder Änderung an der Box. +7. [wissen/OFFENE-FAEDEN.md](wissen/OFFENE-FAEDEN.md): was als Nächstes ansteht. + +**Betrieb und Störungen:** [BETRIEB.md](BETRIEB.md), dann je nach Thema [UPDATES.md](UPDATES.md), +[RADAR.md](RADAR.md), [WIEDERAUFBAU.md](WIEDERAUFBAU.md) und [../deploy/jobs/README.md](../deploy/jobs/README.md). + +**User:** [BEDIENUNG.md](BEDIENUNG.md). + +## Die Dateien + +| Datei | Für | Inhalt | +|---|---|---| +| [BEDIENUNG.md](BEDIENUNG.md) | User | Oberfläche, Telegram-Nachrichten, was tun, wenn etwas hakt | +| [ARCHITEKTUR.md](ARCHITEKTUR.md) | Agenten, Technik | Prozesse, Rollen und Partner-Instanz, Modell-Rollen, wer was schreibt, Meldeweg, Schnittstellen | +| [BETRIEB.md](BETRIEB.md) | Agenten, Technik | Handgriffe, Meldungen, Wächter-Regeln, Deploy und Prüftor, Sicherung, Notfall | +| [UPDATES.md](UPDATES.md) | Agenten, Technik | Sonntags-Kette, Prüfungen, Festhalten und Freigeben, Handbetrieb | +| [RADAR.md](RADAR.md) | Agenten, Technik | Modell-Radar, Prüfstand, Stack-Radar | +| [WIEDERAUFBAU.md](WIEDERAUFBAU.md) | Technik | die KI-Box von null; Anhang A: llama-swap-Unit | +| [wissen/STACK.md](wissen/STACK.md) | Agenten | Stand-Wahrheit: Maschinen, Dienste, Modelle, Automatik | +| [wissen/VERDIKTE.md](wissen/VERDIKTE.md) | Agenten | Entscheidungen mit Datum und Grund; Abschnitt „Überholt" | +| [wissen/FALLEN.md](wissen/FALLEN.md) | Agenten | Fallen mit Datum und Symptom | +| [wissen/ARBEITSWEISE.md](wissen/ARBEITSWEISE.md) | Agenten | User-Profil, Regeln, Flächen | +| [wissen/OFFENE-FAEDEN.md](wissen/OFFENE-FAEDEN.md) | alle | Fahrplan und die eine Liste offener Punkte | +| [../deploy/jobs/README.md](../deploy/jobs/README.md) | Agenten, Technik | Hermes-Jobs und Timer, Daily News | + +## Archiv + +`archiv/` hält historische Dokumente mit Datumspräfix. Sie werden nicht mehr gepflegt; Aussagen und Links darin +können veraltet sein. + +| Datei | Inhalt | +|---|---| +| `2026-06-30-optimierungsplan.md` | Audit und Plan zu Rollen, Warm-Set und Durchsatz (Juni) | +| `2026-06-30-zeroclaw-poc-auftrag.md`, `…-ergebnis.md` | ZeroClaw-Test; Beleg für „Hermes bleibt" | +| `2026-06-30-lucy-tts-plan.md` | Stimmen-Strategie für Lucy (Juni) | +| `2026-07-02-autonomie-plan.md` | „Die Box wartet sich selbst", Etappen E1–E6 | +| `2026-07-02-komplett-review.md` | Review von MC2 und Lucy | +| `2026-07-06-antigravity-review-prompt.md` | Review-Auftrag für Gemini | +| `2026-07-10-gemini-briefing.md` | Notfall-Briefing für Gemini | +| `2026-07-10-zielbild-abloesung.md` | Richtungs-Entscheid vom 10.07. | +| `2026-07-15-umbauplan-abloesung.md` | Abschluss-Review vom 15.07. mit Gateway- und Steward-Auszug | +| `2026-07-19-uebergabe-drei-welten.md` | Übergabe des Umbaus vom 19.07. | +| `2026-07-21-skill-gitea-workflow.md` | Beschreibung des früheren Skills gitea-workflow | +| `2026-08-07-hermes-setup.md` | Hermes-Runbook aus der Anfangszeit | +| `2026-08-20-savepoint.md` | Stand-Seite vom 20.08. | +| `2026-08-20-referenzaufgabe-gedaechtnis-ausbau.md`, `2026-08-20-referenz-check.sh` | Messlatte des Referenzlaufs (Ausbau des alten Gedächtnis-Dienstes) | +| `2026-08-21-hermes-werkzeuge.md` | Werkzeugsätze nach Bedarf; Kern steht in `wissen/FALLEN.md` | +| `2026-08-21-umbau-openchamber.md` | Aufbau der Coding-Bahn mit OpenChamber, Gitea-SSH | +| `2026-09-04-raphael-lucy-innere-stimme.md` | Lucy als innere Stimme (Entscheid 04.09.) | +| `2026-09-04-offene-faeden-alt.md` | Liste offener Punkte bis 04.09., mit den Lucy-Fäden | +| `gitea-host/` | Notizen zum Gitea-Host | +| `hermes-api_server-vision-patch-verwaist.diff` | verwaister Patch am Hermes-`api_server` (Bilder), nur zur Erinnerung | + +Ganz gelöschte Dokumente (STATUS, CUTOVER, UPGRADE, AUDIT_KICKOFF, die Kopien unter `docs/memory/` u. a.) stehen in +der Git-Historie. + +## Pflegeregeln + +1. **Eine Wahrheit je Thema:** Stand → `wissen/STACK.md`; Entscheidungen → `wissen/VERDIKTE.md`; Fallen → + `wissen/FALLEN.md`; offene Punkte → `wissen/OFFENE-FAEDEN.md` (die einzige Liste, keine zweite anlegen); Abläufe → + `ARCHITEKTUR.md`, `BETRIEB.md`, `UPDATES.md`, `RADAR.md`. +2. **Verifizieren vor Behaupten:** Jede Aussage gegen Code oder Messung prüfen. Stand-Angaben tragen ein Datum, am + besten mit Commit. Was nicht geprüft ist, heißt „offen" oder „nicht geprüft". +3. **Doku folgt dem Code im selben Branch:** Wer Units, Skripte, Routen, Meldungstexte oder Abläufe ändert, zieht die + betroffenen Dokumente mit. +4. **Verdikte** ändern sich nur mit neuem, belegtem Anlass (Messung, Release, User-Entscheid); das alte wandert mit + Datum nach „Überholt". +5. **Fallen** mit Datum und Symptom eintragen; Erledigtes streichen. +6. **Historisches** mit eigenem Wissen nach `archiv/` (Präfix `JJJJ-MM-TT-`), sonst löschen; die Git-Historie + behält alles. +7. **Sprache:** Deutsch, knapp, Fakten statt Adjektive. `BEDIENUNG.md` in Alltagssprache ohne Fachjargon. +8. **Keine Geheimnisse** (Tokens, Passwörter, Chat-IDs) in die Doku; Sicherheitshinweise in einem Satz. +9. **Weg der Änderung:** Branch → `bash deploy/pruefen.sh` → Merge. Auf der Box kommt die Doku mit dem nächsten + Deploy an. diff --git a/docs/archiv/2026-08-20-referenzaufgabe-mem0-ausbau.md b/docs/archiv/2026-08-20-referenzaufgabe-gedaechtnis-ausbau.md similarity index 100% rename from docs/archiv/2026-08-20-referenzaufgabe-mem0-ausbau.md rename to docs/archiv/2026-08-20-referenzaufgabe-gedaechtnis-ausbau.md diff --git a/docs/wissen/README.md b/docs/wissen/README.md deleted file mode 100644 index 0e0204a..0000000 --- a/docs/wissen/README.md +++ /dev/null @@ -1,39 +0,0 @@ -# docs/wissen/ — Die Wissens-Heimat für ALLE Agenten - -_Angelegt 10.07.2026 (Übergabe-Session S1). Dieses Verzeichnis ist die kuratierte Übergabe -des Claude-Projektwissens ins Repo — damit Box-Hermes, Hermes Desktop, Gemini/Antigravity -und jeder künftige Agent dieselbe Wahrheit lesen._ - -**Warum hier:** Die Box liest `~/mission-control-v2/docs/wissen/`, Antigravity liest den -`F:\`-Checkout — versioniert, deploybar, kein Agent-privates Gedächtnis. Der Wissens-Vault -(`~/wissens-vault/`) bleibt Lucys LERNSCHICHT (Träume, Radar-Funde, Eigenbau-Landkarte); -hier liegt das kuratierte PROJEKT-Wissen. - -## Die Dateien (Lese-Reihenfolge für einen frischen Agenten) - -| Datei | Inhalt | Wann lesen | -|---|---|---| -| [ZIELBILD.md](ZIELBILD.md) | Richtungs-Entscheid 10.07.: Box übernimmt alles, 4-Session-Paket | Immer zuerst — das ist der Kurs | -| [ARBEITSWEISE.md](ARBEITSWEISE.md) | Wer der User ist + die nicht verhandelbaren Arbeitsregeln | Vor JEDER Arbeit | -| [GRENZEN.md](GRENZEN.md) | Was gehört wohin (MC2=Steuerpult, Lucy=Chat, Hermes-Quelle tabu) | Bevor man ein Feature baut — wohin? | -| [STACK.md](STACK.md) | IPs, Ports, Dienste, Modelle, Backups, Security (live verifiziert) | Vor SSH/Deploy/Config | -| [VERDIKTE.md](VERDIKTE.md) | Finale Technik-Entscheide mit Warum — NICHT neu aufrollen | Bevor man etwas "Besseres" vorschlägt | -| [FALLEN.md](FALLEN.md) | Hart erarbeitete Betriebs-Fallen (Git, Deploy, llama-swap, Hermes, Mem0, PC) | Bevor man in eine davon läuft | -| [RAPHAEL.md](RAPHAEL.md) | Lucy als innere Stimme (04.09.2026): kein Avatar, eine Stimme für PC + Telegram, Annahme-Reihenfolge, SOUL-Vorschlag | Bevor man Lucy anfasst | -| [OFFENE-FAEDEN.md](OFFENE-FAEDEN.md) | Die EINE Liste offener Punkte + Termine | Bei "was ist noch zu tun?" | - -Dazu im Repo-Wurzelverzeichnis bzw. docs/: `AGENTS.md` (verbindliche Projekt-Regeln), -`docs/GEMINI_BRIEFING.md` (Notfall-/Review-Briefing für Gemini), `docs/RUNBOOK.md` -(1-Seiten-Mensch-Anleitung), `docs/ANTIGRAVITY_REVIEW.md` (Review-Prompt). - -## Pflege-Regeln - -1. **Erledigtes raus, Neues rein** — OFFENE-FAEDEN.md ist die einzige offene Liste, - keine neuen "pending"-Dateien anlegen. -2. **Verdikte werden nur mit neuem, belegtem Anlass wieder geöffnet** (Messung, Release, - User-Entscheid) — dann in VERDIKTE.md den alten Eintrag ERSETZEN, nicht löschen. -3. **Verifizieren vor Behaupten:** Stand-Angaben tragen ein Datum; wer STACK.md ändert, - hat live auf der Box gemessen/gelesen, nicht vermutet. -4. Änderungen laufen wie alles über die Pipeline: Branch → Ampel grün → Merge durch den User → deploy.sh. - Reine Doku hier gehört zu den "Bagatellen ohne Klick"-Klassen (siehe ZIELBILD.md), - erscheint aber immer in Morgenlage/Chronik. From 45048c60b736451fad7f02d895118c6f8b8fd901 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 24 Sep 2026 17:43:25 +0200 Subject: [PATCH 5/5] doku: Stand main 75611be nachgezogen (Phase 2a, Waechter-Fixes) - STACK.md: Instanz-Rolle box, Partner noch nicht eingerichtet; 62 /api-Routen; Waechter prueft die Partner-Instanz, sobald es sie gibt. - OFFENE-FAEDEN.md: Phase 2 begonnen (2a auf main: backend/kern/, /api/partner, Partner-Pruefung, Telegram-Zweitweg); die Homelab-Instanz selbst in Phase 3 (User-OK). Punkt "Waechter prueft die schlafende Spracherkennung" gestrichen - auf main behoben (99ba6a7). - VERDIKTE.md: eine Codebasis, zwei Rollen (MC_ROLLE); zweiter Weg zu Telegram direkt ueber die Bot-API. - FALLEN.md: schlafgelegte Dienste auch in den HTTP-Proben ausnehmen (Fehlalarm 24.09. 14:56). - ARBEITSWEISE.md, README.md: Homelab-Instanz ab Phase 3, Partner-Pruefung "sobald eingerichtet". Pruefungen: git grep auf Altbegriffe ausserhalb docs/archiv trifft nur noch die Tabelle "Ueberholt (mit Datum)" in VERDIKTE.md; 0 tote Links in 15 Dateien; keine zerrissenen Tabellen. Co-Authored-By: Claude Opus 5.5 --- README.md | 5 +++-- docs/wissen/ARBEITSWEISE.md | 2 +- docs/wissen/FALLEN.md | 3 +++ docs/wissen/OFFENE-FAEDEN.md | 40 +++++++++++++++++------------------- docs/wissen/STACK.md | 10 ++++++--- docs/wissen/VERDIKTE.md | 5 ++++- 6 files changed, 37 insertions(+), 28 deletions(-) diff --git a/README.md b/README.md index 8f4767c..7d49435 100644 --- a/README.md +++ b/README.md @@ -27,8 +27,9 @@ Anleitung für den Alltag: [docs/BEDIENUNG.md](docs/BEDIENUNG.md). ## Was von allein läuft -- **Wächter** (jede Minute): Dienste, Timer, Hermes-Jobs, Kern, Platte, festgehaltene Updates und die - Partner-Instanz. Abgestürzte Dienste startet er selbst neu (höchstens 2× je Stunde), Rotes meldet er per Telegram. +- **Wächter** (jede Minute): Dienste, Timer, Hermes-Jobs, Kern, Platte, festgehaltene Updates und, sobald + eingerichtet, die Partner-Instanz. Abgestürzte Dienste startet er selbst neu (höchstens 2× je Stunde), Rotes meldet + er per Telegram. - **Updates** sonntags 04:30: llama-swap → Motor → Hermes, danach Prüfung; rot → zurück und festhalten. Die Box startet nur sonntags zwischen 04:00 und 06:59 neu. - **Modell-Radar** nachts 00:30–02:30: sucht Kandidaten für Hirn und Coder und testet höchstens einen pro Woche; diff --git a/docs/wissen/ARBEITSWEISE.md b/docs/wissen/ARBEITSWEISE.md index 5198ca4..f700e1e 100644 --- a/docs/wissen/ARBEITSWEISE.md +++ b/docs/wissen/ARBEITSWEISE.md @@ -44,7 +44,7 @@ Agenten-Fundament darunter (Quelle tabu) · Telegram = mobil melden · OpenChamb | Fläche | Ort | Gehört hierhin | Gehört nicht hierhin | |---|---|---|---| | **Box-Wart** (MC2) | dieses Repo, `:9001` | Updates, Wächter-Hinweise, Modelle, Radar, Aufräumen, Dienste und Protokolle, Sicherungen, Einstellungen | ein Chat- oder Gesprächsfenster | -| **Homelab-Teil** (ab Phase 2) | gleiche Software als Container auf dem Proxmox-PC | Homelab-Geräte, deren Updates per Knopf, Erreichbarkeit | Dinge der KI-Box (die bleiben beim Box-Wart) | +| **Homelab-Teil** (eigene Instanz ab Phase 3) | gleiche Software als Container auf dem Proxmox-PC, Rolle `homelab` | Homelab-Geräte, deren Updates per Knopf, Erreichbarkeit | Dinge der KI-Box (die bleiben beim Box-Wart) | | **Lucy** (Desktop-App) | Repo `F:\Coding Stuff\lucy` (Electron) | Sprache, Gespräch, proaktive Meldungen aus dem Briefkasten | Verwaltungs- und Update-Knöpfe | | **Hermes** (Agent „Lucy" auf der Box) | `~/.hermes/` | Verhalten über `config.yaml`, `SOUL.md`, Skills, Plugins, MCP-Server | Änderungen am Quellcode in `~/.hermes/hermes-agent/` | | **Telegram** | Hermes-Plattform | Meldungen empfangen, mit Lucy schreiben | eigene Oberflächen | diff --git a/docs/wissen/FALLEN.md b/docs/wissen/FALLEN.md index b59d5d0..324f0f4 100644 --- a/docs/wissen/FALLEN.md +++ b/docs/wissen/FALLEN.md @@ -58,6 +58,9 @@ und Symptom; Erledigtes streichen (die Git-Historie behält es)._ - **Die Box ist deutschsprachig (de_DE):** Parser von CLI-Ausgaben brauchen `LC_ALL=C` (apt sagt sonst „aktualisierbar von:"). - **`pkill -f` über SSH trifft die eigene Remote-Shell** → Muster klammern (`'[g]en…'`). +- **Wer einen Dienst schlafen legt, prüft alle Proben, die ihn abfragen (24.09.).** Nach dem Abschalten der + Spracherkennung meldete die Kern-Probe des Wächters um 14:56 „Der Hör-Dienst antwortet nicht" samt Telegram + (Fehlalarm). Die Probe läuft seitdem nur, wenn der Dienst nicht schläft. - **Einmal-Dienste hinter Timern fallen still aus (07.–23.09.):** `projekte-sync` scheiterte 16 Tage lang stündlich an einem leeren Gitea-Repo, niemand merkte es. Seit 23.09. meldet der Wächter gescheiterte Timer-Läufe. diff --git a/docs/wissen/OFFENE-FAEDEN.md b/docs/wissen/OFFENE-FAEDEN.md index 8bfdf32..563c07b 100644 --- a/docs/wissen/OFFENE-FAEDEN.md +++ b/docs/wissen/OFFENE-FAEDEN.md @@ -6,16 +6,18 @@ _Stand 24.09.2026. Neues hier rein, Erledigtes raus (die Git-Historie behält es ## Fahrplan zum Homelab Orchestrator (Plan vom 24.09.2026) -Phase 1 läuft: Box-Diät, Backend, Deploy mit Prüftor und Rückweg und das Sonntags-Update als Timer sind live -(`main` = `4cd856b`). Offen sind die Oberfläche (Branch `wartung/phase1d-frontend`) und die Doku (Branch -`doku/phase1e-neuordnung`). +Phase 1 läuft: Box-Diät, Backend, Deploy mit Prüftor und Rückweg und das Sonntags-Update als Timer sind live. +Offen sind die Oberfläche (Branch `wartung/phase1d-frontend`) und die Doku (Branch `doku/phase1e-neuordnung`). +Phase 2 hat begonnen: Teil 2a (Kern für zwei Instanzen mit Rollen `box`/`homelab`, Partner-Aufsicht, +Telegram-Zweitweg, eine Zeitzone) liegt auf `main` (`75611be`). Die Homelab-Instanz selbst wird erst in Phase 3 +eingerichtet und braucht ein User-OK. | Phase | Inhalt | Abnahme | Stand | |---|---|---|---| | 0 · Sofort | Nachtmeldungen sammeln und um 07:00 schicken, Dringendes sofort; Sicherung mit Lucys Gedächtnis, `SOUL.md`, Skills, Cron-Skripten und Box-Wart-Zustand; Token-Datei aus dem Repo; Git aufgeräumt | Testmeldung nachts landet in der 07:00-Meldung, dringende kommt sofort; Sicherung enthält das Gedächtnis; auf Gitea nur `main` und Archiv-Tags | erledigt 24.09. | | 1 · Box-Wart 1.0 | Ballast raus (tote Routen, Module, Deploy-Dateien, Skills); Konsole, Spracherkennung, PC-Fernsteuerung, Embedding und Reranker schlafen; riskante Stellen behoben; Deploy mit Rückweg und Prüftor; Sonntags-Update als Timer; Oberfläche; Doku neu | alle Prüfläufe grün, keine toten Routen; ein absichtlich kaputter Deploy rollt sich selbst zurück; Sonntags-Update ohne Hermes-Hänger; Doku beschreibt den Box-Wart | läuft (Oberfläche, Doku offen) | -| 2 · Kern und zweite Instanz | zentrales Einstellungs-Objekt, SQLite, Worker mit Job-Engine, Adapter-Schnittstelle mit der Box als erstem Adapter; Oberfläche „Homelab Orchestrator" mit den Bereichen Box-Wart und Homelab; Container auf dem Proxmox-PC (nach User-OK), beide Instanzen prüfen sich gegenseitig | Box-Wart verhält sich wie vorher (Tests); ein Update-Lauf überlebt einen Neustart; stoppt eine Instanz, meldet die andere es auf Telegram | offen | -| 3 · Homelab sehen | Proxmox-API mit Leseschlüssel (nach User-OK); Inventar: Host, 6 Container, Arcane-VM mit Docker; offene Updates je Gerät (Host-Pakete per Proxmox-Webhook, App-Versionen, Arcane-API); Erreichbarkeit je Dienst; Anzeige „Rückweg: Snapshot oder Backup"; neue Container per Etikett | Übersicht zeigt alle 8 Geräte mit Update-Stand; ein gestoppter Dienst erzeugt einen Hinweis | offen | +| 2 · Kern und zweite Instanz | zentrales Einstellungs-Objekt, SQLite, Worker mit Job-Engine, Adapter-Schnittstelle mit der Box als erstem Adapter; Oberfläche „Homelab Orchestrator" mit den Bereichen Box-Wart und Homelab; beide Instanzen prüfen sich gegenseitig | Box-Wart verhält sich wie vorher (Tests); ein Update-Lauf überlebt einen Neustart; stoppt eine Instanz, meldet die andere es auf Telegram | begonnen: 2a auf `main` (`backend/kern/`, `/api/partner`, Partner-Prüfung im Wächter, Telegram-Zweitweg) | +| 3 · Homelab sehen | Homelab-Instanz als Container auf dem Proxmox-PC (nach User-OK); Proxmox-API mit Leseschlüssel (nach User-OK); Inventar: Host, 6 Container, Arcane-VM mit Docker; offene Updates je Gerät (Host-Pakete per Proxmox-Webhook, App-Versionen, Arcane-API); Erreichbarkeit je Dienst; Anzeige „Rückweg: Snapshot oder Backup"; neue Container per Etikett | Übersicht zeigt alle 8 Geräte mit Update-Stand; ein gestoppter Dienst erzeugt einen Hinweis | offen | | 4 · Jetzt updaten | Ausführer auf dem Proxmox-Host (nach User-OK) für Etikett `community-script` oder `watcher`, ohne `watcher-aus`; Knopf je Gerät: Snapshot, Update, Erreichbarkeits-Check, Erfolgsmeldung; rot → zurückrollen und melden; PBS mit Backup statt Snapshot; Host-Updates mit Warnung, Neustart getrennt; Docker über Arcane, zuerst als Probelauf | ein Update mit absichtlich rotem Check rollt sich selbst zurück und meldet es; nach einem Host-Neustart meldet die KI-Box, dass alles wieder läuft | offen | | 5 · Android-App | Push, Cockpit und Übersicht, Updates unterwegs freigeben, Lucy per Sprache mit Live-Modus; weckt Spracherkennung und Stimme | wird zu Beginn der Phase festgelegt | offen, eigenes Projekt | @@ -23,39 +25,35 @@ Hintergrund zur Homelab-Technik: [ARCHITEKTUR.md](../ARCHITEKTUR.md), Abschnitt ## Offene Einzelpunkte (Box-Wart) -1. **Der Wächter prüft die schlafende Spracherkennung weiter.** `pruefe_kern()` in - `backend/services/waechter.py` fragt `voice-service` (`:8650/health`) ohne Schlaf-Ausnahme ab. Solange der Dienst - schläft, ist ein roter Hinweis „Der Hör-Dienst antwortet nicht" samt Telegram-Meldung zu erwarten. Auf der Box - prüfen, dann die Probe an `schlaeft()` koppeln. -2. **Ein Modelltausch schreibt die llama-swap-Config mehrfach.** „Übernehmen" im Radar trägt das Modell unter einer +1. **Ein Modelltausch schreibt die llama-swap-Config mehrfach.** „Übernehmen" im Radar trägt das Modell unter einer Sperre ein; Hirn-Umstellung, Aliase `fast`/`heavy` und ttl folgen als eigene Schreibvorgänge. Jeder lädt llama-swap neu und entlädt alle Modelle. Ziel: ein Schreibvorgang je Tausch. -3. **Jobs überleben noch keinen MC2-Neustart.** Update- und Download-Jobs sind Kindprozesse von MC2; `deploy.sh` +2. **Jobs überleben noch keinen MC2-Neustart.** Update- und Download-Jobs sind Kindprozesse von MC2; `deploy.sh` verschiebt deshalb. Verschwindet der Hermes-Job, wartet `autoupdate.sh` 20 Minuten und geht dann in Selbstreparatur und Rückweg. Lösung in Phase 2 (Worker). -4. **Session-Token des Hermes-Dashboards (nur mit User-Ja).** Das Drop-in +3. **Session-Token des Hermes-Dashboards (nur mit User-Ja).** Das Drop-in `hermes-builtin-ui.service.d/session-token.conf` aus der früheren Desktop-Anbindung ist weiter gesetzt; `backup.sh` und `restore.sh` sichern es samt Kopie `desktop-gateway-token`. Entfernen ist Security-Config. -5. **Rote Wächter-Hinweise warten nachts bis 07:00.** Der Wächter meldet mit Betreff „[Box-Problem]" ohne `-d`; zwischen +4. **Rote Wächter-Hinweise warten nachts bis 07:00.** Der Wächter meldet mit Betreff „[Box-Problem]" ohne `-d`; zwischen 00:00 und 06:59 landet das in der Morgenmeldung. Klären, ob Rot sofort raus soll. -6. **Die gekürzte Morgenmeldung verweist auf „Cockpit unter Meldungen".** Diesen Bereich gibt es nicht. Der volle +5. **Die gekürzte Morgenmeldung verweist auf „Cockpit unter Meldungen".** Diesen Bereich gibt es nicht. Der volle Stapel liegt in `~/.hermes/night-queue.txt.zuletzt-gesendet`, jede Meldung zusätzlich in Lucys Briefkasten. -7. **Code verweist auf verschobene Doku:** `deploy/mc2-backup.service` (`Documentation=` auf `docs/BACKUP.md`), +6. **Code verweist auf verschobene Doku:** `deploy/mc2-backup.service` (`Documentation=` auf `docs/BACKUP.md`), `backend/services/backup.py` (`docs/BACKUP.md`), `backend/services/maintenance.py` (`docs/BEDIENUNG.md`, sudoers-Hinweis), `backend/services/agent.py` (`docs/HERMES_SETUP.md`), `backend/services/llamaswap.py` (`docs/OPTIMIZATION_PLAN.md`). Beim nächsten Code-Commit auf `docs/BETRIEB.md`, `docs/ARCHITEKTUR.md` bzw. das Archiv umstellen. -8. **Oberfläche (Phase 1d):** Updates-Seite mit Urteil und Paketliste, ehrliche Lade- und Fehlerzustände, Rückfragen, +7. **Oberfläche (Phase 1d):** Updates-Seite mit Urteil und Paketliste, ehrliche Lade- und Fehlerzustände, Rückfragen, Aufträge aller Gruppen. Heute erscheinen Downloads nicht unter „Updates", obwohl die Modellsuche das ankündigt. -9. **Units nur auf der Box:** `hermes-builtin-ui.service` samt Drop-ins und die llama-swap-Drop-ins (darunter +8. **Units nur auf der Box:** `hermes-builtin-ui.service` samt Drop-ins und die llama-swap-Drop-ins (darunter `warmset.conf`) liegen nicht im Repo; seit 24.09. stehen sie als Kopie in jeder Sicherung. -10. **Ungepinnte Abhängigkeiten:** `backend/requirements.txt` nur mit `>=`, jeder Deploy zieht die neueste Version. +9. **Ungepinnte Abhängigkeiten:** `backend/requirements.txt` nur mit `>=`, jeder Deploy zieht die neueste Version. Was nachweislich zusammen lief, steht in `known-good/` jeder Sicherung. -11. **Der Wächter hält das Hirn für bereit, sobald irgendein Modell läuft** (`pruefe_kern()`). Ein abgestürztes Hirn +10. **Der Wächter hält das Hirn für bereit, sobald irgendein Modell läuft** (`pruefe_kern()`). Ein abgestürztes Hirn neben einem geladenen Coder bliebe unbemerkt. Klären, ob gewollt. -12. **Radar „Jetzt suchen" läuft synchron** und kann Minuten dauern; `POST /api/models/{id}/load` meldet `ok`, egal +11. **Radar „Jetzt suchen" läuft synchron** und kann Minuten dauern; `POST /api/models/{id}/load` meldet `ok`, egal was die Engine antwortet. -13. **Kleinkram im Code:** `mcp/mcp_mc.py` (MCP aus) ruft die nie vorhandene Route `/api/routing/route`; +12. **Kleinkram im Code:** `mcp/mcp_mc.py` (MCP aus) ruft die nie vorhandene Route `/api/routing/route`; `hermes-postcheck.sh` warnt bei jedem Lauf über den entfernten Patch-Träger; `voice_service/app.py` nennt faster-whisper statt Parakeet; `.aiexclude` gilt nur Antigravity. diff --git a/docs/wissen/STACK.md b/docs/wissen/STACK.md index 2205766..b8c3be4 100644 --- a/docs/wissen/STACK.md +++ b/docs/wissen/STACK.md @@ -1,9 +1,13 @@ # Stack-Wahrheiten — Maschinen, Dienste, Modelle, Automatik -_Stand 24.09.2026. Quellen: Code in `main` (`4cd856b`: Units, `deploy/llama-swap.config.yaml`, Skripte) +_Stand 24.09.2026. Quellen: Code in `main` (`75611be`: 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._ +Instanzen: Auf der KI-Box läuft der Homelab Orchestrator in der Rolle `box` (Standard von `MC_ROLLE`, Anzeigename +„Box-Wart"). Die zweite Instanz (Rolle `homelab`, Container auf dem Proxmox-PC) ist noch nicht eingerichtet; +`MC_PARTNER_URL` ist deshalb nicht gesetzt. + ## Maschinen und Zugänge | Was | Wo | Stand | @@ -27,7 +31,7 @@ gewinnt diese Datei. Wer sie ändert: erst messen, dann schreiben, Datum dazu._ | 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 | +| `mission-control-2` | User | `:9001` | Box-Wart: Oberfläche, 62 `/api`-Routen (davon 2 für die Partner-Instanz), `/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 | @@ -103,7 +107,7 @@ Config: `/etc/llama-swap/config.yaml` ist die lebende Wahrheit (Oberfläche und | Wann | Was | Wie | Details | |---|---|---|---| -| jede Minute | Wächter: Dienste, Timer, Hermes-Jobs, Kern, Platte, festgehaltene Updates | `mc2-steward` | [BETRIEB.md](../BETRIEB.md) | +| jede Minute | Wächter: Dienste, Timer, Hermes-Jobs, Kern, Platte, festgehaltene Updates, Partner-Instanz (sobald eingerichtet) | `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) | diff --git a/docs/wissen/VERDIKTE.md b/docs/wissen/VERDIKTE.md index 1de2955..baa7509 100644 --- a/docs/wissen/VERDIKTE.md +++ b/docs/wissen/VERDIKTE.md @@ -14,7 +14,8 @@ oder einen User-Entscheid (siehe [ARBEITSWEISE.md](ARBEITSWEISE.md)). Abgelöste [OFFENE-FAEDEN.md](OFFENE-FAEDEN.md)). Einen Neubau („MC3") hatte der User schon am 03.07. verworfen. - **Homelab Orchestrator (24.09.):** zwei Instanzen, eine Oberfläche. Der Box-Wart bleibt auf der KI-Box, der Homelab-Teil läuft als Container auf dem Proxmox-PC, beide prüfen sich gegenseitig. „Box-Wart" bleibt der - Name des Bereichs für die KI-Box. + Name des Bereichs für die KI-Box, „Homelab" der für den Proxmox-PC. Beide Instanzen laufen mit derselben + Codebasis, unterschieden durch `MC_ROLLE` (`box` oder `homelab`). - **Homelab-Umfang und Rechte (24.09.):** Proxmox-Host, 6 Container, Arcane mit Docker, KI-Box, nichts weiter. Proxmox nur über eine Lese-API und einen kleinen Ausführer auf dem Host. Dabei ist, was das Etikett `community-script` oder `watcher` trägt; `watcher-aus` nimmt ein Gerät aus. Schlüssel und Ausführer erst nach @@ -45,6 +46,8 @@ oder einen User-Entscheid (siehe [ARBEITSWEISE.md](ARBEITSWEISE.md)). Abgelöste - **Neustart der Box nur im Wartungsfenster So 04:00–06:59 (24.09.).** `MC_AUTOUPDATE_REBOOT_JETZT=1` erzwingt ihn. - **Nachtruhe für Meldungen (24.09.):** `notify.sh` sammelt 00:00–06:59, um 07:00 kommt eine Morgenmeldung. Dringendes geht sofort raus. +- **Zweiter Weg zu Telegram (24.09.):** Scheitert `hermes send`, schickt `notify.sh` direkt an die Telegram-Bot-API. + Hermes kann selbst ausfallen, und die Homelab-Instanz hat kein Hermes. - **Deploy zweistufig mit Prüftor und Rückweg (24.09.):** `deploy/pruefen.sh` ersetzt die CI-Ampel. - **llama-swap-Config (24.09.):** Die lebende Datei `/etc/llama-swap/config.yaml` ist die Wahrheit. Der Repo-Abzug überschreibt sie nur, wenn er sich im selben Deploy geändert hat. Geschrieben wird nur unter der Config-Sperre.