# Notes: 60 · 연혁 + 폐기 정본 — 마일스톤 2 종료 (revert 축 비발행 확정)

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

## Codex Implementation Review

- 호출: `node .../scripts/lib/codex-invoke.js adversarial-review` — `classification: disabled`
  로 spawn 전 short-circuit (`{"ok":true,"classification":"disabled","blocking":false}`).
  2.5.0 정책 봉인이 `.git/worktrees/60-history-deprecated/mccp/tmp/codex-policy.json` 에
  `codex_disabled=true` 로 박혀 있다.
- 라운드 수: 0
- 합치 결론: **없음.** Codex 가 이 창의 구현 결정에 의견을 낸 적이 없다. `MCCP_CODEX_DISABLED=1`
  은 `~/.claude/settings.json` `env` 의 영구 운영자 정책이며 게이트 우회가 아니라 입력 부재다.
- YAGNI Triage: 대상 0건 — 판정할 finding 이 없다.
- Deferred to backlog: 0
- Open Questions: 없음 (auto-CRITICAL 대상 0건). 단 계획서 §Codex Adversarial Review 가 남긴
  *"이 계획서는 적대 리뷰로 검증되지 않았다"* 는 **이 게이트에서도 해소되지 않는다** — plan 축과
  implement 축이 같은 env 정책으로 함께 접혔다. `codex_verdict=skipped` 이므로 교차 게이트
  dedupe 가 fail-closed 로 닫히고 `/mccp:pr` 의 PR-Codex 가 그대로 돈다(그 축도 같은 env 로
  접힌다).
- Codex session 참조: 없음

> Codex skipped per MCCP_CODEX_DISABLED=1

### 2.5.1 — 교차 게이트 dedupe 미적용 사유

`## Codex Adversarial Review` 절은 계획서에 있으나 그 절의 `합치 결론` 이 **`없음`** 이다.
수렴한 decision-set 이 존재하지 않으므로 dedupe 의 전제(*"plan 축에서 이미 수렴했다"*)가
성립하지 않는다. dedupe 를 적으면 *리뷰 0라운드* 를 *리뷰 완료* 로 위장하게 된다. 적용하지 않는다.

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

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

1. 하네스를 `m2c.gates.mjs` 단일 파일 12서브커맨드로 둔다 — 형제 창(`m1`·`m2`·`m2b`·`m3`)의
   형식이며 신규 의존 0(INV1), Node 표준 모듈만 쓴다.
2. 비발행 선언 토큰을 `발행하지 않는다` 문자열로 잡되 **단독으로는 방향을 뒤집지 않는다** —
   `2r` 행 `complete` 를 함께 문다(`#3`). 층위 6 잔여는 계획서 §Risks 가 인정한 그대로이고
   이월 `60m2c-nonpublish-token-surface` 로 올린다.
3. 형제 하네스 3곳(`m1`·`m2b`·`m3`) 갱신을 **단언 이동**으로 한다 — 기대값만 전이 후 상태로
   옮기고 어긋난 사본이 여전히 거부되는지를 `#5`·`#6` 이 반사실로 본다. 삭제가 아니다.
4. 프로브는 **사본으로만** 돈다. 실 PRD·실 하네스를 건드리는 프로브를 두지 않는다 — 임시
   디렉터리에 원본을 복사하고 치환한 뒤 그 사본을 `node` 로 돌린다. `die` 가 `finally` 를
   건너뛰는 함정은 TEMPS 등록부 + `process.on("exit")` sweep 으로 닫는다.
5. `#7` 체인의 각 하네스 검사 수를 **그 하네스의 `--help` 에서 유도**한다. 리터럴 기대치를 두면
   INV4 위반이고, 형제 하네스가 검사를 늘려도 이 창이 모른 채 초록이 된다.
6. `#10` golden 은 변동 **키 수**와 `docs/**` 변경 **파일 수**를 둘 다 0으로 본다. 0건이 정상인
   검사라 `grep -c` 종료코드가 아니라 카운트를 캡처해 비교한다.
7. `#12` tally 는 계수가 아니라 **번호 집합**으로 완주를 본다 — 같은 검사를 두 번 돌려도 계수는
   맞는다.
8. 기준선 앵커는 Task 0 단독 커밋(`git log --diff-filter=A -- <하네스>`)에서 읽는다 — 같은 창
   자기승인 차단. 그 앵커가 변경 창 안이라는 잔여는 m3 창의 `60m3-anchor` 와 같은 성질이며
   이 창도 같은 형태로 이월한다.

### Security Reviewer

> security-reviewer 미호출 — 이 창의 산출물은 PRD(마크다운) · backlog · 로컬 게이트 하네스
> (`.mjs`)이며 Phase 2.5.5 가 지정한 보안 민감 영역(auth · crypto · secrets · 입력 검증 ·
> SQL/cmd injection · SSRF · path traversal · 권한 상승) 중 어느 것도 건드리지 않는다. 하네스가
> 부르는 git 은 전부 `execFileSync` 배열 인자이고 입력은 저장소 안 추적 파일뿐이다. 네트워크
> 호출 0 · 자격증명 0 · 사용자 입력 경로 0. 조건이 성립하지 않아 호출하지 않은 것이므로
> `security_skipped` 를 스탬프하지 않는다(그 필드는 *호출했어야 하는데 못 했다* 를 뜻한다).

### Design Review

> impeccable 트리거 미발화 — `impeccable-detect.js detect --mode implement` 가
> `{skill_available:true, design_signal:false, silent_skip:true, silent_skip_reason:"no-signal"}`
> 를 냈다. 이 창은 `.tsx/.jsx/.css/.html` 을 한 파일도 안 건드리고 `.claude/design/*.design.plan.md`
> 도 없다. receipt 에 `impeccable_silent_skip=true reason=no-signal` 로 정직하게 기록한다.
> 트리거가 안 섰으므로 2.5.5c 방향 캡처도 없고 Phase 3.6·3.7 은 통째로 no-op 이다.

## 적대 리뷰 0라운드 — 이 창의 사실 기록

계획서 Acceptance 마지막 항목(*"이 창이 적대 리뷰를 0라운드 받았다는 사실이 산출물에 기록된다"*)의
산출물이 이 절이다.

| 축 | 상태 | 사유 |
|---|---|---|
| Plan-Codex | 0라운드 | `MCCP_CODEX_DISABLED=1` 전역 정책 — spawn 전 short-circuit |
| Implement-Codex | 0라운드 | 같은 정책. 이 게이트의 `classification=disabled` |
| L2 패널 (multi-agent) | 미실행 | `MCCP_PLAN_REVIEW=multi-agent` 오라클은 패널을 냈으나 이 세션은 Agent·Workflow 호출 금지 |
| santa-loop | 미실행 | 같은 사유 (Agent 툴) |
| PR-Codex | 예정 미실행 | 같은 전역 정책 |

**해소 경로**: 전역 `MCCP_CODEX_DISABLED` 를 끄거나 Agent 호출을 허가해 `/mccp:santa-loop` 를
별도로 돌린다. UI6 이 *"claude 판단으로 진행, 전역 설정을 대신 바꾸지 않는다"* 이므로 이 창은
사실만 기록하고 넘어간다.

## 구현 기록

### 계획서 전제 정정 — Task 6 / 게이트 `#7`

**착수 전 실측**(이 창이 한 파일도 안 건드린 시점, 2026-08-28):

| 하네스 | 결과 | 붉은 검사 |
|---|---|---|
| m1 | 5/10 | `verify.sh(rc 2)` `check1` `check3` `check4` `check6` `check7` |
| m2 | 9/10 | `check7` |
| m2b | 7/10 | `findings` `golden` `tally` |
| m3 | 13/13 | — |

계획서 Task 6 Action · 검사 `#7` 술어 · Acceptance 한 줄은 *"네 하네스가 전건 rc 0"* 을
요구한다. **그 전제가 착수 전부터 거짓이었다.** 원인은 전부 이 창 밖이며 두 건은 저장소
backlog 가 이미 **영구 · 위임 밖**으로 기록해 두었다:

- `60m3-m1-bootstrap-expired` — 형제 PRD(`20`·`30`·`50`) 착수로 `verify.sh --check --bootstrap`
  이 rc 2 즉시 거부가 됐다. m1 `check1`·`check12` 가 그것을 부른다.
- `60m3-m1check6-deferred-residual` — M2 가 `deferred_ref_targets` 를 정당하게 재지정해 M1
  기준선과 영구히 다르다. **그 행은 "닫으면 m3 `#11`(a) 가 붉어진다" 고 못 박고 있다.**
- 나머지(m1 `check3`·`check4`·`check7` · m2 `check7` · m2b `findings`·`golden`·`tally`)는
  후행 창이 ownership 표 · findings 표제 · golden 을 움직인 결과다.

도달하려면 이 계획서 §NOT Building 이 금지한 일(`docs/_meta` 개정 · golden 재동결 · ownership
수정)을 해야 한다. **사용자에게 세 선택지를 제시했고 "귀속 검사로 구현" 을 선택받았다.**

그래서 `#7` 은 회귀가 아니라 **귀속**을 판정한다:

1. 각 하네스의 검사 총수 == 그 하네스의 `--help` 유도값 (리터럴 금지 · INV4)
2. 현재 실패 집합 == Task 0 커밋 blob 에 동결된 기준선 실패 집합 — **양방향**이다. 늘어도
   (신규 붉음) 줄어도(기준선이 낡음) 떨어진다
3. 이 창이 방향을 뒤집은 4검사(`m1:check10` `m2:check10` `m2b:prd` `m3:prd`)는 실패 집합에
   있으면 안 된다 — 수술이 실제로 들었는지는 그 넷이 진다

기준선 집합은 `CHAIN_BASELINE` 상수이고 `#7` 이 그것을 **Task 0 blob 에서 다시 읽어** 워킹트리
값과 대조한다 — 같은 창에서 허용 집합을 넓히려면 새 커밋이 필요하다. 잔여는
`id=60m2c-sibling-harness-baseline-red` 로 이월했다. **계획서 Acceptance 의 해당 1줄은 사실과
다르며 이 절이 그 정정 기록이다.**

### 계획서를 벗어난 그 밖의 구현 판단

| # | 판단 | 사유 |
|---|---|---|
| D1 | `m1 check10` · `m2b prd` · `m3 prd` 셋에 **PRD 경로 인자**를 더했다 | 게이트 `#3`·`#5`·`#6` 이 요구하는 *"어긋난 사본을 여전히 거부한다"* 반사실을 실 파일을 안 건드리고 관측할 유일한 길이다. m2 `check9` 가 이미 쓰는 규약(`process.argv[3] \|\| PRD`)을 그대로 따랐다 |
| D2 | 4방향 프로브의 **발행 축을 합성 맵**으로 돌린다 | 실 트리에 파일을 만들면 `#8`(발행 0건)과 충돌한다. 실 파일 축은 `#4` 가 프로브 파일을 만들고 즉시 지우는 것으로 따로 진다 |
| D3 | 선언 사본 생성을 **양방향**(`withM2Declaration(text, on, …)`)으로 만들었다 | 한 방향만 만들면 전이 전 PRD 에서 프로브가 통째로 죽는다(실측: 첫 판이 `#10 FAIL: M2 행에서 비발행 선언 토큰을 0건 지웠다`) |
| D4 | `#9` 의 backlog 파서를 **앞 3칸 고정 + 나머지 되붙임**으로 썼다 | 범용 표 파서는 죽는다 — 앞 창 행 본문이 이스케이프 안 된 `\|` 를 담는다(실측: `'^#\|^$'` 정규식 인용). 셀 수 엄격 대조는 이 검사를 자기와 무관한 행 하나에 영구히 죽인다 |
| D5 | `#11` 이 `--markers` 를 **수**로 받고 계획서를 **독립 재열거**한다 | 계획서 셸 블록이 `grep -c` 로 수를 넘긴다. 수(외부 기준)와 집합(하네스 재열거)을 둘 다 봐야 한쪽만 맞는 상태가 안 통과한다 |
| D6 | `#7` 의 `check-all` 파서가 **세 접두 형태**를 다 받는다 | m1 은 `#12 FAIL: check-all 5/10`, m2 는 `check-all FAIL: 9/10`, 통과 시 `check-all ok  10/10` 이다. 첫 판은 m2 형태에서 계수 유도에 실패했다(실측). 실패 목록도 `[^)]*` 로 자르면 `verify.sh(rc 2)` 의 자기 괄호에 잘린다 — 닫는 괄호 뒤 `—` 로 끝을 잡고 rc 주석을 먼저 지운다 |

### Task 별 결과

| Task | 산출 | 게이트 |
|---|---|---|
| 0 | `m2c.gates.mjs` 12검사 신설 · 단독 커밋 `03fe2541` | `#11` ok |
| 1 | `m1` `m2PublishedViolations` 방향 반전 · `NONPUBLICATION_TOKEN` 신설 · `2r` 결박 · 4방향 프로브 | `#2` `#3` ok |
| 2 | `m2 check10` 방향 판정 3분기 + 출력에 방향 기재 | `#4` ok |
| 3 | `m2b #4` · `m3 #7` 동결값 `pending`→`complete` (단언 이동) | `#5` `#6` ok |
| 4 | PRD M2 Outcome 개정 + Status `complete` | `#1` ok |
| 5 | backlog 신설 5 · 차단 이월 2건에 미해소 사유 덧붙임 | `#8` `#9` ok |
| 6 | 체인 귀속 + golden 불변 | `#10` ok · `#7` — |
| 7 | closure doc + PRD provenance 스탬프 | (없음) |

## main 병합 관측 (2026-08-28 · `fb404a1`)

`origin/main` 이 merge-base `9d04de1` 에서 `220fc6b` 로 44커밋 전진해 병합했다(rebase 아님 —
receipt 3종이 `head_sha` 결박이다). 병합을 PR 발행보다 **먼저** 둔 것은 backlog `60m2` 행이 관측한
post-PR stale-head(재앵커 불가)를 애초에 만들지 않기 위해서다. 들여온 형제 창 산출은
`20-foundation-access` M4 · `30-contracts-limits` M4 · `40-runtime-vendor-legal` M5 ·
`50-domain` M5 · `70-viewer` M2·M3 이고 `docs/**` 신설 7건이다(`02-access/02-authz-roles` ·
`02-access/03-authz-capabilities` · `03-contracts/04-state-transitions` ·
`07-legal/01-terms-and-agreements` · `07-legal/02-privacy-and-masking` · `07-legal/03-audit` ·
`20-site/00-ia`).

### 충돌 2건 — 둘 다 양측 델타가 직교라 양측 보존

**1) `.claude/plans/codex-findings-backlog.md`.** 양쪽이 같은 표 끝에 행을 덧붙였다 — 이쪽은
m3·m2c 이월 11행, `origin/main` 쪽은 70-viewer M2·M3 지적 10행. 어느 쪽도 상대 행을 고치지
않으므로 **양측 전건을 보존**했고, 배치는 `origin/main` 블록을 앞·이쪽 블록을 뒤로 뒀다(70-m2
창 `3ff555e` 와 같은 배치).

| 축 | 값 |
|---|---|
| merge-base (`9d04de1`) | 표 행 100 |
| 병합 전 이쪽 (`47819be`) | 표 행 111 (그중 이 브랜치 11행) |
| 병합 전 `origin/main` (`220fc6b`) | 표 행 126 (그중 형제 10행) |
| 병합 후 | 표 행 137 = 126 + 11 · 소실 0 |
| 머리행 `Date / Severity / Source plan / Finding` | 255행에 유지 |

**2) `docs/_meta/verify/golden.txt` — 한 행 안에서 두 창의 델타가 겹쳤다.** `fixtask.findings_headings`
한 키에 모든 findings 파일의 표제 수가 공백 구분으로 실려 있어, 이쪽의 `60-history-deprecated 9→12`
(M2b·M3 산출)와 형제 `20-foundation-access 2→3` 이 **같은 물리 행**을 각각 고쳤다. 세 방향
대조로 base 값(`20-foundation-access=2 60-history-deprecated=9`)을 잡고 각 키가 base 에서
움직인 쪽 값을 취해 합쳤다 — 결과 `20-foundation-access=3 … 60-history-deprecated=12`, 즉
**양측 델타 전건 보존**. golden 의 다른 104키는 양쪽 모두 무변동이라 충돌이 이 한 행에 한정됐다
(`diff` 로 3방향 확인 · 각 방향 변동 1행).

재동결(`verify.sh --freeze`)은 하지 않았다. `docs/_meta/verify/**` 슬롯은 `20-foundation-access`
가 쥐고 있고(`ownership.md`), 이 병합은 값을 새로 유도한 것이 아니라 **이미 각 창이 유도해 둔 두
값을 잃지 않고 합친 것**이다.

### 병합 후 하네스 실측 — 형제 4하네스 무변동, m2c 자기 검사 1건 붉음

| 하네스 | 병합 후 | 기준선(m2c `#7` 동결값) | 판정 |
|---|---|---|---|
| m1 `check-all` | 5/10 (붉음 `verify.sh(rc 2)` `check1` `check3` `check4` `check6` `check7`) | 같음 | 무변동 |
| m2 `check-all` | 9/10 (붉음 `check7`) | 같음 | 무변동 |
| m2b | 붉음 {`findings` `golden` `tally`} | 같음 | 무변동 |
| m3 | 13/13 | 같음 | 무변동 |
| m2c | 11/12 — `#10 golden` 붉음 | (자기 검사) | **병합이 뒤집음** |

형제 4하네스의 무변동은 눈으로 센 것이 아니라 **m2c `#7 chain` 이 rc 0** 이라는 실측이다 —
`#7` 은 기준선 실패 집합을 Task 0 커밋 blob 에 동결하고 현재 집합과 양방향 대조한다. 병합이 새
붉음을 만들지 않았다는 판정이 그 한 검사에 들어 있다.

**`#10 golden` 은 이 창의 자기 단언이라 `#7` 의 사정거리 밖이고, 병합이 그것을 뒤집었다.**
`#10` 은 *이 창은 `docs/**` 를 한 파일도 안 건드리므로 golden 변동 키가 **0**이다* 를 요구한다.
병합이 형제 델타 `20-foundation-access=2→3` 을 들여와 변동 키가 1(`fixtask.findings_headings`)이
됐다. 귀속은 두 명령으로 재현된다 — `diff <(git show 47819be:docs/_meta/verify/golden.txt)
<(git show origin/main:docs/_meta/verify/golden.txt)` 가 그 1행이고, 병합 전 이쪽과 병합 후를
토큰 단위로 갈라 보면 차이가 `20-foundation-access` **한 토큰**뿐이다(이쪽 델타
`60-history-deprecated=12` 는 양쪽에서 동일).

**재앵커하지 않는다.** 기준선을 병합 팁으로 옮기면 이 창 자신의 단언(`docs/**` 무변경)까지
기준선에 삼켜져 검사가 공허해지고, 하네스는 `mccp-implement-codex/…-m2c converged` 로 이미
봉인됐다. 이것은 backlog `id=60m2b-merge-reddens-golden` · `id=60m2c-sibling-harness-baseline-red`
가 이미 판정한 부류 — *회귀 기준선을 귀속 기준선으로 바꾸는 창* 이 인수처다 — 의 m2c 판이고,
`#7` 을 귀속으로 구현한 것이 그 판정의 결과다. **새 이월 행을 열지 않는다**: 이 관측은
`60m2c-sibling-harness-baseline-red` 의 사정거리 안이고, backlog 에 행을 더하면 그 행의 slug
문면이 `fixtask.cohort_*` 를 움직여 형제 창의 golden 을 다시 건드린다.
