Files
mission-control-v2/deploy/jobs/README.md
T
HitonabiandClaude Opus 5 25dbfb2b61
Ampel / ampel (push) Successful in 21s
feat(stimme): Lucys echte Stimme auf der Box - pocket-tts 2.1.0 als lucy-stimme.service
:8650 lieferte ElevenLabs 'Artoria/Saber' = Hermes' Stimme, nicht Lucys (und
Cloud). Jetzt :8021 mit Kyutai pocket-tts, Modell german_24l, geklont aus
ref.mp3 - samt text_norm, Emotions-Presets und Pegel-Abstimmung. Sprachnachricht
als OGG/Opus via ffmpeg. Recherche: pocket ist weiter die richtige Wahl.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-21 17:01:23 +02:00

200 lines
8.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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:<pfad>`**. 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 <id> "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 517× groesser:
Qwen3-TTS 0,61,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.