- 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 문서 지도 갱신
127 lines
4.4 KiB
JSON
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
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|