# Betriebs-Fallen — hart erarbeitet, nicht nochmal reintreten _Kuratiert 10.07.2026. Jede Falle hat hier mindestens einmal real Zeit gekostet. Neue Fallen: hier eintragen, mit Datum und Symptom._ ## Git & Deploy - **deploy.sh resettet sich SELBST mitten im Lauf.** Es macht früh `git reset --hard origin/main`; bash liest aber aus dem alten File-Descriptor weiter → neue Install-Schritte (z. B. neue `cp`-Zeilen) greifen beim ERSTEN Deploy nach der Änderung NICHT. → deploy.sh ein ZWEITES Mal laufen lassen oder Artefakte von Hand nachinstallieren. Danach IMMER verifizieren, dass die neuen Dateien/Units wirklich da sind. - **deploy.sh-enable-Zeilen können User-Entscheide zurückdrehen.** Beispiel mc2-autoupdate: „einmalig deaktiviert" wurde von jedem Deploy still re-enabled, bis die Zeile raus war. Bei Entscheiden der Form „X bleibt aus" immer deploy.sh gegenprüfen. - **Paralleler Git-Zugriff auf den Shared-Checkout:** Mehrere Agenten/Sessions arbeiten zeitweise im selben `F:\`-Verzeichnis — HEAD kann unter einem wandern, uncommittete Edits verschwinden. → Änderungen sofort committen; zum Landen auf main einen ISOLIERTEN Worktree nutzen: `git worktree add --detach origin/main` → cherry-pick → rebase → `git push origin HEAD:main` → Worktree weg. - **Gitea-Push:** nur via PowerShell/GCM (Bash-Tool scheitert an der Credential-Auth); „Failed to authenticate user" heißt oft nur „3 s warten, Retry" — Auth ist flatterhaft. Wenn der nicht-interaktive Push hart scheitert: User pusht EINMAL interaktiv, danach geht's. - **CRLF:** Box-git hat `core.autocrlf false` + `.gitattributes` erzwingt LF für `*.sh/*.service/*.timer` — sonst `pipefail\r`-Abbrüche. Windows-Pipe auf die Box: CR-Falle (`sed 's/\r$//'`). - **Stale `index.lock`** im Box-Repo nach Deploy-Abbruch: Alter prüfen, dann löschen. - **`hermes` ist über SSH nicht im PATH** → immer `bash -lc 'hermes …'`. - **Werkstatt-Orphan-Branches („refusing to merge unrelated histories"):** macht ein Worker `git init`/Shallow statt voll zu klonen, entsteht ein Branch OHNE gemeinsamen Vorfahren — Erkennungsmuster auf der Karte: **Diff „0 Dateien" + „hinter main" ≈ ganze Historie** (z. B. 386). Merge ist NIE möglich; oft ist der Inhalt obendrein Müll (~/.hermes-Dateien statt Repo-Dateien). Seit 12.07.2026 markiert das Auftragsbuch solche Karten („kein gemeinsamer Ursprung", Annehmen-Knopf weg) → ablehnen mit Grund, Idee neu in die Queue. Prävention steht in der werkstatt-SOUL (voll klonen + merge-base-Selbstcheck). - **Ehrlich-veraltete Branches (echter Merge-Konflikt):** die Annahme versucht seit 12.07.2026 automatisch einen Rebase auf main (isolierter Worktree, Gates laufen danach normal). Nur wenn AUCH der Rebase kollidiert, fällt die Karte durch — dann ablehnen und die Idee frisch einqueuen statt „am PC auflösen". ## Box / systemd / llama-swap - **User-Units über SSH:** erst `export XDG_RUNTIME_DIR=/run/user/$(id -u)`, sonst sieht `systemctl --user` nichts. - **llama-swap:** Schutz-Key heißt **`persistent:`** — `persist:` wird still ignoriert (dieser Tippfehler hat wochenlang den Verdrängungsschutz deaktiviert). `persistent` schützt NUR gegen Verdrängung, NICHT gegen ttl-Selbstentladen → **jedes brains-Mitglied braucht ttl:0.** Nach jedem Config-Reload (auch scp!) ist das Warm-Set LEER → Mini-Requests an hermes/embed(/reranker) schicken. - **`warmup.sh` liegt als Root-Kopie** unter `/usr/local/bin/llama-swap-warmup.sh` und wird vom sudo-freien deploy.sh NICHT aktualisiert → nach Änderung manuell `sudo install`. - **llama-swap NIE neustarten**, wenn es nicht sein muss (Warm-Set weg = Lucy-Latenz). - **Nie zwei ~70-GB-Benches direkt nacheinander** (OOM-Kill beim zweiten). - **Box ist deutschsprachig (de_DE):** jeder CLI-Output-Parser braucht `LC_ALL=C` (apt sagt sonst „aktualisierbar von:" statt „upgradable from:"). - **`pkill -f` über SSH matcht die eigene Remote-Shell** → Muster als `'[g]en…'` klammern. - **Deploy restartet voice-service** → Übernacht-Jobs mit STT-QA-Gate brauchen Wiederanlauf-Logik (Backoff-Retry im hear()-Pfad). ## Hermes - **Toolsets haben ZWEI Ebenen:** aktiv = NICHT in `agent.disabled_toolsets` UND in `platform_toolsets.`. api_server (Voice) hat eine bewusste Diät-Allowlist; MCP-Server sind namentlich allowlistbar (Key `mcp_servers`, snake_case). `hermes prompt-size` ist Allowlist-BLIND — echte Kontrolle nur per Live-Call. - **`MINIMUM_CONTEXT_LENGTH = 64000`:** Modelle mit kleinerem Kontext (heavy 32k, vision 32k) sind als delegate_task-Ziel tot — der Fehler kann STILL ausfallen. Fremd-Kritik deshalb via fremdblick.sh (Ein-Schuss), nie via Delegation. - **delegate_task läuft top-level IMMER background** → in `hermes -z`/Cron-Ein-Schuss stirbt das Kind mit dem Prozess. Nur langlebige Sessions (Chat/Desktop/Telegram) profitieren. - **Cron-Fallen:** kein TZ-Feld (next_run_at = System-TZ zum Anlege-Zeitpunkt; nach TZ-Wechsel `cron edit --schedule ""` zum Neuberechnen) · Prompt/Positionsargumente MÜSSEN vor die Flags · `--script` allein reicht nicht (braucht Prompt oder Skill) · Cron-Kontext hat `HERMES_CRON_SESSION=1` und `approvals.cron_mode: deny`. - **Feed-Skripte: Pipe + Heredoc gleichzeitig = Heredoc gewinnt stdin** → JSON via Temp-Datei übergeben. Außerdem ehrlichen Blind-Pfad einbauen (API kaputt → „AUSGEFALLEN", nicht „0 Funde"). - **Hooks:** Consent persistiert NUR über CLI-/Gateway-Start mit `HERMES_ACCEPT_HOOKS=1`; `hermes hooks test` schreibt die Allowlist NICHT; Skript-Änderung invalidiert Consent (mtime). - **GLM-Modelle sind Reasoning-Modelle:** content kommt NACH reasoning_content → max_tokens großzügig (fremdblick: FREMDBLICK_MAXTOK bis 4500), sonst leeres Urteil. - **Manager-Konfabulation:** Das Hirn überspringt Delegation gern „aus Bequemlichkeit" mit erfundener Begründung („worker.sh existiert nicht"). Gegenmittel: worker.log als harter Nachweis + Skill-Regel „du baust NICHT selbst" + Transcript prüfen, nie der Erzählung glauben. - **Kritiker == Worker = blinder Fleck** („benotet eigene Hausaufgaben") → Zwei-Kritiker-Gate, Urteil REPRODUZIERT-ODER-ABGELEHNT. - **stage-vor-Diff:** untracked Dateien → `git diff origin/main` leer → Kritiker prüfen NICHTS. Erst `git add -A`, dann `git diff --cached`, „Diff leer → STOPP". - **Werkstatt-Gate:** `git -C ~/mission-control-v2 status --porcelain -uno` MUSS leer sein (curl /api/health allein ist ein Loch — alter Code läuft im RAM weiter). ## Mem0 / Gedächtnis - `mem0_service/requirements.txt` ist GEPINNT (wir nutzen Interna: NoThink-Swap, Roh-Chroma) — blindes Upgrade bricht still; vorher/nachher `smoke_test.py`, Prozedur `docs/UPGRADE.md`. - Qwen3.6 ist ein Thinking-Modell: JSON-Extraktion nur mit `enable_thinking:false` (NoThinkLLM im Sidecar), sonst leere Extraktion. - **Delete-Resurrection:** gelöschter Fakt kann beim nächsten learn() wieder auftauchen, solange die Original-Nachricht in history.db liegt (mem0-Design, kein Bug). - `sync_turn` läuft im Hintergrund → in kurzlebigen Prozessen (`hermes -z`) verpufft das Lernen; nur langlebige Sessions lernen zuverlässig. - Frontend: `reagraph` auf 4.22.0 gepinnt (4.23+ zieht React 19 → Crash). ## Lucy / Windows-PC - **file://-Fallen im Electron-Build:** Asset-Pfade relativ; `import()` verzeiht KEINE relativen Prefixe (onnxruntime-WASM brauchte `new URL("vad/", document.baseURI)`) — fetch täuscht, import() nicht. - **Lucy IMMER über `Lucy-Neustart.bat` neu starten** — hartes Kill hinterlässt pocket_server-Waisen auf :8130 („Stimme startet nicht"); die BATs killen Waisen mit. - `LUCY_WORKERS=2` (User-Env) — 4 Worker = ~4×1,9 GB Stimm-Modell-Kopien. - Gerade `"` in config.ts-Prompt-Strings zerschießen den String → immer „…" nutzen. - Zustands-Features IMMER mit sichtbarem Zustand + Sofort-Feedback bauen — der User testet blind per Produkt-Gefühl. - **Executor-Task** `HermesPCExecutor` läuft aus dem Repo mit pythonw → nach executor.py-Änderung Task neu starten; Logs in `%LOCALAPPDATA%\HermesPCExecutor\`. - **`Start-Process -ArgumentList` quotet NICHT** (PS 5.1): Elemente werden mit Leerzeichen zusammengefügt — ein Pfad wie `F:\Coding Stuff\…` zerbricht, die gespawnte powershell stirbt STILL (kein Fenster, kein Log). → Anführungszeichen ins Element einbetten: `'-File','"F:\Coding Stuff\…\skript.ps1"'`. Kostete den ersten Lucy-Annahme-Lauf (12.07.). - **`\"` in f-String-AUSDRÜCKEN ist seit Python 3.12 ein SyntaxError** (Alt-Stil `f"{d.get(\"x\")}"` lief nur pre-3.12; Box hat 3.14). In bash-eingebetteten `python3 -c '…'`-Snippets braucht es die Escapes eh nicht (single-quoted) — Werte vorab in Variablen ziehen statt Quote-Akrobatik. Kostete denselben Lauf (Poll parste nie). - **pythonw + subprocess ohne `CREATE_NO_WINDOW`** = jedes gespawnte Konsolenprogramm bekommt ein SICHTBARES Fenster (Executor-Polling blitzte im 10-s-Takt auf dem Desktop). - **MSIX-Sandbox-Falle (Claude-Desktop-Tools):** Tools der Claude-App laufen im MSIX-Container — Writes nach `AppData\Local\` landen in `AppData\Local\Packages\Claude_*\LocalCache\` (Merge-Read täuscht!). Windows-Apps NIE über Agent-Tools nach AppData installieren/verwalten; Installer startet der USER per Doppelklick. Die Packages-Kopie ist KEINE Dublette, sondern die virtualisierte echte Install. - **Hermes Desktop:** NIE „Update / Repair install" klicken (pullt main, desynchronisiert das Runtime-Repo → Boot-Fehler). Bei „tot": `git status -uno` im Runtime-Repo; Fehler stehen in `logs/bootstrap-*.log`, nicht in desktop.log. ## Colab / Training (Mini-Stimme) - Live-Drive-Sync JE Epoche einbauen (Session-Tod frisst sonst das Training). - Notebook-Zellen vor Abgabe ast-prüfen; Colab-Patches nie durch Shell-Heredocs. - **QA-Gate für synthetische Datensätze:** jeden Clip durch STT-Roundtrip — der ungeprüfte XTTS-Datensatz war komplett unbrauchbar (sogar whisper-medium verstand ihn falsch). - Kokoro-Output peakt >1.0 → Peak-Normalisierung 0.95 + Onset-Trim/Fade-In gehören in JEDE künftige KokoroTtsEngine.