# Die drei Jobs (KISS-Umbau, 21.08.2026) Vorher: **4 Hermes-Crons + 6 systemd-Timer**, verteilt auf zwei Mechanismen. Deshalb fiel am 20.08. tagelang niemandem auf, dass ein Waechter fehlte — niemand schaut an zwei Orten nach. Jetzt: **drei Jobs, ein Ort.** `hermes cron list` zeigt die gesamte Automatik. | Job | Wann | Art | Skript | |---|---|---|---| | **Daily News Report** | taeglich 07:00 | Agent + Websuche | — | | **KI und Stack Radar** | samstags 08:00 | `--no-agent` | `stack-radar.sh` → `stack-ist.sh` | | **Updates am Sonntag** | sonntags 04:30 | `--no-agent` | `sonntags-update.sh` → `autoupdate.sh` | Daneben laufen als stille Rohrleitung weiter: `mc2-backup` (03:33) und `projekte-sync` (stuendlich). Die melden sich nie, die sichern und synchronisieren nur. ## Der Entwurfsgrundsatz > **Fakten sammelt ein Skript, Prosa schreibt das Modell.** Der alte Selbsttest war am 20.08. gruen, waehrend vier Dinge kaputt waren: das Kritiker-Gate zeigte seit einem Tag auf ein umbenanntes Modell (404), Lucys `SOUL.md` war blockiert, das Dashboard stand ohne Passwort offen, die CI war rot. Er hatte geprueft, ob Dienste **antworten** — nicht, ob sie **stimmen**. `stack-ist.sh` prueft deshalb Ergebnisse: loesen die Rollen-Aliase noch auf? Ist der letzte Timer-Lauf gutgegangen? Ist eine Sicherung juenger als zwei Tage? Liefert die oeffentliche Adresse Daten ohne Anmeldung? Beim ersten Lauf hat es sofort zwei echte Befunde gefunden. ## Kugelsicher heisst konkret - **Das Modell steht nicht im kritischen Pfad.** Antwortet es nicht, gehen die Rohbefunde trotzdem raus. Nur die Prosa faellt weg, nie die Meldung. - **Es meldet immer.** „Alles gruen" ist ein Ergebnis, kein Grund zu schweigen. - **Kein `set -e`.** Ein einzelner fehlschlagender Test darf den Bericht nicht abschneiden. - **Ein Melderweg:** `deploy/notify.sh` erreicht Telegram **und** Lucys Briefkasten (aus dem sie spricht) in einem Aufruf. Die Jobs laufen mit `--deliver local`, damit Hermes nicht ein zweites Mal sendet. - **Kein Fuellmaterial.** Die Prompts verbieten ausgedachte Vorschlaege ausdruecklich — ein Bericht mit Fuellmaterial wird nicht gelesen, und dann auch der echte Befund nicht. ## Ausbringen Die Skripte muessen unter `~/.hermes/scripts/` liegen (Vorgabe von `hermes cron --script`). Quelle ist dieses Verzeichnis: ```bash scp deploy/jobs/*.sh hitonabi@192.168.178.151:/home/hitonabi/.hermes/scripts/ ssh hitonabi@192.168.178.151 'cd ~/.hermes/scripts && sed -i "s/\r$//" *.sh && chmod +x *.sh' ``` ‼️ Das `sed` ist Pflicht: vom Windows-PC kopierte Dateien haben CRLF, und bash scheitert daran mit unverstaendlichen Meldungen. ## Abgeschaltet am 21.08. | Weg | Warum | |---|---| | Cron `morgen-digest` | geht im Daily News Report auf | | Cron `tech-radar` | geht im Stack Radar auf | | Cron `nacht-wartung` | pruefte Lebenszeichen, nicht Ergebnisse | | Cron `wissens-sync` | **war nie gelaufen** — kein `last_run_at` | | Timer `mc2-bagatell` | **15 Naechte hintereinander „0 eingespielt"** | | Timer `mc2-selfsmoke` | geht in `stack-ist.sh` auf | | Timer `pbs-backup` | doppelt zu `mc2-backup` und seit 21.08. rot (`/srv/models/mem0` gibt es nicht mehr) | | Timer `mc2-autoupdate` | wird jetzt vom Cron „Updates am Sonntag" gestartet | Die Unit-Dateien liegen noch da, nur `disable`d — Rueckbau ist ein Befehl. --- ## Nachtrag 21.08.: Persona, Quellen-Links und Stimme **Fehler, den ich gemacht hatte:** Mein erster Prompt fuer den Daily News Report schrieb woertlich *„keine Emojis, keine Aufzaehlungspunkte, keine Ueberschriften-Deko"* — und hat damit genau das wegoptimiert, was den Bericht vorher gut machte. ★★ **Die Formatierung kam nie aus dem Job-Prompt.** Die alten Prompts waren kurz (*„eine praegnante 3-Punkte-Zusammenfassung an den Commander"*). Emojis, Ton und die Anrede stehen in **`~/.hermes/SOUL.md`** — Lucys Persona: > Du sprichst den Nutzer IMMER mit **Commander** an. > Locker, herzlich, schlagfertig, charmant, selbstbewusst. **Lehre: den Job-Prompt kurz halten und die Persona arbeiten lassen.** Wer im Prompt Stil verbietet, ueberstimmt die Persona — und merkt es erst, wenn die Nachricht seelenlos ankommt. ### Stimme in Telegram `hermes send` kann **`MEDIA:`**. Damit geht eine fertige Audiodatei als Anhang nach Telegram. `deploy/jobs/news-melden.sh` macht daraus einen Aufruf: ``` Agent schreibt zwei Dateien /tmp/news-text.md (Emojis, Links, Formatierung) -> notify.sh -> Telegram + Briefkasten /tmp/news-sprich.txt (3-4 Saetze, nichts Vorlesbares fehlt) -> :8650/tts -> WAV -> hermes send MEDIA: ``` ‼️ **Nicht Hermes' eingebautes TTS nehmen.** Das steht auf `tts.provider: edge` mit `en-US-AriaNeural` — englisch. Lucys echte Stimme ist MC2s `voice-service` auf `:8650` (Piper `de_DE-thorsten-medium`). Deshalb ruft das Skript den Sidecar direkt per curl. ‼️ **Kein ffmpeg noetig.** Telegram nimmt die WAV direkt an. Fuer eine echte Sprachnachricht mit Wellenform braeuchte es OGG/Opus und damit ffmpeg — bewusst nicht installiert, eine Abhaengigkeit weniger. Der Agent ruft **einen** Befehl auf, alles danach ist deterministisch. Faellt die Stimme aus, geht der Text trotzdem raus. ### ‼️ Folgefehler der Werkzeug-Abschaltung — gefunden und behoben Nach dem Abschalten von `kanban` und `delegation` standen in `SOUL.md` noch zwei Anweisungen, die ins Leere zeigten: *„rufst du sofort dein Werkzeug delegate_task auf"* und *„Ideen traegst du sofort im Kanban-Auftragsbuch ein"*. Genau die Klasse stiller Defekt, die am 19.08. das Kritiker-Gate zerlegt hat. Beide Abschnitte ersetzt (Sicherung: `~/.hermes/SOUL.md.bak-20260821`). **Merke: wer einen Werkzeugsatz abschaltet, muss `SOUL.md` mitlesen.** ### Kugelsicher-Regeln, die dazugekommen sind - `hermes cron edit "text"` **speichert nichts** — der Prompt muss ueber **`--prompt`** kommen. Ohne Flag gibt der Befehl den Text nur aus und die alte Fassung bleibt stehen. Nach jeder Aenderung in `jobs.json` nachsehen. - Alte Job-Fassungen liegen im Zustands-Backup: `tar -xzf /srv/models/mc2-backups/mc2-state-*.tar.gz ./hermes/cron/jobs.json` - Tagesaktualitaet muss man erzwingen: Datum per `date` feststellen lassen, mehrere Suchen verlangen, und Meldungen ohne belegbares Datum verwerfen. --- ## Nachtrag 3 (21.08.): Lucys ECHTE Stimme, echte Sprachnachricht ### Der Fehler: :8650 ist nicht Lucy Ich hatte `/tts` auf MC2s `voice-service` (`:8650`) ohne Angabe von Engine und Stimme aufgerufen. Dessen `/health` sagt: ``` "engines":["elevenlabs","edge"] ``` Piper und Chatterbox sind dort **gar nicht geladen** — die Vorgabe fiel auf die erste verfuegbare: ElevenLabs *„Artoria DE · Saber · Hermes-Stimme"*. Das ist **Hermes' Stimme**, nicht Lucys. Deutsch und weiblich, deshalb faellt es nicht sofort auf. Beide verfuegbaren Engines sind ausserdem **Cloud** — gegen die 100-%-lokal-Praemisse. ### Lucys Stimme: `lucy-stimme.service` auf `:8021` | | | |---|---| | Engine | **Kyutai pocket-tts 2.1.0** (neueste, seit 04.05. unveraendert) | | Modell | **`german_24l`** — die volle Fassung, nicht die destillierte | | Stimme | geklont aus `ref.mp3`, gecacht in `lucy_voice.safetensors` (44 MB) | | Laeuft | `~/.lucy-stimme/`, systemd-**user**-Dienst, `enable`d, CPU | | Start | ~48 s Ladezeit, danach ~5 s fuer 3,7 s Audio | Mitgezogen wurde die **ganze Abstimmung**, nicht nur das Modell: `text_norm.py` (Symbole/Pfade/URLs → Zahlen → Akronyme), Emotions-Voreinstellungen mit Anlaufwoertern, Umlaut-Wortliste, Hochpass auf der Referenz, kalibrierter Pegel. Ohne die klingt pocket nicht wie Lucy. ‼️ Der Sweep im TTS-Plan (*„seriell schlaegt parallel"*) wurde auf einem **9700X** gemessen. Die Box ist ein Ryzen AI MAX+ 395 — das Ergebnis ist **nicht uebertragen**, nur uebernommen. Wer Tempo braucht, misst neu. ### Recherche 21.08.: pocket bleibt Nichts seit Mai schlaegt es auf dieser Achse. Die Alternativen sind 5–17× groesser: Qwen3-TTS 0,6–1,7 Mrd. (Apache 2.0, Deutsch, 3-Sekunden-Klon), NeuTTS Air 0,5 Mrd. (GGUF), CosyVoice2 0,5 Mrd. — gegen pockets **100 Mio.** Fuer einen taeglichen Sprachnachrichten-Job auf CPU ist das der falsche Handel. **Ihr wart bereits auf dem neuesten Stand** — nichts zu aktualisieren. ### Echte Sprachnachricht braucht OGG/Opus Eine WAV kommt in Telegram als **Dateianhang** an. Fuer das runde Sprachmemo mit Wellenform braucht es OGG/Opus — dafuer wurde **ffmpeg installiert** (8.0.1): ```bash ffmpeg -y -i ton.wav -c:a libopus -b:a 32k -ar 48000 -ac 1 ton.ogg hermes send --to telegram "MEDIA:ton.ogg" ``` Ganze Kette (Text + Stimme + Versand) gemessen: **10 Sekunden**. ### Altlast am Rande `F:\Coding Stuff\lucy\lucy-tts\Lucy-Startklar.bat` zeigt auf `mission-control-2\client\lucy-tts` — den Ordner gibt es seit der Repo-Trennung nicht mehr.