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>
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>
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>
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>
- /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>
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>
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>
mcp_voice.py = Sprach-Lane-Teilmenge: reminder_create/list/delete + box_status.
Die api_server-Plattform (Lucy) bekommt per platform_toolsets.api_server nur
diesen statt der vollen mission-control-stack-Control-Plane (26 Tools) —
CLI/Telegram/Werkstatt bleiben unangetastet.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- services/announce.py: persistenter Briefkasten (/srv/models/mc2-announce.json),
POST /api/voice/announce + GET /api/voice/announcements (Cursor-Polling)
- services/sentry.py: Health-Wächter (Engine/Hirn/Hermes/Mem0/Voice/Platte),
flankenerkannt (Alarm nach 3 Fehl-Ticks, Entwarnung, 6h-Erinnerung),
meldet in Briefkasten + Telegram; Hirn-Verdrängung durch IDE-Last = kein Alarm
- notify.sh spiegelt jede Telegram-Meldung in den Briefkasten (Updates/Radar
erreichen damit auch die Desktop-Lucy)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Gemessen 03.07.: erster User-Call nach Modell-Reload 37 s (Prefill des
~70-KB-Hermes-Prompts, 50 KB davon Tool-Schemas), mit warmem Prompt-Cache
~6 s. warmup.sh schickt nach dem Modell-Laden einen Wegwerf-Turn an den
api_server (:8642, wartet auf /health) — der -cram-Cache ist damit gefuellt,
bevor der User zum ersten Mal fragt. Strukturelle Prompt-Diaet = Faden 7.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Nutzer-Fund: Die Faehigkeiten-Liste zeigte Hirn/Gedaechtnis/Gateway/Agent/
Stimme, aber nicht die Augen — obwohl das Vision-Modell seit heute zum
Immer-bereit-Set gehoert. Neuer Check (nicht kritisch): gruen wenn das
vision-Modell geladen ist, sonst Warnung mit 1-Klick-"Augen aufwecken".
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Nutzer-Fund (Screenshots 03.07.): drei UI-Diskrepanzen im Modell-Manager.
1) Augen (VL-8B) hatten ttl 300 + fehlten im Warmup — standen also entgegen
dem UI-Versprechen NICHT immer bereit. Jetzt ttl 0 (Box live + Snapshot)
und Warmup-Default "fast vision".
2) Warn-Text beschrieb das alte Verdraengungs-Verhalten (seit persistent-Fix
falsch) — jetzt: Set bleibt geladen, bei Ueberlauf scheitert das grosse
Modell. 3) "Reserviert" als Vorsichts-Schaetzung/Obergrenze gekennzeichnet
(68,8 GB Schaetzer vs. 25 GB real — Schaetzer-Umbau ist eigener Faden).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1) /v1-Gateway haengt an jede Chat-Anfrage (ausser hermes/Lucy — SOUL.md
regelt das selbst) eine System-Direktive an: Antworten auf Deutsch,
Code/Bezeichner unveraendert. Abschaltbar via MC_GATEWAY_LANG_DIRECTIVE="".
2) mcp_web.py: neues Tool web_search (ddgs/DuckDuckGo, kein Key), Ergebnis
injection-geschuetzt via wrap_untrusted. Damit koennen IDE-Agents (Zed
via context_servers) und Hermes im Web suchen; Debug-Log geht auf stderr,
stdout bleibt MCP-sauber (verifiziert).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Live gefunden (Zed-Start warf Lucys Hirn raus): llama-swap ignoriert
unbekannte Group-Keys stillschweigend — der Verdrängungsschutz der
brains-Gruppe war seit jeher wirkungslos. set_group() schreibt jetzt
beide Keys (persistent für llama-swap, persist für MC2-API/UI),
budget.py rechnet die echte Ko-Residenz (on-demand reserviert das
Warm-Set statt 0), Warn-Texte beschreiben Überlauf statt Verdrängung.
Box-Config live gefixt + verifiziert: Coder und Qwen3.6 gleichzeitig ready.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Token mc2-box-werkstatt (write:repository) auf der Box hinterlegt (User-Freigabe 02.07.),
Push verifiziert. Leitplanke bleibt: NIE nach main pushen, Merge+Deploy macht der PC.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
tsc bestaetigte exakt die vom Werkstatt-Gate angekuendigte Luecke (4x TS2339 unit)
-> ServicesResp.services um unit ergaenzt, Build gruen.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Radar-Endnachricht + Werkstatt-Telegram in Lucys Stimme an den Commander (Fazit zuerst,
Technik in Alltagssprache); autoupdate-Summary angepasst. Hintergrund: SOUL.md der Box
wurde auf Lucy-Identitaet umgestellt (Review-Session 02.07.).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Ground-Truth-Abgleich ergab 4 Fehler mit einer Ursache (Inventar-Blindheit):
nie Updates auf installierte Versionen empfehlen; bei aktiv genutzten Komponenten
(Parakeet=STT deutsch! Silero v5, pocket-tts) erst eigene Nutzung nennen; bereitliegende
Kandidaten (gpt-oss-120b, VL-30B) nicht als Neuentdeckung verkaufen. hipEngine-Fund
des Reports war echt und korrekt eingestuft.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Radar-Erstlauf-Lehre: Hermes-Subagents fanden keine Kontextlaenge (llama-swap listet
nur kanonische Namen, ohne Metadaten), nahmen 256k an und rissen mit ihren max_tokens
den Server-Kontext. Gateway blendet jetzt Rollen-Aliase als Eintraege ein und liefert
context_length aus der geparsten llama-swap-Config. Delegation per hermes config auf
Verdikt gesetzt (max_concurrent_children 2, max_spawn_depth 1). Radar-Prompt: Fallback
"sequenziell selbst recherchieren, Report muss IMMER kommen".
Erstlauf-Ergebnis: Report wurde an Telegram zugestellt (Last run ok).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Roo Code wurde April 2026 eingestellt (Repo archiviert) — Kilo Code ist der aktive
Nachfolger der Roo/Cline-Linie (Orchestrator-Modus, Modell-pro-Modus, JetBrains+CLI).
Cursor/Zed/Continue raus (cloud-first bzw. von Kilo abgedeckt). Kilo-Note enthaelt die
Modus-Zuordnung: Code->coding, Architect/Orchestrator->heavy, Ask/Debug->chat.
Das Evolution-Radar (AUTONOMIE_PLAN E4) ueberwacht die Tool-Kategorie kuenftig selbst.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Konflikte zugunsten lucy-v2 aufgeloest (Superset; mains UI-Rework war dort dupliziert),
dist wird nach dem Merge frisch gebaut.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- Update-Job: nach 'hermes update' laeuft 'hermes doctor' (Job rot bei Fehlern)
- hermes-postcheck.sh: Journal-Scan auf Unknown/deprecated/defaulting (Lehre aus v0.18:
approvals.mode 'auto' wurde still ungueltig -> alle Tools in pending_approval),
Tool-Smoke (echo via Agent, erkennt pending_approval), Voice-Smoke (/api/voice/chat)
- Update-Modal: die Box fasst anstehende Hermes-Commits selbst zusammen (fast-Modell,
no-think, gecacht auf neuesten Hash) — Breaking Changes zuerst
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Der v0.18-Security-Scan flaggt schemenlose URLs (wttr.in/... = MEDIUM) -> Approval-Umweg;
dazu hing ein wttr.in-curl 31s ohne Timeout. Beides ist Prompt-steuerbar.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
User-Feedback 'sehr langsam' diagnostiziert (voice_metrics): (1) zwei App-Instanzen liefen
parallel (Dev-Instanz vergessen — beendet), (2) Semantik-Hold hielt echte Saetze auf.
- useVAD: warten NUR noch bei sehr sicherem 'unfertig' (P(fertig) < 0.15 statt < 0.5),
max. eine Warterunde pro Aeusserung, HOLD 1,8s -> 1,2s, Not-Aus localStorage
lucy_turncheck=0, Entscheidung wird bei lucy_perf=1 geloggt (fuer echtes Nachtunen)
- voice_service: Smart Turn beim Start vorwaermen (Probe-Inferenz auf Stille) — der
3,3s-Kaltstart traf sonst den ersten gesprochenen Satz; deployt + verifiziert (0,16s)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Bench (Box, Vulkan, 32k ctx): gpt-oss-120b tg 54-55 t/s vs. Qwen3.5-122B 23,5 t/s bei
60 statt 73 GB. Beide OHNE Alias-Wechsel deployt — Qualitaets-Entscheid beim User.
brains-Gruppe nach Reload wieder angewaermt (hermes/embed/vision ready).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- views/models/cockpit/RoleAssignModal.tsx: Rollen-Zuweisung inkl. Empfehlungs-Sortierung
und Schutzgelaender als eigenstaendige Komponente
- Preview-verifiziert gegen die Live-Box: Modal oeffnet per Slot-Karte ('Lucys Hirn
festlegen'), Schutzgelaender greift, 9 Modell-Optionen, schliesst sauber
- Zone C (Library, ~440 Z) bleibt fuer eine Folge-Session (tief mit Aktions-State verwoben)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- voice_service /turn: smart-turn-v3.2 (8MB ONNX, ~110ms warm inkl. Features); Audio muss
LINKS gepadded werden (rechts-Padding -> konstant 'complete', live diagnostiziert) und
der Output ist empirisch P(unfertig) — Doku sagt es andersherum, Messung gewinnt
- backend /api/voice/turn: Proxy mit fail-open (Turn-Check ist Optimierung, kein Blocker)
- useVAD: Semantik-Hold — bei 'incomplete' bis 1,8s auf Fortsetzung warten und anhaengen,
statt mitten im Gedanken zu antworten; Deckel 30s; fail-open bei Netzfehlern
- Verifiziert: fertig=true(0.74), mitten-im-Wort=false(0.04), via :9001 ok
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
JS-Fehler in einer View fuehrten zum weissen Screen ohne Meldung; jetzt Fehleranzeige
mit Neu-laden-Knopf am App-Root (GraphView behaelt seine eigene Boundary).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- onnx-asr (int8, CPU) als neue STT-Engine im Voice-Sidecar; whisper bleibt lazy Fallback
- Engine per VOICE_STT_ENGINE + pro Request (Form-Feld engine) waehlbar
- A/B auf der Box (10,8s DE-Audio): parakeet 0,45s vs whisper-medium 2,44s, Transkript identisch gut
- Live deployt + verifiziert (auch ueber :9001-Proxy: 0,46s)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- VoiceView + components/voice + lib/voice entfernt (lebt jetzt in client/lucy-desktop)
- mc3/: Basisstation-Prototyp hinter #mc3-Weiche (non-destruktiv)
- roleMeta/useLucyHealth/useExpertMode/ExpertToggle/LucyHealthCard/WarmSetManager (UI-Rework, auf main a341d25 committet, hier nachgezogen)
- dist frisch gebaut (Asset-Stand war inkonsistent: alte geloescht, neue untracked)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Qwen3.6 ist ein Thinking-Modell; ohne Abschaltung 11k Reasoning-Token vor jeder kurzen Antwort (~30s TTFB). voice.py umging die Gateway-Lane -> gleiches chat_template_kwargs-Muster nachgezogen, env MC_VOICE_NO_THINK. Gemessen ~30s -> ~3s.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Der auto-lernende Mem0-Store sammelte trotz Relevanz-Direktive viel Müll:
Fakten ÜBER den Assistenten selbst (Hermes/Lucy), transiente Zustände
(Commit-Rückstand, Cronjob-Läufe, Onboarding-/Test-Fragen) und Gesprächs-Meta.
Live-Store war zu ~40% solcher Ballast; der niedrige Recall-Schwellwert (0.3)
blendete zudem marginale Fakten pro Turn ein und brach damit --cache-reuse.
- mem0_service/app.py: custom_instructions verschärft (NIEMALS Fakten über den
Assistenten selbst / keine zeitgebundenen Zustände) + deterministischer
Post-Extraktions-Guard (_is_junk_fact) löscht Assistenten-Meta/transiente
Fakten, die mem0-OSS trotz Direktive extrahiert — unabhängig vom LLM.
- hermes/plugins/mc2-memory/__init__.py: RECALL_MIN_SCORE 0.3->0.5 (nur starke
Treffer, oft leer -> stabilerer Prompt-Prefix -> --cache-reuse greift),
MIN_USER_LEN 12->25 + Trivial-Turn-Skip (Begrüßung/Quittung/Aufwärmen).
Alles env-überschreibbar und reversibel. Backend/Frontend unberührt.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Mauszeiger-Verfolgung: Hoch/Runter war invertiert -> Vorzeichen fuer Augen + Kopf/Nacken gedreht
- Performance: animierten filter:blur (Aurora) entfernt, dpr auf [1,1.5] gedeckelt,
Partikel auf eine Ebene reduziert (Ruckeln gemeldet)
- (visuelle Abnahme durch User steht noch aus)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Mauszeiger-Verfolgung: Main pollt globalen Cursor (screen.getCursorScreenPoint), Renderer richtet
Augen (lookAt-Offset in Kamera-Achsen) + dezent Kopf/Nacken danach aus
- Antippen/Streicheln: Klick auf den Avatar -> kurze freudige Reaktion (Laecheln + Kopf-Wackeln)
- Ziehen: im Overlay ist der Avatar eine Drag-Region (am Koerper greifen -> Fenster verschieben),
Kamera-Drehung (OrbitControls) im Overlay aus; Blasen/Knoepfe bleiben no-drag
- neue IPC-Events: lucy:cursor (+ preload onCursor)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Chat:
- react-markdown/remark-gfm: Lucys Antworten formatiert (fett/listen/inline-code)
- Code-Bloecke mit Kopier-Knopf; Links oeffnen im System-Browser (shell.openExternal via IPC)
- Kopier-Knopf pro Antwort (Hover)
- Persona erlaubt Code/Links SCHRIFTLICH auf Nachfrage; Stimme liest nur kurze Einleitung (cleanForTTS filtert)
Digitaler Raum:
- driftendes Aurora-Licht + schwebende Partikel (2 Parallax-Ebenen) + Vignette ueber dem Neon-Gitter
- reine CSS-Animation (GPU), im Overlay weiter ausgeblendet
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- alle ~20-35s ein Einmal-Clip (Strecken/Umschauen), dann zurueck in die Ruhe
- bricht sauber ab, sobald zugehoert/gedacht/gesprochen wird
- kurze passende Mimik (Laecheln beim Strecken)
- (visuelle Abnahme durch User steht noch aus)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- @pixiv/three-vrm-animation: VRMA-Clips laden/abspielen (AnimationMixer)
- Ruhiger prozeduraler Leerlauf als Basis; echte Thinking-Pose blendet beim Nachdenken ein
- (.vrma sind Gesten, kein Ruhe-Loop -> nicht als Dauerschleife; Einmal-Einschuebe folgen)
- Blick-Sakkaden gegen eingefrorenes Gesicht
- VRMA-Clips: tk256ailab/vrm-viewer (MIT), siehe public/vrma/ATTRIBUTION.md
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Lippensync: spektraler Schwerpunkt -> aa/ih/ou-Mundformen statt nur Pegel ("Mund auf/zu")
- Augen blicken auf weit entfernten Punkt in Kamerarichtung -> kein Konvergenz-Schielen bei naher Kamera
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Backend:
- MTP-Drafter-Support (Multi-Token-Prediction): erkennt MTP-Köpfe neben dem Modell
(mtp-*.gguf / *-assistant, arch gemma4-assistant), schreibt
--model-draft … --spec-type draft-mtp --spec-draft-n-max statt draft-simple.
_parse_model erkennt --model-draft/-md; drafts_for/set_spec_draft/find_compatible_draft
MTP-bewusst. Backward-kompatibel (klassische Drafts unverändert). (config.SPEC_DRAFT_N_MAX)
- register_model: cache-reuse/-cram als Default (Drift-Fix — neue Installs wie der
hand-getunte Box-Stand), --parallel 2 nur noch für coder (kein ctx-Halbierungs-Footgun),
Spec-Auto-Attach für alle Rollen self-guarding.
- budget.reserved_gb auf die VERIFIZIERTE llama-swap-Gruppen-Swap-Semantik angeglichen:
on-demand-Modelle verdrängen die brains-Gruppe und laufen allein (reservieren 0, voller
GTT); brains-Member reservieren nur die übrigen Member. Tote _persist_members entfernt.
Frontend:
- SpecDraftModal zeigt MTP-Drafter mit MTP-Badge (DraftInfo.mtp).
Docs:
- docs/OPTIMIZATION_PLAN.md: vollständiges Audit + Umsetzungs-Log (W1/W2 Warm-Set,
gemma ctx/fa/cache-reuse/MTP 52→70,8 t/s, fast --parallel 1, scout=GLM-4.6V-Flash),
alles live gegen die Box verifiziert.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- ROLE_IDS (llamaswap, sources) + UI-Rollenlisten (ModelBadges, Discover,
ModelBrowse, Cockpit-Slot-Grid) um `hermes` erweitert: gemma erscheint als
„Hirn", nicht mehr als scout.
- Neuer set_ttl-Helper; set_agent_brain erzwingt ttl:0 (neu + idempotent beim
Re-Setzen) und liefert eine weiche Budget-Warnung (kein Hard-Block) bei OOM.
- brain_status/brain_model_name: zeigen das echte Hirn (Rolle hermes / Hermes
model.default) statt hart `fast` (Bugfix Health-/Ready-Check).
- POST /api/models/{id}/role delegiert die Rolle `hermes` an den warm-bewussten
Flow (Alias + brains-Gruppe + ttl 0 + Hermes-Config + Gateway-Restart).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Schlanke Glance-Anzeige der echten Speicher-Pool-Belegung (gtt_used/gtt_total
inkl. KV aus sysStatus.gpu) oben in der Modelle-Karte — teal/amber/rot ab 70/88 %.
Keine Karten-Doppelung: die volle interaktive VRAM-Bar + „Alle entladen" bleibt
im Modell-Manager.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Beseitigt Redundanzen/Mismatches, die sich mit den Lanes angesammelt hatten:
- Modell-Manager: großen animierten SVG-Gateway-Graph (~310 Z.) entfernt —
Rolle→Modell deckt das Slot-Grid ab, Lanes der Lane-Editor, IDE-Config die
"Verbinden"-Seite. Cockpit-Brain-Switch raus → Verweis auf Hermes-Tab.
- Hermes: zweiten SVG-Graph + 4 Status-Kacheln durch einen ruhigen Box→Pfeil-
Fluss ersetzt (Terminal → Gateway → Hirn/Verdrahtung/PC), Stil wie "Verbinden".
- Hirn-Wechsel vereinheitlicht: nur noch im Hermes-Tab. Installiert = warm-bewusst
(/api/agent/brain/set), Alias = /api/agent/brain; Lane-Aliase chat/coding/fast/heavy.
- Terminologie auf Lane-Sprache: ConnectView "model auto" → chat/coding;
connect.py-Snippets defaulten auf 'coding' (GATEWAY_MODELS mit Lanes vorn).
- Zentrale: ActiveModelsCard + RolesCard zu einer ModelsCard verschmolzen
(Rollen + warm + Inferenz + Größe); Layout entdoppelt.
~600 Zeilen SVG-Graph-Code raus, 2 tote Karten gelöscht. Verifiziert:
npm run build (tsc strict) clean.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Teil 1: VoiceLatencyCard auf dem Dashboard (GET /api/voice/metrics, C2) —
zeigt STT/Vision/Chat-TTFB/TTS mit p50/p95/last + count.
Teil 2: UI-editierbare Routing-Policy. Neuer routing_policy.py (hot-reload JSON
unter MODELS_DIR/mc2-routing.json, Env=Defaults, atomarer Write, Validierung).
router_logic, gateway_proxy und gateway.routing_summary lesen jetzt live via
load_policy(); routing_summary ist lane-bewusst (chat/coding statt altem auto).
Neue Endpoints GET/PUT /api/routing/policy.
Teil 3: LaneEditor.tsx als ZONE im Cockpit (chat/coding-Aliase + Schwellen +
fast_no_think, Speichern/Default-je-Feld); Gateway-Node zeigt die Lanes.
Verifiziert: npm run build (tsc strict) clean, FastAPI TestClient (GET/PUT,
Validierung, Persistenz, Hot-reload durch die API), venv-Smoke (Routing).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Neues services/voice_metrics.py (rollend, thread-safe, in-memory): misst STT,
Vision-Beschreibung, Chat-TTFB (Hermes-Stream) und TTS server-seitig. voice.py
instrumentiert die vier Stufen; GET /api/voice/metrics liefert avg/p50/p95/last
je Stufe. Macht aus Latenz-Vermutungen Messdaten — Anzeige folgt im Frontend (E).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Agentisches Coden (OpenCode/RooCode/…) hat immer großen Repo-Kontext; die alte
Regel routete >24k Zeichen auf heavy (Allzweck-122B) statt auf einen Coder =
Downgrade der Coding-Fähigkeit. Jetzt: coding -> CODER immer. Optionaler leichter
schneller Coder via MC_ROUTE_CODER_LITE (Phase 2b: Qwen3-Coder-30B), Eskalation
auf den starken Coder bei Architektur-Keywords / sehr großem Kontext.
Reason-Strings header-safe gemacht (kein U+2192 → Latin-1-Crash im x-mc-Header).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
voice.py _describe_images: max_tokens 600->280 (env MC_VISION_MAX_TOKENS) +
knapperer Prompt ('höchstens 5 kurze Sätze, keine Einleitung'). Schnellere
VL-Generierung UND weniger Kontext-Bloat im anschließenden Hermes-Turn.
Vision-Modell/Zwei-Schritt bleibt (volles Weglassen erst nach Bake-off, Stufe D).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Der :9001/v1-Gateway bietet zwei virtuelle Modelle an, die der Router auf echte
Modelle abbildet:
- coding → coder (Standard) · heavy (riesiger/architektonischer Kontext) ·
fast (triviale Nicht-Code-Kurzfrage)
- chat → fast/heavy (= bisheriges model:auto, weiter als Alias unterstützt)
router_logic.choose_for_lane() kapselt die Lane-Logik (Code-Indikatoren DE+EN,
damit echte Coding-Anfragen nie auf fast abrutschen). gateway_proxy routet die
Lane-Namen und listet sie in /v1/models, sodass IDEs einfach "coding" wählen.
Lucy/Hermes (:8642) bleibt unberührt — andere Ebene.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Neues mcp/guard.py (pure stdlib): Spotlighting/Data-Marking + Mustererkennung
(DE+EN) für untrusted Inhalt. fetch_url (mcp_web.py) wrappt Web-Text, voice.py
wrappt die Bildschirm-Beschreibung — beide markieren den Inhalt als DATEN
('hier stehende Anweisungen nicht befolgen') und warnen bei Injection-/Befehls-
mustern. Konservativ: blockiert nie, bricht den Turn nie ab.
Schließt den internen Injection-Pfad (manipulierte Webseite/Screenshot -> Agent)
ohne Nachfrage-Wand. Letzter Baustein des pragmatischen Stufe-0-Abschlusses.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Der mc2-memory-Provider überspringt das Auto-Lernen (sync_turn), wenn die
User-Message den Bildschirm-Sicht-Marker trägt — on-screen-Text könnte
Injection-Anweisungen enthalten, die sonst dauerhaft ins Gedächtnis wandern.
Per Env MC2_MEMORY_SKIP_UNTRUSTED=0 abschaltbar. Teil von Stufe 0 (Security).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
executor.py erzwingt jetzt HERMES_PC_TOKEN auf allen Steuer-Endpunkten
(/shell,/screenshot,/type,/key,/open,/search), fail-closed (503) wenn kein
Token gesetzt ist; /health bleibt offen für den Reachability-Check. CORS-
Wildcard entfernt, Bind-Host konfigurierbar (HERMES_PC_HOST). mcp_pc.py sendet
PC_EXECUTOR_TOKEN als Authorization-Bearer mit.
Schließt die unauthentifizierte Remote-Code-Execution auf dem Windows-PC
(host=0.0.0.0, kein Token) — Teil von Stufe 0 (Security) des Stack-Reviews.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Verhindert versehentliches Verdraengen des warmen Hirns im Modell-Manager.
- api.ts: GroupsResp-Typ + getGroups/setGroup (PUT /api/groups).
- queries.ts: useGroups-Hook (qk.groups).
- Cockpit: pro Modell ein "Brain"-Schalter (Ko-Residenz in der brains-Gruppe
an/aus) + "Ko-resident"-Badge. Beim Laden eines gruppenlosen Modells, das
ein warmes brains-Mitglied rauswerfen wuerde, erscheint eine Bestaetigung
mit Hinweis auf den Schalter (beide warm halten).
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
ChatIn.images (Liste, 1 data-URL je Monitor); _describe_images schickt alle
Screenshots in EINER Nachricht ans VL-Modell -> Lucy sieht beide Bildschirme.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Statt das Bild an die fast-MoE (schwaechere Vision) zu geben: das VL-Modell
beschreibt den Screenshot, die Beschreibung geht als Text-Kontext an Hermes.
-> bessere Bilderkennung UND Lucy behaelt ihr volles Hirn/Gedaechtnis.
MC_VISION_MODEL (default 'vision') steuerbar.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>