Merge doku/phase1e-neuordnung: Doku auf den Stand des Homelab Orchestrators
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
@@ -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).
|
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/`.
|
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.
|
- **Nie direkt auf `main` arbeiten.** Immer Branch (`wartung/...`), Gate grün, dann Merge/Deploy.
|
||||||
|
|
||||||
## Agentic IDE & Vibe Coding
|
## 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.
|
- 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.
|
- **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.
|
Der Deploy auf der Box führt es vor dem Umschalten noch einmal aus; rot = automatisch zurück auf den alten Stand.
|
||||||
|
|
||||||
|
|||||||
@@ -1,148 +1,90 @@
|
|||||||
# Mission Control 2.0
|
# Homelab Orchestrator
|
||||||
|
|
||||||
Steuerzentrale des lokalen KI-Stacks auf dem **Bosgame M5** (AMD Ryzen AI MAX+ 395 „Strix Halo",
|
Ein Steuerpult fürs Heimnetz, das sich selbst wartet. Zwei Bereiche, eine Oberfläche:
|
||||||
122 GB Unified Memory, **keine dedizierte GPU** — llama.cpp über **Vulkan/RADV**). Läuft live als
|
|
||||||
sudo-freier systemd-User-Dienst und ist auf **Autonomie** ausgelegt: Die Box wartet sich selbst,
|
|
||||||
prüft sich selbst und meldet sich, wenn etwas nicht stimmt.
|
|
||||||
|
|
||||||
> **100 % lokal.** Kein Cloud-Modell, kein externer Dienst im Datenpfad.
|
- **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, 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;
|
||||||
|
ü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` |
|
| `9001` | `mission-control-2` | Oberfläche, `/api`, `/v1` für Lucy und OpenChamber, Hermes-Dashboard unter `/hermes-ui/` |
|
||||||
| **Coding** | Agentic IDE (z.B. OpenCode Desktop) auf Dev-PC via lokaler API + MCP | 100% lokal |
|
| `9010` (nur lokal) | `mc2-gateway` | `/v1`-Datenpfad: `model: auto`, Bild-Weiche |
|
||||||
| **Lucy** | Innere Stimme am PC (HUD, kein Avatar) und auf Telegram — eine Stimme, ein Hirn | eigenes Repo `Hitonabi/lucy` |
|
| – | `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.
|
Dazu die Timer `mc2-radar`, `mc2-backup`, `mc2-morgenmeldung`, `mc2-autoupdate` und `projekte-sync`. Die Unit-Dateien
|
||||||
|
liegen in [`deploy/`](deploy/).
|
||||||
## 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/).
|
|
||||||
|
|
||||||
## Entwickeln
|
## Entwickeln
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# Backend
|
# Backend lokal auf :9000 (Windows)
|
||||||
cd backend
|
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
|
.venv/Scripts/python -m uvicorn app:app --port 9000
|
||||||
|
|
||||||
# Frontend (Dev, proxyt /api → :9000)
|
# Frontend (Vite leitet /api an :9000 weiter; MC_API_TARGET=http://192.168.178.151:9001 zeigt auf die Box)
|
||||||
cd frontend && npm install && npm run dev # http://localhost:5173
|
cd frontend && npm ci && npm run dev
|
||||||
|
|
||||||
# Frontend (Build → wird vom Backend ausgeliefert)
|
|
||||||
cd frontend && npm run build # → frontend/dist
|
|
||||||
```
|
```
|
||||||
|
|
||||||
`frontend/dist` **wird mitcommittet** — die Box hat kein Node; Deploy ist ein `git pull` plus
|
Vor jedem Push: `bash deploy/pruefen.sh` (Shell- und Python-Syntax, `ruff check .`, Importe, `pytest backend/tests`);
|
||||||
Dienst-Neustart. Vor jedem Commit lohnt der Ampel-Vorlauf: `ruff check .` und `npm run build`.
|
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`**) |
|
| [docs/README.md](docs/README.md) | alle | Index, Lesereihenfolge, Pflegeregeln |
|
||||||
| `MC_LLAMA_SWAP_URL` | `http://127.0.0.1:8080` | Engine/Router |
|
| [docs/BEDIENUNG.md](docs/BEDIENUNG.md) | User | Oberfläche und Telegram-Nachrichten |
|
||||||
| `MC_CONFIG_PATH` | `/etc/llama-swap/config.yaml` | llama-swap-Config |
|
| [docs/ARCHITEKTUR.md](docs/ARCHITEKTUR.md) | Agenten, Technik | Prozesse, Rollen, Datenwege, wer was schreibt |
|
||||||
| `MC_V1_UPSTREAM` | – | gesetzt → `/v1` geht an `mc2-gateway` (`:9010`) statt in-process |
|
| [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 |
|
||||||
| `MC_ENGINE_PATH` | `/opt/llamacpp-vulkan` | aktive Engine (Vulkan-Build) |
|
| [docs/RADAR.md](docs/RADAR.md) | Agenten, Technik | Modell-Radar, Stack-Radar, Prüfstand |
|
||||||
| `MC_REWARM_ENABLED` | `1` | Warm-Set-Wächter (auf der Box bewusst `0`) |
|
| [docs/WIEDERAUFBAU.md](docs/WIEDERAUFBAU.md) | Technik | die KI-Box von null aufbauen |
|
||||||
| `MC_DRAFTS_DIR` · `MC_SPEC_TYPE` | `$MODELS/drafts` · `draft-simple` | Spekulatives Dekodieren |
|
| [docs/wissen/](docs/wissen/) | Agenten | Stand, Verdikte, Fallen, Arbeitsweise, offene Fäden |
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 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 |
|
|
||||||
|
|||||||
+81
-177
@@ -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.
|
_Stand 24.09.2026 (erster Stand: KISS-Umbau 21.08.2026)._
|
||||||
Deshalb fiel am 20.08. tagelang niemandem auf, dass ein Waechter fehlte —
|
|
||||||
niemand schaut an zwei Orten nach.
|
|
||||||
|
|
||||||
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 |
|
## Was läuft
|
||||||
|---|---|---|---|
|
|
||||||
| **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` |
|
|
||||||
|
|
||||||
Daneben laufen als stille Rohrleitung weiter: `mc2-backup` (03:33) und
|
| Job | Wann | Mechanismus | Skript | Meldet |
|
||||||
`projekte-sync` (stuendlich). Die melden sich nie, die sichern und synchronisieren nur.
|
|---|---|---|---|---|
|
||||||
|
| **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
|
## Der Entwurfsgrundsatz
|
||||||
|
|
||||||
> **Fakten sammelt ein Skript, Prosa schreibt das Modell.**
|
> **Fakten sammelt ein Skript, Prosa schreibt das Modell.**
|
||||||
|
|
||||||
Der alte Selbsttest war am 20.08. gruen, waehrend vier Dinge kaputt waren: das
|
Der alte Selbsttest war am 20.08. grün, während vier Dinge kaputt waren: Das Kritiker-Gate zeigte seit einem Tag auf
|
||||||
Kritiker-Gate zeigte seit einem Tag auf ein umbenanntes Modell (404), Lucys
|
ein umbenanntes Modell (404), Lucys `SOUL.md` war blockiert, das Dashboard stand ohne Passwort offen, die CI war rot.
|
||||||
`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**.
|
||||||
Er hatte geprueft, ob Dienste **antworten** — nicht, ob sie **stimmen**.
|
|
||||||
|
|
||||||
`stack-ist.sh` prueft deshalb Ergebnisse: loesen die Rollen-Aliase noch auf? Ist
|
`stack-ist.sh` prüft deshalb Ergebnisse: Lösen die Rollen-Aliase noch auf? Ist der letzte Timer-Lauf gutgegangen?
|
||||||
der letzte Timer-Lauf gutgegangen? Ist eine Sicherung juenger als zwei Tage?
|
Ist eine Sicherung jünger als zwei Tage? `stack-upstream.py` vergleicht Neuigkeiten draußen (Releases, gemergte PRs,
|
||||||
Liefert die oeffentliche Adresse Daten ohne Anmeldung? Beim ersten Lauf hat es
|
neue Entwurfsmodelle) mit dem letzten Lauf.
|
||||||
sofort zwei echte Befunde gefunden.
|
|
||||||
|
|
||||||
## Kugelsicher heisst konkret
|
## Kugelsicher heißt konkret
|
||||||
|
|
||||||
- **Das Modell steht nicht im kritischen Pfad.** Antwortet es nicht, gehen die
|
- **Das Modell steht nicht im kritischen Pfad.** Antwortet es nicht, gehen die Rohbefunde trotzdem raus; nur die
|
||||||
Rohbefunde trotzdem raus. Nur die Prosa faellt weg, nie die Meldung.
|
Prosa fällt weg, nie die Meldung.
|
||||||
- **Es meldet immer.** „Alles gruen" ist ein Ergebnis, kein Grund zu schweigen.
|
- **Es meldet immer.** „Alles grün" ist ein Ergebnis, kein Grund zu schweigen.
|
||||||
- **Kein `set -e`.** Ein einzelner fehlschlagender Test darf den Bericht nicht
|
- **Kein `set -e`.** Ein einzelner fehlschlagender Test darf den Bericht nicht abschneiden.
|
||||||
abschneiden.
|
- **Ein Meldeweg:** `deploy/notify.sh` erreicht Telegram **und** Lucys Briefkasten in einem Aufruf; scheitert
|
||||||
- **Ein Melderweg:** `deploy/notify.sh` erreicht Telegram **und** Lucys
|
`hermes send`, geht es direkt an die Telegram-Bot-API. Nachts (00:00–06:59) sammelt es bis zur Morgenmeldung um
|
||||||
Briefkasten (aus dem sie spricht) in einem Aufruf. Die Jobs laufen mit
|
07:00, Dringendes geht sofort. Die Hermes-Jobs laufen mit `--deliver local`, damit Hermes nicht ein zweites Mal
|
||||||
`--deliver local`, damit Hermes nicht ein zweites Mal sendet.
|
sendet.
|
||||||
- **Kein Fuellmaterial.** Die Prompts verbieten ausgedachte Vorschlaege
|
- **Kein Füllmaterial.** Die Prompts verbieten ausgedachte Vorschläge: Ein Bericht mit Füllmaterial wird nicht
|
||||||
ausdruecklich — ein Bericht mit Fuellmaterial wird nicht gelesen, und dann
|
gelesen, und dann auch der echte Befund nicht.
|
||||||
auch der echte Befund nicht.
|
- **Werkzeuge der Cron-Jobs:** `platform_toolsets.cron` = `[web, terminal]`; mehr braucht der Nachrichtenbericht nicht.
|
||||||
|
|
||||||
## Ausbringen
|
## Ausbringen
|
||||||
|
|
||||||
Die Skripte muessen unter `~/.hermes/scripts/` liegen (Vorgabe von `hermes cron --script`).
|
Die Skripte müssen unter `~/.hermes/scripts/` liegen (Vorgabe von `hermes cron --script`). Das macht seit 24.09.
|
||||||
Quelle ist dieses Verzeichnis:
|
`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
|
## Daily News: Text und Stimme
|
||||||
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'
|
|
||||||
```
|
|
||||||
|
|
||||||
‼️ Das `sed` ist Pflicht: vom Windows-PC kopierte Dateien haben CRLF, und bash
|
- **Persona statt Stilvorgaben:** Der Job-Prompt bleibt kurz. Emojis, Ton und die Anrede „Commander" kommen aus
|
||||||
scheitert daran mit unverstaendlichen Meldungen.
|
`~/.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 <id> "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 |
|
| Weg | Warum |
|
||||||
|---|---|
|
|---|---|
|
||||||
| Cron `morgen-digest` | geht im Daily News Report auf |
|
| Cron `morgen-digest` | ging im Daily News Report auf |
|
||||||
| Cron `tech-radar` | geht im Stack Radar auf |
|
| Cron `tech-radar` | ging im Stack-Radar auf |
|
||||||
| Cron `nacht-wartung` | pruefte Lebenszeichen, nicht Ergebnisse |
|
| Cron `nacht-wartung` | prüfte Lebenszeichen, nicht Ergebnisse |
|
||||||
| Cron `wissens-sync` | **war nie gelaufen** — kein `last_run_at` |
|
| Cron `wissens-sync` | war nie gelaufen (kein `last_run_at`) |
|
||||||
| Timer `mc2-bagatell` | **15 Naechte hintereinander „0 eingespielt"** |
|
| Timer `mc2-bagatell` | 15 Nächte hintereinander „0 eingespielt" |
|
||||||
| Timer `mc2-selfsmoke` | geht in `stack-ist.sh` auf |
|
| Timer `mc2-selfsmoke` | ging 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 `pbs-backup` | doppelt zu `mc2-backup` und seit 21.08. rot (sein Quellordner fiel mit dem alten Gedächtnis-Dienst weg) |
|
||||||
| Timer `mc2-autoupdate` | wird jetzt vom Cron „Updates am Sonntag" gestartet |
|
| 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.
|
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.
|
||||||
## 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:<pfad>`**. 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 <id> "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.
|
|
||||||
|
|||||||
@@ -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<br/>Oberfläche, /api"]
|
||||||
|
GW["mc2-gateway :9010<br/>/v1, Bild-Weiche"]
|
||||||
|
ST["mc2-steward<br/>Wächter, Re-Warm"]
|
||||||
|
RD["mc2-radar<br/>00:30"]
|
||||||
|
HE["Hermes :8642<br/>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/<pfad>`** reicht an
|
||||||
|
`<partner>/api/<pfad>` 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 „<Name> 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-<Zeit>`; 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/.<app>`. 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).
|
||||||
@@ -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 <assistant.gguf> --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.
|
|
||||||
@@ -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-<zeitstempel>.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="<Box-IP>"`, 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.
|
|
||||||
+104
-52
@@ -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,
|
_Stand 24.09.2026. Für dich als Nutzer. Technische Einzelheiten stehen in [BETRIEB.md](BETRIEB.md)._
|
||||||
**Cmd/Strg+K** springt zu jedem Bereich.
|
|
||||||
|
|
||||||
> Im Alltag fasst du MC kaum an: `model: auto` + Auto-Swap laden Modelle selbst. Du öffnest es, um ein
|
**Kurz gesagt:** Die KI-Box kümmert sich selbst um sich. Du bekommst Nachrichten auf Telegram. Handeln musst du nur,
|
||||||
> Modell zu installieren/tauschen, die Auslastung zu prüfen, Gedächtnis zu pflegen oder ein Tool zu verbinden.
|
wenn eine Nachricht es sagt oder auf der Startseite etwas gelb oder rot leuchtet.
|
||||||
|
|
||||||
## Die Bereiche (Sidebar, Stand 09.07.2026)
|
Der Homelab Orchestrator bekommt später einen zweiten Bereich für den Proxmox-PC („Homelab"). Heute gibt es nur den
|
||||||
- **Cockpit** — deine Box auf einen Blick (Status, Leistung, Morgenlage, Erinnerungen).
|
Bereich für die KI-Box, den Box-Wart.
|
||||||
- **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.
|
|
||||||
|
|
||||||
> **Zum Arbeiten mit dem Agenten** (Coding, Projekte, lange Threads) nutzt du die
|
## So kommst du hin
|
||||||
> **Hermes-Desktop-App am PC** — MC2 ist der Maschinenraum der Box. Wie die App andockt:
|
|
||||||
> `docs/HERMES_SETUP.md`, Abschnitt „Hermes Desktop (PC) anbinden".
|
|
||||||
|
|
||||||
## Modell installieren
|
Im Heimnetz im Browser `http://192.168.178.151:9001` öffnen, am PC oder am Handy. Oben (am Handy unten) stehen die
|
||||||
**Tab „Modelle & Routing" → „Modelle finden":**
|
drei Seiten **Start**, **Updates** und **Modelle**. Rechts oben (am Handy unter **Mehr**) findest du das
|
||||||
- **Kuratiert:** auf einer Empfehlungs-Karte „Installieren" klicken (⭐ = beste Wahl je Kategorie).
|
Hermes-Dashboard, **Dienste und Protokolle** und die **Einstellungen**.
|
||||||
- **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.
|
|
||||||
|
|
||||||
## LLM tauschen (z.B. anderes „fast"-Hirn)
|
Wichtige Knöpfe fragen vorher nach. Was du auslöst, bestätigt eine kurze Meldung unten rechts.
|
||||||
„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.
|
|
||||||
|
|
||||||
## Agent/IDE verbinden (Arbeiten am eigenen PC)
|
## Start
|
||||||
„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.)
|
|
||||||
|
|
||||||
## Gedächtnis pflegen
|
- **Große Leuchte oben links:**
|
||||||
„Gedächtnis": Fakt/Regel hinzufügen (Kategorie wählen), suchen/filtern, **🧹 Aufräumen** entfernt Dubletten.
|
- grün „Alles in Ordnung": nichts zu tun;
|
||||||
Das ist die geteilte „Verfassung" für alle Tools.
|
- 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
|
## Updates
|
||||||
„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.
|
|
||||||
|
|
||||||
`Engine neu starten`, Logs & Modell-Upgrades laufen sofort (NOPASSWD vorhanden). **OS-Update + Reboot**
|
- Jede Zeile ist ein Baustein: Betriebssystem, Motor (llama.cpp), llama-swap, Hermes. Du siehst, was läuft, was neu
|
||||||
brauchen einmalig erweiterte sudoers — `sudo visudo`, ergänze:
|
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
|
||||||
hitonabi ALL=(root) NOPASSWD: /usr/bin/apt-get, /usr/sbin/reboot
|
tun.
|
||||||
```
|
- „Nach Neuem suchen" schaut sofort nach. „Aktualisieren" spielt einen Baustein sofort ein, „Alles jetzt
|
||||||
(Engine-Update: `MC_ENGINE_UPDATE_CMD` in der mc2-Unit setzen — Befehl, der /opt/llamacpp aktualisiert.)
|
aktualisieren" alle nacheinander. Lucy ist dabei ein paar Minuten nicht erreichbar.
|
||||||
Danach ist die komplette Wartung klicki-bunti, ohne Passwort.
|
- **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
|
## 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".
|
||||||
|
|||||||
+234
@@ -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`) | „<Name> 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 <unit>` (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 <unit>`.
|
||||||
|
- Dauerhaft wecken: `systemctl --user enable --now <unit>`; 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-<Zeit>` (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/<name_mit_unterstrich>/`, 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 <commit> 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-<Zeit>.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 <Datei>` als eigene
|
||||||
|
systemd-Unit (`mc2-restore-<Zeit>`), 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 <commit>` 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 |
|
||||||
@@ -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 <assistant.gguf> --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`.
|
|
||||||
@@ -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`).
|
|
||||||
@@ -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/"; }
|
|
||||||
```
|
|
||||||
+104
@@ -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/<id>/`. 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/<id>/`.
|
||||||
|
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/<Repo-Name>`.
|
||||||
|
2. Eintrag in llama-swap mit dem getesteten Draft und den Betriebs-Flags der Rolle, ohne Projektor. Dazu der
|
||||||
|
Bild-Zwilling `<Eintrag>-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).
|
||||||
@@ -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.
|
||||||
@@ -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
|
|
||||||
@@ -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)
|
|
||||||
```
|
|
||||||
+109
@@ -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<br/>So 04:30 (+≤10 min)"] --> S["jobs/sonntags-update.sh"]
|
||||||
|
S --> A["autoupdate.sh"]
|
||||||
|
A --> R["1 · llama-swap<br/>update-swap.sh"]
|
||||||
|
R --> E["2 · Motor<br/>update-engine.sh"]
|
||||||
|
E --> H["3 · Hermes<br/>Job über MC2"]
|
||||||
|
H --> W["Wochenbericht<br/>[Box-Update]"]
|
||||||
|
W --> N{"Neustart nötig?<br/>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`:
|
||||||
|
`{"<baustein>": {"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).
|
||||||
@@ -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.
|
|
||||||
@@ -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 <datei>`. 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 <repo> <datei> --local-dir /srv/models/<Ordner>`.
|
||||||
|
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`.
|
||||||
@@ -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).
|
W1/W2 macht sie sogar robuster (kein OOM mehr).
|
||||||
- Vor jeder Box-Config-Änderung Backup; llama-swap reloadt per `-watch-config`.
|
- Vor jeder Box-Config-Änderung Backup; llama-swap reloadt per `-watch-config`.
|
||||||
- **Keine destruktiven Aktionen ohne Freigabe dieses Plans.**
|
- **Keine destruktiven Aktionen ohne Freigabe dieses Plans.**
|
||||||
</content>
|
|
||||||
@@ -80,4 +80,3 @@ Modell-Pflaster.
|
|||||||
- **Hermes/Lucy bleibt live** — PoC läuft isoliert (eigener Port, eigene Memory-Datei). Null Risiko.
|
- **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`.
|
- Vor Box-Config-Änderungen Backup; llama-swap reloadt per `-watch-config`.
|
||||||
- Erst messen (Prompt-Größe + Latenz), dann über vollen Umzug entscheiden.
|
- Erst messen (Prompt-Größe + Latenz), dann über vollen Umzug entscheiden.
|
||||||
</content>
|
|
||||||
+1
-1
@@ -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`;
|
5. **Gedächtnis-Bereiche** statt zweitem mem0: neue Fakten tragen `bereich: alltag|projekt`;
|
||||||
`GET /memory?bereich=` filtert (Alt-Fakten laufen immer mit). Einmal-Cron
|
`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
|
`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:
|
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
|
`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
|
das stumm!). ~157 GB Müll von der Box (u. a. 103 GB HF-Cache), Hermes Desktop komplett
|
||||||
@@ -0,0 +1,133 @@
|
|||||||
|
# Offene Fäden — DIE eine Liste
|
||||||
|
|
||||||
|
_Stand 12.07.2026 (Session S3 lucy-pipeline). Regel: Neues hier rein, Erledigtes hier raus,
|
||||||
|
keine zweite Liste anlegen. Verdikte werden NICHT als „offen" geführt → [VERDIKTE.md](VERDIKTE.md)._
|
||||||
|
|
||||||
|
> **➡️ 19.07.2026 — DREI-WELTEN-UMBAU KOMPLETT: [UEBERGABE-DREI-WELTEN.md](UEBERGABE-DREI-WELTEN.md)**
|
||||||
|
> ist die finale Übergabe der externen Claude-Sessions (Architektur, neue Mechanik
|
||||||
|
> — No-Progress-Bremse, Betrieb-Playbook, mem0-Bündelung/Bereiche/Konsolidierung —,
|
||||||
|
> neue Verdikte, IDE-Welt Zed+OpenCode, offene Fäden Stand 19.07.). Bei Widerspruch
|
||||||
|
> zu älteren Abschnitten unten gilt die Übergabe.
|
||||||
|
|
||||||
|
## Termine (auch als Box-Reminder hinterlegt)
|
||||||
|
|
||||||
|
- **Mo 13.07., 05:15** — erster echter Release-Radar-Cron-Lauf → Morgenlage/Chronik prüfen.
|
||||||
|
- **täglich 03:45 (ab Registrierung)** — Idle-Radar legt max. 2 belegte Wartungs-Ideen in
|
||||||
|
die Queue; erste Läufe in der Morgenlage prüfen.
|
||||||
|
- **20.–25.07. — ROCm-Recheck** (Anlass: Ryzen-AI-Halo-Launch 06.07., ROCm 7.13 Preview).
|
||||||
|
Fragen: neue Halo-Community-Benches? llama.cpp-Issue #21284 (gfx1151-Prefill) gemerged?
|
||||||
|
kyuz0-Grid aktualisiert (kyuz0.github.io/amd-strix-halo-toolboxes)? Falls ROCm dann
|
||||||
|
Langkontext-Prefill-Bedarf trifft: NUR Hybrid für heavy/coder erwägen —
|
||||||
|
**Hirn bleibt auf Vulkan, kein Voll-Cut.**
|
||||||
|
- **hipEngine-Watch** (shisa-ai/hipEngine, natives HIP gfx1151, nur Qwen3.6, >2× Prefill):
|
||||||
|
reif genug? Dann mit `deploy/bench/brain-bench.sh` gegen Vulkan messen.
|
||||||
|
|
||||||
|
## Das Ablösungs-Paket (Kurs, siehe [ZIELBILD.md](ZIELBILD.md))
|
||||||
|
|
||||||
|
- **S2 „leg los queue" ✅ (10.+12.07.):** Queue = natives Hermes-Kanban, Türen live
|
||||||
|
(Zentrale/Telegram/Lucy), Bagatell-Pfad enabled; voller Kreislauf einmal komplett
|
||||||
|
durchlaufen (`wartung/fix-double-zero-self-repair`). Rest: Live-Telegram-Test beim
|
||||||
|
nächsten echten Zuruf beobachten; Specifier schreibt Titel englisch (ggf. tunen).
|
||||||
|
- **S3 „leg los lucy-pipeline" ✅ (12.07., beide Karten angenommen):** PC-Annahme-Weg live —
|
||||||
|
Auftragsbuch liest ZWEI Repos (mc2 + lucy), Lucy-Annahme = Merge auf der Box +
|
||||||
|
dist-Build/Neustart am PC via PC-Executor (`deploy/lucy-annahme.sh` +
|
||||||
|
`deploy/lucy-annahme.ps1` im Lucy-Repo), Auto-Revert bei Rot. Erster echter Auftrag
|
||||||
|
durch: A4-Turncheck Default AUS (680 Entscheidungen, 79 % der Halte umsonst), dist am PC
|
||||||
|
gebaut. **Erster Live-Lauf fand 2 Runner-Bugs** (Start-Process-Quoting bei Leerzeichen-Pfad,
|
||||||
|
f-String-`\"` auf Python 3.14 → Poll blind; Abschluss manuell nachgezogen, Build war grün) —
|
||||||
|
Fixes + Executor-Fensterblitz-Fix in Karte `wartung/lucy-annahme-fixes` (✅ angenommen).
|
||||||
|
Details FALLEN.md. **Der nächste Lucy-Auftrag ist der ehrliche Voll-Automatik-Test.**
|
||||||
|
- **Annahme-Selbstheilung (12.07. abends, nach cleanse-skill-index-Vorfall):** Auftragsbuch
|
||||||
|
erkennt Orphan-Branches („kein gemeinsamer Ursprung", Annehmen-Knopf weg) und leere
|
||||||
|
Diffs; beide Runner rebasen veraltete Branches automatisch, bevor sie aufgeben;
|
||||||
|
werkstatt-SOUL: voll klonen + merge-base-Selbstcheck + fetch/rebase vor Push, nie
|
||||||
|
~/.hermes-Artefakte committen. Karte `wartung/annahme-selbstheilung`.
|
||||||
|
- **S4 „leg los zuendung" ✅ gebaut (12.07.):** Idle-Radar (`deploy/idle-radar-feed.sh`,
|
||||||
|
Hermes-Cron nächtlich 03:45): Journal-Fehlermuster + Traum-Funde → max. 2 belegte rohe
|
||||||
|
Ideen/Nacht ins native Kanban (Ehrlichkeits-Gate prüft Beleg-Zitate mechanisch,
|
||||||
|
Stau-Bremse bei voller Queue/vollem Auftragsbuch, dreifacher Dedup inkl. archivierter
|
||||||
|
Ideen) · Großbau-Etappen-Regeln in werkstatt-SOUL + wartung-/orchestrator-Skill (jede
|
||||||
|
Etappe für sich lauffähig + annehmbar, NIE auf unangenommene Branches bauen,
|
||||||
|
Folge-Etappen als neue Queue-Aufgaben). **Generalprobe ohne Claude BESTANDEN 12.07.
|
||||||
|
~19:00–19:30:** Radar legte 2 echte Ideen, Specifier zerlegte (deutsch), Werkstatt
|
||||||
|
lieferte Karte `wartung/hermes-gateway-restart` — deren Inhalt war redundant
|
||||||
|
(Restart längst konfiguriert) → daraus entstand noch am selben Tag das
|
||||||
|
**„Lucy kennt sich"-Paket** (User-Auftrag): Selbst-Inventur-Cron 03:35 (Steckbrief
|
||||||
|
auto-generiert + Änderungs-Erkennung), Karten-Gutachter-Cron 04:00 (Empfehlungs-
|
||||||
|
Stempel auf jeder Karte), Ablehnen-mit-Grund (Lern-Gedächtnis
|
||||||
|
`/srv/models/mc2-ablehnungen.jsonl`), Realitäts-Check-Regel (werkstatt-SOUL 7 +
|
||||||
|
wartung-Skill), Release-Radar-Treffer → Queue-Idee. **Offen: erste Scharf-Nächte in
|
||||||
|
der Morgenlage beobachten (03:35 Inventur → 03:45 Idle-Radar → 04:00 Gutachter →
|
||||||
|
04:10 Bagatell → 04:30 Morgenlage → Mo 05:15 Release-Radar).**
|
||||||
|
|
||||||
|
## Lucy
|
||||||
|
|
||||||
|
- **Raphael-Umbau (04.09.2026) — AUSGEROLLT 19:10 (MC2 `f9f2e11` deployt, Lucy `be686c4` gebaut),
|
||||||
|
Details [RAPHAEL.md](RAPHAEL.md) „Ausgerollt". Ursprünglicher Plan:** erst MC2
|
||||||
|
`wartung/lucy-stimme-proxy-raphael` (Proxy `/api/lucy/stimme/*`), dann Lucy
|
||||||
|
`feature/raphael-innere-stimme` (HUD-Client, Stimme von der Box). Danach Hand-Schritte auf der
|
||||||
|
Box: `pocket_server.py` nach `~/.lucy-stimme` syncen (OpenAI-Fassade), Hermes-TTS auf
|
||||||
|
`openai` + `base_url http://127.0.0.1:8021/v1` (Telegram spricht dann mit Lucys Stimme),
|
||||||
|
SOUL.md-Ton auf Raphael (nur mit User-Ja). Ohr-Test Box-Stimme vs. lokal mit `lucy_perf=1`.
|
||||||
|
Alles in [RAPHAEL.md](RAPHAEL.md).
|
||||||
|
- **Auftragsbuch ausgebaut (04.09.2026, Branch `wartung/auftragsbuch-ausbau`):** Router, Service,
|
||||||
|
View, Annahme-Skripte, Bagatell-Annahme, `docs/AUFTRAGSBUCH.md` weg; Cockpit zeigt Ideen statt
|
||||||
|
Karten; STACK/GRENZEN/ARBEITSWEISE/README auf den Branch→Ampel→Merge-Weg. Reste, die bewusst
|
||||||
|
blieben: `deploy/werkstatt-SOUL.md` + `projektstart-SOUL.md` (Werkstatt-Persona, seit Kanban-Aus
|
||||||
|
ohnehin tot — eigener Aufräum-Faden), Chronik-Kategorie „auftragsbuch" (historische Einträge).
|
||||||
|
Auf der Box: `mc2-bagatell.timer` deaktiviert, PC-Executor-URL in `~/.hermes/config.yaml` auf .22.
|
||||||
|
- **Ampel-Runner tot seit 28.08.:** alle Läufe „Waiting to run", kein act_runner auf der Box, Gitea-LXC 104
|
||||||
|
prüfen (`act_runner`-Dienst). Bis dahin gelten lokale Gates.
|
||||||
|
- **Nach dem Ohr-Test:** VERDIKTE.md-Einträge „Electron, nicht Tauri" (Begründung Overlay
|
||||||
|
entfällt) und „STT läuft auf der BOX / Stimme lokal" ersetzen; Lucy-Repo-Altlasten
|
||||||
|
(`mini-stimme/`, Kokoro-Notebooks, `Lucy-Startklar.bat` mit totem Pfad) mit User-Ja räumen.
|
||||||
|
- **Nächster Stimm-Kandidat: Qwen3-TTS über audio.cpp (Vulkan)** — Einstieg liegt bereit: Binaries
|
||||||
|
v0.7.1 unter `~/audiocpp-test/bin` auf der Box (audiocpp_cli/audiocpp_server, Vulkan), Modelle von
|
||||||
|
`huggingface.co/audio-cpp/audio.cpp-gguf` (Qwen3-TTS-12Hz-1.7B-Base q8_0 2,7 GB; CustomVoice/VoiceDesign
|
||||||
|
ebenfalls), CLI: `--task tts --family qwen3_tts --backend vulkan --voice-ref <wav> --reference-text <Transkript>
|
||||||
|
--language de`. Prüfstand: `lucy-tts/referenz/zonos2_bench.py` um einen audio.cpp-Aufrufer erweitern
|
||||||
|
(Server: `POST /v1/audio/speech`). Messlatte = pocket neu: TTFB 1,25 s, RTF 0,97, WER 10 %, 0 Kollaps.
|
||||||
|
- **Eigene Fäden, nicht im Umbau:** pocket-tts 2.1 → 3.1 auf der Box + Lucy-Klon mit dem neuen
|
||||||
|
Trainingscode nachtrainieren (ersetzt Mini-Lucy v2) · Streaming-STT (Nemotron 3.5 ASR
|
||||||
|
Streaming 0.6B oder Voxtral Realtime) als Opt-in im Voice-Sidecar, gegen Parakeet messen.
|
||||||
|
- **Mini-Stimme v2:** Übernacht-Datensatz v2 (DE-Tech + EN) war für 10.07. armiert;
|
||||||
|
User-Schritte: Zip → Drive → `Lucy_Stimme_Training_v2.ipynb` auf Colab T4 → Hörtest.
|
||||||
|
Danach: Lexikon-Injektion in kokoro_server + Modell-Tausch. **pocket bleibt Default,
|
||||||
|
bis v2 den Live-Test gewinnt** (Umschalter „Neue Stimme (Mini-Lucy)" in der Steuerung).
|
||||||
|
- Saber-/XTTS-Altlasten in lucy-tts/ (untracked venvs, Datasets, tote Notebooks) —
|
||||||
|
aufräumen nur mit User-Ja (v2-Pipeline ersetzt sie).
|
||||||
|
- „Lucy light"-Experiment: ungestartet, Idee geparkt.
|
||||||
|
- Frechheit-Regler Phase 3 ist LIVE; weitere Animations-Wünsche nur auf Zuruf.
|
||||||
|
- A4-Turncheck: nach dem Default-AUS (S3) gilt — wer ihn wieder will, setzt
|
||||||
|
`localStorage.lucy_turncheck="1"`; Telemetrie loggt dann nur noch in die Konsole
|
||||||
|
(`lucy_perf="1"`), die Log-Datei `lucy-turncheck.log` wird nicht mehr beschrieben.
|
||||||
|
- Emotions-Stimme = Zukunftsfaden (Klon-DNA ist ruhig; warten auf Qwen-instruct-Clone o. ä.).
|
||||||
|
|
||||||
|
## Box / MC2 (Kleinkram + Politur)
|
||||||
|
|
||||||
|
- D16-Reste: c) System-Logs ausbauen (alle Dienste, Fehler-Filter) · e) Mem0-Dubletten
|
||||||
|
automatisch (an Curator/Selbstkritik hängen) · f) Politur (Cockpit Zone C entflechten,
|
||||||
|
Faden 6 Voice-Sidecar-Diät: Lucy-Reste aus dem Web-UI).
|
||||||
|
- C13 Bare-Metal-Bootstrap/First-Run-Wizard (Konzept: docs/DISASTER_RECOVERY.md) ·
|
||||||
|
C14 sudo-Kleinkram (stale v1-Unit `mission-control.service`, alter :9000-Rest) ·
|
||||||
|
C15 Docs-Refresh (README, STATUS.md, CUTOVER.md, HERMES_SETUP.md).
|
||||||
|
- Tarball-Backup-Schicht nach ~2 Wochen grüner PBS-Verifys in Rente schicken (ab ~23.07.).
|
||||||
|
- Embedding-A/B-Bench (0.6B vs 4B/8B) als ruhiger Bench-Job; Discover.ROLE_METADATA hat
|
||||||
|
für neue Rollen (kritiker/reranker) nur Fallback-Texte.
|
||||||
|
- radar-feed.sh + selbstkritik-feed.sh haben keinen EIGENEN Cron mehr (laufen im
|
||||||
|
Monats-Review-Wrapper) — Aufräum-Kandidat, bewusst liegen gelassen.
|
||||||
|
- Orchestrator-Härtungs-Kandidaten (erst beobachten, ob es wieder passiert):
|
||||||
|
Schreibziel-Pflicht /tmp/orch-<slug>/ vor jedem write_file · große Artefakte nie in die
|
||||||
|
Antwort (Output-Limit-Tod).
|
||||||
|
- Selbstkritik-Cron in die Morgenlage falten (Empfehlung steht, Eingriff braucht Ja).
|
||||||
|
- pve-root-Passwort unverändert (User-Entscheid 09.07., „nur LAN") — bei Gelegenheit ändern.
|
||||||
|
|
||||||
|
## Beobachten (kein Handlungsbedarf)
|
||||||
|
|
||||||
|
- Erste Nächte des neuen Stacks weiter im Blick: Traum 03:15 / Chef-Gutachter 04:30 /
|
||||||
|
Briefing 08:00 / self-smoke 07:15 — Morgenlage lesen.
|
||||||
|
- Telegram-Hänger-Verdacht: NICHT der Prompt (gecacht) — echte Verdächtige sind kalter
|
||||||
|
Cache nach Modell-Reload oder Mem0/Session-Resume beim 1. Turn; braucht echte
|
||||||
|
Telegram-Log-Messung, falls es wieder auffällt.
|
||||||
|
- GLM-4.7-Flash tauchte 08.07. ~17:00 warm auf (irgendwas nutzte den Kritiker aktiv) —
|
||||||
|
unkritisch, nicht weiter verfolgt.
|
||||||
@@ -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`
|
|
||||||
@@ -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
|
|
||||||
}
|
|
||||||
```
|
|
||||||
@@ -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)
|
|
||||||
@@ -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)
|
|
||||||
@@ -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: <Beschreibung>" | \
|
|
||||||
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-<slug> \
|
|
||||||
-b orchestrator/<slug> origin/main
|
|
||||||
mkdir -p ~/.hermes/worktrees/orch-<slug>-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' "<Kontext + genauer Auftrag>" | \
|
|
||||||
WORKER_ROLE=build \
|
|
||||||
~/.hermes/scripts/worker.sh > \
|
|
||||||
~/.hermes/worktrees/orch-<slug>-work/<n>.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-<slug>/` beginnen.
|
|
||||||
|
|
||||||
### 4. Integrieren + Self-Gate
|
|
||||||
|
|
||||||
Die Worker liefern Bausteine — du sorgst dafuer, dass sie zusammenpassen (Imports, Verdrahtung, Namen).
|
|
||||||
|
|
||||||
- **Python:** `python3 -m py_compile <dateien>` (Tests wenn moeglich mitlaufen lassen)
|
|
||||||
- **Shell:** `bash -n <dateien>`
|
|
||||||
- **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-<slug> add -A
|
|
||||||
```
|
|
||||||
|
|
||||||
Dann die Eingabe bauen:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
EINGABE="AUFTRAG (im Wortlaut):
|
|
||||||
<urspruenglicher Auftrag>
|
|
||||||
|
|
||||||
ZERLEGUNG (deine Teil-Tasks, je 1 Zeile):
|
|
||||||
<1..n>
|
|
||||||
|
|
||||||
GIT-DIFF des Worktrees:
|
|
||||||
$(git -C ~/.hermes/worktrees/orch-<slug> 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]" "<text>"
|
|
||||||
```
|
|
||||||
|
|
||||||
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/`._
|
|
||||||
+64
-54
@@ -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
|
_Stand 24.09.2026. Gilt für jeden Agenten, der an diesem System arbeitet (Claude Code, OpenChamber/OpenCode,
|
||||||
(Box-Hermes, Hermes Desktop, Gemini/Antigravity, künftige)._
|
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
|
- **Kein Software-Entwickler.** Er fasst keine Konsole an und macht keine Updates von Hand. Alles muss ohne ihn
|
||||||
Konsole an und drückt keine Update-Knöpfe — alles muss ohne ihn funktionieren oder
|
laufen oder per Knopf, Lucy oder Telegram bedienbar sein.
|
||||||
per Knopf/Lucy/Telegram bedienbar sein.
|
- **GUI-first:** klickbare Oberflächen statt Terminal. Sein Wunsch-Erlebnis: Aufträge verteilen, zusehen, Ergebnisse
|
||||||
- **GUI-first / „klicki bunti":** visuelle, klickbare Oberflächen sind sein Geschmack;
|
abnicken.
|
||||||
Terminal-Lösungen sind Fremdkörper. Sein Referenz-Erlebnis ist der
|
- **Produkt-Instinkt ernst nehmen:** Seine einfachen Fragen treffen oft den Kern. Vorschläge ernsthaft prüfen, nie
|
||||||
Antigravity-Agent-Manager-Stil: Aufträge verteilen, Agenten zuschauen, Diffs abnicken.
|
abtun.
|
||||||
- **Produkt-Instinkt ernst nehmen:** seine „naiven" Fragen treffen oft den Kern
|
- **Sprache:** Deutsch, locker, direkt. Er schreibt oft roh und knapp. Lucy nennt ihn „Commander".
|
||||||
(Marketing-Filter → Fan-out-Kritiker; „alles autonom" → Appliance-Prinzip;
|
- **Nordstern (wörtlich):** „Das komplette System muss AUTONOM funktionieren — in 6 Monaten ohne Claude darf nichts
|
||||||
„Update verpassen?" → Radar). Vorschläge ernsthaft prüfen, nie abtun.
|
brachliegen." Robustheit und Autonomie schlagen Features.
|
||||||
- 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.
|
|
||||||
|
|
||||||
## Die nicht verhandelbaren Regeln
|
## Die Regeln
|
||||||
|
|
||||||
1. **Verifizieren vor Behaupten.** Vor jeder Aussage/Änderung auf der Box messen
|
1. **Verifizieren vor Behaupten.** Vor jeder Aussage oder Änderung an der Box messen (SSH, Logs, `curl`, Messlauf),
|
||||||
(SSH, Logs, curl, bench) statt aus Doku/Memory/Web zu schließen. Der Agenten-Erzählung
|
statt aus Doku, Gedächtnis oder Web zu schließen. Der Erzählung eines Agenten (auch der eigenen) nie glauben:
|
||||||
(auch der eigenen) nie glauben — Transcripts, worker.log, git-Status sind Beweise.
|
Protokolle, Git-Stand und Messwerte sind Beweise.
|
||||||
Mehrere erste Befunde kippten erst bei sauberer Gegenprobe.
|
2. **Scope challengen.** Ein Technik-Vorschlag (auch vom User) ist kein Bauauftrag: erst den Zweck klären, bei einer
|
||||||
2. **Scope challengen.** Ein Tool-/Technik-Vorschlag (auch vom User) ist kein
|
erkennbaren Fehlannahme kurz stoppen und warnen. Lehrbuch-Praxis ist nicht automatisch unser Fall.
|
||||||
Umsetzungsbefehl: erst Use-Case klären, bei erkennbarer Fehlannahme kurz stoppen und
|
3. **Branch, Prüftor, dann Merge.** Nie direkt auf `main` arbeiten. `bash deploy/pruefen.sh` muss grün sein.
|
||||||
warnen. Lehrbuch-Best-Practice ≠ unser Use-Case (Beispiele: LobeChat, Tool Search).
|
Claude darf bei grünen Prüfläufen selbst mergen und deployen (User-Entscheid 23./24.09.). Ein Direkt-Push auf
|
||||||
3. **Propose-only + Mensch-Gate.** Jede Code-Zeile geht als Branch nach Gitea; gemergt wird nur vom User (Ampel grün).
|
`main` ohne Branch braucht ein ausdrückliches Ja.
|
||||||
Merge/Deploy NIE ohne grünes Gate. Bagatell-Klassen ohne Klick sind ausschließlich:
|
4. **Security-Config nie ohne ausdrückliches User-Ja** (approvals, Tokens, ufw, sudoers, command_allowlist).
|
||||||
Doku/Wiki/Vault/Chronik/tote Dateien — nichts mit Code-Logik, immer Morgenlage-Bericht.
|
5. **Endgültig löschen nur per User-Klick** (Modelle, Dateien und Reste auf der Box). Vorschlagen ja, selbst löschen nein.
|
||||||
4. **Security-Config NIE ohne explizites User-Ja** (approvals, Tokens, ufw, sudoers,
|
6. **Hermes-first vor Eigenbau.** Vor jedem Neubau prüfen, ob Hermes es kann (`hermes --help`, Config, Plugins).
|
||||||
command_allowlist). Direkt-Push auf main braucht ebenfalls ein explizites Ja.
|
Hermes-Quellcode wird nie gepatcht oder geforkt.
|
||||||
5. **Fremd-Modell-Kritiker als Korrektiv.** Wer baut, benotet nicht selbst.
|
7. **Alles reversibel:** Branch, Sicherung, Festhalten (Pin-Register). Nichts bauen, was Lucys Sprech-Latenz oder das
|
||||||
Zwei-Kritiker-Gate (Coder-Next + GLM), Urteil nach der Regel
|
warme Hirn gefährdet.
|
||||||
**REPRODUZIERT-ODER-ABGELEHNT** — Freispruch nur mit belegtem Vorher/Nachher.
|
8. **Deutsch für alles, was der User sieht** (Oberfläche, Meldungen, Skills, Zusammenfassungen, Commit-Messages).
|
||||||
6. **Hermes-first vor Eigenbau.** Vor jedem Neubau prüfen, ob Hermes es nativ kann
|
Die erste Zeile einer Meldung sagt am besten, ob er etwas tun muss.
|
||||||
(Eigenbau-Landkarte im Vault → `hermes --help`); Befund in den Vorschlag schreiben.
|
9. **Doku folgt dem Code.** Wer Verhalten ändert, zieht README, `docs/` und `deploy/jobs/README.md` im selben Branch
|
||||||
Hermes-Quellcode wird NIE gepatcht/geforkt.
|
nach (Pflegeregeln: [docs/README.md](../README.md)).
|
||||||
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: …"
|
|
||||||
|
|
||||||
## 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.
|
**Kern in einem Satz:** Box-Wart = Steuerpult (anschauen, klicken) · Lucy = Stimme und Gespräch · Hermes = das
|
||||||
- **Hermes Desktop** = Arbeit: Projekte, Coding, Review, lange Threads (cli-Lane).
|
Agenten-Fundament darunter (Quelle tabu) · Telegram = mobil melden · OpenChamber = Coding am PC.
|
||||||
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).
|
|
||||||
|
|
||||||
**Bevor du ein Feature baust: [GRENZEN.md](GRENZEN.md)** — die volle „was gehört wohin"-Landkarte
|
| Fläche | Ort | Gehört hierhin | Gehört nicht hierhin |
|
||||||
inkl. Code-Ebenen (MC2 vs. Lucy vs. Hermes-Config/Skill/Hook, Quelle tabu) und der roten Linien.
|
|---|---|---|---|
|
||||||
|
| **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** (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 |
|
||||||
|
| **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
|
## Wissens-Orte
|
||||||
|
|
||||||
- `docs/wissen/` (dieses Verzeichnis) = kuratierte Projekt-Wahrheit für alle Agenten.
|
- `docs/` in diesem Repo = kuratierte Projekt-Wahrheit für alle Agenten (Index: [docs/README.md](../README.md)).
|
||||||
- `AGENTS.md` (beide Repos) = verbindliche Bau-Regeln je Repo (lesen Zed/Kilo/Hermes nativ).
|
- `AGENTS.md` (hier und im Lucy-Repo) = verbindliche Bau-Regeln; OpenCode und Claude Code lesen sie selbst.
|
||||||
- `~/wissens-vault/` = Lucys Lernschicht (Träume, Radar, Eigenbau-Landkarte) — git-versioniert,
|
- `~/.hermes/memories/` = Lucys Gedächtnis; Hermes führt es selbst.
|
||||||
im MC2-UI als Wissens-Tab.
|
- Das Claude-Gedächtnis am PC = Arbeitsnotizen der Claude-Sitzungen, nicht verbindlich. Was bleiben soll, gehört hierher.
|
||||||
- Mem0 (`:8765`) = das LIVE-Gedächtnis (auto-lernend, semantisch) — kein Ablageort für Doku.
|
|
||||||
|
|||||||
+119
-127
@@ -1,140 +1,132 @@
|
|||||||
# Betriebs-Fallen — hart erarbeitet, nicht nochmal reintreten
|
# Betriebs-Fallen — hart erarbeitet, nicht nochmal reintreten
|
||||||
|
|
||||||
_Kuratiert 10.07.2026. Jede Falle hat hier mindestens einmal real Zeit gekostet.
|
_Stand 24.09.2026. Jede Falle hat mindestens einmal real Zeit gekostet. Neue Fallen hier eintragen, mit Datum
|
||||||
Neue Fallen: hier eintragen, mit Datum und Symptom._
|
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
|
- **Timer mit `Persistent=true` holen verpasste Läufe beim ersten Einschalten sofort nach (24.09.).**
|
||||||
origin/main`; bash liest aber aus dem alten File-Descriptor weiter → neue Install-Schritte
|
`mc2-autoupdate.timer` war seit August aus; beim `enable --now` lief der Sonntagslauf an einem Donnerstag um 14:51
|
||||||
(z. B. neue `cp`-Zeilen) greifen beim ERSTEN Deploy nach der Änderung NICHT.
|
und startete die Box neu. Seitdem startet `autoupdate.sh` die Box nur So 04:00–06:59 neu, und `deploy.sh` startet
|
||||||
→ deploy.sh ein ZWEITES Mal laufen lassen oder Artefakte von Hand nachinstallieren.
|
den Timer nur, wenn er nicht schon läuft.
|
||||||
Danach IMMER verifizieren, dass die neuen Dateien/Units wirklich da sind.
|
- **Wer den llama-swap-Abzug im Repo ändert, überschreibt beim Deploy die lebende Config komplett (24.09.).**
|
||||||
- **deploy.sh-enable-Zeilen können User-Entscheide zurückdrehen.** Beispiel mc2-autoupdate:
|
Was Oberfläche oder Radar seitdem eingetragen haben, ist dann weg (Sicherung: `/etc/llama-swap/config.yaml.bak-*`,
|
||||||
„einmalig deaktiviert" wurde von jedem Deploy still re-enabled, bis die Zeile raus war.
|
die letzten 5). Vorher `diff /etc/llama-swap/config.yaml deploy/llama-swap.config.yaml` und den lebenden Stand ins
|
||||||
Bei Entscheiden der Form „X bleibt aus" immer deploy.sh gegenprüfen.
|
Repo holen. `MC_DEPLOY_SKIP_SWAP_CONFIG=1` lässt die Config ganz in Ruhe. Bis 24.09. überschrieb jeder Deploy sie
|
||||||
- **Paralleler Git-Zugriff auf den Shared-Checkout:** Mehrere Agenten/Sessions arbeiten
|
bei jeder Abweichung und startete den Motor neu.
|
||||||
zeitweise im selben `F:\`-Verzeichnis — HEAD kann unter einem wandern, uncommittete Edits
|
- **Ein Neustart von MC2 bricht laufende Update- und Download-Jobs ab (24.09.).** Sie leben im MC2-Prozess.
|
||||||
verschwinden. → Änderungen sofort committen; zum Landen auf main einen ISOLIERTEN Worktree
|
`deploy.sh` verschiebt den Deploy deshalb, solange ein Job läuft (`MC_DEPLOY_TROTZDEM=1` erzwingt).
|
||||||
nutzen: `git worktree add --detach <tmp> origin/main` → cherry-pick → rebase →
|
- **`deploy.sh` schaltet alles in `AKTIV` wieder ein.** Wer einen Dienst oder Timer dauerhaft aus haben will, nimmt
|
||||||
`git push origin HEAD:main` → Worktree weg.
|
ihn dort heraus, sonst dreht der nächste Deploy den User-Entscheid zurück (mit `mc2-autoupdate` schon passiert).
|
||||||
- **Gitea-Push:** nur via PowerShell/GCM (Bash-Tool scheitert an der Credential-Auth);
|
Schlafende Units (`box-console`, `voice-service`) stehen nur in `UNITS`.
|
||||||
„Failed to authenticate user" heißt oft nur „3 s warten, Retry" — Auth ist flatterhaft.
|
- **Den Box-Checkout nie von Hand ändern.** Stufe 1 holt `main` nur per fast-forward; geänderte oder eigene Commits im
|
||||||
Wenn der nicht-interaktive Push hart scheitert: User pusht EINMAL interaktiv, danach geht's.
|
Checkout lassen den Deploy scheitern, bevor er etwas umstellt.
|
||||||
- **CRLF:** Box-git hat `core.autocrlf false` + `.gitattributes` erzwingt LF für
|
- **Paralleler Git-Zugriff auf den geteilten Checkout am PC:** Mehrere Agenten arbeiten zeitweise im selben
|
||||||
`*.sh/*.service/*.timer` — sonst `pipefail\r`-Abbrüche. Windows-Pipe auf die Box:
|
`F:\`-Verzeichnis, HEAD kann wandern. Änderungen sofort committen; zum Landen einen isolierten Worktree nutzen
|
||||||
CR-Falle (`sed 's/\r$//'`).
|
(`git worktree add --detach <tmp> origin/main` → cherry-pick → `git push origin HEAD:main` → Worktree weg).
|
||||||
- **Stale `index.lock`** im Box-Repo nach Deploy-Abbruch: Alter prüfen, dann löschen.
|
- **Gitea-SSH: Benutzer `gitea`, nicht `git`, Port 2222 (21.08.).** Mit `git@` kommt nur
|
||||||
- **`hermes` ist über SSH nicht im PATH** → immer `bash -lc 'hermes …'`.
|
`Permission denied (publickey)`, der Grund steht nur im Gitea-Log. Bei vielen Schlüsseln am PC `IdentitiesOnly yes`
|
||||||
- **Werkstatt-Orphan-Branches („refusing to merge unrelated histories"):** macht ein
|
setzen, sonst bricht Gitea vorher ab. Bei Aussetzern: Push mit Retry.
|
||||||
Worker `git init`/Shallow statt voll zu klonen, entsteht ein Branch OHNE gemeinsamen
|
- **Repo-Name aus der Remote-URL, nicht aus dem Ordnernamen (21.08.):** lokal `mission-control-2`, auf Gitea
|
||||||
Vorfahren — Erkennungsmuster auf der Karte: **Diff „0 Dateien" + „hinter main" ≈ ganze
|
`mission-control-v2` (`deploy/push-und-sync.ps1` liest die URL).
|
||||||
Historie** (z. B. 386). Merge ist NIE möglich; oft ist der Inhalt obendrein Müll
|
- **CRLF:** `.gitattributes` erzwingt LF für `*.sh`, `*.service`, `*.timer` und `deploy/**/*.py`, sonst bricht bash an
|
||||||
(~/.hermes-Dateien statt Repo-Dateien). (Historisch: das Auftragsbuch markierte solche Branches; es ist seit 04.09.2026
|
`pipefail\r`. Was per Pipe vom Windows-PC auf die Box geht: `sed 's/\r$//'`.
|
||||||
ausgebaut.) Erkennung heute: `git merge-base main <branch>` leer → Branch verwerfen. Prävention steht in der werkstatt-SOUL (voll klonen + merge-base-Selbstcheck).
|
- **Stale `index.lock`** im Box-Repo nach einem abgebrochenen Deploy: Alter prüfen, dann löschen.
|
||||||
- **Ehrlich-veraltete Branches (echter Merge-Konflikt):** vor dem Merge `git rebase main`
|
- **Veraltete Branches mit echtem Konflikt:** vor dem Merge `git rebase main`; kollidiert auch das, Branch verwerfen
|
||||||
auf dem Branch; kollidiert auch das, Branch verwerfen und die Idee frisch aufsetzen.
|
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
|
- **User-Units über SSH:** erst `export XDG_RUNTIME_DIR=/run/user/$(id -u)`, sonst sieht `systemctl --user` nichts.
|
||||||
`systemctl --user` nichts.
|
- **Ohne `exclusive: false` ist eine llama-swap-Gruppe exklusiv (24.09.).** Jede Anfrage ans Hirn entlud den Coder
|
||||||
- **llama-swap:** Schutz-Key heißt **`persistent:`** — `persist:` wird still ignoriert
|
samt Prompt-Cache; OpenChamber rechnete danach den ganzen Vorlauf neu.
|
||||||
(dieser Tippfehler hat wochenlang den Verdrängungsschutz deaktiviert). `persistent`
|
- **Draft und Bild in einem `llama-server` ergeben HTTP 500 (04.09., bestätigt 24.09.):** „failed to process
|
||||||
schützt NUR gegen Verdrängung, NICHT gegen ttl-Selbstentladen → **jedes brains-Mitglied
|
speculative batch", geprüft mit b11057 und b11157, auch mit `speculative.n_max=0` je Anfrage. Lösung:
|
||||||
braucht ttl:0.** Nach jedem Config-Reload (auch scp!) ist das Warm-Set LEER → Mini-Requests
|
Bild-Zwillinge ohne Draft.
|
||||||
an hermes/embed(/reranker) schicken.
|
- **llama-swap versteht nur `persistent:`**, `persist:` ignoriert es still (MC2 liest `persist`, deshalb stehen beide
|
||||||
- **`warmup.sh` liegt als Root-Kopie** unter `/usr/local/bin/llama-swap-warmup.sh` und wird
|
in der Config). `persistent` schützt nur vor Verdrängung, nicht vor dem ttl-Entladen: Warm-Mitglieder brauchen
|
||||||
vom sudo-freien deploy.sh NICHT aktualisiert → nach Änderung manuell `sudo install`.
|
`ttl: 0`. Nach jedem Config-Reload ist alles entladen; der Steward wärmt das Hirn nach.
|
||||||
- **llama-swap NIE neustarten**, wenn es nicht sein muss (Warm-Set weg = Lucy-Latenz).
|
- **`warmup.sh` liegt als Root-Kopie** unter `/usr/local/bin/llama-swap-warmup.sh`; `deploy.sh` aktualisiert sie nicht.
|
||||||
- **Nie zwei ~70-GB-Benches direkt nacheinander** (OOM-Kill beim zweiten).
|
Nach einer Änderung: `sudo install -m 0755 deploy/warmup.sh /usr/local/bin/llama-swap-warmup.sh`.
|
||||||
- **Box ist deutschsprachig (de_DE):** jeder CLI-Output-Parser braucht `LC_ALL=C`
|
- **llama-swap nie ohne Not neu starten:** Alle Modelle sind danach entladen, Lucy antwortet langsam.
|
||||||
(apt sagt sonst „aktualisierbar von:" statt „upgradable from:").
|
- **Nie zwei ~70-GB-Messungen direkt nacheinander** (OOM-Kill beim zweiten).
|
||||||
- **`pkill -f` über SSH matcht die eigene Remote-Shell** → Muster als `'[g]en…'` klammern.
|
- **llama.cpp streicht Flags ohne Vorwarnung (17.09.):** `--no-mmap` gibt es seit b10936 nicht mehr; jedes Modell
|
||||||
- **Deploy restartet voice-service** → Übernacht-Jobs mit STT-QA-Gate brauchen
|
stirbt 2 s nach dem Start, llama-swap meldet nur „upstream command exited prematurely". Ersatz: `--load-mode none`.
|
||||||
Wiederanlauf-Logik (Backoff-Retry im hear()-Pfad).
|
Vor einem Engine-Sprung jede Config-Kommandozeile mit dem neuen `llama-server` parsen lassen (Port 5899,
|
||||||
- **llama.cpp streicht Flags ohne Vorwarnung:** `--no-mmap` gibt es seit b10936 nicht mehr
|
`timeout 6`, `${PORT}` ersetzen).
|
||||||
(`error: invalid argument`) → JEDES Modell stirbt 2 s nach dem Start, llama-swap meldet nur
|
- **Die Box ist deutschsprachig (de_DE):** Parser von CLI-Ausgaben brauchen `LC_ALL=C` (apt sagt sonst
|
||||||
„upstream command exited prematurely", der Stack-Check nur „rot". Ersatz: `--load-mode none`
|
„aktualisierbar von:").
|
||||||
(gleiche Leistung, gemessen 17.09.2026: Coder 32 t/s, Hirn 85 t/s). Vor einem Engine-Sprung
|
- **`pkill -f` über SSH trifft die eigene Remote-Shell** → Muster klammern (`'[g]en…'`).
|
||||||
jede Config-Kommandozeile mit dem neuen `llama-server` parsen lassen (Port 5899, `timeout 6`,
|
- **Wer einen Dienst schlafen legt, prüft alle Proben, die ihn abfragen (24.09.).** Nach dem Abschalten der
|
||||||
`${PORT}` ersetzen) — Argumentfehler kommen sofort, vor dem Laden.
|
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.
|
||||||
|
|
||||||
## Hermes
|
## Hermes
|
||||||
|
|
||||||
- **Toolsets haben ZWEI Ebenen:** aktiv = NICHT in `agent.disabled_toolsets` UND in
|
- **Ein Updater darf nicht als Kind von Hermes laufen (20.09.).** Der Hermes-Cron „Updates am Sonntag" startete beim
|
||||||
`platform_toolsets.<platform>`. api_server (Voice) hat eine bewusste Diät-Allowlist;
|
Hermes-Update das eigene Gateway neu: 180 s Drain, dann Exit FAILURE. Seit 24.09. läuft das Update als eigener Timer.
|
||||||
MCP-Server sind namentlich allowlistbar (Key `mcp_servers`, snake_case).
|
- **`hermes update` meldet Exit 1 trotz Erfolg (06. und 17.09.):** Nach dem eigenen Gateway-Neustart wartet es auf
|
||||||
`hermes prompt-size` ist Allowlist-BLIND — echte Kontrolle nur per Live-Call.
|
Zeilen des „Fleet version check", unter systemd kommen keine. Die Update-Kette brach ab, `autoupdate.sh` rollte
|
||||||
- **`MINIMUM_CONTEXT_LENGTH = 64000`:** Modelle mit kleinerem Kontext (heavy 32k, vision 32k)
|
zurück und hielt Hermes fest, obwohl der Gehirn-Check grün war. Deshalb `--no-gateway-restart`: Neustart und Urteil
|
||||||
sind als delegate_task-Ziel tot — der Fehler kann STILL ausfallen. Fremd-Kritik deshalb via
|
gehören dem Job.
|
||||||
fremdblick.sh (Ein-Schuss), nie via Delegation.
|
- **Festgehalten heißt still eingefroren (06.–17.09.):** Motor und Hermes bekamen elf Tage keine Updates. Seit 23.09.
|
||||||
- **delegate_task läuft top-level IMMER background** → in `hermes -z`/Cron-Ein-Schuss stirbt
|
zeigt der Wächter jeden festgehaltenen Baustein als Hinweis mit Knopf „Freigeben".
|
||||||
das Kind mit dem Prozess. Nur langlebige Sessions (Chat/Desktop/Telegram) profitieren.
|
- **Werkzeugsätze haben zwei Ebenen:** aktiv ist, was nicht in `agent.disabled_toolsets` steht UND in
|
||||||
- **Cron-Fallen:** kein TZ-Feld (next_run_at = System-TZ zum Anlege-Zeitpunkt; nach
|
`platform_toolsets.<platform>`. Cron-Jobs hatten bis 21.08. die volle Werkzeugkiste, weil
|
||||||
TZ-Wechsel `cron edit --schedule "<gleich>"` zum Neuberechnen) · Prompt/Positionsargumente
|
`platform_toolsets.cron` fehlte (heute `[web, terminal]`). `hermes prompt-size` ist für die Allowlist blind; echte
|
||||||
MÜSSEN vor die Flags · `--script` allein reicht nicht (braucht Prompt oder Skill) ·
|
Kontrolle nur per Live-Aufruf.
|
||||||
Cron-Kontext hat `HERMES_CRON_SESSION=1` (`approvals.cron_mode` ist seit dem KISS-Umbau `auto`, nicht mehr `deny`).
|
- **Wer einen Werkzeugsatz abschaltet, muss `SOUL.md` mitlesen (21.08.):** Dort standen noch Anweisungen, die auf
|
||||||
- **Feed-Skripte: Pipe + Heredoc gleichzeitig = Heredoc gewinnt stdin** → JSON via Temp-Datei
|
abgeschaltete Werkzeuge zeigten.
|
||||||
übergeben. Außerdem ehrlichen Blind-Pfad einbauen (API kaputt → „AUSGEFALLEN", nicht „0 Funde").
|
- **Cron-Fallen:** kein TZ-Feld (`next_run_at` = System-TZ beim Anlegen; nach einem TZ-Wechsel
|
||||||
- **Hooks:** Consent persistiert NUR über CLI-/Gateway-Start mit `HERMES_ACCEPT_HOOKS=1`;
|
`hermes cron edit --schedule "<gleich>"`); Prompt und Positionsargumente vor die Flags; `--script` allein reicht nicht
|
||||||
`hermes hooks test` schreibt die Allowlist NICHT; Skript-Änderung invalidiert Consent (mtime).
|
(braucht Prompt oder Skill); Cron-Kontext hat `HERMES_CRON_SESSION=1`. `hermes cron edit <id> "text"` speichert
|
||||||
- **GLM-Modelle sind Reasoning-Modelle:** content kommt NACH reasoning_content →
|
nichts, der Prompt muss über `--prompt` kommen (21.08.).
|
||||||
max_tokens großzügig (fremdblick: FREMDBLICK_MAXTOK bis 4500), sonst leeres Urteil.
|
- **`hermes` ist über SSH nicht im PATH** → `bash -lc 'hermes …'`.
|
||||||
- **Manager-Konfabulation:** Das Hirn überspringt Delegation gern „aus Bequemlichkeit" mit
|
- **Hermes' `terminal`-Werkzeug bricht nach 30 s ab (22.08.):** Der Agent hielt den Aufruf für gescheitert und rief
|
||||||
erfundener Begründung („worker.sh existiert nicht"). Gegenmittel: worker.log als harter
|
`news-melden.sh` ein zweites Mal auf, der Bericht kam doppelt. Das Skript kehrt deshalb sofort zurück und sperrt
|
||||||
Nachweis + Skill-Regel „du baust NICHT selbst" + Transcript prüfen, nie der Erzählung glauben.
|
Doppelversand.
|
||||||
- **Kritiker == Worker = blinder Fleck** („benotet eigene Hausaufgaben") → Zwei-Kritiker-Gate,
|
- **Hermes' `write_file` überschreibt keine vorhandene Datei (23.09.):** Lag der Bericht vom Vortag noch in `/tmp`,
|
||||||
Urteil REPRODUZIERT-ODER-ABGELEHNT.
|
scheiterte jeder Morgenlauf erst an „Refusing to overwrite". `news-melden.sh` räumt den Bericht jetzt weg.
|
||||||
- **stage-vor-Diff:** untracked Dateien → `git diff origin/main` leer → Kritiker prüfen NICHTS.
|
- **`web_extract` wertet kurze Seiten als Fehler (24.09.):** Hermes hängt an jedes Ergebnis ein leeres `"error"`-Feld
|
||||||
Erst `git add -A`, dann `git diff --cached`, „Diff leer → STOPP".
|
und prüft nur die ersten 500 Zeichen. Der Wächter zählt mehrzeilige `"results"`-Treffer deshalb nicht als
|
||||||
- **Werkstatt-Gate:** `git -C ~/mission-control-v2 status --porcelain -uno` MUSS leer sein
|
Werkzeugfehler.
|
||||||
(curl /api/health allein ist ein Loch — alter Code läuft im RAM weiter).
|
- **Lucys Stimme ist `lucy-stimme` auf `:8021`, nicht `voice-service` auf `:8650` (21.08.):** Dort sind nur
|
||||||
- **`hermes update` meldet Exit 1 trotz Erfolg:** nach seinem eigenen Gateway-Neustart erwartet es
|
Cloud-Stimmen geladen.
|
||||||
Zeilen vom „Fleet version check"; unter systemd kommen keine → Exit 1 (#93406). Der MC2-Job
|
- **Reasoning-Modelle:** `content` kommt nach `reasoning_content`; `max_tokens` großzügig setzen (für
|
||||||
bricht dann die `&&`-Kette ab (kein doctor, UI ohne `/hermes-ui/`-Basis), autoupdate.sh rollt
|
Werkzeug-Aufrufe ≥ 1500), sonst bleibt die Antwort leer.
|
||||||
zurück und PINNT — obwohl der Gehirn-Check grün war (06. und 17.09.2026). Deshalb
|
- **Hooks:** Die Zustimmung bleibt nur über einen CLI- oder Gateway-Start mit `HERMES_ACCEPT_HOOKS=1` erhalten;
|
||||||
`--no-gateway-restart`: Neustart und Urteil gehören dem Job. Pins stehen in
|
`hermes hooks test` schreibt die Allowlist nicht; eine Skript-Änderung macht die Zustimmung ungültig (mtime).
|
||||||
`/srv/models/mc2-pins.json` und werden NUR von Hand gelöst — gepinnt = still eingefroren.
|
- **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\<app>` 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
|
## Lucy (Desktop-App)
|
||||||
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\<app>` 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.
|
|
||||||
|
|
||||||
## Colab / Training (Mini-Stimme)
|
- **file://-Fallen im Electron-Build:** Asset-Pfade relativ; `import()` verzeiht keine relativen Präfixe
|
||||||
|
(`new URL("vad/", document.baseURI)`).
|
||||||
- Live-Drive-Sync JE Epoche einbauen (Session-Tod frisst sonst das Training).
|
- **Lucy immer über `Lucy-Neustart.bat` neu starten:** Hartes Beenden hinterlässt Waisen auf `:8130`.
|
||||||
- Notebook-Zellen vor Abgabe ast-prüfen; Colab-Patches nie durch Shell-Heredocs.
|
- `LUCY_WORKERS=2` (User-Env): 4 Worker bedeuten ~4 × 1,9 GB Kopien des Stimm-Modells.
|
||||||
- **QA-Gate für synthetische Datensätze:** jeden Clip durch STT-Roundtrip — der ungeprüfte
|
- Gerade `"` in Prompt-Strings von `config.ts` zerschießen den String → „…" nutzen.
|
||||||
XTTS-Datensatz war komplett unbrauchbar (sogar whisper-medium verstand ihn falsch).
|
- Zustands-Features immer mit sichtbarem Zustand und Sofort-Feedback bauen: Der User testet nach Produkt-Gefühl.
|
||||||
- Kokoro-Output peakt >1.0 → Peak-Normalisierung 0.95 + Onset-Trim/Fade-In gehören in
|
- **Training der Mini-Stimme (Colab):** Drive-Sync je Epoche; Notebook-Zellen vor Abgabe per `ast` prüfen;
|
||||||
JEDE künftige KokoroTtsEngine.
|
synthetische Datensätze per STT-Rundlauf prüfen (der XTTS-Datensatz war unbrauchbar); Kokoro-Ausgabe auf 0,95
|
||||||
|
normalisieren.
|
||||||
|
|||||||
@@ -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).
|
|
||||||
+66
-122
@@ -1,133 +1,77 @@
|
|||||||
# Offene Fäden — DIE eine Liste
|
# Offene Fäden — die eine Liste
|
||||||
|
|
||||||
_Stand 12.07.2026 (Session S3 lucy-pipeline). Regel: Neues hier rein, Erledigtes hier raus,
|
_Stand 24.09.2026. Neues hier rein, Erledigtes raus (die Git-Historie behält es). Entschiedenes steht in
|
||||||
keine zweite Liste anlegen. Verdikte werden NICHT als „offen" geführt → [VERDIKTE.md](VERDIKTE.md)._
|
[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)._
|
||||||
|
|
||||||
> **➡️ 19.07.2026 — DREI-WELTEN-UMBAU KOMPLETT: [UEBERGABE-DREI-WELTEN.md](UEBERGABE-DREI-WELTEN.md)**
|
## Fahrplan zum Homelab Orchestrator (Plan vom 24.09.2026)
|
||||||
> ist die finale Übergabe der externen Claude-Sessions (Architektur, neue Mechanik
|
|
||||||
> — No-Progress-Bremse, Betrieb-Playbook, mem0-Bündelung/Bereiche/Konsolidierung —,
|
|
||||||
> neue Verdikte, IDE-Welt Zed+OpenCode, offene Fäden Stand 19.07.). Bei Widerspruch
|
|
||||||
> zu älteren Abschnitten unten gilt die Übergabe.
|
|
||||||
|
|
||||||
## Termine (auch als Box-Reminder hinterlegt)
|
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.
|
||||||
|
|
||||||
- **Mo 13.07., 05:15** — erster echter Release-Radar-Cron-Lauf → Morgenlage/Chronik prüfen.
|
| Phase | Inhalt | Abnahme | Stand |
|
||||||
- **täglich 03:45 (ab Registrierung)** — Idle-Radar legt max. 2 belegte Wartungs-Ideen in
|
|---|---|---|---|
|
||||||
die Queue; erste Läufe in der Morgenlage prüfen.
|
| 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. |
|
||||||
- **20.–25.07. — ROCm-Recheck** (Anlass: Ryzen-AI-Halo-Launch 06.07., ROCm 7.13 Preview).
|
| 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) |
|
||||||
Fragen: neue Halo-Community-Benches? llama.cpp-Issue #21284 (gfx1151-Prefill) gemerged?
|
| 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) |
|
||||||
kyuz0-Grid aktualisiert (kyuz0.github.io/amd-strix-halo-toolboxes)? Falls ROCm dann
|
| 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 |
|
||||||
Langkontext-Prefill-Bedarf trifft: NUR Hybrid für heavy/coder erwägen —
|
| 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 |
|
||||||
**Hirn bleibt auf Vulkan, kein Voll-Cut.**
|
| 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 |
|
||||||
- **hipEngine-Watch** (shisa-ai/hipEngine, natives HIP gfx1151, nur Qwen3.6, >2× Prefill):
|
|
||||||
reif genug? Dann mit `deploy/bench/brain-bench.sh` gegen Vulkan messen.
|
|
||||||
|
|
||||||
## Das Ablösungs-Paket (Kurs, siehe [ZIELBILD.md](ZIELBILD.md))
|
Hintergrund zur Homelab-Technik: [ARCHITEKTUR.md](../ARCHITEKTUR.md), Abschnitt „Ausblick".
|
||||||
|
|
||||||
- **S2 „leg los queue" ✅ (10.+12.07.):** Queue = natives Hermes-Kanban, Türen live
|
## Offene Einzelpunkte (Box-Wart)
|
||||||
(Zentrale/Telegram/Lucy), Bagatell-Pfad enabled; voller Kreislauf einmal komplett
|
|
||||||
durchlaufen (`wartung/fix-double-zero-self-repair`). Rest: Live-Telegram-Test beim
|
|
||||||
nächsten echten Zuruf beobachten; Specifier schreibt Titel englisch (ggf. tunen).
|
|
||||||
- **S3 „leg los lucy-pipeline" ✅ (12.07., beide Karten angenommen):** PC-Annahme-Weg live —
|
|
||||||
Auftragsbuch liest ZWEI Repos (mc2 + lucy), Lucy-Annahme = Merge auf der Box +
|
|
||||||
dist-Build/Neustart am PC via PC-Executor (`deploy/lucy-annahme.sh` +
|
|
||||||
`deploy/lucy-annahme.ps1` im Lucy-Repo), Auto-Revert bei Rot. Erster echter Auftrag
|
|
||||||
durch: A4-Turncheck Default AUS (680 Entscheidungen, 79 % der Halte umsonst), dist am PC
|
|
||||||
gebaut. **Erster Live-Lauf fand 2 Runner-Bugs** (Start-Process-Quoting bei Leerzeichen-Pfad,
|
|
||||||
f-String-`\"` auf Python 3.14 → Poll blind; Abschluss manuell nachgezogen, Build war grün) —
|
|
||||||
Fixes + Executor-Fensterblitz-Fix in Karte `wartung/lucy-annahme-fixes` (✅ angenommen).
|
|
||||||
Details FALLEN.md. **Der nächste Lucy-Auftrag ist der ehrliche Voll-Automatik-Test.**
|
|
||||||
- **Annahme-Selbstheilung (12.07. abends, nach cleanse-skill-index-Vorfall):** Auftragsbuch
|
|
||||||
erkennt Orphan-Branches („kein gemeinsamer Ursprung", Annehmen-Knopf weg) und leere
|
|
||||||
Diffs; beide Runner rebasen veraltete Branches automatisch, bevor sie aufgeben;
|
|
||||||
werkstatt-SOUL: voll klonen + merge-base-Selbstcheck + fetch/rebase vor Push, nie
|
|
||||||
~/.hermes-Artefakte committen. Karte `wartung/annahme-selbstheilung`.
|
|
||||||
- **S4 „leg los zuendung" ✅ gebaut (12.07.):** Idle-Radar (`deploy/idle-radar-feed.sh`,
|
|
||||||
Hermes-Cron nächtlich 03:45): Journal-Fehlermuster + Traum-Funde → max. 2 belegte rohe
|
|
||||||
Ideen/Nacht ins native Kanban (Ehrlichkeits-Gate prüft Beleg-Zitate mechanisch,
|
|
||||||
Stau-Bremse bei voller Queue/vollem Auftragsbuch, dreifacher Dedup inkl. archivierter
|
|
||||||
Ideen) · Großbau-Etappen-Regeln in werkstatt-SOUL + wartung-/orchestrator-Skill (jede
|
|
||||||
Etappe für sich lauffähig + annehmbar, NIE auf unangenommene Branches bauen,
|
|
||||||
Folge-Etappen als neue Queue-Aufgaben). **Generalprobe ohne Claude BESTANDEN 12.07.
|
|
||||||
~19:00–19:30:** Radar legte 2 echte Ideen, Specifier zerlegte (deutsch), Werkstatt
|
|
||||||
lieferte Karte `wartung/hermes-gateway-restart` — deren Inhalt war redundant
|
|
||||||
(Restart längst konfiguriert) → daraus entstand noch am selben Tag das
|
|
||||||
**„Lucy kennt sich"-Paket** (User-Auftrag): Selbst-Inventur-Cron 03:35 (Steckbrief
|
|
||||||
auto-generiert + Änderungs-Erkennung), Karten-Gutachter-Cron 04:00 (Empfehlungs-
|
|
||||||
Stempel auf jeder Karte), Ablehnen-mit-Grund (Lern-Gedächtnis
|
|
||||||
`/srv/models/mc2-ablehnungen.jsonl`), Realitäts-Check-Regel (werkstatt-SOUL 7 +
|
|
||||||
wartung-Skill), Release-Radar-Treffer → Queue-Idee. **Offen: erste Scharf-Nächte in
|
|
||||||
der Morgenlage beobachten (03:35 Inventur → 03:45 Idle-Radar → 04:00 Gutachter →
|
|
||||||
04:10 Bagatell → 04:30 Morgenlage → Mo 05:15 Release-Radar).**
|
|
||||||
|
|
||||||
## Lucy
|
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.
|
||||||
|
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).
|
||||||
|
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.
|
||||||
|
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.
|
||||||
|
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.
|
||||||
|
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.
|
||||||
|
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.
|
||||||
|
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.
|
||||||
|
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.
|
||||||
|
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.
|
||||||
|
11. **Radar „Jetzt suchen" läuft synchron** und kann Minuten dauern; `POST /api/models/{id}/load` meldet `ok`, egal
|
||||||
|
was die Engine antwortet.
|
||||||
|
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.
|
||||||
|
|
||||||
- **Raphael-Umbau (04.09.2026) — AUSGEROLLT 19:10 (MC2 `f9f2e11` deployt, Lucy `be686c4` gebaut),
|
## Aufräumen auf der Box (nur per User-Klick)
|
||||||
Details [RAPHAEL.md](RAPHAEL.md) „Ausgerollt". Ursprünglicher Plan:** erst MC2
|
|
||||||
`wartung/lucy-stimme-proxy-raphael` (Proxy `/api/lucy/stimme/*`), dann Lucy
|
|
||||||
`feature/raphael-innere-stimme` (HUD-Client, Stimme von der Box). Danach Hand-Schritte auf der
|
|
||||||
Box: `pocket_server.py` nach `~/.lucy-stimme` syncen (OpenAI-Fassade), Hermes-TTS auf
|
|
||||||
`openai` + `base_url http://127.0.0.1:8021/v1` (Telegram spricht dann mit Lucys Stimme),
|
|
||||||
SOUL.md-Ton auf Raphael (nur mit User-Ja). Ohr-Test Box-Stimme vs. lokal mit `lucy_perf=1`.
|
|
||||||
Alles in [RAPHAEL.md](RAPHAEL.md).
|
|
||||||
- **Auftragsbuch ausgebaut (04.09.2026, Branch `wartung/auftragsbuch-ausbau`):** Router, Service,
|
|
||||||
View, Annahme-Skripte, Bagatell-Annahme, `docs/AUFTRAGSBUCH.md` weg; Cockpit zeigt Ideen statt
|
|
||||||
Karten; STACK/GRENZEN/ARBEITSWEISE/README auf den Branch→Ampel→Merge-Weg. Reste, die bewusst
|
|
||||||
blieben: `deploy/werkstatt-SOUL.md` + `projektstart-SOUL.md` (Werkstatt-Persona, seit Kanban-Aus
|
|
||||||
ohnehin tot — eigener Aufräum-Faden), Chronik-Kategorie „auftragsbuch" (historische Einträge).
|
|
||||||
Auf der Box: `mc2-bagatell.timer` deaktiviert, PC-Executor-URL in `~/.hermes/config.yaml` auf .22.
|
|
||||||
- **Ampel-Runner tot seit 28.08.:** alle Läufe „Waiting to run", kein act_runner auf der Box, Gitea-LXC 104
|
|
||||||
prüfen (`act_runner`-Dienst). Bis dahin gelten lokale Gates.
|
|
||||||
- **Nach dem Ohr-Test:** VERDIKTE.md-Einträge „Electron, nicht Tauri" (Begründung Overlay
|
|
||||||
entfällt) und „STT läuft auf der BOX / Stimme lokal" ersetzen; Lucy-Repo-Altlasten
|
|
||||||
(`mini-stimme/`, Kokoro-Notebooks, `Lucy-Startklar.bat` mit totem Pfad) mit User-Ja räumen.
|
|
||||||
- **Nächster Stimm-Kandidat: Qwen3-TTS über audio.cpp (Vulkan)** — Einstieg liegt bereit: Binaries
|
|
||||||
v0.7.1 unter `~/audiocpp-test/bin` auf der Box (audiocpp_cli/audiocpp_server, Vulkan), Modelle von
|
|
||||||
`huggingface.co/audio-cpp/audio.cpp-gguf` (Qwen3-TTS-12Hz-1.7B-Base q8_0 2,7 GB; CustomVoice/VoiceDesign
|
|
||||||
ebenfalls), CLI: `--task tts --family qwen3_tts --backend vulkan --voice-ref <wav> --reference-text <Transkript>
|
|
||||||
--language de`. Prüfstand: `lucy-tts/referenz/zonos2_bench.py` um einen audio.cpp-Aufrufer erweitern
|
|
||||||
(Server: `POST /v1/audio/speech`). Messlatte = pocket neu: TTFB 1,25 s, RTF 0,97, WER 10 %, 0 Kollaps.
|
|
||||||
- **Eigene Fäden, nicht im Umbau:** pocket-tts 2.1 → 3.1 auf der Box + Lucy-Klon mit dem neuen
|
|
||||||
Trainingscode nachtrainieren (ersetzt Mini-Lucy v2) · Streaming-STT (Nemotron 3.5 ASR
|
|
||||||
Streaming 0.6B oder Voxtral Realtime) als Opt-in im Voice-Sidecar, gegen Parakeet messen.
|
|
||||||
- **Mini-Stimme v2:** Übernacht-Datensatz v2 (DE-Tech + EN) war für 10.07. armiert;
|
|
||||||
User-Schritte: Zip → Drive → `Lucy_Stimme_Training_v2.ipynb` auf Colab T4 → Hörtest.
|
|
||||||
Danach: Lexikon-Injektion in kokoro_server + Modell-Tausch. **pocket bleibt Default,
|
|
||||||
bis v2 den Live-Test gewinnt** (Umschalter „Neue Stimme (Mini-Lucy)" in der Steuerung).
|
|
||||||
- Saber-/XTTS-Altlasten in lucy-tts/ (untracked venvs, Datasets, tote Notebooks) —
|
|
||||||
aufräumen nur mit User-Ja (v2-Pipeline ersetzt sie).
|
|
||||||
- „Lucy light"-Experiment: ungestartet, Idee geparkt.
|
|
||||||
- Frechheit-Regler Phase 3 ist LIVE; weitere Animations-Wünsche nur auf Zuruf.
|
|
||||||
- A4-Turncheck: nach dem Default-AUS (S3) gilt — wer ihn wieder will, setzt
|
|
||||||
`localStorage.lucy_turncheck="1"`; Telemetrie loggt dann nur noch in die Konsole
|
|
||||||
(`lucy_perf="1"`), die Log-Datei `lucy-turncheck.log` wird nicht mehr beschrieben.
|
|
||||||
- Emotions-Stimme = Zukunftsfaden (Klon-DNA ist ruhig; warten auf Qwen-instruct-Clone o. ä.).
|
|
||||||
|
|
||||||
## Box / MC2 (Kleinkram + Politur)
|
- 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`.
|
||||||
|
|
||||||
- D16-Reste: c) System-Logs ausbauen (alle Dienste, Fehler-Filter) · e) Mem0-Dubletten
|
## Beobachten
|
||||||
automatisch (an Curator/Selbstkritik hängen) · f) Politur (Cockpit Zone C entflechten,
|
|
||||||
Faden 6 Voice-Sidecar-Diät: Lucy-Reste aus dem Web-UI).
|
|
||||||
- C13 Bare-Metal-Bootstrap/First-Run-Wizard (Konzept: docs/DISASTER_RECOVERY.md) ·
|
|
||||||
C14 sudo-Kleinkram (stale v1-Unit `mission-control.service`, alter :9000-Rest) ·
|
|
||||||
C15 Docs-Refresh (README, STATUS.md, CUTOVER.md, HERMES_SETUP.md).
|
|
||||||
- Tarball-Backup-Schicht nach ~2 Wochen grüner PBS-Verifys in Rente schicken (ab ~23.07.).
|
|
||||||
- Embedding-A/B-Bench (0.6B vs 4B/8B) als ruhiger Bench-Job; Discover.ROLE_METADATA hat
|
|
||||||
für neue Rollen (kritiker/reranker) nur Fallback-Texte.
|
|
||||||
- radar-feed.sh + selbstkritik-feed.sh haben keinen EIGENEN Cron mehr (laufen im
|
|
||||||
Monats-Review-Wrapper) — Aufräum-Kandidat, bewusst liegen gelassen.
|
|
||||||
- Orchestrator-Härtungs-Kandidaten (erst beobachten, ob es wieder passiert):
|
|
||||||
Schreibziel-Pflicht /tmp/orch-<slug>/ vor jedem write_file · große Artefakte nie in die
|
|
||||||
Antwort (Output-Limit-Tod).
|
|
||||||
- Selbstkritik-Cron in die Morgenlage falten (Empfehlung steht, Eingriff braucht Ja).
|
|
||||||
- pve-root-Passwort unverändert (User-Entscheid 09.07., „nur LAN") — bei Gelegenheit ändern.
|
|
||||||
|
|
||||||
## Beobachten (kein Handlungsbedarf)
|
- **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).
|
||||||
- Erste Nächte des neuen Stacks weiter im Blick: Traum 03:15 / Chef-Gutachter 04:30 /
|
- **So 27.09. 04:30:** erster regulärer Sonntagslauf über den Timer; der Bericht kommt mit der Morgenmeldung um 07:00,
|
||||||
Briefing 08:00 / self-smoke 07:15 — Morgenlage lesen.
|
der Verlauf steht auf der Updates-Seite.
|
||||||
- Telegram-Hänger-Verdacht: NICHT der Prompt (gecacht) — echte Verdächtige sind kalter
|
- **Daily News 07:00:** Die `web_extract`-Werkzeugfehler sollten mit dem Plugin `mc2-web-lesen` verschwunden sein
|
||||||
Cache nach Modell-Reload oder Mem0/Session-Resume beim 1. Turn; braucht echte
|
(Hermes am 24.09. neu gestartet).
|
||||||
Telegram-Log-Messung, falls es wieder auffällt.
|
|
||||||
- GLM-4.7-Flash tauchte 08.07. ~17:00 warm auf (irgendwas nutzte den Kritiker aktiv) —
|
|
||||||
unkritisch, nicht weiter verfolgt.
|
|
||||||
|
|||||||
@@ -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.
|
|
||||||
+125
-129
@@ -1,148 +1,144 @@
|
|||||||
# 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
|
_Stand 24.09.2026. Quellen: Code in `main` (`75611be`: Units, `deploy/llama-swap.config.yaml`, Skripte)
|
||||||
--version, /api/health); Engine, Hermes und llama-swap-Config nachgemessen am **17.09.2026**
|
und die Prüfberichte vom 24.09.2026 (live auf der Box gelesen). Bei Widerspruch zu anderen Dokumenten
|
||||||
(llama.cpp b11026, Hermes v0.21.3, `--load-mode none`). Bei Widerspruch zu älteren Docs gewinnt
|
gewinnt diese Datei. Wer sie ändert: erst messen, dann schreiben, Datum dazu._
|
||||||
diese Datei. Wer sie ändert: erst messen, dann schreiben._
|
|
||||||
|
|
||||||
## Maschinen & Zugänge
|
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.
|
||||||
|
|
||||||
| Was | Wo |
|
## Maschinen und Zugänge
|
||||||
|---|---|
|
|
||||||
| **AI Box** (Bosgame M5, Ryzen AI MAX+ 395, 128 GB unified) | `hitonabi@192.168.178.151` (SSH); Zeitzone **Europe/Berlin** |
|
| Was | Wo | Stand |
|
||||||
| **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) |
|
| **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. |
|
||||||
| **PBS** (Proxmox Backup Server) | `192.168.178.156:8007`, Datastore `qnap` |
|
| **Windows-PC** (Dev-PC, OpenChamber) | `192.168.178.22` | 23.09. |
|
||||||
| **QNAP TS-228A** „TobiNAS" | `192.168.178.62` — Freigabe `/Backup` per NFSv3 exklusiv an pve |
|
| **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** | `git.tobisniceshomelab.ddnsfree.com` (lokal `192.168.178.153:3000`); Push-to-Create AUS |
|
| **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
|
## Repos
|
||||||
|
|
||||||
- **MC2:** `F:\Coding Stuff\mission-control-2` ↔ Gitea `Hitonabi/mission-control-v2` ↔ Box
|
- **Homelab Orchestrator / Box-Wart (dieses Repo):** PC `F:\Coding Stuff\mission-control-2` ↔ Gitea
|
||||||
`~/mission-control-v2` (nur Branch `main`). Enthält backend, frontend (dist committet!),
|
`Hitonabi/mission-control-v2` ↔ Box `~/mission-control-v2`. Auf Gitea nur `main` plus zwei
|
||||||
Sidecars, deploy, hermes-Plugin, `client/hermes-pc`.
|
Archiv-Tags (`git tag -l 'archiv/*'`). `frontend/dist` ist committet (die Box baut kein Frontend).
|
||||||
- **Lucy:** `F:\Coding Stuff\lucy` ↔ `Hitonabi/lucy` (privat; lucy-desktop/ + lucy-tts/).
|
- **Lucy (Desktop-App):** `F:\Coding Stuff\lucy` ↔ `Hitonabi/lucy` (Electron, eigenes Repo).
|
||||||
- **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.
|
|
||||||
|
|
||||||
## Dienste auf der Box (live 19.08.2026)
|
## Dienste auf der Box
|
||||||
|
|
||||||
| Dienst | Port | Zweck |
|
| Unit | Art | Port | Aufgabe | 24.09. |
|
||||||
|---|---|---|
|
|---|---|---|---|---|
|
||||||
| `llama-swap` (System-Dienst) | `:8080` | Modell-Router; Engine = llama.cpp **Vulkan/RADV** (`/opt/llamacpp-vulkan`, b11026 seit 17.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` | MC2 Cockpit (FastAPI + React Frontend) & Steuerpult |
|
| `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) | `:9010` | `/v1`-Datenpfad (model:auto Routing + native Bildweiche) |
|
| `mc2-gateway` | User | `127.0.0.1:9010` | `/v1`-Datenpfad: `model: auto`, Bild-Weiche | läuft |
|
||||||
| `mc2-steward` (User) | — | Hintergrundwächter (Re-Warm, Health-Sentry, Mem0-Dedupe) |
|
| `mc2-steward` | User | – | Wächter und Re-Warm (hält das Hirn geladen) | läuft |
|
||||||
| `hermes-gateway` (User) | `:8642` | Hermes Agent Core API (v0.21.3, Bot Mode) |
|
| `hermes-gateway` | User | `:8642` | Hermes Agent „Lucy", Telegram | läuft |
|
||||||
| `hermes-builtin-ui` (User) | `:9119` (loopback) | Eingebaute Hermes-GUI; LAN-Zugang via MC2-Proxy `/hermes-ui/` |
|
| `hermes-builtin-ui` | User | `:9119` | Hermes-Dashboard, in MC2 unter `/hermes-ui/` | läuft |
|
||||||
| `mem0-service` (User) | `:8765` | Semantischer Chroma-Gedächtnis-Sidecar |
|
| `lucy-stimme` | User | `127.0.0.1:8021` | Lucys Stimme (pocket-tts `german_24l`) | läuft |
|
||||||
| `voice-service` (User) | `:8650` | STT (faster-whisper) + TTS (Piper/Chatterbox) |
|
| `voice-service` | User | `127.0.0.1:8650` | Spracherkennung für Lucy-Desktop | schläft |
|
||||||
| `box-console` (User) | `:7682` | ttyd-Login-Shell hinter MC2-Proxy |
|
| `box-console` | User | `7682` (nur lo) | Web-Konsole (ttyd) | schläft |
|
||||||
|
|
||||||
**Stillgelegt:** `hermes-terminal` (:7681), `hermes-webui` (:8787) und alter `governor` (:8100).
|
„Schläft" = `systemctl --user disable --now` (User-Entscheid 24.09.): kein Fehler für den Wächter, in der
|
||||||
⚠️ User-Units per SSH nur sichtbar mit `export XDG_RUNTIME_DIR=/run/user/$(id -u)` vor `systemctl --user`.
|
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):**
|
## Modelle (llama-swap, Config vom 24.09.2026)
|
||||||
Qwen3.6-35B-A3B + Qwen3-Embedding-0.6B + Qwen3-Reranker-0.6B. Sonst NICHTS dauerhaft warm.
|
|
||||||
|
|
||||||
| 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 |
|
| jede Minute | Wächter: Dienste, Timer, Hermes-Jobs, Kern, Platte, festgehaltene Updates, Partner-Instanz (sobald eingerichtet) | `mc2-steward` | [BETRIEB.md](../BETRIEB.md) |
|
||||||
| `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) |
|
| alle 90 s | Re-Warm: lädt das Hirn nach, wenn nichts geladen ist | `mc2-steward` | [ARCHITEKTUR.md](../ARCHITEKTUR.md) |
|
||||||
| `debugger` | Muse-Glimmer-30B (Q4_K_XL, DFlash) | 600 | 65536 ctx; Runtime-Diagnostik & Fehler-Debugger (multimodal) |
|
| stündlich (+≤5 min) | `projekte-sync`: `~/projekte` mit Gitea abgleichen (nur fast-forward) | Timer | [BETRIEB.md](../BETRIEB.md) |
|
||||||
| `vision` | Qwen3-VL-30B-A3B-Instruct (Q4_K_M) | 900 | 32768 ctx; Multimodal-Augen (On-Demand) |
|
| 00:30 | Modell-Radar: Suche (≤1× am Tag), Test im Fenster 00:30–02:30 | `mc2-radar.timer` | [RADAR.md](../RADAR.md) |
|
||||||
| `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 |
|
| ~03:00 | NerdQuiz-Nachtlauf (Arcane) fragt das Hirn direkt über `:8080` | extern | [RADAR.md](../RADAR.md) |
|
||||||
| `reranker` | Qwen3-Reranker-0.6B (q8_0, Mungert) | 0 | Sortiert Suchtreffer nach echter Relevanz (`/v1/rerank`) |
|
| 03:30 (+≤5 min) | Sicherung, danach Kopie auf den Proxmox-Host | `mc2-backup.timer` | [BETRIEB.md](../BETRIEB.md) |
|
||||||
| `embed` | Qwen3-Embedding-0.6B (f16) | 0 | Vektorisierung für Suche/Sortierung |
|
| 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).
|
## Coding-Bahn (OpenChamber)
|
||||||
>
|
|
||||||
> **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.
|
|
||||||
|
|
||||||
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**.
|
Der Box-Wart hat keine Anmeldung (User-Entscheid 24.09.), schreibende `/api`-Aufrufe fremder Webseiten lehnt
|
||||||
- **Bot-Roster: leer** (live geprüft 27.08.2026). Hermes *kann* mehrere Bots, genutzt wird es nicht —
|
die Herkunftsprüfung ab (`backend/services/herkunft.py`), und Security-Config (approvals, Tokens, ufw,
|
||||||
die Profile fahren `hermes`, `fast` und `vision`. Frühere Fassungen behaupteten hier einen Roster
|
command_allowlist, sudoers) ändert niemand ohne ausdrückliches User-Ja.
|
||||||
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.)
|
|
||||||
|
|
||||||
## Automatik-Fahrplan (was nachts von allein läuft)
|
## Deploy und Sicherung (Kurzform)
|
||||||
|
|
||||||
| Zeit | Was |
|
- 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).
|
||||||
| 02:30 | PBS sichert alle Proxmox-LXCs |
|
- Sicherung: täglich, 14 Stück unter `/srv/models/mc2-backups/`, Kopie auf dem Proxmox-Host, Zurückspielen
|
||||||
| 03:15 | **Traum-Cron** (dreaming-feed.sh → Wissens-Vault, fremdblick-Gate, propose-only) |
|
per Oberfläche oder `deploy/restore.sh`. Details: [BETRIEB.md](../BETRIEB.md).
|
||||||
| 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`.
|
|
||||||
|
|||||||
+132
-135
@@ -1,149 +1,146 @@
|
|||||||
# 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
|
_Stand 24.09.2026. Jedes Verdikt nennt Datum und Grund. Wer eines kippen will, braucht eine neue Messung
|
||||||
(wo sinnvoll) die Wiedervorlage-Bedingung. Wer eines kippen will, braucht eine MESSUNG oder
|
oder einen User-Entscheid (siehe [ARBEITSWEISE.md](ARBEITSWEISE.md)). Abgelöstes steht unten unter
|
||||||
einen User-Entscheid — kein „Best Practice sagt aber…" (siehe ARBEITSWEISE.md)._
|
„Überholt (mit Datum)": ersetzt, nicht gelöscht._
|
||||||
|
|
||||||
## Richtung & Architektur
|
## Richtung
|
||||||
|
|
||||||
- **MC3-Neubau VERWORFEN (03.07.), „MC2 Final" ERSETZT durch „MC2 lebt" (10.07.).**
|
- **Box-Wart (23.09.):** MC2 ist nur noch Updater, Wächter und Modell-Radar der KI-Box. Coding läuft in
|
||||||
Kein Basisstation-Neubau; seit dem Ablösungs-Entscheid wird MC2 über die
|
OpenChamber; Ideen, Wissen, Chronik, Skills-Ansicht, Verbinden und Konsole sind aus der Oberfläche raus.
|
||||||
Queue→Karte→Klick-Pipeline weiterentwickelt statt eingefroren. Siehe [ZIELBILD.md](ZIELBILD.md).
|
Bedienung im Browser an PC und Handy, Oberfläche im Stil „Cockpit" (Warnlampen, Instrumente).
|
||||||
- **Agent-Runtime: Hermes bleibt.** ZeroClaw-PoC gebaut + abgerissen (01.07.) — der echte
|
- **Umbau statt Neubau (24.09.):** Wächter, Updates mit Rückweg und Festhalten, getrennte Prozesse, Cockpit und
|
||||||
Latenz-Fix war das Hirn (gemma→Qwen3.6), nicht die Runtime. (ZeroClaw-Messwerte für den
|
Gateway tragen. Neu gebaut wird hinter Schnittstellen: Job-Engine, Einstellungen, Verlauf (Plan:
|
||||||
Fall „Hermes-Latenz wird wieder Thema": `docs/ZEROCLAW_POC_RESULTS.md`.)
|
[OFFENE-FAEDEN.md](OFFENE-FAEDEN.md)). Einen Neubau („MC3") hatte der User schon am 03.07. verworfen.
|
||||||
- **Memory-Layer: Mem0 ENTFERNT (07.08.2026).** Hermes-Agent ist die Single Source of Truth für Gedächtnis und Autonomie.
|
- **Homelab Orchestrator (24.09.):** zwei Instanzen, eine Oberfläche. Der Box-Wart bleibt auf der KI-Box, der
|
||||||
- **Telegram bleibt DER Mobil-Kanal; WhatsApp VERWORFEN (09.07.).** Baileys-Bridge = Meta-ToS-
|
Homelab-Teil läuft als Container auf dem Proxmox-PC, beide prüfen sich gegenseitig. „Box-Wart" bleibt der
|
||||||
Verstoß mit Bann-Risiko auf der Privatnummer + fragiler Dauerprozess; Alarmkette/Crons sind
|
Name des Bereichs für die KI-Box, „Homelab" der für den Proxmox-PC. Beide Instanzen laufen mit derselben
|
||||||
simple Bot-API-Calls. Neu bewerten nur bei offizieller Personal-Bot-API.
|
Codebasis, unterschieden durch `MC_ROLLE` (`box` oder `homelab`).
|
||||||
- **Multi-Profil Lucy/Werkstatt auf der Box: NICHT nötig (09.07.).** `tui_gateway` lädt hart den
|
- **Homelab-Umfang und Rechte (24.09.):** Proxmox-Host, 6 Container, Arcane mit Docker, KI-Box, nichts weiter.
|
||||||
`cli`-Bucket, Lucy läuft über `api_server` — die Trennung existiert auf Platform-Ebene.
|
Proxmox nur über eine Lese-API und einen kleinen Ausführer auf dem Host. Dabei ist, was das Etikett
|
||||||
(Das PC-Profil des Hermes Desktop ist ein ANDERER Fall: eigene Maschine.)
|
`community-script` oder `watcher` trägt; `watcher-aus` nimmt ein Gerät aus. Schlüssel und Ausführer erst nach
|
||||||
- **MoA-Preset NICHT adoptiert.** Lädt mehrere Modell-Slots parallel — RAM ist der Engpass.
|
User-OK.
|
||||||
Das sequenzielle Zwei-Kritiker-Gate (Coder-Next + GLM) ist E2E-bewährt und RAM-schonend.
|
- **Homelab-Updates nur per Knopf (24.09.):** „Jetzt updaten" je Gerät, mit Erfolgsmeldung und
|
||||||
- **worker.sh bleibt; natives `delegate_task` nur für interaktive Arbeit (10.07.).**
|
Erreichbarkeits-Check; ist der Check rot, rollt der Homelab-Teil selbst zurück und meldet es. Host-Updates
|
||||||
delegate_task kann KEINE Modellwahl pro Aufruf und läuft top-level IMMER background
|
mit Warnung, Neustart getrennt; die KI-Box prüft danach, ob der Host wieder läuft.
|
||||||
(stirbt in der `-z`-Lane mit dem Prozess). `delegation.model: coder` ist live —
|
- **Keine Anmeldung (24.09.):** nur eine unsichtbare Herkunftsprüfung, damit fremde Webseiten keine Knöpfe
|
||||||
Fan-out funktioniert E2E in langlebigen Sessions (Desktop/Telegram/Chat).
|
auslösen (`backend/services/herkunft.py`).
|
||||||
- **Kein heavy/gpt-oss im heißen Pfad.** heavy läuft mit 32k (< Hermes-Floor 64k) und 60 GB
|
- **Android-App am Ende (24.09., Phase 5):** Push, Cockpit, Updates freigeben, Lucy per Sprache mit Live-Modus.
|
||||||
Kaltladen. Als Ein-Schuss-Completion (Chef-Gutachter, Radar-Analyst, Orchestrator-Planung)
|
- **Die Coding-Oberfläche heißt „OpenChamber" (24.09.).** Die Gemini-/Antigravity-Doku und SAVEPOINT liegen im
|
||||||
ok — als delegate_task-Ziel oder Pro-Schritt-Worker nie.
|
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
|
- **Der Wächter behebt Einfaches selbst (23.09.):** Abgestürzte Dienste (`failed`) startet er neu, höchstens 2× je
|
||||||
09.07.: hält weiter, einziger ROCm-Vorteil = Langkontext-Prefill auf gpt-oss).
|
Stunde. Gestoppte Dienste meldet er nur. Schlafende (abgeschaltet und nicht im Autostart, 24.09.) sind kein Befund.
|
||||||
**Wiedervorlage: ROCm-Recheck 20.–25.07.2026** (Box-Reminder gesetzt) — falls dann Bedarf:
|
- **Updates automatisch sonntags 04:30 (23.09.),** seit 24.09. über `mc2-autoupdate.timer` statt Hermes-Cron: Als
|
||||||
NUR Hybrid für heavy/coder erwägen, **das Hirn bleibt in jedem Szenario auf Vulkan.**
|
Kind des Hermes-Gateways hing der Lauf beim Hermes-Update am eigenen Neustart (20.09.: 180 s, Fehlschlag).
|
||||||
- **Lucys Hirn: Qwen3.6-35B-A3B mit DFlash-Spec-Draft (seit 22.07.)** — löste draft-mtp ab:
|
- **Neustart der Box nur im Wartungsfenster So 04:00–06:59 (24.09.).** `MC_AUTOUPDATE_REBOOT_JETZT=1` erzwingt ihn.
|
||||||
A/B/C prod-gleich gemessen 61,7 (ohne) / 81–83 (MTP) / 86–90 t/s (DFlash), live eingependelt
|
- **Nachtruhe für Meldungen (24.09.):** `notify.sh` sammelt 00:00–06:59, um 07:00 kommt eine Morgenmeldung.
|
||||||
89–94. Draft: `giocom-…-DFlash-Q8_0.gguf` (Mainline-kompatibel; abhinand-Konvertierung ist es
|
Dringendes geht sofort raus.
|
||||||
NICHT — fehlendes `target_layers`-Metadatum). Rollback-Backup `config.yaml.bak-dflash-*`.
|
- **Zweiter Weg zu Telegram (24.09.):** Scheitert `hermes send`, schickt `notify.sh` direkt an die Telegram-Bot-API.
|
||||||
KV **q8_0** (Entscheid 07.07.: Qualität > ein paar GB; der q4_k-Commit lief nie live).
|
Hermes kann selbst ausfallen, und die Homelab-Instanz hat kein Hermes.
|
||||||
`--parallel 2` = bewusster Trade (Lernen blockiert nie den nächsten Voice-Turn).
|
- **Deploy zweistufig mit Prüftor und Rückweg (24.09.):** `deploy/pruefen.sh` ersetzt die CI-Ampel.
|
||||||
- **DFlash je Rolle (gemessen 22.07., nicht neu aufrollen):** coder NEIN — 44–50 t/s mit Draft
|
- **llama-swap-Config (24.09.):** Die lebende Datei `/etc/llama-swap/config.yaml` ist die Wahrheit. Der Repo-Abzug
|
||||||
(Q8 wie BF16) vs. 59–60 ohne, trotz 68–76 % Akzeptanz: 3B-aktiv-Decode ist billiger als das
|
überschreibt sie nur, wenn er sich im selben Deploy geändert hat. Geschrieben wird nur unter der Config-Sperre.
|
||||||
Draften. heavy WARTET — gpt-oss-120b-Draft konvertiert (liegt in `/srv/models/DFlash-drafts/`),
|
- **Box-Diät (24.09.):** Konsole und Spracherkennung schlafen (nicht gelöscht). PC-Fernsteuerung (MCP
|
||||||
aber Engine b10087 lädt die Arch nicht („expected 123, got 91“ = Extra-Tensoren unbekannt);
|
`hermes-pc-control`, PC-Aufgabe `HermesPCExecutor`) und MCP `mission-control-stack` sind aus. 10 alte Skills liegen
|
||||||
nach Engine-Update erneut probieren. vision/scout: keine Drafts veröffentlicht.
|
in `~/.hermes/skills-archiv`. Embedding und Reranker schlafen (ttl 300); warm ist nur das Hirn.
|
||||||
Eigenbau-Rezept: z-lab-safetensors + `convert_hf_to_gguf.py --target-model-dir <Ziel-Tokenizer>`;
|
- **Sicherung mit Lucys Gedächtnis (24.09.):** Der Tarball enthält `memories/`, `SOUL.md`, Skills, Cron-Skripte,
|
||||||
⚠️ `llama-quantize` verwirft DFlash-Sondertensoren bei Nicht-Standard-Archs.
|
Box-Wart-Zustand, Units und Stimmreferenz. `restore.sh` spielt Gedächtnis und Zustand nur zurück, wenn sie fehlen
|
||||||
- **coder-Lane: Qwen3-Coder-Next, FINAL** („bleiben bei dem was wir haben, nachweislich
|
oder mit `--mit-gedaechtnis`.
|
||||||
besser"). Qwen3.6-27B dense gebencht + verworfen (tg 12,7 t/s = 4–7× langsamer).
|
- **Endgültig gelöscht wird nur per User-Klick (23.09.):** Modelle im Aufräumen-Panel, Reste auf der Box ebenso.
|
||||||
|- **hipEngine + strix-halo-toolboxes/TheRock: beobachten, nicht adoptieren.** hipEngine
|
- **Git (24.09.):** nur `main` plus Archiv-Tags. Ungemergtes, das weg soll, erst als Tag `archiv/<name>` sichern.
|
||||||
(natives HIP, nur Qwen3.6, >2× Prefill) ist jung; kyuz0-Toolboxes lösen ein Problem, das
|
- **Approvals bleiben aus (17.09.):** `approvals.mode: 'off'`, `approvals.cron_mode: auto`.
|
||||||
die Box nicht hat. Radar/Reminder wachen; Adoption nur nach eigenem brain-bench.
|
- **Erinnerungen und Wecker laufen im Box-Wart** (`backend/services/reminders.py`), nicht als Hermes-Cron.
|
||||||
|- **Vision-Rolle: GLM-4.6V-Flash bleibt Amtsinhaber.** Qwen-AgentWorld-35B geprüft (Prüfstand
|
- **Hermes-Quellcode nie forken oder patchen; Hermes' interne Prompts bleiben Englisch (03.07.).** Deutsch kommt aus
|
||||||
t_9daf088f, Speed: tg 26,8 t/s / pp 339,1, Vision: 0/1 korrekt). Qualität deutlich unter
|
`SOUL.md`; alles, was der User sieht, ist Deutsch.
|
||||||
GLM-4.6V-Flash, kein Aufsteiger — **abgelehnt**. Wiedervorlage nur bei neuer Version mit
|
- **Tool Search nicht auf `on` (04.07.):** Es spart Cloud-Tokens, kostet lokal Latenz (gemessen 15,1 s statt 5–7 s).
|
||||||
nachweislich > 50 % Vision-Rate.
|
|
||||||
|- **dist/ im Git ist ABSICHT.** Box hat kein Node; Deploy = `git reset --hard` + committetes
|
|
||||||
`frontend/dist`. NICHT gitignoren.
|
|
||||||
|
|
||||||
## Lucy (Voice-App)
|
## Modell-Radar (23./24.09.)
|
||||||
|
|
||||||
- **Shell: Electron, nicht Tauri.** Alle harten Features (Klick-Durchlass-Overlay, Capture,
|
- Zwei Rollen: Hirn und Coder. Höchstens drei Modelle; eine dritte Rolle nur bei nachgewiesenem Mehrwert. Der
|
||||||
Loopback, Tray, TTS-Spawn) existieren in Electron; Tauri fehlt Region-Klick-Durchlass.
|
Debugger entfällt (23.09.).
|
||||||
- **Stimme: pocket-tts bleibt Default, bis die Mini-Lucy (Kokoro-Finetune) den Live-Test
|
- Das Radar testet selbst: nachts 00:30–02:30 (um 03:00 braucht NerdQuiz das Hirn), höchstens ein neuer Kandidat
|
||||||
gewinnt.** Qwen3-TTS-1.7B (RTF ~14), Chatterbox („zu delayed"), F5 (nicht streamfähig) —
|
pro Woche, nur was neben das Warm-Set passt. Durchgefallene werden gelöscht; getauscht wird erst per Knopf
|
||||||
alle verworfen. Mini-Lucy v1 gewann alles Messbare (TTFB 0,45 s vs 1,72 s), scheiterte aber
|
„Übernehmen" (23.09.).
|
||||||
am Live-K.o. „nicht multilingual" → v2-Training läuft (Stand 10.07.). Umschalter in der App.
|
- Hirn und Coder müssen Bilder verstehen, auch mitten in Agenten-Aufgaben (23.09.).
|
||||||
- **STT läuft auf der BOX** (Parakeet-TDT v3, 0,3–0,8 s, praktisch fehlerfreies Deutsch),
|
- Fairer Vergleich (24.09.): Jeder Kandidat misst mit seiner schnellsten Draft-Variante (ohne, eingebauter
|
||||||
lokaler Whisper nur als Lazy-Fallback. Gemini hatte das 07.07. still auf PC-CPU umgebaut —
|
MTP-Kopf, Draft des heutigen Modells); das heutige Modell misst mit seinem Draft.
|
||||||
zurückgedreht, Messung gewann.
|
- Jev (TypeSafe AI) ist nicht relevant (24.09.): nur Cloud-API, liefert nur Wahrscheinlichkeiten, passt in keine Rolle.
|
||||||
- **Kein Multi-Agent in der Voice-Lane** (3× Latenz-Falle). Multi-Agent JA für Radar
|
|
||||||
(Fan-out) und Werkstatt (Worker/Reviewer).
|
|
||||||
|
|
||||||
## Hermes-Betrieb
|
## Engine und Modelle (Box, gfx1151)
|
||||||
|
|
||||||
- **Hermes-Quellcode NIE forken/patchen; interne Prompts bleiben ENGLISCH.** Deutsch kommt
|
- **Vulkan/RADV schlägt ROCm** (+12–22 % Generierung, seit 27.06. mehrfach bestätigt). ROCm-Recheck 24.07.: Der
|
||||||
aus SOUL.md (verifiziert); alles User-Sichtbare (Meldungen, Skills, Summaries) = deutsch.
|
Vulkan-Prefill hält bei 32k noch 488 t/s, kein ROCm-Bau. Wiedervorlage nur bei neuem Langkontext-Support der
|
||||||
- **Tool Search NICHT auf `on`** (steht auf `auto`, schläft de facto). Es optimiert
|
Engine oder einem reinen HIP-Modell. **Das Hirn bleibt in jedem Fall auf Vulkan.**
|
||||||
Cloud-Token-Kosten; wir optimieren lokale Latenz mit Prompt-Caching — `on` war gemessen
|
- **hipEngine und strix-halo-toolboxes: beobachten, nicht übernehmen (03.07.).** Übernahme nur nach eigener Messung.
|
||||||
LANGSAMER (15,1 s statt 5–7 s).
|
- **Hirn: Qwen3.6-35B-A3B** (MoE, 3B aktiv) mit DFlash-Draft (seit 22.07.), KV q8_0 (07.07.: Qualität vor ein paar
|
||||||
- **Zed ACP / Hermes-im-Editor: NICHT machen.** Editor-Agent + Box-coder-Modell + AGENTS.md
|
GB), `--parallel 2` = zwei Slots à 65k (Nebenlast blockiert keinen Sprach-Turn), `--reasoning-budget 2048` (17.09.).
|
||||||
ist der Sweet Spot; Hermes dazwischen = 70-KB-Prompt-Overhead. (Zed selbst ist inzwischen
|
- **Dichte Modelle nie als Hirn (17.07.):** bandbreitengebunden, ~12 statt ~100 t/s. Das Radar lässt als Hirn nur
|
||||||
vom PC entfernt — Hermes Desktop übernahm.)
|
Modelle mit höchstens 12B aktiven Parametern zu.
|
||||||
- **Approvals bleiben AUS** (`approvals.mode: 'off'`, `cron_mode: auto`; so seit spätestens dem KISS-Umbau
|
- **Coder: Qwen3.8-27B mit DFlash2-Draft (04.09.):** 12,6 → 31 t/s. `heavy` ist seit 04.09. derselbe Coder.
|
||||||
21.08.2026, vom User am 17.09.2026 bestätigt). Die Schutzlinie liegt außen — ufw, PC-Executor-Token,
|
- **Varianten der Basismodelle (17.09.):** Hirn und Coder laufen als Varianten (Prüfstand: 100,8 statt 92,8 t/s bzw.
|
||||||
command_allowlist — nicht in der Freigabe-Frage. *Überholt damit:* „`approvals.cron_mode: deny` bleibt"
|
30,4 statt 26,2 t/s). Die Originale bleiben als Rückweg. Nemotron 3.5 Lightning 30B-A3B ist eine gleichwertige
|
||||||
(Autonomie-Härtung 1c, Option A: Gefahr-Befehle + execute_code im Cron-Kontext geblockt, interaktiv `smart`).
|
Hirn-Reserve, nicht besetzt.
|
||||||
- **Fremd-Kritik via `fremdblick.sh`** (Ein-Schuss an leichtes Fremdmodell), NIE via
|
- **Bild-Zwillinge (24.09.):** Bilder gehen an Zwillinge ohne Draft (`vision`, `coder-bild`), weil llama.cpp Draft
|
||||||
delegate_task→heavy (64k-Floor + Lade-Tod). Raster: prose=GLM-4.7-Flash (kritiker),
|
und Bild nicht zusammen kann (HTTP 500, b11057 und b11157 geprüft).
|
||||||
code=Coder-Next. Harte Regel: **REPRODUZIERT-ODER-ABGELEHNT** — Freispruch nur mit
|
- **`brains` mit `exclusive: false` (24.09.):** Ohne den Schlüssel ist eine llama-swap-Gruppe exklusiv, und jede
|
||||||
belegtem Vorher/Nachher.
|
Hirn-Anfrage entlud den Coder. Gruppe `bild`: `swap: true` (höchstens ein Zwilling geladen), `exclusive: false`.
|
||||||
- **Erinnerungen/Wecker laufen deterministisch in UNSERER Schicht** (services/reminders.py),
|
- **Eine Gruppe für alles gleichzeitig Warme (25.07.):** Zwei ko-residente Gruppen verdrängen sich. Speicherregel:
|
||||||
bewusst ohne Hermes-cron.
|
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
|
## Sonstiges
|
||||||
|
|
||||||
- **LobeChat/WebUI-Ersatz verworfen** (Multi-User-Fehlpassung — Lehre: Scope challengen).
|
- **LobeChat/WebUI-Ersatz verworfen** (Mehrbenutzer-Design passt nicht; Lehre: Scope challengen).
|
||||||
- **Smart Turn v3:** Audio LINKS padden; Output ist empirisch **P(unfertig)** — Doku behauptet
|
- **Lokaler GPU-Klon (9070 XT):** wenn, dann llama.cpp-Vulkan + llama-swap, nicht Lemonade. Zweck offen.
|
||||||
das Gegenteil. Läuft im Voice-Sidecar (/turn, ~110 ms).
|
- **Aussortiert:** Kyutai-Streaming-STT (nur EN/FR), Unmute-Voll-Stack, openWakeWord (Wake-Gate ist STT-basiert).
|
||||||
- **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).
|
|
||||||
|
|
||||||
## 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):
|
| Seit | Was galt | Was heute gilt |
|
||||||
|
|---|---|---|
|
||||||
| Test | Coder-Next 80B-A3B | Devstral Small 2 24B dense |
|
| 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 |
|
||||||
| pp2048 @ 0 | 702 t/s | 468 t/s |
|
| 24.09. | `vision` = Qwen3-VL-30B-A3B (seit 20.08.), davor GLM-4.6V-Flash | Bild-Zwillinge von Hirn und Coder |
|
||||||
| tg64 @ 0 | 59 t/s | 15 t/s |
|
| 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` |
|
||||||
| pp2048 @ 8192 | 638 t/s | 315 t/s |
|
| 24.09. | Embedding und Reranker immer warm (für die Gedächtnis-Suche) | schlafen, ttl 300 |
|
||||||
| tg64 @ 8192 | 55 t/s | 14 t/s |
|
| 24.09. | Hermes-Aufgabenbrett (Kanban) mit Verteiler im Gateway | Werkzeugsatz seit 21.08. aus, Verteiler (`kanban.dispatch_in_gateway`) seit 24.09. aus |
|
||||||
| pp2048 @ 32768 | 488 t/s | 63 t/s (7,7x langsamer) |
|
| 24.09. | Werkstatt-Profil, `worker.sh`, Orchestrator- und Konzept-Skills, Agent-Hooks | Profile seit 19.08. archiviert, Dateien am 24.09. aus dem Repo |
|
||||||
| tg64 @ 32768 | 47 t/s | 11 t/s (4,2x langsamer) |
|
| 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 |
|
||||||
- **Backend bleibt Vulkan (ROCm-Recheck 24.07. erledigt).** Vulkan-Prefill haelt bei 32K
|
| 24.09. | Referenz-Branch des Gedächtnis-Ausbaus | Tag `archiv/referenz-mem0-ausbau` |
|
||||||
noch 488 t/s — der einzige ROCm-Vorteil (Langkontext-Prefill) ist auf dieser Box kein
|
| 23.09. | „MC2 lebt" (10.07.): Ideen-Queue → Karte → Klick, Auftragsbuch mit Bagatell-Annahme | Box-Wart; das Auftragsbuch war am 04.09. ausgebaut |
|
||||||
Engpass. Der Autor des fuehrenden ROCm/Strix-Halo-Rezepts ist im Juli 2026 selbst zu
|
| 23.09. | Pins nur von Hand lösen (`jq` per SSH) | Knopf „Freigeben" (Wächter-Hinweis und Updates-Seite) |
|
||||||
Vulkan zurueckgekehrt (+28% Decode). Kein ROCm-Bau — Produktiv-Risiko fuer null Gewinn.
|
| 04.09. | `heavy` = gpt-oss-120b (03.07.), „nie im heißen Pfad" | `heavy` = Qwen3.8-27B; gpt-oss-120b ohne Rolle |
|
||||||
Wiedervorlage nur bei neuem Engine-Langkontext-Support oder einem reinen HIP-Modell.
|
| 21.08. | Hermes Desktop als Arbeits-Tür (09.07.); davor Zed-Agent mit Box-Modell (04.07.: kein Zed ACP) | OpenChamber am PC |
|
||||||
- **Coder bleibt Qwen3-Coder-Next — jetzt gemessen bestaetigt.** Devstral Small 2 (einziger
|
| 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 |
|
||||||
neuer agentisch trainierter Dense-Kandidat) ist 4x langsamer bei Generierung und bricht
|
| 21.08. | natives Fan-out mit `delegation.model: coder` (10.07.) | Werkzeugsatz `delegation` aus |
|
||||||
beim 32K-Prefill auf 63 t/s ein (~9 min um einen 32K-Kontext zu lesen). Fuer agentisches
|
| 21.08. | `approvals.cron_mode: deny` (Autonomie-Härtung, Juli) | `off`/`auto`, bestätigt 17.09. |
|
||||||
Coden auf dieser Box disqualifiziert — Reliabilitaet war nicht einmal noetig als Argument.
|
| 21.08. | Box-Host-Sicherung nach PBS (`pbs-backup.timer`) | aus (lief rot); der Tarball ist die Sicherung |
|
||||||
- **Der Coder ist nicht langsam (59 t/s).** Das Fassaden-/Halluzinations-Problem ist kein
|
| 21.08. | Zwei-Kritiker-Gate (Coder-Next + GLM) über `fremdblick.sh` | entfallen mit Modell-Konsolidierung (19.08.) und KISS-Umbau |
|
||||||
Speed- und kein Backend-Problem und wird weder durch Modelltausch noch ROCm geloest. Es
|
| 19.08. | Kritiker Devstral Small 2 mit 16k-Deckel (25.07.), Rollen `scout` und `dense-planer` | ein Coder, ein Hirn |
|
||||||
ist Reliabilitaet = Modellklasse + Harness. Naechster Hebel: Post-Edit-Verify-Hook,
|
| 19.08. | Coder Qwen3-Coder-Next „final" (24.07.); „Coder ohne DFlash" (22.07.) | Qwen3.8-27B, seit 04.09. mit DFlash2 |
|
||||||
kleine Etappen/frische Threads, Eskalation der harten 20% an Frontier.
|
| 07.08. | Gedächtnis-Sidecar Mem0 (`:8765`) samt Memory-MCP und Plugin | Hermes führt sein Gedächtnis selbst; am 27.08. restlos ausgebaut |
|
||||||
- **Devstral Small 2 ist der KRITIKER, nicht der Coder — mit hartem 16k-Deckel (25.07.).**
|
| 24.07. | ROCm-Recheck 20.–25.07. als Wiedervorlage | erledigt, Vulkan bleibt |
|
||||||
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).
|
|
||||||
|
|||||||
Reference in New Issue
Block a user