# [12-3] 사전 동의 기반 온디바이스 비식별 생활리듬 이상 탐지와 사회적 고립 조기 복지 연계 — 설계 명세서

| 항목 | 내용 |
| --- | --- |
| 참조 하네스 | `prevent12/t123.py` (표준 라이브러리 전용) · 신경망 인터페이스 `torch_ref/t123_model.py` |
| 고정 입력 | `fixtures/t123_scenarios.json` |
| 단위 시험 | `tests/test_prevent12.py`의 `Task123Tests` 9건 · Hypothesis 규격 8건 · PyTorch 시험 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` (재현 기록) |
| 자료 범위 | 코드가 만든 합성 일별 계열만 사용. StudentLife·WESAD 원자료와 지역 통계 원표는 이 저장소에 없다 |

2026-11-14 기준. 당사자가 미리 명시적으로 동의하고 언제든 철회할 수 있는 환경에서, 단말 안에서 되돌릴 수 없게 집계한 일별 통계만으로 장기 사회적 고립 전환을 가려내고 지역사회 복지사의 안부 확인 순서를 정하는 연구 모형의 명세다. 위치 추적이나 통신 내용 감시 도구가 아니다.

**계획 수치**는 내부 연구 목표(장기 고립 전환 탐지 정밀도 85% 이상)다. **가상 시험 실측**은 prevent12 참조 구현을 고정 합성 입력으로 돌린 값이다. 외부 코호트 실측과 감사자 서명은 없다.

## 프라이버시·비감시 경계

- 원시 좌표, 통화 음성, 메시지 본문, 상대방 식별자, 기기 식별자는 수집·전송하지 않는다. 참조 코드에는 좌표나 본문을 받는 함수가 없다.
- 단말 밖으로 나가는 것은 허용 목록에 있는 수치 필드뿐이다. 그 밖의 모든 키는 거부한다.
- 동의는 범위별 사전 동의다. 기본값은 "수집 안 함"이다. 철회하면 즉시 수집을 멈추고 단말 키를 폐기한다.
- 지역 통계는 사전확률을 보정하는 데만 쓴다. 지역 집계로 개인을 지목하지 않는다.

자료 적합성(원문 대조): StudentLife는 Dartmouth 학생 48명의 10주 자료이고 설문에 PHQ-9, 지각된 스트레스, UCLA 외로움 척도가 있다. WESAD는 15명의 실험실 자료다(가슴 장치 700 Hz, 손목 장치 BVP 64 Hz·EDA 4 Hz·체온 4 Hz·가속도 32 Hz, 기준·스트레스·즐거움 조건). 두 자료 모두 "장기 고립 전환"의 정답을 직접 주지 않는다. 출처 등록부대로 주관적 외로움, 단기 스트레스, 1인 가구는 서로 다른 종점이다.

## 평가 등록부와의 관계

평가 등록부는 장기 고립 전환의 정답을 독립 조사 자료의 0–4점 사회 지표로 정했다(기준 조사에서 2점 이상이던 사람이 이후 두 연속 조사에서 1점 이하, 규칙만 고정). 그 자료와 결합할 수 있는 수동 센서는 확인되지 않았다. WESAD는 참가자 9/3/3 구획이 명부로 고정돼 있다.

- 과제 명세가 지정한 StudentLife는 등록부의 정답 자료가 아니다. 이 명세에서 StudentLife는 특징 계산과 피험자 독립 분할 절차를 개발하는 자료이고, 정밀도 종점은 등록부 정답이 붙은 자료에서 판정한다.
- WESAD의 최종 평가는 등록부의 9/3/3 구획을 따른다. 3.1절의 한 명씩 빼는 교차검증은 학습·검증 구획 12명 안에서 계수를 고르는 데만 쓴다.
- 2.5절과 3.2절의 인증 절차는 정답의 출처와 무관하게 적용된다. 등록부 정답이 "두 연속 조사에서 지속"으로 정의되므로 2.3절의 지속성 기준(21일)은 그 정의에 맞춰 다시 정해야 하는 구성값이다.

## 1. 프라이버시 내재화 온디바이스 특징 추출

### 1.1 처리 흐름

```
센서 ──> 휘발성 버퍼(RAM, 일 단위) ──> 일별 집계 특징 ──┬──> 단말 내 탐지 모형(잡음 없는 로컬 특징)
                    │ 집계 직후 삭제                      ├──> [C2] 경보 토큰 공유 관문 (동의 + 허용 목록)
                                                          └──> [C3] 연구 집계 관문 (동의 + 허용 목록 + 차분프라이버시 예산)
```

탐지는 단말 안에서 잡음 없는 특징으로 한다. 차분프라이버시 잡음은 연구용 집계에만 건다. 개인별 벡터에 로컬 잡음을 걸면 탐지에 쓸 수 없을 만큼 흐려지기 때문이다(1.4절 수치).

### 1.2 특징의 수학적 정의

**일주기 리듬(시간당 활동량 $x_i$, $i=1..N$, 하루 $p=24$개, 전체 평균 $\bar x$, 시각별 평균 $\bar x_h$).**

$$\mathrm{IS}=\frac{N\sum_{h=1}^{p}(\bar x_h-\bar x)^2}{p\sum_{i=1}^{N}(x_i-\bar x)^2},\qquad \mathrm{IV}=\frac{N\sum_{i=2}^{N}(x_i-x_{i-1})^2}{(N-1)\sum_{i=1}^{N}(x_i-\bar x)^2},\qquad \mathrm{RA}=\frac{M10-L5}{M10+L5}$$

IS는 날마다 같은 패턴이 되풀이될수록 1에 가깝고, IV는 하루 안에서 활동이 잘게 끊길수록 크다(백색잡음에서 약 2). RA의 $M10$과 $L5$는 평균 24시간 프로파일에서 **연속** 10시간과 연속 5시간 창의 최대·최소 평균으로 정의했다(원형 창). 문헌에는 상위 10개·하위 5개 시간 평균으로 정의한 것도 있으므로 다른 연구와 비교할 때 정의를 맞춘다.

**이동 분산(상대 변위만 사용).** 단말은 하루 동안의 위치를 그날의 체류시간 가중 중심에 대한 거리 $r_k$로만 바꾼다. 기준 원점은 날마다 버린다. 거리 고리 $0,50),[50,200),[200,1000),[1000,5000),[5000,\infty)$ m의 체류 비율 $p_j$로

$$H_{\text{ring}}=-\frac{\sum_{j=1}^{J}p_j\ln p_j}{\ln J},\qquad V_{\text{disp}}=\ln\Big(\frac{\sum_k d_k\,r_k^{2}}{\sum_k d_k}+1\Big)$$

위치 군집의 엔트로피와 위·경도 분산의 로그를 쓰는 기존 정의를 바꾼 것이다. 군집(장소의 정체) 대신 중심에서의 거리 고리를 써서 어느 장소인지가 특징에 남지 않는다.

**사회적 상호작용.** 통화·메시지 **이벤트 수**만 센다(0–50으로 절단). 본문과 상대방 식별자는 읽지 않는다.

**정서 부하 지수(HRV/EDA).** 박동 간격에서 이상 박동(직전 대비 20% 초과 차이, 300–2000 ms 밖)을 뺀 뒤 $\mathrm{RMSSD}=\sqrt{\tfrac{1}{n-1}\sum(\mathrm{IBI}_{i+1}-\mathrm{IBI}_i)^2}$와 SDNN을 구한다. 피부전도는 완만 성분 수준과 반응 횟수(골에서 0.05 µS 이상 솟은 국소 봉우리)를 쓴다. 개인 기저선(중앙값, 척도화한 MAD)에 대한 $z$ 점수로

$$L=\sigma\Big(b+w_1 z(-\ln\mathrm{RMSSD})+w_2 z(\mathrm{HR})+w_3 z(\mathrm{SCL})+w_4 z(\mathrm{SCR\ rate})\Big)$$

계수는 WESAD 학습·검증 구획에서 피험자 한 명씩 빼는 교차검증으로 골라 단말에 싣는다. 참조 구현의 계수는 가상값이다. 실험실 스트레스 과제로 학습한 지수를 일상 자료에 옮길 때 생기는 차이는 따로 검증할 대상이다.

구현: [`interdaily_stability`, `intradaily_variability`, `relative_amplitude`, `displacement_features`, `rmssd`, `scr_count`, `affect_load`.

### 1.3 반출 페이로드 스키마 (허용 목록)

```json
{"schema_version": 1, "consent_token": "CT-0123456789ABCDEF", "day_index": 41, "region_code": "99001",
 "features": {"is": 0.62, "iv": 0.85, "ra": 0.71, "disp_entropy": 0.33, "log_disp_var": 9.4,
              "social_events": 7, "affect_load": 0.41, "wear_fraction": 0.92}}
```

| 규칙 | 내용 | 거부 코드 |
| --- | --- | --- |
| 정확한 키 집합 | 최상위 5개, 특징 8개. 더 있어도 덜 있어도 거부 | `UNKNOWN_KEY`, `MISSING_KEY` |
| 금지 키 | 어느 깊이에서든 키 이름의 단어가 위치·주소·전화·기기 식별자·본문·음성·연락처·주소(URL)·시각 등에 해당하면 거부(밑줄·대소문자 낙타 표기를 풀어 검사) | `FORBIDDEN_KEY` |
| 형식·범위 | 특징은 유한한 수이고 정해진 범위 안. `social_events`는 0–50 정수 | `INVALID:<필드>` |
| 양자화 | 실수 특징은 소수 둘째 자리까지(정보량 상한) | `QUANTIZATION:<필드>` |
| 시간 해상도 | `day_index`는 등록 뒤 상대 일수 정수. 달력 날짜·시각은 싣지 않음 | `INVALID:day_index` |
| 지역 해상도 | `region_code`는 시군구 5자리. 더 잘게 쪼갠 코드는 거부 | `INVALID:region_code` |

구현: `validate_payload`.

### 1.4 로컬 차분프라이버시 집계

| 대상 | 기제 | 식 |
| --- | --- | --- |
| 스칼라 특징 | 절단 뒤 라플라스 | $\tilde v=\mathrm{clip}(v,[l,u])+\mathrm{Lap}\big(\tfrac{u-l}{\varepsilon}\big)$ |
| 특징 벡터 | $L_2$ 절단 뒤 가우시안 | $\tilde{\mathbf v}=\mathbf v\cdot\min(1,\tfrac{C}{\lVert\mathbf v\rVert_2})+\mathcal N(0,\sigma^2I)$, $\ \sigma>\tfrac{2C\sqrt{2\ln(1.25/\delta)}}{\varepsilon}$, $\ 0<\varepsilon<1$ |
| 이진 표지 | 무작위 응답 | 참값을 확률 $\tfrac{e^{\varepsilon}}{1+e^{\varepsilon}}$로 보고, 추정 $\hat\pi=\tfrac{\bar y-(1-p)}{2p-1}$ |

로컬 모형에서는 반지름 $C$인 공 안의 임의의 두 입력이 이웃이므로 민감도가 $2C$다. 가우시안 기제의 조건은 엄격 부등호라서 구현은 경계값에 여유 배수를 곱한다.

누적 손실은 단말의 zCDP 장부가 센다. 라플라스($\varepsilon$-DP)는 $\rho=\varepsilon^2/2$, 가우시안은 $\rho=(2C)^2/(2\sigma^2)$이고 합산한 $\rho$는 $\varepsilon(\delta)=\rho+2\sqrt{\rho\ln(1/\delta)}$로 바꾼다. 예산을 넘는 반출은 거절한다(`PRIVACY_BUDGET_EXHAUSTED`).

구현: `laplace_release`, `gaussian_sigma`, `gaussian_release`, `randomized_response`, `PrivacyLedger`.

### 1.5 동의와 철회

| 범위 | 허용되는 일 |
| --- | --- |
| `ON_DEVICE_INSIGHT` | 단말 안 계산과 본인에게만 보이는 요약 |
| `SHARE_ALERT_WITH_WELFARE` | 탐지 결과 토큰을 지정 복지 창구에 공유 |
| `RESEARCH_AGGREGATE_LDP` | 잡음을 건 집계의 연구 기여 |

범위는 서로 독립이고 하나에 동의해도 다른 범위는 열리지 않는다. 철회는 모든 범위를 닫고 `STOP_SENSING`, `CRYPTO_ERASE_LOCAL_KEYS`, `REQUEST_SERVER_DELETION`을 낸다. 철회한 사람은 명시적으로 다시 등록하기 전에는 어떤 범위도 다시 열 수 없다. 이미 기여한 잡음 집계는 개인과 이어지지 않아 따로 지울 수 없다는 점을 동의 문서에 적는다. 반출 관문은 동의 → 허용 목록 → 프라이버시 예산 순서로 보고 첫 실패 사유를 돌려준다. 구현: `ConsentLedger`, `gate_upload`.

## 2. 개인 기저선 적응형 장기 고립 전환 탐지

### 2.1 개인 기저선 잔차

채널(사회적 상호작용, 이동, 일주기 규칙성)마다 기저 기간(참조 42일)의 요일별 중앙값 $\tilde m_{d}$와 척도화한 중앙절대편차로 표준화한다.

$$\tilde x_t=\frac{x_t-\tilde m_{\mathrm{dow}(t)}}{1.4826\cdot\mathrm{MAD}}$$

요일 효과(주말에 달라지는 활동)가 여기서 빠진다. 착용하지 않은 날은 결측으로 두고 아무 증거로도 쓰지 않는다.

### 2.2 베이지안 온라인 변곡점 탐지 (BOCPD)

실행 길이 $r_t$(마지막 변화 뒤 관측 일수)의 결합확률을 상수 위험 $H=1/\lambda_{cp}$로 갱신한다.

$$P(r_t=r_{t-1}+1,\,x_{1:t})=P(r_{t-1},x_{1:t-1})\,\pi_t^{(r)}\,(1-H),\qquad P(r_t=0,\,x_{1:t})=\sum_{r_{t-1}}P(r_{t-1},x_{1:t-1})\,\pi_t^{(r)}\,H$$

구간 안 관측은 평균·분산을 모르는 정규분포로 두고 Normal–Inverse-Gamma 켤레 사전분포 $(\mu,\kappa,a,b)$를 쓴다. 예측밀도 $\pi_t^{(r)}$는 자유도 $2a$, 위치 $\mu$, 척도 제곱 $b(\kappa+1)/(a\kappa)$인 Student-t다. 관측 $x$를 받으면

$$\mu'=\frac{\kappa\mu+x}{\kappa+1},\quad \kappa'=\kappa+1,\quad a'=a+\tfrac12,\quad b'=b+\frac{\kappa(x-\mu)^2}{2(\kappa+1)}$$

확률이 하한 미만인 실행 길이는 버리고 상한 개수만 유지한다. 마지막 날의 MAP 실행 길이 $\hat r$과 그 구간의 사후 평균 $\hat\mu$가 "언제부터, 얼마나 낮아졌는지"를 준다. 구현: `bocpd_last_segment`.

### 2.3 양성 변동의 분리 (정밀도 우선 규칙 관문)

| 양상 | 무엇으로 가려내는가 | 사유 코드 |
| --- | --- | --- |
| 미착용·방전 | 최근 28일 착용 비율이 0.6 미만이면 판단하지 않는다 | `INSUFFICIENT_OBSERVATION` |
| 변화 없음 | 변화 앞 기저 구간이 28일 미만(실행 길이가 전체 관측에 가까움) | `NO_CHANGE` |
| 단기 질환·휴가 | 내려갔다 돌아오면 실행 길이가 다시 0부터 센다. 21일 미만이면 지속으로 보지 않는다 | `NOT_SUSTAINED` |
| 교대근무 | 일주기 채널만 내려가고 사회적 상호작용 채널은 유지된다. 변곡점을 사회 채널에서 찾으므로 후보가 되지 않거나 점수가 낮다 | 점수 단계 |
| 계절 변화 | 느린 표류는 급격한 수준 이동이 아니다. 후보가 되더라도 구간 평균과 동반 하락이 작다 | 점수 단계 |

규칙 관문을 통과한 대상만 다음 단계에서 점수를 받는다. 통과하지 못하면 점수는 0이고 경보하지 않는다.

### 2.4 다중 스케일 분류기

| 특징 | 뜻 |
| --- | --- |
| `SEG_SOCIAL`, `SEG_MOBILITY`, `SEG_CIRCADIAN` | 마지막 구간($\hat r$일)의 채널별 하락 크기 |
| `JOINT_DECLINE` | 사회·이동 하락 가운데 작은 쪽(둘 다 내려가야 크다) |
| `PERSISTENCE` | $\min(\hat r,60)/60\times$ 사회 채널 하락 |
| `MEAN_7D`, `MEAN_28D`, `MEAN_84D` | 최근 7·28·84일 사회 채널 평균 하락 |

참조 구현은 이 8개 특징의 표준화 로지스틱 회귀다. 신경망 판은 잔차 채널과 착용 마스크를 7·28·84일 인과 합성곱 세 갈래로 읽고 위 변곡점 요약과 합친다(torch_ref/t123_model.py: `MultiScaleClassifier(series (B,C,T), wear (B,T), summary (B,S)) -> logit (B,)`). 착용하지 않은 날의 값은 출력에 영향을 주지 않는다.

### 2.5 정밀도 85% 보장 임계치

정밀도는 양성으로 판정된 것 가운데 참인 비율이라 유병률에 좌우되고, 재현율처럼 한쪽 계층의 순서통계량으로 묶을 수 없다. 그래서 미리 정한 임계치 격자 $\Theta=\{\theta_1,\dots,\theta_m\}$에서 가설검정을 한다.

$$H_{\theta}:\ \mathrm{PPV}(\theta)\le p_0\ (=0.85),\qquad \text{p값}\ =P\big(\mathrm{Bin}(n_\theta,p_0)\ge k_\theta\big)$$

$n_\theta$는 보정 집합에서 점수가 $\theta$ 이상인 수, $k_\theta$는 그 가운데 참 양성 수다. $n_\theta$가 주어지면 $k_\theta\sim\mathrm{Bin}(n_\theta,\mathrm{PPV}(\theta))$이므로 검정은 정확하다. p값이 $\delta/m$ 이하인 임계치만 인증하면(Bonferroni) 인증된 임계치 전부가 동시에 확률 $1-\delta$ 이상으로 $\mathrm{PPV}>p_0$이다. 그 가운데 가장 낮은 것을 고르면 재현율이 가장 크다. 인증된 것이 없으면 자율 경보를 내지 않는다.

- 오류 없이 인증되는 최소 경보 수는 $p_0^{\,n}\le\delta/m$에서 나온다. $m=10$, $\delta=0.05$이면 33건, 임계치 하나만 검정하면 19건이다.
- 임계치를 순서대로 검정하는 고정순서 절차(Learn-then-Test)는 검정력이 더 높지만 순서를 미리 등록해야 한다. 참조 구현은 Bonferroni다.

구현: `precision_threshold`.

## 3. 교차 코호트 검증과 동의·최소수집 감사

### 3.1 피험자 독립 분할 평가

- **StudentLife.** 피험자 단위 묶음 교차검증(48명 → 6겹 × 8명). 겹마다 학습 피험자 안에서 다시 피험자를 떼어 임계치 보정에 쓴다. 한 피험자의 날들이 학습·보정·시험에 나뉘어 들어가지 않는다.
- **WESAD.** 정서 부하 지수의 최종 평가는 등록부가 고정한 참가자 9/3/3 구획을 쓴다. 계수 선택은 학습·검증 12명 안에서 피험자 한 명씩 빼는 교차검증으로 한다.
- **자료 사이.** 두 자료 사이에는 특징 정의와 학습된 계수만 넘어간다. 피험자를 잇지 않는다.
- **계수 단위.** 경보는 대상당 대기 기간을 둔 에피소드로 세고, 정답 전환 구간과 겹치면 참으로 본다. 구간 추정은 피험자 단위 군집 부트스트랩으로 한다.
- **표본 요구량.** 인증에는 오류 없는 경보가 적어도 19건(격자 10개면 33건) 필요하다. 48명 자료의 피험자 단위 에피소드로는 모자랄 수 있으므로 인·기간 단위 음성 창과 실제 기저선에 전환 양상을 주입한 반합성 평가를 함께 쓴다. 이 평가는 계획 항목이고 실행하지 않았다.

### 3.2 거시 복지통계 사전확률의 베이지안 보정

보정 집합의 유병률 $\pi_0$와 배치 지역의 유병률 $\pi$가 다르면 같은 임계치의 정밀도가 달라진다. 특징의 조건부 분포가 같다는 가정(라벨 이동) 아래

$$\mathrm{PPV}(\theta;\pi)=\frac{\pi\,\mathrm{TPR}(\theta)}{\pi\,\mathrm{TPR}(\theta)+(1-\pi)\,\mathrm{FPR}(\theta)},\qquad \mathrm{PPV}\ge p_0\iff\frac{\mathrm{TPR}}{\mathrm{FPR}}\ \ge\ \frac{p_0}{1-p_0}\cdot\frac{1-\pi}{\pi}$$

개별 점수는 $p'(x)=\dfrac{p(x)\,\pi/\pi_0}{p(x)\,\pi/\pi_0+(1-p(x))\,(1-\pi)/(1-\pi_0)}$로 고친다.

인증은 보수적으로 한다. 보정 집합에서 $\mathrm{TPR}$의 Clopper–Pearson 하한 $\mathrm{TPR}_L$과 $\mathrm{FPR}$의 상한 $\mathrm{FPR}_U$(각 수준 $\delta/2$)를 구해 $\mathrm{PPV}_L(\pi)=\pi\mathrm{TPR}_L/(\pi\mathrm{TPR}_L+(1-\pi)\mathrm{FPR}_U)\ge p_0$일 때만 그 유병률에서 인증한다. 오경보가 0건이어도 $\mathrm{FPR}_U=1-(\delta/2)^{1/n_-}$이므로, 낮은 유병률에서 인증하려면 음성 표본이 $n_-\ \ge\ \ln(\delta/2)\big/\ln\!\big(1-\tfrac{\pi\,\mathrm{TPR}_L(1-p_0)}{p_0(1-\pi)}\big)$만큼 있어야 한다.

| 유병률 $\pi$ | 필요한 우도비 $\mathrm{TPR}/\mathrm{FPR}$ | 오경보 0건일 때 필요한 음성 수($\mathrm{TPR}_L=0.932$) |
| ---: | ---: | ---: |
| 0.25 | 17.0 | 66 |
| 0.10 | 51.0 | 200 |
| 0.05 | 107.7 | 425 |
| 0.02 | 277.7 | 1,097 |

지역 통계는 사전분포로 넣는다. 시군구 집계(위험군 추정 수 $n_r$, 인구 $N_r$)로 $\pi_r\sim\mathrm{Beta}\big(1+\mathrm{round}(s\,n_r/N_r),\ 1+s-\mathrm{round}(s\,n_r/N_r)\big)$를 두고, 의사 관측 수 $s$로 거시 통계의 영향력을 묶는다. 인증에는 이 분포의 하위 $\delta$ 분위수 $\pi_{r,\delta}$에서의 $\mathrm{PPV}_L$을 쓴다. 1인 가구 비율 같은 지표를 고립 유병률로 옮기는 관계식은 따로 추정해 등록해야 하는 외부 구성이다. 구현: `prior_shift_table`, `ppv_at_prior`, `prior_shift_posterior`, `required_likelihood_ratio`, `required_negatives`, `region_prior`, `beta_quantile_int`.

### 3.3 PII 유입 차단 스키마 검증 시험

고정 페이로드 13건(t123_scenarios.json)의 기대 판정과 사유를 먼저 정하고 구현과 대조한다.

| 사례 | 넣은 것 | 기대 |
| --- | --- | --- |
| `PAY-VALID` | 정상 페이로드 | `ACCEPT` |
| `PAY-RAW-COORD`, `PAY-CAMEL-TRACE` | 좌표·궤적 이름의 키(밑줄·낙타 표기) | `FORBIDDEN_KEY` |
| `PAY-MESSAGE-BODY` | 본문 이름의 키와 자리표시자 | `FORBIDDEN_KEY` |
| `PAY-DEVICE-ID`, `PAY-NESTED-CONTACT` | 기기 식별자, 중첩된 연락처 해시 | `FORBIDDEN_KEY` |
| `PAY-UNLISTED`, `PAY-MISSING` | 목록에 없는 키, 빠진 키 | `UNKNOWN_KEY`, `MISSING_KEY` |
| `PAY-STRING-FEATURE`, `PAY-OUT-OF-RANGE` | 문자열 특징, 범위 밖 값 | `INVALID:…` |
| `PAY-FINE-TIME`, `PAY-REGION-FINE` | 하루보다 잘게 쪼갠 시간, 시군구보다 잘게 쪼갠 지역 | `INVALID:…` |
| `PAY-PRECISION` | 소수 다섯째 자리까지의 값 | `QUANTIZATION:is` |

```python
def test_payload_allow_list(self):
    for item in self.cfg["payloads"]:
        reasons = t123.validate_payload(item["payload"])
        self.assertEqual("REJECT" if reasons else "ACCEPT", item["expect"], item["id"])
        self.assertEqual((reasons or ["NONE"])[0], item["reason"], item["id"])
```

Hypothesis 규격(test_t123_properties.py)은 다음을 임의 입력으로 확인한다: 받아들여진 페이로드는 정확히 허용된 모양이다, 어떤 키를 더해도 거부된다, 금지 단어가 밑줄·낙타·대문자 표기 어디에 섞여도 원인으로 지목된다, 범위 밖이거나 정밀도가 넘치는 값은 거부된다, 동의·취소·철회·반출을 임의로 섞은 순서에서 반출은 그 범위가 살아 있을 때만 통과한다, 절단이 반출값의 크기를 묶는다, 인증된 임계치는 정확 검정을 만족한다. 독립 감사기는 금지 단어 목록을 쓰지 않고 "정확한 키 집합" 방식의 별도 검사로 같은 13건을 다시 판정한다.

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

합성 코호트는 7개 시나리오(안정, 단기 질환, 교대근무, 계절 표류, 미착용, 급격한 고립 전환, 점진적 고립 전환)를 섞은 120일 일별 잔차 계열이다. 학습 200 / 보정 400 / 시험 400명이고 대상이 겹치지 않는다. 이 값은 탐지·인증 절차가 설계대로 움직이는지 본 것이고 실제 고립 탐지 성능이 아니다.

| 항목 | 값 |
| --- | --- |
| 특징 항등식 | 완전 주기 계열 IS = 1, RA = 1, 교대 계열 IV = 4 |
| 인증 임계치 | 격자 10개 전부 통과, 가장 낮은 $\hat\theta$ = 0.5 |
| 보정 집합 | 양성 104 / 음성 296, 참 양성 102, 오경보 0, $\mathrm{TPR}_L$ = 0.932, $\mathrm{FPR}_U$ = 0.0124 |
| **시험 정밀도** | **0.978** (경보 92건 중 90건), 단측 95% 하한 0.933 |
| 시험 재현율 | 0.978 |
| 오경보 내역 | 단기 질환 1건, 교대근무 1건. 안정·계절 표류·미착용 0건 |
| 규칙 관문 | 점수 부여 172 / 관측 부족 17 / 변화 없음 174 / 지속 미달 37 |
| 유병률별 인증 | 0.25 인증(하한 0.962), 0.10 인증(0.893), 0.05 미인증(0.798), 0.02 미인증(0.606) |
| 지역 사전분포 예시 | Beta(11, 191), 하위 5% 분위 0.031에서 하한 0.707 → 미인증 |
| 가우시안 잡음 | $C$ = 1, $\varepsilon$ = 0.5, $\delta=10^{-5}$에서 $\sigma$ = 19.38, 반출 1회당 $\rho$ = 0.0053 |
| 프라이버시 예산 | $\rho$ = 0.5 안에서 93회 반출, 그때 $\varepsilon$ = 5.27, 94번째는 거절 |
| 무작위 응답 | 2만 건, 참 비율 0.197, 추정 0.198 |
| 페이로드·동의 | 13건 판정 전부 기대와 일치, 철회 뒤 반출 거절 |

읽는 법:

- 합성 시나리오는 깨끗하게 갈려서 정밀도가 높다. 실제 자료에서는 이만큼 갈리지 않는다.
- 보정 유병률 0.25에서 인증된 임계치가 유병률 0.05에서는 인증되지 않는다. 오경보가 0건인데도 음성 296명으로는 $\mathrm{FPR}$ 상한을 충분히 낮출 수 없어서다. 지역 사회의 실제 유병률에서 85%를 인증하려면 3.2절 표의 음성 표본이 필요하다.
- 잡음 척도 19.4는 절단 반지름 1보다 훨씬 크다. 개인별 잡음 벡터는 많은 사람을 모아 평균할 때만 쓸모가 있고, 탐지를 단말 안에 둔 이유가 이것이다.

## 5. IEC 62304 추적

이 단위는 복지사의 안부 확인 순서만 정하고 사람이 확인한다. 잠정 Class B로 두고 최종 분류는 위험관리 결과로 확정한다(IEC 62304:2006+AMD1:2015, 표준 본문은 유료라 열지 못했고 분류 문구는 2차 요약으로 확인했다). 개인정보 위험은 별도의 개인정보 영향평가에서 다룬다.

| 요구 | 단위 | 검증 | 위험 통제 |
| --- | --- | --- | --- |
| SRS-123-01 원시 자료 비반출 | `validate_payload` | `test_payload_allow_list`, Hypothesis 4종, 감사 G2 | 위치·내용·식별자 유출 |
| SRS-123-02 사전 동의와 즉시 철회 | `ConsentLedger`, `gate_upload` | `test_consent_is_opt_in_and_withdrawal_is_immediate`, Hypothesis `test_uploads_need_a_live_opt_in_for_that_scope` | 동의 없는 수집·공유 |
| SRS-123-03 프라이버시 예산 | `PrivacyLedger`, 기제 3종 | `test_local_privacy_mechanisms`, 감사 G2 | 누적 노출 |
| SRS-123-04 특징 정의 | 일주기·이동·생체 함수 | `test_rest_activity_identities`, `test_displacement_and_physiology_features` | 잘못 계산된 지표 |
| SRS-123-05 변곡점과 지속성 | `bocpd_last_segment`, `detect_features` | `test_bocpd_locates_a_level_shift_and_ignores_gaps`, `test_benign_patterns_are_not_scored` | 일시 변동에 의한 불필요한 개입 |
| SRS-123-06 정밀도 인증 | `precision_threshold` | `test_precision_certification`, 감사 G3의 유리수 재계산 | 오경보에 의한 행정 부담·낙인 |
| SRS-123-07 유병률 이동 | `ppv_at_prior`, `required_negatives` | `test_prior_shift_algebra`, 감사 G3 | 배치 지역에서의 정밀도 저하 |

## 6. 확인한 원문

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

- IS와 IV의 식, $N$과 $p$의 뜻. RA는 이 원문에 없고 뒤의 논문들이 정의하며 정의가 두 가지로 갈린다. [Witting 외 (1990)](https://pure.knaw.nl/ws/files/490435/14931_285_swaab.pdf) · [nparACT 논문](https://pmc.ncbi.nlm.nih.gov/articles/PMC4890079/)
- BOCPD의 성장·변곡 확률 재귀(알고리즘 1). [Adams & MacKay (2007)](https://arxiv.org/abs/0710.3742)
- 임계치별 p값과 Bonferroni·고정순서 검정에 의한 위험 통제. [Angelopoulos 외, Learn then Test](https://arxiv.org/abs/2110.01052)
- 사전확률이 바뀔 때의 사후확률 보정식. [Saerens, Latinne, Decaestecker (2002)](https://dipot.ulb.ac.be/dspace/bitstream/2013/68391/1/Decaestecker_NeuralComp02.pdf)
- 위치 분산과 정규화 엔트로피의 원래 정의(본 명세는 이를 거리 고리로 바꿨다). [Saeb 외 (2015)](https://pmc.ncbi.nlm.nih.gov/articles/PMC4526997/)
- 가우시안 기제의 조건($c^2>2\ln(1.25/\delta)$, $\varepsilon\in(0,1)$)과 zCDP 변환. [Dwork & Roth](https://www.cis.upenn.edu/~aaroth/Papers/privacybook.pdf) · [Bun & Steinke (2016)](https://arxiv.org/abs/1605.02065)
- WESAD의 피험자 수, 장치, 표본화율, 조건. [UCI WESAD](https://archive.ics.uci.edu/dataset/465/wesad+wearable+stress+and+affect+detection)
- StudentLife의 피험자 수, 기간, 센싱 항목, 설문. 원 사이트가 닫혀 있어 보존 사본으로 읽었다. [StudentLife 원저](https://studentlife.cs.dartmouth.edu/studentlife.pdf)

van Someren 외 (1999)의 RA 원문은 비공개라 초록만 확인했다. Clopper–Pearson 구간과 라플라스·무작위 응답 기제는 교과서 결과를 썼고, 구현은 정확 이항 꼬리 방정식 대입과 모의 실험으로 확인했다.
