6 Commits

Author SHA1 Message Date
Hitonabi 9e5392fa4f Meldewege sprechen als Lucy (SOUL.md-Abgleich): Radar-Report, Werkstatt-Vorschlag, Wochenpflege
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>
2026-07-02 21:12:16 +02:00
Hitonabi 14b5c6d6a0 Radar-Tuning nach Report #1: Inventar-Pflicht (Schritt 1) + hermes --version im Feed
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>
2026-07-02 20:52:50 +02:00
Hitonabi 2c8d4a081e E4-Haertung: /v1/models liefert context_length + Alias-Eintraege (heavy/coder/...)
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>
2026-07-02 20:49:57 +02:00
Hitonabi ab8d651efc Autonomie E6+DoD6: Werkstatt-Skill (wartung) + RUNBOOK
- deploy/skills/wartung/SKILL.md: Selbstwartungs-Kreislauf (Worktree -> Patch ->
  Reviewer-Subagent -> Gate -> Telegram-Merge-Vorschlag); Leitplanken hart codiert
  (nie main/merge/deploy/Security-Config); deploy.sh installiert nach ~/.hermes/skills/
- Box hat bewusst KEINE Gitea-Push-Rechte (Token = offener User-Entscheid) -> v1 endet
  beim Merge-Vorschlag mit lokalem Branch
- docs/RUNBOOK.md: 1 Seite Mensch-Anleitung (Telegram-Meldungen, Box tot, Pins,
  einmalige sudo-Session, Automatik-Fahrplan)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 20:29:19 +02:00
Hitonabi dd947298d0 Radar-Prompt: 5. Subagent IDE-/Agent-Tools (Tod-/Nachfolger-Meldungen, Roo-Code-Lehre)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 20:24:15 +02:00
Hitonabi 2c95f1c5bc Autonomie E4: Evolution-Radar (Hermes-cron monatlich, Fan-out-Subagents)
- deploy/radar-prompt.md: versionierter Auftrag (delegate_task-Fan-out mit Muell-Filter,
  Verdikt-Liste inline, kurzes deutsches Telegram-Report-Format)
- deploy/radar-feed.sh: speist Auftrag + Live-Inventar (Updates/Modelle/Versionen/Pins)
  in den Cron-Agenten; deploy.sh kopiert ihn nach ~/.hermes/scripts/
- Cron registriert: evolution-radar, 0 9 1 * * (monatlich), --deliver telegram

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 20:19:41 +02:00
7 changed files with 240 additions and 2 deletions
+26 -1
View File
@@ -21,8 +21,33 @@ async def models():
# Lanes ganz oben einblenden, damit IDEs einfach „coding"/„chat" wählen können.
lanes = [{"id": lane, "object": "model", "owned_by": "mc2-router",
"description": _LANE_LABELS.get(lane, lane)} for lane in LANES]
# Kontextlänge je Modell mitliefern (aus der llama-swap-Config geparst). Ohne sie
# budgetieren Clients blind — Hermes-Subagents nahmen 256k an, schickten passende
# max_tokens und rissen damit den echten Server-Kontext (Radar-Lauf 02.07.).
# Rollen-Aliase (heavy/coder/hermes …) tauchen bei llama-swap NICHT als Einträge auf,
# Clients fragen aber genau damit an → als eigene Einträge einblenden.
ctx_map: dict[str, int] = {}
alias_entries: list[dict] = []
try:
from services import llamaswap
for m in llamaswap.list_models():
ctx = m.get("ctx")
if ctx:
for api_id in m.get("api_ids", []):
ctx_map[api_id] = ctx
for alias in m.get("aliases", []):
entry = {"id": alias, "object": "model", "owned_by": "mc2-alias",
"description": f"Alias für {m['name']}"}
if ctx:
entry["context_length"] = ctx
alias_entries.append(entry)
except Exception:
pass
if isinstance(data, dict) and isinstance(data.get("data"), list):
data["data"] = lanes + data["data"]
for entry in data["data"]:
if (ctx := ctx_map.get(entry.get("id"))):
entry.setdefault("context_length", ctx)
data["data"] = lanes + alias_entries + data["data"]
return JSONResponse(data, status_code=r.status_code)
+1 -1
View File
@@ -163,6 +163,6 @@ check_layer_root swap update-swap.sh "Router (llama-swap)" swap
check_layer_root engine update-engine.sh "Engine (llama.cpp)" engine
check_hermes
notify "Wöchentlicher Update-Lauf fertig:
notify "Commander, die Wochenpflege der Box ist durch — kurz für dich:
$(printf '• %s\n' "${SUMMARY[@]}")"
say "Fertig."
+7
View File
@@ -62,6 +62,13 @@ cp "$SRC/deploy/mc2-backup.timer" "$HOME/.config/systemd/user/mc2-backup.timer"
# Wöchentliches Auto-Update (Router/Engine/Hermes, Rollback+Pin+Telegram) — Autonomie E2.
cp "$SRC/deploy/mc2-autoupdate.service" "$HOME/.config/systemd/user/mc2-autoupdate.service"
cp "$SRC/deploy/mc2-autoupdate.timer" "$HOME/.config/systemd/user/mc2-autoupdate.timer"
# Evolution-Radar-Feed (Autonomie E4): Hermes-cron speist ihn als Prompt ein.
# Cron-Job selbst wird EINMALIG registriert (hermes cron create, siehe docs/RUNBOOK.md).
mkdir -p "$HOME/.hermes/scripts"
cp "$SRC/deploy/radar-feed.sh" "$HOME/.hermes/scripts/radar-feed.sh"
# Werkstatt-Skill (Autonomie E6): Selbstwartungs-Kreislauf für Hermes.
mkdir -p "$HOME/.hermes/skills/wartung"
cp "$SRC/deploy/skills/wartung/SKILL.md" "$HOME/.hermes/skills/wartung/SKILL.md"
systemctl --user daemon-reload
systemctl --user enable mission-control-2 >/dev/null 2>&1 || true
systemctl --user enable hermes-terminal >/dev/null 2>&1 || true
+25
View File
@@ -0,0 +1,25 @@
#!/usr/bin/env bash
# Feed für den Evolution-Radar-Cron (Autonomie E4). Liegt in ~/.hermes/scripts/ (deploy.sh
# kopiert ihn); sein stdout wird dem Cron-Agenten als Prompt eingespeist:
# versionierter Auftrag (deploy/radar-prompt.md im MC2-Repo) + Live-Inventar der Box.
set -uo pipefail
cat "$HOME/mission-control-v2/deploy/radar-prompt.md"
echo
echo "## LIVE-INVENTAR (automatisch erhoben am $(date '+%d.%m.%Y'))"
echo
echo "### Update-Status (MC2 /api/maintenance/updates):"
curl -sf --max-time 30 http://127.0.0.1:9001/api/maintenance/updates \
| jq -c '{os_pakete: .os, engine_update: .engine, router_update: .swap, komponenten: .components}' \
2>/dev/null || echo "(MC2-API nicht erreichbar)"
echo
echo "### Installierte Modelle (llama-swap):"
curl -sf --max-time 20 http://127.0.0.1:8080/v1/models | jq -r '.data[].id' 2>/dev/null \
|| echo "(llama-swap nicht erreichbar)"
echo
# llama-server braucht LD_LIBRARY_PATH auf das Vulkan-Verzeichnis für --version.
echo "### Versionen: llama.cpp $( LD_LIBRARY_PATH=/opt/llamacpp-vulkan /usr/local/bin/llama-server --version 2>&1 | grep -o 'version: [0-9]*' || true ) · llama-swap $( /usr/local/bin/llama-swap --version 2>/dev/null | head -1 || true ) · hermes-agent $( bash -lc 'hermes --version' 2>/dev/null | head -1 || echo '?' )"
echo
echo "### Pin-Register (gepinnte Ebenen NICHT zum Update vorschlagen, aber Sprünge melden):"
cat /srv/models/mc2-pins.json 2>/dev/null || echo "{}"
+64
View File
@@ -0,0 +1,64 @@
# Evolution-Radar (monatlicher Auftrag)
Du bist das Evolution-Radar der AI-Box (AMD Strix Halo, 128 GB, 100 % lokal, Vulkan/RADV).
Dein Job: EINMAL im Monat prüfen, ob sich bei unseren Kern-Komponenten oder in deren
Kategorien ein echter Sprung ergeben hat — und das als kurzen deutschen Report melden.
Unten ist das Live-Inventar der Box eingespeist (Update-Status, installierte Modelle, Pins).
## Schritt 1 (PFLICHT, vor jeder Recherche): Inventar lesen und respektieren
Lehre aus Report #1 (02.07.): vier Fehler, eine Ursache — Inventar ignoriert. Deshalb hart:
- **Empfiehl NIE ein Update auf eine Version, die laut Live-Inventar schon installiert ist.**
(Report #1 empfahl „Hermes v0.18" — die Box WAR auf v0.18.0. `komponenten` im Inventar
zeigt das echte git-behind; behind=0 heißt AKTUELL, egal was Release-Notes suggerieren.)
- **Bei Komponenten, die wir aktiv nutzen, erst die EIGENE Version/Nutzung feststellen,
dann Neuigkeiten bewerten.** Aktiv im Einsatz (Stand Repo):
Parakeet via onnx-asr = UNSER STT (25 EU-Sprachen inkl. Deutsch, ~0,45 s — nie als
„kein Deutsch-Fokus" abtun) · Silero VAD **v5** via vad-web in Lucy (v6 existiert) ·
pocket-tts german_24l (CPU, auf dem PC) · Hirn Qwen3.6-35B (MTP-Draft, immer warm).
- **Die Modell-Liste im Inventar enthält auch schon geladene KANDIDATEN** (z. B. gpt-oss-120b,
Qwen3-VL-30B) — die liegen bereit und sind gebencht; nicht als „Neuentdeckung" verkaufen.
- Jede Versions-Aussage im Report muss gegen das Inventar geprüft sein.
## Arbeitsweise: Fan-out mit Subagents (WICHTIG)
Nutze `delegate_task` mit einem `tasks`-Array (role: leaf), um die Recherche in ISOLIERTE
Subagents aufzuteilen — pro Task eine Komponenten-Gruppe. Jeder Subagent recherchiert per
Web-Suche, FILTERT Marketing-Geschwätz aus und liefert dir nur eine Substanz-Zusammenfassung
(max. 5 Zeilen pro Komponente). Du konsolidierst am Ende. Erwähne im Endbericht nur, was
Substanz hat — „nichts Nennenswertes" ist ein gültiges und gutes Ergebnis je Gruppe.
Scheitern Subagents wiederholt (z. B. Kontext-Fehler), recherchiere die betroffenen Gruppen
selbst sequenziell — der Report muss IMMER zustande kommen.
Task-Aufteilung (5 Subagents):
1. **Engine/Router:** llama.cpp (Vulkan, gfx1151/Strix Halo relevant!), llama-swap (mostlygeek)
2. **Agent/Runtime:** hermes-agent (NousResearch), Electron (Major-Sprünge), three-vrm/@pixiv
3. **Voice:** pocket-tts (kyutai), onnx-asr/Parakeet, Silero-VAD, smart-turn — nur Deutsch-taugliches
4. **Modell-Kategorien** für 128-GB-Strix-Halo: bessere lokale Coder-Modelle (vs. Qwen3-Coder-Next),
Chat/Reasoning-MoE (vs. Qwen3.6-35B/Qwen3.5-122B), Vision (vs. Qwen3-VL), deutsche TTS/STT.
Nur GGUF-/llama.cpp-lauffähig, Substanz = Benchmarks/Community-Erfahrung, kein Ankündigungs-Hype.
5. **IDE-/Agent-Tools** (Zed, Kilo Code, Claude Code): besonders Tod-/Nachfolger-Meldungen —
„Projekt eingestellt/archiviert/Fork übernimmt" ist GENAU die Meldung, die wir fangen müssen
(Lehre: Roo Code galt als Empfehlung und war längst eingestellt). Auch: neues dominantes Tool?
## Bereits ENTSCHIEDEN — nicht wieder vorschlagen (Verdikte der Box)
- Vulkan/RADV statt ROCm (gemessen schneller auf gfx1151) · llama.cpp+llama-swap gesetzt
- Hirn = Qwen3.6-35B-A3B mit MTP-Spec-Draft, immer warm · Mem0 als Memory · Electron-App für Lucy
- Pocket-TTS für Lucys Stimme (deutsch, CPU) · KEIN Kyutai-Streaming-STT (kann kein Deutsch)
- VERWORFEN: LobeChat/WebUI-Ersatz, Unmute-Vollstack, AnythingLLM, gemma als Hirn
- Latenz ist heilig: nichts vorschlagen, was Lucys ~2-s-Sprech-Latenz gefährdet
## Report-Format (Endantwort = geht direkt als Telegram-Nachricht raus)
- **Schreibe die Endnachricht in Lucys Stimme an den Commander** (du BIST Lucy, siehe SOUL.md —
das Radar ist nur dein Auftrag): erst 12 Sätze unmissverständlich, was die Funde für ihn
bedeuten und ob er etwas tun muss — danach die knappen Fund-Zeilen.
- Deutsch, maximal ~20 Zeilen, Du-Form, kein Markdown-Overkill, nicht technisch —
Technik in Alltagssprache, Details nur auf Nachfrage
- Struktur: „🛰️ Evolution-Radar <Monat>" → je Fund 13 Zeilen: WAS, WARUM relevant für UNS,
Einstufung **[lohnt vermutlich]** / **[beobachten]** / ggf. Quelle kurz
- Wenn ein Fund ein GEPINNTES Level betrifft (siehe Pins im Inventar): explizit erwähnen
- Nichts gefunden? Dann genau das in 2 Zeilen sagen. Keine Pflicht-Funde erfinden.
- KEINE Konfig-Änderungen vornehmen, KEINE Downloads starten — nur melden.
+58
View File
@@ -0,0 +1,58 @@
---
name: wartung
description: "Werkstatt-Kreislauf der AI-Box: einen KLEINEN Wartungsauftrag (Config-Migration, Dependency-Bump, Ein-/Zwei-Datei-Patch) eigenständig umsetzen — Branch im Box-Checkout, Patch, separater Reviewer-Subagent, Gate, Telegram-Merge-Vorschlag. Merge/Deploy NIE selbst."
version: 1.0.0
author: MC2 (Autonomie E6)
platforms: [linux]
metadata:
hermes:
tags: [wartung, werkstatt, maintenance, mc2]
---
# Werkstatt — Selbstwartungs-Kreislauf der Box
Nutze diesen Skill, wenn ein kleiner, klar umrissener Wartungsauftrag für das MC2-Repo
(`~/mission-control-v2`) vorliegt — vom Evolution-Radar oder direkt vom User.
**Scope-Check zuerst:** Klein = Config-Schlüssel-Migration, Dependency-Bump (Lockfile),
Patch in 12 Dateien. Alles Größere (Architektur, mehrere Module, neue Features):
NUR einen Plan liefern (Text im Telegram-Vorschlag), KEINEN Code.
## Leitplanken (nicht verhandelbar)
- NIEMALS auf `main` committen. NIEMALS mergen. NIEMALS deployen oder Dienste neu starten.
- Security-Config ist TABU: keine Tokens, approvals, ufw, sudoers anfassen.
- Die Live-Instanz (`~/mission-control-v2`) bleibt unberührt — gearbeitet wird NUR im Worktree.
- Am Ende steht IMMER ein Telegram-Vorschlag; die Entscheidung trifft der User.
- Gate rot oder Reviewer dagegen → trotzdem ehrlich melden (Branch bleibt liegen), nichts beschönigen.
## Ablauf
1. **Worktree anlegen** (Slug = kurzer Kebab-Case-Name des Auftrags):
`cd ~/mission-control-v2 && git fetch origin && git worktree add /tmp/wartung-<slug> -b wartung/<slug> origin/main`
2. **Patch** nur im Worktree. Minimal-invasiv, Stil der umgebenden Datei übernehmen
(deutsche Kommentare, bestehende Muster).
3. **Selbst-Gate** (was zutrifft):
- Python geändert → `python3 -m py_compile <dateien>`
- Shell geändert → `bash -n <dateien>`
- Frontend (`frontend/src/...`) geändert → auf der Box gibt es KEIN Node. Im Vorschlag
ausweisen: „Gate eingeschränkt: tsc/Build läuft erst beim Merge auf dem PC."
- Live-Check: `curl -sf http://127.0.0.1:9001/api/health` (muss grün bleiben — beweist,
dass du die Live-Instanz nicht angefasst hast).
4. **Reviewer-Subagent** (frischer Kontext, Worker/Reviewer-Muster): `delegate_task` mit
role=leaf. Gib ihm den AUFTRAG im Wortlaut + `git diff` des Worktrees. Seine Fragen:
Erfüllt der Diff den Auftrag? Minimal-invasiv? Risiken/Nebenwirkungen? —
Bei berechtigter Kritik: nachbessern (max. 2 Runden), sonst Kritik in den Vorschlag schreiben.
5. **Commit im Worktree:** Message `Werkstatt: <Auftrag kurz>` + 24 Zeilen Was/Warum.
6. **Telegram-Vorschlag** über `bash ~/mission-control-v2/deploy/notify.sh -s "[Werkstatt]" "<text>"`:
In LUCYS Stimme an den Commander (nicht als anonymer Job): erst 12 Sätze, was gemacht wurde
und was er jetzt entscheiden soll — dann knapp: geänderte Dateien · Kern des Diffs ·
Gate-Ergebnis · Reviewer-Urteil · Branch-Name · Frage „merge oder verwerfen?"
7. **Nichts löschen:** Worktree + Branch bleiben liegen, bis der User entschieden hat.
## Nach dem User-Entscheid (kommt als neuer Auftrag)
- „verwerfen" → `git worktree remove /tmp/wartung-<slug> --force && git branch -D wartung/<slug>`
- „merge" → heute merged/deployt der PC (die Box hat bewusst keine Gitea-Push-Rechte;
eigener Token = offener User-Entscheid). Sobald der Token existiert: Branch pushen
und den PC-Schritt melden statt ausführen.
+59
View File
@@ -0,0 +1,59 @@
# RUNBOOK — Die Box in 1 Seite (für Menschen, ohne KI-Hilfe)
**Grundsatz:** Die Box wartet sich selbst. Du bekommst Telegram-Nachrichten und antwortest
höchstens „mach". Dieses Blatt ist NUR für den Fall, dass etwas klemmt.
## Was die Telegram-Meldungen bedeuten
| Meldung | Bedeutung | Dein Handgriff |
|---|---|---|
| „… aktualisiert … grün" | Update eingespielt, alles geprüft | keiner |
| „… zurückgerollt … GEPINNT" | Update war schlecht, alte Version läuft wieder | keiner (läuft stabil weiter) |
| „KRITISCH: …" | Update UND Rollback kaputt | siehe „Box tot?" unten |
| „🛰️ Evolution-Radar …" | monatlicher Chancen-Report | lesen; bei Interesse „mach" antworten |
| „[Werkstatt] … merge oder verwerfen?" | Box hat einen Fix vorbereitet | mit „merge" oder „verwerfen" antworten |
## Box tot / Weboberfläche weg?
1. **Strom/Netz prüfen**, dann Box **einmal neu starten** (Power-Knopf). Alles startet von selbst
(systemd, reboot-fest). 23 Minuten warten, dann `http://192.168.178.151:9001` aufrufen.
2. Immer noch tot → per SSH (PC, PowerShell): `ssh hitonabi@192.168.178.151`
dann: `bash ~/mission-control-v2/deploy/restore.sh` (nimmt automatisch das letzte Backup,
liegt in `/srv/models/mc2-backups/`, 14 Tage Vorrat, täglich 03:30 Uhr).
3. Totalschaden (neue Platte/Hardware) → `docs/DISASTER_RECOVERY.md` (Bootstrap von Null).
## Lucy (am PC)
- Start: Desktop-Verknüpfung **„Lucy"** (startet den eingefrorenen Produktiv-Build).
- Hängt? `F:\Coding Stuff\lucy\lucy-desktop\Lucy-Neustart.bat` doppelklicken.
- Lucy ist EINGEFROREN — Änderungen macht nur die Werkstatt (Telegram-Vorschlag abwarten).
## Automatik-Fahrplan (läuft ohne dich)
- **Täglich 03:30** Backup · **So 04:30** Auto-Update (Router→Engine→Hermes) mit Rollback+Pin
- **Monatlich 1., 09:00** Evolution-Radar-Report auf Telegram
## Pinnwand: eine Ebene ist „GEPINNT" — was heißt das?
Ein Update hat den Selbsttest gerissen; die Box bleibt bewusst auf der alten Version. Das ist
ein STABILER Dauerzustand, kein Fehler. Pin ansehen / lösen (per SSH):
cat /srv/models/mc2-pins.json
jq 'del(.hermes)' /srv/models/mc2-pins.json > /tmp/p && mv /tmp/p /srv/models/mc2-pins.json
# (statt .hermes: .engine oder .swap) — nächster So-Lauf versucht das Update erneut
## Einmalige sudo-Session (steht noch aus — schaltet Engine/Router-Auto-Update frei)
ssh hitonabi@192.168.178.151
sudo install -m 0440 -o root -g root ~/mission-control-v2/deploy/sudoers-mc2-autonomie /etc/sudoers.d/mc2-autonomie && sudo visudo -c
sudo apt-get install -y unattended-upgrades && sudo dpkg-reconfigure -plow unattended-upgrades
sudo systemctl disable --now mission-control.service # alte v1-Leiche entfernen
Bis dahin meldet der So-Lauf Engine/Router-Updates nur („wartet — sudo-Freischaltung fehlt").
## Nützliche Handgriffe (SSH)
curl -s http://127.0.0.1:9001/api/health # Gesamtzustand (brain ready?)
bash ~/mission-control-v2/deploy/autoupdate.sh # Update-Lauf sofort statt Sonntag
bash ~/mission-control-v2/deploy/notify.sh "test" # Meldeweg testen (muss auf Telegram ankommen)
tail ~/mc2-notify.log # was wurde zuletzt gemeldet