# 구현 노트 — 마일스톤 5a-fix (테스트 축 판정 정본 교정)

**Plan**: `.claude/plans/insuniverse-docs-11-index-code-m5a-fix.plan.md`
**Decision**: `insuniverse-docs-11-index-code-m5a-fix`

리뷰 기록을 계획 본문이 아니라 여기 둔다 — `mccp-plan-codex` receipt 가 그 계획의
`plan_hash` 에 결속돼 있어 본문에 절을 더하면 완료 증거가 stale 로 떨어진다.

## Codex Implementation Review

- 호출: `node C:/Users/madsc/.claude/plugins/cache/mccp/mccp/1.23.7/scripts/lib/codex-invoke.js adversarial-review` (fail-closed Bash wrapper, v0.2.2)
- 라운드 수: 1
- Codex verdict: `needs-attention` (지적 5건 — HIGH 4 · MEDIUM 1)
- 합치 결론: **divergent** — 3건 흡수(F2·F3·F5) · 1건 부분 흡수(F4) · 1건 이월(F1, 계획 R8 과 동일 근원)

### YAGNI Triage

| Finding | Severity | Verdict | Why |
|---|---|---|---|
| F1 재사용 워크플로 call site 가 anchor 기반 id 에서 충돌 | HIGH | DEFER_TO_BACKLOG | 계획 R8 이 이미 같은 것을 이월했다. 고치려면 `verify-code-index.mjs` 소유 앵커 **형식**을 열어야 하고 그것은 이 계획의 명시적 비범위다 |
| F2 빈 행이 유효한 블록 스칼라를 잘라낸다 | HIGH | ACCEPT_NOW | 실재한다. 빈 행에서 span 을 끊으면 다행 본문이 1행으로 접혀 `singleSimpleCommand` 의 조건 1 을 거짓 통과한다 — 과대 확정 |
| F3 `governs` 가 `needs:` 교차 job 제어흐름을 무시한다 | HIGH | ACCEPT_NOW | A3 픽스처가 "needs: 로 닿는 job" 을 계약으로 적어 두었다. job DAG 의 전이 선행을 `governs` 에 넣는다 |
| F4 재열거 탐색 범위가 생산자 탐색 범위를 덮지 못한다 | HIGH | 부분 ACCEPT_NOW | `.yaml` 확장자는 지금 덮는다. 재사용 워크플로 재귀·동적 Dockerfile 선택은 5b 소유이고 F1 과 같은 근원이라 함께 이월 |
| F5 반환 형태 변경이 저장소 안 소비자를 깬다 | MEDIUM | ACCEPT_NOW | `verify-tests.mjs:1742`·`:2059` 가 `unresolved_reasons.length` 를 읽는다. 같은 편집에서 전수 이관한다. **호환 별칭은 두지 않는다** — 정본 2벌이 된다 |

- Deferred to backlog: 2 → `.claude/plans/codex-findings-backlog.md`
- Open Questions: **재사용 워크플로 id 충돌 + 그에 딸린 탐색 범위 확장 — severity HIGH, 5b 소유 후속 계획의 필수 선행** (계획 R8 과 동일 항목, 새 영역 아님)
- Codex session 참조: `019ff948-cbbf-7103-83ef-66a785f2831c`

### 흡수 상세 (반증 대조)

- **F2** — 계획 96행은 "그 키보다 깊은 **연속** 행" 이라고만 적었다. YAML 블록 스칼라는 완전히 빈
  행에서 끝나지 않는다. 종료 조건을 **"비어 있지 않으면서 키 이하로 들여쓴 행"** 으로 못박고,
  픽스처가 빈 행을 낀 다행 본문이 `unresolved` 로 닫히는 것을 고정한다.
- **F3** — 계획 112행의 "다른 job 이면 거짓" 은 무관한 job 을 겨눈 것이지 `needs:` 선행을 겨눈 것이
  아니다(그 문장의 근거로 든 R4 F1 은 **같은 job 의 호출 뒤 step** 이야기다). `needs:` 전이 선행 job
  을 `governs` 에 더하는 것은 "제어흐름 경로" 정의의 **확장이 아니라 이행**이고, Acceptance 가 FAIL
  로 못박은 셋(step 내부 면제 · 파일 공존 · 호출 뒤 차단) 중 어느 것도 건드리지 않는다.
- **F4 부분** — `.yml`·`.yaml` 둘 다 열거한다. 나머지(재사용 워크플로 재귀 · action `file:` 입력으로
  고르는 Dockerfile)는 5b 가 켜는 경로다. **지금은 조용히 통과하지 않는다** — 재열거가 닿지 못한
  wire 레코드는 집합 대조에서 그 `id` 를 지목한 `errors.push` 로 떨어진다(fail-closed).
- **F5** — `unresolved_reasons` 를 지우고 A34·A61 을 `typed_residues` 로 이관한다.

### Security Reviewer

> security-reviewer unavailable, skipped (auto-fallback): 계획 UI7 과 세션 규칙이 Agent 도구
> 사용을 금지한다 — 사용자가 요청하지 않은 subagent 호출은 이 마일스톤의 명시적 배제다.

이 receipt 는 `security_skipped=true` 로 봉인되므로 `/mccp:pr` 검증기에서 **non-approving** 이다.
그것이 정직한 상태다 — 검토를 건너뛴 채 승인처럼 보이는 receipt 를 내지 않는다.

접촉 표면 자체는 신뢰 경계를 새로 열지 않는다: 재열거는 기존 `within()`·`checkAnchor` 가 이미
지키는 `<reposRoot>/<repo>` 좌표계 안에서만 파일을 읽고, 새 입력원·새 권한·새 직렬화 경로가 없다.

### Design Review

> impeccable silent-skip (reason=`no-signal`): 이 편집은 `.mjs` 제어평면 3파일이고 렌더 표면이 없다.
