# QA Report — MASHTrialPulse

검수 일자: 2026-04-26
빌드 위치: `/Users/sangjoonpark/2026 metabolic daily idea/projects/2026-04-26-3-mash-trial-pulse/`

## 검수 결과 요약 — 8/8 PASS

| # | 항목 | 결과 |
|---|------|------|
| 1 | 모든 .py 파일 syntax 통과 (`ast.parse`) | PASS |
| 2 | `python3 main.py --help` → usage 출력 | PASS |
| 3 | `python3 main.py --offline --date 2026-04-26 --format md --output output/digest.md` exit 0 | PASS |
| 4 | `python3 main.py --offline --date 2026-04-26 --format html --output output/digest.html` HTML 출력 | PASS |
| 5 | digest에 한국어 요약 + 분류 태그 + 영향 약물 모두 포함 | PASS |
| 6 | mock JSON 8개 모두 로드 성공 | PASS |
| 7 | differ inline assertion (`new_trial` 감지) | PASS |
| 8 | 디스클레이머가 README와 digest 모두에 포함 | PASS |

## 상세 로그

### 1. Syntax check

8개 .py 파일 모두 OK:
- `main.py`
- `mtpulse/__init__.py`
- `mtpulse/vocab.py`
- `mtpulse/snapshot.py`
- `mtpulse/differ.py`
- `mtpulse/classifier.py`
- `mtpulse/summarizer.py`
- `mtpulse/digest.py`

### 2. CLI usage

```
$ python3 main.py --help
usage: mashtrialpulse [-h] [--offline] [--date DATE] [--output OUTPUT]
                      [--format {md,html}] [--self-check]
```

### 3. Markdown digest

```
$ python3 main.py --offline --date 2026-04-26 --format md --output output/digest.md
[ok] digest -> output/digest.md (md)
[ok] events: 31
[ok] sources loaded: 8 synthetic JSON files
exit=0
```

### 4. HTML digest

```
$ python3 main.py --offline --date 2026-04-26 --format html --output output/digest.html
[ok] digest -> output/digest.html (html)
[ok] events: 31
[ok] sources loaded: 8 synthetic JSON files
exit=0
```

### 5. Digest 콘텐츠 점검

`output/digest.md` (8444 bytes) 점검:
- 디스클레이머 포함 (`연구·교육 목적`)
- 한국어 요약 동사 종결 패턴 (`보고함`, `게시됨`, `공시`)
- 분류 태그 블록 (`[safety`, `[efficacy`, `[regulatory`, `[pipeline`)
- "영향 약물" 라인 존재
- resmetirom / FDA / AASLD 섹션 모두 등장

`output/digest.html` 점검:
- `<!doctype html>` 정상
- 디스클레이머 포함
- `class='tag ...'` span 존재
- 영향 약물 메타 라인 존재
- resmetirom 등장

### 6. Mock JSON 로드

8개 파일 모두 OK:
- `data/aasld_abstracts_2026.json`
- `data/ctg_snapshot_2026-04-25.json`
- `data/ctg_snapshot_2026-04-26.json`
- `data/ema_epar_2026-04-26.json`
- `data/fda_news_2026-04-25.json`
- `data/fda_news_2026-04-26.json`
- `data/ir_filings_2026-04-26.json`
- `data/pmda_news_2026-04-26.json`

### 7. Differ self-check

```
$ python3 main.py --self-check
[self-check] differ.new_trial detection: OK
```

`mtpulse/differ.py` 의 `_self_check_new_trial_detection()` 가
어제 snapshot에 없던 `NCT-B` 가 오늘 snapshot에 있을 때
`new_trial` 이벤트를 정확히 반환함을 검증.

### 8. 디스클레이머 위치

- `README.md` — 상단 "디스클레이머" 섹션
- `output/digest.md` — `> Disclaimer:` blockquote
- `output/digest.html` — `<p class='disclaimer'>` 블록

## 검출된 diff event 분포 (2026-04-26)

총 31개 이벤트:
- CTG diff: 9건 (신규 trial 2건, phase change 1건, status change 2건, results posted 2건, primary completion change 2건, AE term 추가 1건 등)
- FDA news 신규: 2건 (resmetirom 정식 승인 전환, denifanstat 안전성 신호 검토)
- EMA: 2건 (CHMP 긍정 의견, GLP-1 PRAC 안전성 신호)
- PMDA: 1건 (survodutide Sakigake-equivalent designation)
- IR / 8-K: 5건
- AASLD abstract: 7건
- (잔여는 새/제거 trial, 다양한 diff 조합)

## 의도 부합 점검

- 사용자 요청 5개 핵심 기능 모두 구현 (vocab 50+, CTG diff, FDA/EMA/PMDA mock, sponsor IR + 8-K, 변화 발생 시에만 한국어 + 태그 + 영향 약물 digest).
- 외부 네트워크 호출 없음. `urllib`, `requests` 등 임포트 부재. CLI에 `--offline` 가드 + warning 메시지 모두 존재.
- 외부 LLM 미사용. summarizer는 dict→포맷 문자열의 rule-based 템플릿만 사용.
- 표준 라이브러리만 사용 (`json`, `datetime`, `pathlib`, `argparse`, `html`, 그리고 `differ` 모듈 내 `difflib` 가능성 — 실제 코드는 dict diff로 충분).
- 디스클레이머 README + digest 모두 포함.

## 재현 방법

```bash
cd "projects/2026-04-26-3-mash-trial-pulse"
python3 main.py --self-check
python3 main.py --offline --date 2026-04-26 --format md  --output output/digest.md
python3 main.py --offline --date 2026-04-26 --format html --output output/digest.html
```
