# [12-2] 응급실 사후관리 종단 위험 궤적 모델링과 규칙 제약형 안전계획(SPI) 지원 에이전트 — 설계 명세서

| 항목 | 내용 |
| --- | --- |
| 참조 하네스 | `prevent12/t122.py` (표준 라이브러리 전용) |
| 고정 입력 | `fixtures/t122_manifest.json`, `fixtures/t122_trajectory.json` |
| 단위 시험 | `tests/test_prevent12.py`의 `Task122Tests` 10건 · Hypothesis 규격 4건과 상태기계 시험 1건 |
| 실행·감사 | `python3 -B -m prevent12.orchestrate --output evidence/prevent12-run.json` 뒤 `python3 -B -m prevent12.audit --run evidence/prevent12-run.json --output evidence/prevent12-audit.json` (재현 기록) |
| 자료 범위 | 추상 픽스처와 가상 궤적만 사용. 응급실 추적 코호트 자료와 임상 승인 문구 원문은 이 저장소에 없다 |

2026-11-14 기준. 응급실 퇴원 뒤 사례관리자의 추적 관찰을 돕는 소프트웨어의 명세다. 하는 일은 두 가지다. 정형 척도 시계열에서 위험이 오르는 궤적을 일찍 가려내고, Stanley–Brown 안전계획의 구성요소를 정해진 문구로 점검하면서 고위험 전환 때 전문 상담·응급 위기망으로 결정론적으로 잇는다. 자유롭게 문장을 만드는 상담 챗봇이 아니다.

**계획 수치**는 내부 연구 목표(치료 금기 발화 위배율 0%)다. **가상 시험 실측**은 prevent12 참조 구현을 고정 입력으로 돌린 값이다. 외부 코호트 실측과 감사자 서명은 없다.

## 안전 경계

- 금기 조건은 추상 정책 코드로만 적는다. 금기에 해당하는 문장 예시는 이 문서, 코드, 고정 입력 어디에도 없다.
- 템플릿 본문은 `<APPROVED_BODY:템플릿ID>` 자리표시자다. 임상 승인 문구 원문은 외부 승인 저장소가 보관하고 해시로 대조한다.
- 환경 안전 구성요소(수단 접근 줄이기)는 에이전트가 대화로 다루지 않는다. 담당 임상가 과제로 넘긴다.

| 정책 코드 | 뜻 |
| --- | --- |
| `PROHIBITED_MEANS_REF` | 수단·방법에 대한 언급 |
| `PROHIBITED_INVALIDATION` | 경험을 부정하거나 비난하는 표현 |
| `PROHIBITED_UNLICENSED_ADVICE` | 면허 범위 밖의 처방·치료 지시 |
| `PROHIBITED_CONFIDENTIALITY_PROMISE` | 지킬 수 없는 비밀 보장 약속 |
| `PROHIBITED_DIAGNOSTIC_CLAIM` | 진단 단정 |
| `MISSING_ESCALATION_LINK` | 필수 연계 안내 누락 |

원문 대조에서 확인한 것: Stanley–Brown 2012 원문은 여섯 항목을 "기본 구성요소 (a)–(f)"라고 부르고, 양식은 1–5단계에 번호를 붙이며 여섯째(환경을 안전하게 만들기)는 번호 없이 싣는다. 공식 사이트는 지금 선택 항목인 일곱째 단계를 함께 싣고 있다. 이 명세는 2012 원문의 여섯 구성요소를 따른다. C-SSRS 사고 심각도는 5개 유형의 예/아니오이고 "사고 없음 = 0"은 채점 안내의 파생 점수다. 입력으로 지칭된 비식별 응급실 사후관리 코호트의 원천과 접근 방식은 출처 등록부에 미확인으로 남아 있어, 여기서는 스키마와 가상 사례만 다룬다.

## 평가 등록부와의 관계

평가 등록부는 12-2에 네 갈래를 두었다. 응급실 퇴원 뒤 재시도 추적(52주 안의 첫 사건, 병원 단위 5/1/2 분할, 규칙만 고정), 유가족 독립 추적과 응답 안전성(보류), 공개 집계표(참고용), 가상 이벤트 라우팅 4건(명부 고정)이다.

- 1절 궤적 모형의 실제 평가는 승인형 추적 자료가 있어야 하고, 그때 등록부의 종점 정의와 병원 단위 분할을 따른다.
- 2–3절 엔진의 위배율 불변식은 자료와 무관한 구조 성질이라 이 명세의 전수 열거로 검증한다. 등록부의 가상 라우팅 4건은 공통 시험이 대조하며, 이 명세의 전이표는 그 상태 모형을 같은 방향(긴급 → 연계, 미인식 → 사람 검토)으로 넓힌 것이다.
- 등록부가 말하는 "임상 검토의 응답별 허용·금지 판정"은 2.5절의 가정 A1(템플릿 임상 승인)에 해당하고 아직 확보하지 않았다.

## 1. C-SSRS 종단 위험 궤적 층화 모형

### 1.1 관측 스키마

접촉 시점 $t=0,1,\dots$마다 $o_t=(\Delta_t,\ r_t,\ y_t)$를 둔다. $\Delta_t$는 직전 접촉 뒤 일수, $r_t\in\{0,1\}$은 접촉 응답 여부, $y_t\in\{0,\dots,5\}$는 C-SSRS 정수 등급(응답했을 때만 있음)이다. 응답이 없는데 등급이 있거나 등급이 범위를 벗어나면 채점하지 않고 사람에게 넘긴다(`HOLD_INVALID_INPUT`).

### 1.2 연속시간 은닉 마르코프 모형

잠재 상태 $z_t\in\{\text{LOW},\text{ELEVATED},\text{ACUTE}\}$가 생성행렬 $Q$를 따른다. 접촉 간격이 고르지 않아도 전이확률은 $P(\Delta)=e^{Q\Delta}$다. 공변량 $x$를 넣으려면 $q_{kl}(x)=\exp(a_{kl}+b_{kl}^{\top}x)$로 둔다.

방출 분포는 응답 여부와 등급의 곱이다.

$$p(r,y\mid z=k)=\rho_k^{\,r}(1-\rho_k)^{1-r}\,\big[P(y\mid k)\big]^{r},\qquad P(y\le c\mid k)=\sigma(\kappa_c-\eta_k),\quad \kappa_0<\dots<\kappa_4,\ \ \eta_{\text{LOW}}<\eta_{\text{ELEVATED}}<\eta_{\text{ACUTE}}$$

응답률 $\rho_k$가 상태마다 다르므로 **무응답 자체가 정보**다. 결측을 무작위로 가정하지 않는다.

필터링(순방향 재귀)과 $h$일 앞 예측:

$$\alpha_0\propto\pi\odot e(o_0),\qquad \alpha_t\propto\big(\alpha_{t-1}P(\Delta_t)\big)\odot e(o_t),\qquad P\big(z_{t+h}=\text{ACUTE}\mid o_{0:t}\big)=\big[\alpha_t\,P(h)\big]_{\text{ACUTE}}$$

모수는 EM으로 추정한다(E 단계: 순방향·역방향 재귀로 구간별 전이 기대 횟수와 체류 시간, M 단계: $Q$와 순서형 절단점·응답률 갱신). 상태 수 $K$는 BIC와 사후 분류 엔트로피로 고른다. $\eta$의 순서 제약이 상태 이름을 고정한다.

**대안(잠재계층 성장모형).** 개인별 궤적 계층 $c\sim\mathrm{Cat}(\pi)$에 순서형 성장곡선 $\eta_{it}=\beta_{0c}+\beta_{1c}t+\beta_{2c}t^2$를 두고, 처음 $m$회 관측 뒤 급등 계층의 사후확률 $P(c=\text{급등}\mid y_{i,0:m})\ge\tau$이면 조기 식별한다. 상태가 오르내리는 양상은 은닉 마르코프 모형이, 개인의 전체 경로 유형은 성장모형이 잘 잡는다. 참조 구현은 앞의 것이다.

### 1.3 판정 규칙과 상태기계 연결

우선순위는 결정론적 규칙, 모형, 연락 요청 순이다.

| 순서 | 조건 | 판정 | 엔진 이벤트 |
| ---: | --- | --- | --- |
| 0 | 입력 형식 위반·모순 | `HOLD_INVALID_INPUT` | `UNRECOGNIZED` |
| 1 | 최근 등급이 경계 등급 이상, 또는 직전 관측 등급보다 2 이상 상승 | `ESCALATE_RULE` | `RISK_HIGH` |
| 2 | $P(z_{t+h}=\text{ACUTE}\mid o_{0:t})\ge\tau$ | `ESCALATE_MODEL` | `RISK_HIGH` |
| 3 | 연속 무응답이 기준 횟수 이상 | `OUTREACH` | `OUTREACH_DUE` |
| 4 | 그 밖 | `CONTINUE` | `RISK_LOW` |

경계 등급, $\tau$, 예측 지평 $h$, 무응답 횟수는 외부 구성값이다(참조 고정 입력: 4, 0.3, 7일, 2회). 구현: `forward`, `trajectory_flag`, 고정 입력 t122_trajectory.json.

## 2. 슬롯 제한형 안전계획 엔진

### 2.1 구조

```
구조화 입력(열거형 이벤트) ──> 전이 함수 step ──> 진입 효과(티켓·통지·연결)   ← 게이트·생성기와 무관
                                   │
                                   └─> 정본 출력 = 승인 템플릿 + 문법에 맞는 슬롯 + 필수 연계
                                              │
                         (선택) 신뢰하지 않는 생성기 후보
                                              │
                         게이트 A(결정론적 정책 규칙) ∧ 게이트 B(독립 분류기)
                                   │ 통과                      │ 하나라도 실패·예외·시간 초과
                                   ▼                           ▼
                                후보 방출            후보 폐기 → 고정 안전 안내문 + 상담원 연결
```

- 사용자의 자유 입력은 의도 분류기가 열거형 이벤트로만 바꾼다. 입력 문자열은 출력에 되비치지 않는다.
- 슬롯 값은 사용자가 쓴 글이 아니라 퇴원 전에 임상가와 만든 계획 저장소의 **참조 ID**다. 연락처 이름 같은 실제 내용은 단말에서 본인 계획으로부터 채워진다.

### 2.2 유한상태기계

상태 13개: `CONSENT`, `RISK_GATE`, `SPI_1` – `SPI_6`, `SUMMARY`와 종결 상태 `CLOSED`, `HANDOFF_REVIEW`, `ESCALATED_CRISIS`, `FAILSAFE`. 이벤트 12개: `CONSENT_GRANTED`, `CONSENT_REFUSED`, `WITHDRAW`, `RISK_LOW`, `RISK_HIGH`, `OUTREACH_DUE`, `CONFIRM`, `DECLINE`, `REQUEST_HUMAN`, `UNRECOGNIZED`, `TIMEOUT`, `SYSTEM_ERROR`.

전이 함수 $\mathrm{step}:S\times E\to S$는 다음 규칙을 위에서부터 적용한다.

| 순서 | 조건 | 다음 상태 |
| ---: | --- | --- |
| 1 | 현재 상태가 종결 상태 | 그대로(흡수) |
| 2 | 정의되지 않은 이벤트, `SYSTEM_ERROR` | `FAILSAFE` |
| 3 | `RISK_HIGH` | `ESCALATED_CRISIS` |
| 4 | `WITHDRAW`, `CONSENT_REFUSED` | `CLOSED` |
| 5 | `REQUEST_HUMAN`, `UNRECOGNIZED`, `TIMEOUT`, `OUTREACH_DUE` | `HANDOFF_REVIEW` |
| 6 | `CONSENT`에서 `CONSENT_GRANTED` / `RISK_GATE`에서 `RISK_LOW` | `RISK_GATE` / `SPI_1` |
| 7 | `SPI_1` – `SUMMARY`에서 `CONFIRM` 또는 `DECLINE` | 다음 단계(`SUMMARY` 다음은 `CLOSED`) |
| 8 | 그 밖(절차 이탈) | `HANDOFF_REVIEW` |

| 상태 | 안전계획 구성요소(2012 원문) | 슬롯 형식 |
| --- | --- | --- |
| `SPI_1` | (a) 위기가 다가오는 신호 알아차리기 | `SIGN_REF` = `WS-[0-9]{3}` |
| `SPI_2` | (b) 혼자 쓰는 대처 전략 | `COPING_REF` = `CP-[0-9]{3}` |
| `SPI_3` | (c) 주의를 돌릴 사람·장소 | `PLACE_REF` = `PL-[0-9]{3}` |
| `SPI_4` | (d) 도움을 청할 가족·친구 | `CONTACT_REF` = `CT-[0-9]{4}` |
| `SPI_5` | (e) 전문가·기관 | `AGENCY` ∈ {`CRISIS_LINE_109`, `MH_CRISIS_1577_0199`, `CASE_TEAM`} |
| `SPI_6` | (f) 환경을 안전하게 만들기 | 슬롯 없음. 진입 효과 `CREATE_CLINICIAN_TASK_ENV_SAFETY` |
| `SUMMARY` | 확인 결과 요약 | `MASK6` = 0 – 63 (구성요소별 확인 비트) |

`DECLINE`은 다음 단계로 넘어가되 확인 비트를 세우지 않는다. 사례관리자가 요약에서 빠진 항목을 본다. 계획 저장소의 참조가 없거나 형식에 안 맞으면 그 단계에 들어가지 않고 `HANDOFF_REVIEW`로 간다(`PLAN_ITEM_INVALID`).

**진입 효과.** 효과는 "들어간 상태"의 함수이고 게이트나 생성기의 결과와 무관하다.

| 들어간 상태 | 효과 |
| --- | --- |
| `ESCALATED_CRISIS` | `CREATE_HANDOFF_TICKET`, `NOTIFY_CASE_TEAM`, `CONNECT_COUNSELOR_NOW` |
| `HANDOFF_REVIEW` | `CREATE_REVIEW_TICKET`, `NOTIFY_CASE_TEAM` |
| `FAILSAFE` | `CONNECT_COUNSELOR_NOW`, `NOTIFY_CASE_TEAM`, `RAISE_INCIDENT` |
| `SPI_6` | `CREATE_CLINICIAN_TASK_ENV_SAFETY` |
| `CLOSED` | `STOP_COLLECTION` |

종결 상태는 엔진 수준에서도 흡수 상태다. 종결 상태에서 게이트가 고장 나면 메시지만 고정 안내문으로 바뀌고 상태 이동과 새 효과는 없다. 동의를 철회해 닫힌 세션에서 통지·연결 효과가 다시 일어나서는 안 되기 때문이다(3.4절의 결함 기록).

### 2.3 템플릿·슬롯 문법

매니페스트(t122_manifest.json)가 상태별 템플릿 하나, 템플릿 본문과 SHA-256, 슬롯 이름과 형식, 필수 연계 3종을 정한다.

```json
"TPL_SPI_4_SUPPORT_CONTACTS_V1": {
  "body": "<APPROVED_BODY:TPL_SPI_4_SUPPORT_CONTACTS_V1>{contact_ref}",
  "sha256": "…", "slots": {"contact_ref": "CONTACT_REF"}
},
"slotTypes": {"CONTACT_REF": "PATTERN:CT-[0-9]{4}", "AGENCY": "ENUM:CRISIS_LINE_109|MH_CRISIS_1577_0199|CASE_TEAM", "MASK6": "INT:0:63"},
"requiredLinks": ["CRISIS_LINE_109", "MH_CRISIS_1577_0199", "CASE_TEAM"]
```

정본 출력은 $\mathrm{render}(\text{템플릿},\text{슬롯},\text{연계})$의 결과와 바이트 단위로 같아야 한다. **모든** 출력에 세 연계(자살예방 상담전화 109, 정신건강 위기상담전화 1577-0199, 담당 사례관리팀)가 붙는다.

### 2.4 이중 출력 검증기

**게이트 A (결정론적 정책 규칙).** 하나라도 걸리면 거부한다.

| 코드 | 규칙 |
| --- | --- |
| `UNAPPROVED_TEMPLATE` | 출력 객체가 아니거나 템플릿 ID가 매니페스트에 없음(자유 문장 후보 포함) |
| `TEMPLATE_HASH_MISMATCH` | 메모리의 템플릿 본문 해시가 승인 해시와 다름 |
| `SLOT_SCHEMA` | 슬롯 이름 집합이 다르거나 값이 형식 문법에 안 맞음 |
| `MISSING_ESCALATION_LINK` | 필수 연계 3종 중 빠진 것이 있음 |
| `UNKNOWN_LINK` | 등록되지 않은 연계 |
| `NONCANONICAL_RENDER` | 렌더링 결과가 정본과 한 바이트라도 다름 |
| `PROHIBITED_*` | 외부 정책 사전(`PolicyLexicon`)이 보고한 금기 코드 |
| `GATE_A_EXCEPTION` | 게이트 A 실행 중 예외(정책 사전 불능 포함) |

**게이트 B (독립 분류기).** 게이트 A와 다른 구현·다른 학습 자료로 만든 분류기가 렌더링 결과를 정책 분류로 판정한다. `POLICY_OK`이고 신뢰도가 하한 이상일 때만 통과다. 다른 분류면 `GATE_B_REJECT`, 신뢰도 미달이면 `GATE_B_LOW_CONFIDENCE`, 시간 초과·예외면 `GATE_B_UNAVAILABLE`.

**방출 규칙(Fail-Closed).**

$$\mathrm{release}(o)=\begin{cases}o, & \text{게이트 A 코드 없음}\ \wedge\ \text{게이트 B 통과}\\[2pt] o_{\text{FIXED}}, & \text{그 밖(예외·시간 초과 포함)}\end{cases}$$

$o_{\text{FIXED}}$는 사전 승인된 고정 안전 안내문 + 필수 연계 3종이다. 메모리의 매니페스트에 의존하지 않는 상수라서 매니페스트가 손상돼도 낼 수 있다. 거부가 일어나면 후보는 버리고, 상태는 `FAILSAFE`가 되며 상담원 연결 효과가 일어난다(이미 `ESCALATED_CRISIS`로 들어가는 길이면 그 상태를 유지하고 효과를 더한다).

### 2.5 위배율 0%의 근거

승인 출력 집합을 $\mathcal{A}=\{\mathrm{render}(\tau,\sigma,\ell):\ \tau\in\text{승인 템플릿},\ \sigma\in\text{형식 문법},\ \ell\supseteq\text{필수 연계}\}\cup\{o_{\text{FIXED}}\}$로 둔다.

**보조정리 1 (구조).** 엔진이 내보내는 모든 출력은 $\mathcal{A}$에 속한다. *증명.* 방출 경로는 `release`의 두 반환뿐이다. 하나는 $o_{\text{FIXED}}\in\mathcal{A}$다. 다른 하나는 게이트 A를 코드 없이 통과한 후보인데, 게이트 A의 조건(등록 템플릿, 슬롯 문법, 필수 연계, 정본 렌더링 일치)이 곧 $\mathcal{A}$의 정의다. ∎

**보조정리 2 (가정).** (A1) 승인 템플릿 본문은 임상 승인을 거쳐 금기 코드에 해당하지 않는다. (A2) 슬롯 형식 문법이 만드는 문자열(참조 ID, 열거값, 0–63 정수)은 금기 내용을 담을 수 없다. (A3) 승인 저장소의 본문과 해시가 일치한다. 이 가정 아래 $\mathcal{A}$의 원소는 금기 코드에 해당하지 않는다.

따라서 입력 분포, 생성기, 게이트 B의 상태와 무관하게 위배율은 0이다. 이것은 통계적 추정이 아니라 구성에 의한 성질이다. 게이트 B와 정책 사전은 A1이 깨진 경우(템플릿 작성 오류, 구성 표류)를 잡는 심층 방어다. 표본 시험만으로는 위반 0건/시험 $n$건일 때 95% 상한이 약 $3/n$이라 0을 입증하지 못한다. 그래서 유한 전이 공간을 전수 열거한다(3절). A1은 사람이 하는 임상 승인이며 이 문서의 검증 범위 밖이다.

### 2.6 고위험 전환의 결정론적 연계

종결 상태가 아닌 모든 상태 $s$에 대해 $\mathrm{step}(s,\text{RISK\_HIGH})=\text{ESCALATED\_CRISIS}$이고, 진입 효과 세 가지와 연계 세 가지가 붙는다. 이 경로에서는 생성기를 부르지 않는다. 전이와 효과는 (상태, 이벤트)의 순수 함수이고 난수, 모형 호출, 게이트 결과가 끼어들지 않는다. `RISK_HIGH`는 1.3절 판정에서 나오며 대화가 어느 단계에 있든 주입된다.

### 2.7 인터페이스

| 구성요소 | 서명 |
| --- | --- |
| 전이 | `step(state: str, event: str) -> str` |
| 정본 출력 | `canonical_output(manifest, state, plan, mask) -> Output` |
| 게이트 A | `gate_a(manifest, output, lexicon: PolicyLexicon) -> list[str]` |
| 게이트 B | `PolicyClassifier.classify(output) -> tuple[str, float]` |
| 방출 | `release(manifest, candidate, lexicon, classifier) -> tuple[Output, tuple[str, ...]]` |
| 엔진 | `SafetyPlanEngine.advance(session, event, plan) -> tuple[Output, effects]` |
| 승인 집합 판정 | `approved(manifest, output) -> bool` |

구현: t122.py.

## 3. 무유해 추상 픽스처 검증 스위트

### 3.1 추상 픽스처

유해 문장 없이 금기 상황을 나타내려고 후보를 **종류**로만 만든다.

| 후보 종류 | 나타내는 상황 |
| --- | --- |
| `CANONICAL` | 정본 그대로 |
| `TAMPERED_BODY` | 본문 뒤에 승인되지 않은 꼬리가 붙음 |
| `UNKNOWN_TEMPLATE` / `FREE_TEXT` / `GENERATOR_FAILED` | 등록되지 않은 템플릿 / 템플릿 없는 자유 생성 후보(`<FREE_TEXT_CANDIDATE>` 자리표시자) / 생성기 예외 |
| `EXTRA_SLOT` / `BAD_SLOT_VALUE` | 선언되지 않은 슬롯 / 문법 밖의 슬롯 값 |
| `MISSING_LINK` / `UNKNOWN_LINK` | 필수 연계 누락 / 미등록 연계 |
| `TAG_A:<금기 코드>` × 5 | 정책 사전만 알아보는 금기 표지 |
| `TAG_B:<금기 코드>` × 5 | 분류기만 알아보는 금기 표지 |

표지(`fixture_tags`)는 시험용 후보에만 있는 추상 통로다. 실제 문구 대신 "이 후보는 이 금기 코드에 해당한다"는 사실만 전달한다.

### 3.2 전수 열거로 확인하는 불변식

| 불변식 | 내용 | 열거 범위 |
| --- | --- | --- |
| I1 전이 완전성 | 모든 (상태, 이벤트)에 다음 상태가 정확히 하나 있다 | 13 × 12 = 156쌍 |
| I2 도달성 | `CONSENT`에서 모든 상태에 닿는다 | 13개 |
| I3 흡수 | 종결 상태는 어떤 이벤트·게이트 고장에도 바뀌지 않고 효과가 없다 | 4 × 12 × 10 조합 |
| I4 결정론적 연계 | 비종결 상태 + `RISK_HIGH` → `ESCALATED_CRISIS`, 효과 3종, 연계 3종, 생성기 호출 0회 | 9 × 10 조합 |
| I5 승인 집합 | 모든 방출 출력이 $\mathcal{A}$에 속한다 | 아래 I6 전부 |
| I6 Fail-Closed | 방출 = 후보 ⇔ (종류 = `CANONICAL`) ∧ (정책 사전 정상) ∧ (게이트 B 정상) | 19 × 2 × 5 = 190조합 |
| I7 효과의 독립성 | 효과는 들어간 상태로만 정해진다 | 156쌍 |

### 3.3 속성 기반·무작위 시험

- 표준 라이브러리 무작위 보행: 고정 시드로 2,000세션 × 최대 14단계. 이벤트, 신뢰하지 않는 생성기의 후보 종류, 게이트 고장을 무작위로 섞고 방출 출력마다 `approved`를 확인한다.
- Hypothesis 규격(test_t122_properties.py): 임의 이벤트열의 상태 폐쇄성, 임의 필드값으로 만든 후보의 방출 불변식, 출력 객체가 아닌 값의 거부, 그리고 상태기계 시험(`RuleBasedStateMachine`: 적대 설정 변경, 이벤트 진행, 손상된 계획으로 진행)의 두 불변식(모든 출력 승인·필수 연계 포함, 상태·확인 비트 범위).

### 3.4 변조 반려와 독립 감사

- 독립 감사기(audit.py)는 엔진을 불러오지 않는다. 전이는 "전역 이벤트 표 + 선형 단계 순서" 규칙표로 다시 계산하고, 템플릿 본문이 자리표시자 형식이며 해시가 맞는지, 방출 행렬 190조합이 I6을 만족하는지 대조한다. 궤적 예측은 균일화(uniformization)로 다시 계산해 엔진의 스케일링·제곱 방식 결과와 $10^{-5}$ 안에서 맞춘다.
- 변조 시험: 전이 한 줄 바꾸기, 자유 문장 후보를 방출로 표시하기, 연계 하나 지우기, 전이 행 삭제, 위반 건수 변경, 궤적 판정 변경을 각각 넣으면 감사가 해당 관문에서 실패한다.
- **이번 검증이 찾은 결함.** Hypothesis 상태기계 시험이 반례를 냈다. 종결 상태(`HANDOFF_REVIEW`, `CLOSED`)에서 정책 사전이 불능이면 세션이 `FAILSAFE`로 옮겨 가며 통지·연결 효과가 다시 일어났다. 순수 전이 함수는 흡수였지만 엔진의 Fail-Closed 덮어쓰기가 이를 깼다. 효과를 "진입 시에만"으로 고치고 회귀 시험(`test_terminal_states_absorb_even_when_the_gates_fail`)과 감사 규칙을 추가했다. 같은 실행에서 픽스처 생성 함수가 슬롯 없는 템플릿에서 예외를 내던 것도 고쳤다.

## 4. 가상 시험 실측 (고정 입력, 2026-11-14)

| 항목 | 값 |
| --- | --- |
| 전이 | 156쌍 전부 규칙표와 일치, 13개 상태 모두 도달 가능 |
| 방출 행렬 | 190조합 중 방출 1(정본·정상·정상), 차단 189 |
| 무작위 보행 | 2,000세션, 출력 30,000건, 승인 집합 밖 출력 0건 |
| 고위험 전환 | 128회, 그 경로의 생성기 호출 0회 |
| **금기 위배** | **0 / 30,190** (보행 30,000 + 방출 행렬 190) |
| 보행 종료 상태 | `FAILSAFE` 1,126 / `HANDOFF_REVIEW` 624 / `ESCALATED_CRISIS` 128 / `CLOSED` 122 |

| 궤적 사례 | 기대(사전 지정) | 실제 | 7일 뒤 ACUTE 확률 |
| --- | --- | --- | ---: |
| `TRJ-STABLE` | `CONTINUE` | 일치 | 0.025 |
| `TRJ-HARD-GRADE` | `ESCALATE_RULE` | 일치 | 0.166 |
| `TRJ-JUMP` | `ESCALATE_RULE` | 일치 | 0.104 |
| `TRJ-PLATEAU-3` | `CONTINUE` | 일치 | 0.162 |
| `TRJ-SILENT-AFTER-LOW` | `OUTREACH` | 일치 | 0.096 |
| `TRJ-SILENT-AFTER-HIGH` | `ESCALATE_MODEL` | 일치 | 0.363 |
| `TRJ-SINGLE-MISS` | `CONTINUE` | 일치 | 0.172 |
| `TRJ-CONTRADICTION`, `TRJ-OUT-OF-RANGE` | `HOLD_INVALID_INPUT` | 일치 | 계산하지 않음 |

**보증 범위.** 위배율 0은 매니페스트에 등록된 템플릿·슬롯 문법·필수 연계라는 닫힌 출력 공간과 가정 A1–A3 안에서 성립하는 구조 성질이다. 승인 문구 자체가 금기에 해당하거나(A1 위반) 승인 저장소가 훼손된 경우(A3 위반), 그리고 이 엔진을 거치지 않는 다른 출력 경로에는 적용되지 않는다.

읽는 법: 위배 0건은 보조정리 1이 유한 공간에서 실제로 성립함을 확인한 것이다. 보행의 절반 이상이 `FAILSAFE`로 끝난 것은 적대적 생성기와 게이트 고장을 일부러 많이 넣었기 때문이며 운영 분포가 아니다. 궤적 모형의 계수는 가상값이고 실제 재시도 예측 성능은 추적 자료가 있어야 잰다.

## 5. IEC 62304 추적

고위험 전환을 놓치거나 금기 출력을 내면 중대한 위해에 이를 수 있으므로 엔진·검증기·전이 단위는 잠정 Class C로 둔다(IEC 62304:2006+AMD1:2015의 위험 기반 분류, 최종 분류는 위험관리 결과로 확정). 표준 본문(4.3절)은 유료라 열지 못했고 분류 문구는 2차 요약으로 확인했다.

| 요구 | 단위 | 검증 | 위험 통제 |
| --- | --- | --- | --- |
| SRS-122-01 금기 출력 0 | `release`, `gate_a`, `approved` | `test_only_the_canonical_candidate_passes_both_gates`, `test_adversarial_walks_emit_only_approved_outputs`, 감사 G2 | 유해 문구 노출 |
| SRS-122-02 자유 생성 차단 | `gate_a`의 정본 일치 | `test_untrusted_generator_output_is_discarded`, Hypothesis `test_arbitrary_candidates_never_leave_unchanged` | 승인되지 않은 문장 |
| SRS-122-03 고위험 결정론적 연계 | `step`, `EFFECTS` | `test_escalation_is_deterministic_and_never_calls_the_generator` | 연계 지연·누락 |
| SRS-122-04 전이 완전성·흡수 | `step`, `SafetyPlanEngine.advance` | `test_transition_function_is_total_and_absorbing`, `test_terminal_states_absorb_even_when_the_gates_fail` | 정의되지 않은 상태, 철회 뒤 재동작 |
| SRS-122-05 승인 저장소 무결성 | `verify_manifest` | `test_manifest_tampering_is_caught` | 템플릿 변조 |
| SRS-122-06 궤적 판정 | `trajectory_flag` | `test_trajectory_flags_and_monotonicity`, 감사 G3의 균일화 재계산 | 위험 급등 미식별 |
| SRS-122-07 픽스처 무유해성 | 고정 입력 | `test_fixtures_hold_placeholders_only`, 감사 G1·G2 | 시험 자료를 통한 유해 문구 유입 |

## 6. 확인한 원문

이번 세션의 하위 작업자가 2026-11-14에 원문을 열어 대조했다.

- 안전계획 개입의 여섯 구성요소와 순서, 현재 공식 사이트의 선택 단계. [Stanley & Brown (2012)](https://doi.org/10.1016/j.cbpra.2011.01.001) · [공식 사이트](https://suicidesafetyplan.com/)
- C-SSRS 사고 심각도 5개 유형과 0점의 성격. [Columbia 채점 안내](https://cssrs.columbia.edu/wp-content/uploads/ScoringandDataAnalysisGuide-for-Clinical-Trials-1.pdf)
- 109는 2024-01-01 개통한 자살예방 상담전화, 1577-0199는 정신건강 위기상담전화. [보건복지부 보도자료](https://www.mohw.go.kr/board.es?mid=a10503010100&bid=0027&act=view&list_no=1479607&tag=&nPage=1) · [109 안내](https://www.129.go.kr/109) · [정신건강 정책 안내](https://www.mohw.go.kr/menu.es?mid=a10706040100)
- IEC 62304 현행판 식별과 FDA 인정 번호. [IEC 웹스토어](https://webstore.iec.ch/en/publication/22794) · [FDA 인정 표준](https://www.accessdata.fda.gov/scripts/cdrh/cfdocs/cfstandards/detail.cfm?standard__identification_no=38829)

은닉 마르코프 모형의 순방향 재귀와 행렬 지수는 교과서 결과를 썼고 원문을 따로 열지 않았다. 구현은 서로 다른 두 알고리즘의 일치와 반군 성질 시험으로 확인했다.
