# QA 검수 로그 — DMTrialSupplyChain-Kor

검수일: 2026-05-31
환경: Python 3.9.6 / streamlit 1.50.0 / pandas 2.3.3 / numpy 2.0.2 / scipy 1.13.1 (simpy·plotly 미설치 → graceful fallback 경로 검증)

## 1. 구문 검사 (ast.parse)

```
python3 -c "import ast; ast.parse(open('app.py').read())"     → app.py syntax OK ✅
python3 -c "import ast; ast.parse(open('engine.py').read())"  → engine.py syntax OK ✅
```

## 2. 데모 데이터 생성

```
python3 data/generate_demo_data.py
```
결과 ✅:
- lots.csv               shape=(15, 9)
- temperature_log.csv    shape=(480, 6)
- enrollment_log.csv     shape=(145, 5)
- accountability.csv     shape=(59, 7)
- sites.csv              shape=(15, 7)
시드(20260531) 고정 → 재현 가능.

## 3. CSV pandas 로드

```
lots.csv (15, 9) / temperature_log.csv (480, 6) / enrollment_log.csv (145, 5)
accountability.csv (59, 7) / sites.csv (15, 7)
```
전부 정상 로드 ✅.

## 4. requirements import 가능성

- streamlit 1.50.0 ✅ import OK
- pandas 2.3.3 ✅ import OK
- numpy 2.0.2 ✅ import OK
- scipy 1.13.1 ✅ import OK
- simpy ⚠️ 미설치 — requirements.txt에 simpy==4.1.1 명시. 앱은 `_deterministic_distribution` fallback으로 동작 (검증됨).
- plotly ⚠️ 미설치 — requirements.txt에 plotly==5.24.1 명시. 앱은 `HAS_PLOTLY=False` 분기로 streamlit 기본 차트 사용 (검증됨).

전역 설치 금지 준수: pip 전역 설치 수행 안 함, requirements.txt에 명시만.

## 5. 엔진 단위 테스트 (5개 기능)

`import engine; ` 로 데모 데이터 투입 후 각 함수 호출 — 전부 정상 ✅:

1. `forecast_resupply` → (540,7), arm별 주차별 누적 kit 산출 OK
   `resupply_triggers` → (15,9), risk(OK/WATCH/HIGH)·제안 발주량 산출 OK
2. `fefo_allocation` → (15,8), 만료일 오름차순 FEFO rank·allocated/remaining OK
   `expiry_waste` → (12,6), 예상 폐기량·폐기비용(원) 산출 OK
3. `detect_excursions` → (10,10), 누적 일탈시간·USABLE/QUARANTINE 판정 OK
   - strict budget(2h) 적용 시 QUARANTINE 2/10 검출 ✅
   - budget 미상 시 전건 QUARANTINE(보수적) ✅
4. `accountability_balance` → (15,9), balance_gap·MISMATCH alert OK (KR-02 insulin -4 gap → MISMATCH 검출 ✅)
5. `simulate_distribution` (accel=1.5, delay=2, extra_sites=2) → (25,5), 주차별 demand/resupply/backorder·stockout_flag 산출 OK
   - simpy 미설치 → 결정론적 fallback 경로 정상 ✅

## 5b. app.py 모듈 임포트 sanity

```
python3 -c "import app"  → app 모듈 import OK (streamlit no-runtime 경고는 무해)
HAS_PLOTLY=False 확인, DISCLAIMER 문자열 포함 확인 ✅
```
(streamlit run 대신 ast.parse + import + 엔진 단위 테스트로 검증 — 지침 5 준수)

## 제약 준수 점검

- [x] 외부 네트워크/API 호출 없음 (모든 데이터 합성/사용자입력)
- [x] 외부 유료 API 없음
- [x] 전역 패키지 설치 안 함 (requirements.txt 명시만)
- [x] 디스클레이머: app.py UI 상단(st.warning) + README 상단 포함
- [x] 빌드 경로(2026-05-31-1-...) 외 형제 폴더 미접근
- [x] 24h 범위 확장·신규 아이디어 도출 없음

## 종합 판정

✅ PASS — 5개 기능 전부 동작, 데모 데이터로 즉시 시연 가능, 제약 전부 준수.
참고: simpy·plotly는 미설치 상태이나 둘 다 graceful fallback이 검증되어 앱 실행에 지장 없음. 전체 시각화/이산사건 시뮬레이션은 requirements.txt 설치 후 사용 가능.
