# QA 검수 로그 — MASLDTrialReadQC-Kor

- 검수일: 2026-05-19
- 검수 환경: Python 3.9.6 (macOS / darwin), pandas 2.3.3, numpy 2.0.2,
  scipy 1.13.1, scikit-learn 1.6.1, matplotlib 3.9.4, streamlit 1.50.0
- 빌드 경로: `projects/2026-05-19-3-masld-trial-read-qc-kor/`

## 검수 항목 및 결과

### 1. 모든 .py 파일 구문 검증 (`ast.parse`)
- ✅ `app.py` — 구문 OK
- ✅ `analysis.py` — 구문 OK
- ✅ `data/generate_synthetic.py` — 구문 OK

### 2. 합성 데이터 생성 (`data/generate_synthetic.py`, streamlit 없이)
- ✅ 정상 실행. streamlit import 없이 pandas/numpy만으로 동작.
- ✅ 생성 결과: `sites.csv` 8행, `measurements.csv` 640행, `biopsy.csv` 320행.
- ✅ 삽입 시그널 콘솔 출력 확인: DRIFT_READER=R03, BIAS_SITE=S07, LOWQ_SITE=S05.

### 3. 생성된 CSV pandas 로드 테스트
- ✅ `measurements.csv` — shape (640, 18) 로드 OK
- ✅ `biopsy.csv` — shape (320, 9) 로드 OK
- ✅ `sites.csv` — shape (8, 4) 로드 OK

### 4. analysis 모듈 streamlit 비의존 import
- ✅ `import analysis` 후 `sys.modules`에 `streamlit` 미포함 확인.
- ✅ streamlit import는 `app.py`에만 존재 (정적 검사로 확인).

### 5. analysis.py CLI 실행 (RuntimeWarning을 에러로 승격)
- ✅ `python3 -W error::RuntimeWarning analysis.py` 완료 — RuntimeWarning 없음.
- ⚠️→✅ 초기 빌드 시 numpy 2.x 의 작은 행렬 matmul 에서 거짓 RuntimeWarning
  (divide by zero / overflow / invalid) 발생. X·beta 모두 finite·정상값임을
  별도 디버그로 확인 후, `np.errstate(...)` 컨텍스트로 억제하고 `X.dot(beta)`
  사용하도록 수정 → 재실행 시 경고 소멸. (재시도 1회로 해결)

### 6. 삽입 시그널 탐지 정확도
- ✅ reader drift: `R03` 단독 플래그 (robust z = 10.27, 동료 reader 미플래그).
- ✅ site bias: `S07` calibration outlier 플래그 (평균잔차 +2.83 kPa, z=+5.8).
  - 참고: `S03`도 outlier로 동시 탐지(z=-2.9). 합성 데이터의 자연 변동에 의한
    것으로, case-mix 보정 funnel이 양방향 이탈을 모두 잡는 정상 동작.
- ✅ low-quality site: `S05` 최악 QC 실패율 (94%) 로 식별.
- ✅ biopsy κ drift: EARLY 0.61 → LATE 0.37 (Δ0.24 저하) 경고 발생.
- ✅ implausible 변화: 11건 플래그 (삽입 4환자 + 자연 발생 비단조 패턴 포함).

### 7. Streamlit 앱 기동 스모크 테스트
- ✅ `streamlit run app.py` (headless) 기동 — root HTTP 200.
- ✅ `/_stcore/health` 엔드포인트 `ok` 응답.
- ✅ 기동 로그에 error/traceback/exception 없음.

### 8. reader_drift 방법론 개선 (빌드 중 수정 기록)
- ⚠️→✅ 초기 절대 임계값(0.025 kPa/주) 방식은 삽입 시그널 R03(기울기 0.0244)을
  미탐지. 정상 reader는 진성 치료효과로 모두 음의 기울기, R03만 양수인 점을
  활용해 **reader 간 상대 편차(중앙값/MAD 기반 robust z)** 방식으로 변경.
  → R03만 정확히 단독 플래그됨. (재시도 1회로 해결)

## 종합 결과

✅ **전체 통과** — 8개 검수 항목 모두 통과. 빌드 중 발견된 2개 이슈
(numpy matmul 거짓 경고, reader drift 미탐지)는 각각 1회 재시도로 해결됨.
실패(FAILED) 항목 없음.

## 알려진 제한 / 참고

- 모든 데이터는 합성이며 실제 임상시험 데이터가 아니다.
- 품질 기준·자연 변화율 임계값(`analysis.QC_THRESHOLDS`)은 예시·교육용이며
  최신 가이드라인으로 검증해야 한다.
- ICC는 ICC(2,1) 근사 구현, 가중 κ는 선형 가중 Cohen's κ 직접 구현.
  엄밀한 임상 적용 시 검증된 통계 패키지와 교차 확인 권장.
- case-mix 보정은 age·bmi·week 기반 단순 OLS이며, 실제 분석에서는 baseline
  fibrosis stage 등 추가 공변량 보정이 필요할 수 있다.
