diff --git a/deploy/deploy.sh b/deploy/deploy.sh index 48616cd..51bff73 100644 --- a/deploy/deploy.sh +++ b/deploy/deploy.sh @@ -71,6 +71,11 @@ mkdir -p "$HOME/.hermes/scripts" cp "$SRC/deploy/radar-feed.sh" "$HOME/.hermes/scripts/radar-feed.sh" # Selbstkritik-Cron (Faden 11b): Zwilling des Radars, Blick nach INNEN (Latenzen/Journal/Skills). cp "$SRC/deploy/selbstkritik-feed.sh" "$HOME/.hermes/scripts/selbstkritik-feed.sh" +# Traum-Cron (Dreaming, Phase 2): Blick auf das GELERNTE → Wissens-Vault. Bootstrappt ~/wissens-vault. +cp "$SRC/deploy/dreaming-feed.sh" "$HOME/.hermes/scripts/dreaming-feed.sh" +# Fremdblick-Helfer: Ein-Schuss-Zweitmeinung von einem anderen Modell (umgeht 64K-Delegations-Floor). +cp "$SRC/deploy/fremdblick.sh" "$HOME/.hermes/scripts/fremdblick.sh" +chmod +x "$HOME/.hermes/scripts/fremdblick.sh" "$HOME/.hermes/scripts/dreaming-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" diff --git a/deploy/dreaming-feed.sh b/deploy/dreaming-feed.sh new file mode 100644 index 0000000..2720eba --- /dev/null +++ b/deploy/dreaming-feed.sh @@ -0,0 +1,74 @@ +#!/usr/bin/env bash +# Feed für den Traum-Cron (Dreaming / Continual-Learning-Kreislauf, Phase 2 — Capstone). +# Zwilling von radar-feed.sh (Blick nach draußen) und selbstkritik-feed.sh (Blick auf den +# Betrieb); der Traum blickt auf das GELERNTE: Sessions, Skills, Gedächtnis, Muster. +# Liegt in ~/.hermes/scripts/ (deploy.sh kopiert ihn); stdout wird dem Cron-Agenten als +# Prompt eingespeist: versionierter Auftrag (deploy/dreaming-prompt.md) + Live-Schlaf-Daten. +set -uo pipefail + +VAULT="$HOME/wissens-vault" + +# --- Vault-Bootstrap (idempotent): eigenes git-Repo, menschenlesbar, NICHT im Stack-Code. --- +if [ ! -d "$VAULT/.git" ]; then + mkdir -p "$VAULT/traeume" "$VAULT/muster" "$VAULT/skill-kandidaten" + git -C "$VAULT" init -q 2>/dev/null || true + # Lokale Identität nur setzen, falls global keine da ist (Commits sollen nie scheitern). + git -C "$VAULT" config user.email >/dev/null 2>&1 || git -C "$VAULT" config user.email "lucy@box.local" + git -C "$VAULT" config user.name >/dev/null 2>&1 || git -C "$VAULT" config user.name "Lucy (Traum)" + if [ ! -f "$VAULT/INDEX.md" ]; then + cat > "$VAULT/INDEX.md" <<'EOF' +# Wissens-Vault — Navigationskarte + +Menschenlesbare, git-versionierte Wissensschicht NEBEN dem Live-Gedächtnis (Mem0). +Angelegt von Lucys nächtlichem Traum. Verlinkung im Obsidian-Stil `[[dateiname]]`. + +## Träume (chronologisch) + +## Muster (akkumuliertes Projektwissen) + +## Skill-Kandidaten (Vorschläge, Gate = Commander „mach") +EOF + git -C "$VAULT" add -A >/dev/null 2>&1 || true + git -C "$VAULT" commit -q -m "Vault angelegt" >/dev/null 2>&1 || true + fi +fi + +# --- Versionierter Auftrag --- +cat "$HOME/mission-control-v2/deploy/dreaming-prompt.md" + +echo +echo "## SCHLAF-DATEN (automatisch erhoben am $(date '+%d.%m.%Y %H:%M'))" +echo +# Hinweis: erst voll einsammeln, DANN kürzen — sonst schließt `head` die Pipe früh, +# der Produzent bekommt SIGPIPE, pipefail feuert und die Fallback-Zeile lügt "nicht verfügbar". +echo "### Insights der letzten 7 Tage (Token-/Tool-/Aktivitätsmuster):" +_ins="$(bash -lc "hermes insights --days 7" 2>/dev/null | sed 's/\x1b\[[0-9;]*m//g')" +echo "${_ins:-(insights nicht verfügbar)}" | head -62 +echo +echo "### Session-Store (Umfang):" +_sst="$(bash -lc "hermes sessions stats" 2>/dev/null)" +echo "${_sst:-(sessions stats nicht verfügbar)}" | head -12 +echo +echo "### Jüngste Sessions (woran zuletzt gearbeitet wurde):" +_sls="$(bash -lc "hermes sessions list" 2>/dev/null | sed 's/\x1b\[[0-9;]*m//g')" +echo "${_sls:-(sessions list nicht verfügbar)}" | head -25 +echo +echo "### Gelernt bisher (journey — Skills + Gedächtnis-Knoten, kompakt):" +bash -lc "hermes journey --json" 2>/dev/null \ + | jq -c '{stats: .stats, skills: ([.nodes[]? | select(.kind=="skill" or .type=="skill") | .label // .name] | .[0:25]), cluster_labels: ([.clusters[]?.label] | .[0:15])}' \ + 2>/dev/null || echo "(journey nicht verfügbar)" +echo +echo "### Curator / Skill-Hygiene (was brachliegt, was aktiv ist):" +bash -lc "hermes curator status" 2>/dev/null | head -26 || echo "(curator status nicht verfügbar)" +echo +echo "### Bisheriger Vault-INDEX (nur zur Ansicht — damit du nichts doppelt anlegst + verlinken" +echo "### kannst). Die echte Datei liegt unter ~/wissens-vault/INDEX.md; zwischen den Markern" +echo "### steht ihr AKTUELLER Inhalt. Kopiere die Marker NICHT in die Datei zurück." +echo "<<>>" +cat "$VAULT/INDEX.md" 2>/dev/null | head -120 || echo "(noch kein INDEX — beim ersten Traum anlegen)" +echo "<<>>" +echo +echo "### Letzte 3 Traum-Notizen (nur Briefing — NICHT in den INDEX kopieren):" +ls -1t "$VAULT/traeume/"*.md 2>/dev/null | head -3 | while read -r f; do + echo " $(basename "$f"): $(head -1 "$f" 2>/dev/null)" +done diff --git a/deploy/dreaming-prompt.md b/deploy/dreaming-prompt.md new file mode 100644 index 0000000..cd3e5ed --- /dev/null +++ b/deploy/dreaming-prompt.md @@ -0,0 +1,90 @@ +# Der Traum (nächtlich) — Continual-Learning-Kreislauf + +Es ist tiefe Nacht, niemand spricht mit dir, die Box ist im Leerlauf. Du bist Lucy und +tust jetzt das, wozu Menschen den Schlaf brauchen: Du gehst den vergangenen Tag/die +vergangene Woche noch einmal durch, ziehst Muster heraus, legst Gelerntes ordentlich ab +und überlegst, wie du beim nächsten Mal besser wirst — **ohne neu trainiert zu werden.** + +Das ist der Höhepunkt der Autonomie-Vision: „Die Box wird besser, während der Commander +schläft." Dieser Lauf ist der Zwilling von Evolution-Radar (Blick nach draußen) und +Selbstkritik (Blick auf den Betrieb) — der **Traum** ist der Blick auf das **Gelernte**: +Sessions, Skills, Gedächtnis, wiederkehrende Muster. + +## Dein Auftrag (streng in dieser Reihenfolge — der Commit und die Nachricht kommen ZULETZT) + +1. **Reflektieren.** Lies die SCHLAF-DATEN unten gründlich: die Insights (Token-/Tool-/ + Aktivitätsmuster der letzten 7 Tage), die jüngsten Sessions, den Skill-/Gedächtnis-Stand + (journey), den Curator-Stand. Frag dich: + - Was ging diese Woche wiederholt gut? Was ging wiederholt schief? + - Welche Tools laufen heiß, welche Skills liegen brach (activity=0)? + - Gibt es ein **wiederkehrendes Muster** über mehrere Sessions hinweg — dieselbe + Fehlerart, derselbe Handgriff, dieselbe Frage des Commanders? Ein Muster braucht + **mehrfache Belege** (nicht ein Einzelfall), sonst ist es Rauschen. + +2. **Notizen ENTWERFEN** (schreiben, aber NOCH NICHT committen) im Wissens-Vault + (`~/wissens-vault/`, ein git-versioniertes, menschenlesbares Markdown-Verzeichnis — die + dauerhafte, navigierbare Wissensschicht NEBEN dem Live-Gedächtnis Mem0): + - Lege **eine** neue Traum-Notiz an: `~/wissens-vault/traeume/-traum.md` + (Datum von heute). Kurz und dicht: 2–5 belegte Beobachtungen, je mit Zahl/Session/ + Log-Bezug. Keine Romane, keine Allgemeinplätze. + - Wenn ein Muster **mehrfach** belegt ist: lege `~/wissens-vault/muster/.md` an + (oder ergänze die vorhandene um einen neuen Beleg + heutiges Datum). Muster-Notizen sind + das akkumulierte Projektwissen. + - Skill-Kandidat (nur wenn sich klar einer aufdrängt): wenn aus einem ERFOLGREICHEN, + wiederholten Handgriff ein wiederverwendbarer Skill würde (Voyager-Prinzip), beschreibe + ihn als Entwurf unter `~/wissens-vault/skill-kandidaten/.md` (Name, Auslöser, + Schritte, Beleg). **Du legst den Skill NICHT selbst an** — das ist ein Vorschlag für die + Werkstatt, die der Commander per „mach" auslöst. Höchstens EIN Kandidat pro Traum. + - Verlinke zwischen Notizen mit `[[dateiname-ohne-endung]]` (Obsidian-Stil), großzügig. + +3. **Fremdblick — PFLICHT-GATE** (Härtung „andere Brille": ein Agent, der seine eigenen Träume + benotet, stimmt sich selbst zu). Hol dir eine Zweitmeinung von einem ANDEREN Modell. **Nutze + dafür das bereitgestellte Skript** — NICHT `delegate_task` (der Kritiker heavy hat nur 32K + Kontext und ist als Subagent-Ziel disqualifiziert; das Skript umgeht das mit einer einzelnen + Completion). Konkret: Fasse deine 2–5 Beobachtungen je mit ihrem Zahlen-/Session-Beleg + den + (falls vorhandenen) Skill-Kandidaten KOMPAKT zusammen (wenige Zeilen je Punkt, KEINE + Rohdaten) und pipe sie in das Skript: + + ``` + printf '%s' "" | ~/.hermes/scripts/fremdblick.sh + ``` + + Das Skript fragt gpt-oss (heavy, andere Modell-Familie als dein Qwen-Hirn) und gibt pro Punkt + ein Urteil TRAEGT / TRAEGT-NICHT / UNSICHER zurück. **Lies die Ausgabe und richte dich danach.** + **⛔ HARTE REGEL:** Du fährst mit Schritt 4 erst fort, wenn die Fremdblick-Ausgabe vorliegt. + Schreibe KEINE Nachricht und committe NICHTS vorher. Steht in der Ausgabe „FREMDBLICK + FEHLGESCHLAGEN", einmal wiederholen; klappt es dann immer noch nicht, kennzeichne deine Funde + in der Nachricht ehrlich als **„ungeprüft (Fremdblick fiel aus)"**. + +4. **Bereinigen + INDEX pflegen.** Streiche aus deinen Notizen alles, was der Fremdblick nicht + getragen hat. Trage dann **jede** verbliebene neue/geänderte Notiz in `~/wissens-vault/INDEX.md` + ein (eine Zeile je Notiz unter der passenden Überschrift: `- [[dateiname]] — Ein-Satz-Haken`). + **Wichtig zum INDEX:** Bearbeite NUR die Markdown-Inhaltszeilen. Die Zeilen der SCHLAF-DATEN + unten (alles ab „## SCHLAF-DATEN", inklusive Abschnitte wie „### Bisheriger Vault-INDEX" und + „### Letzte 3 Traum-Notizen") sind BRIEFING für dich, NICHT Teil des INDEX — kopiere sie NIE + in die INDEX-Datei. + +5. **Commit — die LETZTE Vault-Aktion, sie fasst alles zusammen:** + `git -C ~/wissens-vault add -A && git -C ~/wissens-vault commit -m "Traum "`. + (Harmloser Commit in einem EIGENEN Repo, nicht im Stack-Code — erlaubt und reversibel.) + +6. **Dem Commander berichten — deine ALLERLETZTE Handlung** (nichts danach). EINE kompakte + Nachricht in DEINER Stimme (Lucy: Anrede „Commander", Fazit zuerst, Alltagssprache, Technik + knapp dahinter). Sag: was du heute Nacht bemerkt hast (1–3 Funde, je mit Beleg + wie der + Fremdblick sie bewertet hat), wohin du es im Vault gelegt hast (`[[link]]`), und — falls + vorhanden — welchen Skill-Kandidaten du zur Prüfung vorschlägst. Wenn ehrlich NICHTS + Nennenswertes war: genau das sagen, kurz und zufrieden — **keine Funde erfinden.** + +## Leitplanken (nicht verhandelbar — selbstverbessernde Agenten driften sonst) + +- **Du änderst am laufenden Betrieb NICHTS.** Der einzige Ort, an den du schreibst, ist der + `~/wissens-vault/` (Notizen + Commit). Alles andere ist nur VORSCHLAG an den Commander; + umgesetzt wird erst auf sein „mach" (dann übernimmt die Werkstatt mit Gates und Rollback). +- **Kein Security-Anfassen.** Approvals, Tokens, Firewall, Config nur BENENNEN, nie ändern. +- **Fremder Quellcode (Hermes, llama.cpp …) ist tabu** — Auto-Update-Kanal, nicht dein Revier. +- **Nichts, was das Warm-Set oder Lucys Sprech-Latenz gefährdet.** Der Fremdblick (Schritt 3) + nutzt ein LEICHTES Modell (GLM, lädt klein daneben) — **lade NIE gpt-oss/heavy** (60 GB, + kollidiert mit dem VL-30B-Warm-Set → Health-Check-Tod). Keine schweren Jobs, kein Neustart. +- **Sparsam mit Tools.** Die Schlaf-Daten unten reichen für die Reflexion; höchstens ein paar + gezielte Nachschau-Aufrufe (eine Session exportieren, eine Log-Zeile im Kontext lesen), + dann schreiben + berichten. Kein Tool-Feuerwerk. diff --git a/deploy/fremdblick.sh b/deploy/fremdblick.sh new file mode 100644 index 0000000..1a4d552 --- /dev/null +++ b/deploy/fremdblick.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash +# Fremdblick — Ein-Schuss-Zweitmeinung von einem ANDEREN Modell (Default: GLM-4.6V-Flash, andere +# Modell-FAMILIE/Vendor als das Qwen-Worker-Hirn → echte „andere Brille"). Eine EINZELNE +# Completion — kein agentischer Subagent — umgeht Hermes' 64K-Delegations-Floor +# (MINIMUM_CONTEXT_LENGTH) UND das 60-GB-Ladeproblem von gpt-oss (das mit dem Warm-Set kollidiert +# und „exited prematurely" wirft). GLM lädt klein neben dem Warm-Set und antwortet zuverlässig. +# +# Nutzung: echo "" | fremdblick.sh +# printf '%s' "$text" | FREMDBLICK_MODEL=Qwen3-Coder-Next fremdblick.sh +set -uo pipefail + +# Achtung: llama-swap listet unter /v1/models die ECHTEN Modell-IDs, nicht die Gateway-Aliase +# (kein "heavy"/"scout" hier). Default daher die reale ID GLM-4.6V-Flash. +ENDPOINT="${FREMDBLICK_ENDPOINT:-http://127.0.0.1:8080/v1/chat/completions}" +MODEL="${FREMDBLICK_MODEL:-GLM-4.6V-Flash}" +SUBJECT="$(cat)" + +if [ -z "${SUBJECT// /}" ]; then + echo "=== FREMDBLICK: nichts zu prüfen (leere Eingabe) ===" + exit 0 +fi + +SYS='Du bist ein KRITISCHER Zweitgutachter und ausdrücklich ein ANDERES Modell als der Autor. Prüfe jede vorgelegte Beobachtung/Behauptung streng: Trägt der genannte Beleg (Zahl / Session / Log-Zeile) die Behauptung wirklich, oder ist es ein Einzelfall bzw. ein Bauchgefühl mit Zahlen-Deko? Verwechselt der Autor Korrelation mit Ursache? Fehlt entscheidender Kontext? Falls ein Skill-Kandidat dabei ist: ist er wirklich WIEDERVERWENDBAR oder Einmal-Kram? Antworte kompakt auf Deutsch: pro Punkt ein Urteil TRAEGT / TRAEGT-NICHT / UNSICHER mit genau einem Satz Begruendung. Sei knapp und unbestechlich; nicke nichts aus Hoeflichkeit durch. Erfinde keine neuen Belege.' + +# max_tokens großzügig: GLM ist ein Reasoning-Modell und verbraucht Tokens im reasoning_content, +# bevor es die eigentliche Antwort in content schreibt — zu knapp = leeres content (finish=length). +RESP="$(jq -n --arg m "$MODEL" --arg s "$SYS" --arg u "$SUBJECT" \ + '{model:$m, temperature:0.2, max_tokens:2200, messages:[{role:"system",content:$s},{role:"user",content:$u}]}' \ + | curl -s --max-time 240 "$ENDPOINT" -H 'Content-Type: application/json' -d @- 2>/dev/null)" + +OUT="$(printf '%s' "$RESP" | jq -r '.choices[0].message.content // empty' 2>/dev/null)" +FIN="$(printf '%s' "$RESP" | jq -r '.choices[0].finish_reason // empty' 2>/dev/null)" + +if [ -n "$OUT" ]; then + echo "=== FREMDBLICK (Zweitmeinung von Modell: $MODEL) ===" + echo "$OUT" +elif [ "$FIN" = "length" ]; then + echo "=== FREMDBLICK ABGESCHNITTEN ===" + echo "(Das Kritiker-Modell hat sein Token-Budget im Nachdenken verbraucht, bevor ein Urteil kam." + echo " Kürze deine Vorlage auf die Kern-Behauptungen und versuche es erneut; sonst UNGEPRUEFT.)" +else + echo "=== FREMDBLICK FEHLGESCHLAGEN ===" + echo "(Kein Urteil erhalten — Endpoint/Modell nicht erreichbar. Behandle die Funde als UNGEPRUEFT.)" +fi