# notes: 50 · 서비스별 각론 — 마일스톤 10 (축 종료 잔여)

**Plan**: `.claude/plans/insuniverse-docs-50-domain-m10.plan.md`
**Source PRD**: `.claude/prds/insuniverse-docs-50-domain.prd.md`

이 문서는 구현 창의 원장이다. 계획서는 읽기 전용이고 구현 관측·판정·이탈은 전부 여기에 남는다.


## 한도 참조 원장

정책 집합은 `docs/04-limits/**` 프론트매터의 `limits:` 접두 `id` 에서 매 실행 유도한다 — 계획서 리터럴이 아니다.
**적용성을 저자가 고르지 않는다**: 각 정책의 `anchors` 모듈 경로와 마일스톤 8 notes §모듈 배정 원장 이 이 각론
(`docs/10-server/03-subscription-order.md`)에 배정한 모듈 집합을 교차한 것이 적용 집합이다. 검사 `#5` 가 **참조 == 적용** 과 **배제 == 비적용**
두 등식을 각각 차집합 0 양방향으로 문다 — 한 방향만 물면 무관한 정책이 `참조` 로 들어와 장식이 되고 `#6` 이 그
장식으로 `Q21` 을 연다.

**총론 경로에는 쓰지 않는다.** 이 창은 그 정책을 가리키기만 하며 `#5`·`#7` 이 총론 경로 변경 0 을 함께 문다.

| 정책 id | 총론 문서 | 판정 | 좌표 (절 표제 · 강제 지점) | 사유 |
|---|---|---|---|---|
| `limits:money-cap-is-column-width` | `docs/04-limits/01-amounts-and-quotas.md` | 배제 | — | anchors 가 이 각론 소유 모듈(`order`·`product`·`subscribe`)을 담지 않는다. 지는 도메인: 04-settlement-money.md (모듈 `money`) |
| `limits:balance-cap-at-write` | `docs/04-limits/01-amounts-and-quotas.md` | 배제 | — | anchors 가 이 각론 소유 모듈(`order`·`product`·`subscribe`)을 담지 않는다. 지는 도메인: 04-settlement-money.md (모듈 `money`) |
| `limits:charge-floor-three-layers` | `docs/04-limits/01-amounts-and-quotas.md` | 배제 | — | anchors 가 이 각론 소유 모듈(`order`·`product`·`subscribe`)을 담지 않는다. 지는 도메인: 04-settlement-money.md (모듈 `money`) |
| `limits:age-floor` | `docs/04-limits/01-amounts-and-quotas.md` | 배제 | — | anchors 가 이 각론 소유 모듈(`order`·`product`·`subscribe`)을 담지 않는다. 지는 도메인: server 모듈 축 밖 — 앵커 저장소 `insuniverse-server` (`insuniverse-server/apps/api/src/helpers/identity.helper.ts`). 마일스톤 8 모듈 배정 원장은 `insuniverse-server/apps/api/src/modules/**` 만 배정하므로 이 정책은 그 원장의 사정거리 밖이고 이 각론이 질 수 없다 |
| `limits:attachment-count` | `docs/04-limits/01-amounts-and-quotas.md` | 배제 | — | anchors 가 이 각론 소유 모듈(`order`·`product`·`subscribe`)을 담지 않는다. 지는 도메인: server 모듈 축 밖 — 앵커 저장소 `insuniverse-site` (`insuniverse-site/front/src/pages/board/upsert/UpsertBoardPage.tsx` · `insuniverse-site/front/src/pages/loss/UpsertLossPage.tsx`). 마일스톤 8 모듈 배정 원장은 `insuniverse-server/apps/api/src/modules/**` 만 배정하므로 이 정책은 그 원장의 사정거리 밖이고 이 각론이 질 수 없다 |
| `limits:certify-window-triplet` | `docs/04-limits/02-ttl-and-timeouts.md` | 배제 | — | anchors 가 이 각론 소유 모듈(`order`·`product`·`subscribe`)을 담지 않는다. 지는 도메인: 02-treat.md (모듈 `treat`) |
| `limits:dispatch-stage-windows` | `docs/04-limits/02-ttl-and-timeouts.md` | 배제 | — | anchors 가 이 각론 소유 모듈(`order`·`product`·`subscribe`)을 담지 않는다. 지는 도메인: 02-treat.md (모듈 `treat`) |
| `limits:queue-two-liveness-windows` | `docs/04-limits/02-ttl-and-timeouts.md` | 배제 | — | anchors 가 이 각론 소유 모듈(`order`·`product`·`subscribe`)을 담지 않는다. 지는 도메인: 02-treat.md (모듈 `treat`) |
| `limits:provider-setting-cache-window` | `docs/04-limits/02-ttl-and-timeouts.md` | 배제 | — | anchors 가 이 각론 소유 모듈(`order`·`product`·`subscribe`)을 담지 않는다. 지는 도메인: 02-treat.md (모듈 `treat`) |
| `limits:vendor-timeout-table-is-reference-only` | `docs/04-limits/02-ttl-and-timeouts.md` | 배제 | — | anchors 가 이 각론 소유 모듈(`order`·`product`·`subscribe`)을 담지 않는다. 지는 도메인: 02-treat.md (모듈 `treat-test`) |
| `limits:admin-view-window-default` | `docs/04-limits/02-ttl-and-timeouts.md` | 배제 | — | anchors 가 이 각론 소유 모듈(`order`·`product`·`subscribe`)을 담지 않는다. 지는 도메인: 총론 docs/02-access/05-admin-view-token.md (모듈 `admin-view-token`) |
| `limits:monitor-cache-windows` | `docs/04-limits/02-ttl-and-timeouts.md` | 배제 | — | anchors 가 이 각론 소유 모듈(`order`·`product`·`subscribe`)을 담지 않는다. 지는 도메인: 02-treat.md (모듈 `treat`) |
| `limits:bulk-write-chunking` | `docs/04-limits/03-rate-limits-and-batch.md` | 참조 | ORDER_TWO_LAYERS · 강제 지점 (개발) | anchors 가 이 각론 소유 모듈 `order` 을 담는다 — `insuniverse-server/apps/api/src/modules/order/order-detail/order-detail.service.ts`. 강제 지점 절의 `ORDER_TWO_LAYERS` 아래에 링크로 싣고 본문을 옮겨 적지 않는다 |
| `limits:client-poll-cadence` | `docs/04-limits/03-rate-limits-and-batch.md` | 배제 | — | anchors 가 이 각론 소유 모듈(`order`·`product`·`subscribe`)을 담지 않는다. 지는 도메인: server 모듈 축 밖 — 앵커 저장소 `insuniverse-site` (`insuniverse-site/front/src/pages/alimTalk/B2cQueuePage.tsx` · `insuniverse-site/front/src/pages/alimTalk/QueuePage.tsx`). 마일스톤 8 모듈 배정 원장은 `insuniverse-server/apps/api/src/modules/**` 만 배정하므로 이 정책은 그 원장의 사정거리 밖이고 이 각론이 질 수 없다 |
| `limits:certify-throttle-fails-open` | `docs/04-limits/03-rate-limits-and-batch.md` | 배제 | — | anchors 가 이 각론 소유 모듈(`order`·`product`·`subscribe`)을 담지 않는다. 지는 도메인: 02-treat.md (모듈 `treat`) |
| `limits:provider-pool-budget-shape` | `docs/04-limits/03-rate-limits-and-batch.md` | 배제 | — | anchors 가 이 각론 소유 모듈(`order`·`product`·`subscribe`)을 담지 않는다. 지는 도메인: 02-treat.md (모듈 `treat`) |
| `limits:subscription-batch-is-serial` | `docs/04-limits/03-rate-limits-and-batch.md` | 배제 | — | anchors 가 이 각론 소유 모듈(`order`·`product`·`subscribe`)을 담지 않는다. 지는 도메인: 05-agency-corp.md (모듈 `fc`) |
| `limits:car-canary-flow-cap` | `docs/04-limits/03-rate-limits-and-batch.md` | 배제 | — | anchors 가 이 각론 소유 모듈(`order`·`product`·`subscribe`)을 담지 않는다. 지는 도메인: 02-treat.md (모듈 `treat`) |
| `limits:client-retry-caps` | `docs/04-limits/03-rate-limits-and-batch.md` | 배제 | — | anchors 가 이 각론 소유 모듈(`order`·`product`·`subscribe`)을 담지 않는다. 지는 도메인: server 모듈 축 밖 — 앵커 저장소 `insuniverse-site` (`insuniverse-site/front/src/pages/alimTalk/QueuePage.tsx` · `insuniverse-site/front/src/pages/alimTalk/Step2Page.tsx`). 마일스톤 8 모듈 배정 원장은 `insuniverse-server/apps/api/src/modules/**` 만 배정하므로 이 정책은 그 원장의 사정거리 밖이고 이 각론이 질 수 없다 |

## 온보딩 재판정 원장

질문 집합은 `docs/_meta/onboarding-questions.yaml` 에서 `owner` 가 이 PRD 인 레코드로 매 실행 유도한다.
마일스톤 9 의 표는 **고치지 않고** 이 창 원장으로 반입해 재확인했다(계획서 관측 5) — 마일스톤 9 의 표는 그 창
시점의 기록이고 봉인이라 손대지 않는다.

**이 표가 현재 정본이다.** `#6` 이 이 표의 digest 를 유도해 출력하고 `#8` 이 `단독 온보딩 성립` 축의 긍정
레코드에 그 결박을 요구한다 — 결박이 없으면 옛 판정 위에서 축이 닫힌다.

**미성립 0 을 요구하지 않는다.** 요구하면 얕은 답이 성립으로 올라온다. 대신 숨길 수 없게 한다 — 미성립 행은
사유와 이월 id 가 필수이고 그 id 가 backlog 실행 행으로 resolve 되며 `onboarding_unmet_ids ⊆ new_backlog_ids` 다.

| 질문 id | 답이 있는 문서 | 좌표 | 판정 | m9 판정 | 이월 id | 사유 |
|---|---|---|---|---|---|---|
| Q20 | `docs/10-server/02-treat.md` | TREAT_COLLECT_DISPATCH · 강제 지점 (개발) | 미성립 | 미성립 | `50m10-onboarding-unmet-server` | 유지 — 마일스톤 9 판정을 반입해 재확인했고 사유가 그대로다. 완료 이후 팬아웃의 모듈 순서는 ANALYSIS_COMPLETION_FANOUT 이 답하나 요청 진입부터 수집 개시까지의 모듈 관여 순서를 잇는 서술이 8종 어디에도 없다. 마일스톤 9 재확인에서도 같다 |
| Q21 | `docs/10-server/03-subscription-order.md` | ORDER_TWO_LAYERS · 강제 지점 (개발) | 성립 | 미성립 | — | **뒤집는다 (미성립 → 성립).** 마일스톤 9 의 미성립 사유는 *총론 한도 규칙의 도메인 적용 자리가 서술되지 않는다* 였다. 이 창이 `#5` 의 기계 유도로 이 각론에 걸리는 총론 한도 정책을 가렸고(정책 `anchors` 의 모듈 경로 ∩ 마일스톤 8 모듈 배정 원장의 이 문서 소유 모듈), 적용으로 나온 `limits:bulk-write-chunking` 을 `ORDER_TWO_LAYERS` 의 강제 지점 절에 **참조형으로** 실었다. 그 정책의 이 도메인 강제 좌표는 `insuniverse-server/apps/api/src/modules/order/order-detail/order-detail.service.ts:115` 와 같은 파일 `:195` 다. 두 절 각각의 좌표와 정책 참조는 §Q21 절 원장 이 진다 — 한 절이라도 비면 미성립으로 유지한다. |
| Q22 | `docs/20-site/02-alimtalk-certify.md` | alimtalk-certify-steps · 흐름 | 성립 | 성립 | — | 유지 — 마일스톤 9 판정을 반입해 재확인했고 좌표가 현재 바이트에서 그대로 해석된다 |
| Q23 | `docs/20-site/01-analysis-flow.md` | analysis-result-view · 플랫폼 차이 (웹 / 웹뷰) | 성립 | 성립 | — | 유지 — 마일스톤 9 판정을 반입해 재확인했고 좌표가 현재 바이트에서 그대로 해석된다 |
| Q24 | `docs/30-admin/01-admin-console.md` | admin-console-session-entry · 흐름 목록 | 성립 | 성립 | — | 유지 — 마일스톤 9 판정을 반입해 재확인했고 좌표가 현재 바이트에서 그대로 해석된다 |
| Q25 | `docs/30-admin/02-corp-console.md` | corp-console-session-entry · 흐름 | 성립 | 성립 | — | 유지 — 마일스톤 9 판정을 반입해 재확인했고 좌표가 현재 바이트에서 그대로 해석된다 |
| Q29 | `docs/20-site/01-analysis-flow.md` | analysis-request · 흐름 | 미성립 | 미성립 | `50m10-onboarding-unmet-site` | 유지 — 마일스톤 9 판정을 반입해 재확인했고 사유가 그대로다. site 각론에 진료분석 슬롯 축 자체가 없다. analysis-request 의 실패·이탈 표가 세는 것은 구독 판정 거짓과 기관 API 사용중지 둘이고 접수와 결과 사이의 서버 상태는 그 흐름이 판정하지 않는다고 본문이 명시한다 |
| Q34 | `docs/10-server/02-treat.md` | ANALYSIS_COMPLETION_FANOUT · 강제 지점 (개발) | 성립 | 성립 | — | 유지 — 마일스톤 9 판정을 반입해 재확인했고 좌표가 현재 바이트에서 그대로 해석된다 |
| Q35 | `docs/10-server/03-subscription-order.md` | SUBSCRIPTION_POST_PAYMENT_ATOMICITY · 강제 지점 (개발) | 성립 | 성립 | — | 유지 — 마일스톤 9 판정을 반입해 재확인했고 좌표가 현재 바이트에서 그대로 해석된다 |
| Q36 | `docs/20-site/02-alimtalk-certify.md` | alimtalk-certify-steps · 흐름 | 미성립 | 미성립 | `50m10-onboarding-unmet-site` | 유지 — 마일스톤 9 판정을 반입해 재확인했고 사유가 그대로다. 그 흐름의 unknown_reason 이 인증을 끝내지 않고 화면을 닫았을 때 서버에 남는 상태를 미상으로 둔다. 그 답은 server 각론에 있고 site 질문이 그것을 좌표로 쓰면 지표 판정 규칙이 FAIL 로 정한다 |
| Q39 | `docs/30-admin/05-treat-monitoring.md` | treat-monitor-view-token · 흐름 | 성립 | 성립 | — | 유지 — 마일스톤 9 판정을 반입해 재확인했고 좌표가 현재 바이트에서 그대로 해석된다 |
| Q41 | `docs/20-site/04-mypage-account.md` | account-signin · 플랫폼 차이 (웹 / 웹뷰) | 성립 | 성립 | — | 유지 — 마일스톤 9 판정을 반입해 재확인했고 좌표가 현재 바이트에서 그대로 해석된다 |
| Q42 | `docs/30-admin/04-authority-management.md` | authority-menu-distribution · 흐름 | 성립 | 성립 | — | 유지 — 마일스톤 9 판정을 반입해 재확인했고 좌표가 현재 바이트에서 그대로 해석된다 |
| Q43 | `docs/30-admin/04-authority-management.md` | authority-api-exposure · 흐름 | 성립 | 성립 | — | 유지 — 마일스톤 9 판정을 반입해 재확인했고 좌표가 현재 바이트에서 그대로 해석된다 |
| Q44 | `docs/30-admin/04-authority-management.md` | authority-session-propagation · 흐름 | 성립 | 성립 | — | 유지 — 마일스톤 9 판정을 반입해 재확인했고 좌표가 현재 바이트에서 그대로 해석된다 |
| Q46 | `docs/30-admin/05-treat-monitoring.md` | treat-monitor-reprocess · 흐름 | 미성립 | 미성립 | `50m10-onboarding-unmet-admin` | 유지 — 마일스톤 9 판정을 반입해 재확인했고 사유가 그대로다. 재시도 상한·벤더 재조회 비용·사용자 재통지 셋을 그 흐름이 코드로 답하지 못했다고 본문이 명시한다. 재처리 경로 자체의 부재도 부재 증명이 아니라 두 모듈 데코레이터 조회의 관측으로만 적혀 있다 |
| Q47 | `docs/30-admin/05-treat-monitoring.md` | treat-monitor-failure-list · 흐름 | 성립 | 성립 | — | 유지 — 마일스톤 9 판정을 반입해 재확인했고 좌표가 현재 바이트에서 그대로 해석된다 |
| Q49 | `docs/30-admin/01-admin-console.md` | admin-console-payment-reconcile · 흐름 | 미성립 | 미성립 | `50m10-onboarding-unmet-admin` | 유지 — 마일스톤 9 판정을 반입해 재확인했고 사유가 그대로다. 개발자 개입이 필요한 지점은 환불 컨트롤러 전체 주석으로 특정됐으나 질문이 함께 묻는 연락 경로를 이 문서가 알지 못한다고 명시한다 |
| Q50 | `docs/30-admin/01-admin-console.md` | admin-console-bulk-operation · 흐름 | 미성립 | 미성립 | `50m10-onboarding-unmet-admin` | 유지 — 마일스톤 9 판정을 반입해 재확인했고 사유가 그대로다. 부분 실패의 표시 지점을 확정하지 못했고 실패분만 골라 다시 돌리는 수단이 있는지도 코드 경로로 답하지 못했다고 본문이 명시한다 |
| Q51 | `docs/30-admin/01-admin-console.md` | admin-console-settlement-adjust · 흐름 | 미성립 | 미성립 | `50m10-onboarding-unmet-admin` | 유지 — 마일스톤 9 판정을 반입해 재확인했고 사유가 그대로다. 확정 취소와 재확정은 답해지나 누가 언제 무엇을 바꿨는지는 답하지 못한다고 본문이 명시한다. 감사 어휘 3종 검색이 파일 0건이며 그것을 부재 증명으로 적지 않았다 |
| Q53 | `docs/30-admin/01-admin-console.md` | admin-console-member-lifecycle · 흐름 | 미성립 | 미성립 | `50m10-onboarding-unmet-admin` | 유지 — 마일스톤 9 판정을 반입해 재확인했고 사유가 그대로다. 정지의 분석·구독·결제 연쇄와 해제 시 원상 복구 범위를 코드 정독으로 확정하지 못해 미상 행으로 남겼다고 본문이 명시한다 |
| Q54 | `docs/30-admin/01-admin-console.md` | admin-console-concurrent-write · 흐름 | 미성립 | 미성립 | `50m10-onboarding-unmet-admin` | 유지 — 마일스톤 9 판정을 반입해 재확인했고 사유가 그대로다. 머니 두 경로는 행 잠금으로 답해지나 그 밖의 관리자 쓰기 경로에서는 잠금 관측이 없고 충돌 통지 여부를 판정하지 않았다고 본문이 명시한다 |
| Q55 | `docs/30-admin/01-admin-console.md` | admin-console-data-correction · 흐름 | 미성립 | 미성립 | `50m10-onboarding-unmet-admin` | 유지 — 마일스톤 9 판정을 반입해 재확인했고 사유가 그대로다. 고칠 수 있는 범위는 기준 데이터로 특정됐으나 그 수정이 사용자 노출값과 정산·통계에 각각 언제 반영되는지를 답하지 못한다고 본문이 명시한다 |

onboarding_digest: `439dcb5cb0c255e0ac09c368ee9d9a78a17569ad71342a7d73c98484be2e223a`

## Q21 절 원장

`Q21` 은 **두 절**을 묻는다 — 구독·주문·정산이 server 에서 어떻게 연결되는가, 그리고 이 도메인에서 총론의 한도
규칙이 실제로 어떻게 적용되는가. 한 절이라도 좌표나 정책 참조가 비면 `Q21` 은 **미성립으로 유지**된다.
`#6` 이 절 키 집합을 양방향으로 대조하고, 절의 정책 참조 집합이 `#5` 가 유도한 적용 정책 집합과 차집합 0
양방향임을 함께 문다.

| 절 키 | 좌표 (`docs/10-server/03-subscription-order.md`) | 정책 참조 | 사유 |
|---|---|---|---|
| 구독·주문·정산 연결 | SUBSCRIPTION_POST_PAYMENT_ATOMICITY · 강제 지점 (개발) | `../03-contracts/04-state-transitions.md#state:subscription-lifecycle` (총론 계약 · 한도 정책 아님) | 개인·기업 두 경로의 원자성 차이와 결제 승인 뒤 잔여 상태가 그 절에 좌표로 서 있다. 정산 쪽 연결은 적립·알림톡의 개별 흡수 자리 둘이 같은 절에서 좌표를 갖는다. 이 절이 무는 것은 상태 전이 계약이지 한도 정책이 아니므로 `limits:` id 를 담지 않는다 |
| 한도 강제 지점 | ORDER_TWO_LAYERS · 강제 지점 (개발) | `limits:bulk-write-chunking` | `#5` 가 유도한 적용 정책 전건이 이 절에 참조형으로 선다. 이 도메인의 강제 좌표는 `insuniverse-server/apps/api/src/modules/order/order-detail/order-detail.service.ts:115` 와 같은 파일 `:195` 이며 그 정책의 `anchors` 가 두 좌표를 담는다 |

## 인수 판정 원장

후보는 **앵커 blob** 에서 기계로 유도한다 — 출처 계획서가 이 PRD 축이면서 판정 접미가 없는 행 전건이며 문면 해석을
쓰지 않는다. 워킹트리를 보면 이 창이 다는 접미가 후보를 지워 비교가 비멱등해진다. 한 id 가 여러 행을 덮는 경우가
실재하므로 키는 **행 단위**이고 같은 id 의 두 번째 이후 출현에 blob 안 순번(`@n`)이 붙는다.

**인수는 `id=` 를 가진 후보에만 허용한다** — 행 해시 키는 접미를 다는 순간 값이 바뀌어 워킹트리에서 그 행을 다시
찾을 수 없다. 그 사실을 `#10` 이 이름 있는 실패로 문다.

| 후보 키 | 출처 계획서 | 판정 | 사유 |
|---|---|---|---|
| `id=50m2-screen-yaml-divergence` | `.claude/plans/insuniverse-docs-50-domain-m2.plan.md` | 배제 | 배제 — 인수처가 `그 PRD 의 화면 코드 축 재동결 창` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `id=50m2-exits-underivable` | `.claude/plans/insuniverse-docs-50-domain-m2.plan.md` | 배제 | 배제 — 인수처가 `그 경로의 개정 위임을 받은 창 또는 메뉴 트리 전수 열거가 서는 창` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `id=50m3-concurrency-lock-absent` | `.claude/plans/insuniverse-docs-50-domain-m3.plan.md` | 배제 | 배제 — 인수처가 `관리자 쓰기 경로의 동시성 계약을 여는 창` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `id=50m3-audit-log-absent` | `.claude/plans/insuniverse-docs-50-domain-m3.plan.md` | 배제 | 배제 — 인수처가 `감사 로그 계약을 여는 창 또는 운영 DB 스냅샷이 서는 창` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `id=50m3-treat-test-no-roles-guard` | `.claude/plans/insuniverse-docs-50-domain-m3.plan.md` | 배제 | 배제 — 인수처가 `관리자 API 인가 매트릭스를 소유한 창` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `id=50m3-authority-delete-orphan-map` | `.claude/plans/insuniverse-docs-50-domain-m3.plan.md` | 배제 | 배제 — 인수처가 `스키마 제약 대조가 서는 창 또는 관리자 데이터 무결성 계약 창` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `id=50m3-reprocess-endpoint-absent` | `.claude/plans/insuniverse-docs-50-domain-m3.plan.md` | 배제 | 배제 — 인수처가 `실패 회복 계약을 여는 창` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `id=50m3-refund-controller-commented` | `.claude/plans/insuniverse-docs-50-domain-m3.plan.md` | 배제 | 배제 — 인수처가 `사장 후보 판정을 소유한 창` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `id=50m3-admin-jwt-guard-bypass-branches` | `.claude/plans/insuniverse-docs-50-domain-m3.plan.md` | 배제 | 배제 — 인수처가 `관리자 API 인가 매트릭스를 소유한 창` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `id=50m4-round2-pending` | `.claude/plans/insuniverse-docs-50-domain-m4.plan.md` | 배제 | 배제 — 인수처가 `유지보수자 표기 라운드를 여는 창` 다. 이 창은 사람 판정을 쓰지 않는다(UI13) — 그 판정을 받을 자리(`kind:"maintainer-verdict"`)와 그것을 무는 조건부 게이트 `#8` 만 만들었다 |
| `id=50m4-ledger-carrier-substitution` | `.claude/plans/insuniverse-docs-50-domain-m4.plan.md` | 배제 | 배제 — 인수처가 `우산 PRD 지표 문면을 소유한 창` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `id=50m4-prose-claims-unverified` | `.claude/plans/insuniverse-docs-50-domain-m4.plan.md` | 배제 | 배제 — 인수처가 `운영 관측이 서는 창 또는 서술 주장에 좌표를 붙이는 문서 개정 창` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `id=50m4-flow-scoped-code-binding` | `.claude/plans/insuniverse-docs-50-domain-m4.plan.md` | 배제 | 배제 — 인수처가 `흐름 단위 결박을 여는 창` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `id=50m4-m3-harness-red-post-transition` | `.claude/plans/insuniverse-docs-50-domain-m4.plan.md` | 배제 | 배제 — 인수처가 `종료된 마일스톤 하네스의 기준선 재지정 규약을 정하는 창` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `id=50m5-dangling-navigate-targets` | `.claude/plans/insuniverse-docs-50-domain-m5.plan.md` | 배제 | 배제 — 인수처가 ``insuniverse-site` 코드를 고치는 창 또는 site 흐름 문서가 이탈을 서술하는 창` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `id=50m5-site-inventory-not-frozen` | `.claude/plans/insuniverse-docs-50-domain-m5.plan.md` | 배제 | 배제 — 인수처가 ``docs/_meta/extraction-manifest.yaml` 과 `docs/_meta/verify/**` 의 개정 위임을 받은 창` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `id=50m5-env-dependent-routes` | `.claude/plans/insuniverse-docs-50-domain-m5.plan.md` | 배제 | 배제 — 인수처가 `빌드 환경변수 집합을 문서화하는 창 또는 배포 설정을 소유한 축` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `id=50m5-prev-harness-scope-set-stale` | `.claude/plans/insuniverse-docs-50-domain-m5.plan.md` | 배제 | 배제 — 인수처가 `종료된 마일스톤 하네스의 기준선 재지정 규약을 정하는 창` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `id=50m5-exits-page-file-scoped` | `.claude/plans/insuniverse-docs-50-domain-m5.plan.md` | 배제 | 배제 — 인수처가 `site 흐름 5종을 쓰는 창(마일스톤 6)` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `row=97f9409d99c4` | `.claude/plans/insuniverse-docs-50-domain-m6.plan.md` | 배제 | 배제 — 인수처가 `관계 축 종료 판정 창 또는 파서 도입을 여는 창` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `row=2101a165dedf` | `.claude/plans/insuniverse-docs-50-domain-m6.plan.md` | 배제 | 배제 — 인수처가 `관계 축 종료 판정 창(`--probe` 도달 경로가 두 축을 함께 본다)` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `row=6701c8a253fe` | `.claude/plans/insuniverse-docs-50-domain-m6.plan.md` | 배제 | 배제 — 인수처가 `유지보수자` 다. 이 창은 사람 판정을 쓰지 않는다(UI13) — 그 판정을 받을 자리(`kind:"maintainer-verdict"`)와 그것을 무는 조건부 게이트 `#8` 만 만들었다 |
| `row=05e3fa54d66a` | `.claude/plans/insuniverse-docs-50-domain-m6.plan.md` | 배제 | 배제 — 인수처가 `(문면 없음)` 라 인수할 대상이 없다. 이 창은 그 사실을 재확인만 하고 새로 소유하지 않는다 |
| `row=cb97d041b2f9` | `.claude/plans/insuniverse-docs-50-domain-m6.plan.md` | 배제 | 배제 — 인수처가 `흐름 문서를 다시 여는 창` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `row=0ecf45d6e276` | `.claude/plans/insuniverse-docs-50-domain-m6.plan.md` | 배제 | 배제 — 인수처가 ``verify.sh` 를 여는 창` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `row=80b83a91d5a0` | `.claude/plans/insuniverse-docs-50-domain-m6.plan.md` | 배제 | 배제 — 인수처가 `(문면 없음)` 라 인수할 대상이 없다. 이 창은 그 사실을 재확인만 하고 새로 소유하지 않는다 |
| `id=50m6-import-scan-named-only` | `.claude/plans/insuniverse-docs-50-domain-m6.plan.md` | 배제 | 배제 — 인수처가 `이탈 전수를 다시 여는 창 또는 관계 축 종료 판정(마일스톤 7)` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `id=50m6-dispatch-stdout-inconsistency` | `.claude/plans/insuniverse-docs-50-domain-m6.plan.md` | 배제 | 배제 — 인수처가 `하네스를 다음 마일스톤으로 옮기며 손보는 창` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `id=50m6-receipt-anchor-drift` | `.claude/plans/insuniverse-docs-50-domain-m6.plan.md` | 배제 | 배제 — 인수처가 `계획서↔receipt 앵커 검사를 게이트로 세우는 창` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `id=50m7-probe-history-out-of-range` | `.claude/plans/insuniverse-docs-50-domain-m7.plan.md` | 배제 | 배제 — 인수처가 `없음 — 기록만` 라 인수할 대상이 없다. 이 창은 그 사실을 재확인만 하고 새로 소유하지 않는다 |
| `id=50m7-relation-freeze-not-repo-gated` | `.claude/plans/insuniverse-docs-50-domain-m7.plan.md` | 배제 | 배제 — 인수처가 `없음 — 기록만` 라 인수할 대상이 없다. 이 창은 그 사실을 재확인만 하고 새로 소유하지 않는다 |
| `id=50m7-onboarding-unmet-seven` | `.claude/plans/insuniverse-docs-50-domain-m7.plan.md` | 배제 | 배제 — 인수처가 `없음 — 기록만` 라 인수할 대상이 없다. 이 창은 그 사실을 재확인만 하고 새로 소유하지 않는다 |
| `id=50m8-modules-40-vs-45` | `.claude/plans/insuniverse-docs-50-domain-m8.plan.md` | 배제 | 배제 — 인수처가 ``docs/00-index.md` 소유 창 또는 `.claude/meta/**` 개정 위임을 받은 창` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `id=50m8-allow-ip-unauthenticated` | `.claude/plans/insuniverse-docs-50-domain-m8.plan.md` | 배제 | 배제 — 인수처가 `사용자 판정` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `id=50m8-medical-download-unauthenticated` | `.claude/plans/insuniverse-docs-50-domain-m8.plan.md` | 배제 | 배제 — 인수처가 `사용자 판정` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `id=50m8-idless-duplication-detector` | `.claude/plans/insuniverse-docs-50-domain-m8.plan.md` | 배제 | 배제 — 인수처가 `탐지기 축을 여는 창` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `id=50m8-verify-silence-refuted` | `.claude/plans/insuniverse-docs-50-domain-m8.plan.md` | 배제 | 배제 — 인수처가 `관측 기록만` 라 인수할 대상이 없다. 이 창은 그 사실을 재확인만 하고 새로 소유하지 않는다 |
| `id=50m9-anchor-ancestry-inverts-after-merge` | `.claude/plans/insuniverse-docs-50-domain-m9.plan.md` | 배제 | 배제 — 인수처가 `종료된 마일스톤 하네스의 기준선 재지정 규약을 정하는 창` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `id=50m9-verify-run-twice-in-check-all` | `.claude/plans/insuniverse-docs-50-domain-m9.plan.md` | 배제 | 배제 — 인수처가 `하네스 실행 비용 규약을 정하는 창` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `id=50m9-site-ia-round1-only` | `.claude/plans/insuniverse-docs-50-domain-m9.plan.md` | 인수 | 인수 — 인수처가 `이 문서의 다음 리뷰 회차를 여는 창` 이고 이 창이 그 회차를 돌렸다. 동결 라우터에서 `원천 → 주장` 방향으로 화면 라우트를 재구성해 반입 집합과 양방향으로 대조했고 `round2_established=true` 로 회차 2 가 섰다(`#4`). 그 회차가 낸 지적(문서 미포착 12종)은 새 이월 행으로 나갔다 |
| `id=50m9-site-onboarding-unmet` | `.claude/plans/insuniverse-docs-50-domain-m9.plan.md` | 배제 | 배제 — 인수처가 `site 흐름 문서를 다시 여는 창 또는 서버 상태 축을 site 문서가 인용하는 규약을 정하는 창` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `id=50m3-onboarding-verdict-deferred` | `.claude/plans/insuniverse-docs-50-domain-m9.plan.md` | 배제 | 배제 — 인수처가 `각 축의 계약을 여는 창들(동시성 `id=50m3-concurrency-lock-absent`` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `id=50m9-limits-policies-unreferenced` | `.claude/plans/insuniverse-docs-50-domain-m9.plan.md` | 배제 | 배제 — 인수처가 `server·site·admin 각론에 한도 참조를 다는 창` 인데 이 창이 연 것은 `Q21` 이 무는 `docs/10-server/03-subscription-order.md` 한 종이다. 그 문서에 걸리는 적용 정책은 `#5` 유도로 `limits:bulk-write-chunking` 하나이며, 나머지 각론 19종의 참조 부재는 그대로 남는다. 소진하지 않았으므로 인수하지 않고, 이 창이 연 범위와 남은 범위를 `id=50m10-limits-reference-covers-one-doc` 로 새로 낸다 |
| `id=50m7-probe-history-out-of-range@2` | `.claude/plans/insuniverse-docs-50-domain-m9.plan.md` | 배제 | 배제 — 인수처가 ``.claude/templates/doc-kit/**` 개정 위임을 받은 창` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |
| `id=50m9-review-convergence-human-pending` | `.claude/plans/insuniverse-docs-50-domain-m9.plan.md` | 배제 | 배제 — 인수처가 `유지보수자` 다. 이 창은 사람 판정을 쓰지 않는다(UI13) — 그 판정을 받을 자리(`kind:"maintainer-verdict"`)와 그것을 무는 조건부 게이트 `#8` 만 만들었다 |
| `id=50m9-verify-doc-prd-count-broken-by-archive` | `.claude/plans/insuniverse-docs-50-domain-m9.plan.md` | 배제 | 배제 — 인수처가 ``docs/_meta/verify/**` 개정 위임을 받은 창` 이고 이 창의 범위(회차 2 기계 회귀 · 한도 총론 참조 · 온보딩 재판정 · 축 종료 잔여) 밖이다. 그 창이 열릴 때 소비한다 |

## 산출 문서 변경 결박 원장

이 창이 여는 산출 문서는 하나이고 그 변경은 **0 이 아니라 결박**을 요구한다 — `#7` 이 이 표와 실제 변경 집합을
양방향으로 대조한다.

| 파일 | 결박 게이트 | 사유 |
|---|---|---|
| `docs/10-server/03-subscription-order.md` | `#5` | 총론 한도 정책 참조 신설. `#5` 가 참조 == 적용 · 배제 == 비적용 두 등식과 참조형(재기술 0)·좌표 해석을 물고, `#6` 이 그 참조를 `Q21` 절 원장에 결박한다. 이 변경이 마일스톤 9 `check3`·`check5` 를 붉히는 것은 계획서 관측 6 의 지정 안이며 `#9` 가 양방향으로 대조한다 |

## 종료 검증 기록

### `#9` 기준선 동결 (Task 7)

**순서는 둘이다**(계획서 Task 7 · R31 F0). 기준선이 없는 첫 실행은 `#9` 가 **측정 모드**로 돌아 deadline 없이
완주하고 벽시계를 낸다. 그 값을 여기 동결한 **뒤** 같은 `check-all` 을 다시 돌려 **정상 모드** 관측을 얻는다.
종료 선언은 두 번째 실행의 것이며 측정 모드 초록으로는 닫히지 않는다.

측정 모드 실측 (2026-09-03 · Task 4 적용 상태 · m9 등록부 17건 전건 실행):

m9-check-all-baseline-sec: 598

`#9` 는 이 값에서 종단간 deadline 을 유도한다(상수 배율은 하네스 `DEADLINE_SLACK`). 값을 flat 상수로 잡지
않는 이유는 관측 8 의 호출 그래프 — `verify.sh` 가 이 창 `#1` · m9 `#1` · m9 앞 창 회귀 → m8 `#1` 세 자리에서
돌고 m7 등록부도 중복 순회되므로 중첩 비용이 환경에 따라 크게 흔들린다. 그 비용은
`id=50m10-check-all-verify-cost-nested` 로 이월돼 있다.

### 정상 모드 관측 (Task 7 · 기준선 동결 뒤)

기준선을 동결한 뒤 계획서 §Validation 펜스를 통째로 다시 돌렸다 — `check1`~`check10` 직접 호출 ·
`check-all` · `lint-plan.mjs` · `--selfprobe` 이며 표식 판정은 파이프가 아니라 히어스트링이다.

| 관측 | 값 |
|---|---|
| 펜스 rc | 0 · 종단간 1019s |
| `#N ok` | `#1`~`#11` 전건 (직접 10 + `check-all` 안 11) |
| `check-all` | `checkall ok 완주 11/11 · 검사별 금지 문자열 위반 0 · checkN 필수 출력행 14/14 실재 · 차집합 0 양방향` |
| `#9` 모드 | **정상 모드 · deadline 1196s** · 종단간 286s(직접) · 276s(`check-all` 안) |
| `--selfprobe` | `selfprobe ok` · 프로브 9건 |
| `lint-plan.mjs` | rc 0 |

**두 모드를 각각 한 번 관찰했다** — 측정 모드(기준선 부재 · deadline 미적용 · 598s)와 정상 모드(deadline 강제).
종료 선언은 정상 모드 관측의 것이다. 측정 모드가 정상 모드보다 두 배 느린 이유는 그 실행이 이 환경에서
형제 워크트리의 무거운 `check-all` 과 CPU 를 나눠 쓴 첫 실행(콜드)이었기 때문이고, deadline 배율이 flat 상수가
아니라 기준선 유도인 이유가 이것이다.

### 붉음 집합 확정 (Task 7)

| 구분 | m9 검사 | 원인 |
|---|---|---|
| 관측 6 지정 | `check3` · `check5` | Task 4 의 `docs/10-server/03-subscription-order.md` 변경 (입력 sha · 재유도) |
| 관측 6 지정 | `check15` · `check16` | 이 창 산출이 그 창 허용집합 밖 · `*Status:` 토큰 이동 |
| 귀속 `window-edit` | `check10` | 같은 문서 변경의 본문 digest 축 — 관측 6 이 빠뜨린 형제 자리 |
| 귀속 `upstream-merge` | `check1` · `check14` | Task 0 병합이 들여온 `golden.txt` 갱신 · 형제 축의 `id=` 없는 행 |

초록 10 · 붉음 7 이고 지정 밖 0 · 지정됐는데 초록 0 이다. 귀속 셋은 전건 술어로 증명됐다 — 증명 문면은 `#9`
출력이 매 실행 다시 낸다. 판정 배경은 §계획서 이탈 기록 D4.

m8·m7 은 m9 의 앞 창 회귀 검사(`check17`) 출력으로 간접 대조했고 **집합 무증가**이며 붉음 전건이 기대 의미
서명과 일치한다.

### 음성 관측 기록 (구현 시 실측)

계획서 각 검사의 `# 음성:` 은 저자가 한 번 돌려 본 관찰의 기록이고 블록이 매번 재현하는 검사가 아니다.
이 창에서 **실제로 관측한** 것만 적는다 — 적지 않은 음성은 관측하지 않았다는 뜻이다.

| 검사 | 입력 | 관측 |
|---|---|---|
| `#2` | `node <gates> nosuchcheck` | `알 수 없는 서브커맨드: nosuchcheck` · rc 1. 양성(`--help` rc 0)이 먼저 섰다 |
| `#4` | 강등 조건 키 셋 각각을 막은 유도 | `round2_established=false` · `round` 미주장 · 판정 축 `기계 재현성 확인` 셋이 함께 났다 (프로브 3건) |
| `#4` | 이탈 대상 센티넬을 화면 id 로 취급 | `뒤집힘 7건`. 이름공간 유도로 갈라 `뒤집힘 0건` 이 됐다 (§D2) |
| `#8` | 미커밋 tracked 변경 | `tracked 청결 위반 3건` · 커밋 후 초록 |
| `#8` | Status 문면에 표에 없는 마일스톤 번호 | `Status 문면의 마일스톤 번호가 표에 없다 — 11` |
| `#9` | Task 4 적용 상태의 m9 등록부 전건 실행 | 첫 실행 `지정 밖 붉음 4건`. 링크 문면 수정으로 둘을 닫고 나머지 둘 + 하나를 귀속 술어로 물었다 (§D4) |
| `#10` | id 가 두 행을 덮는 후보 | `후보 키가 유일하지 않다 (46행 / 45키)`. 행 단위 키로 되돌렸다 (§D5) |
| `#10` | PRD 갱신 표식을 표 행으로 탐색 | `갱신 표식이 0건이다` (정상 갱신인데 파서가 못 봤다 · §D3) |
| `--selfprobe` | 환경 결손 4종 · spawn 3종 · manifest 3종 · 청결 2종 | 프로브 9건 전건이 운영 경로 함수를 호출해 기대한 거부·실패를 냈다 |

## 계획서 이탈 기록

### D1 — 회차 2 의 지적을 흡수하지 않고 이월했다

`#4` 의 `원천 → 주장` 재구성이 `docs/20-site/00-ia.md` 의 미포착 화면 라우트 12종을 냈다. 계획서 `#4` 는
*문서 미포착 <u>건 (전건 흡수 또는 이월)* 로 두 분기를 다 허용하며 이 창은 **이월**을 택했다. 사유 둘:
12종을 채우려면 화면마다 `anchors`·`exits`·`limitations`·`evidence` 를 새로 저작해야 하고 그것은 각론
재저작이며, 그 변경이 마일스톤 9 하네스의 붉음 집합을 계획서 관측 6 의 지정 **넷** 밖으로 넓혀 이 창의 `#9` 가
그 자리에서 죽는다. `id=50m10-round2-ia-doc-missed-screen-routes` 로 나갔다.

### D2 — 이탈 대상 센티넬을 이름공간으로 갈랐다

회차 2 의 `surface-id` 재유도 초판은 이탈 대상이 화면 id 집합에 있는지만 물어 `막다름`·`없음` 같은
*이탈 없음* 표기를 뒤집힘 7건으로 계상했다. 센티넬 어휘를 리터럴 목록으로 두면 그 목록이 늘 때 조용히 뒤집힘이
되므로, **화면 id 집합의 최장 공통 접두**로 이름공간을 유도해 그 밖의 토큰을 센티넬로 가른다. 흡수 전 같은
입력이 `뒤집힘 7건` 을, 흡수 후 `뒤집힘 0건` 을 냈다 — 반사실을 여기 남긴다.

### D3 — `#10` 의 PRD Open Question 표식을 표 행이 아니라 절에서 센다

초판은 갱신 표식을 파이프 표 행(`^\|.*마일스톤 10 실측`)으로 찾았는데 이 PRD 의 §Open Questions 는 체크박스
목록이라 정상 갱신을 0건으로 읽었다. 절을 잘라 `- [ ]` 행에서 센다. 흡수 전 같은 입력이 `갱신 표식이 0건이다` 를
냈다.

### D4 — 관측 6 의 붉음 지정 넷이 실집합보다 좁았다. 예고를 넓히지 않고 **귀속 술어**로 물었다

계획서 Task 7 이 요구한 대로 **Task 4 가 적용된 상태에서 m9 등록부 전건을 실제로 돌려** 붉은 집합을 확정했다.
그 실집합이 관측 6 의 지정 **넷**(`check3`·`check5`·`check15`·`check16`)보다 넓었다 — 첫 실행이
`지정 밖 붉음 4건 — m9 check1 m9 check10 m9 check14 m9 check17` 을 냈다. 관측 6 은 **Task 0 병합 전** 관측이고
그 병합이 상류 32커밋을 들여왔으므로, 넷으로 닫히지 않는 것이 이 창의 결함이 아니라 예고 시점의 성질이다.

넷을 갈라 처리했다.

| m9 검사 | 첫 실행 실패 문면 | 처분 |
|---|---|---|
| `check17` | m8 등록부의 재기술 검사가 붉었다 | **닫았다.** 원인이 이 창 편집이었다 — 참조 링크의 **문면**에 맨 정책 id 를 적어 m8·m9 의 `재기술` 술어(`(\.md#)` 없는 등장)에 걸렸다. 링크 텍스트를 `대량 쓰기 청크 상한 정책` 으로 바꿔 링크 대상에만 id 가 남게 했다. 재실행에서 `#17 ok` 로 초록이 됐다 |
| `check10` | `재기술 1건` → 위 수정 후 `본문 digest 불일치 1건` | **귀속.** 남은 붉음의 원인은 Task 4 의 본문 변경이고, 그 창 원장의 `dup` 행이 산출 20종을 본문 digest 로 결박한다. 관측 6 이 같은 원인의 `check3`·`check5` 만 지정하고 이 자리를 빠뜨렸다 |
| `check1` | `golden.txt 가 앵커(bb1da584)와 다르다` | **귀속.** `docs/_meta/verify/golden.txt` 가 Task 0 병합으로 갱신됐다. 이 창은 그 파일을 고치지 않는다 — `#1`·`#7` 이 이 창 앵커 대비 무변동을 문다 |
| `check14` | `id 없는 이월 11행` (출처가 형제 PRD `30-contracts-limits-m8`) | **귀속.** Task 0 병합이 들여온 형제 축의 행이다. 이 창이 더한 행은 전건 `id=` 를 갖는다 |

**예고를 넓히는 것만으로는 층위 6 이다**(계획서 관측 6 이 그렇게 적었다). 그래서 `#9` 의 지정을 늘리는 대신
두 번째 집합 `M9_ATTRIBUTED_RED` 를 두고 각 항목에 **귀속 술어**를 달았다 — `#1` 의 `VERIFY_INHERITED.atAnchor`
와 같은 형태이며 저자 선언이 아니라 blob 대조다.

- `upstream-merge` — 그 경로가 **m9 앵커 → 이 창 앵커 사이에서 바뀌었고 그 뒤로는 안 바뀌었다**. 둘이 함께
  서야 *병합이 들여왔고 이 창은 안 건드렸다* 가 된다. backlog 축은 *워킹트리의 `id=` 없는 행 전건이 이 창
  앵커 blob 에도 있다* 로 같은 것을 묻는다.
- `window-edit` — 그 경로가 `#7` 의 **산출 문서 변경 결박 원장**에 실려 있고 이 창 앵커 대비 실제로 바뀌었다.

술어가 거짓이면 그 붉음은 회귀이고 `#9` 가 그 자리에서 죽는다. 지정 집합과 귀속 집합의 교집합이 비어 있어야
하고, 귀속 선언이 낡아 그 검사가 초록이 되면 그것도 이름 있는 실패다.

**이 처분은 계획서 Acceptance 의 문면(*관측 6 의 지정 넷과 차집합 0 양방향*)보다 넓다.** 계획서는 봉인돼 있어
고치지 않으며, 넓힌 자리와 그 근거를 여기 남긴다 — `#9` 의 출력이 두 집합을 분리해 찍고 귀속 전건에 증명 행을
함께 낸다.

### D5 — `#10` 의 후보 키가 행 단위여야 했다

한 `id=` 가 backlog 의 **두 행**을 덮는 경우가 실재한다(`id=50m7-probe-history-out-of-range` — 마일스톤 7 의
원행과 마일스톤 9 의 재측정 행). 초판은 키를 id 로만 만들어 후보 46행이 45키가 됐고 `#10` 이
`후보 키가 유일하지 않다` 로 죽었다. 같은 id 의 두 번째 이후 출현에 불변 blob 안 순번(`@n`)을 붙여 키를 행
단위로 되돌렸다. 그와 함께 **인수는 `id=` 를 가진 유일 후보에만 허용**한다 — 행 해시 키와 `@n` 키는 판정 접미를
다는 순간 값이 바뀌어 워킹트리에서 그 행을 다시 찾을 수 없고, 그 사실을 `#10` 이 이름 있는 실패로 문다.

## Codex Implementation Review

- 호출: `node C:/Users/madsc/.claude/plugins/cache/mccp/mccp/1.33.1/scripts/lib/codex-invoke.js adversarial-review` (fail-closed Bash wrapper, v0.2.2)
- 라운드 수: 0
- 합치 결론: > Codex skipped per MCCP_CODEX_DISABLED=1 (env-level 운영자 정책, first-class skip). `codex-policy seal` 이 이 게이트 실행 시작 시점에 `codex_disabled=true` 를 워크트리 gitdir 에 봉인했다 — 이후 라운드가 env 를 지워도 되살아나지 않는다.
- YAGNI Triage:
  | Finding | Severity | Verdict | Why |
  |---|---|---|---|
  | (없음) | — | — | Codex 가 돌지 않았으므로 finding 이 0건이다. 표를 채우지 않는 것이 정직한 상태다 |
- Deferred to backlog: 0 → `.claude/plans/codex-findings-backlog.md`
- Open Questions: (없음 — 라운드 0)
- Codex session 참조: (없음 — `MCCP_CODEX_DISABLED=1`)

### Design Review

> impeccable silent-skip (auto-detect): `reason=no-signal` · `skill_available=true` · `design_signal=false`.
> 이 창의 산출물은 문서·원장·하네스뿐이고 렌더 표면(`.tsx`/`.css`/`.html`)이 0건이다.
> 라우팅·critique 루프·design-grounding 캡처 전부 미발화이며 receipt 에
> `impeccable_silent_skip=true` 로 기록된다.

### Security Reviewer

> N/A — 이 창은 auth·crypto·secrets·입력 검증·injection·SSRF·경로 순회·권한 상승 중 어느 면도
> 건드리지 않는다. 산출은 마크다운 문서와 Node 표준 모듈만 쓰는 검증 하네스이며 런타임 코드
> 경로가 0건이다. 2.5.5 의 보안 리뷰어 발화 조건이 성립하지 않아 호출하지 않았고, 따라서
> `security_skipped` 도 아니다(발화하지 않은 것과 발화가 실패한 것은 다르다).


## 하네스 사후 코드리뷰 흡수 (구현 창 종료 뒤)

브랜치 델타 전체를 대상으로 한 로컬 리뷰(`/mccp:code-review` Local Review Mode 를 브랜치 델타로
확대)에서 하네스 결함 3건이 나왔고 전건 흡수했다. **계획서·골든·원장·PRD 는 손대지 않는다** —
셋 다 `insuniverse-docs-50-domain-m10.gates.mjs` 안의 결함이다. 골든의 필수 출력행 id 집합도
불변이며(`check9.indirect-comparison` 은 그대로 있고 문면만 바뀐다) `#11` 삼자 대조가 그것을 문다.

| # | 층위 | 자리 | 결함 | 흡수 |
|---|---|---|---|---|
| L1 | 3 (명령 ≠ 게이트) | `#9` 의 m8·m7 간접 대조 | `green.map(() => "")` 이 초록 검사의 출력을 빈 문자열로 지워, 정규식 술어가 **실패한** 검사 텍스트만 본다. m9 앞 창 회귀 검사는 초록이라 늘 지워지고 `indirect` 는 상수 `집합 무증가` 였다 | 술어를 셋으로 갈았다 — 그 검사의 번호를 m9 원문에서 유도(`CHECKS.checkN` 블록 중 `M8_GATES` 참조가 정확히 1건) · 완주 집합 안에 있음 · `green` 에 있음. 리터럴 번호를 두지 않는다 |
| L2 | 4 (실패 규약) | `showAt()` | `r.code !== 0` 을 전부 `null` 로 접어 **spawn 실패**와 *그 rev 에 파일 없음*이 같은 값이 됐다. `windowBaseSha()` 가 그것을 `파일부재` 로 읽어 앵커가 조용히 밀린다 | `classifySpawn` 을 태워 환경 실패는 이름으로 죽인다. 정상적인 부재는 그대로 `null` |
| L3 | 6 (게이트가 보는 대상) | `mdTableRaw()` | 코드펜스 토글이 `on` 판정 **뒤**에 있어, 표제 앞 펜스 안의 `## Delivery Milestones` 한 줄이 표를 조기 개시시킨다 | 토글을 `on` 판정 **앞**으로 옮겼다. 펜스 안은 어느 구간이든 입력이 아니다 |

### 반사실 검증 (수정 전/후로 결과가 뒤집히는가)

추적 원본은 건드리지 않았다 — m9·m10 하네스의 **사본**을 임시 디렉터리에 만들어 돌렸다.

| 프로브 | 수정 전 | 수정 후 |
|---|---|---|
| L1 번호 유도 — 정상 | (술어 자체가 없음) | `[17]` |
| L1 번호 유도 — `M8_GATES` 참조 제거 | 같음 | `[]` → die |
| L1 번호 유도 — 참조를 두 블록에 | 같음 | `[3, 17]` → die |
| L1 초판 술어에 `green` 지운 입력 | `집합 무증가` (상수임을 재현) | (해당 없음 — 술어를 교체) |
| L2 `git show` 만 환경 파손 서명으로 실패 | `FAIL: --first-parent 이력 155커밋에서 앵커 조건을 만족하는 커밋을 0건 찾았다` — **원인을 못 가리킨다** | `FAIL: git show f9b6e19a:.claude/plans/codex-findings-backlog.md 실행 환경 실패 — fatal: fork: retry: Resource temporarily unavailable` |
| L3 표제 앞 펜스 안에 위조 표 | `["9","위조","x","complete","y"]` — 위조 행을 읽는다 | `["9","진짜","x","in-progress","y"]` |

### 흡수 뒤 재실행

`check2` `check3` `check4` `check5` `check6` `check7` `check10` `check11` `--selfprobe` 전건 rc 0.
`check8` 은 워킹트리가 더러운 동안 `tracked 청결 위반 1건` 으로 붉고 이 커밋 뒤 초록이 된다 —
그 검사는 커밋 경계에서만 판정 가능하다. `#1` `#9` 는 이 재실행 집합 밖이다(각각 `verify.sh`
약 400초 · m9 중첩 약 1,200초).

### 이 리뷰가 남긴 사각지대

- `#9` 의 간접 대조는 여전히 **m9 앞 창 검사가 초록이라는 사실**만 근거로 삼고 그 검사의 출력
  본문을 파싱하지 않는다. m8·m7 붉음 집합의 값 자체는 이 창이 재유도하지 않으며, 그 사실을
  `check9.indirect-comparison` 출력이 이름으로 싣는다.
- `#1` `#9` 를 이 흡수 뒤 실측하지 않았다. 셋 중 `showAt`·`mdTableRaw` 는 두 검사도 쓰는 공용
  경로이므로 완주 재실행이 서기 전까지 그 두 자리는 `(미검증)` 이다.
