# QA 검수 로그 — MASHGraveyardReframe-Kor

- 날짜: 2026-06-05
- 환경: macOS (darwin 25.5.0), Python 3.9.6
- 정책: 외부 네트워크 호출 없음 / 전역 패키지 설치 없음 / main.py는 표준 라이브러리만으로 동작

## 검수 항목 및 결과

| # | 검수 항목 | 명령 | 결과 |
|---|-----------|------|------|
| 1 | main.py 구문 파싱 | `python3 -c "import ast; ast.parse(open('main.py').read())"` | ✅ OK |
| 2 | app.py 구문 파싱 | `python3 -c "import ast; ast.parse(open('app.py').read())"` | ✅ OK |
| 3 | 데이터 로드 | `python3 -c "import json; json.load(open('data/mash_failures.json'))"` | ✅ drugs:13 |
| 4 | `--help` 동작 | `python3 main.py --help` | ✅ 옵션 7종 정상 출력 |
| 5 | ranked 출력 | `python3 main.py --top 8` | ✅ 8개 ranked + 면책 |
| 6 | 요약 집계 | `python3 main.py --summary` | ✅ target_invalid 3 / trial_killed 7 / safety_killed 1 |
| 7 | 약물 상세+귀속 | `python3 main.py --drug selonsertib --attribution` | ✅ 귀속 bar + audit + 재설계 가설 |
| 8 | 재포지셔닝 | `python3 main.py --reposition` | ✅ elafibranor→PBC 등 매핑 |
| 9 | 목록 | `python3 main.py --list` | ✅ 13종 |
| 10 | 기본(인자 없음) | `python3 main.py` | ✅ rc=0, 요약+top5 |
| 11 | 잘못된 약물 처리 | `python3 main.py --drug zzz` | ✅ rc=1 + 사용가능 id 안내 |
| 12 | streamlit 없이 main 동작 | core 로직 표준 라이브러리만 사용 확인 | ✅ argparse/json/os/sys 만 import |
| 13 | app.py import | `python3 -c "import app"` | ✅ rc=0 (streamlit 설치되어 있어 정상; 미설치 시 graceful exit 경로 구현) |

## 핵심 로직 검증

- **귀속 엔진**: `p_target_invalid / p_trial_killed / p_safety_killed`를 정규화하고
  우세 원인 판정, 차이 < 0.12면 `mixed(...)`로 표기. selonsertib는 63/37로 target_invalid,
  obeticholic_acid는 safety 우세로 safety_killed 판정 확인.
- **재설계 분기**: target_invalid → 폐기+인접표적 / trial_killed → 재설계 레버 / safety → 차세대 분자.
  분기별로 다른 가설이 생성됨을 selonsertib(폐기) vs elafibranor(NIT endpoint) vs OCA(차세대 FXR)로 확인.
- **ranking**: `plausibility*0.6 + impact*0.4`. trial_killed(impact 1.0)가 상위, target_invalid(0.2)는 하위.
  lanifibranor(0.790) > simtuzumab류(폐기) 순서 확인.
- **최소 재설계 초안**: placebo_response ≥17%일 때 N 확대 + run-in 권고 로직 동작 확인.

## 제약 준수

- ✅ 외부 네트워크/API 호출 없음 (전부 로컬 JSON)
- ✅ 전역 패키지 설치 없음 (main.py 표준 라이브러리만; networkx/streamlit은 app.py에서 import만)
- ✅ 의학적 안전성 디스클레이머: README, data `_meta.disclaimer`, 모든 ranked/summary/reposition 출력 말미, app.py 상단 warning에 포함
- ✅ 빌드 폴더 외 다른 폴더 미변경

## 재시도 기록

- 재시도 없음. 모든 검수 1회 통과.

## 종합 판정: ✅ PASS
