- Backend: check_health() prüft jetzt auch Desktop-Gateway (GET /api/status :9119)
- Frontend: ConnectHealth-Typ erweitert, dritte Status-Zeile mit emerald-Theme
- Frontend-Build: neu gebaut mit Vite (Hash-Dateinamen aktualisiert)
- BEDIENUNG.md: Bereichs-Liste auf die echten 10 Sidebar-Tabs gebracht
(Auftragsbuch/Wissen/Chronik/Konsole fehlten komplett), Verbinden-Abschnitt
auf Hermes Desktop/Kilo/Claude Code umgestellt (Zed/Roo abgeschafft),
Verweis "Arbeiten = Desktop-App, MC2 = Maschinenraum".
- DISASTER_RECOVERY.md: hermes-terminal-Zeile durch Desktop-Gateway
(hermes-builtin-ui) + Token-Drop-in + Token-Kopie ersetzt (übernimmt die
gerettete Orchestrator-Änderung), nesquena-WebUI-Zeile durch
Hermes-Desktop-Eintrag (PC) ersetzt, Wizard-Checkliste angepasst.
- HERMES_SETUP.md: §3 (nesquena-webui-Install, obsolet) durch "Hermes
Desktop (PC) anbinden" ersetzt: Token-Drop-in auf der Box,
connection.json am PC, MC2-Proxy-URL, cli-Toolset-Hinweis.
Hintergrund: Der Orchestrator-Lauf zu diesem Auftrag delegierte erstmals
echt (worker.sh plan/build), scheiterte aber an falschem Schreibziel
(Live-Checkout statt Worktree) + Output-Limit — Rest von Hand zu Ende
geführt, gerettete Änderung übernommen.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Vorfall 09.07.2026 (Session 20260709_090725_9eebf3): Der Manager übersprang
Planung, Delegation UND das Zwei-Kritiker-Gate mit der Ansage "Overkill für
so einen kleinen Task" und baute selbst — transparent, aber ein Bruch des
Pflicht-Gates (ein Agent, der sein eigenes Werk durchwinkt). Neue Leitplanke:
kein Ermessensspielraum; der einzige erlaubte Ausweg bei zu kleinen Aufträgen
ist Abbruch ohne Code mit Verweis auf Werkstatt/Desktop. Code-liefernde Läufe
enthalten IMMER worker.sh-Belege und beide Kritiker-Verdikte.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Der Dienst ist seit der MC2-Diät stillgelegt (deploy.sh disable --now +
Unit-Löschung, auf der Box verifiziert inactive). Die Repo-Datei blieb nur
einen Deploy-Zyklus als Schutz gegen die deploy.sh-Selbst-Reset-Falle
(das alte deploy.sh kopierte sie noch beim Annahme-Deploy). Der Zyklus ist
durch — die Datei kann weg.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Der nächtliche Traum beschreibt Skill-Kandidaten künftig gleich als
SKILL.md-Gerüst (Frontmatter name/description<=60/version + Wann nutzen /
Schritte mit echten Hermes-Tools / Belege) statt als Freitext — die
Werkstatt übernimmt beim "Beauftragen" ein fertiges Gerüst. Propose-only
bleibt unverändert (kein skill_manage im Traum, Fremdblick-Gate davor).
Schließt das offene Traum-Increment "echte Skill-Extraktion" ab, indem es
den /learn-Autorenstandard von Hermes v0.18 in den Kreislauf holt.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
dist-Konflikt (Hash-Assets beider Builds) durch frischen Build aufgelöst —
damit sind BEIDE Auftragsbuch-Karten in beliebiger Reihenfolge Ein-Klick-fähig
(role-metadata zuerst = sauber; diaet enthält die Rollen-Texte mit).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Der "Hermes GUI"-Tab (iframe auf /hermes-ui/) und das Hermes-Terminal-ttyd
(:7681) entfallen — die Agent-Oberfläche ist jetzt die Hermes-Desktop-App,
die über den BESTEHENDEN MC2-Proxy /hermes-ui/ (WS inklusive) an die Box
andockt. hermes-builtin-ui (:9119) bleibt als Desktop-Gateway erhalten und
wird im Dienste-Drawer + /api/system/services erstklassig geführt (statt
hermes-terminal); Wartungs-Allowlist kann ihn jetzt neu starten.
- Frontend: Tab/View raus (nav.ts, App.tsx, TerminalView.tsx gelöscht),
AgentView + (Legacy-)AgentStatusCard zeigen Desktop-Gateway statt ttyd,
Dienste-Zeile hermes-terminal → hermes-builtin-ui, Versions-Zeile
"Hermes UI" (nesquena-Karteileiche ~/hermes-webui) entfernt.
- Backend: terminal_url/terminal_reachable + HERMES_TERMINAL_* raus,
console.py proxyt nur noch die Box-Konsole, /api/system/services führt
hermes-builtin-ui, USER_SERVICES getauscht, hermes-webui-GitInfo raus.
- deploy.sh: legt hermes-terminal + hermes-webui idempotent still
(disable --now + Unit-Löschung). deploy/hermes-terminal.service bleibt
EINEN Zyklus im Repo (das laufende alte deploy.sh kopiert es noch —
Selbst-Reset-Falle); Aufräum-Commit folgt nach dem nächsten Deploy.
- frontend/dist mit-committet (Box baut nicht selbst).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
fmtSnap kannte nur Zeitstempel mit Trennzeichen (2026-07-08T...), backup.sh
schreibt aber kompakt (20260708-181136) — Datum erschien roh. Regex tolerant
gemacht. Dazu docs/AUFTRAGSBUCH.md (Funktionsweise + Leitplanken); dieser Branch
ist zugleich die erste echte E2E-Annahme-Probe des Auftragsbuchs.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Neue Views: Auftragsbuch (Karten mit Diff/Kritiker-Kontext, Annehmen/Ablehnen mit
Fangnetz-Dialog), Chronik (Tages-Timeline aus dem Briefkasten + Zeitmaschine mit
Ein-Klick-Restore), Wissen (Vault als klickbares Wiki, [[Links]] springen).
Cockpit: Auftragsbuch-Kachel + Braucht-dich-Eintrag, Morgenlage-Karte (juengstes
Chef-Verdikt), Anstehendes (Erinnerungen anlegen/loeschen), Wissen/Chronik-Kacheln.
Gedaechtnis: Dubletten-Dialog zeigt jetzt konkret, was bleibt und was wegfaellt.
dist mitgebaut (tsc+vite gruen).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Der letzte Meter des propose-only-Kreislaufs: Vorschlags-Branches (Werkstatt/
Orchestrator) und Traum-Skill-Kandidaten werden als API sichtbar; Annehmen laeuft
als detached systemd-Unit (Merge im Worktree -> Push main -> Deploy -> Health ->
Auto-Revert bei Rot). Dazu: Chronik-Endpoint (Announce-Store als Timeline),
Wissens-Vault-Reader (read-only, Traversal-Guard), Zeitmaschine (Snapshots +
detached Restore) und Morgenlage-Spiegel im Chef-Gutachter-Feed (priority=silent).
python-multipart explizit in requirements (voice braucht es, war implizit).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Die requirements sind teils ungepinnt — bei einer Neuinstallation sagt
known-good/, welche Versionen nachweislich zusammen liefen: pip freeze je
venv (backend/mem0/voice), llama.cpp+llama-swap-Version, MC2+Hermes-Git-
Staende, OS/Kernel, GGUF-Bestand. Best-effort, restore.sh unberuehrt.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Befund 08.07.: 'hermes update' scheiterte real an einem verwaisten
.git/index.lock (git stash exit 1), aber der Job wurde GRUEN — das ';'
vor dem Dienst-Neustart (noetig, damit die gestoppte UI auch im
Fehlerfall wieder hochkommt) schluckte den Update-Fehler, und der
Postcheck bestand mit dem ALTEN Agenten. User sah 'done', Badge blieb
(125 Commits Rueckstand). Neu: RC wird festgehalten, Dienste starten
IMMER wieder, aber der Job uebernimmt den echten Update-RC und
schreibt eine Klartext-Zeile ins Log. Lock auf der Box entfernt
(Verwaisung von gestern 21:22, wie beim MC2-Repo).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Neuer POST /api/maintenance/update-all kettet die AUSSTEHENDEN Updates
sequenziell (Engine -> Router -> Hermes -> OS) in einem maintenance-Job.
Bewusst reine Wiederverwendung: jeder Teil ist exakt der Befehl des
Einzel-Updates inkl. dessen Backup/Postcheck/Selbst-Rollback; &&-Kette
stoppt beim ersten Fehler, Banner-Zeilen im Log zeigen den Schritt.
OS zuletzt (breitester Eingriff, braucht als einziges das Box-Passwort;
fehlt es, laufen die sudo-freien Teile trotzdem und OS wird uebersprungen).
Hermes-Befehlskette in _hermes_update_cmd() extrahiert (DRY).
UI (SystemDrawer/Updates): Button 'Alle aktualisieren (N)' neben der
Update-Suche, nur sichtbar wenn etwas aussteht, gesperrt waehrend ein
Wartungs-Job laeuft, mit Bestaetigungs-Dialog der die Kette benennt.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
(1) useLucyHealth: ruhende Augen sind seit der Warm-Set-Diaet 07.07. der
NORMALZUSTAND (vision on-demand, Lucy waermt selbst) -> kein Dauer-warn
mehr im Cockpit ('Kleinigkeit an der Box' ohne Grund). Geladen = 'sieht
gerade zu', ruhend = ok mit ehrlicher Erklaerung + Weck-Knopf.
(2) Cockpit-Statuszeile SAGT jetzt, was der Hinweis ist (erster warn-Check
mit Label+Detail statt generischem 'Nichts Schlimmes — nur ein Hinweis';
User-Feedback 08.07.). useLucyHealth exportiert dafuer die warns-Liste.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Die zwei neuen Rollen aus dem Rollen-Audit tauchen jetzt ueberall
ordentlich auf statt als namenlose Eintraege:
- ROLE_IDS (llamaswap + sources) um kritiker/reranker erweitert
- roleMeta.ts: 'Kritiker' (Scale, cyan — die unbestechliche Zweitmeinung)
+ 'Gedaechtnis-Sortierer' (ListOrdered, lime — Feinsortierung hinter
dem Gedaechtnis, direkt nach embed einsortiert)
- werkbank/roleColors.ts: Speicherleisten-Farben passend dazu
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Ergebnis des Rollen-Audits 07.07. (User: 'das beste, aber sinnvollste'):
(1) KRITIKER: fremdblick-Prosa + Chef-Gutachter-Vertretung liefen auf der
9B-Vision-GLM, obwohl es reine Text-Jobs sind. Neu: GLM-4.7-Flash
(30B-A3B, MIT, Unsloth UD-Q4_K_XL, 17,5 GB, on-demand ttl 600, Alias
'kritiker'). Gleicher Fremd-Vendor wie bisher -> die 'andere Brille'
des Kritiker-Konzepts bleibt. 4.6V-Flash bleibt scout (Bild-Jobs).
(2) RERANKER (die eine echte Rollen-Luecke): Mem0-Suche war reine
Vektor-Aehnlichkeit. Neu: Qwen3-Reranker-0.6B (q8_0, Mungert-GGUF —
Community-Konvertierungen liefern bekannt Nullscores) via llama-swap
/v1/rerank ordnet die Top-20 Kandidaten nach echter Relevanz um.
NUR die Reihenfolge aendert sich: score bleibt Vektor-Score (Hermes-
Plugin-Filter RECALL_MIN_SCORE bleibt kalibriert), rerank_score kommt
als neues Feld dazu; jeder Fehler -> lautlos Vektor-Reihenfolge.
Env: MC_RERANK_ENABLED/_URL/_MODEL/_TIMEOUT/_CANDIDATES. In brains
(verdraengungssicher, ~0,7 GB).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
User-Entscheid 07.07.: 'Gehirn + Embedding reichen komplett aus' — die Augen
(VL-30B, ~19 GB) werden nur gebraucht, wenn Lucy auf dem Desktop an ist oder
die IDE-Lane sie ruft. Warm-Set = nur noch Qwen3.6 + embed; damit passt der
60-GB-Chef-Gutachter (gpt-oss) wieder neben das Hirn.
- llama-swap.config.yaml: VL-30B aus brains raus, ttl 0 -> 900 (15 min
Nachlauf); Kommentare entstaubt. AUSSERDEM Template<->Live-Drift beendet:
Template hatte coder-lite wiederbelebt (live seit 05.07. entfernt) und
KV q4_k (lief NIE live) — beides auf Live-Wahrheit (q8_0, kein coder-lite)
zurueckgesetzt; Qualitaet vor ein paar GB, RAM-Engpass ist mit der Diaet weg.
- warmup.sh: Default 'fast vision' -> 'fast' (Root-Kopie unter
/usr/local/bin braucht spaeter einmal sudo cp — bis dahin waermt ein
llama-swap-Restart vision einmalig, ttl 900 raeumt es wieder ab)
- warmer.py: Docstring auf neues Warm-Set angepasst
- Lucy-Seite (eigenes Repo): App waermt die Augen beim Start + alle 10 min,
solange sie laeuft — Augen-Lebenszyklus == Lucy-Lebenszyklus
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
User-Idee 06.07.: das grosse Modell NICHT im heissen Pfad, sondern als
naechtlicher Gutachter (04:30) — Kaltladen ist dann egal, Lucy bleibt
tagsueber schnell. Feed sammelt 24h-Beweise (Vorschlags-Branches, main-
Commits, Vault-Notizen, Journal-Warnungen, Insights), der Richter laeuft
als Ein-Schuss-Completion gegen llama-swap (fremdblick-Architektur).
Richter-Kette: gpt-oss-120b -> GLM-4.6V-Flash als gekennzeichnete
Vertretung (gpt-oss wirft neben dem Warm-Set weiterhin 'exited
prematurely', E2E 07.07. verifiziert). Bote = Cron-Agent mit striktem
Treu-Wiedergeben-Mandat (chef-gutachter-prompt.md), Ausfall wird ehrlich
gemeldet statt verschwiegen.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
(1) /v1/models meldet jetzt den ECHTEN Kontext pro Slot: --parallel teilt
den Server-Kontext hart auf (131072 / 2 Slots = 65536). Vorher budgetierte
Hermes gegen 131k -> Kompaktierung feuerte nie, llama-server kappte bei
~52k-Sessions Prompt/Antwort -> abgerissene Tool-Calls, Retry-Schleifen,
gefuehlte Abstuerze (journalctl 07.07 17:11, 152 msgs / ~51.700 Tokens).
Dazu auf der Box: context.engine 'default' (existiert nicht, warnte jeden
Turn) -> 'compressor' (der echte eingebaute Name).
(2) Cockpit: neue Sektion 'Leistung' mit den drei bestehenden Live-Karten
(System-Status, Token-Durchsatz, Latenz je Turn) — waren nach UI v3 nur
noch in der alten Zentrale, User will sie auf der Startseite. Browser-
verifiziert gegen die Box (rendert live, keine Konsolen-Fehler).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- replace implicit relative imports with absolute ones (from backend.*)
- add type hints for lifespan tasks list and middleware
- fix unused bool return value in task.cancel() call
Beim Entfernen des httpx-Imports uebersehen: der /models-Endpoint nutzte httpx
noch direkt -> NameError/500. Jetzt zieht auch /models den geteilten
app.state.gw_client (request-Param ergaenzt). Live verifiziert.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Vier verifizierte Befunde aus dem externen Review (Gemini 3.1 Pro):
- app.py: SPA-Fallback gegen Path-Traversal gehaertet (resolve + is_relative_to,
liefert nur noch Dateien INNERHALB von frontend/dist aus).
- app.py/gateway_proxy.py: geteilter httpx.AsyncClient im lifespan statt neuer
Client pro /v1-Anfrage (Keep-Alive/Pooling, spart Sockets unter parallelen Agent-Stroemen).
- system.py: check_versions_cached() mit threading.Lock + Double-Check gegen Scan-Stampede.
- AGENTS.md: Zeitzonen-Drift korrigiert (Box laeuft Europe/Berlin, nicht UTC).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
connect.py empfiehlt IDEs jetzt die realen Box-Modelle Coder (bauen) /
Planer (denken) / Augen (Bilder, images) direkt statt der "coding"-Lane
— deckt sich mit dem tatsaechlichen Zed-Setup. Zed-Snippet mit vollen
7-Feld-Capabilities + Provider "bosgame"; Kilo/Claude-Code auf model=coder.
coder-lite (Qwen3-Coder-30B) parallel aus der llama-swap-Config der Box
entfernt (war ungenutzt: coding-Lane nutzt ohne Policy immer den starken coder).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Ursache des fehlgeschlagenen Engine-Updates: die allerneueste llama.cpp-Release traegt
oft noch KEINE CI-Binaries (0 Assets). update-engine.sh lud aber stur von releases/latest
→ 404 „Download fehlgeschlagen".
Fix:
- update-engine.sh: nimmt die neueste Release, die wirklich ein ubuntu-vulkan-x64.tar.gz
traegt, und nutzt dessen echte browser_download_url (robust gegen Namensaenderungen).
- maintenance.py: _engine_update_available + engine_update_details pruefen jetzt ebenfalls
gegen die neueste ASSET-tragende Release → das Badge luegt nicht mehr („verfuegbar", aber
Download 404). Verifiziert: aufgeloeste URL liefert HTTP 200.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>