Cron Self-Healing Protocol

Cron job이 실패해도 침묵하지 않고 자동 복구하거나 최소 상태를 보고하는 표준 프로토콜.

문제

Cron job이 script timeout이나 API failure로 실패하면:

  • Agent가 응답 불가 (cron session에는 대화 채널이 없음)
  • 실패가 눈에 보이지 않음
  • 수동 개입 필요

해결: 3단계 Self-Healing Flow

PHASE 1: Primary Execution
  └→ Script 실행 (timeout_seconds 내에서)

PHASE 2: Retry on Failure
  ├→ 성공 → PHASE 3
  └→ 실패 → Fallback command로 1회 재시도

PHASE 3: Delivery (항상 실행)
  ├→ 성공 → 정상 보고
  └→ 실패해도 → Partial status라도 전달 (절대 침묵 금지)

핵심 원칙: 침묵 금지 (No Silent Failure)

어떤 단계에서 실패하더라도 최소 1개의 보고가 Discord/ Delivery target에 도달해야 함:

시나리오출력
1차 성공정상 보고 (top keeps, article list 등)
1차 실패 → retry 성공Retried report + ⚠️ 표시
1차 실패 → retry 실패Partial status (file count, last run time 등)
전부 실패실패 보고 + 수동 조치가 필요한 이유

현재 적용된 Job

Trend Harvester

Phase 1:  python3 ~/.drewgent/scripts/trend_harvester.py
Phase 2:  --dry-run (collection만 검증)
Fallback: analyzed/keep/ 파일 직접 count → 점수 없이도 상태 전달

SEO Article Harvester

Phase 1:  python3 .../harvester.py
Phase 2:  --limit 10 (10개만 테스트)
Fallback: feedparser로 RSS feed 직접 체크 → 도달 가능한 피드 목록

공통 Fallback Template

## [Job Name] — [timestamp]
Status: ⚠️ [phase] failed after retry
Error: [brief description]
Last successful run: [timestamp or "unknown"]
Action needed: [specific manual step]
Files at: [relevant directory path]

Job 설정 표준

Cron job 등록 시 반드시 포함해야 할 필드:

{
  "name": "...",
  "schedule": "0 */6 * * *",
  "timeout_seconds": 300,
  "prompt": "...",
  "retry_on_failure": true,
  "fallback_delivery": true
}
  • timeout_seconds: minimum 300 (5분). LLM synthesis가 필요한 job은 600 이상 권장
  • retry_on_failure: true면 1회 재시도
  • fallback_delivery: true면 실패해도 partial status 전달

Script 쪽 요구사항

Cron agent가 rely하는 script는 다음 조건을 만족해야 함:

  1. Exit code 명확: 성공=0, 실패!=0
  2. Pre-generated report: 주요 결과는 report.json으로 출력
  3. Partial output 보장: 실패해도 가능한 한 file을 남김
# Script 설계 예시
def main():
    items = collect_all()      # 이건 성공해야 함
    try:
        scores = score_all(items)  # 이건 실패해도 괜찮음
    except ScoringError:
        scores = {}            # 실패해도 partial로 진행
    
    write_report_json(items, scores)  # report.json은 반드시 생성
    deliver_report()           # 이건 항상 실행

jobs.json 위치

~/.drewgent/cron/jobs.json

직접 편집 가능. Gateway restart 없이 즉시 반영 (scheduler가 file watching).