Commit Graph

458 Commits

Author SHA1 Message Date
Hitonabi 4dc5ca7343 Auftragsbuch/Chronik/Wissen/Zeitmaschine: Backend + Annahme-Runner (Ein-Klick-Gate)
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>
2026-07-08 18:42:03 +02:00
Hitonabi 8b6dbd4aa1 Backup: Known-Good-Manifest (pip freeze, Engine-Build, Modell-Liste) im Tarball
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>
2026-07-08 18:02:17 +02:00
Hitonabi 2d95b0a334 Fix: Hermes-Update meldet Fehlschlag jetzt ehrlich (rc-Maskierung entfernt)
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>
2026-07-08 17:46:39 +02:00
Hitonabi f2d357c5d8 Update-all-Button: alle ausstehenden System-Updates in EINEM Job
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>
2026-07-08 17:36:52 +02:00
Hitonabi 49807ace7b Frontend-Rundumschlag: Health-Logik + Statuszeile an neue LLM-Landschaft angepasst
(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>
2026-07-08 16:53:23 +02:00
Hitonabi 1b35f70dc6 UI: kritiker + reranker als erstklassige Rollen sichtbar
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>
2026-07-07 22:25:20 +02:00
Hitonabi 88ec8b9121 Rollen-Ausbau: kritiker (GLM-4.7-Flash) + Gedaechtnis-Reranker (Qwen3-Reranker-0.6B)
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>
2026-07-07 22:21:57 +02:00
Hitonabi f88ed4e5df LLM-Landschaft: Vision raus aus dem Warm-Set (on-demand, ttl 900) + Template=Live-Abgleich
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>
2026-07-07 21:53:06 +02:00
Hitonabi d68ee60182 Chef-Gutachter-Cron (Orchestrator-Finale): gpt-oss urteilt naechtlich ueber die autonome Arbeit
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>
2026-07-07 21:26:24 +02:00
Hitonabi f65f9ca2d0 Hermes-Kontext-Ehrlichkeit + Leistungs-Graphen zurueck im Cockpit
(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>
2026-07-07 21:18:08 +02:00
Hitonabi 092dcc2ada fix(hermes-ui): switch from headless 'hermes serve' to 'hermes dashboard --no-open' 2026-07-07 17:27:49 +02:00
Hitonabi 989b6de850 fix(maintenance): cleanly stop, rebuild and restart hermes-builtin-ui during agent updates 2026-07-07 17:25:35 +02:00
Hitonabi 6f77dbb9d9 chore(config): remove missing Qwen3.5-122B and Qwen3-VL-8B, promote gpt-oss-120b 2026-07-07 17:18:31 +02:00
Hitonabi edf1614e66 feat(perf): Optimize KV-Cache to Q4_K and fix Hermes Context bounds 2026-07-07 17:11:50 +02:00
root 97be0f1d00 feat: lower memory dedupe threshold for more aggressive cleaning 2026-07-07 16:45:30 +02:00
Hitonabi c92f238d2d refactor: architektur-optimierungen (systemd, jq, httpx, commit-hook) 2026-07-06 20:38:18 +02:00
Hitonabi 3fba487963 feat: orchestrator skill nutzt gpt-oss-120b zur initialen planung 2026-07-06 20:28:45 +02:00
Hitonabi f49e5ecf9d fix: relative imports in app.py wiederhergestellt 2026-07-06 20:17:17 +02:00
Hitonabi cb3a5adaf9 Merge origin/main: fix absolute imports and add reset-failed for hermes-builtin-ui 2026-07-06 20:10:33 +02:00
Hitonabi 87c479323c chore: remove invalid allowScripts field from package.json 2026-07-06 20:06:54 +02:00
Hitonabi b95530ee70 fix: absolute imports and type annotations in app.py
- 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
2026-07-06 20:06:40 +02:00
Hitonabi 42e45b4b50 Hermes-GUI: eingebaute hermes serve-Weboberflaeche same-origin in MC2 einbetten (ersetzt CLI-Terminal-Tab)
Statt des ttyd-CLI-Terminals zeigt der Tab jetzt die reiche eingebaute Hermes-Web-GUI
(hermes serve/dashboard: Threads, sichtbare Tool-Calls, Sessions, Config) - same-origin,
ohne offenen Port, ohne Login (Loopback :9119 = LAN-Trust wie Terminal/Konsole).

- backend/routers/hermes_ui.py: generischer Reverse-Proxy /hermes-ui/* (alle Methoden + beliebige
  WebSockets) -> 127.0.0.1:9119; injiziert window.__HERMES_BASE_PATH__=/hermes-ui in die index.html,
  damit die SPA ihre API/WS-Calls unter dem Praefix absetzt (sonst Kollision mit MC2s /api).
- deploy/hermes-builtin-ui.service: hermes serve --skip-build auf Loopback :9119.
- deploy/deploy.sh: baut das GUI-Bundle mit Vite-base=/hermes-ui/ (Temp->Swap, ueberlebt Hermes-
  Updates) + installiert/startet den Dienst.
- backend/app.py + config.py + services/agent.py: Router registriert, Upstream/Pfad + Status-Feld.
- frontend: Terminal-Tab -> "Hermes GUI" (TerminalView iframe /hermes-ui/, nav-Label, vite-Dev-Proxy).

E2E im Browser verifiziert: GUI rendert eingebettet, /hermes-ui/api/* liefern echte Daten
(289 Sessions, verbundene Plattformen), Assets + Plugins laden, Basis-Pfad korrekt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 14:49:39 +02:00
Hitonabi 3a6e3c5432 Hermes-GUI: eingebaute hermes serve-Weboberflaeche same-origin in MC2 einbetten (ersetzt CLI-Terminal-Tab)
Statt des ttyd-CLI-Terminals zeigt der Tab jetzt die reiche eingebaute Hermes-Web-GUI
(hermes serve/dashboard: Threads, sichtbare Tool-Calls, Sessions, Config) - same-origin,
ohne offenen Port, ohne Login (Loopback :9119 = LAN-Trust wie Terminal/Konsole).

- backend/routers/hermes_ui.py: generischer Reverse-Proxy /hermes-ui/* (alle Methoden + beliebige
  WebSockets) -> 127.0.0.1:9119; injiziert window.__HERMES_BASE_PATH__=/hermes-ui in die index.html,
  damit die SPA ihre API/WS-Calls unter dem Praefix absetzt (sonst Kollision mit MC2s /api).
- deploy/hermes-builtin-ui.service: hermes serve --skip-build auf Loopback :9119.
- deploy/deploy.sh: baut das GUI-Bundle mit Vite-base=/hermes-ui/ (Temp->Swap, ueberlebt Hermes-
  Updates) + installiert/startet den Dienst.
- backend/app.py + config.py + services/agent.py: Router registriert, Upstream/Pfad + Status-Feld.
- frontend: Terminal-Tab -> "Hermes GUI" (TerminalView iframe /hermes-ui/, nav-Label, vite-Dev-Proxy).

E2E im Browser verifiziert: GUI rendert eingebettet, /hermes-ui/api/* liefern echte Daten
(289 Sessions, verbundene Plattformen), Assets + Plugins laden, Basis-Pfad korrekt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 14:48:12 +02:00
Hitonabi 001ebb7742 Orchestrator-Skill: Werkstatt zum Fliessband verallgemeinert (zerlegen -> delegieren -> Zwei-Kritiker-Gate -> Vorschlag)
- deploy/worker.sh: Ein-Schuss-Arbeitsauftrag an ein Worker-Modell (Gegenstueck zu fremdblick.sh),
  Fence-Strip + Aufruf-Log (Delegations-Nachweis); v1 nur Coder-Next (heavy stirbt neben dem Warm-Set).
- deploy/skills/orchestrator/SKILL.md: Manager-Drehbuch, propose-only, Warm-Set-Schutz,
  Delegations-Pflicht + Evidenz, stage-vor-Diff, Zwei-Kritiker-Gate (Coder-Next Kompetenz + GLM Fremd-Blick).
- deploy/deploy.sh: worker.sh + orchestrator-Skill mit ausrollen.

E2E gegen die Box verifiziert (worker.log-belegte Delegation, Self-Gate + Zwei-Kritiker-Gate, propose-only).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-06 14:04:52 +02:00
Hitonabi 26deb1cec1 fix: coder_lite Default auf leeren String statt .strip() — verhindert falschen Router-Verweis auf nicht-existentes coder-lite-Modell 2026-07-06 11:00:24 +02:00
Hitonabi 93f447327b Fix: /v1/models auf geteilten Client (Regression aus 12c387a)
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>
2026-07-05 10:24:18 +02:00
Hitonabi 12c387a6de Antigravity-Review-Fixes: Traversal-Guard, Client-Pooling, Cache-Lock, Doku
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>
2026-07-05 10:21:32 +02:00
Hitonabi ff1b9a085f coder-lite raus + Verbinden-Tab auf echte Direkt-Modelle
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>
2026-07-05 00:41:38 +02:00
Hitonabi 42f0497253 Engine-Update-Fix: neueste Release MIT Vulkan-Asset waehlen (404 vermeiden)
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>
2026-07-04 21:52:41 +02:00
Hitonabi a45bd586b6 Update-Passwort-Hinweis zeigt auf Einstellungen (Box-Zugang-Karte entfernt)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 21:47:19 +02:00
Hitonabi 032b9a8ee9 Konsole: Box-Zugang-Karte entfernt (redundant)
Der Login läuft jetzt über den su-Passwort-Prompt im Terminal selbst; die Passwort-
Verwaltung bleibt in System-Wartung → Einstellungen. Die doppelte „Box-Zugang"-Karte
auf der Konsole-Seite ist damit ueberfluessig und wird entfernt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 21:45:48 +02:00
Hitonabi eff23643e6 Hermes-Terminal same-origin + Passwort-Login; Engine/OS-Update-Fixes
Terminals (wie die Box-Konsole):
- hermes-terminal bindet jetzt NUR Loopback (--interface lo --base-path /hermes-terminal)
  und wird von MC2 same-origin durchgereicht (routers/console.py generalisiert auf beide
  ttyd-Instanzen). Kein eigener Firewall-Port mehr noetig.
- Beide Terminals starten die Shell/CLI ueber `su - hitonabi` → fragen beim Oeffnen das
  Box-Passwort ab (PAM gegen das echte Konto, nichts gespeichert). „Login mit sudo-PW".
- agent_status.terminal_url = /hermes-terminal/ (+ reachable via Loopback-Check).

Engine-Update (llama.cpp) — Fix „nicht moeglich":
- update-engine.sh/update-swap.sh sind per sudoers NOPASSWD freigegeben → das fruehere
  `sudo true`-Passwort-Gate hat sie faelschlich blockiert (wenn kein/falsches Box-PW). Gate
  entfernt → Engine-/Router-Update laufen jetzt passwortlos.

OS-Update (apt) — Fix „nicht moeglich":
- DEBIAN_FRONTEND wird jetzt INNERHALB `sudo bash -c '…'` gesetzt statt `sudo VAR=… cmd`
  (sonst lehnt sudos env-Policy die Variable ab und das Upgrade bricht ab).
- Frontend verschluckt password_required/incorrect_password nicht mehr still, sondern zeigt
  einen klaren Hinweis (Box-Passwort in „Box-Zugang" setzen/pruefen).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 21:18:55 +02:00
Hitonabi 00fc7d6d81 Box-Konsole hinter MC2-Reverse-Proxy (kein Firewall-Port noetig)
Problem: ttyd auf :7682 war von aussen per ufw geblockt (nur 7681/9001 offen), also
im Browser Timeout — und ufw oeffnen braucht sudo, das MC2 hier nicht passwortlos hat.

Fix: ttyd bindet jetzt NUR an Loopback (--interface lo, --base-path /console) und wird
von MC2 ueber den ohnehin offenen Port 9001 same-origin durchgereicht:
- routers/console.py: HTTP-Passthrough (index/token) + WebSocket-Bridge (tty-Subprotokoll
  auf beiden Seiten) → /console/ + /console/ws.
- app.py: console.router VOR dem SPA-Catch-all eingehaengt.
- config: BOX_CONSOLE_UPSTREAM (127.0.0.1:7682) + BOX_CONSOLE_PATH (/console/);
  agent_status liefert box_console_url=/console/ + reachable=Upstream-Check.
- deploy/box-console.service: --interface lo --base-path /console.
- vite: /console (ws:true) fuer die Dev-Vorschau geproxyt.

Kein Firewall-/sudo-Eingriff noetig; Konsole laeuft same-origin zum Dashboard.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 20:58:40 +02:00
Hitonabi 18afa37412 UI v3: Cockpit-Startseite + Modelle-Werkbank als Default, neue Box-Konsole
Kompletter Frontend-Umbau auf das abgenommene v3-Konzept, dazu zwei neue Funktionen.

Frontend (Neuordnung bestehender IST-Views, kein Backend-Umbau):
- Cockpit ist die neue Startseite: ruhige Bereichs-Kacheln (je 1 Live-Zahl +
  Status-Punkt), ehrliche Status-Zeile "Box gesund" + Speicher-Pille, "Braucht dich"
  (kritische Probleme mit 1-Klick-Reparatur + bereitliegende Updates).
- Modelle-Werkbank: Maschinenraum-Speicherleiste als Hero (Arbeitsspeicher-Balken,
  nach Rolle eingefaerbt + frei), darunter Master/Detail. Eingebettet als Haupt-Tab
  im Modell-Manager ("Werkbank"), "Modelle finden" + JobsBar bleiben.
- Sidebar/Nav neu strukturiert; alle Aktionen ueber die bestehenden /api-Endpoints.

Neue Features:
- Box-Konsole: zweites ttyd-Web-Terminal mit echter Login-Shell auf :7682 (direkter,
  SSH-artiger Box-Zugriff, kein Passwort — gleiches LAN-Trust-Modell wie hermes-terminal).
  Neuer Dienst deploy/box-console.service + agent_status-Felder box_console_url/-reachable.
- Box-Zugang: das Host-Sudo-Passwort laesst sich jetzt direkt in der Konsole-Seite
  setzen/aendern/loeschen (lokal im Browser), statt nur versteckt im System-Drawer.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 20:41:19 +02:00
Hitonabi 854393ce5f Werkstatt-Reviewer: Fremd-Kritik ueber fremdblick.sh statt kaputter heavy-Delegation
Das in Haertung 1b eingefuehrte Fremd-Modell-Review delegierte per delegation.model
an heavy (gpt-oss) — das aber als Kritiker DOPPELT disqualifiziert ist: Hermes'
MINIMUM_CONTEXT_LENGTH=64000 screent den 32k-heavy als delegate_task-Ziel raus, UND
heavy (60 GB) stirbt beim Laden neben dem VL-30B-Warmset (Health-Check-Timeout).
Die Fremd-Pruefung konnte damit im Werkstatt-Alltag STILL ausfallen (Durchwink-Gefahr,
genau das, was 1b verhindern sollte).

- deploy/skills/wartung/SKILL.md Schritt 4: statt delegate_task nun
  `FREMDBLICK_MODE=code fremdblick.sh` (Qwen3-Coder-Next, 128k, anderes Modell als der
  Qwen3.6-Worker, laedt klein). REPRODUZIERT-ODER-ABGELEHNT bleibt (im Raster verankert),
  3-Wege-Urteil ABGELEHNT/FREIGABE-MIT-VORBEHALT/FREIGABE, Fallback bei Ausfall = UNGEPRUEFT.
- deploy/fremdblick.sh: FREMDBLICK_MODE=code (Code-Review-Raster + Coder-Next) neben dem
  Default prose-Raster (Dreaming, unveraendert).

E2E gegen die Box verifiziert: kaputter Patch (falsche Bedingung) -> ABGELEHNT mit
konkreter Reproduktion; sauberer Fix (Leerlisten-Guard) -> FREIGABE. Kritiker diskriminiert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 17:00:32 +02:00
Hitonabi f6029e25fc Dreaming (Phase 2): naechtlicher Traum-Cron + Wissens-Vault + Fremdblick-Helfer
Der Continual-Learning-Kreislauf als Capstone: idle-Zeit -> Session-Review ->
navigierbare Markdown-Notizen (Wissens-Vault, eigenes git-Repo) -> Vorschlag mit
Fremd-Modell-Kritiker, Mensch als Gate.

- deploy/dreaming-prompt.md: versionierter Traum-Auftrag. Reflektieren (insights/
  sessions/journey/curator) -> Notizen entwerfen -> Fremdblick PFLICHT-GATE (wartet
  auf Urteil) -> bereinigen+INDEX -> committen -> zuletzt berichten (Lucys Stimme).
  Propose-only: einziger Schreib-Ort ist der Vault; alles andere = Vorschlag.
- deploy/dreaming-feed.sh: bootstrappt ~/wissens-vault (idempotent) + sammelt
  Schlaf-Daten. INDEX zwischen Markern (kein Feed-Bleed in die Datei).
- deploy/fremdblick.sh: Ein-Schuss-Zweitmeinung von einem ANDEREN Modell
  (GLM-4.6V-Flash, anderer Vendor). Umgeht Hermes' 64K-Delegations-Floor UND das
  60-GB-Ladeproblem von gpt-oss/heavy (kollidiert mit VL-30B-Warm-Set).
- deploy.sh: kopiert feed + fremdblick nach ~/.hermes/scripts (chmod +x).

E2E gegen die Box verifiziert (cron-Kontext): Kritiker gatet + diskriminiert
(2 Overclaims als TRAEGT-NICHT abgelehnt, Zahlen korrigiert), Vault sauber
committed, Warm-Set unberuehrt.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 16:41:59 +02:00
Hitonabi 51552ae836 Haertung 1b: Fremd-Modell-Kritiker erzwingen + Anti-Durchwink-Regel
Gesellenpruefungs-Lehre (03.07.): Reviewer winkte kaputten Patch durch.
- wartung/SKILL.md Reviewer-Schritt: FREMD-MODELL-PFLICHT explizit
  (Worker=hermes/Qwen3.6-35B != Reviewer=heavy/gpt-oss-120b via
  delegation.model; per-Aufruf-Modell gibt delegate_task nicht her ->
  Trennung aktiv pruefen, sonst als offene Kritik ausweisen), eigenes
  Raster statt Autor-Erzaehlung, harte Regel REPRODUZIERT-ODER-ABGELEHNT
  (Freispruch nur mit belegtem Vorher/Nachher, sonst = Kritik).
- selbstkritik-prompt.md: Fremdblick vor dem Absenden (delegierte
  Kritiker-Runde auf anderem Modell zerpflueckt Belege).

Akzeptanz verifiziert gegen die Box: bewusst kaputter Patch (Kommentar
behauptet Fix, Logik fixt nicht) -> gpt-oss-120b ABGELEHNT mit konkreter
Reproduktion. Kein Deploy in diesem Commit.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 13:36:22 +02:00
Hitonabi 78448220b2 Observability 1a: Per-Turn-Latenz-Trace + Latenz-Karte
voice_metrics.py: neben den rollenden Stats jetzt ein echter Per-Turn-Trace
(TurnTrace + Ringpuffer der letzten 60 Turns). Balken-Stufen zeitlich disjunkt
(stt · vision · hirn · gen); hirn misst ab mark_brain_start() VOR dem Hermes-
Request, damit die Vision-Zeit nicht doppelt gezaehlt wird. STT (davor) und
Mem0-Retrieve (Rueckruf waehrend) werden per park()/_take_* best-effort dem Turn
zugeordnet (Ein-Nutzer-Geraet, kein Turn-ID noetig). Mem0 = Unter-Detail INNERHALB
hirn (nicht addieren) -> ehrlich, kein Doppelzaehlen.

voice.py: TurnTrace in voice_chat's gen() (commit garantiert 1x via finally, auch
bei Fehler/Abbruch). STT-Endpoint parkt seine Dauer. NEU: GET /api/voice/metrics
(schliesst die Luecke - selbstkritik-feed.sh curlte das, existierte nie -> 404) +
GET /api/voice/trace?limit=N.

memory.py: GET /api/memory?q=... (= Hermes' Mem0-Prefetch) misst + parkt die
Retrieve-Zeit.

Frontend: LatencyCard (gestapelte Balken je Turn, "Taeter" = groesste Stufe,
Fehler-Turns rot, Tooltip mit "davon Mem0 X s"), Query useVoiceTrace, in der
Zentrale unter "Stack & Telemetrie". Lokal gegen Seed-Server verifiziert: 30,3-s-
Haenger -> Hirn-Balken 94% + "davon Mem0 26,1 s".

Grenzen (ehrlich, als Fussnote in der Karte): Tool-Runden im Hermes-LLM-Loop haben
keinen Callback an MC2 -> stecken in "Antwort". Reine Telegram-Text-Turns laufen an
MC2 vorbei und erscheinen hier nicht.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 13:21:52 +02:00
Hitonabi 58021331e1 Warm-Set haerten: brains-Mitglieder bekommen automatisch ttl:0
set_group() setzte persistent:true (Verdraengungsschutz), aber NICHT ttl:0. persistent
schuetzt nur gegen Verdraengung durch andere Modelle, nicht gegen ttl-Selbstentladen →
ein Mitglied mit ttl>0 faellt trotz brains-Mitgliedschaft nach Leerlauf aus dem Warm-Set
(live: VL-30B mit ttl 300 entlud sich alle 5 Min). Jetzt erzwingt set_group bei persist=True
ttl:0 fuer jedes Mitglied → der Fehler kann beim Warm-Set-Umbau nie wieder passieren.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 12:29:00 +02:00
Hitonabi ab63b05b9c Repo-Schnappschuss: VL-30B ttl 300->0 (Warm-Set-Drift schliessen)
Live war VL-30B (Augen) schon auf ttl:0 gesetzt, der Repo-Schnappschuss
deploy/llama-swap.config.yaml stand aber noch auf ttl:300 -> bei einer
Neu-Provisionierung aus dem Repo waere der Warm-Set-Auskuehl-Bug
zurueckgekommen (persistent schuetzt nicht gegen ttl-Selbstentladen).
Kommentar auf den Live-Stand (Augen/vision, brains-Mitglied) aktualisiert.
Reiner Snapshot-Fix, kein Live-Effekt (Deploy fasst llama-swap-Config nicht an).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-04 00:19:10 +02:00
Hitonabi 8e4aca9f5c Discover: Katalog auf Juli-2026-Stand + Badge-Alias-Fix
Katalog-Daten (models_catalog.json) waren teil-stale (Stand 27.06.):
- vision: Qwen3-VL-30B-A3B-Instruct ergaenzt (neue Augen, MoE 30B-A3B) — sonst
  empfahl der "Modelle finden"-Tab weiter das aeltere VL-8B (Downgrade).
- scout: gemma-4-26B/31B (laengst entfernt) durch das live genutzte GLM-4.6V-Flash
  ersetzt.
- version 2026-06-27 -> 2026-07-03.
Bewusst NICHT aufgenommen: Qwen3.6-27B dense — im 3-Wege-Bench (tg 12,7 vs 60-91
der MoE-Coder) als Coder-Worker unterlegen, keine Empfehlung.

Badge-Fix (Discover.tsx): installedModel matchte nur das primaere role-Feld; ein
Modell kann eine Kategorie aber ueber einen Alias bedienen (Qwen3.6 = role "hermes"
+ Alias "fast") -> Fast-Karte zeigte faelschlich "Frei". Jetzt Match per Rolle ODER
Alias. Live gegen die Box verifiziert: alle 5 Rollen-Karten "Aktiviert".

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 23:46:32 +02:00
Hitonabi 494037dee5 MC2 Final (D16 f): Voice-Metrik-Reste raus + README auf Final-Stand (C15)
f) Lucy/Voice-Reste aus dem MC2-Web-UI entfernt (kein "Sprechen"-Tab mehr):
   VoiceLatencyCard + Sprach-Latenz-Plumbing (queries/api-Typen) und der
   Backend-Leseendpoint /voice/metrics raus. Der Proaktivität-/Alarm-Kanal
   (/voice/announce, /alarm) und die STT/TTS/chat-Proxys bleiben unberührt.
C15) README auf den Final-/Autonomie-Stand aktualisiert (Mem0 statt SQLite-MCP,
   live+eingefroren, Lucy als eigenes Repo, Fangnetz-Updates/Werkstatt).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 20:23:24 +02:00
Hitonabi 8a2db70f3c MC2 Final (D16 c+e): System-Logs mit Fehler-Farben/Filter + Auto-Dedupe
c) System-Logs ausgebaut: neue LogConsole-Komponente färbt Fehler (rot) und
   Warnungen (amber) ein, "Nur Probleme"-Filter mit Zähler, Zeilen-Suche;
   voice-service in die Dienst-Liste aufgenommen (war nur backend-seitig).
e) Mem0-Dubletten automatisch: deterministischer Auto-Dedupe-Loop (täglich,
   apply=True, Schwelle 0.9 > manueller 0.85 da ohne Review) als Backend-
   Hintergrund-Task — kein Memory-Bloat mehr ohne Zutun. Knopf bleibt on-demand.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 20:12:11 +02:00
Hitonabi 5ee3f8f73d D16d-Fix: volles Warm-Set nachwärmen statt nur das Hirn
Auto-Rewarm (Nudge + Idle-Tick) lädt jetzt das GANZE Warm-Set über
deploy/warmup.sh nach (fast+vision via chat, embed via /v1/embeddings,
Agent-Prompt-Prefill) statt nur einen Brain-Ping. Erkennt TEIL-Kälte
(Mitglied fehlt in /running), nicht nur den komplett leeren Zustand —
genau der Fall nach einem watch-config-Reload/Deploy (Augen+Gedächtnis
fielen raus, Hirn blieb warm). deploy.sh ruft am Ende warmup.sh.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 19:57:31 +02:00
Hitonabi ce55752249 Doku (B11d): AGENTS.md — Projekt-Geschmack fuer die Coding-Lane
Zed + Kilo Code lesen AGENTS.md nativ. Destilliert die Projekt-Wahrheiten, die man
sonst schmerzhaft lernt: Deutsch fuer alles User-Sichtbare (Hermes-Prompts bleiben
englisch), frontend/dist wird committet (kein Node-Build auf der Box), Deploy macht
reset --hard origin/main (nie direkt auf main), Box=UTC/MC_LOCAL_TZ=Berlin,
py_compile-Gate, Restart-Allowlist nur in services.maintenance, Hermes nie forken,
Security nie ohne User-Ja, Gitea-Push mit Retry.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 19:45:34 +02:00
Hitonabi d0688a7b64 Wartung (B10): Restart-Allowlist vereinheitlichen
Der ServicesCard-"Anzeige- statt Unit-Name"-Bug ist behoben (Frontend nutzt
durchgehend x.unit). Der echte Rest-Fehler lag in der ZWEITEN Restart-Wahrheit:
/api/system/restart (system.py) + das MCP-Tool restart_service hatten eine
veraltete Allowlist ohne llama-swap (Engine) und hermes-terminal, dafuer mit
Geist-Eintrag hermes-webui. Ein Engine-Neustart per Sprache/MCP schlug daher mit
"nicht erlaubt" fehl.

Fix: /api/system/restart delegiert jetzt an services.maintenance.restart_service
(EINE Allowlist-Wahrheit, kennt System- via sudo -n UND User-Dienste, wird auch
von der UI genutzt). MCP-Tool-Docstring auf die echten Dienste korrigiert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 19:45:34 +02:00
Hitonabi 4e5a7eed35 MC2 Final (D16 a/b/d): verständliche Updates + ehrliche Speicher-Zahlen
a) Update-Meldungen: generischer Release-Summarizer in Lucys Stimme mit
   strukturiertem Aktions-Verdikt ("Musst du etwas tun? NEIN/JA") für
   Hermes, Engine (llama.cpp) und llama-swap; Fangnetz-Hinweis verheiratet
   Breaking-Change-Sorge mit dem Postcheck.
b) OS ehrlich: zurückgestellte Pakete (Phasen-Rollout / kept back) werden
   ausgewiesen statt scheinbar zu hängen.
d) Ehrliche Speicher-Zahlen: KV-Cache aus echten GGUF-Architektur-Daten
   (Layer × KV-Köpfe × head_dim) + KV-Quant aus dem cmd statt params-blinder
   Schätzung — footprint_gb als eine Zahlensprache (Zentrale, Modell-Manager,
   fits-Check auf warmset+largest). Auto-Rewarm-Nudge nach Config-Reload.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 19:40:59 +02:00
Hitonabi 612ce127fa Autonomie 0d+0g: Lucy-Alarm-Weg, taegliche Selbst-Smokes, Selbstreparatur nach rotem Update
- /api/alarm: Lucy-unabhaengiger Telegram-Weg (fuer den PC-Lucy-Watchdog, wenn die App haengt).
- self-smoke.sh + mc2-selfsmoke.timer (taeglich 07:15): Gateway/Tools/Voice aktiv durchspielen,
  Meldung nur bei Rot. Ergaenzt den passiven Health-Waechter um echte Funktion.
- self-repair.sh + autoupdate.sh: bei rotem Hermes-Update zieht die Box Config-Brueche selbst
  (nur eindeutige, nicht-sicherheitsrelevante Keys; Backup -> YAML-Check -> Gehirn-Check, sonst
  zurueck). Greift es nicht, haengt eine LLM-Diagnose an die Rollback-Meldung.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 19:27:31 +02:00
Hitonabi 357285e798 C12: Off-Box-Backup-Spiegel auf den Proxmox-Host (rsync)
backup.sh spiegelt nach dem lokalen Tarball die Backups per rsync aufs
Proxmox (root@192.168.178.108:/var/lib/vz/mc2-backups) -- Retention via
--delete mitgezogen, chmod 600 erhalten, best-effort (Fehlschlag = lokal
gilt trotzdem). restore.sh kennt den Spiegel: --list zeigt Off-Box,
--pull-offsite holt alles zurueck, und fehlt ein Backup lokal, wird es
automatisch vom Proxmox gezogen (Platte-tot-Fall). Nebenbei latenten
Abbruch in list_backups bei leerem Ordner gefixt (set -e + leeres Glob).
Auth: dedizierter, gehaerteter Key ~/.ssh/mc2_offsite. Live E2E verifiziert.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 19:26:04 +02:00
Hitonabi b21794a750 Werkstatt haerten (0k): Reviewer muss Fehlerfall nachstellen, Gate prueft Live-Checkout
Zwei Befunde aus der Gesellenpruefung (03.07.):
- Reviewer-Subagent war zu milde -> Skill fordert jetzt: konkreten Fehlerfall
  nachstellen + aktiv nach Versagen suchen, Urteil konkret ausschreiben.
- "Live unberuehrt" war nur curl-geprueft -> Gate verlangt jetzt zusaetzlich
  git status --porcelain -uno == leer im Live-Checkout.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-03 19:04:57 +02:00