---
template: policy-doc@1
doc_id: 02-treat
title: 진료·치료 도메인 — 수집 분산과 대기열 · 오류 분류 · 인증 속도 제한 · 호출 원문 로그 · 고객사 바이패스 · 기준 마스터 · 비차단 신원 복원 미배포
config: ../_meta/template-config.yaml
last_verified: 4d798f55
policies:
  - id: TREAT_COLLECT_DISPATCH
    status: active-prod
    evidence: [S-constant, S-contract]
    limitations:
      - 분산과 대기열이 있다는 것과 각 판정 자리까지가 관측이다. 동시 수용량의 실제 값은 실행 환경 설정에 걸려 있어 이 저장소가 말하지 않는다
      - 예약 카운터가 외부 저장소에 산다. 그 저장소가 비었을 때의 동작은 런타임 축이며 이 문서가 검증하지 않았다
    anchors:
      - insuniverse-server/apps/api/src/modules/treat/dispatch/treat-dispatcher.service.ts:110
      - insuniverse-server/apps/api/src/modules/treat/dispatch/treat-queue.service.ts:72
      - insuniverse-server/apps/api/src/modules/treat/dispatch/treat-reservation.service.ts:59
  - id: TREAT_ERROR_TAXONOMY
    status: active-prod
    evidence: [S-constant, S-contract]
    limitations:
      - 분류 어휘와 벤더별 대응표가 있다는 것까지가 관측이다. 대응표가 벤더 문서와 일치하는지는 이 문서가 판정하지 않으며 그 자리는 총론 벤더 축이 진다
      - 대응표에 없는 벤더 코드가 들어왔을 때의 낙착점은 이 문서가 세지 않았다
    anchors:
      - insuniverse-server/apps/api/src/modules/treat/error/treat-error-category.ts:5
      - insuniverse-server/apps/api/src/modules/treat/error/treat-error-vendor-map.ts:178
  - id: TREAT_CERTIFY_RATE_LIMIT
    status: active-prod
    evidence: [S-guard, S-route]
    limitations:
      - 제한 층이 인증 입구에 결선돼 있다는 것까지가 관측이다. 창 길이와 허용 횟수는 실행 환경 값이라 적지 않는다
      - 제한이 걸렸을 때의 사용자 문면은 화면 축 소관이며 이 문서가 옮기지 않는다
    anchors:
      - insuniverse-server/apps/api/src/modules/treat/certify-rate-limit.guard.ts:23
      - insuniverse-server/apps/api/src/modules/treat/certify-rate-limit.guard.ts:34
  - id: TREAT_AUDIT_LOG
    status: active-prod
    evidence: [S-schema, S-roles]
    limitations:
      - 로그가 두 갈래로 갈려 각각 자기 자료형을 갖는다는 것까지가 관측이다. 두 갈래의 보관 기간 차이는 총론 보관 축이 진다
      - 로그에 원문이 실린다는 사실은 관측이되 그 원문의 마스킹 여부는 이 문서가 판정하지 않는다
    anchors:
      - insuniverse-server/apps/api/src/modules/treat/log/log-treat.entity.ts:11
      - insuniverse-server/apps/api/src/modules/treat/log-b2c/log-b2c-treat.entity.ts:5
      - insuniverse-server/apps/api/src/modules/treat/log/log-treat-admin.controller.ts:16
  - id: TREAT_CLIENT_BYPASS
    status: active-prod
    evidence: [S-guard, S-route]
    limitations:
      - 별도 인증 방식을 쓰는 외부 입구가 있다는 것까지가 관측이다. 그 자격의 발급·회수 절차는 이 저장소가 말하지 않는다
      - 봉투를 그대로 넘긴다는 것은 관측이되 넘기기 전 검증의 범위는 세지 않았다
    anchors:
      - insuniverse-server/apps/api/src/modules/treat/coocon-bypass.controller.ts:25
      - insuniverse-server/apps/api/src/modules/treat/coocon-bypass.controller.ts:41
  - id: TREAT_VENDOR_TESTBED
    status: active-prod
    evidence: [S-guard, S-constant]
    limitations:
      - 관리자 전용 시험대가 있고 벤더별 단계·대기 시간이 상수로 선언돼 있다는 것까지가 관측이다. 그 값들이 운영 호출과 같은 값인지는 이 문서가 대조하지 않았다
      - 시험대의 호출이 실제 벤더로 나가는지 모사인지는 실행 환경에 걸려 있다
    anchors:
      - insuniverse-server/apps/api/src/modules/treat-test/treat-test.controller.ts:16
      - insuniverse-server/apps/api/src/modules/treat-test/reference/flows.ts:45
  - id: MEDICAL_RAW_EXPORT
    status: active-prod
    evidence: [S-route, S-component]
    limitations:
      - 원본 자료를 통합문서로 내려받는 자리가 있다는 것까지가 관측이다. 그 문서에 담기는 열의 집합은 이 문서가 열거하지 않는다
      - 이 입구에 판정 층이 결선돼 있지 않다는 것까지가 관측이다. 다른 층이 앞에서 막는지는 이 저장소가 말하지 않는다
    anchors:
      - insuniverse-server/apps/api/src/modules/medical/medical.controller.ts:8
      - insuniverse-server/apps/api/src/modules/medical/medical.controller.ts:10
      - insuniverse-server/apps/api/src/modules/medical/medical.service.ts:23
  - id: DISEASE_TAXONOMY_MASTER
    status: active-prod
    evidence: [S-roles, S-schema]
    limitations:
      - 분류가 여러 단으로 나뉘고 편집이 관리자 한 종류라는 것까지가 관측이다. 각 단의 코드 체계와 그 발급 규칙은 이 문서가 판정하지 않는다
      - 공개 조회가 트리 형태로 열린다는 것은 관측이되 그 트리의 깊이 제한은 세지 않았다
    anchors:
      - insuniverse-server/apps/api/src/modules/disease/disease.controller.ts:53
      - insuniverse-server/apps/api/src/modules/disease/disease.entity.ts:7
      - insuniverse-server/apps/api/src/modules/disease/disease-public.controller.ts:21
  - id: CLINICAL_STANDARD_MASTER
    status: active-prod
    evidence: [S-roles, S-schema]
    limitations:
      - 검사 기준과 투약 기준이 각각 자기 마스터를 갖고 편집이 관리자 한 종류라는 것까지가 관측이다. 두 마스터가 서로를 참조하는지는 세지 않았다
      - 기준값의 산출 근거(임상 문헌 등)는 이 저장소 밖이다
    anchors:
      - insuniverse-server/apps/api/src/modules/clinical-result/clinical-result.controller.ts:33
      - insuniverse-server/apps/api/src/modules/clinical-result/clinical-result.entity.ts:5
      - insuniverse-server/apps/api/src/modules/medication-standard/medication-standard.controller.ts:37
  - id: COURSES_BOOKMARK
    status: active-prod
    evidence: [S-guard, S-schema]
    limitations:
      - 책갈피가 로그인 주체에 묶인다는 것까지가 관측이다. 한 주체가 담을 수 있는 개수 상한은 이 문서가 세지 않았다
      - 강의 자체의 공개 범위는 `07-content.md` 소관이며 이 문서는 책갈피 축만 진다
    anchors:
      - insuniverse-server/apps/api/src/modules/courses/bookmark/courses-bookmark.controller.ts:22
      - insuniverse-server/apps/api/src/modules/courses/bookmark/courses-bookmark.entity.ts:6
  - id: ANALYSIS_COMPLETION_FANOUT
    status: active-prod
    evidence: [S-contract, A-comment]
    limitations:
      - 후속 처리가 이벤트 처리기 안에서 순차로 일어나고 각 단계가 개별 실패 흡수를 갖는다는 것까지가 관측이다. 흡수된 실패를 뒤에 발견하는 경로가 있는지는 이 문서가 세지 않았다
      - 단계 집합은 이 처리기 안에서 유도했다. 다른 처리기가 같은 사건에 반응하는지는 전수로 세지 않았다
    anchors:
      - insuniverse-server/apps/api/src/modules/treat/treat.event-handler.ts:168
      - insuniverse-server/apps/api/src/modules/treat/treat.event-handler.ts:301
      - insuniverse-server/apps/api/src/modules/treat/treat.event-handler.ts:424
      - insuniverse-server/apps/api/src/modules/treat/treat.event-handler.ts:443
      - insuniverse-server/apps/api/src/modules/treat/treat.event-handler.ts:464
      - insuniverse-server/apps/api/src/modules/treat/treat.event-handler.ts:472
  - id: RECOMMENDATION_OPTIONAL_IDENTITY
    status: staged-only
    evidence: [S-guard, A-release]
    limitations:
      - 미도달 판정의 근거는 세 앵커 행의 최종 변경 커밋 하나다. 그 행들이 뒤에 다른 커밋으로 밀리면 같은 규칙이 도달로 뒤집힐 수 있다
      - 도달성의 정본은 릴리스 인덱스이고 그 인덱스가 배포를 확증하지는 않는다. 승격 판정 자체는 이 문서 밖이다
    anchors:
      - insuniverse-server/apps/api/src/modules/clinical-result/clinical-result-public.controller.ts:21
      - insuniverse-server/apps/api/src/modules/medication-standard/medication-standard-public.controller.ts:21
      - insuniverse-server/apps/api/src/modules/disease/disease.service.ts:55
---

# 진료·치료 도메인 — 수집 분산과 대기열 · 오류 분류 · 인증 속도 제한 · 호출 원문 로그 · 고객사 바이패스 · 기준 마스터 · 비차단 신원 복원 미배포

진료 자료를 **어떻게 모으고 무엇으로 해석하는가**를 다룬다. 여러 공급자에 나눠 보내는 분산과 그 앞의 대기열, 벤더마다 다른 오류를 하나로 접는 분류, 인증 요청의 속도 제한, 호출 원문이 남는 로그, 외부 고객사 전용 입구, 질병·검사·투약 기준 마스터, 강의 책갈피가 여기 있다.

**여기 없는 것** — 모은 자료를 해석해 내놓는 결과 축은 `01-analysis.md` 가, 수집 1건이 소비하는 잔여 한도는 `03-subscription-order.md` 가 진다. 벤더별 성공·자료없음·실패의 뜻과 보관 기간, 개인정보 마스킹 규칙은 총론 소관이며 이 문서는 그 층이 이 도메인에 결선된 사실만 낸다.

## 정책 (기획)

### TREAT_COLLECT_DISPATCH

**진료 수집은 공급자 한 곳에 몰아 보내지 않고 여러 곳에 나눠 보낸다.** 각 공급자마다 동시에 처리할 수 있는 흐름 수가 정해져 있고, 그 수를 넘는 요청은 바로 거절되는 것이 아니라 **대기열에 줄을 선다.** 줄에 선 요청은 자기 앞에 살아 있는 요청이 몇인지로 순번을 안다.

자리를 잡는 행위와 자리를 놓는 행위가 짝을 이루며, 잡아 둔 자리는 갱신하지 않으면 스스로 풀린다.

### TREAT_ERROR_TAXONOMY

**공급자마다 다른 오류 코드를 하나의 분류 어휘로 접는다.** 입력이 잘못된 경우, 인증 앱이 없는 경우, 인증서 문제, 승인 대기, 코드 오류처럼 사용자가 할 일이 갈리는 축으로 나뉜다. 각 공급자의 원본 코드가 어느 분류로 가는지는 대응표가 정한다.

이 분류는 사용자에게 무엇을 안내할지를 가르는 축이며, 원본 코드 자체는 로그에 따로 남는다.

### TREAT_CERTIFY_RATE_LIMIT

**인증 요청에는 속도 제한이 걸린다.** 같은 전화번호와 같은 접속 지점을 축으로 재며, 한도를 넘으면 그 다음 요청이 거부된다. 신원 정보를 흩뿌려 시도하는 남용이 이 층이 겨냥한 것이다.

### TREAT_AUDIT_LOG

**수집 호출은 원문이 로그로 남고, 그 로그는 두 갈래로 갈린다.** 일반 경로와 B2C 경로가 각각 자기 자료형을 갖고, 요청 종류·개시 주체·단계·인증 방식·결과 상태가 코드값으로 기록된다. 관리자만 이 로그를 열고 내려받는다.

### TREAT_CLIENT_BYPASS

**외부 고객사를 위한 별도 수집 입구가 있다.** 이 입구는 사용자 로그인이 아니라 고객사 자격으로 열리며, 받은 봉투를 그대로 공급자에게 넘긴다. 일반 사용자 경로와 입구·자격·기록이 모두 다르다.

### TREAT_VENDOR_TESTBED

**관리자 전용 벤더 시험대가 따로 있다.** 공급자별 단계와 대기 시간이 상수로 선언돼 있고, 시나리오를 골라 인증과 수집을 각각 눌러 볼 수 있다. 운영 경로와 분리된 입구다.

### MEDICAL_RAW_EXPORT

**모은 원본 자료를 통합문서로 내려받는 자리가 있다.** 분석 결과가 아니라 수집 원문 쪽이며, 건 단위로 열린다.

**그 입구에는 판정 층이 걸려 있지 않다.** 이 축의 다른 입구들과 달리 인증·역할 어느 결선도 이 파일에 없고, 건 식별자만 주면 열린다. 이 문서는 그 사실을 관측으로 적고 고치지 않는다 — 코드 수정은 이 PRD 밖이며 이월 원장이 그 자리를 진다.

### DISEASE_TAXONOMY_MASTER

**질병 분류는 여러 단으로 나뉜 마스터다.** 큰 분류 아래 중간·작은 분류와 세부가 있고, 편집은 관리자 한 종류만 한다. 공개 쪽에는 이 분류를 트리로 여는 조회와 그 분류에 맞춘 보장 추천 조회가 따로 있다.

### CLINICAL_STANDARD_MASTER

**검사 기준과 투약 기준이 각각 자기 마스터를 갖는다.** 둘 다 편집은 관리자 한 종류만 하고, 큰 분류와 중간 분류로 나뉜 자료형을 쓴다. 이 기준이 추천 조회의 입력이 된다.

### COURSES_BOOKMARK

**강의 책갈피는 로그인 주체에 묶인다.** 목록·추가·삭제가 모두 그 주체의 것만 다루며, 로그인하지 않으면 입구 자체가 닫힌다.

### ANALYSIS_COMPLETION_FANOUT

**분석 1건이 끝나는 순간 함께 일어나는 일은 넷이고, 그 넷은 요청을 처리하던 자리가 아니라 별도 이벤트 처리기 안에서 순차로 일어난다.** 수집 응답 원문을 이력으로 적재하고, 분석 자료를 만들고, 사용자 알림을 남기고, 주문상세 상태를 갱신한다.

**그 넷은 하나의 되돌릴 수 있는 묶음이 아니다.** 각 단계가 자기 실패 흡수를 갖고, 한 단계가 실패해도 앞 단계는 되돌려지지 않으며 뒤 단계가 이어서 실행된다. 흡수된 실패는 로그로만 남는다 — 코드 주석이 그 의도를 명시한다.

수집 자체가 예외로 끝난 경로도 같은 형태다. 실패 이력 적재와 실패 상태 전이·예약 반환이 각각 따로 흡수되고, 그 뒤 정상 흐름만 중단된다.

## 강제 지점 (개발)

### TREAT_COLLECT_DISPATCH

여러 공급자로 나눠 보내는 처리기는 `insuniverse-server/apps/api/src/modules/treat/dispatch/treat-dispatcher.service.ts:110` 이다. 대기열 진입은 `insuniverse-server/apps/api/src/modules/treat/dispatch/treat-queue.service.ts:72`, 공급자별 자리 확보는 `insuniverse-server/apps/api/src/modules/treat/dispatch/treat-reservation.service.ts:59` 가 진다.

**요청 진입부터 수집 개시까지 관여하는 모듈에는 순서가 있다.** 다섯 단계이고 각 단계의 자리를 좌표로 세운다.

1. 진료정보 요청 입구가 요청을 받는다 — `insuniverse-server/apps/api/src/modules/treat/treat.controller.ts:89`. 입구는 `treat` 모듈 소유다.
2. 기관 사용중지 판정이 먼저 선다 — `insuniverse-server/apps/api/src/modules/treat/treat.service.ts:604`. 심평원이 관리자 설정으로 막혀 있으면 여기서 끝나고 뒤 단계는 돌지 않는다. 판정 자체는 기관 사용중지 모듈이 진다.
3. 주문상세를 읽어 수집 요청 본문을 만든다 — `insuniverse-server/apps/api/src/modules/treat/treat.service.ts:607`. 조회는 주문상세 모듈이 진다.
4. 자동차 수집 자리를 잡는다 — `insuniverse-server/apps/api/src/modules/treat/treat.service.ts:649`. 자리를 못 잡으면 자동차 항목 없이 기본 항목만 보낸다.
5. 수집 발사가 공급자 스위치를 지나 위 분산 처리기로 들어간다 — 발사가 `insuniverse-server/apps/api/src/modules/treat/treat.service.ts:671` 이고, 그 발사가 어느 구현으로 가는지는 `insuniverse-server/apps/api/src/modules/treat/treat.service.ts:115` 의 스위치가 설정값으로 고른다.

**이 순서는 불확정이 아니다.** 다섯 단계가 한 비동기 함수 본문 안에서 전부 `await` 로 이어지고, 발사 이전 단계 중 어느 것도 뒤에 남는 작업을 만들지 않는다 — 그 함수의 시작이 `insuniverse-server/apps/api/src/modules/treat/treat.service.ts:602` 이고 마지막 단계가 `insuniverse-server/apps/api/src/modules/treat/treat.service.ts:671` 이다. 순차가 깨지는 자리는 수집이 **끝난 뒤**의 팬아웃이며 그것은 ANALYSIS_COMPLETION_FANOUT 이 진다.

**이 순서가 답하지 않는 것**: 공급자 스위치가 읽는 설정값의 배포별 실제 값은 이 저장소에 없다. 어느 가지를 고르는지는 실행 환경이 정한다.

### TREAT_ERROR_TAXONOMY

분류 어휘는 `insuniverse-server/apps/api/src/modules/treat/error/treat-error-category.ts:5` 의 열거형이고, 공급자별 원본 코드의 대응표는 `insuniverse-server/apps/api/src/modules/treat/error/treat-error-vendor-map.ts:178` 의 상수 맵이다. 공급자별 성공·실패 의미 차이 자체는 `../06-vendors/02-failure-semantics.md` 가 진다.

### TREAT_CERTIFY_RATE_LIMIT

제한 층은 `insuniverse-server/apps/api/src/modules/treat/certify-rate-limit.guard.ts:23` 이 선언하고 판정은 `insuniverse-server/apps/api/src/modules/treat/certify-rate-limit.guard.ts:34` 에서 내려진다.

### TREAT_AUDIT_LOG

일반 경로 로그의 자료형은 `insuniverse-server/apps/api/src/modules/treat/log/log-treat.entity.ts:11`, B2C 경로는 `insuniverse-server/apps/api/src/modules/treat/log-b2c/log-b2c-treat.entity.ts:5` 다. 열람 입구의 허용 역할은 `insuniverse-server/apps/api/src/modules/treat/log/log-treat-admin.controller.ts:16` 이 선언한다.

### TREAT_CLIENT_BYPASS

입구의 결선 자격은 `insuniverse-server/apps/api/src/modules/treat/coocon-bypass.controller.ts:25`, 봉투 통과 처리기는 `insuniverse-server/apps/api/src/modules/treat/coocon-bypass.controller.ts:41` 이다. 외부 고객사 계약 자체는 `../03-contracts/05-external-client-api.md` 가 진다.

### TREAT_VENDOR_TESTBED

시험대 입구의 결선 층은 `insuniverse-server/apps/api/src/modules/treat-test/treat-test.controller.ts:16`, 공급자별 대기 시간 상수는 `insuniverse-server/apps/api/src/modules/treat-test/reference/flows.ts:45` 다.

### MEDICAL_RAW_EXPORT

내려받기 입구는 `insuniverse-server/apps/api/src/modules/medical/medical.controller.ts:10` 이고 그 입구를 담은 처리기 선언이 `insuniverse-server/apps/api/src/modules/medical/medical.controller.ts:8` 인데 **그 위에 결선 층 선언이 없다.** 통합문서 조립은 `insuniverse-server/apps/api/src/modules/medical/medical.service.ts:23` 이다.

### DISEASE_TAXONOMY_MASTER

편집 입구의 허용 역할은 `insuniverse-server/apps/api/src/modules/disease/disease.controller.ts:53`, 분류 자료형은 `insuniverse-server/apps/api/src/modules/disease/disease.entity.ts:7`, 공개 트리 조회는 `insuniverse-server/apps/api/src/modules/disease/disease-public.controller.ts:21` 이다.

### CLINICAL_STANDARD_MASTER

검사 기준 편집 입구의 결선 층은 `insuniverse-server/apps/api/src/modules/clinical-result/clinical-result.controller.ts:33`, 자료형은 `insuniverse-server/apps/api/src/modules/clinical-result/clinical-result.entity.ts:5` 다. 투약 기준 편집 입구의 허용 역할은 `insuniverse-server/apps/api/src/modules/medication-standard/medication-standard.controller.ts:37` 이 선언한다.

### COURSES_BOOKMARK

입구의 결선 층은 `insuniverse-server/apps/api/src/modules/courses/bookmark/courses-bookmark.controller.ts:22`, 자료형은 `insuniverse-server/apps/api/src/modules/courses/bookmark/courses-bookmark.entity.ts:6` 이다.

### ANALYSIS_COMPLETION_FANOUT

후속 처리를 여는 자리는 `insuniverse-server/apps/api/src/modules/treat/treat.event-handler.ts:168` 의 비동기 이벤트 선언이다. 네 단계는 이력 적재 `insuniverse-server/apps/api/src/modules/treat/treat.event-handler.ts:301`, 분석 자료 생성 `insuniverse-server/apps/api/src/modules/treat/treat.event-handler.ts:424`, 알림 적재 `insuniverse-server/apps/api/src/modules/treat/treat.event-handler.ts:464`, 상태 갱신 `insuniverse-server/apps/api/src/modules/treat/treat.event-handler.ts:472` 다. 개별 실패 흡수의 한 자리가 `insuniverse-server/apps/api/src/modules/treat/treat.event-handler.ts:443` 이며 트랜잭션으로 묶는 자리는 이 경로에 없다.

### RECOMMENDATION_OPTIONAL_IDENTITY

추천 조회 두 입구에 비차단 신원 복원 층이 `insuniverse-server/apps/api/src/modules/clinical-result/clinical-result-public.controller.ts:21` 과 `insuniverse-server/apps/api/src/modules/medication-standard/medication-standard-public.controller.ts:21` 로 결선돼 있고, 그 뒤의 소유자 판정은 `insuniverse-server/apps/api/src/modules/disease/disease.service.ts:55` 가 내린다. 세 행의 최종 변경 커밋이 릴리스 인덱스의 미도달 집합에 있다. 관리자 열람 경로 자체는 `../02-access/05-admin-view-token.md#VIEW_TOKEN_IDENTITY` 가 진다.

## 적용 범위 (actor × 서비스)

| 정책 id | server | site | admin |
|---|---|---|---|
| TREAT_COLLECT_DISPATCH | 분산 처리기 · 대기열 · 자리 확보 | 수집 요청과 순번 표시 | — |
| TREAT_ERROR_TAXONOMY | 분류 어휘 · 공급자 대응표 | 분류에 맞춘 안내 문면 | 로그 화면의 분류 열 |
| TREAT_CERTIFY_RATE_LIMIT | 제한 층 선언 · 판정 | 제한 응답을 받는다 | — |
| TREAT_AUDIT_LOG | 두 자료형 · 열람 역할 선언 | — | 로그 목록·내려받기 |
| TREAT_CLIENT_BYPASS | 외부 자격 결선 · 봉투 통과 | — | — |
| TREAT_VENDOR_TESTBED | 시험대 결선 층 · 단계 상수 | — | 시험대 화면 |
| MEDICAL_RAW_EXPORT | 내려받기 입구 · 결선 부재 · 통합문서 조립 | 내려받기 호출 | 내려받기 호출 |
| DISEASE_TAXONOMY_MASTER | 편집 역할 선언 · 자료형 · 공개 트리 | 트리·추천 조회 | 분류 편집 화면 |
| CLINICAL_STANDARD_MASTER | 두 마스터의 편집 결선 층 | 추천 조회가 이 기준을 쓴다 | 기준 편집 화면 |
| COURSES_BOOKMARK | 입구 결선 층 · 자료형 | 책갈피 화면 | — |
| ANALYSIS_COMPLETION_FANOUT | 이벤트 선언 · 네 단계 · 실패 흡수 | 완료 알림을 받는다 | 상태 열이 이 갱신을 반영한다 |
| RECOMMENDATION_OPTIONAL_IDENTITY | 비차단 복원 층 · 소유자 판정 | 추천 조회가 이 층 뒤에 있다 | 관리자 열람 경로가 이 층을 통과한다 |

`—` = 그 서비스가 이 정책의 경로에 등장하지 않음.

이 표의 열은 서비스 3종이며 actor 는 열이 아니다. 이 문서의 축은 수집·기준 자원에 걸리는 판정이라 actor 를 열로 두면 서버 한 칸만 차는 표가 된다. 열 이름 집합과 순서는 `../_meta/template-config.yaml` 의 `services` 를 그대로 따른다.

## 예외·폴백

| 정책 id | 예외 조건 | 폴백 동작 | 확인 근거 |
|---|---|---|---|
| TREAT_COLLECT_DISPATCH | 모든 공급자의 자리가 찼을 때 | 거절이 아니라 대기열에 실린다 | `insuniverse-server/apps/api/src/modules/treat/dispatch/treat-queue.service.ts:72` |
| TREAT_COLLECT_DISPATCH | 잡아 둔 자리를 갱신하지 않을 때 | 자리가 스스로 풀려 다음 요청이 쓴다 | `insuniverse-server/apps/api/src/modules/treat/dispatch/treat-reservation.service.ts:59` |
| TREAT_ERROR_TAXONOMY | 대응표에 없는 공급자 코드가 올 때 | 원본 코드는 로그에 남는다. 분류로의 낙착점은 이 문서가 세지 않았다 | `insuniverse-server/apps/api/src/modules/treat/error/treat-error-vendor-map.ts:178` |
| TREAT_CERTIFY_RATE_LIMIT | 한도를 넘겨 요청할 때 | 그 다음 요청이 거부된다 | `insuniverse-server/apps/api/src/modules/treat/certify-rate-limit.guard.ts:34` |
| TREAT_AUDIT_LOG | 관리자가 아닌 주체가 로그를 열려 할 때 | 역할 판정에서 거부된다 | `insuniverse-server/apps/api/src/modules/treat/log/log-treat-admin.controller.ts:16` |
| TREAT_CLIENT_BYPASS | 사용자 로그인만으로 이 입구를 쓰려 할 때 | 자격이 다르므로 거부된다 | `insuniverse-server/apps/api/src/modules/treat/coocon-bypass.controller.ts:25` |
| TREAT_VENDOR_TESTBED | 관리자가 아닌 주체가 시험대에 닿을 때 | 결선 층에서 거부된다 | `insuniverse-server/apps/api/src/modules/treat-test/treat-test.controller.ts:16` |
| MEDICAL_RAW_EXPORT | 로그인하지 않고 이 입구를 쓸 때 | 판정 층이 결선돼 있지 않아 요청이 막히지 않는다 | `insuniverse-server/apps/api/src/modules/medical/medical.controller.ts:8` |
| MEDICAL_RAW_EXPORT | 없는 건을 지정해 내려받을 때 | 통합문서 조립 단계에서 자료가 없어 열이 비는 형태로 떨어진다 | `insuniverse-server/apps/api/src/modules/medical/medical.service.ts:23` |
| DISEASE_TAXONOMY_MASTER | 관리자가 아닌 주체가 분류를 고치려 할 때 | 역할 판정에서 거부된다. 공개 조회는 별도 입구라 영향받지 않는다 | `insuniverse-server/apps/api/src/modules/disease/disease.controller.ts:53` |
| CLINICAL_STANDARD_MASTER | 관리자가 아닌 주체가 기준을 고치려 할 때 | 결선 층에서 거부된다 | `insuniverse-server/apps/api/src/modules/clinical-result/clinical-result.controller.ts:33` |
| COURSES_BOOKMARK | 로그인하지 않고 책갈피에 닿을 때 | 결선 층에서 거부된다 | `insuniverse-server/apps/api/src/modules/courses/bookmark/courses-bookmark.controller.ts:22` |
| ANALYSIS_COMPLETION_FANOUT | 네 단계 중 하나가 실패할 때 | 앞 단계는 되돌려지지 않고 뒤 단계가 이어진다. 로그만 남는다 | `insuniverse-server/apps/api/src/modules/treat/treat.event-handler.ts:443` |
| ANALYSIS_COMPLETION_FANOUT | 수집 자체가 예외로 끝날 때 | 실패 이력과 실패 상태 전이가 각각 따로 흡수되고 정상 흐름만 중단된다 | `insuniverse-server/apps/api/src/modules/treat/treat.event-handler.ts:168` |
| RECOMMENDATION_OPTIONAL_IDENTITY | 신원 값이 없거나 무효일 때 | 요청 자체는 막지 않는다. 차단 여부는 그 뒤 소유자 판정이 정한다 | `insuniverse-server/apps/api/src/modules/disease/disease.service.ts:55` |
| RECOMMENDATION_OPTIONAL_IDENTITY | 이 규칙이 배포에 도달하지 않은 환경일 때 | 관리자 열람 경로가 이 조회를 통과하지 못한다 | `insuniverse-server/apps/api/src/modules/clinical-result/clinical-result-public.controller.ts:21` |

## 부록

이 절의 정책은 **앵커 행의 최종 변경 커밋이 릴리스 인덱스의 미도달 집합에 있어 현행 배포를 판정하지 못한다.** 배치의 정본은 `../_meta/template-config.yaml` 의 `statuses` 이며, 도달이 확인되면 상태가 바뀌고 배치도 함께 옮긴다.

### RECOMMENDATION_OPTIONAL_IDENTITY

**추천 조회 두 입구에 비차단 신원 복원 층이 붙어 있다.** 값이 없어도 요청은 막지 않고, 복원된 신원이 그 뒤 소유자 판정의 입력이 된다. 이 층이 도달한 환경에서는 관리자가 열람 경로로 같은 조회를 통과할 수 있고, 도달하지 않은 환경에서는 그 경로가 없다.

## 연혁

릴리스 태그가 존재하지 않는다. 릴리스 열은 `—` 로 두고 커밋 SHA 로 추적한다.

| 릴리스 | 날짜 | SHA | 변경 요약 |
|---|---|---|---|
| — | 2024-10-02 | `bde1d27f` | 원본 진료자료 통합문서 내려받기 입구 신설 |
| — | 2025-06-04 | `560601e1` | 수집 호출 원문 로그의 자료형 신설 |
| — | 2025-06-24 | `780e6b64` | 로그 열람 입구에 역할 기반 판정 도입 |
| — | 2025-07-09 | `a3350407` | 강의 책갈피 신설 |
| — | 2025-11-04 | `5c84e61c` | 질병 분류 마스터와 관리자 편집 입구 신설 |
| — | 2025-11-05 | `7472edf5` | 검사 기준 마스터 신설 |
| — | 2025-11-10 | `ad7160fd` | 투약 기준 마스터 신설 |
| — | 2025-11-11 | `d372d722` | 질병 분류의 공개 트리 조회 신설 |
| — | 2025-12-26 | `722ee888` | B2C 경로 수집 로그가 별도 자료형으로 갈림 |
| — | 2026-06-05 | `af16d981` | 공급자 분산 처리기와 자리 확보 계층 도입 |
| — | 2026-06-05 | `49ba3434` | 수집 요청 대기열과 순번 판정 도입 |
| — | 2026-06-07 | `2296e03a` | 관리자 전용 벤더 시험대 신설 |
| — | 2026-06-08 | `a6e323b5` | 공급자별 오류를 하나로 접는 분류 어휘 도입 |
| — | 2025-05-29 | `27462162` | 분석 완료 후속 처리가 별도 이벤트 처리기로 옮겨짐 |
| — | 2026-06-27 | `79523e03` | 자동차 수집 토글 추가 — 알림 실패 흡수 자리가 그 커밋에서 옮겨짐 |
| — | 2026-06-30 | `eed6bf4f` | 외부 고객사 전용 수집 바이패스 입구 신설 |
| — | 2026-07-01 | `31f4f8f3` | 인증 요청에 전화번호·접속 지점 축 속도 제한 도입 |
| — | 2026-07-31 | `799cdd7a` | 추천 조회에 비차단 신원 복원 층 추가 |
