# DMAESentinel-Kor QA / 검수 결과

검수 일시: 2026-05-07
검수자: 자동 (자기완결적 MVP 빌드 Agent)

## 1. 자동 구문 / 도움말 점검

| 항목 | 명령 | 결과 |
|---|---|---|
| Python 구문 체크 | `python3 -c "import ast; ast.parse(open('main.py').read())"` | PASS (`SYNTAX_OK`) |
| Top-level 도움말 | `python3 main.py --help` | PASS (5개 서브커맨드 노출: ingest/analyze/digest/psur/alert) |

## 2. 서브커맨드 1회 실행 확인

| 서브커맨드 | 명령 | 결과 | 비고 |
|---|---|---|---|
| ingest | `python3 main.py ingest` | PASS | reports 851행, n_reports total=1995, literature 149, cohort 15 |
| ingest (단일 source) | `python3 main.py ingest --source kaers` | PASS | source 필터 동작 확인 |
| analyze | `python3 main.py analyze --top 8` | PASS | ROR/PRR/IC/EBGM 컬럼 출력, 시그널 `*` 표시 |
| analyze --drug | `python3 main.py analyze --drug semaglutide` | PASS | 약물 한정 |
| digest --korean | `python3 main.py digest --korean` | PASS | 한국어 다이제스트 95줄, cross-discipline 권고 포함 |
| psur | `python3 main.py psur --drug empagliflozin` | PASS | Form 1/2/3, MFDS 코드, 한국 외삽 점수, 디스클레이머 출력 |
| psur (다른 약물) | `python3 main.py psur --drug semaglutide` | PASS | NAION/pancreatitis/biliary/gastric stasis 시그널 평가 |
| alert | `python3 main.py alert` | PASS | 31건 시그널 후보 |
| alert --cross-discipline | `python3 main.py alert --cross-discipline` | PASS | 안과/정신과/혈관외과 등 협진 후보 표시 |

샘플 출력은 `/tmp/qa_analyze.txt`, `/tmp/qa_digest.txt`, `/tmp/qa_psur.txt`, `/tmp/qa_alert.txt`에 캡처되었다(검수 환경 한정).

## 3. 데이터 파일 존재 확인

| 파일 | 크기 | 비고 |
|---|---|---|
| `data/faers_synthetic.csv` | ~13.7 KB | FDA AE 양식 |
| `data/eudra_synthetic.csv` | ~13.7 KB | EU |
| `data/vigibase_synthetic.csv` | ~16.0 KB | WHO global |
| `data/kaers_synthetic.csv` | ~22.2 KB | 한국어 약물명·KFDA 코드 포함 |
| `data/site_cohort_synthetic.csv` | ~0.9 KB | 약물별 BMI/연령/외삽 점수 |
| `data/pubmed_case_reports_synthetic.json` | ~42.5 KB | 149건 case report metadata |
| `data/abstract_synthetic.json` | ~4.7 KB | ADA/EASD/KDA/ATTD abstract |
| `data/meddra_korean_terms.csv` | ~1.0 KB | 16 AE 한국어 매핑 |
| `data/kfda_drug_codes.csv` | ~1.0 KB | 15 약물 한국어 매핑 |
| `dmae_sentinel.db` | (실행 후 생성) | SQLite |

## 4. mock data 로드 테스트

- `ingest` 실행 후 SQLite에서 `reports` 테이블 851행, `literature` 149행, `cohort` 15행 로드 확인.
- `drug_map` 15행, `ae_map` 16행 로드 확인.
- `analyze` 결과에서 disproportionality 양성 시그널이 합리적인 약물–AE 쌍에 분포(canagliflozin↔하지절단, finerenone↔고칼륨혈증, insulin glargine↔중증 저혈당, dapagliflozin↔euglycemic DKA, liraglutide↔갑상선 C세포 종양, semaglutide↔췌장염/NAION, tirzepatide↔gastric stasis 등). prior signal weight가 의도대로 반영됨.

## 5. 디스클레이머 명시 확인

- README.md 8장에 의학적 디스클레이머 명시 ("연구·참고용. 임상 단독 근거 금지. 실제 PSUR 제출 전 식약처/한국의약품안전관리원 검토 필요.")
- `analyze` 출력 헤더에 "참고용·연구용. ROR/PRR/IC/EBGM은 spontaneous report bias가 큼. 임상 단독 근거 금지." 명시
- `digest --korean` 출력에 "본 보고서는 합성 데이터 기반 연구·참고용 산출물입니다. 실제 임상 의사결정에 단독 근거로 사용하지 마십시오." 명시
- `psur` 출력 말미 [디스클레이머] 블록에 "실제 식약처 제출 전 한국의약품안전관리원·약물역학팀 검토" 명시
- `alert` 출력 말미 디스클레이머 명시

## 6. 재현성 점검 (글로벌 워크플로우 규칙 3)

1. 변경 파일 모두 저장 확인: main.py / README.md / QA.md / CHANGELOG.md / data/* — OK
2. 빌드/실행 명령은 README §3, CHANGELOG `재현 방법` 항목 기록 — OK
3. 누락 의존성: 없음(stdlib only)
4. 외부 네트워크 호출: 없음 (`urllib`/`requests` 등 import 없음). 합성 데이터로만 동작.

## 7. 의도 부합 점검

- 5개 핵심 기능(multi-source ETL, disproportionality, 한국 외삽/cohort, cross-discipline alert + 한국어 digest, MFDS PSUR draft) 모두 구현됨.
- 약물 14종(요구 약물 모두 포함) + sitagliptin 추가 = 15종.
- AE 16종(요구 AE 모두 포함, nausea/genital mycotic infection/injection site reaction 추가).
- 사용자 요청 대비 추가 구현:
  - SQLite 기반 ETL 파이프라인 (단순 CSV in-memory를 넘는 재사용성 확보)
  - cross-discipline → 협진과목 매핑 테이블 (안과/정신과/응급/마취/비뇨기/외과/신장내과/내분비외과/소화기내과/혈관외과/재활)
- 미구현/대체:
  - 한국어 PDF report → 한국어 콘솔 텍스트 리포트로 대체 (외부 PDF 라이브러리 제약). README §10에 노트.
  - 정식 MGPS EBGM → IC 기반 근사. README §5/§9에 명시.

## 8. 자동 재시도 로그

- 1회차 실행에서 모든 서브커맨드 PASS. 재시도 없음.

## 결론

- 빌드 상태: PASS
- 모든 서브커맨드 작동 OK
- 의학적 디스클레이머 README + 모든 런타임 출력에 포함
- mock data 9개 파일 + SQLite DB 정상 생성
