# QA.md — CumulMetaDelta-Kor 검수 로그

- 일시: 2026-06-04
- 환경: macOS (darwin 25.5.0), Python 3.9.6, numpy 2.0.2 설치되어 있으나 **사용 안 함**(순수 stdlib `math`만 사용).
- 실행 디렉터리:
  `/Users/sangjoonpark/claude daily project/2026 metabolic daily idea/projects/2026-06-04-1-cumul-meta-delta-kor`
- 모든 명령은 위 디렉터리에서 실행. **네트워크/외부 API/전역 pip 설치 없음.**

> 참고용/연구용 (research/reference only — NOT for clinical decisions). 합성 데이터.

---

## CHECK 1 — `python3 -c "import ast; ast.parse(open('main.py').read())"`

**결과: PASS**

```
AST OK
```

`main.py` 문법 파싱 성공.

---

## CHECK 2 — `python3 main.py --help`

**결과: PASS** (usage + flags 정상 출력)

```
usage: main.py [-h] [--data DATA] [--demo] [--list] [--class DRUG_CLASS]
               [--outcome OUTCOME]

CumulMetaDelta-Kor (큐뮬메타델타워치코어): cumulative meta-analysis of diabetes
drug-class RCTs with threshold-transition alerts. FULLY OFFLINE on synthetic
data. 참고용/연구용 (research/reference only — NOT for clinical decisions).
Data are SYNTHETIC demo trials.

optional arguments:
  -h, --help          show this help message and exit
  --data DATA         path to trials JSON (default: data/trials.json next to main.py)
  --demo              stream the synthetic trial sequence and print transition alerts (default mode)
  --list              list all available (drug_class x outcome) cells
  --class DRUG_CLASS  drug class for single-cell query (e.g. SGLT2i, GLP-1RA, finerenone)
  --outcome OUTCOME   outcome for single-cell query (e.g. HHF, MACE, renal_composite, mortality)

Examples:
  python3 main.py                         # default: stream demo + transition alerts
  python3 main.py --demo                  # same as default
  python3 main.py --list                  # list all (class x outcome) cells
  python3 main.py --class SGLT2i --outcome HHF   # one cell: full cumulative forest + alerts
```

---

## CHECK 3 — 데모/단일셀 실행 + 전이 알림 실제 발생 확인

**결과: PASS** — 수학이 상태변화(state change)를 실제로 만들어냄을 입증.

### 3a. `python3 main.py --demo`
- 모든 셀을 연도순으로 스트리밍하며 **전이 이벤트만** 출력.
- **총 13건의 transition alert 발생** (significance cross/lost, heterogeneity shift, GRADE up/down, prediction interval 포함).
- 대표 발췌:
```
■ GLP-1RA × MACE
   🔔 2016 T021: SIGNIFICANCE LOST → pooled 95% CI now INCLUDES null (RR/HR 0.83, CI 0.34-2.05)
   🔔 2016 T021: HETEROGENEITY SHIFT → I^2 band low → moderate (I^2 28%, tau^2 0.0036)
   🔔 2019 T023: SIGNIFICANCE CROSS → pooled 95% CI now EXCLUDES null (RR/HR 0.88, CI 0.80-0.97, benefit)
■ SGLT2i × HHF
   🔔 2020 T004: SIGNIFICANCE CROSS → pooled 95% CI now EXCLUDES null (RR/HR 0.73, CI 0.62-0.88, benefit)
■ SGLT2i × mortality
   🔔 2019 T071: HETEROGENEITY SHIFT → I^2 band low → considerable (I^2 87%, tau^2 0.0584)
...
Total transition alerts fired: 13
```

### 3b. `python3 main.py --class SGLT2i --outcome HHF`  (단일 셀 — 명확한 전이 입증)

이 셀은 T003까지 풀링 95% CI가 null(1.0)을 포함(비유의)하다가, **T004(MOCK-DAPA-HF-T2D, 2020) 추가 시
풀링 95% CI가 0.62–0.88로 null을 새로 제외 → SIGNIFICANCE CROSS 전이 발생**. (수학적 상태변화 증거)

```
[CELL] SGLT2i × HHF   (k=5 trials)
 CUMULATIVE FOREST (each row = pooled estimate after adding that trial)
 2015 T001   MOCK-EMPA-OUT (synthetic)      0.82 (0.60-1.12)  0.82 [0.60–1.12]
 2017 T002   MOCK-CANVAS (synthetic)        0.78 (0.58-1.05)  0.80 [0.20–3.22]
 2019 T003   MOCK-DECLARE (synthetic)       0.73 (0.61-0.88)  0.76 [0.56–1.03]    <- still includes null
 2020 T004   MOCK-DAPA-HF-T2D (synthetic)   0.70 (0.59-0.83) *0.73 [0.62–0.88]    <- CROSSES null (significant)
 2022 T005   MOCK-EMPEROR-T2D (synthetic)   0.69 (0.58-0.82) *0.72 [0.63–0.82]

 FINAL POOLED (random-effects, DL + HKSJ):
   RR/HR = 0.722   95% CI 0.63–0.82   (significant)
   I^2 = 0% (low)   tau^2 = 0.0000   Q = 1.30
   95% prediction interval = 0.63–0.82  (excludes null)
   Egger's p = 0.000   |   GRADE certainty = Moderate

 🔔 TRANSITION ALERT LOG (delta events only):
   • after T004 (MOCK-DAPA-HF-T2D (synthetic), 2020): SIGNIFICANCE CROSS → pooled 95% CI now EXCLUDES null (RR/HR 0.73, CI 0.62-0.88, benefit)
       ↳ source-trace: synthetic-NEJM-like | n=4744 | effect=0.70 (0.59-0.83)
   • after T004 ...: PREDICTION INTERVAL → now EXCLUDES null (95% PI 0.62-0.88)
```

**→ BEFORE(T003): pooled CI 0.56–1.03 (null 포함, NS) / AFTER(T004): pooled CI 0.62–0.88 (null 제외, 유의).
상태 전이가 수학적으로 실제 발생함을 확인.**

### 3c. 메타분석 수학 정합성 sanity check
```
동일 trial 2개 (0.75, 0.60-0.94):  pooled RE=0.750  I2=0.000  tau2=0.0000  Q=0.0000   (정상)
상반 trial (0.5 vs 2.0):           pooled RE=1.000  I2=0.987   Q=75.48              (정상: 극단 이질성)
```

---

## CHECK 4 — `python3 -c "import ast; ast.parse(open('app.py').read())"` (선택 app.py)

**결과: PASS**

```
app.py AST OK
```

`app.py`(선택 Streamlit UI) 문법 파싱 성공. 검수 대상은 어디까지나 CLI(`main.py`)이며,
app.py는 main.py의 엔진을 재사용할 뿐 새로운 수학을 추가하지 않음(streamlit 미설치 환경에서도 CLI는 정상 동작).

---

## 수정 이력 (검수 중 1회 수정)

- **Egger's test 발동 조건을 k≥3 → k≥4 로 상향.** k=3(df=1)에서는 정규근사 p가 degenerate/비신뢰하여
  GRADE 등급을 flip-flop 시키는 잡음 알림이 발생했음. k≥4 요구로 출판편향 신호를 더 보수적으로 만들고,
  핵심 전이(significance cross / prediction interval)가 깔끔히 드러나도록 함. 재검수 결과 모든 CHECK 통과.

## 종합

| CHECK | 내용 | 결과 |
|-------|------|------|
| 1 | `ast.parse(main.py)` | **PASS** |
| 2 | `main.py --help` | **PASS** |
| 3 | demo + 단일셀 전이 알림 실제 발생 | **PASS** (13 alerts; SGLT2i×HHF significance cross 입증) |
| 4 | `ast.parse(app.py)` | **PASS** |

실패 항목 없음.
