From fa69edc1aa29871b69b85bfe66118af42859ff5f Mon Sep 17 00:00:00 2001 From: Hitonabi Date: Fri, 21 Aug 2026 16:35:02 +0200 Subject: [PATCH] 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 --- deploy/jobs/README.md | 63 ++++++++++++++++++++++++++++++++++++++ deploy/jobs/news-melden.sh | 55 +++++++++++++++++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 deploy/jobs/news-melden.sh diff --git a/deploy/jobs/README.md b/deploy/jobs/README.md index c2dc3c7..0b3dc3d 100644 --- a/deploy/jobs/README.md +++ b/deploy/jobs/README.md @@ -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:`**. 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. diff --git a/deploy/jobs/news-melden.sh b/deploy/jobs/news-melden.sh new file mode 100644 index 0000000..c92ad45 --- /dev/null +++ b/deploy/jobs/news-melden.sh @@ -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