# Implementation Report: 40-runtime-vendor-legal M7 — 미결 처분 원장과 리뷰 라운드 2

**Plan**: `.claude/plans/insuniverse-docs-40-runtime-vendor-legal-m7.plan.md`
**Branch**: `40-runtime-vendor-legal`
**Base**: `eeb75d3` (plan-codex receipt `base_sha`) → merge `origin/main` `fa8ad07`

## Summary

새 정책 문서를 쓰지 않는다. 쌓인 미결에 판정을 붙이고, 리뷰 라운드 2 를 실제로 돌리고,
네 창이 물려받은 봉쇄 전제를 다시 쟀다.

- **처분 원장 70행** — backlog 이 이 PRD 를 출처로 적은 물리 행 전건에 `verdict` 를 붙였다.
- **라운드 2 원장 1370행** — 수렴 계수 **0**. 그럼에도 지표는 **미충족**이다(수열 `[8, 0]`).
- **게이트 하네스 15검사** — `all ok 15/15`, 음성 19건 전건 exit 1.
- **로컬 리뷰 1라운드** — 지적 5건 전건 흡수, 매 건 반사실 검증. 진입값은 `all FAIL: 14/15`
  였고 이 리포트 자신이 그 실패의 원인이었다 (notes §로컬 리뷰 라운드).

## Assessment vs Reality

| Metric | Predicted (Plan) | Actual |
|---|---|---|
| Complexity | Large | Large — 하네스 1285행 · 원장 2종 1441행 |
| 검사 수 | 계획서 펜스가 유도 (리터럴 금지) | 15 (`#0`~`#14`) · `#11` 이 4자 대조 |
| backlog 재열거 | 64 (계획 시점) | **70** — M7 이 낸 신규 미결 3건 × 2 물리 행 |
| 라운드 2 수렴 계수 | 값을 주장하지 않음 | **0** (`사실과다름 0 + 빠짐 0`) |
| 지표 충족 | 미충족을 정상 종료로 명시 | **미충족** — 수열 `[8, 0]`, 라운드 3 이상 필요 |
| Task 0 봉쇄 판정 | `yes`/`no` 두 값 | **`blocked=yes`** |

## Tasks Completed

| # | Task | Status | Notes |
|---|---|---|---|
| 0 | 착수 전 실측 — findings 봉쇄 | 완료 | 층 (a) `blocked=yes`. 층 (b)는 `verify.sh` 가 서브모듈 부재로 먼저 죽어 **측정 실패** — 계획서 §Risks 첫 행 예측대로이며 notes 에 1회 관찰로 남겼다 |
| 0b | 하네스 골격과 기준선 `#0` | 완료 | `CHECKS` 등록부 · `--help` 유도 · unknown 거부 · 선행 하네스 출력 프로세스 간 캐시 신설 |
| 1 | 처분 원장 1단계 | 완료 | 70행 · 키 `(digest, dup_ordinal)` · digest 픽스처 동결 |
| 12 | 두 소비기 시야 | 완료 | mccp 46 · fixtask 24 · 교집합 0(계산) · 이중 기입 3쌍 |
| 6b | 처분 원장 2단계 | 완료 | `closed-here` 31건 evidence 확정 · 대응표 밖 0 |
| 2 | findings 파일 개설 | **미개설 (판정)** | `blocked=yes` — 원장 9행이 `referred` 로 인수처와 backlog 좌표를 싣는다 |
| 3 | 라운드 2 원장 | 완료 | `round: 2` · prior_ledger sha256 결박 · id 1370 == 문서 독립 재유도 |
| 4 | 미검증 138 결박 | 완료 | 결박 111 (anchor 71 · table 40) · 미결박 27 (저장소 밖 17 · R-1 10) |
| 5 | 라운드 2 흡수 | **편집 0 (판정)** | 수렴 계수 0 — 흡수할 인용 형태가 없다. 원장 `meta.absorption` 에 사유 기입 |
| 6 | PRD 개정 | 완료 | 회부 R-1~R-4 판정 열 · 개정 이력 3행 · Open Questions 3건. 6행 바이트 무변동 |
| 7 | 자기검증·음성 케이스 | 완료 | 19건 전건 exit 1 · 복구 확인 |

## Validation Results

이 저장소는 루트 `package.json` 이 없다 — type-check / lint / build / test 스크립트가 없고,
검증의 실행 지점은 **게이트 하네스와 doc-kit lint** 다. 아래는 그 대응이다.

| Level | 이 저장소의 실행 지점 | Status |
|---|---|---|
| Static Analysis | `#0d` doc-kit lint 11파일 `--strict-refs` · `#11c` import 전건 node 빌트인 | 통과 (위반 0 · 신규 의존 0) |
| Unit Tests | `#0` plan-kit `--selftest` `mismatch=0` · `#11` 하네스 자기검사 4자 대조 | 통과 |
| Build | 해당 없음 (문서 저장소 · 빌드 산출물 없음) | N/A |
| Integration | `#0a` 선행 하네스 M1~M6 전건 완주 — M1 15/15 · M2 13/13 · M3 14/14 · M4 16/16 · M5 16/16 · M6 13/13 | 통과 |
| Edge Cases | Task 7 음성 19건 — 전건 exit 1, 통과한 음성 0건, 복구 후 바이트 동일 | 통과 |

최종 실행(로컬 리뷰 흡수 **후**): `node .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m7.gates.mjs all`
→ `all ok 15/15 통과`

흡수 **전** 같은 명령은 `all FAIL: 14/15 (실패: check10)` 였다 — 이 리포트 파일이
`ALLOWED_PREFIXES` 밖이었기 때문이다. 그 상태에서 이 줄이 `15/15` 를 인용하면 커밋되는
순간 거짓이 된다. 두 값을 함께 적는 이유가 그것이다.

### Design Grounding

N/A (no design trigger) — `impeccable-detect` 가 `design_signal=false · reason=no-signal`.
렌더 표면 변경이 없어 Phase 2.5.5c 캡처가 없고 Phase 3.6·3.7 은 no-op 이다.

## Files Changed

| File | Action | Lines |
|---|---|---|
| `.claude/plans/insuniverse-docs-40-runtime-vendor-legal-m7.gates.mjs` | CREATED | +1285 |
| `.claude/plans/insuniverse-docs-40-runtime-vendor-legal-m7.ledger.jsonl` | CREATED | +1371 |
| `.claude/plans/insuniverse-docs-40-runtime-vendor-legal-m7.disposition.jsonl` | CREATED | +71 |
| `.claude/plans/insuniverse-docs-40-runtime-vendor-legal-m7.probe0.sh` | CREATED | +115 |
| `.claude/plans/insuniverse-docs-40-runtime-vendor-legal-m7.digest-fixture.json` | CREATED | +8 |
| `.claude/notes/insuniverse-docs-40-runtime-vendor-legal-m7.md` | CREATED | +284 |
| `.claude/PRPs/reports/insuniverse-docs-40-runtime-vendor-legal-m7-report.md` | CREATED | +129 |
| `.claude/plans/codex-findings-backlog.md` | UPDATED | +16 |
| `.claude/prds/insuniverse-docs-40-runtime-vendor-legal.prd.md` | UPDATED | +15 / -7 |
| `.claude/settings.json` | UPDATED | +2 / -2 |

`docs/**` 산출 문서는 **한 줄도 바뀌지 않았다** — 라운드 2 수렴 계수가 0 이라 흡수 편집이
없고, `#0b` 가 그것을 `이 창 편집 0건` 으로 출력한다.

## Deviations from Plan

| # | 무엇이 계획과 달랐나 | 왜 |
|---|---|---|
| D1 | backlog 재열거가 64 가 아니라 **70** | 계획서 관측 4 의 64 는 착수 시점 값이다. Task 7 이 신규 미결 3건을 **양쪽 형식으로 각 1행씩** 더했으므로 +6 이 계획된 증가다. `#1a` 는 계수를 리터럴로 담지 않고 매 실행 재열거하므로 게이트는 이 증가를 그대로 받는다 |
| D2 | 착수 중 `origin/main` 을 한 번 더 병합 | 형제 창 PR #50 이 `origin/main` 을 앞세웠고, 병합 없이는 M6 `#9` 가 `docs/viewer/build-docs.mjs` 를 이 창 편집으로 오귀속해 죽는다. 저장소 규약(rebase 금지·merge 필수)대로 병합하고 `#10`·`#0b` 의 귀속을 `origin/main` 내용 대조로 고쳤다 |
| D3 | `out-of-scope-standing` 판정이 **0건** | R-3·R-4 (ops 축)에 해당하는 backlog 행이 실제로 없었다. 그 판정은 backlog 이 아니라 PRD §회부 표에 실린다 — 계획서 관측 7 → Task 6 의 자리다. 어휘는 유지하고 분포를 `#2` 가 출력에 싣는다 |
| D4 | `#8a` 가 네 축 전부 **0건** | 계획서 관측 5 는 M6 note 의 *"문자열 0건"* 근거를 반증했고 그것은 참이다. 그러나 그 근거가 뒷받침하려던 결론(*어느 선행 하네스도 이 축을 읽지 않는다*)은 여섯 하네스를 돌린 출력이 확인해 준다. 틀린 근거로 옳은 결론을 적은 자리였다 |

## Issues Encountered

| # | 문제 | 해소 |
|---|---|---|
| I1 | `#12` 첫 구현이 `fixtask-projection` 의 `stripMarker` 를 재구현해 21행 중 3행에서 digest 가 갈렸다 | 재구현을 버리고 **소비기 자신에게 물었다** — mccp `scanBacklog` 호출 + `fixtask-projection.mjs` spawn, 각 소비기의 필드로 물리 행을 재구성해 정본 규칙으로 재해싱. 재구성 실패 시 `#12` 가 죽는다 |
| I2 | 적용 범위 표 열 수를 `11` 리터럴로 박아 35건이 거짓 미결박이 됐다 | 리터럴을 지우고 표 헤더에서 유도(INV4). 생산기와 검증기가 각각 계산하고 `#8` 이 둘을 대조한다 |
| I3 | `#8a` 가 선행 하네스 6종을 다시 돌려 `all` 이 10분을 넘겼다 | 선행 출력을 `<gitdir>/mccp/tmp/m7-prior/` 에 캐시. 키에 하네스와 편집 대상 문서의 sha256 을 넣어 낡은 캐시가 조용히 통과하지 못하게 했다. 실패 출력은 캐시하지 않는다 |
| I4 | Write 툴이 `.gates.mjs` 에 NUL 바이트 1개를 냈다 (`` `${repo} ${p}` `` 자리) | `grep` 이 `Binary file matches` 로 드러냈고 node 로 치환했다 |
| I5 | receipt write 가 `/clear` 직전 세션의 claim 에 15분 막혔다 | 같은 pid 의 앞 세션이 홀더였다. 가드를 끄지 않고 TTL 을 기다렸다 |

## Tests Written

| Test | 건수 | 무엇을 덮는가 |
|---|---|---|
| `negative2.mjs` (scratchpad 실행기) | 19 | `#1`~`#14` 전건의 음성 케이스. 전건 exit 1, 통과 0건, 복구 후 바이트 동일 |
| `check11` 자기검사 | 1 | 등록부 ↔ `--help` ↔ `all` 분모 ↔ 계획서 펜스 기대 집합 4자 대조 |
| `check0` 회귀 | 6 | 선행 하네스 M1~M6 `all` 완주 + `--help` 선언 수 하한 |

## 남는 것 (정직 기록)

- **Success Metric *리뷰 불일치 수렴 = 2라운드 연속 0건* 은 미충족이다.** `#13` 이 그것을
  출력으로 말한다. 라운드 3 은 후속 창 몫이며 backlog `id=40m7-round3-pending` 에 있다.
- **`docs/_meta/findings/40-runtime-vendor-legal.md` 는 다섯 번째 창에서도 못 세웠다.**
  `id=40m7-findings-file-still-blocked` · 인수처 `00-protocol` 의 golden 개정 위임 창.
- **두 소비기 파싱 규칙 불일치는 그대로다.** `id=40m7-backlog-parser-split`. M7 은 불일치를
  실측으로 드러내고 양쪽에 기록했을 뿐 통일하지 않았다(범위 밖).
- **미결박 27건.** 저장소 밖 근거 17 · R-1 차단 10. 전건이 사유를 이름으로 갖는다.
- **`out-of-scope-standing` 분포 0.** 어휘는 살아 있고 대상 행이 없었다.

## Next Steps

- [ ] `/mccp:pr` — PR 생성 (PR-Codex 게이트)
- [ ] 후속 창 — 라운드 3 원장 (연속 0건 2회의 세 번째 점)
