- 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>
10 KiB
10 KiB
Betriebs-Fallen — hart erarbeitet, nicht nochmal reintreten
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 und Deploy
- Timer mit
Persistent=trueholen verpasste Läufe beim ersten Einschalten sofort nach (24.09.).mc2-autoupdate.timerwar seit August aus; beimenable --nowlief der Sonntagslauf an einem Donnerstag um 14:51 und startete die Box neu. Seitdem startetautoupdate.shdie Box nur So 04:00–06:59 neu, unddeploy.shstartet 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). Vorherdiff /etc/llama-swap/config.yaml deploy/llama-swap.config.yamlund den lebenden Stand ins Repo holen.MC_DEPLOY_SKIP_SWAP_CONFIG=1lä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.shverschiebt den Deploy deshalb, solange ein Job läuft (MC_DEPLOY_TROTZDEM=1erzwingt). deploy.shschaltet alles inAKTIVwieder 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 (mitmc2-autoupdateschon passiert). Schlafende Units (box-console,voice-service) stehen nur inUNITS.- Den Box-Checkout nie von Hand ändern. Stufe 1 holt
mainnur 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, nichtgit, Port 2222 (21.08.). Mitgit@kommt nurPermission denied (publickey), der Grund steht nur im Gitea-Log. Bei vielen Schlüsseln am PCIdentitiesOnly yessetzen, 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 Giteamission-control-v2(deploy/push-und-sync.ps1liest die URL). - CRLF:
.gitattributeserzwingt LF für*.sh,*.service,*.timerunddeploy/**/*.py, sonst bricht bash anpipefail\r. Was per Pipe vom Windows-PC auf die Box geht:sed 's/\r$//'. - Stale
index.lockim 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, erstgit add -A, danngit diff --cached.
Box, systemd, llama-swap
- User-Units über SSH: erst
export XDG_RUNTIME_DIR=/run/user/$(id -u), sonst siehtsystemctl --usernichts. - Ohne
exclusive: falseist 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-serverergeben HTTP 500 (04.09., bestätigt 24.09.): „failed to process speculative batch", geprüft mit b11057 und b11157, auch mitspeculative.n_max=0je Anfrage. Lösung: Bild-Zwillinge ohne Draft. - llama-swap versteht nur
persistent:,persist:ignoriert es still (MC2 liestpersist, deshalb stehen beide in der Config).persistentschützt nur vor Verdrängung, nicht vor dem ttl-Entladen: Warm-Mitglieder brauchenttl: 0. Nach jedem Config-Reload ist alles entladen; der Steward wärmt das Hirn nach. warmup.shliegt als Root-Kopie unter/usr/local/bin/llama-swap-warmup.sh;deploy.shaktualisiert 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-mmapgibt 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 neuenllama-serverparsen 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-syncscheiterte 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
- 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 updatemeldet 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.shrollte 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_toolsetssteht UND inplatform_toolsets.<platform>. Cron-Jobs hatten bis 21.08. die volle Werkzeugkiste, weilplatform_toolsets.cronfehlte (heute[web, terminal]).hermes prompt-sizeist für die Allowlist blind; echte Kontrolle nur per Live-Aufruf. - Wer einen Werkzeugsatz abschaltet, muss
SOUL.mdmitlesen (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-Wechselhermes cron edit --schedule "<gleich>"); Prompt und Positionsargumente vor die Flags;--scriptallein reicht nicht (braucht Prompt oder Skill); Cron-Kontext hatHERMES_CRON_SESSION=1.hermes cron edit <id> "text"speichert nichts, der Prompt muss über--promptkommen (21.08.). hermesist ü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 riefnews-melden.shein 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.shräumt den Bericht jetzt weg. web_extractwertet 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-stimmeauf:8021, nichtvoice-serviceauf:8650(21.08.): Dort sind nur Cloud-Stimmen geladen. - Reasoning-Modelle:
contentkommt nachreasoning_content;max_tokensgroß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=1erhalten;hermes hooks testschreibt 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
- Git-Bash hat kein
python3(Store-Alias, 24.09.):deploy/pruefen.shnimmtbackend/.venv/Scripts/python.exe;ruffliegt global. sedmit$und\nüber PowerShell zerlegt sich ohne Fehlermeldung (21.08.). In einzelne Ersetzungen aufteilen und danach nachsehen.Start-Process -ArgumentListquotet 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 anexecutor.pydie Aufgabe neu starten. Logs in%LOCALAPPDATA%\HermesPCExecutor\. - MSIX-Sandbox der Claude-Desktop-Werkzeuge: Schreibzugriffe nach
AppData\Local\<app>landen inAppData\Local\Packages\Claude_*\LocalCache\. Windows-Apps nie über Agent-Werkzeuge installieren; den Installer startet der User per Doppelklick.
Lucy (Desktop-App)
- file://-Fallen im Electron-Build: Asset-Pfade relativ;
import()verzeiht keine relativen Präfixe (new URL("vad/", document.baseURI)). - Lucy immer über
Lucy-Neustart.batneu 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 vonconfig.tszerschieß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
astprüfen; synthetische Datensätze per STT-Rundlauf prüfen (der XTTS-Datensatz war unbrauchbar); Kokoro-Ausgabe auf 0,95 normalisieren.