# Implementation Report: 30 · 계약 + 한도 정책 문서 — 마일스톤 8

**Plan**: `.claude/plans/insuniverse-docs-30-contracts-limits-m8.plan.md` (제자리 유지)
**Branch**: `30-contracts-limits`
**Commits**: `54e189e` (Task 0·1) · `0297760` (Task 2~10)
**Notes**: `.claude/notes/insuniverse-docs-30-contracts-limits-m8.md`

## Summary

마일스톤 8 의 종료 조건은 *"리뷰 불일치가 2라운드 연속 0건"* 이고 측정자가 사람이다. 이 창은 그것을
닫지 않는다 — 닫은 것은 **표기가 앉을 자리를 만들고 라운드 0 사전검토를 돌린 것**이다.

산출 넷: (1) 9문서의 검증 가능한 주장 1214행 원장 · (2) 그 중 미결박 256행의 사전검토 표기 ·
(3) 앞 일곱 하네스 중 **어느 것도 9문서를 함께 보지 않는다**는 사실이 만든 공백 두 축의 신설 검사
(본문 코드 인용의 동결 트리 해석 · `## 연혁` SHA 의 이름공간 판정) · (4) 온보딩 9문항의 답변 좌표
대응표.

**유지보수자 라운드는 이 창에 0회다.** 표기가 있는 265행의 `round` 가 전건 `0` 이고 나머지 949행은
`null` 이다 — `#8b` 가 허용하는 값은 그 둘뿐이며 *전건 0* 이 아니다. 종료가 요구하는 두 라운드는
전부 이 창 밖이다. PRD 마일스톤 표 8행은 `in-progress` 로 갔다.

## Assessment vs Reality

| Metric | Predicted (Plan) | Actual |
|---|---|---|
| Complexity | Large | Large — 하네스 2100행 · 원장 1214행 |
| 원장 행수 | 1214 (관측 4) | **1214** (부류별 계수 전건 일치) |
| 본문 코드 인용 | 433 (트리 단독 412 · 앵커 좁힘 21) | **433 / 412 / 21** — 전건 일치 |
| 프론트매터 앵커 | 306 | **306** |
| 연혁 SHA | 90 (server 83 · site 6 · admin 1) | **90 전건 서브모듈** · 이 저장소 해석 0 |
| 정본 후보 축 | 1637 · 덮음 1359 · 미덮음 278 | **1637 / 1359 / 278** (contract 255 · value 23) |
| PRD 리터럴 | 4건 (57·130행) | **4건 → 0건** |
| Files Changed | CREATE 3 · UPDATE 2 | CREATE 4 · UPDATE 3 (리포트 1건 추가 · notes 1건) |

관측값이 계획서 예측과 전건 일치했다. 유일한 예측 밖은 **인용 정규식의 범위** — 계획서 관측 4 의
`01-input-validation.md` 38건 중 2건이 행 **범위** 표기(`validation.pipe.ts:45-47` ·
`contract-admin.dto.ts:36-37`)여서, 확장자 화이트리스트 + 단일 행 번호만 받는 좁은 정규식으로는
36건이었다. 규칙을 `<파일>.<확장자>:<시작>(-<끝>)?` 로 넓혀 38건에 맞췄고 범위의 끝 행도 행 초과
판정 대상에 넣었다.

## Tasks Completed

| # | Task | Status | Notes |
|---|---|---|---|
| 0 | 기준선 고정 + 붉음 귀속 | 완료 | 부류 A 6 · B 6 · B′ 1 · D 1 · C 7 · 분류 실패 0. 기준선 네 표면 일치 |
| 1 | 하네스 골격 | 완료 | 서브커맨드 18종(= 등록부 15종 + `--help`·`extract`·`capture`) · unknown 거부 3형태 · import 전건 node 빌트인 |
| 2 | 원장 추출 | 완료 | 1214행 · meta 전문 재산출 대조 |
| 3 | 본문 코드 인용 해석 | 완료 | 433/433 · 모호 0 · 행 초과 0 |
| 4 | 앵커 회귀망 | 완료 | 306/306 |
| 5 | 게이트 귀속 표기 | 완료 | 결박 958 · 미결박 256 |
| 6 | 잔여 행 사전검토 | 완료 | 미결박 256행 — ok 115 · 미검증 141. 원장 전체로는 미검증 146 · 사실과다름 1 · 빠짐 3 이고 차 9건은 `m8#check10` 에 결박된 onboarding 행이다 |
| 7 | 연혁 SHA 회귀망 | 완료 | 90/90 · 이름공간 모호 0 |
| 8 | 온보딩 대응표 | 완료 | 좌표 6 · 차단 3 · `maintainer_ox` 전건 `null` |
| 9 | 무변동 확인 | 완료 | 9문서 · `docs/_meta/**` · golden 무변동 |
| 9b | 정본 후보 커버리지 | 완료 | 미덮음 278 을 0 으로 접지 않았다 |
| 10 | PRD 두 자리 + 이월 | 완료 | 리터럴 4→0 · 토큰 마일스톤 8 · backlog 11행 |

## Validation Results

| Level | Status | Notes |
|---|---|---|
| Static Analysis | 통과 | `node --check` · `lint-docs.mjs` 기본·`--strict-refs` 9문서 위반 0 · `lint-plan.mjs` rc 0 · plan-kit selftest mismatch 0 |
| Unit / 게이트 | 통과 | `check-all` rc 0 · stderr 0바이트 · 14검사 전건 · 등록부 15종 == Validation 펜스 호출줄 15건(각 1회) |
| Build | N/A | 산출이 `.mjs` 하네스와 `.jsonl` 원장이다. 빌드 대상이 아니다 |
| Integration | N/A | 서버·클라이언트 표면 0건 |
| Edge Cases | 통과 | 음성 케이스 15갈래 전건 실행 · 관측은 notes §음성 케이스 실측 |

### Design Grounding

N/A — 설계 트리거 미발동. `impeccable-detect --mode implement` 가 `design_signal=false` ·
`silent_skip=true` · `reason=no-signal` 이고 UI 표면이 0건이라 Phase 2.5.5c 캡처도 Phase 3.6/3.7 도
돌지 않았다. receipt 에 `--impeccable-silent-skip --impeccable-silent-skip-reason no-signal` 을 전달했다.

### Design Finish

N/A — 같은 사유로 finish 라우팅 트리거가 성립하지 않는다.

## Files Changed

| File | Action | Lines |
|---|---|---|
| `.claude/plans/insuniverse-docs-30-contracts-limits-m8.gates.mjs` | CREATED | +2099 |
| `.claude/plans/insuniverse-docs-30-contracts-limits-m8.ledger.jsonl` | CREATED | +1215 |
| `.claude/plans/insuniverse-docs-30-contracts-limits-m8.attribution-baseline.txt` | CREATED | +7 |
| `.claude/PRPs/reports/insuniverse-docs-30-contracts-limits-m8-report.md` | CREATED | 이 파일 |
| `.claude/prds/insuniverse-docs-30-contracts-limits.prd.md` | UPDATED | 리터럴 4자리 · `*Status:` 1행 |
| `.claude/plans/codex-findings-backlog.md` | UPDATED | +11 (4열 표 구간) |
| `.claude/notes/insuniverse-docs-30-contracts-limits-m8.md` | UPDATED | Codex 리뷰 · 음성 실측 · 이탈 3건 · 라운드 원장 |

위 표 밖에 이 창이 새로 만든 파일이 셋 더 있다 — `.claude/plans/insuniverse-docs-30-contracts-limits-m8.plan.md`
와 `.claude/receipts/mccp-plan-codex/` · `.claude/receipts/mccp-implement-codex/` 의 receipt 2건이다
(전부 `54e189e`). 계획서 §Files to Change 의 대상이 아니라 워크플로 산출물이므로 표에 싣지 않았고,
**그 면제를 수로 줄이지 않고 이름으로 적는다.**

9문서는 한 바이트도 바뀌지 않았다 — `check11` 이 기준선 blob 과 바이트 대조한다.
`docs/_meta/**` 는 변경 0건이고 `policy-candidates.*.jsonl` 세 파일은 sha256 무변동이다.

## Deviations from Plan

세 자리다. 전부 notes §구현 라운드 — 계획서 문면과 갈린 세 자리 에 표로 있다.

1. **부류 A 유도 신호의 일반화.** 계획서는 신호를 `parseStatusTokenMilestone` 참조 하나로 적었으나
   m7 은 그 이름을 쓰지 않고(참조 0건) `parseStatusToken` 이 돌려주는 객체의 `.milestone` 을 읽는다.
   계획서 문면대로면 토큰이 마일스톤 8 로 간 뒤 m7 이 기대 집합에서 빠지고, 값 축만 보는 m2 는
   분류 실패로 남아 `#0a` 자신이 떨어진다. 신호를 **그 검사가 읽는 축**으로 일반화했다 — 착수
   시점(토큰 `complete`/7)에 관측 1 의 붉은 넷을 정확히 재현하고, 전이 뒤 A 가 6 으로 자동 확장됐다.
2. **`# 음성: (c)(2)` 를 뒤집었다.** 계획서는 워킹트리 사본을 지우면 통과한다고 적었는데 같은
   검사의 `# 기대:` 는 네 자리 동시 일치를 요구한다. 두 문면이 서로를 부정하므로 기대 쪽을
   구현했다(fail-closed). 덧붙여 `#11` 은 `.claude/plans/` 를 보지 않으므로 통과로 두면 그 삭제를
   아무 검사도 보지 않는다.
3. **인용 정규식의 범위.** 위 §Assessment 참조 — 행 범위 표기 2건이 계획서 관측값에 들어 있었다.

## Issues Encountered

- **위조 결박 1건을 구현 중에 실제로 만들었다가 잡았다.** 초판이 `--help` 의 인자 안내 행
  (`check11 --expect <status>`)을 검사 설명으로 받아, `policy` 부류 어휘 `status` 가 걸려 m7 의
  15행이 `m7#check11` 로 결박됐다. `#7b` 로는 잡히지 않는다 — 같은 술어를 쓴다. 인자 안내 행을
  설명에서 제외해 닫았고, 이것이 Implement-Codex R1 F2 가 경고한 형태의 실물 사례다.
- **`#0b` 의 단락 지점 유도가 처음엔 틀렸다.** `verify.sh` 는 진행 로그를 stderr 에 한글 이름으로
  찍는데(`ok  lint 전수 게이트`) 게이트 함수는 `run_lint_gate` 다. 동등 비교로는 전건이 미실행으로
  읽혀 단락 지점이 첫 게이트로 떨어졌다. 어간 부분 일치(`run_`·`_gate` 제거 · `_`→`-`)로 고쳐
  실측대로 `run_onboarding_gate`(3052행)를 낸다. 실행 집합이 접두가 아니면 그 사실도 함께 낸다.
- **선행 검사 인자를 정적으로 추측하면 자기검사 검사에서 rc 64 가 난다.** m7 `check2` 는 인자
  계약을 테스트하므로 소스에 `"--expect"` 리터럴을 담는다. 인자를 그 하네스의 **거부 문면**에서
  받도록 바꿨다.

## Tests Written

프레임워크 없이 하네스 자신이 테스트를 진다.

| 자리 | 대상 | 형태 |
|---|---|---|
| `check1` | 하네스 자기검사 | `--help` 양성 프로브 · 등록부 차집합 양방향 · unknown 거부 3형태 · import 전건 node 빌트인 |
| `check-all` | 계획서 ↔ 등록부 계약 | Validation 셸 펜스 구간의 호출줄과 등록부 차집합 양방향 + 각 정확히 1회 |
| 음성 프로브 15갈래 | `#0a`(5) · `#1` · `#2` · `#3` · `#4`(3) · `#7` · `#8`(2) · `#10` | 변이 → rc 1 · 실패 문면 관찰 → 복원. 관측은 notes |

## 이 창이 닫지 못한 것 — 이름으로 남긴다

- **PRD §Success Metrics 의 *트리 정합* 은 미충족이다.** `verify.sh --check` 가 rc=1 이고 원인은
  `verify.sh` 1902~1905행 의 *문서 PRD 5종* 단언이며 그 경로는 이 PRD 소유가 아니다. `#0b` 가 그
  사실과 원인 술어를 출력에 내지만 초록으로 만들지 않는다.
- **저장소 전역 회귀는 주장하지 않는다.** 같은 rc=1 이 `run_onboarding_gate`(3052행)에서 단락하며
  그 뒤 index·ownership·lint-coverage·fixtask 네 게이트가 돌지 않는다.
- **유지보수자 라운드 2회 연속 0건은 이 창 밖이다.** 표기가 있는 265행의 `round` 가 전건 0 이고
  나머지 949행은 `null` 이다.
- **미덮음 278 을 0 으로 접지 않았다.** 그 수가 곧 사전검토가 정본 모집단의 어디를 아직 보지
  않았는가다.
- **구현 게이트 체인이 서 있다.** `.claude/receipts/mccp-implement-codex/insuniverse-docs-30-contracts-limits-m8.json`
  의 `resolution.codex_verdict` 가 `divergent` 이고 `rounds` 가 1이다. 그 상태로는 하류 `/mccp:*` 가
  preflight 에서 멈춘다. 더해 그 receipt 의 `accepted`·`rejected` 는 **빈 배열**인데 notes §구현 라운드
  원장은 흡수 3 · 기각 1 로 적는다 — 기계 기록과 산문이 갈려 있고 하류가 읽는 것은 receipt 쪽이다.
  이 리포트는 receipt 를 손으로 고치지 않는다(위조). 해소는 `/mccp:santa-loop` 재라운드가 진다.
- **오결박 사각지대.** `#7b` 술어는 `doc`·`kind` 두 축뿐이라 같은 문서 같은 부류의 다른 행을
  가리키는 오결박을 못 가른다. `#7` 이 그 잔여를 사각지대로 출력하고 backlog 가 인수처를 지목한다.
- **m7 이 어느 행도 결박하지 못한다.** 그 하네스의 `--help` 가 검사 설명을 내지 않아 커버리지
  술어를 못 넘긴다. `docs/04-limits/04-feature-gates.md` 의 84행이 강등이며 **강등은 결박 부재의
  증명이 아니다** — 각 행의 `note` 가 그 사실을 적는다.

이월 11행은 `.claude/plans/codex-findings-backlog.md` 4열 표 구간에 있고 `#12b` 가 전건이 표 행임을 문다.

## Next Steps

- [ ] `/mccp:santa-loop` — `mccp-implement-codex` receipt 의 `divergent` 해소. **이것이 먼저다** — 그 전에는
      `/mccp:pr` 이 preflight 에서 선다
- [ ] `/mccp:pr` — PR 생성 (PR-Codex 게이트)
- [ ] 유지보수자 라운드 1 — 원장 미결박 256행의 표기를 사람이 판정
- [ ] 유지보수자 라운드 2 — 연속 0건이면 `/mccp:milestone-close` 로 8행 `complete` 전이
