콘텐츠로 이동

ADR 0003: Safety 규칙 endpoint를 일반화된 Subject로 보존

상태: Accepted 결정일: 2026-09-03 범위: 금기, 동일일 제한, 최소 간격, 시술 pair 조회

Context

기존 contraindications.json은 대부분 M-code 두 개를 연결하지만 treatment-sequence.json은 다음 종류를 같은 endpoint 위치에 함께 사용한다.

  • 단일 시술 또는 시술군: 보톡스, HA 필러
  • 복합 시술군: RF/HIFU, 프락셔널/필링
  • 약물과 상태: 이소트레티노인, 이소트레티노인 복용 중
  • 재료: 비가교HA
  • 범위: 모든 시술
  • 이미 발생한 선행 상태: HA 필러 주입 후 RF/HIFU

이를 모두 (from_procedure_id, to_procedure_id)로 강제하면 비시술 endpoint가 유실되고, 복합 endpoint는 임의의 한 시술로 축소되며, 단항 상태 규칙은 저장할 수 없다.

Decision

  1. 원장의 규칙 endpoint는 SafetySubject로 저장한다.
  2. Subject 종류는 procedure, procedure_set, medication, material, preparation, state, scope, other의 닫힌 집합이다.
  3. 시술을 가리키는 Subject는 SafetySubjectProcedure로 하나 이상의 ProcedureConcept에 연결한다. 비시술 Subject는 시술 FK를 억지로 만들지 않는다.
  4. qualifier는 매핑의 한정 의미를 보존한다. 예: material=HA, state=active, scope=all_procedures, relation=after.
  5. 규칙은 원문 endpoint와 원문 간격을 항상 보존한다. 같은 날, 단순 단위 값·범위처럼 모호하지 않은 간격만 구조화하고, 조건이 섞인 문장은 raw_interval만 유지한다.
  6. 기존 ProcedureConstraint는 폐기하지 않는다. 양쪽 Subject를 실제 시술 pair로 해석할 수 있을 때 생성되는 실행용 projection으로 사용한다. 환자 약물·상태 규칙은 별도의 patient context 정책이 평가한다.
  7. mapping이 pending인 Subject나 동일 우선순위에서 결과가 충돌하는 규칙은 release 발행을 차단한다.
원문 rule
  ├─ from ──> SafetySubject ──> 0..N ProcedureConcept
  ├─ to   ──> SafetySubject ──> 0..N ProcedureConcept
  └─ source path / raw interval / rationale / evidence

procedure ↔ procedure로 해석 가능
  └─ ProcedureConstraint read projection ──> 기존 pair API

Consequences

  • 현재 corpus의 Safety Subject 34개와 규칙 45개를 누락 없이 저장할 수 있다.
  • 복합 Subject는 여러 시술 FK를 가지며 모든 시술, 약물, 재료도 타입을 잃지 않는다.
  • UI/API의 단순 pair 조회는 계속 단순한 응답을 받을 수 있지만, projection 생성 시 조상/자손 범위와 복합 집합의 확장 정책이 필요하다.
  • 월 단위 간격은 임의로 30일로 환산하지 않는다. API가 날짜 계산을 요구할 때 별도의 달력 정책을 사용해야 한다.

Rejected alternatives

대안 기각 이유
모든 endpoint를 ProcedureConcept로 생성 약물·재료·상태가 시술 taxonomy를 오염시킴
복합 표현의 첫 시술만 연결 안전 규칙 적용 범위를 조용히 축소함
JSON 문장만 저장 검색은 가능하지만 결정적 안전 정책을 실행할 수 없음
월을 항상 30일로 변환 임상 원문의 의미보다 강한 계산 가정을 추가함