# PR Review — drug-diag-api (Codex 대체: GLM)

**PR**: `feat/drug-diag-api` → `main` · **Base**: `origin/main` · **Range**: three-dot 88파일 · +28505 · -19
**Reviewer**: GLM (Z.AI) via `glm -p` — **Codex 대체**
**Verdict**: `needs-attention` · MEDIUM 3 · LOW 4 · `out_of_scope` 0

> **왜 Codex 가 아닌가.** `codex-invoke.js adversarial-review` 가 `classification=exit-nonzero`
> `blocking=true` 로 떨어졌고 원인은 계정 사용량 한도다 — `[codex] Codex error: You've hit your
> usage limit. ... try again at Sep 15th, 2026 10:37 AM.` Phase 0 가 터미널 명령에서
> `MCCP_ALLOW_CODEX_UNAVAILABLE` 을 명시적으로 거부하므로 advisory 로 내려가는 길은 없고,
> 리뷰 없이 내는 대신 다른 모델로 같은 적대 리뷰를 돌렸다. 교차모델이라는 성질은 유지된다.

## 판정 요약

게이트 하네스 자체는 문법·셸 규약·음성 프로브까지 계약대로 실재하나, M5b·M5c 실측 축이
미완주로 종결됐고 실환자 유래 상병코드가 m8 계획서에 평문으로 들어간다 — 머지 전 사람 판단 세 건.

## Findings

| Severity | 파일 | 지적 | 검증 |
|---|---|---|---|
| MEDIUM | `.claude/PRPs/reports/drug-diag-api-m5b-report.md` | M5b·M5c 게이트가 미완주 상태로 마일스톤 종결. M5b 는 `#8` 이 `M5_PROBE_ODD_ID` 부재로 하드 실패해 `#9`·`#0` 미실행, M5c 는 실측 팔 셋이 rc=1. 실환자 화면의 브라우저 실측이 이 PR 안에서 초록으로 돈 적이 없다 | **확인** — 보고서 24행 「게이트 10 (`#0`~`#9`) / 7 초록 · 3 미실행」 · 63행 「[gates] #8 하드 실패 (rc=1)」 |
| MEDIUM | `.claude/plans/drug-diag-api-m8.plan.md` | §GROUND 이 stg 실환자 1건 유래 상병코드 `M766`·`J304`·`E785` 와 실약효분류명 `진해거담제` 를 평문으로 담는다 | **확인** — 계획서 48~50행·154행. backlog `id=m8-ground-real-dxcodes`(분류 B)로 등재된 상태 그대로이며, `plan_hash` 결박으로 이 창에서 정정 불가 |
| MEDIUM | `.gitignore` | 무시 대상 실환자 유래 파일이 이미 다른 원격 브랜치에 push 돼 있다 — gitignore 는 새 커밋만 막고 원격 객체를 정화하지 않는다 | **확인** — `xai-report-reference.html`·`openapi.json` 은 `219c9e1`·`b2f72dd` 에 있고 `origin/feat/ai-insight-report` 에서만 도달 가능하다. **main 과 이 PR 이력에는 없다** |
| LOW | `DESIGN.md` | 143·198행의 「58% 로 내려가 실효 1.6rem 이 9.28px」 가 214행(「58%(1rem = 9.28px)」)과 모순 | **확인 · 흡수** — `16 × 0.58 = 9.28`(1rem), `× 1.6 = 14.85`. 두 행을 14.85px 로 고쳤다 |
| LOW | `.claude/notes` · `plans` · `reviews` | 신규 산출물에 개인 계정 절대경로 리터럴 노출 | **확인 · 부분 흡수** — 현재 내용 2건(`codex-findings-backlog.md:520`·`plan-review-drug-diag-api-m8.md:15`)을 저장소 상대로 내렸다. 나머지 4건은 이미 앞으로 고쳐진(`415e562`·`d06238b`) 과거 blob 이다 |
| LOW | `.claude/receipts/mccp-implement-codex/drug-diag-api-m8.json` | receipt 가 `converged:true` 와 `codex_verdict` `divergent`/`skipped` 를 동시에 싣는다 | **확인** — m5b 는 `skipped=true` · `skip_reason=MCCP_SKIP_RECEIPT=1` 로 게이트를 건너뛴 receipt 다. 이 PR 의 우산 receipt 는 그 사실을 `open_questions` 에 census 로 싣고 `converged:false`·`divergent` 로 봉인했다 |
| LOW | `.claude/prds/drug-diag-api.prd.md` | 마일스톤 7·8 이 `in-progress` 인 채 PR 이 브랜치 전체 산출물을 main 으로 보낸다 | **확인** — PRD 73·74행. PR 본문에 명시한다 |

## 리뷰가 놓친 것 — 같은 창의 게이트 실행이 잡았다

`history-leak-scan.js`(mccp Phase 3.1)를 직접 돌려 GLM 이 LOW 로 본 절대경로 항목이
**기계적 차단**임을 확인했다: `exit 1` · `pattern=repo-root` 6건. 그중 3건은 이미 push 된
커밋의 옛 blob 이라 앞으로 고쳐도 범위에서 사라지지 않는다.

함께 나온 2건(`insuniverse-server`·`insuniverse-site` 의 `scan-error`)은 **오탐**이다 —
둘 다 gitlink(mode 160000)이고 그 SHA 는 superproject 가 아니라 각 서브모듈 저장소 안에 있어
`git cat-file -t` 가 실패한다. 두 서브모듈에서 각각 조회해 커밋 존재를 확인했다.

**비례성 판정** — `origin/main` 이 이미 같은 절대경로 패턴을 **112파일**에 담고 있다
(`git grep -l` 실측). 이 브랜치 6건을 이력 재작성으로 지워도 main 의 112건은 남으므로,
사용자 판정으로 이력을 재작성하지 않고 게이트 밖에서 PR 을 낸다. 그 사실을 PR 본문에 적는다.

## 재현

```
glm -p "$(cat <프롬프트>)"      # 프롬프트: 적대 리뷰 · three-dot 범위 · CLAUDE.md 불변식 · JSON 출력
node <mccp>/scripts/lib/history-leak-scan.js --json
```

리뷰어는 읽기 전용으로 돌렸다(Edit/Write 금지 지시). 절대경로 표기는 계정명을
`/home/<user>` 로 마스킹했다.
