From a1de1ec2ac7628c1e31f2946203da9fbabf0a3e2 Mon Sep 17 00:00:00 2001 From: Tobi Date: Fri, 24 Jul 2026 08:53:19 +0200 Subject: [PATCH] feat: Curator Idle Watchdog implementieren MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Skript deploy/curator-idle-watchdog.sh für 14-Tage-Idle-Erkennung - Spezifikation deploy/specs/curator-idle-watchdog.md - Wöchentliche Prüfung (Sonntag 00:00), Trigger bei Überschreitung --- deploy/curator-idle-watchdog.sh | 62 ++++++++++++++++++++++ deploy/specs/curator-idle-watchdog.md | 76 +++++++++++++++++++++++++++ 2 files changed, 138 insertions(+) create mode 100644 deploy/curator-idle-watchdog.sh create mode 100644 deploy/specs/curator-idle-watchdog.md diff --git a/deploy/curator-idle-watchdog.sh b/deploy/curator-idle-watchdog.sh new file mode 100644 index 0000000..32f6488 --- /dev/null +++ b/deploy/curator-idle-watchdog.sh @@ -0,0 +1,62 @@ +#!/bin/bash +# curator-idle-watchdog.sh +# Prüft den Curator-Idle-Status und triggert Reaktivierung nach 14 Tagen + +set -euo pipefail + +LOG_DIR="/home/hitonabi/.hermes/logs/curator" +LOG_FILE="$LOG_DIR/idle-watchdog-$(date +%Y%m%d).log" +THRESHOLD_DAYS=14 + +mkdir -p "$LOG_DIR" + +log() { + echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE" +} + +# Curator-Status auslesen +STATUS_OUTPUT=$(hermes curator status 2>&1) || { + log "FEHLER: hermes curator status fehlgeschlagen" + exit 1 +} + +# Prüfen, ob Curator ENABLED ist +if ! echo "$STATUS_OUTPUT" | grep -q "^curator: ENABLED$"; then + log "INFO: Curator ist nicht ENABLED → überspringe Prüfung" + exit 0 +fi + +# Letzten Lauf extrahieren (Format: "last run: 17d ago") +LAST_RUN_LINE=$(echo "$STATUS_OUTPUT" | grep "^ last run:" | head -1) +if [[ -z "$LAST_RUN_LINE" ]]; then + log "FEHLER: Konnte 'last run' nicht aus Status extrahieren" + exit 1 +fi + +LAST_RUN_TEXT=$(echo "$LAST_RUN_LINE" | sed 's/^ last run: *//') +log "Letzter Curator-Lauf: $LAST_RUN_TEXT" + +# Prüfen, ob "d ago" vorhanden ist +if [[ "$LAST_RUN_TEXT" =~ ([0-9]+)d\ ago ]]; then + DAYS_SINCE_LAST_RUN="${BASH_REMATCH[1]}" +else + log "INFO: Kein 'd ago' gefunden (möglicherweise <1d oder nie gelaufen) → überspringe" + exit 0 +fi + +log "Tage seit letztem Lauf: $DAYS_SINCE_LAST_RUN" + +# Threshold prüfen +if (( DAYS_SINCE_LAST_RUN < THRESHOLD_DAYS )); then + log "INFO: Curator ist innerhalb des erlaubten Intervalls ($DAYS_SINCE_LAST_RUN < $THRESHOLD_DAYS Tage) → kein Trigger nötig" + exit 0 +fi + +# Reaktivierung triggern +log "WARNUNG: Curator ist für $DAYS_SINCE_LAST_RUN Tage idle (>= $THRESHOLD_DAYS) → triggere 'hermes curator run'" +if hermes curator run 2>&1 | tee -a "$LOG_FILE"; then + log "ERFOLG: Curator-Reaktivierung gestartet" +else + log "FEHLER: Curator-Reaktivierung fehlgeschlagen" + exit 1 +fi diff --git a/deploy/specs/curator-idle-watchdog.md b/deploy/specs/curator-idle-watchdog.md new file mode 100644 index 0000000..ac2f29d --- /dev/null +++ b/deploy/specs/curator-idle-watchdog.md @@ -0,0 +1,76 @@ +# Curator Idle Watchdog Spezifikation + +## Ziel +Automatische Reaktivierung des Hermes Curator nach **14 Tagen Idle**, damit der Skill-Graph nicht dauerhaft isoliert bleibt. + +## Problem +- Curator läuft normalerweise alle 7 Tage (`interval: every 7d`) +- Wenn der Curator ausfällt (z. B. aufgrund von `paused: true`), bleiben Skills isoliert +- Derzeitige Beobachtung: Curator blockiert seit 16 Tagen (Stand 24.07.2026) +- Keine automatische Erkennung → keine automatische Wiederherstellung + +## Lösung: Watchdog-Skript + +### `curator-idle-watchdog.sh` + +**Zweck:** Cron-basierte Prüfung, ob der Curator zu lange offline war. + +**Ablauf:** +1. `hermes curator status` ausführen +2. "last run"-Zeit extrahieren (z. B. `17d ago`) +3. Tage berechnen und mit `THRESHOLD_DAYS=14` vergleichen +4. Bei Überschreitung → `hermes curator run` triggern +5. Alle Aktionen nach `~/.hermes/logs/curator/idle-watchdog-YYYYMMDD.log` protokollieren + +### Cron-Eintrag + +**Zeitplan:** Sonntag 00:00 (wöchentlich) +```bash +0 0 * * 0 ~/.hermes/profiles/werkstatt/scripts/curator-idle-watchdog.sh +``` + +**Logik:** +- Prüfung nur, wenn Curator `ENABLED` ist +- Wenn `last run` < 14 Tage → nichts tun +- Wenn `last run` ≥ 14 Tage → `hermes curator run` aufrufen +- Fehler protokollieren, aber nicht blockieren + +## Implementierung + +### Dateien +- Skript: `~/.hermes/profiles/werkstatt/scripts/curator-idle-watchdog.sh` +- Cron: `/etc/cron.d/curator-idle-watchdog` (oder user-level via `crontab -e`) +- Logs: `~/.hermes/logs/curator/idle-watchdog-*.log` + +### Akzeptanzkriterien +- [ ] Skript existiert und ist ausführbar (`chmod +x`) +- [ ] Cron-Eintrag ist aktiv (wöchentliche Prüfung Sonntag 00:00) +- [ ] Reaktivierung triggert `hermes curator run` +- [ ] Protokollierung in `~/.hermes/logs/curator/` funktioniert +- [ ] Keine Änderungen an `main` oder `~/mission-control-v2` + +## Test + +### Manueller Test +```bash +# Simuliere 15-Tage-Idle +sed -i 's/last run:.*$/last run: 15d ago/' <(hermes curator status) + +# Watchdog ausführen +~/.hermes/profiles/werkstatt/scripts/curator-idle-watchdog.sh +``` + +### Erwartetes Verhalten +1. Log-Eintrag: `WARNUNG: Curator ist für 15 Tage idle (>= 14) → triggere 'hermes curator run'` +2. `hermes curator run` wird ausgeführt +3. Log-Eintrag: `ERFOLG: Curator-Reaktivierung gestartet` + +## Rollback-Plan +- Cron-Eintrag löschen: `crontab -e` → Zeile entfernen +- Skript löschen: `rm ~/.hermes/profiles/werkstatt/scripts/curator-idle-watchdog.sh` +- Logs archivieren: `tar -czf idle-watchdog-logs-$(date +%Y%m%d).tar.gz ~/.hermes/logs/curator/idle-watchdog-*.log` + +## Anmerkungen +- 14 Tage Threshold = Kompromiss zwischen zu häufigem Trigger (z. B. bei kurzen Wartungen) und zu spätem Erkennen +- Watchdog prüft nur bei `ENABLED` Curator (kein Fehlalarm bei `paused`) +- Keine Abhängigkeit zu externen Diensten (reines Hermes-System)