feat: Curator Idle Watchdog implementieren
- 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
This commit is contained in:
@@ -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
|
||||||
@@ -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)
|
||||||
Reference in New Issue
Block a user