# Notes: 60 · 연혁 + 폐기 정본 — 마일스톤 2

> 계획서: `.claude/plans/insuniverse-docs-60-history-deprecated-m2.plan.md`
> 이 파일은 `/mccp:prp-implement` 게이트 산출물이다. 계획서 본문은 바이트 그대로 두어
> `mccp-plan-codex` receipt 의 `plan_hash` 앵커를 유지한다.

## Codex Implementation Review

- 호출: 없음. `MCCP_CODEX_DISABLED=1` (`~/.claude/settings.json` `env`) 로 1급 skip 경로다.
- 라운드 수: 0
- 합치 결론: **Codex 가 이 창의 구현 결정에 의견을 낸 적이 없다.** 사유는 Codex 토큰 만료이며
  사용자 지시(*"CODEX 리뷰를 돌지마"*)로 env 에 고정돼 있다. 게이트 우회가 아니라 입력 부재다.
- YAGNI Triage: (지적 0건 — 리뷰가 실행되지 않았다)
- Deferred to backlog: 0
- Open Questions: 없음. 단 계획서 §Codex Adversarial Review 가 이월한
  *"R1 흡수분이 적대 리뷰로 재검증되지 않았다"* 는 **이 게이트에서도 해소되지 않았다** —
  그 이월의 남은 인수처는 `/mccp:pr` 의 PR-Codex 이고, 그 축도 같은 env 로 접힌다.
- Codex session 참조: 없음 (`classification: disabled`)

> Codex skipped per MCCP_CODEX_DISABLED=1

### 2.5.2 — 이 창의 implement-time 결정 (Codex 가 봤어야 할 목록)

리뷰가 돌지 않았으므로 아래는 **적대 검토를 받지 않은 결정** 목록으로 남긴다.

1. 하네스 `m2.gates.mjs` 의 마크다운 표·프론트매터 파싱 방식 — M1 하네스의 파서 재구현이며
   신규 의존 없이(INV1) Node 표준 모듈만 쓴다.
2. 5중 필터 원장의 표 열 스키마와 `pass`/`fail`/`unknown` 어휘 — 검사 `#6` 이 그 어휘에 결박된다.
3. 사용자 확인 표식의 문자열 형태 — `#6` 이 발행 조건으로 읽는 리터럴.
4. `check5` 의 서브모듈 경로 해석(워크트리 안 `insuniverse-server/` vs 상위 `../../`).
5. `check10` 이 M1 하네스를 자식 프로세스로 부르는 방식과 출력 파싱.

### Security Reviewer

> security-reviewer 미호출 — 이 창의 산출물은 문서(마크다운) · YAML config · 로컬 게이트
> 하네스이며 Phase 2.5.5 가 지정한 보안 민감 영역(auth · crypto · secrets · 입력 검증 ·
> SQL/cmd injection · SSRF · path traversal · 권한 상승) 중 어느 것도 건드리지 않는다.
> 자동 fallback 이 아니라 **트리거 미충족**이므로 `security_skipped` 를 찍지 않는다.

### Design Review

> impeccable 트리거 미충족 — `impeccable-detect --mode implement` 가
> `design_signal=false` · `silent_skip=true` · `reason=no-signal` 을 냈다 (skill 은 가용).
> 렌더링 표면(`.tsx`/`.css`/`.html`)이 이 창의 변경 집합에 없다. receipt 에
> `impeccable_silent_skip=true` 로 정직하게 기록한다. critique 루프 · 3.6 finish 라우팅 ·
> 3.7 grounding 은 전부 no-op 이다.

## 구현 판정 — `02-reverted-policies.md` 발행 보류 (2026-08-25)

계획서 Task 3 은 revert 확정 2건을 사용자 확인 뒤 발행하는 것을 전제했다. 구현 중 5중 필터를
실제로 적용한 결과 **두 건 다 확정 불가**였고, `deprecated[]` 가 0건이면 M1 하네스 `check10` 이
`0건은 통과가 아니다` 로 문서 자체를 거부하므로 이 창에서 그 파일은 생성될 수 없다.

계획서가 재지 않은 축은 필터 1·2 다. G18 은 필터 4·5 만 실측했다.

5축 판정 표의 **정본은 구현 리포트** §발행 보류 판정이다 —
`.claude/PRPs/reports/insuniverse-docs-60-history-deprecated-m2-report.md`. 그 표가 revert 커밋
sha 열과 `state_basis` 인용을 함께 들어 더 완전하다. 여기에 복제본을 두면 두 벌이 각자 표류하므로
(실제로 그랬다 — 이 파일 판에는 revert sha 열이 없었다) 인용만 둔다.

요약: 두 노드 다 **필터 1(env 기본값 off)·2(HEAD 코드 부재)에서 fail** 이고 필터 4·5 만 pass 다.
노드 A 의 정책은 `b2cBypass.slot`(`B2C_BYPASS_SLOT` 기본 `2`)으로 살아 있고
`coocon-bypass.controller.ts` 48 행이 읽는다. 노드 B 는 되돌렸던
`libs/{octover,hyphen,coocon}/*.mapper.ts` 3파일이 동결 HEAD 에 다시 있다 —
`dead-candidates.yaml` 의 `state: absent`(ordering)와 어긋나며, 같은 파일이
*`absent` 는 폐기를 뜻하지 않는다* 로 못 박은 자리의 실례다.

**판정 근거** — 사용자가 판단을 위임했고(2026-08-25), 보류를 골랐다.

1. UI5 가 발행 id 를 불변으로 묶어 오발행 비용이 비대칭이다. PRD §Risks 는 *살아있는 정책을
   폐기로 오판* 의 영향을 **매우 높음** 으로 둔다. 노드 A 의 정책은 HEAD 에서 실행 경로를 갖는다.
2. 발행하려면 PRD·spec 어디에도 없는 규칙 둘을 새로 세워야 한다 — 필터 1·2 의 사정거리와,
   산출물이 없는 축(F3 · F5 참조 카운트)의 `unknown` vs `n/a`. UI9 는 승격을 필터의 **대체가 아니라
   추가 조건**인 사용자 확인 뒤로 두므로, 구현 창이 대신 정할 자리가 아니다.
3. 보류에는 영구 손실이 없다. 인수처는 마일스톤 2b·M7 이며 참조 카운트 축(`11-index-code`)과 함께
   판정한다.

**따라서 이 창의 상태**: PRD M2 Status 는 `pending` 유지 · 발행 차단 이월 2건
(`60m1-sha-unresolvable` · `60m1-adjudication-unproven`)은 **열린 채** 둔다. 두 이월의 해소 기구는
이 창에서 만들어졌지만(하네스 `#5` 의 서브모듈 sha 해석 · `#6` 의 5중 필터 원장 계약) **실 대상이
0건이라 한 번도 실행되지 않았다** — 실행되지 않은 기구로 이월을 닫지 않는다.

계획서 §Acceptance 중 이 판정으로 미충족이 되는 항목은 Phase 5 리포트가 이름으로 열거한다.

## Code Review 흡수 (2026-08-25 · `/mccp:code-review` Local Review Mode)

마지막 커밋 `e8c9c3a`(계획서 · notes · receipt 2종 · 구현 리포트)를 대상으로 돌렸다. 게이트는
전부 초록이었다 — `check-all 10/10` · `verify.sh --check` rc 0 · `lint-plan.mjs` rc 0 ·
Validation 블록 `bash -n` OK · `hash-plan` ↔ receipt `plan_hash` 일치(`bd77a9b9…`, 계획서 본문
무편집 확인). **지적은 전부 산출물의 자기 서술에 있었다.** 7건 전건 판정 — 5건은 수정했고
2건(receipt 축)은 mccp 가 설계로 막아 기록·이월했다.

| 층위 | 지적 | 흡수 |
|---|---|---|
| 2 | 하네스 5검사(`#4`·`#5`·`#6`·`#10`·`#11`)가 계획서 `# 음성:` 을 통과로 뒤집는 `요구 꺼짐` 분기를 갖는데 §Deviations 에 없다 | 리포트 §Deviations 6번째 항목 신설 · backlog `id=60m2-gate-requirement-off` (인수처 2b) |
| 1 | `mccp-implement-codex` receipt 의 `head_sha` 가 `64d2506` — 구현 커밋 `b6cbe8a`(17:25 KST)·`b8a08d1`(18:26)보다 **19분 앞선** 17:06 에 쓰였다. M1 선례는 `head=34baeab` 로 구현 커밋에 전진했다 | **제자리 수정 불가 — 아래 §receipt 두 건은 고칠 수 없다.** 사실을 기록하고 backlog `id=60m2-implement-receipt-pre-dates-code` 로 이월 |
| 2 | `mccp-plan-codex` receipt 가 `findings: []`·`accepted: []` 인데 계획서 §Codex Adversarial Review 는 R1 3건 전건 흡수를 적는다. 하류 dedupe(`resolution.accepted`)가 빈 배열이라 F0·F1·F2 가 재제기된다 | **제자리 수정 불가 — 아래 §receipt.** 계획서가 선언한 *Deferred to backlog: 1* 이 실제 backlog 에 없던 것을 함께 기록(`id=60m2-r1-absorb-unverified`) |
| 7 | 리포트 §Acceptance 미충족 목록이 *전부 같은 원인* 으로 완전성을 주장하는데 `M2 Status=complete` 한 건이 빠졌다. 그 항목이 인용한 게이트 `#9` 는 `complete` 를 강제하지도 않는다 | 항목 추가 · 완전성 어휘를 *기계 검사 없음*(INV4)으로 교체 · `#9` 행에 강제 한계 명시 · Task 4 를 `완료` → `부분` |
| 1 | 리포트 §Files Changed 라인 수 4행이 `git show --numstat` 과 다르다. 하네스는 `CREATED` 로만 적혔으나 `b8a08d1` 에서 재편집됐다 | 실측값으로 교체 · 재편집 사실과 `baselineCommit` 무영향을 주석으로 |
| 3 | 하네스가 `#12` 를 발행하는데 계획서 Validation 블록에 `# 검사 #12:` 가 없다 (CLAUDE.md §1 — Gate 번호는 Validation 블록 검사 번호) | 집계행에서 번호 제거 — `check-all ok  10/10 …` |
| — | 5축 판정 표가 notes·report 두 벌 | 정본을 리포트로 두고 이 파일은 인용만 |

**계획서 본문은 한 바이트도 손대지 않았다.** 흡수 산출물은 리포트 · 이 notes · backlog 3행 ·
하네스 집계행 2행이다. receipt 2종은 손대지 못했다(아래). 흡수 뒤 `check-all` 재실행 rc 0.

### receipt 두 건은 고칠 수 없다 — 시도와 거부 사유

리뷰가 낸 receipt 결함 2건은 **mccp 가 설계로 막는다.** 1번은 실행해 거부 문면을 받았고, 2번은
`write.js#stampIntentDecision` 통독으로 확인했다(실행하면 `incomplete` 가 봉인되므로 일부러 안
돌렸다). 두 거부 다 정당하므로 우회하지 않는다(B1 — mccp 파일을 고치지 않는다).

1. `mccp-implement-codex` `head_sha` 전진 — `cli.js write` 재발행이 거부됐다:

   > `refusing to overwrite git-tracked receipt with a different hash`
   > `(disk=sha256:de4d028627319… new=sha256:7758aa0f82779…). A tracked ship receipt is an`
   > `audit-binding anchor (E4) … use a NEW decision slug`

   새 슬러그로 재발행하면 체인 슬러그가 `…-m2` 에서 갈라져 `/mccp:pr`(브랜치 유도 슬러그)와
   어긋난다 — 고치는 것이 아니라 체인을 하나 더 만드는 것이다. **실 영향은 감사 정확성에 한정된다**:
   `preflight --command mccp:pr` 이 `ok: true` · `stale: []` 을 내므로 하류가 막히지는 않는다
   (경고 1건은 `impeccable_silent_skip` 뿐). 이월: `id=60m2-implement-receipt-pre-dates-code`.

2. `mccp-plan-codex` 에 R1 F0·F1·F2 복원 — `cli.js write` 로는 애초에 불가능하다.
   `mccp-plan-codex` 는 `INTENT_IN_SCOPE_GATES` 유일 원소라 `intentDecision` 없이 쓰면
   `INTENT_GATE_BLOCKED` 로 던지고(`write.js` 266~280 행), `MCCP_SKIP_INTENT_GATE` 우회는
   `intent_gate_verdict=incomplete` 를 **봉인**한다(같은 파일 249~264 행) — 지금의
   `skipped`(정당한 스킵)보다 나쁜 상태다. 지원되는 경로는 `/mccp:plan`
   재실행뿐이고 그것은 계획서 본문을 다시 쓸 위험이 있어 `plan_hash` 앵커와 충돌한다.

   따라서 **R1 3건의 정본은 계획서 §Codex Adversarial Review 본문**이고 receipt 는 그것을 담지
   못한다. 하류 dedupe 가 `resolution.accepted` 를 읽어 아무것도 못 거른다는 사실은 그대로 남는다 —
   PR-Codex 도 `MCCP_CODEX_DISABLED=1` 로 접히므로 지금은 무해하나, Codex 가 가용해지는 첫 창에서
   F0·F1·F2 가 재제기될 수 있다. 이월: `id=60m2-r1-absorb-unverified`.

## main 병합 관측 (2026-08-26 · `origin/main` 41커밋 병합)

`/mccp:pr` 진입 전 `origin/main` 을 **merge** 로 들였다(rebase 금지 — receipt 3종이 `head_sha` 로
결박돼 있어 이력 재작성이 앵커를 끊는다). 충돌 2건, 해소 근거는 아래.

| 파일 | 충돌 | 해소 | 검증 |
|---|---|---|---|
| `docs/_meta/ownership.md` | `60` 위임 행 3개가 양쪽에서 갈림 | HEAD 3행 채택 — main 쪽 2행은 이 창이 `대기(마일스톤 2)` → `완료` 로 전이시킨 구판이고 문면도 `이 위임 5행 자신` → `이 위임 표의 60 행 자신` 으로 6행 전이를 반영해야 한다. main 이 더한 `30`·`20`·`12` 9행은 전건 보존 | 검사 `#3` ok — 위임 표 23행 · `60` 앞 6행 · `60` 밖 17행 보존 · 사유 셀이 기준선 PRD 와 일치 |
| `.claude/plans/codex-findings-backlog.md` | 양쪽이 표 아래에 각각 append | 합집합 — base 8행 + ours 8행 + theirs 28행 = 44행, 손실·중복 0 | `git show :1:/:2:/:3:` 3-way 행수 대조 |

### 하네스 실측 — `check-all` 9/10, 실패는 `#7` 하나

`verify.sh --check` 는 **rc 0** 이다(검사 `#1` ok — 게이트 4종 통과). 즉 병합된 트리에 대해
golden 은 정합이고, 실패한 것은 저장소 상시 게이트가 아니라 이 창의 기준선 대조뿐이다.

`#7` 은 두 방향으로 동시에 떨어진다:

- **기대 밖 4키** — `fixtask.tree_rows_sha256` · `onboarding.comments_sha256` ·
  `onboarding.set_sha256` · `template_config.actors`. 형제 창(`20`·`30`·`40`)이 main 에서 움직인
  키다. `expectedGoldenDelta` 는 `60` 의 입력 4소스만 열거하므로 형제 창 델타를 **구조적으로**
  못 본다 — 기준선 `b6cbe8a` 가 그 병합들보다 앞서기 때문이다.
- **안 움직인 2키** — `fixtask.cohort_count` · `fixtask.cohort_m8`. backlog 평문 행 186→202 를
  근거로 움직임을 예측했으나 golden 은 안 움직였다. 병합이 들여온 16 평문 행이 m8 코호트에
  합류하지 않았다는 뜻이고, `id=60m1-cohort-blind` 가 **표 행**에서 관측한 성질이 **평문 행**
  에서도 성립한다는 새 실측이다(derivation 이 과대예측).

**분모 재지정도 게이트 확장도 하지 않는다.** 봉인된 계획서의 기준선을 병합 뒤로 옮기면 그 창이
막고 있던 자기승인(권한의 근거와 부여를 같은 커밋에 넣는 것)이 함께 풀린다. 선례도 같다 —
30-m1 이 같은 상황을 `744672f`·`3332b22` 에서 원장 적재로만 닫았다. 이월 1행을 backlog 에 적었다.

## 2차 main 병합 관측 (2026-08-26 · PR #24 발행 후)

형제 PR `50-domain M2`(#23)가 main 에 들어와 PR #24 가 `CONFLICTING` 으로 떨어졌다.
`origin/main` 4커밋(`5df0fc9`→`c7341bb`)을 다시 **merge** 로 들였다(`6265919`).

충돌 1건 — `.claude/plans/codex-findings-backlog.md`. 추가 전용 원장이라 합집합이고,
50-m2 2행을 이 창의 `2026-08-26` 관측 행 **앞**에 두어 날짜 순서를 유지했다.
3-way 행수 대조: base 36 + ours 9 + theirs 2 = 47, 손실·중복 0.
`fixtask-projection.mjs digest-set` 코호트 43 = golden 43 불변.

### 하네스 — 1차 병합과 동일

`check-all` **9/10**, 실패는 `#7` 하나, `verify.sh --check` rc 0. 50-m2 는
`docs/30-admin/00-ia.md` 신설과 자기 계획·receipt 뿐이라 `60` 이 보는 golden 키
(`template_config.deferred_ref_targets` · `fixtask.findings_headings` · `index.*`)를
건드리지 않았다. `#7` 의 두 실패 방향과 그 판정은 1차 병합 절과 같다.

### ship receipt 는 stale-head 로 남는다 — 재앵커 불가

`validate --check-ship-verdict` 가 `ship-gate-stale-head` 로 막는다:

> `receipt head_sha 487c078a8119… != current HEAD 62659198aa3e…`
> `(stale receipt for an older commit — the current diff was not reviewed). push blocked.`

재발행을 시도했고 `finalize-receipt` 가 거부했다(exit 1):

> `refusing to overwrite git-tracked receipt with a different hash`
> `(disk=sha256:dc0592502251… new=sha256:3f6ec3a497a8…). A tracked ship receipt is an`
> `audit-binding anchor (E4) … use a NEW decision slug … Overwriting an existing slug is`
> `disallowed until a supersession schema exists (Out of Scope).`

**새 슬러그로 재앵커하지 않는다.** 그것은 `-m2` 체인을 갈라 plan·implement receipt 와의
결속을 끊는 일이고, 고치는 것이 아니라 두 번째 체인을 만드는 것이다. 거부 문면 자신이
supersession 스키마 부재를 *Out of Scope* 로 적고 있다 — 우회 대상이 아니라 상류 결함이다.

살아 있는 제약은 하나다: 이 receipt 가 증명하는 diff 는 `487c078` 시점의 것이고, 2차 병합이
들여온 9파일은 게이트가 보지 않은 델타다. 그 9파일은 전부 형제 창(50-m2) 산출이라 이 PR 의
리뷰 표면도 아니다. 이월 1행을 backlog 에 적었다.
