{
  "$comment": "Module 4 실습 데이터. 최근 30일 수집 파이프라인 장애 로그. 원인별 비율을 직접 계산해 보세요.",
  "window": { "from": "2026-07-09", "to": "2026-08-07", "days": 30 },
  "totals": { "incidents": 37, "silentFailures": 30 },
  "incidents": [
    { "id": "INC-001", "source": "tech-blog-rss", "cause": "SCHEMA_DRIFT", "detail": "published_at 필드가 pubDate 로 변경", "rowsCollected": 0, "detectedAfterHours": 21 },
    { "id": "INC-002", "source": "tech-blog-rss", "cause": "SCHEMA_DRIFT", "detail": "author 가 문자열에서 객체로 변경", "rowsCollected": 42, "detectedAfterHours": 26 },
    { "id": "INC-003", "source": "product-changelog", "cause": "SCHEMA_DRIFT", "detail": "version 이 숫자에서 문자열로 변경", "rowsCollected": 18, "detectedAfterHours": 30 },
    { "id": "INC-004", "source": "community-forum", "cause": "AUTH_EXPIRED", "detail": "API 토큰 만료", "rowsCollected": 0, "detectedAfterHours": 2 },
    { "id": "INC-005", "source": "community-forum", "cause": "SCHEMA_DRIFT", "detail": "score 필드 제거", "rowsCollected": 133, "detectedAfterHours": 24 },
    { "id": "INC-006", "source": "newsletter-archive", "cause": "RATE_LIMIT", "detail": "429 연속 발생", "rowsCollected": 7, "detectedAfterHours": 1 },
    { "id": "INC-007", "source": "newsletter-archive", "cause": "SCHEMA_DRIFT", "detail": "본문이 html 에서 markdown 으로 변경", "rowsCollected": 61, "detectedAfterHours": 28 },
    { "id": "INC-008", "source": "release-notes", "cause": "SCHEMA_DRIFT", "detail": "중첩 구조 한 단계 추가", "rowsCollected": 0, "detectedAfterHours": 33 },
    { "id": "INC-009", "source": "release-notes", "cause": "AUTH_EXPIRED", "detail": "서비스 계정 권한 회수", "rowsCollected": 0, "detectedAfterHours": 3 },
    { "id": "INC-010", "source": "job-postings", "cause": "SCHEMA_DRIFT", "detail": "location 이 문자열에서 배열로 변경", "rowsCollected": 88, "detectedAfterHours": 22 }
  ],
  "causeSummary": [
    { "cause": "SCHEMA_DRIFT", "count": 30, "ratio": 0.81 },
    { "cause": "AUTH_EXPIRED", "count": 4, "ratio": 0.11 },
    { "cause": "RATE_LIMIT", "count": 3, "ratio": 0.08 }
  ],
  "requiredFieldsExample": {
    "tech-blog-rss": ["title", "link", "published_at", "author"],
    "release-notes": ["version", "released_at", "changes"]
  },
  "rules": [
    "0건 수집은 성공이 아니라 실패로 분류한다",
    "필드 누락 · 타입 변경 · 0건을 서로 다른 오류로 구분한다",
    "검증은 적재 뒤가 아니라 수집 앞단에서 한다"
  ]
}
