From 45048c60b736451fad7f02d895118c6f8b8fd901 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 24 Sep 2026 17:43:25 +0200 Subject: [PATCH] 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.