# QA / 검증 로그 — LivingSR-Staleness-Kor

검증 일자: 2026-06-04
환경: Python 3 (stdlib only), 완전 오프라인. 외부 패키지·네트워크 사용 안 함.
실행 디렉터리: `2026-06-04-2-living-sr-staleness-kor/`

> ⚠️ 참고용·연구용 (research/reference only, not for clinical decisions). 합성 데모 데이터.

---

## CHECK 1 — 구문 파싱 (ast.parse) → PASS
명령:
```
python3 -c "import ast; ast.parse(open('main.py').read()); print('OK: main.py parses cleanly')"
```
출력:
```
OK: main.py parses cleanly
```

---

## CHECK 2 — `--help` → PASS
명령: `python3 main.py --help`
출력(요약):
```
usage: main.py [-h] [--sr ID] [--gaps] [--demo] [--list]

LivingSR-Staleness-Kor — 항비만 SR 노후화 연구알림 (offline MVP). 참고용·연구용 only.

optional arguments:
  -h, --help  show this help message and exit
  --sr ID     단일 SR의 노후화 평가 (신규 적격 트라이얼 + 신호등 등급)
  --gaps      커버되지 않은 항비만 PICO 조합(갭) 출력
  --demo      데모 모드: 합성 SR 세트 전체 노후화 알림 (기본값)
  --list      데이터에 포함된 SR id 목록 출력
(예시 epilog 포함)
```

---

## CHECK 3 — 기능 동작 (데모 / 단일 SR / 갭) → PASS

### 3a. 데모/기본 모드 `python3 main.py`
- SR-001: 🟡 YELLOW, 신규 적격 트라이얼 **2건** (N=1670) → **ALERT 발생** ✅
- SR-002: 🟡 YELLOW, 신규 적격 트라이얼 **1건** (N=300) → **ALERT 발생** ✅
- SR-003 / SR-004: 🟢 GREEN (검색일이 최신이라 신규 0건)
- 미출판 추적: SR-003, SR-004 미출판 경과일 표시 ✅
- 중복 등록 탐지: **SR-003 ↔ SR-004 PICO 유사도 0.857 → 중복 의심 알림** ✅
- 요약: "SR 4개 중 2개가 노후(staleness alert) 상태입니다." ✅

### 3b. 단일 SR `python3 main.py --sr SR-001`
```
[SR-001] GLP-1 수용체 작용제의 비만 체중감량 효과: 체계적 문헌고찰
  검색일=2022-09-01 (1372일 경과)
  staleness: 🟡 주의 (monitor — 1~2 new eligible trials)
  신규 적격 트라이얼 = 2건 | 신규 참가자 N = 1670
  → ALERT: 검색일 이후 2건의 신규 적격 연구로 인해 이 SR은 노후화되었습니다.
     • NCT-SYN-102 (idx 2024-02-20, N=950, score=0.808)  P/I/C/O=0.75/0.75/1.0/0.833
     • NCT-SYN-101 (idx 2023-06-15, N=720, score=0.762)  P/I/C/O=0.75/0.5/1.0/1.0
```
→ 신규 적격 트라이얼 목록 + 신호등 등급 + 필드별 점수 내역 출력 확인 ✅
(주: 검색일 이전 색인 NCT-SYN-103, 비-RCT NCT-SYN-301, off-topic NCT-SYN-401 은 올바르게 제외됨.)

### 3c. PICO 갭 `python3 main.py --gaps`
```
  [COVERED]  GLP-1 × 비만 × 체중감량              ← SR-001
  [COVERED]  비만대사수술 × T2DM × 당뇨관해          ← SR-002
  [COVERED]  행동중재 × 과체중 × 체중감량             ← SR-003
  [GAP ⚠️ ]  GLP-1 × 근감소성비만 × 근육량          ← 등록/출판된 SR 없음 (research opportunity)
  [GAP ⚠️ ]  비만대사수술 × MASLD × 간섬유화         ← 등록/출판된 SR 없음 (research opportunity)
```
→ 최소 1개(실제 2개) GAP 출력 확인 ✅

---

## CHECK 4 — 데이터 파일 로드 테스트 → PASS
명령:
```
python3 -c "import json; [print('OK',f,'->',len(json.load(open(f,encoding='utf-8'))[k]),'records') for f,k in [('data/srs.json','srs'),('data/trials.json','trials')]]"
```
출력:
```
OK data/srs.json -> 4 records
OK data/trials.json -> 6 records
```

---

## 종합 결과
| 검증 항목 | 결과 |
|---|---|
| 1. ast.parse | PASS |
| 2. --help | PASS |
| 3. 데모 + 단일 SR + 갭 (alert/gap 실제 발생) | PASS |
| 4. data/*.json 로드 | PASS |

모든 검증 통과. staleness ALERT(SR-001/SR-002), 중복 등록(SR-003↔SR-004), PICO GAP(2건) 모두 실제로 발화됨.
재시도(failure retry) 불필요 — 1차 실행에서 전부 통과.

(선택) `app.py` Streamlit UI 는 구문 파싱만 확인(PASS), Streamlit 미설치 환경 대비 graceful exit 구현. 검증 대상 아님.
