# QA — CholangioDuctReact v0

빌드 일자: 2026-05-10
빌더: auto-builder agent (step2)

## 검수 항목 (4/4 PASS)

### [PASS] 1. 모든 .py 파일 AST 구문 체크
명령:
```
python3 -c "import ast, pathlib; [ast.parse(p.read_text()) for p in pathlib.Path('.').rglob('*.py')]"
```
결과: 8개 파일 모두 SyntaxError 없음.
- main.py
- lib/__init__.py
- lib/synth_liver.py
- lib/registration.py
- lib/portal_detect.py
- lib/dr_classify.py
- lib/fibrosis_overlay.py
- lib/stats.py

### [PASS] 2. lib 모듈 import-able
명령:
```
cd projects/2026-05-10-3-cholangio-duct-react && \
python3 -c "from lib import synth_liver, registration, portal_detect, dr_classify, fibrosis_overlay, stats"
```
결과: ImportError 없음. 핵심 함수 (`make_demo_cohort`, `register_pair`,
`detect_portal_tracts`, `classify_dr_structures`, `detect_bridges`,
`one_way_anova`) 모두 노출.

### [PASS] 3. 합성 데이터 생성기 1회 실행
- `synth_liver.make_demo_cohort(seed=42)` → 9 슬라이드 (3그룹 × 3마우스).
- 각 슬라이드 H&E (512,512,3), CK19/SOX9/Sirius (512,512), GT portal_tracts=6.
- portal_detect: control 슬라이드에서 약 5개 검출 (GT 6 vs 검출 5 — 합리적).
- dr_classify: control은 DR ~2, CDAHFD는 더 많음.
- ANOVA (DR per portal): F=12.385, p=0.0074 → 그룹간 유의 차이 재현.
  - control mean ~1.02
  - CDAHFD mean ~3.22
  - CDAHFD+resmetirom mean ~1.82

### [PASS] 4. main.py import 단계 무결성
- `streamlit` 1.50, `pandas` 2.3, `numpy` 2.0, `scipy` 1.13 설치 확인.
- `plotly` 미설치 — main.py 내 try/except로 감싸서 실행은 가능 (plotly 부분만 비활성).
- `importlib`로 main.py 로드 시 ImportError 없음.

## 알려진 한계 / Notes
- Sirius Red 양성 면적은 control 0%, CDAHFD ~3%로 그룹간 분별 가능하지만,
  `_draw_disk` 덮어쓰기 방식으로 인해 max value가 0.35로 제한됨. 시연 목적
  충족, 추후 max-merge로 개선 권장.
- portal tract 검출 휴리스틱은 lumen-based라 sinusoid 등 false positive
  가능. MVP 한계로 README에 명시.
- DR Type 분류는 룰베이스. 사용자 학습 ResNet small은 이번 MVP에서 미포함
  (오프라인 + pip install 금지 제약).
- registration은 rigid translation만. affine은 미구현.

## 외부 네트워크 / API
- 호출 0건.
- pip install 시도 0건. requirements.txt만 작성.

## 디렉토리 침범
- `projects/2026-05-10-3-cholangio-duct-react/` 외부 파일 변경 없음.

## 결과
**4/4 PASS** — 빌드 성공.
