# CHANGELOG — GlycemicNIMargin-Kor

## [2026-05-17]

### 수행 내용
- 당뇨 RCT 비열등성(NI) 마진·표본수 설계 계산기 MVP "GlycemicNIMargin-Kor" 빌드.
- 5개 핵심 기능 구현:
  1. NI 마진 정당화 엔진 (fixed-margin M2 / synthesis 95-95, ICH E10 문단 자동작성)
  2. MMRM 기반 탈락보정 표본수 계산 (AR1/unstructured 공분산, MAR 보정, 검정력 곡선)
  3. 공동 1차 endpoint 다중성 처리 (Hochberg/gatekeeping/Bonferroni, 이변량 정규 공동검정력)
  4. 탈락 시나리오 시뮬레이터 (탈락률×패턴 검정력 히트맵)
  5. 규제 제출용 통계 섹션 문서 생성 (국문/영문)
- CLI(`main.py`), Streamlit UI(`app.py`), 순수 계산 모듈(`core.py`) 3계층 분리.
- endpoint별 마진 프리셋 라이브러리(`data/margin_presets.json`) 작성 — HbA1c/FPG/CGM-TIR/중증저혈당률.

### 주요 결정 사항
- **계산 로직 분리**: core.py를 순수 함수로 분리해 Streamlit 미설치 환경에서도
  CLI(`main.py`)로 검증 가능하게 함. statsmodels 의존 금지 요구에 따라 표본수는
  closed-form, 공동검정력은 scipy multivariate_normal(또는 Monte-Carlo)로 직접 구현.
- **graceful degradation**: scipy 미설치 시 `norm_ppf`는 Acklam 유리근사,
  공동검정력은 numpy Monte-Carlo로 대체. scipy 대비 1e-6 이내 일치 확인.
- **탈락 민감도 기준 표본수**: MMRM 효율 보정 후 축소된 n이 아닌 단일시점
  계획 표본수를 기준으로 평가하도록 결정 — 보정된 n 위에 탈락을 다시 얹으면
  검정력이 비현실적으로 낮게 나오기 때문. 검수 중 발견·수정.
- **의학적 안전성**: "참고용·연구용, 생물통계학자 검토 필수" 면책을 core 상수로
  두고 README·CLI·앱 출력 전체에 노출.

### 변경된 파일
- `core.py` — 신규. NI 마진/MMRM 표본수/다중성/탈락 시뮬레이션 순수 함수
- `app.py` — 신규. Streamlit 5탭 UI
- `main.py` — 신규. argparse CLI (--help/--demo/--margin-fixed/--samplesize)
- `data/margin_presets.json` — 신규. endpoint 마진 프리셋 + 출처 문헌
- `README.md` — 신규. 목적/실행법/검수체크리스트/출처
- `QA.md` — 신규. 검수 로그 (PASS, 개선 2건 반영)

### 재현 방법
1. 디렉토리 생성: `2026-05-17-1-glycemic-ni-margin-kor/` 및 하위 `data/`
2. `data/margin_presets.json` 작성 (endpoint별 SD/마진/상관/출처)
3. `core.py` 작성 — 순수 계산 함수, numpy/scipy만 의존
4. `main.py` (CLI), `app.py` (Streamlit) 작성
5. 검수: `ast.parse` 3개 파일, `json.load`, `python3 main.py --help/--demo`
6. `README.md`, `QA.md`, `CHANGELOG.md` 작성
7. 실행: `python3 main.py --demo` 또는 `streamlit run app.py`
