# M13 — 리뷰 잔여 처리 (구현 회차 기록)

## Codex Implementation Review

이 절이 계획서 본문이 아니라 여기 있는 이유: 계획서 §검사 설계 근거 `#1` 의 운용 규칙이다.
`#1` 이 앵커를 `mccp-plan-codex` receipt 의 `plan_hash` 에서 유도하므로 계획서 본문 편집은
앵커 무효이고 `#1`(c)(g) 와 `#10` 이 함께 붉는다. mccp 도 `plan is in completed/` 분기로 같은
라우팅을 갖는다.

- 호출: `node <플러그인루트>/scripts/lib/codex-invoke.js adversarial-review` (fail-closed Bash wrapper, v0.2.2)
- 라운드 수: 1
- 합치 결론: `verdict=approve` · findings 0건. 계획서가 계약을 이미 못 박아 구현 시점 결정 7건 전부
  기존 계약 안에서 해소된다고 판정했다. Codex 는 이 diff 가 리뷰 증거만 바꾼다는 것과, 하네스·원장·
  인수 절차 문서가 **아직 없으므로 이 판정이 구현 준비 완료를 뜻하지 않는다**는 것을 함께 적었다.
- YAGNI Triage:

  | Finding | Severity | Verdict | Why |
  |---|---|---|---|
  | (없음) | — | — | Codex 가 `findings: []` 를 냈다. 표를 비우지 않고 그 사실을 행으로 남긴다 |

- Deferred to backlog: 0
- Open Questions: (없음)
- Codex session 참조: threadId `01a07f84-fd5e-7681-9604-cc7a870b4956` · classification `ok` · durationMs 40159

### 판정에 딸린 next_steps (권고 · 게이트 아님)

Codex 가 findings 대신 next_steps 넷을 냈다. blocker 가 아니므로 흡수 의무는 없으나 구현이
실제로 겨냥한 자리와 겹치므로 기록한다.

1. receipt 를 앵커에 접을 때 `PLAN`·`GOLDEN` 바이트를 보존하고 stage 경로를 확인한 뒤 amend 할 것.
2. 파서를 엄격하게 — 원장 스키마 · hunk 페이로드 정규화 · 골든 정규식 의미 보존 · 잔여 스캔 변이 케이스.
3. `#7` 은 분기별로 **독립 저장된** 진단 증거를 대조하고 프로세스 오류·예상 밖 출력을 거부할 것.
   `#8` 은 m12 서브커맨드 집합을 열거하고 서브커맨드별 성공 출력을 요구할 것.
4. 맨몸 id 출력 · `check-all` 정확 대조 · 실제 변이/빈 입력을 먹는 잎 selfprobe · 인수 절차 3절 검사.

### Security Reviewer

security-reviewer 를 **부르지 않았다**. 자동 폴백이 아니라 판정이다 — 이 창의 산출물은 인증·암호·
비밀·SQL/명령 주입·SSRF·권한 상승 어느 축에도 닿지 않는다. 하네스는 `shell: false` 로 `git`·`node`
만 spawn 하고, 정규식 조립의 입력인 골든은 앵커 결박된 저장소 산출물이지 신뢰 밖 입력이 아니다.
유일한 인접 축인 절대경로 유출은 이 창이 `#17` 로 직접 게이트한다.

### Design Review

- impeccable 은 **silent-skip** 이다 (`skill_available=1` · `design_signal=0` · reason `no-signal`).
  이 창은 렌더링 표면을 만들지 않는다 — 산출물은 `.mjs` 하네스 · `.jsonl` 원장 · `.md` 문서다.
  receipt 가 `impeccable_silent_skip=true` 로 그 사실을 싣는다.

## 종료 술어 — 이 창이 닫는 것과 안 닫는 것

**이 창이 닫는 것은 판정의 정확성이지 지표가 아니다.** 8행이 세운 선례를 그대로 따른다 —
그 행에서 `complete` 는 Outcome 증명이 아니라 **산출 인도 + 잔여 이월**이었고, 9~12행이 같은
정의로 전이했다. 13행도 같다.

### 인도

- 이월 5건 전건이 판정 레코드로 섰다 — `Q34` 정정 · `Q46` 갈림 보존 · 산문 결함 6건 하위 분해 ·
  `m9/check5` 원인 확정 · 모듈 경계 기계/비기계 분리. 정본은 원장
  `insuniverse-docs-50-domain-m13.ledger.jsonl` 과 backlog 의 `M13-RESOLVED` 행이다.
- `m12` 하네스의 지정 붉음이 closure 산문에서 **기계 레코드**로 승격됐다 — `designation` 3건
  (`check7` · `check9` · `check11`)이 전 서브커맨드 개별 실행 실측과 차집합 0 양방향으로 결박된다.
- 동결 3핀을 `--git-common-dir` 로 읽는 경로가 게이트로 섰다 — 서브모듈 미초기화에도 도달하며
  트리 경로 수가 골든과 정확히 일치해야 하므로 부분·promisor clone 이 그 자리에서 붉는다.

### 이월 — 미달분을 이름과 계수로 남긴다

지표 두 축은 이 창에서도 **미달**이다. M12 가 두 축을 **미성립**으로 확정했고 2중 리뷰 양측이
그 결론을 함께 지지했으며, 이 창은 그것을 뒤집지 않는다.

| 축 | 계수 | 상태 |
|---|---|---|
| 온보딩 성립 | 13/23 (2중 리뷰 B 판정으로는 12/23) | Target 100% **미달** |
| 리뷰 회차 1 | 48건 | 연속 0 **미달** |
| 리뷰 회차 2 | 12건 | 연속 0 **미달** |

`Q46` 의 갈림 때문에 온보딩 계수 자체가 13/23 인지 12/23 인지 갈리지만 **어느 쪽도 Target
미달**이라 축 판정은 불변이다. 그 갈림을 한쪽으로 접지 않은 것이 이 창의 산출이다.

기계 밖으로 남는 것 넷: 모듈 배정의 도메인 타당성 · `Q46` 의 어느 판정이 옳은가 · 하위 결함
6건의 내용 해소 여부 · `Q34` 정정이 인용한 주장 자체(게이트는 좌표 실재까지만 문다). 전부
계획서 Acceptance 가 `(미검증)` 으로 싣는다.

### 13행 자신의 close 는 이 창이 하지 않는다

13행이 마지막 행이라 PRD 가 규정한 "다음 창의 구현 커밋" 이 없다. 창 밖 주체를 위한 절차는
`.claude/meta/13-close-handoff.md` 에 있고 게이트 `#19` 가 그 문서의 **존재**를 문다.

## 완주 회차

`node .claude/plans/insuniverse-docs-50-domain-m13.gates.mjs check-all` 이 17종 검사를 돌고
합집합 출력행을 골든과 차집합 0 양방향으로 대조한다. `#15`(plan-kit lint)는 하네스 **밖**이라
그 분모에 없으며 `check13.out-of-harness-axis` 가 그 비대칭을 매 실행 낸다.

## 음성 케이스 실측 — 계약이 관찰이 된 자리

계획서 §Validation 의 `# 음성:` 은 하네스가 없던 저작 시점에는 **예측**이었다. 이 회차가 그
관찰을 만든다. 아래는 각 케이스를 실제로 주입해 뜬 결과이며, 매 건 주입 → 실행 → 원상복구로
돌렸고 복구 후 바이트 동일을 `cmp` 로 확인했다.

| 케이스 | 주입 | 결과 |
|---|---|---|
| `#0` 하네스 부재 | 파일을 옮기고 `--help` | rc 1 · `Cannot find module` |
| `#1` 앵커 정본 부재 | plan-codex receipt 삭제 | rc 1 · `#1 FAIL: 앵커 정본 부재` |
| `#2` 차집합 | 등록부에서 `check8` 제거 | rc 1 · `#2 FAIL: 차집합` |
| `#4` 좌표 부재 | correction 좌표를 없는 파일로 | rc 1 · `#4 FAIL: 좌표 부재` |
| `#5` 갈림이 접힘 | `verdicts` 를 1건으로 | rc 1 · `#5 FAIL: 갈림이 한쪽으로 접혔다` |
| `#6` 미해소 id | backlog 해소 표기 1건 제거 | rc 1 · `#6 FAIL: 미해소 id` |
| `#6` 하위 분모 | 인용 라벨 1건 제거 | rc 1 · `#6 FAIL: 하위 분모 차집합` |
| `#7` 귀속 없는 붉음 | attribution 레코드 제거 | rc 1 · `#7 FAIL: 귀속 없는 붉음` |
| `#8` 지정 밖 붉음 | designation 1행 제거 | rc 1 · `#8 FAIL: 지정 밖 붉음` |
| `#9` 배정 누락 | m8 배정 표에서 1행 제거 | rc 1 · `#9 FAIL: 배정 누락` |
| `#9` 핀 부재 | 골든 server 핀을 없는 값으로 | rc 1 · `#9 FAIL: 핀 부재` (환경 결손 어휘) |
| `#10` 산출 문서 변경 | `docs/30-admin/01-admin-console.md` 에 한 줄 | rc 1 · `#10 FAIL: 산출 문서 변경` |
| `#10` 허용집합 밖 | `docs/_meta/` 아래 새 파일 | rc 1 · `#10 FAIL: 허용집합 밖` |
| `#11` 한 자리만 이동 | 13행 셀만 complete 로 | rc 1 · `#11 FAIL: 한 자리만 이동` |
| `#12` 이 창이 더한 행 | 실재 closure + 일치 sha 로 13행 선주입 | rc 1 · `#12 FAIL: 이 창이 더한 행` |
| `#14` 실출력 결손 | 하네스가 id 하나를 안 찍게 | rc 1 · `checkall FAIL: 골든에만 있는 출력행 1건` |
| `#16` 봉인 밖 변경 | `verdict.jsonl` 에 개행 1자 | rc 1 · `#16 FAIL: 봉인 밖 변경` |
| `#17` 절대경로 | notes 에 윈도우 드라이브 문자 형태 1줄 | rc 1 · `#17 FAIL: 절대경로` |
| `#17` 면제 잔여 | 면제 토큰 **뒤**에 홈 경로를 덧붙임 | rc 1 · `#17 FAIL: 절대경로` (잔여 스캔이 화이트리스트로 퇴화하지 않았다) |
| `#17` **추적 축** | 추적 `codex-findings-backlog.md` 에 홈 경로 1줄 | rc 1 · `#17 FAIL: 절대경로 1건` — 아래 §추적 축이 죽어 있던 자리 참조 |
| `#18` 종료 주장 | notes 에 축 성립 문면 1줄 | rc 1 · `#18 FAIL: 종료 주장` |
| `#19` 인수 절차 결손 | 3절 중 하나의 표제 훼손 | rc 1 · `#19 FAIL: 인수 절차 결손` |
| `#15` PL11·PL12 | plan-kit fixture 2종 | 각 rc 1 |

### 계획서 예측과 갈린 자리 셋 — 전부 rc 1 이되 **더 이른 게이트**가 잡았다

1. **`#3` 핀 편집.** 계획서 음성은 `#3 FAIL: 핀 부재` 를 예측했으나 실측은
   `#3 FAIL: gitlink != 골든 핀` 이다. 골든 핀만 고치면 gitlink 동일성이 **먼저** 깨지기
   때문이다. `핀 부재` 분기는 셋이 일치하면서 객체가 없는 환경 결손 경로이며, 위 표의
   `#9 핀 부재` 행이 그 분기를 실제로 밟은 관찰이다.
2. **`#13` 워킹트리 골든 편집.** 계획서 음성은 `#13 FAIL` 을 예측했으나 실측은
   `#1 FAIL: 앵커 이후 계획 단계 결박 경로 변경` 이다. `check13` 이 `anchor()` 를 선행
   호출하고 `#1`(g)가 같은 편집을 **더 이른 자리에서** 잡는다. 골든 편집에 대해
   `check13.golden-anchor-binding` 이 **독립으로 붉는 회차는 재현되지 않는다** — 두 다리가
   같은 사실을 보므로 이자 대조가 아니라 사실상 중복이고, 그 사실을 여기 남긴다. 방향은
   fail-closed 이므로 구멍이 아니다.
3. **`#14` 골든에서 id 제거.** 같은 이유로 `#1`(g)가 먼저 잡는다. 반대 방향 — 하네스가 id 를
   안 찍는 구현 드리프트 — 은 `checkall FAIL: 골든에만 있는 출력행` 으로 실제로 걸렸고,
   `checkall.golden-parity` 가 사는 방향이 그쪽임을 실측이 확인한다.

### 구현이 이 회차에 고친 자기 결함 셋

- **하네스가 자기 소스에서 절대경로를 잡았다.** `check17.url-false-positive-guarded` 의 본문
  산문이 탐지 패턴을 **설명하려고** 틸데-슬래시와 드라이브 문자 리터럴을 담고 있었고,
  하네스 자신이 스캔 대상이라 `#17` 이 두 번 붉었다. 산문을 리터럴 없는 서술로 바꿔 닫았다.
  이것은 위양성이 아니라 `check17.patterns-derived-from-golden` 이 선언한 두 번째 결박
  ("하네스가 골든 밖 리터럴을 담으면 자기 스캔에 붉는다")이 실제로 문 자리다.
- **`#10` 의 두 술어 순서.** 산출 문서 경로는 허용집합 밖이기도 해서, 허용집합 검사를 먼저
  두면 계획서 `# 음성:` 두 줄이 같은 메시지로 접힌다. 산출 문서 검사를 앞으로 옮겨 둘을
  갈랐다 — 둘 다 die 이므로 강도 변화는 없고 진단만 구체화된다.

#### 추적 축이 죽어 있던 자리 — 로컬 리뷰가 잡았다

`#17` 은 입력원 **둘**을 선언한다: 추적 파일의 앵커 대비 **추가된 줄**, 미추적 신규 파일의
**전체 줄**. 이 회차의 첫 구현에서 **추적 축이 통째로 0줄이었다.**

원인은 이 개발 환경의 `diff.external` 설정(difftastic)이다. `git diff -U0 --no-color` 가
통일형식이 아닌 side-by-side 출력을 내므로 `+` 접두 파서가 한 줄도 못 얻는다. 그런데
`if (!input.length) die(...)` 가드는 **미추적 축이 채우기 때문에** 뜨지 않는다 — 이 창은
CREATE 산출물이 여섯이라 1,681줄이 들어왔다.

반사실로 확인했다. 추적 `codex-findings-backlog.md` 에 홈 디렉터리 형태의 경로 한 줄을 넣고:

| 상태 | `#17` |
|---|---|
| 주입 · 수정 전 | `#17 ok` **rc 0** · 입력 1681줄 (증가 없음) |
| 같은 주입 · 저장소 밖 `grep` | 1건 적중 |
| 주입 · 수정 후 | `#17 FAIL: 절대경로 1건` **rc 1** · 파일·패턴 정확 지목 |
| 무주입 · 수정 후 | `#17 ok` rc 0 · 입력 1681 → **1686** |

수정은 그 한 호출에 `--no-ext-diff` 를 붙이는 것이다. 같은 플래그가 `GIT_EXTERNAL_DIFF`
환경변수 경로도 함께 닫는다(확인). 하네스의 나머지 git 호출 열여섯은 `--name-only` ·
`ls-tree` · `log --format` · `cat-file` · `hash-object` 라 외부 diff 사정거리 밖이며,
`#1`(g) · `#10` 의 변경 열거는 영향을 받지 않는다(실측으로 확인).

**이 결함이 살아남은 이유는 음성 케이스의 공백이다.** 위 표의 `#17` 주입 두 건이 **둘 다
미추적** `notes` 에 들어갔고, 추적 축 분기를 밟는 케이스가 하나도 없었다. 그래서 스무 건이
넘는 주입 실측을 통과하고도 입력원의 절반이 죽은 채로 초록이었다. 그 분기를 밟는 행을 위
표에 더했다 — 층위 5(게이트 실행 불가)는 **입력원마다** 밟아야 한다는 것이 이 회차의 관찰이다.
