From 41aeb111d71b3ffc8d6329c3c95a8a3f6b37607e Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Thu, 2 Jul 2026 17:20:22 +0200 Subject: [PATCH] Kickoff-Paket Kapitel 0: Autonomie-Plan (E1-E6) + Bench-Harnesses ins Repo MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - docs/AUTONOMIE_PLAN.md: 3 Saeulen + Werkstatt, Etappen mit Verifikation, Leitplanken, Definition-of-Done, Session-Start-Checkliste — naechste Session startet mit 'leg los' - deploy/bench/{model-bench,brain-bench}.sh: die 02.07.-Benches als versionierte Harnesses (Grundlage der Modell-Selbst-Evaluation E5; Quoting-/pipefail-Lehren eingebaut) Co-Authored-By: Claude Fable 5 --- deploy/bench/brain-bench.sh | 40 +++++++++++++ deploy/bench/model-bench.sh | 42 ++++++++++++++ docs/AUTONOMIE_PLAN.md | 111 ++++++++++++++++++++++++++++++++++++ 3 files changed, 193 insertions(+) create mode 100644 deploy/bench/brain-bench.sh create mode 100644 deploy/bench/model-bench.sh create mode 100644 docs/AUTONOMIE_PLAN.md diff --git a/deploy/bench/brain-bench.sh b/deploy/bench/brain-bench.sh new file mode 100644 index 0000000..0af833d --- /dev/null +++ b/deploy/bench/brain-bench.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash +# Brain-Config-Matrix (Referenz vom 02.07.2026): misst Qwen3.6 in mehreren Betriebsarten +# (MTP n-max / ohne Spec / KV-Quant) auf separatem Port. Für künftige Re-Benchmarks nach +# Engine-Updates oder bei neuen Hirn-Kandidaten. Ergebnis-Referenz (02.07., Vulkan, b9843): +# mtp3 78,6 t/s · mtp4 63,7 · ohne Spec 62,4 · mtp3+KVq8 78,6 (=gratis) · nospec+KVq8 62,1 +set -u +MODEL="${BRAIN_GGUF:-/srv/models/Qwen3.6-35B-A3B-MTP-GGUF/Qwen3.6-35B-A3B-UD-Q4_K_M.gguf}" +BIN="${BENCH_BIN:-/opt/llamacpp-vulkan/llama-server}" +PORT="${BENCH_PORT:-5899}" +BASE="-c 65536 -ngl 999 -fa on --no-mmap --jinja --parallel 1" + +run() { # $1=name $2=extra-flags + echo "=== $1 ===" + $BIN -m "$MODEL" --host 127.0.0.1 --port "$PORT" $BASE $2 >/tmp/brain-bench-server.log 2>&1 & + local PID=$! + for i in $(seq 1 120); do + curl -s --max-time 2 "http://127.0.0.1:$PORT/health" | grep -q ok && break + sleep 2 + kill -0 $PID 2>/dev/null || { echo " LOAD-CRASH"; tail -2 /tmp/brain-bench-server.log; return; } + done + for r in 0 1 2; do + curl -s --max-time 300 -X POST "http://127.0.0.1:$PORT/completion" -H "Content-Type: application/json" \ + -d '{"prompt":"Erklaere in drei kurzen Saetzen, was ein Mixture-of-Experts-Modell ist.","n_predict":150,"temperature":0}' \ + > /tmp/brain-bench-probe.json + [ "$r" = "0" ] && continue # Warmlauf verwerfen + python3 - <<'PY' +import json +t = json.load(open("/tmp/brain-bench-probe.json")).get("timings", {}) +print(f" tg={t.get('predicted_per_second',0):.1f} t/s" + + (f" · draft {t.get('draft_n_accepted')}/{t.get('draft_n')}" if t.get('draft_n') else "")) +PY + done + kill $PID 2>/dev/null; wait $PID 2>/dev/null; sleep 3 +} + +run "mtp3 (live-Config)" "--spec-type draft-mtp --spec-draft-n-max 3 -ctk q8_0 -ctv q8_0" +run "mtp4" "--spec-type draft-mtp --spec-draft-n-max 4 -ctk q8_0 -ctv q8_0" +run "ohne Spec" "-ctk q8_0 -ctv q8_0" +run "mtp3 KV-f16" "--spec-type draft-mtp --spec-draft-n-max 3" +echo "BENCH_DONE" diff --git a/deploy/bench/model-bench.sh b/deploy/bench/model-bench.sh new file mode 100644 index 0000000..7fd8b3d --- /dev/null +++ b/deploy/bench/model-bench.sh @@ -0,0 +1,42 @@ +#!/usr/bin/env bash +# Modell-Bench (Autonomie-Plan E5): misst pp/tg eines GGUF auf separatem Port, ohne die +# Live-Instanzen anzufassen. Grundlage der Modell-Selbst-Evaluation (Radar-Kandidaten). +# Nutzung: bash model-bench.sh [extra llama-server-flags, z.B. --mmproj ...] +# Lehren vom 02.07.2026 eingebaut: python via Heredoc (kein f-String-Quoting-Bruch), +# Warmlauf vor der Messung, LOAD-CRASH wird gemeldet statt still zu hängen. +set -u +MODEL="${1:?Nutzung: model-bench.sh [extra-flags]}" +shift || true +EXTRA="$*" +BIN="${BENCH_BIN:-/opt/llamacpp-vulkan/llama-server}" +PORT="${BENCH_PORT:-5899}" +CTX="${BENCH_CTX:-32768}" + +echo "=== Bench: $(basename "$MODEL") (ctx $CTX${EXTRA:+, $EXTRA}) ===" +$BIN -m "$MODEL" --host 127.0.0.1 --port "$PORT" -c "$CTX" -ngl 999 -fa on --no-mmap --jinja $EXTRA \ + >/tmp/model-bench-server.log 2>&1 & +PID=$! +trap 'kill $PID 2>/dev/null; wait $PID 2>/dev/null' EXIT + +for i in $(seq 1 240); do + curl -s --max-time 2 "http://127.0.0.1:$PORT/health" | grep -q ok && break + sleep 2 + kill -0 $PID 2>/dev/null || { echo "LOAD-CRASH:"; tail -3 /tmp/model-bench-server.log; exit 1; } +done + +probe() { + curl -s --max-time 300 -X POST "http://127.0.0.1:$PORT/completion" -H "Content-Type: application/json" \ + -d '{"prompt":"Erklaere in fuenf Saetzen, wie ein Backup-Konzept fuer einen Homeserver aussieht.","n_predict":200,"temperature":0}' \ + > /tmp/model-bench-probe.json + python3 - <<'PY' +import json +t = json.load(open("/tmp/model-bench-probe.json")).get("timings", {}) +print(f" pp={t.get('prompt_per_second',0):.0f} t/s · tg={t.get('predicted_per_second',0):.1f} t/s" + + (f" · draft {t.get('draft_n_accepted')}/{t.get('draft_n')}" if t.get('draft_n') else "")) +PY +} + +probe >/dev/null 2>&1 # Warmlauf (Shader-/Graph-Compile nicht mitmessen) +probe +probe +echo "BENCH_DONE" diff --git a/docs/AUTONOMIE_PLAN.md b/docs/AUTONOMIE_PLAN.md new file mode 100644 index 0000000..88f62a5 --- /dev/null +++ b/docs/AUTONOMIE_PLAN.md @@ -0,0 +1,111 @@ +# AUTONOMIE-PLAN — „Die Box wartet sich selbst" (Kapitel 0) + +**Erstellt:** 02.07.2026, abends — als Kickoff-Paket für die Bau-Session („leg los"). +**Nordstern (User):** Haushaltsgerät, kein Dev-Projekt. Der User macht KEINE Updates, fasst keine +Konsole an. Er bekommt Meldungen von Lucy (Telegram) und sagt höchstens „mach". In 6 Monaten ohne +KI-Hilfe darf nichts brachliegen — schlimmster erlaubter Zustand: „selbst-gepinnt und läuft". + +**Kontext-Quellen:** Memory `open-threads.md` (Kapitel 0, Bausteine a–k) · `verdicts.md` · +`project-stack-state.md` · dieser Plan. Review-Historie: docs/REVIEW_2026-07-02.md. + +--- + +## Architektur: 3 Säulen + Werkstatt + +1. **Stabilität** — eigene Software (MC2, Lucy) EINGEFROREN + Selbsterhaltung. Gitea = Tresor, kein Update-Kanal. +2. **Frische** — Fremd-Software (OS/Engine/Router/Hermes) updatet sich per Timer, mit Gate + Auto-Rollback + Selbst-Pinning. +3. **Evolution** — Radar (Hermes-cron + Web-Suche) findet Sprünge/neue Tools; Modelle bencht die Box selbst. +4. **Werkstatt** — Box-KIs setzen Wartung/Migrationen selbst um: Telegram-Ping → User „mach" → Branch → Code → Gate → Deploy → Bericht. + +**Leitplanken (nicht verhandelbar):** Merge/Deploy nie ohne grünes Gate · Security-Config +(approvals/Tokens/ufw) nie ohne explizites User-Ja · alles reversibel (Backup+Branch+Pin) · +kleine Wartung autonom, große nur vorbereitet+freigegeben. + +--- + +## Was schon existiert (nutzen, nicht neu bauen!) + +| Baustein | Wo | +|---|---| +| Update-Pipeline je Ebene mit Backup+Checks | UI-Buttons: OS/Engine (`deploy/update-engine.sh` — hat schon stack-postcheck+Auto-Rollback!), Router (`update-swap.sh`), Hermes (`POST /api/maintenance/hermes-update` → backup→update→doctor→Postcheck) | +| Qualitäts-Gate (Abnahmetest für ALLES) | `deploy/hermes-postcheck.sh`: Mem0+Plugin+Config-Drift-Scan+Tool-Smoke+Voice-Smoke, E2E grün. ⚠️ pipefail-Lektion: Stream-Probes brauchen `set +o pipefail`-Subshell | +| Tägliches Backup + Restore | `deploy/backup.sh` (Timer 03:30) / `restore.sh` | +| Telegram | Hermes-Gateway läuft mit Telegram; CLI `hermes send` (Syntax in Session verifizieren: `hermes send --help`) | +| Cron | `hermes cron` (Subcommand existiert) | +| Coding-KI | Qwen3-Coder-Next (coder-Lane, 131k ctx); Hermes v0.18 hat „Coding Projects mit git-worktree-Management" | +| PC-Fernsteuerung | `client/hermes-pc` Executor (Token `HERMES_PC_TOKEN`) — für Lucy-Builds auf dem Windows-PC | +| Bench-Harnesses | `deploy/bench/brain-bench.sh` + `deploy/bench/model-bench.sh` (mit diesem Kickoff ins Repo gelegt) | +| Health/Repair | LucyHealthCard + `/api/health` brain-Check; systemd `Restart=on-failure` überall | + +--- + +## Etappen (in dieser Reihenfolge bauen) + +### E1 · Nervensystem: Meldeweg (klein, zuerst — alles Weitere nutzt ihn) +- `deploy/notify.sh ""`: primär `hermes send` (Telegram), Fallback: Logfile + `wall`. + Syntax von `hermes send` zuerst auf der Box verifizieren (`bash -lc 'hermes send --help'`). +- Verifikation: Testnachricht landet beim User auf Telegram. + +### E2 · Frische: Auto-Update-Timer + Rollback + Pin-Register +- **Pin-Register:** `/srv/models/mc2-pins.json` — `{komponente: {pinned: bool, version, grund, datum}}`. + Gepinnte Ebene wird vom Timer übersprungen; Pin-Meldung ging via E1 raus. +- `deploy/autoupdate.sh` (Reihenfolge: swap → engine → hermes; Modelle NICHT auto): + je Ebene: Update-Check → wenn Update: bestehenden Pfad nutzen (update-engine.sh / update-swap.sh / + hermes-update-Job via API + Job-Polling) → Postcheck rot ⇒ Rollback (existiert je Pfad) + Pin + setzen + notify; grün ⇒ notify „eingespielt: X→Y". +- systemd-User-Timer `mc2-autoupdate.timer` (wöchentlich So 04:30, nach Backup), Unit nach + `~/.config/systemd/user/`, in `deploy/deploy.sh` registrieren (Muster: mc2-backup.timer). +- **OS-Ebene:** apt braucht sudo → `unattended-upgrades` (nur Security) in der EINMALIGEN + sudo-Session einrichten (zusammen mit Faden C14: stale v1-Unit weg). Bis dahin: OS aus dem Timer raus. +- Verifikation: Timer-Dry-Run (`bash autoupdate.sh`), einmal echt durchlaufen lassen, Telegram-Meldungen prüfen; künstlichen Fehlschlag provozieren (Postcheck-FAIL faken) → Rollback+Pin+Meldung. + +### E3 · Stabilität: Lucy-Produktiv-Build (einfrieren) +- Im Lucy-Repo (`F:\Coding Stuff\lucy`): electron-builder ergänzen (portable oder NSIS), + **asar-Caveat:** `app.getAppPath()` zeigt im Build woanders hin → `LUCY_TTS_DIR` absolut setzen + (Installer-Config oder Start-BAT) — siehe Kommentar in `lucy-desktop/src/main/index.ts`. +- Verknüpfung auf den Build; `Lucy-Neustart.bat` auf Build umstellen; Dev-Modus bleibt für Wartung. +- Verifikation: Build starten → Worker-Pool bereit, Sprech-Roundtrip. +- Danach gilt Lucy als EINGEFROREN (Änderungen nur noch via Werkstatt-Kreislauf). + +### E4 · Evolution: Radar +- Hermes-cron (monatlich, z. B. 1. des Monats 09:00): Prompt-Job — + „Inventar von `/api/maintenance/updates` + `/v1/models` + Versionsliste einlesen; per web_search + Changelogs/Neuigkeiten zu: llama.cpp, llama-swap, hermes-agent, pocket-tts, onnx-asr/Parakeet, + Silero, smart-turn, Electron, three-vrm + Kategorie-Scan (bessere lokale Coder-/Vision-/TTS- + Modelle für Strix Halo 128 GB); gegen [[verdicts]] halten (Verworfenes nicht wieder vorschlagen); + Ergebnis als kurzer deutscher Report → notify.sh". +- Ablage des Prompts versioniert: `deploy/radar-prompt.md`, cron ruft ihn. +- Verifikation: Cron einmal manuell feuern, Telegram-Report prüfen (Qualität grob checken). + +### E5 · Evolution: Modell-Selbst-Evaluation +- `deploy/bench/model-bench.sh [extra-flags]` (liegt bei) → pp/tg-Zahlen. +- Workflow (halbautonom v1): Radar meldet Kandidat → User „mach" → Hermes lädt (hf CLI im + backend-venv existiert) → bencht → notify mit Vergleichstabelle → User-Entscheid → Config-Eintrag. +- Verifikation: einmal mit vorhandenem Modell durchspielen. + +### E6 · Werkstatt: Wartungs-Workflow (der Schachzug — zuletzt, auf E1–E5 aufbauend) +- Hermes-Skill/Workflow „wartung": Auftrag (aus Radar oder User) → `git worktree` im Box-Checkout + (MC2) bzw. via PC-Executor (Lucy) → Änderung durch coder-Lane → Gate = Postchecks + Build → + Branch-Push zu Gitea → notify mit Diff-Zusammenfassung → User „merge"/„verwerfen" via Telegram + (Hermes approvals-Mechanik nutzen) → bei merge: Deploy-Pfad + Backup + Postcheck. +- Scope v1 BEWUSST klein: Config-Schlüssel-Migrationen, Dependency-Bumps (Lockfile), Ein-Datei- + Patches. Architektur-Umbauten: nur Plan+Branch vorbereiten. +- Verifikation: einen echten Klein-Fall durchspielen (Kandidat: ServicesCard-Restart-Bug, Faden B9 + — perfekte Werkstatt-Gesellenprüfung: 1 Datei, klarer Fix, Gate vorhanden). + +--- + +## Definition of Done (Kapitel 0) +1. Wöchentlicher Auto-Update-Lauf mit Telegram-Meldung, verifiziertem Rollback+Pin-Pfad. +2. Lucy läuft als gebaute, eingefrorene App. +3. Monatlicher Radar-Report kommt auf Telegram an. +4. Ein Modell-Kandidat wurde einmal selbst gebencht + gemeldet. +5. Die Werkstatt hat EINEN echten Klein-Fix eigenständig bis zum Merge-Vorschlag gebracht. +6. Runbook-Seite existiert (`docs/RUNBOOK.md`, 1 Seite Mensch-Anleitung). + +## Session-Start-Checkliste („leg los") +1. `git -C ~/mission-control-v2 log --oneline -1` auf der Box == origin/main? (SSH: hitonabi@192.168.178.151) +2. Health: `curl -s http://192.168.178.151:9001/api/health` → brain ready? +3. `bash -lc 'hermes send --help'` → Syntax für E1 klären. +4. Dann E1 → E6 der Reihe nach; jede Etappe committen + deployen + real verifizieren (Telegram!). + Gitea-Push: PowerShell, Auth flatterhaft → einmal Retry.