DMF_Crawler/prompts/daily_briefing.schema.json
Yun Chan 56a6e2da93 chore: 저장소 구조 정리 및 문서화, 첫 커밋
- src/dist 산출물 분리 원칙 정리(.gitignore, .gitattributes)
- 루트 및 주요 폴더(config/scripts/prompts/tests/src, 런타임 폴더 5종)에
  안내용 README.md 추가
- CHANGELOG.md, LICENSE, docs/ops/05-release-and-versioning.md 추가
- docs/README.md 문서 지도 갱신
2026-09-04 09:25:44 +09:00

127 lines
4.4 KiB
JSON

{
"$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
}
}
}
}
}
}