{ "$schema": "https://json-schema.org/draft/2020-12/schema", "$id": "https://dmf-crawler.local/schemas/daily_briefing.schema.json", "title": "DMF 일일 브리핑", "description": "agy 응답에서 추출한 객체를 파이프라인이 자체 검증할 때 쓰는 스키마(아키텍처 ADR-17). --json-schema 로 agy 에 넘기는 것은 보조 수단일 뿐이며, 이 파일이 최종 판정 기준이다. 최상위 additionalProperties 를 막지 않는 이유는 agy 내부 도구 래퍼가 toolAction·toolSummary 같은 키를 주입한 실측 사례(agy SSOT 7.2) 때문이다. 그 키들은 extract.py 가 제거한다.", "type": "object", "required": [ "headline", "summary_md", "anomalies", "event_comments", "normalization_candidates" ], "properties": { "headline": { "type": "string", "description": "오늘 하루를 요약한 한 문장. 대시보드 시트 상단에 그대로 인쇄된다.", "minLength": 1, "maxLength": 200 }, "summary_md": { "type": "string", "description": "브리핑 본문(마크다운). 3~6문장.", "minLength": 1, "maxLength": 6000 }, "risk_note": { "type": "string", "description": "규제·공급 관점의 리스크 메모. 없으면 빈 문자열.", "maxLength": 1000 }, "anomalies": { "type": "array", "description": "데이터 자체가 이상해 보이는 지점. 근거가 없으면 빈 배열.", "maxItems": 20, "items": { "type": "object", "required": ["detail", "severity"], "properties": { "detail": { "type": "string", "description": "무엇이 이상한가.", "minLength": 1, "maxLength": 400 }, "severity": { "type": "string", "description": "심각도. models.Severity 와 같은 4단계.", "enum": ["INFO", "WARN", "ERROR", "CRITICAL"] }, "evidence": { "type": "string", "description": "관측 지표에서 가져온 근거 수치.", "maxLength": 300 } } } }, "event_comments": { "type": "array", "description": "중요한 변경 건에 대한 코멘트. enrichment(kind='event_comment') 로 저장된다.", "maxItems": 60, "items": { "type": "object", "required": ["dmf_key", "comment", "importance"], "properties": { "dmf_key": { "type": "string", "description": "변경 목록에 있던 dmf_key 를 그대로 복사한 값.", "minLength": 1, "maxLength": 120 }, "comment": { "type": "string", "description": "이 건이 왜 중요한가. 한두 문장.", "minLength": 1, "maxLength": 400 }, "importance": { "type": "string", "description": "담당자 확인 우선순위.", "enum": ["HIGH", "MEDIUM", "LOW"] } } } }, "normalization_candidates": { "type": "array", "description": "표기 정규화 후보. ADR-25 에 따라 자동 적용하지 않고 state/proposals 로 보내 사람이 승인한다.", "maxItems": 30, "items": { "type": "object", "required": ["kind", "observed", "suggested", "confidence"], "properties": { "kind": { "type": "string", "description": "정규화 대상 축.", "enum": ["ingredient_alias", "company_alias", "country_alias"] }, "observed": { "type": "string", "description": "데이터에 실제로 나타난 표기.", "minLength": 1, "maxLength": 300 }, "suggested": { "type": "string", "description": "같은 대상을 가리킨다고 보는 대표 표기.", "minLength": 1, "maxLength": 300 }, "confidence": { "type": "number", "description": "확신도 0.0~1.0. 0.7 미만은 사람이 먼저 의심한다.", "minimum": 0.0, "maximum": 1.0 }, "rationale": { "type": "string", "description": "그렇게 본 이유.", "maxLength": 300 } } } } } }