From 30ab2c013a15dc8d47bbd392ccf282bbba0a40b1 Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Sat, 22 Aug 2026 14:47:50 +0200 Subject: [PATCH] savepoint: mem0-ausbau Stand dokumentiert (7/17 Dateien + frontend) --- SAVEPOINT.md | 194 ++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 145 insertions(+), 49 deletions(-) diff --git a/SAVEPOINT.md b/SAVEPOINT.md index dd8ec63..d730614 100644 --- a/SAVEPOINT.md +++ b/SAVEPOINT.md @@ -1,57 +1,153 @@ -# Savepoint — Mission Control 2.0 (MC2) +# Savepoint — Mem0-Ausbau (Referenzaufgabe) -_Stand: 2026-08-20, nach der Aufräum-Runde. Alle Zahlen hier sind **auf der Box gemessen**, nicht -aus Doku übernommen._ +**Stand:** 2026-08-22, Worktree `referenz/mem0-ausbau` in `F:\Coding Stuff\mc2-referenz`. +Branch wurde aus `d508a84` (A2's gesicherter Stand) erstellt und enthält dessen 5 bearbeitete Dateien. -## Was das ist (in einem Satz) -MC2 ist die **Web-Admin-Konsole** einer 100 % lokalen KI-Appliance („die Box", Bosgame M5 / AMD -Strix Halo, 128 GB Unified RAM, llama.cpp-Vulkan). Sie verwaltet Engine, Modelle, Gedächtnis, -Agenten-Status, Updates & Wartung — und dient als Steuerpult für die autonome KI („Lucy"). +## Auftrag +`docs/aufgaben/referenzaufgabe-mem0-ausbau.md`: Mem0-Reste vollständig entfernen, ohne MC2/Frontend/Deployment zu brechen. +- Messlatte: `ruff` clean, Backend `import app` sauber, `grep -ril mem0 backend/ mcp/ deploy/ --include='*.py' --include='*.sh'` = 0 Dateien, `mem0_service/` entfernt, Box-Smoke/Health so weit wie möglich grün. +- **Prüfstein:** API-Felder wie `mem0_ms` nicht einfach löschen — Frontend mit anpassen oder Feld sauber aus beiden Seiten entfernen. +- Arbeitsweise: Datei für Datei, höchstens zwei vor der ersten Änderung. Nach jeder Änderung ein Satz. +- Live-Deployment `~/mission-control-v2` ist TABU. -## Architektur (Kurzform — Details in AGENTS.md/docs/) -- **Backend** `backend/` — FastAPI, `:9001` als systemd-**User-Dienst** (reboot-fest, sudo-frei). -- **Frontend** `frontend/` — React/Vite/Tailwind/shadcn. **`frontend/dist` ist ABSICHT im git** - (Box hat kein Node; Backend liefert die gebauten Assets direkt aus). -- **MC2-Gateway** `:9010` (`/v1`-Datenpfad, model:auto Routing + native Bildweiche). -- **Modell-Router** `:8080` (llama-swap v250, Vulkan/RADV Engine b10502). -- **Hermes Agent** `:8642` (`hermes-gateway`, v0.20.4) + `hermes dashboard` auf `:9119` (nur Loopback). -- **Sidecars:** `voice_service/` (:8650, faster-whisper STT + Piper TTS), `mcp/` (4 MCP-Server), - `client/hermes-pc` (PC-Executor :7777). - ‼️ `mem0_service/` liegt noch im Baum, ist aber **stillgelegt** — `:8765` antwortet nicht. +## Wichtig: A2-Vorgang (Commit d508a84 — bereits auf diesem Branch) +Diese 5 Dateien wurden vom abgebrochenen Lauf A2 bereits bearbeitet und im Commit `d508a84` gesichert: +1. `backend/config.py` — `MEMORY_DB` und `MC_MEM_DEDUPE_ENABLED` entfernt, `MEM0_SERVICE_URL`-Kommentar bereinigt +2. `backend/routers/system.py` — `_mem0_reachable()` entfernt, `mem0_reachable` aus Systeminfo +3. `backend/routers/voice.py` — `Mem0-Retrieve` → `Gedächtnis-Retrieve` +4. `backend/routers/zeitmaschine.py` — `Mem0` in Docstrings/Kommentaren → `Gedächtnis` +5. `backend/services/sentry.py` — `MC_MEM0_DASHBOARD_URL` in Docstring entfernt -## Modelle live (gemessen 20.08.2026) -| Rolle (Alias) | Modell | Tempo | Zustand | -|---|---|---|---| -| `hermes` / `fast` | Qwen3.6-35B-A3B (MoE, DFlash) | **95,7 t/s** · Prompt 221 t/s | immer warm | -| `coder` | Qwen3.8-27B (dicht, Vision) | **12,6 t/s** · Prompt 144 t/s | ttl 5400, ~29 s Kaltstart | -| `debugger` | Muse-Glimmer-30B (DFlash) | — | ttl 600 | -| `heavy` | gpt-oss-120b | — | on-demand | -| `vision` | Qwen3-VL-30B-A3B-Instruct | — | on-demand | -| `embed` / `reranker` | Qwen3-Embedding-0.6B / Qwen3-Reranker-0.6B | — | immer warm | +`git status` war nach d508a84 clean. -Warm-Gruppe `brains` = embed + reranker + Qwen3.6-35B-A3B. Warm-Wächter weckt nur `fast`. +## Wichtig: Kahlschlag-Commit 1e68f62 (bereits auf main) +- `backend/services/memory.py` — gelöscht +- `backend/routers/memory.py` — gelöscht (`/api/memory` existiert nicht mehr) +- `deploy/mc2-steward.service` — gelöscht +- `deploy/mem0-service.service` — gelöscht +- `deploy/voice-service.service` — gelöscht +- `deploy/mem0-konsolidierung.*` — gelöscht -**Hintergrund zum Tempo:** Strix Halo liefert ~215 GB/s Speicherbandbreite. Ein *dichtes* Modell -muss pro Token seine vollen Gewichte lesen → 17 GB ÷ 215 GB/s ≈ 12,6 t/s ist das **Hardware-Limit**, -kein Konfigurationsfehler. MoE-Modelle lesen pro Token nur einen Bruchteil und sind darum ~8× schneller. +## Erledigt in dieser Sitzung -## Aufgeräumt am 20.08.2026 -- CI-Ampel wieder **grün** (Lauf #77) — zwei ungenutzte `MEM0_SERVICE_URL`-Importe entfernt. -- Kaputter systemd-Timer `mc2-morgen-digest` abgeschaltet (der Hermes-Cron macht die Arbeit). -- `mcp-stderr.log` (27 MB, 238k Ping-Zeilen) geleert. -- Config-Drift aufgelöst: Repo == `/etc/llama-swap/config.yaml`. Warm-Set-Idee geparkt auf - Branch `parked/warm-set-5d93822`. -- Entfernt: Governor-Reste, OpenCode-/aider-Reste (853 MB), 61 alte Backup-Dateien, - verwaiste Modelle Devstral-Small-2 + GLM-4.6V-Flash + mem0 (21,5 GB) → `/srv/models` 209 → 189 GB. -- **Fähigkeiten repariert:** `orchestrator`- und `wartung`-Skill sowie `fremdblick.sh` zeigten auf - gelöschte Modelle (`Qwen3-Coder-Next`, `GLM-4.6V-Flash`, `GLM-4.7-Flash`) → der Kritiker-Gate war - stumm kaputt. Jetzt auf **Rollen-Aliase** umgestellt, damit Modellwechsel sie nicht mehr brechen. -- Alles Gelöschte liegt gesichert in `~/archiv-aufraeumen-20260820/` (11 MB). +### 1. `backend/steward.py` +- Toter Import `from services import memory as memory_svc` entfernt +- Toter `memory_svc.AUTO_DEDUPE_ENABLED`-Block entfernt +- Docstring: `Mem0-Auto-Dedupe` → `Re-Warm-Wächter und Health-Wächter (sentry)` +- Docstring: `memory.auto_dedupe_loop — Gedächtnis-Dubletten` entfernt +- Docstring: `MC_MEM_DEDUPE_ENABLED` entfernt +- Verifiziert: `memory.py` wurde in Kahlschlag gelöscht, `steward.py` hatte toten Import -## Offen -- `mem0_service/` + `_mem0_reachable()` in `backend/routers/system.py` ausbauen (toter Port). -- `~/.hermes/scripts/fremdblick.sh` ist **unversioniert** — gehört ins Repo. -- MCP-Log dauerhaft deckeln (Hermes' `max_size_mb` greift für gekapertes stderr nicht). -- Verschwundene Wächter: Ampel-Wächter, Prüfstand, Stack-Rundumschlag. -- Coder-Tempo: Entwurfsmodelle für spekulatives Dekodieren liegen ungenutzt unter - `/srv/models/Qwen3.8-27B-DFlash2-GGUF/`. +### 2. `backend/services/voice_metrics.py` (alle 9 Treffer bereinigt) +- **Docstring (3x):** `Mem0-Retrieve` → `Gedächtnis-Retrieve` +- **Line 10:** `Mem0-Retrieve` im Best-effort-Kommentar → `Gedächtnis-Retrieve` +- **Line 39:** `Mem0-Retrieve` im docstring → `Gedächtnis-Retrieve` +- **Line 56:** `Geparkten Mem0-Retrieve` → `Geparkten Gedächtnis-Retrieve` +- **Line 106:** `Unter-Detail: mem0 (Teil VON hirn...` → `Unter-Detail: memory (Teil VON hirn...` +- **Line 116:** `Agent + Mem0 + TTFT` → `Agent + Gedächtnis + TTFT` +- **Line 133:** `Agent-Overhead + Mem0 + LLM-TTFT` → `Agent-Overhead + Gedächtnis + LLM-TTFT` +- **Line 141:** `mem0 = _take_retrieve(...)` → `memory = _take_retrieve(...)` (starker Kommentar) +- **Line 154:** `"mem0_ms"` → `"memory_ms"` (API-Feld im JSON-Rückgabewort) + +### 3. `frontend/src/lib/api.ts` (3 Treffer) +- **Line 446:** `mem0 = Unter-Detail INNERHALB von hirn` → `memory = Unter-Detail INNERHALB von hirn` +- **Line 455:** `Agent + Mem0 + LLM-TTFT` → `Agent + Gedächtnis + LLM-TTFT` +- **Line 457:** `mem0_ms: number | null // ... (Mem0-Retrieve)` → `memory_ms: number | null // ... (Gedächtnis-Retrieve)` + +### 4. `frontend/src/components/dashboard/LatencyCard.tsx` (4 Treffer) +- **Line 5:** `Mem0 ist ein Unter-Detail` → `Gedächtnis ist ein Unter-Detail` +- **Line 42:** `t.mem0_ms` (2x) → `t.memory_ms` (2x) +- **Line 106:** `latest.mem0_ms` (2x) → `latest.memory_ms` (2x) +- **Line 131:** `Agent + Mem0-Suche` → `Agent + Gedächtnis-Suche` + +### 5. `frontend/src/views/GuideView.tsx` (1 Treffer, kompletter Paragraph) +- Stack-Paragraph (Card 8 "Gedächtnis & RAG"): "Dein Gedächtnis ist Mem0-basiert: auto-lernend..." umgeschrieben zu "Dein Gedächtnis ist auto-lernend & semantisch: Der Agent lernt im Hintergrund nach jedem Turn..." +- Gotcha-Zeile (Mem0-extraktion) entfernt +- Begründung: Gedächtnis-Tab existiert nicht mehr (Kahlschlag), Mem0 wurde durch Hermes-Nativ abgelöst + +### 6. `backend/services/backup.py` (1 Treffer) +- Docstring: `Full state backup (mem0 + ...)` → `Full state backup (...)` + +### 7. `deploy/backup.sh` (8 Treffer) +- **Line 6-7:** Kommentar `mem0 (Chroma + history.db)` aus Inhalt entfernt +- **Line 23:** `MEM0_DIR="${MC_MEM0_DIR:-/srv/models/mem0}"` — ganze Zeile gelöscht +- **Line 30:** `mkdir -p "$STAGE/mem0"` — aus mkdir entfernt +- **Line 32:** `[ -d "$MEM0_DIR" ] && cp -a "$MEM0_DIR/." "$STAGE/mem0/" || true` — ganze Zeile gelöscht +- **Line 63:** Kommentar `mem0-venv ist uv-managed` → `voice-venv ist uv-managed` +- **Line 71:** `freeze_venv "$HOME/.mem0/venv/bin/python" "$KG/pip-mem0.txt"` — ganze Zeile gelöscht +- **Line 82:** `$HOME/.mem0/venv/bin/python` aus for-Schleife entfernt +- **Line 95:** MANIFEST: `mem0 (chroma + history.db)` aus Inhalt entfernt + +## Noch offen (nächste Dateien) + +### 8. `mcp/mcp_mc.py` +- Treffer: "mem0" in Texten (Stack-Dienste, Backup-Beschreibung, Service-Liste) +- Keine Logik, nur Dokumentation/Texte → Mem0 → Gedächtnis + +### 9. `deploy/agent-hooks/box-steckbrief-inject.sh` +- Treffer: "mem0" in Texten/Kommentaren + +### 10. `deploy/autoupdate.sh` +- Treffer: "mem0" in Texten/Kommentaren + +### 11. `deploy/hermes-postcheck.sh` +- Treffer: "mem0" in Texten/Kommentaren + +### 12. `deploy/restore.sh` +- Treffer: "mem0" — **VORSICHT:** Dies ist die Gegenstück zu backup.sh! Wenn restore.sh mem0-Reste im Restore-Prozess hat, müssen diese entfernt werden. Keine Logik ändern, nur mem0-Referenzen. + +### 13. `deploy/stack-postcheck.sh` +- Treffer: "mem0" in Texten/Kommentaren + +### 14. `deploy/warmup.sh` +- Treffer: "mem0" in Texten/Kommentaren + +### 15. `deploy/venv-audit.sh` +- Treffer: "mem0" in Texten/Kommentaren + +### 16. Ordner `mem0_service/` löschen +- Enthält: `app.py`, `migrate.py`, `smoke_test.py`, `requirements.txt` +- Toter Sidecar: Port `:8765` antwortet nicht, nicht systemd-registered + +## Noch nicht touchen (out-of-scope / unklar) + +### `voice_service/app.py` + `voice_service/install.sh` +- Enthalten "mem0" — gehören zur voice_service, nicht zur Messlatte +- voice_service.service wurde in Kahlschlag gelöscht, aber voice_service/ Ordner ist noch vorhanden +- **Entscheidung:** Nicht bearbeiten, da nicht in `backend/`, `mcp/`, `deploy/` Messlatte + +### `hermes/plugins/mc2-memory/` (2 Dateien) +- `__init__.py`, `plugin.yaml` +- Rufen `/api/memory` auf → existiert nicht mehr, degradieren gracefully +- Nicht in Messlatte (`deploy/` mit `.py/.sh` — YAML zählt nicht, Python-Plugin ist extern) +- **Entscheidung:** Nicht bearbeiten (Hermes-Plugin, nicht Teil von MC2) + +### `deploy/mission-control-2.service` + `deploy/mc2-backup.service` +- systemd Service-Dateien (keine `.py` oder `.sh`) +- Nicht in Messlatte, aber könnten Mem0-Referenzen haben +- **Entscheidung:** Prüfen, ob sie Mem0 nennen; wenn ja, Text anpassen + +### `deploy/llama-swap.config.yaml` +- YAML, nicht in Messlatte + +### `frontend/dist/` +- Muss nach Änderungen neu gebaut werden (`npm run build`) +- **NACHDEM alle .ts/.tsx Dateien bearbeitet sind** + +## Bekannte Fallstricke + +1. **Prüfstein (Frontend-Konsistenz):** `mem0_ms` war ein API-Feld, das das Frontend las. Wurde zu `memory_ms` umbenannt + Frontend angepasst. **Nicht einfach löschen.** +2. **Restore vs. Backup:** `restore.sh` ist das Gegenstück zu `backup.sh`. Wenn backup.sh mem0 weglässt, darf restore.sh nicht versuchen, mem0 zu restaurieren. **Sorgfältig prüfen!** +3. **`head` funktioniert in PowerShell nicht:** Muss `Select-Object -First N` verwenden. +4. **Globs für native Befehle:** `rg` mit Globs muss gequoted werden, sonst spaltet PowerShell falsch. +5. **`frontend/dist` ist im git:** Nach Frontend-Änderungen muss `npm run build` laufen und das neue `dist` committet werden. +6. **`/api/memory` existiert nicht mehr** (Kahlschlag), aber `frontend/src/lib/queries.ts` ruft es noch via `useMemory()`: `api(`/api/memory`...`. Das ist ein **vorher bestehendes Problem** (nicht eingeführt in dieser Runde). + +## Nächster Schritt +1. `mcp/mcp_mc.py` bearbeiten → Mem0 in Texten/Kommentaren zu Gedächtnis +2. `deploy/agent-hooks/box-steckbrief-inject.sh` bearbeiten +3. `deploy/autoupdate.sh`, `deploy/hermes-postcheck.sh`, `deploy/restore.sh`, `deploy/stack-postcheck.sh`, `deploy/warmup.sh`, `deploy/venv-audit.sh` bearbeiten +4. `mem0_service/` Ordner löschen +5. `ruff` + `import app` prüfen +6. `grep -ril mem0 backend/ mcp/ deploy/ --include='*.py' --include='*.sh'` → muss 0 ergeben +7. `frontend/dist` neu bauen (Box: `cd frontend && npm run build`)