fix(jobs): Persona zurueck - Emojis, Quellen-Links, Commander-Anrede, Stimme in Telegram

Mein erster Prompt verbot Emojis und Deko und ueberstimmte damit SOUL.md.
Formatierung kommt aus der Persona, nicht aus dem Job. Dazu news-melden.sh:
Text via notify.sh, Stimme via voice-service :8650 (Lucys echte deutsche
Stimme, nicht Hermes' englisches edge-TTS) und hermes send MEDIA:.
SOUL.md-Verweise auf die abgeschalteten Werkzeuge kanban/delegation behoben.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Hitonabi
2026-08-21 16:35:02 +02:00
co-authored by Claude Opus 5
parent 9cf04c427e
commit fa69edc1aa
2 changed files with 118 additions and 0 deletions
+63
View File
@@ -70,3 +70,66 @@ scheitert daran mit unverstaendlichen Meldungen.
| 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.
+55
View File
@@ -0,0 +1,55 @@
#!/usr/bin/env bash
# news-melden.sh — schickt den fertigen Nachrichtenbericht als TEXT und als
# SPRACHE an den Commander (21.08.2026).
#
# Warum ein Skript statt zwei Anweisungen im Prompt: der Agent soll genau EINEN
# Befehl aufrufen. Alles danach ist deterministisch — Zustellung darf nicht davon
# abhaengen, ob ein Modell die Reihenfolge einhaelt.
#
# Erwartet zwei Dateien, die der Agent vorher geschrieben hat:
# $1 Textfassung (mit Emojis, Links, Formatierung — geht nach Telegram)
# $2 Sprechfassung (kurz, ohne Links/Emojis — wird vorgelesen)
#
# Stimme: MC2s voice-service auf :8650 — das ist Lucys ECHTE Stimme (Piper/
# Chatterbox, deutsch). Hermes' eingebautes TTS steht auf `edge` mit
# `en-US-AriaNeural` und waere englisch — deshalb hier bewusst nicht benutzt.
set -uo pipefail
TEXTDATEI="${1:-/tmp/news-text.md}"
SPRECHDATEI="${2:-/tmp/news-sprich.txt}"
NOTIFY="${NOTIFY:-$HOME/mission-control-v2/deploy/notify.sh}"
VOICE="${VOICE_URL:-http://127.0.0.1:8650}"
HERMES="${HERMES_BIN:-$HOME/.local/bin/hermes}"
TON="/tmp/news-stimme.wav"
if [ ! -s "$TEXTDATEI" ]; then
bash "$NOTIFY" -s "[News]" "Der Nachrichtenbericht ist leer geblieben ($TEXTDATEI). Da lief etwas schief."
exit 1
fi
# ------------------------------------------------------------------ Text ----
# notify.sh erreicht Telegram UND Lucys Briefkasten in einem Aufruf.
bash "$NOTIFY" -s "" "$(cat "$TEXTDATEI")"
TEXT_OK=$?
# ---------------------------------------------------------------- Stimme ----
# Ab hier ist alles Kuer: klappt die Stimme nicht, ist der Text trotzdem raus.
if [ ! -s "$SPRECHDATEI" ]; then
echo "[news-melden] keine Sprechfassung — nur Text verschickt" >&2
exit $TEXT_OK
fi
CODE=$(curl -s -m 180 -X POST "$VOICE/tts" \
-H 'Content-Type: application/json' \
--data "$(python3 -c 'import json,sys; print(json.dumps({"text": open(sys.argv[1], encoding="utf-8").read()[:1500]}))' "$SPRECHDATEI")" \
-o "$TON" -w '%{http_code}' 2>/dev/null)
if [ "$CODE" != "200" ] || [ ! -s "$TON" ]; then
echo "[news-melden] TTS antwortete mit '$CODE' — Text ist raus, Stimme nicht" >&2
exit $TEXT_OK
fi
"$HERMES" send --to telegram "MEDIA:$TON" >/dev/null 2>&1 \
|| echo "[news-melden] Sprachdatei liess sich nicht senden — Text ist raus" >&2
exit $TEXT_OK