vignette/data/clinical/p1-crisis-review-cases.schema.json
2026-08-28 19:04:17 +09:00

127 lines
4.2 KiB
JSON

{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"$id": "vignette.p1_crisis_review_cases.v1",
"title": "Vignette P1 synthetic crisis review cases",
"type": "object",
"additionalProperties": false,
"required": [
"schema_version",
"case_set_id",
"version",
"protocol_id",
"protocol_version",
"priority",
"scope",
"external_review_boundary",
"content_safety",
"official_source_scope",
"case_decision_contract",
"cases"
],
"properties": {
"schema_version": { "const": "vignette.p1_crisis_review_cases.v1" },
"case_set_id": { "const": "p1-crisis-review-cases" },
"version": { "type": "string", "minLength": 1 },
"protocol_id": { "const": "p1-suicide-ideation-response" },
"protocol_version": { "type": "string", "minLength": 1 },
"priority": { "const": "P1" },
"scope": { "type": "string", "minLength": 1 },
"external_review_boundary": {
"const": "이 사례에는 임상 정답이 없으며 자동 검사는 외부 임상 검토와 승인을 대신하지 않는다."
},
"content_safety": {
"type": "object",
"additionalProperties": false,
"required": ["synthetic_only", "method_or_means_detail", "clinical_answer_included"],
"properties": {
"synthetic_only": { "const": true },
"method_or_means_detail": { "const": "forbidden" },
"clinical_answer_included": { "const": false }
}
},
"official_source_scope": {
"type": "array",
"minItems": 4,
"uniqueItems": true,
"items": {
"enum": ["samhsa_safe_t", "nimh_youth_outpatient_bssa", "mohw_109", "nice_ng225"]
}
},
"case_decision_contract": {
"type": "object",
"additionalProperties": false,
"required": ["allowed", "pending_value", "approved_rule", "conditional_rule", "rejected_rule"],
"properties": {
"allowed": { "const": ["pass", "conditional", "fail"] },
"pending_value": { "type": "null" },
"approved_rule": { "type": "string", "minLength": 1 },
"conditional_rule": { "type": "string", "minLength": 1 },
"rejected_rule": { "type": "string", "minLength": 1 }
}
},
"cases": {
"type": "array",
"minItems": 1,
"items": { "$ref": "#/$defs/case" }
}
},
"$defs": {
"case": {
"type": "object",
"additionalProperties": false,
"required": ["case_id", "title", "synthetic_scenario", "technical_invariants", "reviewer_assessment"],
"properties": {
"case_id": { "type": "string", "pattern": "^P1-CRISIS-[0-9]{3}$" },
"title": { "type": "string", "minLength": 1 },
"synthetic_scenario": {
"type": "object",
"additionalProperties": false,
"required": ["speaker_context", "signal", "method_or_means_detail_present"],
"properties": {
"speaker_context": { "enum": ["persona", "counselor_question", "learner_real"] },
"signal": { "type": "string", "minLength": 1 },
"method_or_means_detail_present": { "const": false }
}
},
"technical_invariants": {
"type": "array",
"minItems": 1,
"items": {
"type": "object",
"additionalProperties": false,
"required": ["invariant_id", "requirement"],
"properties": {
"invariant_id": { "type": "string", "pattern": "^[a-z0-9-]+$" },
"requirement": { "type": "string", "minLength": 1 }
}
}
},
"reviewer_assessment": {
"type": "object",
"additionalProperties": false,
"required": ["decision", "rationale", "reviewed_at"],
"properties": {
"decision": {
"anyOf": [
{ "type": "null" },
{ "enum": ["pass", "conditional", "fail"] }
]
},
"rationale": {
"anyOf": [
{ "type": "null" },
{ "type": "string", "minLength": 1 }
]
},
"reviewed_at": {
"anyOf": [
{ "type": "null" },
{ "type": "string", "format": "date" }
]
}
}
}
}
}
}
}