# findings · 60-history-deprecated

> **형식**: `docs/_meta/findings/README.md` §기록 형식 — 발견 하나가 `## ` 표제 하나이고 그 아래
> 필수 6항목을 `### ` 표제로 순서 그대로 둔다. **판단과 수정 제안은 적지 않는다 — 사실만.**
>
> **`발견 일시` 와 `상태` 는 열거 필드다.** 값 하나만 적는다. 단서·유보는 `관찰 사실` 이나
> `심각도` 로 간다 — 게이트가 두 항목을 정확 일치로 본다.
>
> **조사 기준점**: 동결 SHA `b674f52`. 아래 근거 앵커의 행 번호는 그 SHA 기준이다.
>
> **심각도 어휘**: `낮` / `중` / `높` — `13-relation-contract.md` 가 쓰는 값과 같다.

---

## F-01 · 유예 원소가 가리키는 폐기 문서의 파일명이 정본 트리 어디에도 없다

### 발견 일시

2026-08-24

### 관찰 사실

`docs/_meta/template-config.yaml` 의 `deferred_ref_targets` 두 원소 중 하나가
`../99-deprecated/legacy-admin-view.md#LEGACY_ADMIN_VIEW_TOKEN` 이다. 그 참조가 요구하는 파일명은
`legacy-admin-view.md` 인데, `.claude/meta/05-final-spec.md` §4 트리와 `docs/00-index.md` §문서 트리
양쪽의 `99-deprecated/` 아래에는 `01-removed-features.md` 와 `02-reverted-policies.md` 두 경로뿐이다.
`insuniverse-docs-60-history-deprecated.prd.md` §Scope MVP 펜스가 내는 7경로에도 그 이름은 없다.

이 창(마일스톤 1)이 트리에 더한 두 행은 `90-history/00-origin.md` 와 `90-history/04-ops-intent.md`
이며 `99-deprecated/` 는 건드리지 않았다 — 즉 이 어긋남은 이 창이 만든 것이 아니고, 마일스톤 1
착수 전 `b674f52` 상태에서 이미 그랬다.

그 참조를 드는 문서는 `.claude/templates/doc-kit/examples/policy-example.md` 12행
(`supersedes: ../99-deprecated/legacy-admin-view.md#LEGACY_ADMIN_VIEW_TOKEN`)이고,
`run_template_config_gate` 가 실 config 로 그 예시를 스테이징해 상시 검사한다.

### 재현 절차

```bash
git -C . rev-parse HEAD                     # b674f52 계열인지 확인
grep -n -A 3 'deferred_ref_targets' docs/_meta/template-config.yaml
sed -n '/^  99-deprecated\/$/,/^$/p' .claude/meta/05-final-spec.md
sed -n '/^  99-deprecated\/$/,/^$/p' docs/00-index.md
grep -n 'supersedes' .claude/templates/doc-kit/examples/policy-example.md
```

`deferred_ref_targets` 에는 `legacy-admin-view.md` 가 나오고 두 트리 슬라이스에는 나오지 않는다.

### 근거 앵커

- `docs/_meta/template-config.yaml` 148-150행 — `deferred_ref_targets` 2원소
- `.claude/meta/05-final-spec.md` 393-395행 (b674f52 기준) — 정본 §4 의 `99-deprecated/` 블록
- `docs/00-index.md` 136-138행 (동) — 사본 트리의 같은 블록
- `.claude/templates/doc-kit/examples/policy-example.md` 12행 — 그 참조를 드는 유일한 문서
- `docs/_meta/verify/verify.sh` 1571-1592행 — `run_template_config_gate` 의 스테이징 목록
- `.claude/prds/insuniverse-docs-60-history-deprecated.prd.md` §Scope MVP 펜스 — 7경로

### 심각도

중. 지금은 유예가 선언돼 있어 게이트가 초록이다. 그 원소를 해소하는 창에서 파일명이 문제로 드러난다 —
같은 이름으로 발행하면 트리 정합 검사가, 트리 이름으로 발행하면 유예 참조가 각각 대상을 잃는다.
그 판정에 필요한 실측(그 토큰이 실 폐기 후보인지 placeholder 인지)은 이 창에서 하지 않았다.

### 상태

처리 결정됨

## F-02 · `onboarding-questions.yaml` 주석이 문서 7종 확정으로 거짓이 됐다

### 발견 일시

2026-08-24

### 관찰 사실

`docs/_meta/onboarding-questions.yaml` 282행 주석이 `90-history` 를 **3문서**로 적고 그 3문서를
2질문으로 덮는다고 쓴다. `insuniverse-docs-60-history-deprecated.prd.md` §Scope 가 산출 문서를
7종으로 확정했고 그중 `90-history/` 아래가 5종(`00-origin.md` · `01-timeline.md` · `02-epics.md` ·
`03-divergence.md` · `04-ops-intent.md`)이다. 이 창이 정본 §4 트리와 사본 트리에 그 5종을 등재한
뒤에도 그 주석은 3문서를 그대로 적고 있다.

주석 한 줄이며 게이트가 읽는 값이 아니다 — `golden.txt` 의 어떤 키도 그 행에서 유도되지 않고,
질문 자체(Q26 · Q27 · Q28)는 문서 7종 상태에서도 그대로 유효하다. 그 파일은 이 PRD 의 §개정 위임
요청 5행에 없다.

### 재현 절차

```bash
sed -n '280,285p' docs/_meta/onboarding-questions.yaml
sed -n '/^  90-history\/$/,/^$/p' .claude/meta/05-final-spec.md   # 5경로
grep -n 'onboarding-questions.yaml' docs/_meta/verify/golden.txt  # 유도 키 없음
```

주석은 3문서, 트리는 5경로다.

### 근거 앵커

- `docs/_meta/onboarding-questions.yaml` 282행 — *"90-history 3문서를 2질문"* 주석
- `.claude/meta/05-final-spec.md` §4 트리 `90-history/` 블록 — 이 창 반영 후 5경로
- `.claude/prds/insuniverse-docs-60-history-deprecated.prd.md` §Scope MVP 펜스 — 문서 7종
- `docs/_meta/ownership.md` §개정 위임 — 이 PRD 앞 5행에 그 파일이 없다

### 심각도

낮. 게이트가 읽지 않는 주석이고 질문 3종의 유효성은 바뀌지 않았다. 그 주석을 근거로 커버리지를
읽는 다음 사람이 문서 수를 3으로 오인할 수 있다는 것이 범위의 전부다.

### 상태

미판정

## F-03 · PRD·spec 의 revert 계수 리터럴이 인덱스 유도값과 다르다

### 발견 일시

2026-08-25

### 관찰 사실

`.claude/prds/insuniverse-docs-60-history-deprecated.prd.md` §Success Metrics *revert 판정 완결* 의
목표가 `20/20` 이고 `.claude/meta/05-final-spec.md` §3 필터 4 가 `server 10 / site 10건` 을 적는다.
`docs/00-index.md` §폐기 목록 은 *revert 후 미복원 20건* 을 적었다.

`docs/_meta/index/dead-candidates.yaml` 실측은 다르다. 판정 단위는 revert 커밋이 아니라 patch-id
그룹이고(같은 파일 머리말 필터 4), 그룹은 `insuniverse-server` 4 · `insuniverse-site` 4 ·
`insuniverse-admin` 0 으로 합 8이다. `state` 분포는 `absent` 2 · `present` 2 · `unresolved` 4 다.
같은 파일의 `counts.revert_candidates` 는 저장소별 5·5·0, `counts.revert_groups` 는 4·4·0 이다.

### 재현 절차

```
grep -c '^      - patch_id:' docs/_meta/index/dead-candidates.yaml
grep -n 'revert_groups:\|revert_state_' docs/_meta/index/dead-candidates.yaml
```

### 근거 앵커

- `docs/_meta/index/dead-candidates.yaml` — 머리말 필터 4 · `revert_groups` · `counts.revert_*`
- `.claude/meta/05-final-spec.md` §3 폐기 판정 5중 필터 4항
- `.claude/prds/insuniverse-docs-60-history-deprecated.prd.md` §Success Metrics *revert 판정 완결* 행

### 심각도

중. 세 문면이 게이트가 읽지 않는 산문이라 어떤 검사도 붉어지지 않는다. 기계 정본은
`dead-candidates.yaml` 이다.

### 상태

사용자 통보

## F-04 · 인덱스의 `deprecated-confirmed` 근거식이 *삭제 커밋 prod 미도달* 이다

### 발견 일시

2026-08-25

### 관찰 사실

`docs/_meta/index/index-shared.mjs` 700 행이 `deprecation.prodUnreached === true` 하나로
`status: deprecated-confirmed` 를 낸다. 바로 다음 `else` 가 *HEAD 에서 사라져도 prod 에는 남아
있을 수 있고 필터 5의 참조 카운트는 `11-index-code` 소관* 이라고 적는다.

`docs/_meta/index/policy-candidates.git.jsonl` 의 `deprecated-confirmed` 6행 중 `source: deleted_path`
4행은 `status_basis: deletion:absent-and-prod-unreached` 이고 `prod_reached: false` 다. 그 4행 중
2행의 `anchor_commit.sha` 는 각각 `4d798f55…` · `767d1e44…` 이며, 두 값은
`docs/_meta/verify/golden.txt` 의 `repo.insuniverse-server.manifest_head` ·
`repo.insuniverse-site.manifest_head` 와 같다.

나머지 2행은 `source: revert` 이고 `status_basis: revert:state-absent` · `prod_reached: true` 다.

### 재현 절차

```
sed -n '695,710p' docs/_meta/index/index-shared.mjs
grep -c '"status":"deprecated-confirmed"' docs/_meta/index/policy-candidates.git.jsonl
grep -o '"status_basis":"[^"]*"' docs/_meta/index/policy-candidates.git.jsonl | sort | uniq -c
```

### 근거 앵커

- `docs/_meta/index/index-shared.mjs` — 700 행 부근 `prodUnreached` 분기와 그 `else` 주석
- `docs/_meta/index/policy-candidates.git.jsonl` — `status: deprecated-confirmed` 6행
- `docs/_meta/verify/golden.txt` — `repo.*.manifest_head` 3행

### 심각도

높. 그 값을 PRD 5중 필터의 확정으로 옮기면 확정되지 않은 후보에 불변 id 가 발행된다.

### 상태

사용자 통보

## F-05 · `policy-candidates.git.jsonl` 전 행이 `requires_corroboration: true` 다

### 발견 일시

2026-08-25

### 관찰 사실

`docs/_meta/index/policy-candidates.git.jsonl` 2870행 전건이 `requires_corroboration: true` 다.
`docs/_meta/index/README.10-index-git.md` 는 *이 축이 내는 것은 전부 관측 사실과 후보* 이며
*이 파일들의 어떤 값도 단독으로 결론이 아니다* 라고 적고, 폐기 판정을 `60-history-deprecated` 와
`00-protocol` 소관으로 돌린다. `docs/_meta/index/dead-candidates.yaml` 머리말도 같은 문장을 든다.

### 재현 절차

```
grep -c '' docs/_meta/index/policy-candidates.git.jsonl
grep -c '"requires_corroboration":true' docs/_meta/index/policy-candidates.git.jsonl
grep -n 'requires_corroboration\|단독으로 결론' docs/_meta/index/README.10-index-git.md
```

### 근거 앵커

- `docs/_meta/index/policy-candidates.git.jsonl` — 전 2870행의 `requires_corroboration`
- `docs/_meta/index/README.10-index-git.md` — 미확증 고지와 판정 소관 문단
- `docs/_meta/index/dead-candidates.yaml` — 머리말 *이 파일은 후보 목록이며 폐기 판정이 아니다*

### 심각도

중. 인덱스 자신이 고지하고 있으므로 인덱스 축의 결함은 아니다. 소비자가 그 고지를 건너뛰는
경우에만 발동한다.

### 상태

사용자 통보

## F-06 · revert `deprecated-confirmed` 2건의 env 게이트와 관련 코드가 동결 HEAD 에 실재한다

### 발견 일시

2026-08-25

### 관찰 사실

`policy-candidates.git.jsonl` 의 `source: revert` 확정 2건은 다음과 같다.

`insuniverse-server:revert:0ec926740bc4c12048b109b299703686471ab5eb` — 되돌린 커밋
`ebb6f78e20f6ac7cfba0df806b843da344be42c4`(2026-06-30), 대상
`39aaecf314880a52faf7dcd27137dd3c221d5243` *feat(treat): 보상닥터 B2C 바이패스 — API키 인증 +
동시 슬롯 제한*. 그 revert 는 `apps/api/src/config/configuration.ts` 에서 `b2cBypass.bosangdr`
블록(`B2C_BOSANGDR_CODE` · `B2C_BOSANGDR_API_KEY` · `B2C_BOSANGDR_SLOT`)을 제거했다. 동결 HEAD
`4d798f55…` 의 같은 파일 163~165 행에는 `b2cBypass: { slot: Number(process.env.B2C_BYPASS_SLOT ?? 2) }`
가 있고 `apps/api/src/modules/treat/coocon-bypass.controller.ts` 48 행이 그 값을 읽는다.
`docs/_meta/index/env-gates.yaml` 은 `env_gates:B2C_BYPASS_SLOT` 의 `default_literal` 을 `2` 로,
`unset_behavior` 를 *미설정이면 Number(x ?? 2) 로 슬롯 2 가 된다* 로 적는다.

`insuniverse-server:revert:70af9b501050a9037546cd6f01d5915c2463d12f` — 되돌린 커밋
`1d3d257b9fc418f04cf01c48fd65e1f2bf10d44b`(2026-06-23), 대상
`0328dfcb4118ef5dd54f0bd84dfbcda86caa0f6d` *feat(treat): octover/hyphen/coocon 자동차보험 진료정보
수집 연동*. 그 revert 는 `libs/octover` · `libs/hyphen` · `libs/coocon` 의 mapper·service 를
제거했다. 동결 HEAD 에는 `libs/octover/src/octover.service.ts` 를 포함해 `octover` 를 인용하는
`apps/api/src` 파일이 15건 이상 있고, `configuration.ts` 29·33 행이 `TREAT_PROVIDER ?? 'codef'` 와
`TREAT_POOL ?? 'octover:30:3:1,coocon:30:3:1'` 을 낸다. `env-gates.yaml` 이 두 게이트를 같은
기본값으로 싣는다.

두 건의 `dead-candidates.yaml` 그룹은 `state: absent` · `state_basis: ordering` ·
`head_applicability.result: indeterminate` · `prod_unreached: false` 다.

### 재현 절차

```
git -C insuniverse-server show --stat ebb6f78e20f6ac7cfba0df806b843da344be42c4
git -C insuniverse-server grep -n 'b2cBypass' HEAD -- apps/api/src
git -C insuniverse-server grep -ln 'octover' HEAD -- apps/api/src
grep -n 'B2C_BYPASS_SLOT\|TREAT_POOL\|TREAT_PROVIDER' docs/_meta/index/env-gates.yaml
```

### 근거 앵커

- `insuniverse-server` `apps/api/src/config/configuration.ts` 29·33·163~165 행 (동결 HEAD `4d798f55…`)
- `insuniverse-server` `apps/api/src/modules/treat/coocon-bypass.controller.ts` 48 행
- `docs/_meta/index/env-gates.yaml` — `env_gates:B2C_BYPASS_SLOT` · `env_gates:TREAT_POOL` · `env_gates:TREAT_PROVIDER`
- `docs/_meta/index/dead-candidates.yaml` — `revert_groups` 의 두 그룹
- `.claude/meta/05-final-spec.md` §3 폐기 판정 5중 필터 1항·2항

### 심각도

높. 5중 필터 1항(env 게이트 기본값이 off인가)과 2항(HEAD 코드에 guard/constant/컬럼이 있는가)의
판정 입력이며, 두 축이 `pass` 가 아니면 §Risks *살아있는 정책을 폐기로 오판* 이 발동하는 자리다.

### 상태

사용자 통보

## F-07 · 코드 축·env 게이트 축의 앵커가 삭제 축과 교집합 0 이다

### 발견 일시

2026-08-26

### 관찰 사실

`policy-candidates.git.jsonl` 의 `source: deleted_path` 833행은 `repo` + `anchor.path` 로 833개의
서로 다른 저장소 상대 경로를 낸다. 5중 필터의 참조 conjunct 를 낼 수 있는 저장소 안 산출 축은
둘이고, 둘 다 그 경로 집합과 교집합이 0 이다.

- 코드 축 — `policy-candidates.code.jsonl` 의 데이터 행 1,993건과
  `candidates-unqualified.code.jsonl` 의 3,208건이 `defined_in` 배열에 합계 5,202개의
  `<repo>/<path>:<line>` 앵커를 담는다. 행 번호를 뗀 파일 집합은 302경로이고 그중 삭제 경로를
  가리키는 것이 0건이다.
- env 게이트 축 — `env-gates.yaml` 의 `read_at` · `test_refs` 가 내는 파일 집합은 15경로이고
  그중 삭제 경로를 가리키는 것이 0건이다.

두 축의 기준선은 `source_sha` 이고 값이 `{server: c7597fc7…, site: b9a90a42…, admin: 7df733a5…}`
다. git 축의 동결 HEAD 는 `dead-candidates.yaml` `frozen_heads` 의
`{insuniverse-server: 4d798f55…, insuniverse-site: 767d1e44…, insuniverse-admin: fb001e1d…}` 이며
3저장소 모두 값이 다르다.

동결 HEAD 3트리에 `deletion:renamed` 20건을 제외한 삭제 경로 813건 중 남아 있는 것은 0건이다.
즉 두 축이 스캔하는 트리에 그 경로들이 존재하지 않는다.

### 재현 절차

```
node .claude/plans/insuniverse-docs-60-history-deprecated-m2b.gates.mjs axes
grep -n 'frozen_heads' -A4 docs/_meta/index/dead-candidates.yaml
head -1 docs/_meta/index/policy-candidates.code.jsonl
```

### 근거 앵커

- `docs/_meta/index/policy-candidates.git.jsonl` — `source: deleted_path` 833행
- `docs/_meta/index/policy-candidates.code.jsonl` — `kind: meta` 의 `source_sha` · 데이터 행 `defined_in`
- `docs/_meta/index/candidates-unqualified.code.jsonl` — 같은 두 필드
- `docs/_meta/index/env-gates.yaml` — 각 항목의 `read_at` · `test_refs`
- `docs/_meta/index/dead-candidates.yaml` — `frozen_heads` 3값
- `.claude/meta/05-final-spec.md` §3 폐기 판정 5중 필터 1항·5항

### 심각도

높. 5중 필터 1항과 5항 참조 conjunct 의 입력이 구조적으로 부재하다는 관측이며, 그 두 축의
값이 `unknown` 인 이유가 미측정인지 교집합 0 인지를 가르는 자리다.

### 상태

사용자 통보

## F-08 · `b3a3a759` 는 이름 변경 커밋이고 `Point/Product` 만 이동 대상 없이 D 다

### 발견 일시

2026-08-26

### 관찰 사실

`insuniverse-admin` 커밋 `b3a3a759d335d98aa10e93f491211ca42640dd85`(2025-11-24 · 제목
`포인트 -> 머니 파일명 변경`)의 `--name-status` 는 R 13 · D 4 · A 1 · M 5 다.

R 13건 중 12건이 `src/pages/Admin/Point/**` 에서 `src/pages/Admin/Money/**` 로 옮겨간다
(Category 3 · History 1 · Issue 2 · IssueCommon 2 · Payment 2 · Refund 2). 나머지 1건은
`src/api/pointApi.ts` → `src/api/moneyApi.ts` 다.

D 4건은 `src/app/router/routes/domains/point.routes.tsx` 와
`src/pages/Admin/Point/Product/` 아래 3파일(`AddPointProductPage.tsx` ·
`DetailPointProductPage.tsx` · `PointProductPage.tsx`)이다.

동결 HEAD `fb001e1d…` 트리에 `Admin/Money/Product/` 접두를 갖는 경로는 0건이다. 같은 커밋이
형제 디렉터리 6개를 `Money/` 아래로 만드는 동안 `Product/` 는 만들어지지 않았다.

`policy-candidates.git.jsonl` 의 그 3경로는 `renamed_to: null` · `status_basis:
deletion:absent-at-head` · `status: dead-code-candidate` 다.

### 재현 절차

```
git -C ../../insuniverse-admin show --name-status --format= b3a3a759d335d98aa10e93f491211ca42640dd85
git -C ../../insuniverse-admin ls-tree -r --name-only fb001e1d26d342130cf9a8dc8fe5e8a64e1da9c8 | grep 'Admin/Money/Product/'
node .claude/plans/insuniverse-docs-60-history-deprecated-m2b.gates.mjs exemplar
```

### 근거 앵커

- `insuniverse-admin` 커밋 `b3a3a759d335d98aa10e93f491211ca42640dd85`
- `insuniverse-admin` 동결 HEAD `fb001e1d26d342130cf9a8dc8fe5e8a64e1da9c8` 트리
- `docs/_meta/index/policy-candidates.git.jsonl` — `insuniverse-admin:deleted_path:src/pages/Admin/Point/Product/*`
- `docs/_meta/index/dead-candidates.yaml` 5 행 — 세 흔적 층의 증명력에 대한 문면

### 심각도

높. `renamed_to` 단독으로는 이동과 삭제가 갈리지 않는 실례이며, 같은 커밋의 R 목록이 그 둘을
가르는 관측이다.

### 상태

사용자 통보

## F-09 · `Point/Product` 3파일은 삭제 직전 부모 트리에서도 외부 참조가 0 이다

### 발견 일시

2026-08-26

### 관찰 사실

삭제 직전 부모 트리 `b3a3a759^` **전 범위**에서 세 심볼(`AddPointProductPage` ·
`DetailPointProductPage` · `PointProductPage`)과 경로 토큰 `Point/Product` 를 찾으면 적중 파일이
3건이고, 그 3건이 같은 커밋에서 D 로 지워진 파일 자신이다. 그 밖의 적중은 0건이다.

`-- src` 로 좁히지 않은 전 트리 조회이므로 설정 파일·테스트 파일·라우터 선언도 조회 범위에
들어 있다.

즉 이 세 파일은 삭제되기 전 시점에도 외부에서 참조되지 않았다.

### 재현 절차

```
git -C ../../insuniverse-admin grep -l -E 'AddPointProductPage|DetailPointProductPage|PointProductPage|Point/Product' b3a3a759d335d98aa10e93f491211ca42640dd85^
node .claude/plans/insuniverse-docs-60-history-deprecated-m2b.gates.mjs exemplar
```

### 근거 앵커

- `insuniverse-admin` 커밋 `b3a3a759d335d98aa10e93f491211ca42640dd85` 의 부모 트리
- `insuniverse-admin` `src/pages/Admin/Point/Product/AddPointProductPage.tsx` (부모 트리)
- `insuniverse-admin` `src/pages/Admin/Point/Product/DetailPointProductPage.tsx` (부모 트리)
- `insuniverse-admin` `src/pages/Admin/Point/Product/PointProductPage.tsx` (부모 트리)
- `.claude/meta/05-final-spec.md` §3 폐기 판정 5중 필터 5항

### 심각도

높. 필터 5 의 참조 카운트 conjunct 를 삭제 직전 부모 트리에서 측정해도 이 그룹의 값이 0 이라는
관측이며, 측정 시점 판정이 이 그룹의 결과를 바꾸지 않는 자리다.

### 상태

사용자 통보

## F-10 · PRD §Evidence 의 발산 계수 3쌍이 `releases.yaml` 유도값과 다르다

### 발견 일시

2026-08-27

### 관찰 사실

`insuniverse-docs-60-history-deprecated.prd.md` §Evidence 의 *prod↔stg 양방향 발산* 행이
`49↔61 / 18↔28 / 24↔53` 을 적었다. `docs/_meta/index/releases.yaml` `repos[].prod_only` 와
`repos[].stg_only` 의 원소 수는 각각 51/64 · 27/35 · 24/56 이다.

여섯 값 중 다섯이 다르고 일치하는 것은 `insuniverse-admin` 의 `prod_only` 24 하나다.

같은 값을 3저장소 git 에서 재유도한 결과도 파일값과 같다 —
`rev-list <locked prod tip> --not <frozen head>` 가 51 · 27 · 24 이고 역방향이 64 · 35 · 56 이다.
locked prod tip 은 `releases.yaml` `prod_tips` 이고 frozen head 는 `frozen_heads` 다.

`.claude/meta/05-final-spec.md` §1 과 `04-round3-adjudication.md` 는 §Evidence 가 근거로 든
파일인데 그 두 파일에는 이 계수 6값이 없다.

### 재현 절차

```
node .claude/plans/insuniverse-docs-60-history-deprecated-m3.gates.mjs prd
node .claude/plans/insuniverse-docs-60-history-deprecated-m3.gates.mjs rederive
grep -n 'prod↔stg 양방향 발산' .claude/prds/insuniverse-docs-60-history-deprecated.prd.md
```

### 근거 앵커

- `.claude/prds/insuniverse-docs-60-history-deprecated.prd.md` §Evidence *prod↔stg 양방향 발산* 행
- `docs/_meta/index/releases.yaml` — `repos[].prod_only` · `repos[].stg_only` · `prod_tips` · `frozen_heads`
- `insuniverse-server` · `insuniverse-site` · `insuniverse-admin` — `rev-list` 양방향 재유도

### 심각도

중. 계획·PRD 산문의 계수 리터럴이 인덱스 유도값과 갈리는 자리이며 F-03 이 revert 계수에서
잡은 것과 같은 부류다.

### 상태

처리 결정됨

## F-11 · 발산 축의 참조 카운트가 구조적으로 유도 불가다

### 발견 일시

2026-08-27

### 관찰 사실

`releases.yaml` `repos[].prod_only` 102건(51 · 27 · 24)의 sha 를 저장소 안 인덱스 6종과
대조한 결과는 아래와 같다.

- `commits.<repo>.jsonl` — 3파일 합계 6,190행. prod-only 와의 교집합이 **0 / 102** 이다
  (저장소별 0 · 0 · 0). 같은 대조에서 stg-only 155건 중 150건은 이 인덱스에 있다.
- `policy-candidates.git.jsonl` — 2,870행 전건이 `anchor_commit.sha` 를 갖는다. prod-only
  적중은 102건이고 그 102건 전부가 `source: prod_only` 인 자기 행이다.
- `comments.server.jsonl`(4,413행) · `comments.site.jsonl`(3,514행) ·
  `comments.admin.jsonl`(4,761행) — 행의 키가 `file` · `lang` · `line_start` · `line_end` ·
  `block_type` · `text` 등이며 커밋 sha 필드가 없다.
- `policy-candidates.code.jsonl`(1,994행) · `policy-candidates.runtime.jsonl`(50행) —
  `anchor_commit` 키를 가진 행이 0건이다.

`docs/_meta/extraction-manifest.yaml` `repos[].head` 와 `releases.yaml` `frozen_heads` 가 같은
값이고, `prod_only` 는 그 값으로 `rev-list <prod tip> --not <frozen head>` 한 결과다.

### 재현 절차

```
node .claude/plans/insuniverse-docs-60-history-deprecated-m3.gates.mjs refaxis
head -1 docs/_meta/index/comments.server.jsonl
head -1 docs/_meta/index/policy-candidates.runtime.jsonl
```

### 근거 앵커

- `docs/_meta/index/releases.yaml` — `repos[].prod_only` · `frozen_heads`
- `docs/_meta/index/commits.server.jsonl` · `commits.site.jsonl` · `commits.admin.jsonl` — `sha` 열
- `docs/_meta/index/policy-candidates.git.jsonl` — `anchor_commit.sha` · `source`
- `docs/_meta/index/comments.server.jsonl` · `comments.site.jsonl` · `comments.admin.jsonl` — 행 키
- `docs/_meta/index/policy-candidates.code.jsonl` · `policy-candidates.runtime.jsonl` — 행 키
- `.claude/prds/insuniverse-docs-60-history-deprecated.prd.md` §Risks *prod 발산 항목이 실제로는 미배포 코드* 행

### 심각도

높. §Risks 완화책 *참조 카운트 병행 확인* 의 입력이 발산 축에서 부재하다는 관측이며,
*교집합 0* 인 축과 *커밋 앵커 필드가 없는 축* 이 서로 다른 부류라는 것이 같은 자리에서 보인다.

### 상태

사용자 통보

## F-12 · 로컬 `refs/heads/prod` 가 locked prod tip 과 다르고 admin 은 로컬 브랜치가 없다

### 발견 일시

2026-08-27

### 관찰 사실

`releases.yaml` `prod_tips` 는 `2d3b238e…`(server) · `4fccdd75…`(site) · `8dc62b9f…`(admin)
이고 `prod_tips_source` 는 3저장소 모두 `locked` 다.

같은 저장소의 로컬 ref 를 `git for-each-ref` 로 읽으면 값이 다르다.

- `insuniverse-server` — `refs/heads/prod` 가 `5c14fd70293ff802a92a594f177a9df20908654d` 다.
- `insuniverse-site` — `refs/heads/prod` 가 `a79528c21bf71a5ba65d3f883fc036c8beee3d00` 다.
- `insuniverse-admin` — `refs/heads/prod` 가 없다. `refs/remotes/origin/prod` 만 있고 그 값은
  `85fb96a09313506ae819f611bdc9f2336a1d1a4f` 다.

`releases.yaml` 머리말은 stg 쪽에 대해 *"로컬 refs/heads/stg 는 읽지 않는다 (실측상 이미
이동했다 — findings F-10-09)"* 를 적었고 prod 쪽에 대해서는 *"계산 전 스냅샷 ↔ 쓰기 직전
재확인"* 을 적었다.

server 의 로컬 ref 로 `rev-list <local prod> --not <frozen head>` 를 돌리면 결과 집합이
locked tip 으로 돌린 51건과 다르다.

### 재현 절차

```
node .claude/plans/insuniverse-docs-60-history-deprecated-m3.gates.mjs anchor
node .claude/plans/insuniverse-docs-60-history-deprecated-m3.gates.mjs rederive
git -C ../../insuniverse-admin for-each-ref refs/heads/prod refs/remotes/origin/prod
```

### 근거 앵커

- `docs/_meta/index/releases.yaml` — `prod_tips` · `prod_tips_source`
- `insuniverse-server` `refs/heads/prod` · `insuniverse-site` `refs/heads/prod`
- `insuniverse-admin` `refs/remotes/origin/prod` (로컬 `refs/heads/prod` 부재)
- `docs/90-history/03-divergence.md` §기준점 *로컬 `refs/heads/prod` 는 기준이 아니다*

### 심각도

중. 재유도를 로컬 ref 로 풀면 값이 갈리는 자리이며, `03-divergence.md` 의 두 버킷이 locked
SHA 로만 재현된다는 규약의 근거다.

### 상태

사용자 통보

## F-13 · 릴리스 노트 커밋이 8일에만 있고 인덱스 이력 6,190행 중 창 밖이 5,926행이다

### 발견 일시

2026-08-28

### 관찰 사실

`releases.yaml` `prod_merge` 45건(server 24 · site 7 · admin 14)의 `date` 열을 일자로
자르면 distinct 일자가 **8일**이다 — `2026-06-06`(6) `2026-06-07`(5) `2026-06-08`(5)
`2026-06-09`(5) `2026-06-10`(13) `2026-06-11`(3) `2026-06-18`(5) `2026-06-19`(3).
그 8일 전건이 2저장소 이상에 걸린다.

창의 폭은 `2026-06-06` ~ `2026-06-19` 로 13일이다.

`commits.<repo>.jsonl` 3파일의 `date` 열은 `2024-08-27` ~ `2026-08-05` 로 폭 708일이고
총 6,190행이다. 그 6,190행을 릴리스 창으로 가르면 창 안 264행 · 창 밖 5,926행이다
(264 + 5926 = 6190).

`release_like_unmatched` 5건은 전건 `2026-07-01` 이며 릴리스 창 밖이다.

### 재현 절차

```
node .claude/plans/insuniverse-docs-60-history-deprecated-m4.gates.mjs calendar
node .claude/plans/insuniverse-docs-60-history-deprecated-m4.gates.mjs coverage
```

### 근거 앵커

- `docs/_meta/index/releases.yaml` — `repos[].prod_merge` `date` 열
- `docs/_meta/index/commits.server.jsonl` · `commits.site.jsonl` · `commits.admin.jsonl` — `date` 열
- `docs/90-history/01-timeline.md` §릴리스 일자 · §이 연대기가 덮지 못하는 구간
- `docs/_meta/onboarding-questions.yaml` — `Q28`

### 심각도

중. 릴리스 노트 축의 사정거리가 이력의 일부라는 관측이며, `Q28` 의 시점 축이 이 문서
하나로 닫히지 않는 근거다.

### 상태

사용자 통보

## F-14 · `prod_merge` 45건의 부모 사슬 위치가 저장소마다 갈린다

### 발견 일시

2026-08-28

### 관찰 사실

3저장소에서 `rev-list --first-parent <locked prod tip>` 로 1차 부모 사슬을 유도하고
`prod_merge` 45건의 병합 자신 · 첫 부모 `p1` · 둘째 부모 `p2` 의 적중을 각각 재유도하면
분포가 넷으로 갈린다.

- `insuniverse-server` — `(1,1,0)` 24건. 병합 자신과 `p1` 이 사슬 위, `p2` 가 사슬 밖.
- `insuniverse-site` — `(0,0,1)` 7건. 병합 자신과 `p1` 이 사슬 밖, `p2` 가 사슬 위.
- `insuniverse-admin` — `(0,0,1)` 10건. site 와 같은 패턴.
- `insuniverse-admin` — `(0,0,0)` 4건. 병합 자신도 두 부모도 사슬 밖.

`p1` 이 사슬 밖인 것이 21건이고 그중 4건은 두 부모가 다 사슬 밖이다.

같은 분포가 `releases.yaml` 의 `on_prod_first_parent`·`parents_on_prod_first_parent`
두 필드와 일치한다 — server `true`/`[1]` 24건 · site `false`/`[2]` 7건 ·
admin `false`/`[2]` 10건 · admin `false`/`[]` 4건.

`releases.yaml` 머리말은 *"적중분의 부모 위치도 저장소마다 갈린다 (findings F-10-11)"* 를
이미 적었다. 이 항목은 그 문장에 3저장소 재유도 계수를 붙인 것이다.

### 재현 절차

```
node .claude/plans/insuniverse-docs-60-history-deprecated-m4.gates.mjs rederive
node .claude/plans/insuniverse-docs-60-history-deprecated-m4.gates.mjs verdicts
```

### 근거 앵커

- `docs/_meta/index/releases.yaml` — `repos[].prod_merge` `on_prod_first_parent` · `parents_on_prod_first_parent`
- `insuniverse-server` · `insuniverse-site` · `insuniverse-admin` — `rev-list --first-parent <locked prod tip>`
- `docs/90-history/01-timeline.md` §릴리스 노트 커밋 45건 · §이 문서가 하지 못하는 판정 · 릴리스 내용

### 심각도

중. `p1..p2` 를 45건에 균일 적용하면 21건에서 반대 집합을 싣고 4건에는 대응하는 방향이
없다는 관측이다.

### 상태

사용자 통보

## F-15 · `prod_merge` 45건은 인덱스에 45/45 로 조인되지만 `file_count` 가 전건 0 이다

### 발견 일시

2026-08-28

### 관찰 사실

`prod_merge` 45건의 sha 를 `commits.<repo>.jsonl` 과 조인하면 **45/45** 가 적중한다.
조인된 행의 `date` 45/45 · `subject` 45/45 가 `releases.yaml` 값과 축자로 같다.

같은 45행의 `file_count` 는 **전건 0** 이고 `body_present` 는 **1건**(site
`337b5557…`)뿐이다. 제목 괄호는 45/45 가 갖고 있다.

`release_like_unmatched` 5건도 `file_count` 전건 0 이며 `body_present` 는 3건이다.

이 방향은 발산 축의 관측과 반대다 — `03-divergence.md` 의 prod-only 102건은
`commits.<repo>.jsonl` 6,190행과 교집합이 0 이었다(F-11). 여기서는 조인이 전건 성립하는데
조인된 행이 담은 내용이 제목뿐이다.

### 재현 절차

```
node .claude/plans/insuniverse-docs-60-history-deprecated-m4.gates.mjs anchor
node .claude/plans/insuniverse-docs-60-history-deprecated-m4.gates.mjs notes
```

### 근거 앵커

- `docs/_meta/index/releases.yaml` — `repos[].prod_merge` · `repos[].release_like_unmatched`
- `docs/_meta/index/commits.server.jsonl` · `commits.site.jsonl` · `commits.admin.jsonl` — `file_count` · `body_present` · `era`
- `docs/_meta/findings/60-history-deprecated.md` — F-11

### 심각도

중. 릴리스 내용을 인덱스에서 끌어올 수 없는 이유의 관측 근거이며, 조인 성립과 내용 보유가
다른 축이라는 기록이다.

### 상태

사용자 통보

## F-16 · `feat/*` 에픽 모집단은 8이 아니라 23이고, 8은 랜딩 형식 한 종의 상위 8 절단이다

### 발견 일시

2026-08-31

### 관찰 사실

`.claude/meta/01-meta-search-report.md` 73 행이 등급 A 행 `feat/*` 브랜치 머지의 실측으로
`feat/courses`33 · `feat/sales-agency-channel`16 · `feat/advertisement`13 ·
`feat/loss-adjusting`11 · `feat/log_treat`8 · `feat/corp-org-permission`8 ·
`feat/car-insurance`6 · `feat/fcm-token`3 **8개**를 적는다.

그 8개의 계수는 이 창의 실측과 **축자로 같다.** 다만 그것은 랜딩 형식 한 종
(`Merge branch 'feat/X'`)만 본 distinct **20개 이름**의 상위 8 이다. 8위 3 과 9위 2 사이에
동률이 없어 절단 지점도 모호하지 않다.

캡처 형식 3종을 전수 적용하고 랜딩을 토폴로지로 판정하면 이름은 **23개**다. 20개 중 1개
(`feat/sales-agency`)는 랜딩이 아니어서 빠지고, `Merge pull request` 축에만 있는 4개
(`feat/addPrimaryKey` · `feat/agency` · `feat/agency-crud` · `feat/client-auth`)가 더해진다.

`.claude/prds/insuniverse-docs-60-history-deprecated.prd.md` §Evidence 가 그 8을 모집단으로
인용하고 있었다.

### 재현 절차

```
node .claude/plans/insuniverse-docs-60-history-deprecated-m5.gates.mjs anchor
node .claude/plans/insuniverse-docs-60-history-deprecated-m5.gates.mjs epics
```

### 근거 앵커

- `.claude/meta/01-meta-search-report.md` — 72 행 · 73 행 (등급표 A 행)
- `docs/_meta/index/commits.server.jsonl` · `commits.site.jsonl` · `commits.admin.jsonl` — `subject`
- `docs/90-history/02-epics.md` — §에픽 23건 · §`merge_branch` 축만 보면 잃는 이름

### 심각도

중. 표본을 모집단으로 인용한 자리이며, 같은 절단이 `docs/00-index.md` 와
`.claude/meta/05-final-spec.md` 의 트리 캡션에도 `feat/* 8개 에픽 서사` 로 남아 있다.

### 상태

처리 결정됨

## F-17 · 캡처 형식은 3종인데 랜딩을 내는 형식은 2종이고, 한 종은 랜딩 0건이다

### 발견 일시

2026-08-31

### 관찰 사실

제목에서 브랜치 이름을 캡처하는 정규식은 3종이고 제목 매치 **120건**을 상호배타·전수로
분류한다 — `merge_branch` 114 · `merge_pr` 5 · `squash_like` 1.

토폴로지 판정을 거치면 랜딩은 `merge_branch` **110** · `merge_pr` **4** · `squash_like`
**0** 이다. 즉 **캡처 3종 · 랜딩 2종**이고 두 수가 다르다.

`squash_like`(`feat: merge feat/X branch`)의 유일한 표본 `767e6fa7…` 는 79초 전 랜딩
`3170d0ad…` 를 **유일한 부모**로 갖는 후속 커밋이라 랜딩이 아니다. 그 형식을 캡처 정규식에서
지우면 그 커밋이 near-miss 절에서도 사라져 배제 사실 자체가 기록되지 않는다.

`merge_branch` 축 하나로만 이름을 뽑으면 랜딩 이름 23개 중 **4개**를 잃는다.

### 재현 절차

```
node .claude/plans/insuniverse-docs-60-history-deprecated-m5.gates.mjs forms
node .claude/plans/insuniverse-docs-60-history-deprecated-m5.gates.mjs nearmiss
```

### 근거 앵커

- `docs/_meta/index/commits.server.jsonl` · `commits.site.jsonl` · `commits.admin.jsonl` — `subject`
- `docs/90-history/02-epics.md` — §캡처 형식 3종과 랜딩 형식 2종
- `docs/_meta/findings/60-history-deprecated.md` — F-16 · F-18

### 심각도

중. 캡처 축과 판정 축을 같은 수로 읽으면 모집단이 6건 부풀고 이름이 1건 늘어난다.

### 상태

사용자 통보

## F-18 · 제목이 랜딩의 모양인데 에픽의 메인라인 진입이 아닌 커밋이 6건이고 변종이 세 가지다

### 발견 일시

2026-08-31

### 관찰 사실

제목 매치 120건 중 **6건**이 랜딩이 아니다. 배제 사유가 세 가지로 갈린다.

- **목적지가 `feat/*` (2건)** — `1bc42d40…`(`feat/advertisement`) ·
  `964b30f5…`(`feat/sales-agency`). 원격 같은 브랜치를 자기 브랜치로 끌어온 병합이다.
- **부모가 1개 (3건)** — `c7727691…` · `baa0fdbd…` · `767e6fa7…`.
- **다른 랜딩의 p2 계보 안 (1건)** — `ac30e7b0…`(`Merge pull request #8 from …/feat/client-analyze`).
  첫 부모가 `a94e864d…`(`Merge branch 'dev' into feat/client-auth`)이고 자신은 진짜 랜딩
  `1a11e8e6…` 의 둘째 부모다 — `feat/client-analyze` 를 메인라인이 아니라 `feat/client-auth`
  **브랜치에** 병합한 것이다.

세 번째 조건은 자기 참조라 고정점으로 푼다. **배제를 누적하면 과잉 배제한다** — 1차에서
`ac30e7b0…` 과 `112ef0a8…` 이 함께 빠지고, 누적하면 2차에서 `112ef0a8…` 이 복원되지 않아
랜딩 113 · near-miss 7 로 굳는다. 매 라운드 배제 집합을 새로 만들고 배제 **대상**을 조건 1·2 를
통과한 후보 전체에서 고르면 **3라운드**에 114 · 6 으로 수렴한다.

이 분리가 계수를 바꾼다 — 랜딩 120 → 114 · 이름 24 → 23 · 소속 커밋 196 → 185 ·
합집합 313 → 299. **소속 커밋의 중복 배정이 0 이 되는 것은 그 부수 효과다.**

### 재현 절차

```
node .claude/plans/insuniverse-docs-60-history-deprecated-m5.gates.mjs nearmiss
node .claude/plans/insuniverse-docs-60-history-deprecated-m5.gates.mjs rederive
```

### 근거 앵커

- 3저장소 git — `rev-list --parents` · `rev-list <p2> --not <p1>`
- `docs/_meta/index/commits.server.jsonl` · `commits.site.jsonl` — `subject` · `date`
- `docs/90-history/02-epics.md` — §랜딩을 닮았으나 아닌 6건

### 심각도

높. 제목 모양을 사건으로 읽으면 모집단이 오염되고, 그 오염이 소속 커밋의 중복 배정으로
번진다. 판정 권한이 제목이 아니라 토폴로지에 있다는 기록이다.

### 상태

사용자 통보

## F-19 · 살아있는 `feat/*` ref 8건과 에픽 축 이름 23건의 교집합이 0 이다

### 발견 일시

2026-08-31

### 관찰 사실

3저장소 `for-each-ref` 가 `refs/heads` · `refs/remotes/*` 아래에서 내는 `feat/<이름>` 은
server 6 · site 4 · admin 3 이고 중복 제거 후 **8개**다. `feature/` 접두 3건
(`feature/toss` · `feature/app-version-check` · `hotfix/early-feature-corp-admin`)은 다른
이름공간이라 세지 않는다.

그 8개와 랜딩 이름 23개의 **교집합이 0** 이다. 8개 중 어느 것도 이 문서의 에픽 축에 나타나지
않는다.

**그 ref 들이 다른 이름으로 착륙했는지는 판정할 수 없다.** 스쿼시 병합은 부모 사슬을 남기지
않아 토폴로지로 이을 수 없고, 3저장소 태그가 0 · `refs/replace` 가 0 이라 대신 세울 축도 없다.

### 재현 절차

```
node .claude/plans/insuniverse-docs-60-history-deprecated-m5.gates.mjs residual
```

### 근거 앵커

- 3저장소 git — `for-each-ref --format=%(refname)` · `tag` · `for-each-ref refs/replace`
- `docs/90-history/02-epics.md` — §살아있는 `feat/*` ref 8건 · §이 문서가 하지 못하는 판정

### 심각도

중. 활성 브랜치가 이력 축에 흔적을 남기지 않는다는 관측이며, 귀속 미판정의 근거다.

### 상태

사용자 통보

## F-20 · Era A/B 를 가르는 것은 관례 형식이 아니라 `scope` 보유다

### 발견 일시

2026-08-31

### 관찰 사실

`.claude/prds/insuniverse-docs-60-history-deprecated.prd.md` §Evidence 가
*"Era B(2026~) 커밋은 conventional + scope, Era A(2024~25)는 자유형식"* 이라고 적었다.

관례 형식(`^type(scope)?:`)을 인덱스 6,190행에 적용하면 **두 era 다 지배적**이다 —
Era A **3,482 / 5,070** · Era B **1,006 / 1,120**. 즉 Era A 가 자유형식이라는 서술이 뒤집힌다.

두 era 를 가르는 것은 **`scope` 보유**다 — 비어 있지 않은 `(scope)` 를 가진 제목이
Era A **5** · Era B **598** (전체 603). Era A 의 `type():` 형태 **빈 scope** 가 541건이라
빈 괄호를 scope 로 세면 이 차이가 사라진다.

*추출 축이 다르다* 는 결론 자체는 남지만 근거가 바뀐다.

### 재현 절차

```
node .claude/plans/insuniverse-docs-60-history-deprecated-m5.gates.mjs prd
```

### 근거 앵커

- `docs/_meta/index/commits.server.jsonl` · `commits.site.jsonl` · `commits.admin.jsonl` — `subject` · `era`
- `.claude/prds/insuniverse-docs-60-history-deprecated.prd.md` — §Evidence

### 심각도

중. `.claude/prds/insuniverse-docs-60-history-deprecated.prd.md` §반드시 지킬 것 의 UI4
(*Era A 는 파일경로 기반*)가 이 문장을 근거로 삼고 있어, 근거가 바뀌면 그 제약의 해석도
다시 열린다. 제약 자체의 개정은 승인 사항이라 이 창이 하지 않는다.

### 상태

처리 결정됨

## F-21 · `body_present` 와 git `%B` raw body 가 랜딩 1건에서 갈린다

### 발견 일시

2026-08-31

### 관찰 사실

에픽 축 안의 본문 보유를 두 방식으로 센다.

- git `%B` 에서 제목 줄을 뗀 raw body — 랜딩 **4 / 114** · 소속 커밋 **1 / 185**
- 인덱스 `body_present` 열 — 랜딩 **3 / 114** · 소속 커밋 **1 / 185**

랜딩에서 **1건**이 갈린다. `112ef0a8…`(`Merge pull request #7 from …/feat/addPrimaryKey`)의
raw body 는 `feat: 디비 pull할 때 primaryKey 자동지정 되도록` 인데, 인덱스 추출기가 그것을
trailer 로 정규화해 `body_present: false` 로 떨어뜨렸다.

`body_present` 는 정규화 **후**의 구문 판정이라 *본문 부재* 의 증거로 쓸 수 없다.

### 재현 절차

```
node .claude/plans/insuniverse-docs-60-history-deprecated-m5.gates.mjs rederive
node .claude/plans/insuniverse-docs-60-history-deprecated-m5.gates.mjs forms
```

### 근거 앵커

- 3저장소 git — `log -1 --format=%B`
- `docs/_meta/index/commits.server.jsonl` — `body_present`
- `docs/90-history/02-epics.md` — §raw body 편중

### 심각도

중. 본문 부재를 근거로 *왜를 알 수 없다* 를 주장하는 자리에서 값이 한 건 어긋난다.

### 상태

사용자 통보

## F-22 · 등급표 A 행 `Merge pull request #N` 의 admin 계수가 14 로 적혀 있으나 실측은 13 이다

### 발견 일시

2026-08-31

### 관찰 사실

`.claude/meta/01-meta-search-report.md` 72 행이 등급 A 행 `Merge pull request #N` 의
실측을 `server 30, admin 14, site 5` 로 적는다.

인덱스에 `^Merge pull request ` 를 적용하면 **server 30 · site 5 · admin 13** 이고 합이
**48** 이다. server 와 site 는 축자로 같고 **admin 만 1 어긋난다.**

이 창은 그 파일을 고치지 않는다 — 소유가 이 PRD 밖이다.

### 재현 절차

```
node .claude/plans/insuniverse-docs-60-history-deprecated-m5.gates.mjs grades
```

### 근거 앵커

- `.claude/meta/01-meta-search-report.md` — 72 행
- `docs/_meta/index/commits.admin.jsonl` — `subject`
- `docs/_meta/ownership.md` — `.claude/meta/**` 소유

### 심각도

낮. 값 하나의 어긋남이며 이 문서의 등급 판정에는 영향이 없다 — 등급 A 의 에픽 축 교집합은
랜딩 4 · p2 계보 1 로 admin 과 무관하다.

### 상태

사용자 통보

## F-23 · 제목 축 23 에픽이 server 도메인 51 중 31만 덮고 20이 결손이다

### 발견 일시

2026-08-31

### 관찰 사실

`apps/api/src/modules/<도메인>/` 경로로 유도한 server 도메인은 **51개**다. 에픽 소속 커밋
175건(server)이 닿는 도메인은 **31개**이고 **20개가 안 닿는다.**

결손 상위는 `fax` 53 · `disease` 45 · `medication-standard` 31 · `clinical-result` 27 ·
`billing` 25 · `point` 20 으로 상위 에픽에 필적하는 규모다.

커밋-도메인 쌍으로 보면 닿음 A 1,716 · B 497 / 결손 A 201 · B 102 다.

**site 와 admin 에는 이 대조가 성립하지 않는다** — `modules/` 대응물이 없고 상위 2단계 경로가
각각 70 · 35 로 갈린다.

`.claude/meta/01-meta-search-report.md` 84 행이 *"100% 커버리지를 갖는 축은 파일 경로뿐이다"*
로 이 축의 성질을 이미 적었다. 제목 축은 그 커버리지를 갖지 못한다.

### 재현 절차

```
node .claude/plans/insuniverse-docs-60-history-deprecated-m5.gates.mjs domains
```

### 근거 앵커

- `docs/_meta/index/commits.server.jsonl` · `commits.site.jsonl` · `commits.admin.jsonl` — `files[].path`
- `.claude/meta/01-meta-search-report.md` — 84 행
- `docs/90-history/02-epics.md` — §파일경로 축이 낸 결손 20 도메인

### 심각도

높. 제목 축 하나로 모집단을 닫으면 결손이 완전성으로 보고된다. 그 자리를 막는 대조 상대가
파일경로 축이라는 기록이다.

### 상태

사용자 통보

## F-24 · `04-ops-intent.md` 의 소스 경로가 이 브랜치 트리에 존재하지 않는다

### 발견 일시

2026-09-02

### 관찰 사실

`docs/90-history/04-ops-intent.md` 는 등급 O 문서이고 그 유일한 소스가
`ops/reconcile/reconcile.jsonl` 이다. 이 브랜치에서 `git ls-files -- ops/reconcile/reconcile.jsonl`
은 **0건**이고 `git ls-files ops/` 도 **0건**이다 — 디렉터리 자체가 트리에 없다.

파일은 형제 워크트리 `.worktrees/ops-reconcile/` 안에만 있고 그 파일은 실측 **0바이트**다.
워크트리는 커밋으로 고정되지 않으므로 이 저장소의 게이트가 값으로 물 수 있는 대상이 아니다.

`ops-30-reconcile` 우산의 Delivery Milestones 는 M0 만 `complete` 이고 M1~M4 가 전건 `pending`
이다. 그래서 `ops-only` verdict 가 0건이고 등재도 0건이다.

`.claude/prds/insuniverse-docs-60-history-deprecated.prd.md` §마일스톤 6 이 *"이 마일스톤이 여는
것은 자리와 규약뿐이고 값이 아니다"* 와 *"빈 문서가 되는 것은 결함이 아니라 회부가 요구한 상태"*
로 이 상태를 착수 전에 적었다.

### 재현 절차

```
node .claude/plans/insuniverse-docs-60-history-deprecated-m6.gates.mjs opssource
```

### 근거 앵커

- `docs/90-history/04-ops-intent.md` — §소스와 등재 현황
- `.claude/prds/insuniverse-docs-60-history-deprecated.prd.md` — §Delivery Milestones 6 행 · §O-5
- `.claude/meta/05-final-spec.md` — 등급 표 O 행

### 심각도

중. 문서가 비어 있다는 사실 자체는 회부가 요구한 상태다. 기록하는 이유는 **모드가 바뀌는 시점**을
놓치지 않기 위해서다 — 소스가 트리에 들어오는 순간 등재 계수는 선언이 아니라 재유도가 되어야
하고, 그 전이가 침묵하면 빈 문서가 값 있는 문서로 오독된다.

### 상태

사용자 통보

## F-25 · `[History]` 원소 중 코드 축과 대조 가능한 것은 하나이고 그 대조는 어긋남이 아니다

### 발견 일시

2026-09-02

### 관찰 사실

`.claude/meta/10-user-oral-source.md` 머리는 코드와 어긋난 항목 **2건**과 사용자가 모른다고
적었으나 코드에 있는 항목 **1건**을 예고한다. 그 3건은 전부 `[용어]` 절 항목이다 — 고객사 ·
머니 · 대상선정기준.

`[History]` 절은 bullet **3개**이고 그중 코드 축과 같은 사건을 가리키는 것은 셋째 원소 하나뿐이다.
그 원소는 포인트가 FAX 호출에서 추가되었다는 진술이고,
`.claude/meta/07-domain-knowledge-gap.md` §2-2 는 `fax.service.ts` 의 실측으로 *"일부 경로에서만
강제"* 를 적었다.

**두 진술은 같은 축이 아니다.** 앞은 *기원*(포인트가 왜 생겼는가)이고 뒤는 *현재 강제*(지금 어느
경로가 차감을 강제하는가)다. 한쪽이 참일 때 다른 쪽이 거짓이어야 할 이유가 없으므로 이 대조는
모순의 관측이 아니다. 모순이 입증되기 전에 등급 U 규칙 3(어긋나면 코드가 정본)을 발동시키는 것은
추론을 사실로 쓰는 것이다.

나머지 두 원소(창업 경위 · 기능 증식의 이유)는 저장소 안에 대조 상대가 없다.

소스 머리의 분류는 **어긋남 2건**(고객사 · FAX 머니 차감)과 **모른다고 적었으나 코드에 있는 항목
1건**(대상선정기준)이다. 그중 `docs/90-history/00-origin.md` 의 소비처가 아닌 것은 고객사와
대상선정기준 둘이며 — 소스 문서의 소비 지침 표가 그 두 항목의 소비처를 각각 다른 문서로
지정했다 — 머니만 이 항목의 축과 겹친다. **두 분류를 하나로 접어 "어긋남 2건(고객사 ·
대상선정기준)" 으로 적으면 소스가 역전 사례로 분류한 항목을 어긋남으로 옮기는 것이다.**

### 재현 절차

```
node .claude/plans/insuniverse-docs-60-history-deprecated-m6.gates.mjs conflict
```

### 근거 앵커

- `.claude/meta/10-user-oral-source.md` — §원문 `[History]` 절 · §소비 지침 표
- `.claude/meta/07-domain-knowledge-gap.md` — §2-2
- `docs/90-history/00-origin.md` — §사정거리

### 심각도

중. 어긋남으로 적으면 등급 U 문서가 저장소 대조의 산물을 싣게 되어 최상단 고지가 문서 자신에
대해 거짓이 된다. 어느 쪽이 운영 현실인지의 판정은 이 문서 축 밖이며 그 인수처는
`.claude/meta/07-domain-knowledge-gap.md` §2-2 가 이미 이름으로 적었다.

### 상태

사용자 통보

## F-26 · 앞 창 하네스가 자기 뒤 행까지 동결해 후속 창의 정당한 전이에 구조적으로 붉어진다

### 발견 일시

2026-09-02

### 관찰 사실

`.claude/plans/insuniverse-docs-60-history-deprecated-m4.gates.mjs` 와 같은 파일의 `m5` 판이 `prd`
검사에서 **자기 행만 빼고 마일스톤 표 전 행**의 Status 를 기준선 blob 에 동결했다. 자기 **뒤**
행까지 포함한다.

그래서 후속 창이 자기 행을 정당하게 올릴 때마다 앞 창 하네스가 붉어진다. 이 창이 아무것도
건드리기 전의 실측은 다음과 같다 — 두 하네스의 착수 시점 blob 을 그대로 실행한 결과다.

```
#8  FAIL: 5 행 Status 가 이 창에서 바뀌었다 — complete (기대 pending)
#13 FAIL: 6 행 Status 가 이 창에서 바뀌었다 — in-progress (기대 pending)
```

`m4` 의 붉음은 마일스톤 5 종료 전이가 m4 기준선 뒤에 온 결과이고 이 창의 인과 밖이다. `m5` 의
붉음은 이 창의 마일스톤 6 행 전이가 원인이며, 그 전이는 계획서가 요구한 것이다.

**마일스톤 한 행만 예외로 뚫는 답은 성립하지 않는다** — 그 예외를 넣어도 `m4` 는 5 행으로 계속
붉고, 예외를 `#` 셀 키로 잡으면 번호 교환으로 예외를 다른 행에 옮길 수 있다.

이 창은 동결 대상을 **표의 물리 행 위치로 자기 행과 그 앞 행에 한정**해 닫았다. 수정 후 두
하네스의 `prd` 는 각각 앞행 5·6 을 동결하고 뒤행 4·3 을 자유로 두며 rc 0 이다.

### 재현 절차

```
node .claude/plans/insuniverse-docs-60-history-deprecated-m6.gates.mjs sibling
```

### 근거 앵커

- `.claude/plans/insuniverse-docs-60-history-deprecated-m4.gates.mjs` — `CHECKS.prd` 앞 행 동결 블록
- `.claude/plans/insuniverse-docs-60-history-deprecated-m5.gates.mjs` — `CHECKS.prd` 앞 행 동결 블록
- `.claude/prds/insuniverse-docs-60-history-deprecated.prd.md` — §Delivery Milestones 표

### 심각도

높. 기준선이 구조적으로 붉으면 신규 붉음과 기존 붉음을 가르는 축이 무너지고, 그 상태에서
*신규 0* 을 요구하는 귀속 판정이 공허해진다.

### 상태

처리 결정됨

## F-27 · 뒤 행 동결을 놓으면서 앞 창이 뒤 행을 건드렸는가의 정본이 비었다

### 발견 일시

2026-09-02

### 관찰 사실

F-26 의 수정으로 앞 창 하네스는 자기 뒤 행의 Status 를 더 이상 동결하지 않는다. 그 결과 *앞 창이
자기 뒤 행을 몰래 건드렸는가* 를 그 하네스가 답하지 않는다.

이 창은 잃는 것을 세 축으로 되받았다 — 표의 `#` 셀 물리 순서 접두 무변동 · 중복 `#` 셀 거부 ·
앞 행 `Milestone`·`Outcome` 셀 축자 무변동. 세 축은 **행 정체성**을 결박하지 행 Status 를 결박하지
않으므로, 뒤 행 Status 자체의 정본은 여전히 각 창 자신의 하네스뿐이다.

구조적 답은 **창 종료 커밋을 끝 앵커로 잡아 창 시작부터 창 종료까지의 구간만 판정**하는 것이며
선례가 `.claude/plans/insuniverse-docs-60-history-deprecated-m1.gates.mjs` 의 `check6` 에 있다. 그
방식은 앞 창 하네스 전건 개조와 그 창들의 기준선 재정의를 요구하고, 후자는 이 창이 할 수 없다 —
앞 창의 기준선은 그 창의 receipt 에 결박돼 있다.

### 재현 절차

```
node .claude/plans/insuniverse-docs-60-history-deprecated-m6.gates.mjs sibling
```

### 근거 앵커

- `.claude/plans/insuniverse-docs-60-history-deprecated-m1.gates.mjs` — `check6` 의 창 구간 판정
- `.claude/plans/insuniverse-docs-60-history-deprecated-m4.gates.mjs` — `CHECKS.prd` 앞 행 동결 블록
- `.claude/plans/codex-findings-backlog.md` — `id=60m6-window-end-anchor-absent`

### 심각도

중. 잃은 축이 실제로 뚫린 관측은 없다. 기록하는 이유는 그 축의 정본이 어디로 갔는지를 남기지
않으면 다음 창이 앞 창 하네스의 초록을 *뒤 행도 검사했다* 로 오독하기 때문이다.

### 상태

사용자 통보

## F-28 · `00-origin.md` 를 가리키는 연혁 절 링크가 0건이다

### 발견 일시

2026-09-02

### 관찰 사실

`.claude/prds/insuniverse-docs-60-history-deprecated.prd.md` 의 등급 U 3규칙 중 2번은 정책 본문에서
이 문서를 근거로 인용하지 않고 다른 문서의 `## 연혁` 절이 링크만 건다고 적었고, 예시로
`10-server/04-settlement-money.md` 와 `30-admin/03-sales-console.md` 를 든다.

발행 직후 실측에서 `docs/` 아래 `## 연혁` 절은 **40개**이고, 그 절을 가진 문서 중
`00-origin.md` 를 참조하는 문서는 **0건**이다. `00-origin` 토큰이 나오는 문서는 세 곳뿐이며 셋 다
`## 연혁` 절이 아니다 — `docs/00-index.md` 의 문서 트리 · 이 findings 파일 ·
`docs/_meta/ownership.md` 의 위임 표와 R-8 행이다.

**링크를 거는 것은 이 창의 몫이 아니다.** `## 연혁` 절은 각 문서를 소유한 형제 PRD 소관이며 이
PRD 의 §Out of scope 가 그 사실을 적었다. 이 창은 관측만 올린다.

### 재현 절차

```
node .claude/plans/insuniverse-docs-60-history-deprecated-m6.gates.mjs unmade
```

### 근거 앵커

- `.claude/prds/insuniverse-docs-60-history-deprecated.prd.md` — §반드시 지킬 것 3가지 2번 · §Out of scope
- `docs/00-index.md` — §문서 트리 `90-history/` 항목
- `docs/90-history/00-origin.md` — §등급 U 3규칙 2번

### 심각도

중. 링크가 0건인 동안 이 문서는 트리에만 있고 독자 동선에 없다. 규칙 2 가 링크를 유일한 소비
경로로 정했으므로 0건이 계속되면 문서가 고아로 남는다.

### 상태

사용자 통보

## F-29 · BASE 유도 등식의 경계는 두 가지 이유로 움직인다

### 발견 일시

2026-09-02

### 관찰 사실

이 창의 게이트 셋(`#6`·`#12`·`#13`)은 기준선을 변경 창 **밖**의 `BASE` 로 잡고, 그 값을 리터럴
신뢰로 쓰지 않기 위해 유도 등식 `BASE == WINDOW_START^` 로 대조한다. `WINDOW_START` 는 *그
커밋부터 HEAD 까지의 모든 커밋이 허용 경로만 건드리는 가장 이른 커밋* 이다.

그 정의는 **움직이는 접미 경계**이며 경계를 미는 원인이 둘이다.

1. **허용 목록의 확대.** 허용 경로는 이 계획서 §Files to Change 집합과 §게이트 산출물 면제 목록의
   합집합이다. 면제를 넓히면 더 이른 커밋이 깨끗해져 `WINDOW_START` 가 앞으로 간다.

2. **허용 밖 경로를 건드린 커밋.** 창 안에 그런 커밋이 생기면 가장 이른 깨끗한 접미가 그 커밋
   **뒤**로 밀린다. 그때 하네스의 `BASE` 리터럴을 새 `WINDOW_START^` 로 올리면 네 단언이 전건
   통과하면서 그 커밋과 그 앞의 이 창 커밋들이 검사 구간에서 통째로 빠진다.

두 경로 모두 **자기 일관적**이라 등식 자체로는 걸리지 않는다. 유일한 방어는 둘 다 diff 에 남는다는
것이다 — 면제 목록은 계획서 안이고, `BASE` 리터럴은 하네스 안이며, `#13` 이 `BASE..HEAD` 커밋
목록을 건드린 경로와 함께 출력한다.

구조적 해소는 창 밖의 **불변 앵커**이지만 이 저장소에는 CI 도 보호 ref 도 없어 이력 재작성으로
어떤 앵커도 다시 쓸 수 있다. `plan-codex` receipt 의 `base_sha` 는 대안이 아니다 — 그 값은 봉인
시점 HEAD 라서 흡수마다의 재봉인이 앵커를 창 안으로 옮긴다.

### 재현 절차

```
node .claude/plans/insuniverse-docs-60-history-deprecated-m6.gates.mjs chain
```

### 근거 앵커

- `.claude/plans/insuniverse-docs-60-history-deprecated-m6.plan.md` — §기준선은 창 밖 BASE 다 · §게이트 산출물 면제
- `.claude/plans/insuniverse-docs-60-history-deprecated-m6.gates.mjs` — `BASE` 상수와 `baseAssert`
- `.claude/plans/codex-findings-backlog.md` — `id=60m6-base-can-advance-past-violation`

### 심각도

높. 기준선이 전진하면 그 아래 변경이 세 검사에서 통째로 빠지고, 남은 구간이 허용 경로뿐이면 셋 다
초록이 된다. 게이트가 자기 사각지대를 초록으로 보고하는 형태다.

### 상태

사용자 통보

## F-30 · 앞 창 receipt 가 게이트 blob 을 묶지 않아 승인된 하네스와 편집본 사이에 감사 연결이 없다

### 발견 일시

2026-09-02

### 관찰 사실

`mccp-plan-codex` receipt 는 `plan_hash` 와 `base_sha`·`head_sha` 를 싣지만 그 계획서가 승인한
**게이트 하네스 파일의 blob id** 는 싣지 않는다. 그래서 마일스톤 4·5 의 승인된 하네스와 이 창이
Task 11 로 낸 편집본 사이에 기계로 따라갈 수 있는 연결이 없다 — 앞 창 receipt 는 여전히 초록이고,
그 receipt 가 가리키는 하네스가 바뀌었다는 사실을 어느 필드도 들지 않는다.

이 창은 값싼 절반을 닫는다. 두 파일의 **판본 쌍**을 여기에 기록하고 검사 `#10` 이 그 기록을
`git rev-parse BASE:<경로>` 와 `git hash-object --path=<경로> <경로>` 의 산출과 축자 대조한다.
편집 후 값은 워킹트리 원시 바이트가 아니라 **clean 필터를 태운 정본 blob id** 다 — 이 저장소는
`core.autocrlf=true` 라 원시 해시가 커밋될 blob 과 다르고, 그러면 기록이 감사 대상 판본을 못
가리킨다.

| 파일 | BASE blob id | 편집 후 정본 blob id |
|---|---|---|
| `.claude/plans/insuniverse-docs-60-history-deprecated-m4.gates.mjs` | `e677ec1857fff5a9aff1c5cae5c349483b46ad59` | `ffe6042cb8b582a87f75241669338695997a469f` |
| `.claude/plans/insuniverse-docs-60-history-deprecated-m5.gates.mjs` | `4e39774c3b9dbbe524c13b4a5ac76413502ab12e` | `94b5d5def5590dbb76b509049da1b3911759178c` |

남는 절반은 receipt 스키마에 게이트 blob 축을 신설해 supersession 을 증거로 만드는 것이며 mccp
본체 층위라 이 창 밖이다.

### 재현 절차

```
node .claude/plans/insuniverse-docs-60-history-deprecated-m6.gates.mjs sibling
```

### 근거 앵커

- `.claude/receipts/mccp-plan-codex/insuniverse-docs-60-history-deprecated-m6.json` — 필드 집합
- `.claude/plans/insuniverse-docs-60-history-deprecated-m6.plan.md` — Task 12 의 판본 쌍 요구
- `.claude/plans/codex-findings-backlog.md` — `id=60m6-gate-blob-not-bound-by-receipt`

### 심각도

중. 판본 쌍 기록으로 *어느 판본이 감사 대상인가* 는 특정된다. 남는 것은 그 특정이 receipt 안이
아니라 findings 안에 있다는 것이며, 그래서 receipt 하나만 읽는 하류 감사자는 여전히 연결을 못 본다.

### 상태

사용자 통보
## F-31 · 붉음 기준선 앵커만 창 안에 있어 워킹트리 상수와 동치다

### 발견 일시

2026-09-02

### 관찰 사실

이 창은 기준선을 변경 창 **밖**의 `BASE` 로 옮겼다. 검사 `#6`·`#8`·`#9`·`#11`·`#12` 가 그 값을
쓰고 `baseAssert` 네 단언이 리터럴 신뢰를 뺀다.

`#13` 의 **형제 붉음 기준선**(`CHAIN_BASELINE`)만 그 앵커를 쓰지 않는다. 그 값은 하네스 파일
자신의 생성 커밋 blob 에서 읽는다 — `git log --diff-filter=A -- <하네스>`. 코드 주석은 그 선택의
이유를 *"워킹트리 상수를 쓰면 같은 창에서 기준선과 산출을 함께 넓힐 수 있다"* 로 적었다.

**단일 커밋 창에서 그 보호는 0이다.** 하네스가 이 창에서 신설됐으므로 생성 커밋이 창 안이고,
창이 커밋 하나면 그 커밋이 곧 `HEAD` 다. 그러면 커밋 blob 과 워킹트리가 같은 바이트라 주석이
막겠다는 동작이 그대로 가능하다 — 기준선 25개 항목을 초록이 나오도록 고르고 같은 커밋에 산출과
함께 실으면 이 검사는 그것을 못 가른다.

보호가 실제로 서는 것은 하네스 신설과 `CHAIN_BASELINE` 편집이 **다른 커밋**일 때뿐이다.

구조적 해소는 F-29 와 같은 자리다 — 창 밖의 불변 앵커가 필요한데 이 저장소에는 CI 도 보호 ref 도
없다. 그래서 이 창이 닫는 것은 값싼 절반이다: `#13` 이 앵커가 `HEAD` 와 같을 때 그 동치를
출력에 이름으로 싣는다(`Task 0 커밋 <sha> == HEAD (창 안 앵커 · 워킹트리와 동치)`).

**이 관측은 커밋 `6d5cf6e` 시점의 것이고 그 뒤 창이 두 커밋이 됐다.** 이 항목을 낸 리뷰 흡수
커밋이 `CHAIN_BASELINE` 이 아니라 하네스의 다른 절을 고쳤고, 그래서 생성 커밋과 `HEAD` 가
갈렸다. 그 상태에서는 커밋 blob 과 워킹트리가 다른 바이트라 위 문단이 말한 취약 구간이 닫혀 있고,
`#13` 도 등가 접미를 찍지 않는다. **접미의 부재는 결함이 아니라 보호가 선 상태의 표시다** —
이 등가는 하네스 신설 커밋이 곧 `HEAD` 인 창에서만 관측되며 그 조건이 곧 취약 구간의 정의다.

### 재현 절차

```
node .claude/plans/insuniverse-docs-60-history-deprecated-m6.gates.mjs chain
```

출력 끝의 `기준선 출처` 를 읽는다. 하네스 신설 커밋이 `HEAD` 와 같은 창이면
`== HEAD (창 안 앵커 · 워킹트리와 동치)` 가 붙고, 다른 커밋이면 안 붙는다. 이 창은 리뷰 흡수
뒤 후자이며(`BASE..HEAD 커밋 2`), 취약 상태를 재현하려면 하네스 신설이 곧 `HEAD` 인 창 —
이 항목이 처음 관측된 `6d5cf6e` 시점 — 을 체크아웃해야 한다.

### 근거 앵커

- `.claude/plans/insuniverse-docs-60-history-deprecated-m6.gates.mjs` — `frozenChainBaseline` 과 `CHAIN_BASELINE`
- `docs/_meta/findings/60-history-deprecated.md` — F-29(같은 축의 `BASE` 쪽 절반)
- `.claude/plans/codex-findings-backlog.md` — `id=60m6-chain-baseline-anchored-inside-window`

### 심각도

중. `#13` 하나에만 걸리고 그 검사의 다른 축(신규 붉음 귀속 · 해소 사유 판정)은 `BASE` 를 쓴다.
다만 기준선이 곧 판정 기준이므로 그 자리가 자기 창 안에 있으면 `#13` 의 초록은 자기 선언에
대한 초록이다.

### 상태

사용자 통보

---

## F-32 · 형제 PRD 세 종이 findings 를 한 건도 쓰지 않았고 그것은 미머지가 아니라 미작성이다

### 발견 일시

2026-09-03

### 관찰 사실

`docs/_meta/findings/` 의 `.md` 는 8개이고 `README.md` 와 이 PRD 자기 파일을 빼면 형제 파일이
6종이다 — `00-protocol` · `10-index-git` · `11-index-code` · `12-index-runtime` ·
`13-relation-contract` · `20-foundation-access`. `30-contracts-limits` · `50-domain` ·
`70-viewer` 는 파일 자체가 없다.

**아직 머지되지 않은 것이 아니다.** 그 셋의 원격 브랜치 `origin/30-contracts-limits` ·
`origin/50-domain` · `origin/70-viewer` 를 `git ls-tree` 로 열어도 같은 8개뿐이다. 세 브랜치
어디에도 자기 findings 파일이 없다.

그중 둘은 아직 열려 있다 — `50-domain` 은 `Delivery Milestones` 7행이 in-progress · 8행이
pending 이고, `70-viewer` 는 7행이 pending 이다. `30-contracts-limits` 는 8/8 complete 다.

기록만 남긴다. 형제 파일 본문의 소유는 그 파일을 만든 PRD 에 있고(`docs/_meta/findings/README.md`
§소유 경계) 이 PRD 는 회수하는 쪽이다.

### 재현 절차

```bash
ls docs/_meta/findings/*.md
for b in 30-contracts-limits 50-domain 70-viewer; do
  echo "== $b"; git ls-tree --name-only "origin/$b" docs/_meta/findings/
done
```

### 근거 앵커

- `docs/_meta/findings/README.md:9` (§소유 경계 — 각 파일의 본문은 그 파일을 만든 PRD 소유)
- `.claude/prds/insuniverse-docs-50-domain.prd.md` §Delivery Milestones (7 in-progress · 8 pending)
- `.claude/prds/insuniverse-docs-70-viewer.prd.md` §Delivery Milestones (7 pending)
- `.claude/plans/insuniverse-docs-60-history-deprecated-m7.gates.mjs` 검사 `#9` (`unswept`) — 형제 id
  유도와 findings 부재 집합을 매 실행 재계산하고 **공집합이면 실패**로 둔다

### 심각도

중 — 회수 완전성의 상한이 이 세 파일의 부재로 정해진다. 이 PRD 의 폐기 축 판정은 *형제가 기록한
것* 까지만 덮으며, 세 PRD 가 관측했으나 기록하지 않은 폐기 후보가 있다면 이 창은 그것을 못 본다.
범위 밖 손실은 아니고 **미검증 구간**이다.

### 상태

사용자 통보

---

## F-33 · `11-index-code.md` 는 발견을 표제가 아니라 표 행으로 담아 표제형 파서에 0건으로 보인다

### 발견 일시

2026-09-03

### 관찰 사실

`docs/_meta/findings/README.md` §기록 형식은 *"발견 하나가 `## ` 표제 하나"* 로 규약을 못 박는다.
스윕 우주 6파일 중 5가 그것을 따르고 `11-index-code.md` 는 따르지 않는다.

그 파일의 `## ` 표제 4개는 `1. 발견` · `2. 규약 개정 요청` · `3. 부록 A` · `4. 이월` 이고 발견
본체는 `## 1. 발견` 절 안의 **표 81행**에 있다. 필수 6항목 보유(≥5)를 발견 술어로 쓰면 이 파일은
발견 0건으로 나온다.

즉 표제형 파서 하나만 두면 발견 **81건이 통째로 사각**이다. 우주 전체의 발견은 표제형 71 +
표형 81 = 152 이고 그중 절반 이상이 이 한 파일에 있다.

두 채널(본문의 이 PRD id 지목 · `05-final-spec.md` §3 배치 `deprecated` 어휘)로 그 81행을 실제로
읽었을 때 적중은 **0건**이다. 그 0 은 파서가 그 파일을 읽고 낸 0 이며, 표제형 파서가 4/0 으로
넘긴 침묵의 0 이 아니다.

항목 표기 형태도 파일마다 갈린다 — `10-index-git` 은 `**발견 일시** —`, `12-index-runtime` 은
`- **발견 일시**:`, `20-foundation-access` 는 `### 발견 일시` 다. 한 형태만 받으면 파일 단위로
통째 결손이 난다.

### 재현 절차

```bash
node .claude/plans/insuniverse-docs-60-history-deprecated-m7.gates.mjs sweep
# 파일마다 어느 파서가 답했는지 `파서 귀속 {…}` 로 이름이 붙는다
```

### 근거 앵커

- `docs/_meta/findings/README.md:21` (§기록 형식 — 발견 하나가 `## ` 표제 하나)
- `docs/_meta/findings/11-index-code.md:5` (`| # | 발견 | 근거 (파일:행) | 영향 | 조치 |` 표 헤더)
- `.claude/plans/insuniverse-docs-60-history-deprecated-m7.gates.mjs` 검사 `#1` (`sweep`) —
  표제형이 0 을 낸 파일에 표형 파서를 **강제**하고 두 파서 합계 0 을 파서 파손으로 둔다

### 심각도

중 — 회수기 결함으로 직결되는 형식 이탈이다. 이 창은 두 파서로 덮었고 적중 0 을 관측으로 남겼다.
규약과 실물 중 어느 쪽을 고칠지는 `00-protocol`(디렉터리·형식 소유)과 `11-index-code`(본문 소유)의
판단 사항이며 이 PRD 는 판단하지 않는다.

### 상태

사용자 통보

---

## F-34 · golden 의 `fixtask.findings_headings` 는 표제 수이지 발견 수가 아니고 표제 안 본문을 동결하지 않는다

### 발견 일시

2026-09-03

### 관찰 사실

`docs/_meta/verify/golden.txt` 의 `fixtask.findings_headings` 는
`00-protocol=1 10-index-git=28 11-index-code=4 12-index-runtime=34 13-relation-contract=10
20-foundation-access=4 60-history-deprecated=31` 로 **`## ` 표제 수**를 센다
(`verify.sh` 의 `findings_heading_count`).

그 값은 발견 수가 아니다. `11-index-code=4` 는 발견 81건이 아니라 절 4개이고,
`10-index-git=28` 은 발견 26 + 비발견 표제 2다.

더 중요한 것은 **표제 안의 본문 변경이 동결되지 않는다**는 점이다. 형제가 어떤 발견의 `상태`
절을 고쳐 이 PRD 를 지목해도 표제 수는 안 움직이고 이 키도 안 움직인다. 그래서 이 키로는 회수
완전성도, 회수의 유효기간도 주장할 수 없다.

이 창은 그 자리를 golden 에 얹지 않았다 — `verify.sh` 편집은 이 PRD 의 위임 밖이다. 대신 회수
원장 meta 가 스윕 우주 6파일의 **sha256** 을 싣고 게이트 `#3` 이 매 실행 재계산해 양방향
대조한다. 한 바이트라도 다르면 그 경로와 함께 rc 1 이다.

### 재현 절차

```bash
grep '^fixtask.findings_headings' docs/_meta/verify/golden.txt
node .claude/plans/insuniverse-docs-60-history-deprecated-m7.gates.mjs sweep   # 발견 수
node .claude/plans/insuniverse-docs-60-history-deprecated-m7.gates.mjs pin     # sha256 결박
```

### 근거 앵커

- `docs/_meta/verify/golden.txt` `fixtask.findings_headings` 행
- `docs/_meta/verify/verify.sh:1195` (`emit "fixtask.findings_headings"` — `findings_heading_count` 전사)
- `.claude/plans/insuniverse-docs-60-history-deprecated-m7.ledger.jsonl` 1행 (`record: "meta"` 의
  `sweep_universe[].sha256`)

### 심각도

중 — 이 키를 완전성 근거로 읽으면 거짓 안전이 된다. 실제 결박은 원장 meta 가 지며, 그 결박은
이 PRD 의 게이트 안에서만 돈다(저장소 공용 `verify.sh` 에는 없다).

### 상태

사용자 통보

---

## F-35 · `samsung-s2-report` 정정의 근거였던 prod tip 은 그 시점에 미동결이었고 지금은 커밋된 핀으로 재유도된다

### 발견 일시

2026-09-03

### 관찰 사실

`docs/_meta/findings/12-index-runtime.md` F-01 은 `10-index-git` 의 `dead-code-candidate` 회부를
받아 *"prod 선언 있음, 폐기 후보 아님"* 으로 스스로 정정했고 상태가 `처리 결정됨` 이다. 그
정정문이 근거로 든 `origin/prod` SHA 는 같은 문단이 **미동결**이라고 명시한다.

지금은 `docs/_meta/index/index-pins.lock` `[prod_tip]` 이 3저장소 tip 을 커밋된 핀으로 고정한다.
그 값과 `docs/_meta/extraction-manifest.yaml` `repos[].head` 를 각각 파싱해 두 트리에서 dockerfile
`case` **라벨**을 세면 핀 prod 2/17 · 동결 stg 0/15 이고 스케줄 소스 파일은 두 트리 모두에 실재한다.

즉 형제의 정정은 유지된다. 다만 이 창의 산출은 그 판정을 받아 적은 것이 아니라 **커밋된 핀
값으로 다시 유도한 것**이고, 그 차이가 재판정의 내용이다.

세는 단위가 라벨이라는 점이 함정이다. 같은 `case` 팔이 라벨과 실행 경로 양쪽에 토큰을 실어
문자열 출현만 세면 4가 나온다(라벨은 2다).

### 재현 절차

```bash
node .claude/plans/insuniverse-docs-60-history-deprecated-m7.gates.mjs samsung
# 기대: 핀 prod 라벨 2/17 · 동결 stg 라벨 0/15 · 소스 실재 1 · 필터5도달 fail · 두 SHA 상이
```

### 근거 앵커

- `docs/_meta/findings/12-index-runtime.md` F-01 §정정 (2026-08-06) — *미동결* 명시
- `docs/_meta/index/index-pins.lock:7` (`insuniverse-server=2d3b238e8e8feea176d828ea21c4b215a711dd3b`)
- `docs/_meta/extraction-manifest.yaml:62` (`head: "4d798f55f021d93c889725e50f18cbce20272fd1"`)
- `insuniverse-server/apps/api/dockerfile:54-55` (prod `2d3b238e` — 라벨 2)

### 심각도

낮 — 판정 방향은 안 바뀐다. 기록하는 이유는 *근거의 판본* 이 바뀌었기 때문이다. 미동결 tip 에
기댄 판정은 그 tip 이 움직이면 조용히 낡고, 그 사실이 판정문에 남아 있지 않으면 다음 사람이
재유도 없이 승계한다.

### 상태

처리 결정됨

---

## F-36 · 배제된 머지 본문의 포함관계는 제목 형태별로 갈리고 인덱스 안에서는 24/30 이 미포함이다

### 발견 일시

2026-09-03

### 관찰 사실

`docs/_meta/findings/10-index-git.md` F-10-22 는 `commit` 소스에서 배제된
`is_merge && body_present` 30건(server 17 · site 4 · admin 9)을 기록하고 *"버린 것이 아니라
소스에서 뺀 것"* 으로 정리한다. 추출기 없이 `commits.<repo>.jsonl` 을 재유도하면 30 과 `commit`
소스 557 이 문서 표·재현 기대와 일치하고 SHA 집합도 30/30 양방향으로 같다.

**포함관계는 형태별로 갈린다.** 30건의 본문을 같은 저장소 인덱스의 다른 커밋 제목·본문에 대해
포함 검사하면 포함 6 · 미포함 24 다. 제목 형태는 `Merge pull request` 23 · `merge(stg)` 3 ·
`Merge(기타)` 2 · `Merge branch` 1 · `merge:` 1 로 5종이다.

`Merge pull request #N` 형의 본문은 대개 머지된 쪽 커밋의 제목 한 줄인데, 그 커밋 자체가
인덱스에 없다 — 예: `9a7a2ed3` 의 본문
`feat(security): /treat/certify 레이트리밋 (게이트 OFF 기본)` 로 저장소 전체를 `--grep` 해도
그 머지 커밋 하나만 잡힌다. `merge(stg):` 형 3건의 본문은 아예 그 형태가 아니라 충돌 해소
로그다(`40fb82e5` 는 4건 열거).

그래서 *"정책 서술이 있었다면 머지된 쪽 커밋 본문에도 있다"* 는 30건 전체에 균일하게 참이 아니다.

**그럼에도 폐기 축 후보는 아니다.** 30건 전건이 핀 prod tip 또는 동결 stg head 의 조상이다
(도달 30/30). 배제가 인덱스에서 지우는 것은 *본문 텍스트* 이지 배포 도달성이 아니다.

### 재현 절차

```bash
node .claude/plans/insuniverse-docs-60-history-deprecated-m7.gates.mjs mergebody
# 기대: merge+body 30 · commit 소스 557 · 문서 대조 일치 · 포함 6 · 미포함 24 · 형태 5종 · 도달 30/30
```

### 근거 앵커

- `docs/_meta/findings/10-index-git.md` F-10-22 §관찰 사실 (전건 SHA 표 · 제목 분포)
- `docs/_meta/index/commits.server.jsonl` (`9a7a2ed3` · `40fb82e5`)
- `docs/_meta/index/extract-policy-candidates.mjs` `buildCommits` (`is_merge` 무조건 건너뜀)
- `.claude/plans/insuniverse-docs-60-history-deprecated-m7.gates.mjs` 검사 `#6` (`mergebody`)

### 심각도

중 — 배제 규칙 자체의 판단은 인덱스 생성기 소유(`10-index-git`, archived)라 이 PRD 밖이다.
이 창이 남기는 것은 포함관계가 형태별로 갈린다는 사실과, 미포함 24건의 본문이 인덱스의
`commit` 소스에서 복원되지 않는다는 관측이다. 후보 승격 여부는 판정하지 않았다.

### 상태

사용자 통보

---

## F-37 · PRD §Risks 의 배치 완화책이 실측과 어긋나 무기한 조건이었다

### 발견 일시

2026-09-03

### 관찰 사실

이 PRD §Risks 의 *"형제 findings 회수가 늦어 판정 누락"* 행은 완화책을
*"형제 마일스톤 종료마다 회수. 마일스톤 7을 형제 전체 종료 이후로 배치"* 로 적고 있었다.

착수 시점 실측에서 그 조건은 참이 아니다 — `50-domain` 은 마일스톤 7 in-progress · 8 pending
이고 `70-viewer` 는 7 pending 이며 그 행 Outcome 이 *"계약 #1 확보 시에만"* 이라 조건부다.
`20-foundation-access` 6/6 과 `30-contracts-limits` 8/8 만 complete 이고
`40-runtime-vendor-legal` 은 archived 다.

*형제 전체 종료* 를 착수 조건으로 두면 이 마일스톤은 무기한 열려 있게 된다. 일정 가정을 기계
결박으로 바꾸는 것이 사용자 판정(UI18)이며, 그래서 완화책 셀을 원장 meta sha256 결박으로 개정하고
옛 가정을 철회한 것으로 명시했다.

### 재현 절차

```bash
node .claude/plans/insuniverse-docs-60-history-deprecated-m7.gates.mjs prd
# 기대: Risks 배치 셀 1개만 변동 · OQ 기존 9 무변동 + 신설 1
node .claude/plans/insuniverse-docs-60-history-deprecated-m7.gates.mjs pin
# 결박의 집행 지점 — 스윕 우주 sha256 양방향 대조
```

### 근거 앵커

- `.claude/prds/insuniverse-docs-60-history-deprecated.prd.md` §Risks (해당 행 완화책 셀)
- `.claude/prds/insuniverse-docs-50-domain.prd.md` §Delivery Milestones (7 in-progress · 8 pending)
- `.claude/prds/insuniverse-docs-70-viewer.prd.md` §Delivery Milestones (7 pending · 조건부 Outcome)
- `.claude/plans/insuniverse-docs-60-history-deprecated-m7.gates.mjs` 검사 `#10` (`prd`) ·
  검사 `#3` (`pin`)

### 심각도

낮 — 문서 안의 완화책 문면 문제이고 산출물에는 닿지 않는다. 기록하는 이유는 *검사 없는 규범이
문서에 남아 있으면 그것이 지켜진 것으로 읽힌다* 는 축(INV4)의 실례이기 때문이다.

### 상태

처리 결정됨
