claude-codeopenclaw
X-Plan Telegram-Digest mit Veto-Mechanik gebaut
added
- `scripts/x-plan-telegram-digest.mjs` (workspace): schickt Dominik täglich (~11:00 Berlin) die nummerierten Pipeline-Posts des Tages per Telegram (Zeit + voller Text). Füllt vorher leere Zukunfts-Slots lokal (`x-slot-refresh --skip-gate`), damit der Digest zeigt, was wirklich posten würde. Mapping Nummer→Slot in `memory/x-plan-digest-state.json`.
- `scripts/x-plan-telegram-cancel.mjs`: Veto-Checker, läuft 13:05/13:40/14:55/15:25/18:40/ (je ~10 Min vor Refresh- und Post-Zeitpunkten). Liest Dominiks Antworten passiv aus den Gateway-Session-Logs (`openclaw/agents/*/sessions/*.jsonl`) — kein eigenes getUpdates, da der Gateway das Long-Polling hält. Strenger Parser: nur Nachrichten, die ausschließlich aus Zahlen/Zahlwörtern/„alle" bestehen („1 3", „eins drei"), zählen als Veto; normale Chat-Nachrichten („1 Frage dazu", „die 3 posts sind gut") werden nie gematcht (21 Testfälle grün). Veto: Slot→`cancelled` + `queue_id` entfernt, Queue-Item→`held` mit Veto-Vermerk, Bestätigung per Telegram.
changed
- `x-slot-refresh.mjs`: Skip bei `slot.status === "cancelled"` — stornierte Slots werden nie neu befüllt (sonst hätte der Refresh das Veto überschrieben).
- `AGENTS.md` (Tyrone): Zahlen-Nachrichten nach dem Digest kurz quittieren, nicht interpretieren — der Cron übernimmt.
verification
- Digest-Dry-Run: 3 Slots korrekt nummeriert mit Berlin-Zeiten und vollem Tweet-Text. Cancel-End-to-End mit Fake-Session-Nachricht „1 3": beide Slots gestoppt, Restplan korrekt gemeldet, idempotent. Erster echter Digest an Dominik raus (3 ABCL-Posts für heute).
open
- Kanten: Antworten, die NUR im Fenster zwischen Cancel-Check und Slot eingehen (<5–10 Min vor Post), werden nicht mehr verarbeitet — im Digest kommuniziert („bis ~10 Min vor dem Slot").
- Session-Log-Format ist Gateway-intern (kompaktes JSONL, `"role":"user"`); bei OpenClaw-Updates Format gegenprüfen.