doku: Wissen auf den Box-Wart-Stand (STACK, VERDIKTE, FALLEN, ARBEITSWEISE, OFFENE-FAEDEN)

- STACK.md: Stand 24.09. - Dienste mit Zustand (Konsole und Spracherkennung schlafen), Units im
  Repo und nur auf der Box, Modelltabelle aus der Config vom 24.09. (Hirn, Coder, zwei
  Bild-Zwillinge, brains mit exclusive: false), Hermes v0.21.4 mit MCP-Stand nach der Diaet,
  vollstaendiger Automatik-Fahrplan (Timer, Hermes-Crons, NerdQuiz 03:00), Coding-Bahn
  OpenChamber, Sicherheit in einem Satz.
- VERDIKTE.md: Box-Wart-Verdikte vom 23./24.09. ergaenzt (Umbau statt Neubau, zwei Instanzen,
  Homelab-Rechte und -Updates, keine Anmeldung, Nachtruhe, Timer, Box-Diaet, Radar-Leitplanken,
  Bild-Zwillinge, exclusive: false); Ueberholtes in eine Tabelle "Ueberholt (mit Datum)";
  Formatfehler (Zeilen mit "|-") beseitigt.
- FALLEN.md: neue Fallen (Persistent=true, Abzug ueberschreibt lebende Config, Jobs sterben bei
  MC2-Neustart, exclusive, Draft+Bild=500, Hermes-Cron als Updater, write_file, web_extract,
  Gitea-SSH-Benutzer); Werkstatt-, Kritiker-, Delegations- und Desktop-Fallen gestrichen.
- ARBEITSWEISE.md mit GRENZEN.md zusammengelegt; Flaechen-Tabelle fuer Box-Wart, Homelab-Teil,
  Lucy, Hermes, Telegram, OpenChamber, Android-App.
- OFFENE-FAEDEN.md neu: Phasen 0-5 laut Plan (Phase 1 laeuft, Oberflaeche und Doku offen) und
  13 offene Einzelpunkte, alle am Code in main belegt.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-09-24 15:38:10 +02:00
co-authored by Claude Opus 5.5
parent 59631601b9
commit 24e6dd81ba
6 changed files with 509 additions and 488 deletions
+116 -127
View File
@@ -1,140 +1,129 @@
# Betriebs-Fallen — hart erarbeitet, nicht nochmal reintreten
_Kuratiert 10.07.2026. Jede Falle hat hier mindestens einmal real Zeit gekostet.
Neue Fallen: hier eintragen, mit Datum und Symptom._
_Stand 24.09.2026. Jede Falle hat mindestens einmal real Zeit gekostet. Neue Fallen hier eintragen, mit Datum
und Symptom; Erledigtes streichen (die Git-Historie behält es)._
## Git & Deploy
## Git und Deploy
- **deploy.sh resettet sich SELBST mitten im Lauf.** Es macht früh `git reset --hard
origin/main`; bash liest aber aus dem alten File-Descriptor weiter → neue Install-Schritte
(z. B. neue `cp`-Zeilen) greifen beim ERSTEN Deploy nach der Änderung NICHT.
→ deploy.sh ein ZWEITES Mal laufen lassen oder Artefakte von Hand nachinstallieren.
Danach IMMER verifizieren, dass die neuen Dateien/Units wirklich da sind.
- **deploy.sh-enable-Zeilen können User-Entscheide zurückdrehen.** Beispiel mc2-autoupdate:
„einmalig deaktiviert" wurde von jedem Deploy still re-enabled, bis die Zeile raus war.
Bei Entscheiden der Form „X bleibt aus" immer deploy.sh gegenprüfen.
- **Paralleler Git-Zugriff auf den Shared-Checkout:** Mehrere Agenten/Sessions arbeiten
zeitweise im selben `F:\`-Verzeichnis — HEAD kann unter einem wandern, uncommittete Edits
verschwinden. → Änderungen sofort committen; zum Landen auf main einen ISOLIERTEN Worktree
nutzen: `git worktree add --detach <tmp> origin/main` → cherry-pick → rebase →
`git push origin HEAD:main` → Worktree weg.
- **Gitea-Push:** nur via PowerShell/GCM (Bash-Tool scheitert an der Credential-Auth);
„Failed to authenticate user" heißt oft nur „3 s warten, Retry" — Auth ist flatterhaft.
Wenn der nicht-interaktive Push hart scheitert: User pusht EINMAL interaktiv, danach geht's.
- **CRLF:** Box-git hat `core.autocrlf false` + `.gitattributes` erzwingt LF für
`*.sh/*.service/*.timer` — sonst `pipefail\r`-Abbrüche. Windows-Pipe auf die Box:
CR-Falle (`sed 's/\r$//'`).
- **Stale `index.lock`** im Box-Repo nach Deploy-Abbruch: Alter prüfen, dann löschen.
- **`hermes` ist über SSH nicht im PATH** → immer `bash -lc 'hermes …'`.
- **Werkstatt-Orphan-Branches („refusing to merge unrelated histories"):** macht ein
Worker `git init`/Shallow statt voll zu klonen, entsteht ein Branch OHNE gemeinsamen
Vorfahren — Erkennungsmuster auf der Karte: **Diff „0 Dateien" + „hinter main" ≈ ganze
Historie** (z. B. 386). Merge ist NIE möglich; oft ist der Inhalt obendrein Müll
(~/.hermes-Dateien statt Repo-Dateien). (Historisch: das Auftragsbuch markierte solche Branches; es ist seit 04.09.2026
ausgebaut.) Erkennung heute: `git merge-base main <branch>` leer → Branch verwerfen. Prävention steht in der werkstatt-SOUL (voll klonen + merge-base-Selbstcheck).
- **Ehrlich-veraltete Branches (echter Merge-Konflikt):** vor dem Merge `git rebase main`
auf dem Branch; kollidiert auch das, Branch verwerfen und die Idee frisch aufsetzen.
- **Timer mit `Persistent=true` holen verpasste Läufe beim ersten Einschalten sofort nach (24.09.).**
`mc2-autoupdate.timer` war seit August aus; beim `enable --now` lief der Sonntagslauf an einem Donnerstag um 14:51
und startete die Box neu. Seitdem startet `autoupdate.sh` die Box nur So 04:00–06:59 neu, und `deploy.sh` startet
den Timer nur, wenn er nicht schon läuft.
- **Wer den llama-swap-Abzug im Repo ändert, überschreibt beim Deploy die lebende Config komplett (24.09.).**
Was Oberfläche oder Radar seitdem eingetragen haben, ist dann weg (Sicherung: `/etc/llama-swap/config.yaml.bak-*`,
die letzten 5). Vorher `diff /etc/llama-swap/config.yaml deploy/llama-swap.config.yaml` und den lebenden Stand ins
Repo holen. `MC_DEPLOY_SKIP_SWAP_CONFIG=1` lässt die Config ganz in Ruhe. Bis 24.09. überschrieb jeder Deploy sie
bei jeder Abweichung und startete den Motor neu.
- **Ein Neustart von MC2 bricht laufende Update- und Download-Jobs ab (24.09.).** Sie leben im MC2-Prozess.
`deploy.sh` verschiebt den Deploy deshalb, solange ein Job läuft (`MC_DEPLOY_TROTZDEM=1` erzwingt).
- **`deploy.sh` schaltet alles in `AKTIV` wieder ein.** Wer einen Dienst oder Timer dauerhaft aus haben will, nimmt
ihn dort heraus, sonst dreht der nächste Deploy den User-Entscheid zurück (mit `mc2-autoupdate` schon passiert).
Schlafende Units (`box-console`, `voice-service`) stehen nur in `UNITS`.
- **Den Box-Checkout nie von Hand ändern.** Stufe 1 holt `main` nur per fast-forward; geänderte oder eigene Commits im
Checkout lassen den Deploy scheitern, bevor er etwas umstellt.
- **Paralleler Git-Zugriff auf den geteilten Checkout am PC:** Mehrere Agenten arbeiten zeitweise im selben
`F:\`-Verzeichnis, HEAD kann wandern. Änderungen sofort committen; zum Landen einen isolierten Worktree nutzen
(`git worktree add --detach <tmp> origin/main` → cherry-pick → `git push origin HEAD:main` → Worktree weg).
- **Gitea-SSH: Benutzer `gitea`, nicht `git`, Port 2222 (21.08.).** Mit `git@` kommt nur
`Permission denied (publickey)`, der Grund steht nur im Gitea-Log. Bei vielen Schlüsseln am PC `IdentitiesOnly yes`
setzen, sonst bricht Gitea vorher ab. Bei Aussetzern: Push mit Retry.
- **Repo-Name aus der Remote-URL, nicht aus dem Ordnernamen (21.08.):** lokal `mission-control-2`, auf Gitea
`mission-control-v2` (`deploy/push-und-sync.ps1` liest die URL).
- **CRLF:** `.gitattributes` erzwingt LF für `*.sh`, `*.service`, `*.timer` und `deploy/**/*.py`, sonst bricht bash an
`pipefail\r`. Was per Pipe vom Windows-PC auf die Box geht: `sed 's/\r$//'`.
- **Stale `index.lock`** im Box-Repo nach einem abgebrochenen Deploy: Alter prüfen, dann löschen.
- **Veraltete Branches mit echtem Konflikt:** vor dem Merge `git rebase main`; kollidiert auch das, Branch verwerfen
und neu aufsetzen.
- **Untracked Dateien fehlen in `git diff`:** Wer Änderungen prüfen lässt, erst `git add -A`, dann `git diff --cached`.
## Box / systemd / llama-swap
## Box, systemd, llama-swap
- **User-Units über SSH:** erst `export XDG_RUNTIME_DIR=/run/user/$(id -u)`, sonst sieht
`systemctl --user` nichts.
- **llama-swap:** Schutz-Key heißt **`persistent:`** — `persist:` wird still ignoriert
(dieser Tippfehler hat wochenlang den Verdrängungsschutz deaktiviert). `persistent`
schützt NUR gegen Verdrängung, NICHT gegen ttl-Selbstentladen → **jedes brains-Mitglied
braucht ttl:0.** Nach jedem Config-Reload (auch scp!) ist das Warm-Set LEER → Mini-Requests
an hermes/embed(/reranker) schicken.
- **`warmup.sh` liegt als Root-Kopie** unter `/usr/local/bin/llama-swap-warmup.sh` und wird
vom sudo-freien deploy.sh NICHT aktualisiert → nach Änderung manuell `sudo install`.
- **llama-swap NIE neustarten**, wenn es nicht sein muss (Warm-Set weg = Lucy-Latenz).
- **Nie zwei ~70-GB-Benches direkt nacheinander** (OOM-Kill beim zweiten).
- **Box ist deutschsprachig (de_DE):** jeder CLI-Output-Parser braucht `LC_ALL=C`
(apt sagt sonst „aktualisierbar von:" statt „upgradable from:").
- **`pkill -f` über SSH matcht die eigene Remote-Shell** → Muster als `'[g]en…'` klammern.
- **Deploy restartet voice-service** → Übernacht-Jobs mit STT-QA-Gate brauchen
Wiederanlauf-Logik (Backoff-Retry im hear()-Pfad).
- **llama.cpp streicht Flags ohne Vorwarnung:** `--no-mmap` gibt es seit b10936 nicht mehr
(`error: invalid argument`) → JEDES Modell stirbt 2 s nach dem Start, llama-swap meldet nur
„upstream command exited prematurely", der Stack-Check nur „rot". Ersatz: `--load-mode none`
(gleiche Leistung, gemessen 17.09.2026: Coder 32 t/s, Hirn 85 t/s). Vor einem Engine-Sprung
jede Config-Kommandozeile mit dem neuen `llama-server` parsen lassen (Port 5899, `timeout 6`,
`${PORT}` ersetzen) — Argumentfehler kommen sofort, vor dem Laden.
- **User-Units über SSH:** erst `export XDG_RUNTIME_DIR=/run/user/$(id -u)`, sonst sieht `systemctl --user` nichts.
- **Ohne `exclusive: false` ist eine llama-swap-Gruppe exklusiv (24.09.).** Jede Anfrage ans Hirn entlud den Coder
samt Prompt-Cache; OpenChamber rechnete danach den ganzen Vorlauf neu.
- **Draft und Bild in einem `llama-server` ergeben HTTP 500 (04.09., bestätigt 24.09.):** „failed to process
speculative batch", geprüft mit b11057 und b11157, auch mit `speculative.n_max=0` je Anfrage. Lösung:
Bild-Zwillinge ohne Draft.
- **llama-swap versteht nur `persistent:`**, `persist:` ignoriert es still (MC2 liest `persist`, deshalb stehen beide
in der Config). `persistent` schützt nur vor Verdrängung, nicht vor dem ttl-Entladen: Warm-Mitglieder brauchen
`ttl: 0`. Nach jedem Config-Reload ist alles entladen; der Steward wärmt das Hirn nach.
- **`warmup.sh` liegt als Root-Kopie** unter `/usr/local/bin/llama-swap-warmup.sh`; `deploy.sh` aktualisiert sie nicht.
Nach einer Änderung: `sudo install -m 0755 deploy/warmup.sh /usr/local/bin/llama-swap-warmup.sh`.
- **llama-swap nie ohne Not neu starten:** Alle Modelle sind danach entladen, Lucy antwortet langsam.
- **Nie zwei ~70-GB-Messungen direkt nacheinander** (OOM-Kill beim zweiten).
- **llama.cpp streicht Flags ohne Vorwarnung (17.09.):** `--no-mmap` gibt es seit b10936 nicht mehr; jedes Modell
stirbt 2 s nach dem Start, llama-swap meldet nur „upstream command exited prematurely". Ersatz: `--load-mode none`.
Vor einem Engine-Sprung jede Config-Kommandozeile mit dem neuen `llama-server` parsen lassen (Port 5899,
`timeout 6`, `${PORT}` ersetzen).
- **Die Box ist deutschsprachig (de_DE):** Parser von CLI-Ausgaben brauchen `LC_ALL=C` (apt sagt sonst
„aktualisierbar von:").
- **`pkill -f` über SSH trifft die eigene Remote-Shell** → Muster klammern (`'[g]en…'`).
- **Einmal-Dienste hinter Timern fallen still aus (07.–23.09.):** `projekte-sync` scheiterte 16 Tage lang stündlich an
einem leeren Gitea-Repo, niemand merkte es. Seit 23.09. meldet der Wächter gescheiterte Timer-Läufe.
## Hermes
- **Toolsets haben ZWEI Ebenen:** aktiv = NICHT in `agent.disabled_toolsets` UND in
`platform_toolsets.<platform>`. 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 "<gleich>"` zum Neuberechnen) · Prompt/Positionsargumente
MÜSSEN vor die Flags · `--script` allein reicht nicht (braucht Prompt oder Skill) ·
Cron-Kontext hat `HERMES_CRON_SESSION=1` (`approvals.cron_mode` ist seit dem KISS-Umbau `auto`, nicht mehr `deny`).
- **Feed-Skripte: Pipe + Heredoc gleichzeitig = Heredoc gewinnt stdin** → JSON via Temp-Datei
übergeben. Außerdem ehrlichen Blind-Pfad einbauen (API kaputt → „AUSGEFALLEN", nicht „0 Funde").
- **Hooks:** Consent persistiert NUR über CLI-/Gateway-Start mit `HERMES_ACCEPT_HOOKS=1`;
`hermes hooks test` schreibt die Allowlist NICHT; Skript-Änderung invalidiert Consent (mtime).
- **GLM-Modelle sind Reasoning-Modelle:** content kommt NACH reasoning_content →
max_tokens großzügig (fremdblick: FREMDBLICK_MAXTOK bis 4500), sonst leeres Urteil.
- **Manager-Konfabulation:** Das Hirn überspringt Delegation gern „aus Bequemlichkeit" mit
erfundener Begründung („worker.sh existiert nicht"). Gegenmittel: worker.log als harter
Nachweis + Skill-Regel „du baust NICHT selbst" + Transcript prüfen, nie der Erzählung glauben.
- **Kritiker == Worker = blinder Fleck** („benotet eigene Hausaufgaben") → Zwei-Kritiker-Gate,
Urteil REPRODUZIERT-ODER-ABGELEHNT.
- **stage-vor-Diff:** untracked Dateien → `git diff origin/main` leer → Kritiker prüfen NICHTS.
Erst `git add -A`, dann `git diff --cached`, „Diff leer → STOPP".
- **Werkstatt-Gate:** `git -C ~/mission-control-v2 status --porcelain -uno` MUSS leer sein
(curl /api/health allein ist ein Loch — alter Code läuft im RAM weiter).
- **`hermes update` meldet Exit 1 trotz Erfolg:** nach seinem eigenen Gateway-Neustart erwartet es
Zeilen vom „Fleet version check"; unter systemd kommen keine → Exit 1 (#93406). Der MC2-Job
bricht dann die `&&`-Kette ab (kein doctor, UI ohne `/hermes-ui/`-Basis), autoupdate.sh rollt
zurück und PINNT — obwohl der Gehirn-Check grün war (06. und 17.09.2026). Deshalb
`--no-gateway-restart`: Neustart und Urteil gehören dem Job. Pins stehen in
`/srv/models/mc2-pins.json` und werden NUR von Hand gelöst — gepinnt = still eingefroren.
- **Ein Updater darf nicht als Kind von Hermes laufen (20.09.).** Der Hermes-Cron „Updates am Sonntag" startete beim
Hermes-Update das eigene Gateway neu: 180 s Drain, dann Exit FAILURE. Seit 24.09. läuft das Update als eigener Timer.
- **`hermes update` meldet Exit 1 trotz Erfolg (06. und 17.09.):** Nach dem eigenen Gateway-Neustart wartet es auf
Zeilen des „Fleet version check", unter systemd kommen keine. Die Update-Kette brach ab, `autoupdate.sh` rollte
zurück und hielt Hermes fest, obwohl der Gehirn-Check grün war. Deshalb `--no-gateway-restart`: Neustart und Urteil
gehören dem Job.
- **Festgehalten heißt still eingefroren (06.–17.09.):** Motor und Hermes bekamen elf Tage keine Updates. Seit 23.09.
zeigt der Wächter jeden festgehaltenen Baustein als Hinweis mit Knopf „Freigeben".
- **Werkzeugsätze haben zwei Ebenen:** aktiv ist, was nicht in `agent.disabled_toolsets` steht UND in
`platform_toolsets.<platform>`. Cron-Jobs hatten bis 21.08. die volle Werkzeugkiste, weil
`platform_toolsets.cron` fehlte (heute `[web, terminal]`). `hermes prompt-size` ist für die Allowlist blind; echte
Kontrolle nur per Live-Aufruf.
- **Wer einen Werkzeugsatz abschaltet, muss `SOUL.md` mitlesen (21.08.):** Dort standen noch Anweisungen, die auf
abgeschaltete Werkzeuge zeigten.
- **Cron-Fallen:** kein TZ-Feld (`next_run_at` = System-TZ beim Anlegen; nach einem TZ-Wechsel
`hermes cron edit --schedule "<gleich>"`); Prompt und Positionsargumente vor die Flags; `--script` allein reicht nicht
(braucht Prompt oder Skill); Cron-Kontext hat `HERMES_CRON_SESSION=1`. `hermes cron edit <id> "text"` speichert
nichts, der Prompt muss über `--prompt` kommen (21.08.).
- **`hermes` ist über SSH nicht im PATH** → `bash -lc 'hermes …'`.
- **Hermes' `terminal`-Werkzeug bricht nach 30 s ab (22.08.):** Der Agent hielt den Aufruf für gescheitert und rief
`news-melden.sh` ein zweites Mal auf, der Bericht kam doppelt. Das Skript kehrt deshalb sofort zurück und sperrt
Doppelversand.
- **Hermes' `write_file` überschreibt keine vorhandene Datei (23.09.):** Lag der Bericht vom Vortag noch in `/tmp`,
scheiterte jeder Morgenlauf erst an „Refusing to overwrite". `news-melden.sh` räumt den Bericht jetzt weg.
- **`web_extract` wertet kurze Seiten als Fehler (24.09.):** Hermes hängt an jedes Ergebnis ein leeres `"error"`-Feld
und prüft nur die ersten 500 Zeichen. Der Wächter zählt mehrzeilige `"results"`-Treffer deshalb nicht als
Werkzeugfehler.
- **Lucys Stimme ist `lucy-stimme` auf `:8021`, nicht `voice-service` auf `:8650` (21.08.):** Dort sind nur
Cloud-Stimmen geladen.
- **Reasoning-Modelle:** `content` kommt nach `reasoning_content`; `max_tokens` großzügig setzen (für
Werkzeug-Aufrufe ≥ 1500), sonst bleibt die Antwort leer.
- **Hooks:** Die Zustimmung bleibt nur über einen CLI- oder Gateway-Start mit `HERMES_ACCEPT_HOOKS=1` erhalten;
`hermes hooks test` schreibt die Allowlist nicht; eine Skript-Änderung macht die Zustimmung ungültig (mtime).
- **Feed-Skripte: Pipe und Heredoc zugleich, dann gewinnt der Heredoc stdin** → JSON über eine Temp-Datei übergeben.
Einen ehrlichen Ausfallpfad einbauen (API kaputt → „AUSGEFALLEN", nicht „0 Funde").
## Windows-PC
## Lucy / Windows-PC
- **Git-Bash hat kein `python3` (Store-Alias, 24.09.):** `deploy/pruefen.sh` nimmt `backend/.venv/Scripts/python.exe`;
`ruff` liegt global.
- **`sed` mit `$` und `\n` über PowerShell zerlegt sich ohne Fehlermeldung (21.08.).** In einzelne Ersetzungen
aufteilen und danach nachsehen.
- **`Start-Process -ArgumentList` quotet nicht (PS 5.1):** Pfade mit Leerzeichen zerbrechen, die gestartete PowerShell
stirbt still. Anführungszeichen ins Element einbetten: `'-File','"F:\Coding Stuff\…\skript.ps1"'`.
- **`\"` in f-String-Ausdrücken ist seit Python 3.12 ein SyntaxError** (die Box hat 3.14). Werte vorher in Variablen
ziehen.
- **pythonw + subprocess ohne `CREATE_NO_WINDOW`:** Jedes gestartete Konsolenprogramm bekommt ein sichtbares Fenster.
- **PC-Aufgabe `HermesPCExecutor`** (seit 24.09. aus) läuft aus dem Repo mit pythonw; nach einer Änderung an
`executor.py` die Aufgabe neu starten. Logs in `%LOCALAPPDATA%\HermesPCExecutor\`.
- **MSIX-Sandbox der Claude-Desktop-Werkzeuge:** Schreibzugriffe nach `AppData\Local\<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
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.
## Lucy (Desktop-App)
## Colab / Training (Mini-Stimme)
- Live-Drive-Sync JE Epoche einbauen (Session-Tod frisst sonst das Training).
- Notebook-Zellen vor Abgabe ast-prüfen; Colab-Patches nie durch Shell-Heredocs.
- **QA-Gate für synthetische Datensätze:** jeden Clip durch STT-Roundtrip — der ungeprüfte
XTTS-Datensatz war komplett unbrauchbar (sogar whisper-medium verstand ihn falsch).
- Kokoro-Output peakt >1.0 → Peak-Normalisierung 0.95 + Onset-Trim/Fade-In gehören in
JEDE künftige KokoroTtsEngine.
- **file://-Fallen im Electron-Build:** Asset-Pfade relativ; `import()` verzeiht keine relativen Präfixe
(`new URL("vad/", document.baseURI)`).
- **Lucy immer über `Lucy-Neustart.bat` neu starten:** Hartes Beenden hinterlässt Waisen auf `:8130`.
- `LUCY_WORKERS=2` (User-Env): 4 Worker bedeuten ~4 × 1,9 GB Kopien des Stimm-Modells.
- Gerade `"` in Prompt-Strings von `config.ts` zerschießen den String → „…" nutzen.
- Zustands-Features immer mit sichtbarem Zustand und Sofort-Feedback bauen: Der User testet nach Produkt-Gefühl.
- **Training der Mini-Stimme (Colab):** Drive-Sync je Epoche; Notebook-Zellen vor Abgabe per `ast` prüfen;
synthetische Datensätze per STT-Rundlauf prüfen (der XTTS-Datensatz war unbrauchbar); Kokoro-Ausgabe auf 0,95
normalisieren.