# 18-2 조제 감사 커널 · 합성 참조 하네스

설계서의 2단 Fail-Safe Gate, DUR 규칙 엔진, 각인 매처, 감사 추적 로그를 표준 라이브러리 Python으로 구현하고, 다른 구현으로 다시 계산해 대조한 기록이다. 약품·성분·규칙은 전부 추상 코드이고 임계치는 가상 값이다. 영상 추론은 실행하지 않았다. 분할·OCR·임베딩의 **출력**을 합성 시뮬레이터가 만든다. 여기의 수치는 실제 낱알 사진이나 실제 처방에서의 성능이 아니다.

## 실행

```sh
python3 -B -m dispense18.orchestrate --output evidence/dispense18-run.json
python3 -B -m dispense18.audit --run evidence/dispense18-run.json --output evidence/dispense18-audit.json
python3 -B -m unittest discover -s tests -p test_dispense18.py -v
```

같은 입력에서 두 번 실행한 결과는 바이트 단위로 같다. 솔버 약 2초, 감사 약 2.5초, 단위 시험 61개 약 10초. 부동소수 초월함수(`log`, `cos`, `pow`)를 쓰므로 다른 libm에서는 마지막 자리가 달라져 임계 근처 사례의 판정이 바뀔 수 있다. 그 경우 커밋된 근거와의 바이트 대조가 실패로 알려 준다.

## 파일

| 파일 | 내용 |
| --- | --- |
| `fixtures/gallery.json` | 가상 품목 36개(유사 외형 군집 L1·L2·L4, 유사 명칭 쌍 포함), 갤러리 밖 6개, 혼동 문자군, 시뮬레이터 잡음 |
| `fixtures/ruleset.json` | 지식그래프(품목→성분→효능군)와 가상 DUR 규칙 11개, 단위 환산표 |
| `fixtures/gate.json` | $\alpha$, $\delta$, 임계치, 고장 코드, 벤치마크 구성, 시나리오(미인증, drift 잡음 2배·1.25배) |
| `fixtures/rule_grid.json` | 규칙 전수 열거 격자와 벤치마크 주문 템플릿 |
| `fixtures/boundary_cases.json` · `boundary_expected.json` | 경계 사례 66건의 입력과, 설계 규칙에서 손으로 적은 기대 결정. 기대값은 솔버에 전달하지 않는다 |
| `_contract.py` | 입력 잠금, 정규 JSON, 근거 문자열 규칙(식별자형 토큰만) |
| `_synth.py` | 고정 입력을 합성 관측·주문으로 펼치는 자료 계층. counter 기반 난수(SHA-256). 판정 논리 없음 |
| `matcher.py` | 혼동 문자 가중 편집거리, 면 순서 불변 각인 대조, 자모 분해·명칭 유사도, 혼동 그래프, P×K 샘플러 |
| `rules.py` | Kleene 3값 DUR 엔진, CKD-EPI 2021, MIMIC-IV 행 정규화(전체 타임스탬프 비교, 정확 왕복 수치만 채택, 역전 구간 거부) |
| `conformal.py` | 범주 조건부 배제 검정, PAC 순서통계량, 온라인 conformal drift 감시(`DriftMonitor`: 촬영을 채점한 뒤 기준에 넣는다), 이항 상한 |
| `kernel.py` | 8단계 파이프라인과 fail-closed 제어, 비교에 앞선 유효 범위 검사, 고장 주입 |
| `ledger.py` | append-only hash chain, anchor·head 검증(`open`은 신뢰 head 필수), 대량 실행용 사슬 요약(`DigestSink`) |
| `bench.py` · `orchestrate.py` | 근거 문서 생성 |
| `audit.py` | 솔버 모듈을 import하지 않는 재계산과 관문 G1–G4 |

## 감사기가 다시 계산하는 것

| 대상 | 솔버 | 감사기 |
| --- | --- | --- |
| 편집거리 | 상향식 표 | 하향식 메모이즈 재귀 |
| 규칙 판정 22,410건 × 11 | Kleene 결합기, `Decimal` | 가능세계 오라클, `Fraction` |
| 순서통계량 $k$, $n_{min}$, 필요 양성 수 | 로그감마 부동소수 합 | 정확 유리수 |
| 사례별 결정과 사유 (본 벤치마크 7,500건, 시나리오 2,700건, 경계 66건) | 단계 함수 + 예외 처리 | 설계 규칙을 그대로 적은 선언형 판정. SHA-256 digest로 전건 대조 |
| 고장 조합 50,400개 | 파이프라인을 실제 실행 | 고장표에서 기대 결과를 직접 생성 |
| 감사 로그 | `verify_chain` | 별도 검증기와 자체 변조 시도 |
| drift 감시 | `DriftMonitor`(품목별 기준, `insort`) | 별도 구현의 온라인 기준과 log-wealth, latch 위치와 최대값 대조 |
| 대량 판정 10,200건의 기록 사슬 | 커널이 판정마다 commit한 사슬의 건수와 head | 선언형 판정으로 기록을 하나씩 다시 만들어 이은 사슬의 head |

독립성의 범위는 코드 경로다. 두 쪽은 `_contract.py`와 `_synth.py`를 공유하며, 정답을 볼 수 없게 격리한 블라인드 환경은 아니다. 대조는 개발 중 불일치 하나를 실제로 잡았다(`None`을 반환한 단계의 사유가 `MALFORMED`가 아니라 `EXCEPTION`으로 기록됨. 결정은 양쪽 모두 `REVIEW`).

## 결과 (합성)

| 분모 | N | 자동 통과 | 단측 95% 상한 |
| --- | ---: | ---: | ---: |
| LASA 교체 | 1,500 | 0 | 0.1995% |
| 임의 교체 | 1,000 | 0 | 0.2991% |
| 갤러리 밖 | 600 | 0 | 0.4980% |
| 수량 오류 | 400 | 0 | 0.7461% |
| 규칙 FLAG 주문 | 600 | 0 | 0.4980% |
| 판단불가 주문 | 400 | 0 | 0.7461% |
| 액제 | 0 | — | 보류(빈 분모) |

정상 조제 3,000건의 자동 통과는 1,859건(62.0%)이다. lockout 품목 310건은 전부 재검수다. 갤러리 밖 600건 중 220건은 Gate B만으로는 통과했고 Gate A가 막았다. 미인증 시나리오 900건의 자동 통과는 0건이다.

Gate B가 인증하는 상한은 범주에 따라 다르다. 유사 외형 품목(품목 범주)은 품목 조건부로 $\alpha$ 이하다. 그 밖의 품목(stratum 범주)은 보정 구성으로 가중한 평균이 $\alpha$ 이하이고, 품목 하나로는 $\alpha/w_y$(하네스에서 3–6%)까지 열려 있다. 둘 다 보정 촬영이 서로 독립이라는 가정 아래, 보정표에 대해 확률 $1-\delta$ 이상으로 성립한다.

Drift 감시는 온라인 conformal p-value를 쓴다. 확인된 촬영을 그 시점의 품목별 기준에 대해 채점한 뒤 기준에 넣는다. 본 벤치마크 5,845회 갱신에서 경보는 없었다(최대 $\ln M_t=0$, 경보선 4.61).

| drift 시나리오 | 변화 시점 | latch | latch 전 자동 통과 | 그중 오조제 | latch 뒤 자동 통과 |
| --- | ---: | ---: | ---: | ---: | ---: |
| 잡음 2배 | 300 | 342 | 22 / 43건 | 0 | 0 / 557건 |
| 잡음 1.25배 | 300 | 796 | 253 / 497건 | 0 | 0 / 103건 |

latch 전 구간에는 Gate B의 상한이 보장되지 않는다. 약한 변화는 늦게 잡히고, 그동안 변화 이후의 촬영이 기준에 섞여 검정력이 더 줄어든다.

시간 초과는 단계가 보고하는 논리 tick으로 판정한다. 하네스는 실제 실행 시간을 재지 않고 멈춘 단계를 중단하지 않는다. 실제 시간 제한(단계별 watchdog, 결정 기록이 없는 건은 하류에서 재검수)은 설계서 §4.5의 운용 요구사항이다.

커널은 감사 원장이 연결되지 않은 상태에서 commit을 실패로 처리한다. 원장 없이 만든 커널은 정상 촬영도 `REVIEW`·`SAFE_HALT`로 끝난다. 본 벤치마크와 세 시나리오의 10,200건 판정은 전부 사슬에 commit됐고, 감사기가 같은 사슬을 독립적으로 다시 만들어 head가 일치함을 확인했다.

## 범위 밖

- 실제 낱알 영상에서의 분할·OCR·임베딩 성능, ePillID·식약처 자료 평가.
- 실제 DUR 규칙 코드로 만든 규칙표. 규칙표에 없는 임상 지식의 누락은 전수 대조가 다루지 않는다.
- 각인까지 같은 갤러리 밖 품목의 탐지. 재고 대사 같은 비전 밖 통제가 맡는다.
- 라벨 없는 선행 drift 감시, 단계별 watchdog과 반출 인터록(설계 요구사항으로만 있다).
- 격리 환경 재실행과 감사자 서명.

## 해시

| 항목 | SHA-256 |
| --- | --- |
| 입력 잠금(고정 파일 6개) | `fbe963feab5b289c8602dd4275a832082460c0d0e33db38cf501156497e06b3b` |
| 실행 근거 본문 `evidenceSha256` | `f6f97805febfa9fb28799ff370df438e8a3fc75e7b6e1c74a4f4f131d69d9a0d` |
| 감사 결과 본문 `evidenceSha256` | `8385b8c797f7d0ec0fd8d67e8332f16c7cbb8bd2db7acc26175c64594da52dfb` |
