# Codex Findings Backlog

`DEFER_TO_BACKLOG` 판정분. 형식: `YYYY-MM-DD | severity | source plan | one-line finding`

2026-08-05 | HIGH | .claude/plans/doc-template-kit.plan.md | 참조 해결(--strict-refs)을 CI 에 강제 — 현재 저장소에 CI 없음. CI 도입 시 재검토
2026-08-05 | HIGH | .claude/plans/insuniverse-docs-00-protocol.plan.md | 무인증 `GET /admin/menu/all` 노출 자체의 수정 — Codex R1 F3 이 '데이터 의존이 아니라 고칠 결함으로 다루라'고 지적. PRD §Out of scope(사용자 판단)이므로 backlog 로 이월
2026-08-05 | MEDIUM | .claude/plans/insuniverse-docs-10-index-git.plan.md | F3 frozen-site _site/→front/ rename 계보 통합 테스트 — 마일스톤 5 가 매핑 소유자이므로 그 시점에 --follow 개별 질의로 검증 — RESOLVED 2026-08-10: 마일스톤 5 가 F-10-17/F-10-18 로 답했다 (rename 검출 0건 · 바이트 동일 사본 · 배포 노출 unknown)
2026-08-05 | HIGH | .claude/plans/insuniverse-docs-11-index-code.plan.md | 마일스톤 6 policy-candidates.code.jsonl 이 id(namespace:symbol)를 FK 로 실제로 쓰는지 검증하는 픽스처 — E0202 4심볼이 4개 후보로 갈리고 합쳐지지도 늘어나지도 않음을 증명 (Codex F3 잔여분)
2026-08-05 | MEDIUM | .claude/plans/insuniverse-docs-11-index-code.plan.md | 50-domain PRD 의 scope/acceptance 에 §14 표기 규약 15행 수령을 명문화 — 11-index-code 는 형제 PRD 를 수정하지 않는 규약이라 이관 수락은 그쪽 계획 시점 (Codex F5 잔여분) — ALREADY-IN-PRD 2026-08-24: PRD §반드시 지킬 것 이 `admin-corp.temp.md §14` 표기 규약 15행 수령을 이미 명문화하고 있고 digest 대조 규약까지 싣는다. 마일스톤 1 이 그 사실을 §형제 findings 회수 표에 판정으로 고정했다
2026-08-05 | MEDIUM | .claude/plans/insuniverse-docs-11-index-code.plan.md | active_reference_count 를 import 해석 기반 정밀 계수로 승격 — 현재는 지역 식별자 단어경계 개수라 동명이인이 합산된다(identifier_ambiguous 로 표시). TS resolver 필요 → 마일스톤 1
2026-08-06 | MEDIUM | .claude/plans/insuniverse-docs-11-index-code.plan.md | 부록 A digest 재현이 외부 리뷰어에게 반복 실패한다 — santa-loop R3(14행) · R6·R7(16행 / `91ac9212…`). R7 에서 원인을 특정했다: 16행/`91ac9212…` 는 문서 필터에서 `!l.startsWith("| 항목")` 헤더 제외를 빠뜨렸을 때 나오는 값이며 재현으로 증명했다. 즉 함정은 표식 문자열 노출 + 헤더 제외 의존 둘 다다. 대책으로 기대값 대조문을 문서에 넣었으나(§3-1 규칙 2), 근본 해결은 재현 규칙을 산문이 아니라 **실행 가능한 스크립트 파일**로 옮기고 문서는 그 출력만 인용하는 것
2026-08-06 | HIGH | .claude/plans/insuniverse-docs-11-index-code-m1.plan.md | `00-protocol` 에 벤더/메뉴 정규식 개정 요청 반영 — `vendor_codes` 가 env 변수명 26종을, `menu_codes` 가 서버 에러 상수 7종을 통과시킨다(findings 발견 8·9). manifest 는 이 PRD 에서 읽기 전용이라 여기서 못 고친다. 더 근본적으로 `code_namespaces` 에 `membership: pattern | source` 구분이 필요하다 — 정규식이 소유권 주장인지 모양 제약인지 현재 규약에 없다
2026-08-06 | MEDIUM | .claude/plans/insuniverse-docs-11-index-code-m1.plan.md | 심볼 없는 등장 1,870건의 정밀화 — 현재는 개수와 앵커만 gap 에 남긴다. `codefCode === 'CF-13000'` 형 비교 리터럴은 소비처로서 의미가 있으므로, import 해석 기반 계수(위 2026-08-05 MEDIUM 항목)와 함께 consumed_by 로 승격 검토
2026-08-06 | MEDIUM | .claude/plans/insuniverse-docs-11-index-code-m1.plan.md | 축 간 코드값 중복(`MEM002`·`POP001`·`SUB00x`)이 **의미상 같은 개념인지 우연한 글자 충돌인지** 미판정 — 현재는 cross_source 로 사실만 표기한다. 판정은 도메인 지식이 필요하며 50-domain 몫일 수 있다 — OWNED-DEFERRED 2026-08-24: 이 PRD 몫이 맞다. 축 간 코드값 중복의 의미 판정은 도메인 서술이 붙는 자리에서만 가능하며 그 자리는 `docs/10-server/` 8종이다 — 마일스톤 8 의 입력으로 이월한다. 마일스톤 1 은 그 8종의 템플릿(`policy-doc@1`)만 확정했다 — CLOSED-BY-DECISION 2026-08-31: ADJUDICATED 2026-08-31: 마일스톤 8 이 판정했다. 분모를 `docs/_meta/index/codes/*.yaml` 전건에서 재유도하니 둘 이상 파일에 걸친 코드는 5건(`MEM002`·`POP001`·`SUB001`·`SUB002`·`SUB004`)이고, 묶음 토큰 `SUB00x` 는 `^(CRP_)?SUB[0-9]{3}$` 로 전개해 9건이다(`CRP_` 접두 계열 2건 포함). 판정은 행 라벨이 아니라 코드별 **동치 클래스 분할**로 적었다 — 같은 그룹이 동일 개념, 다른 그룹이 글자 충돌이며 분할이라 모순 원장이 구성상 불가능하다. 결과: 5건 전건이 **글자 충돌**이다(도메인 코드 축과 메뉴 코드 이름공간이 갈린다). `SUB003` 은 singleton 이라 중복이 아니고, `CRP_SUB002`·`CRP_SUB003` 은 무접두 계열과 다른 코드다. 원장은 `.claude/notes/insuniverse-docs-50-domain-m8.md` §코드값 충돌 판정 원장, 좌표는 `docs/10-server/**` 이며 게이트 `#10` 이 분할의 완전·배타와 좌표 실재를 매 실행 문다
2026-08-06 | LOW | .claude/plans/insuniverse-docs-11-index-code-m1.plan.md | `menu_db.yaml` 의 `stg-db:` 유사-저장소 접두어 규약화 — 선언이 저장소 밖(live DB)인 항목의 symbol 접두어를 무엇으로 할지 manifest 에 규약이 없다. 현재는 생성기가 `stg-db` 를 쓴다
2026-08-05 | LOW | .claude/plans/insuniverse-docs-11-index-code.plan.md | admin.temp.md §11(근거 파일 인덱스 29행)의 본문 보존 여부 판단 — 코드 리터럴 0건이라 이 축 승격 대상이 아니고, 경로 전부가 admin 저장소에서 재구성 가능해 §14 와 손실 등급이 다르다. 10-index-file / 00-protocol 몫
2026-08-06 | MEDIUM | .claude/plans/insuniverse-docs-00-protocol-m4.plan.md | TS 파서 기반 주석 렉서 도입 검토 — Codex R2-F2 잔여. 이중 정책(엄격/편집증) 차분 게이트가 한쪽 방향 오판을 덮지만 '둘이 같이 틀리는' 구성은 남는다. 닫는 유일한 경로가 파서이나 저장소의 신규 의존 0 원칙과 충돌하므로 M4 범위 밖
2026-08-07 | MEDIUM | .claude/plans/insuniverse-docs-00-protocol-m5.plan.md | `template-config.yaml` 의 `actors` 6종 실측 확정 — Codex R1-F1 잔여. 정본 `docs/01-foundation/01-glossary.md` 가 하류 PRD(`20-foundation-access`) 산출물이라 M5 를 묶으면 의존이 역전된다. lint 미검사 키이며 지금 책상에서 정하면 `menu_codes` 정규식 실패를 반복한다. 정본 생성 시 정정
2026-08-07 | HIGH | .claude/plans/insuniverse-docs-00-protocol-m6.plan.md | onboarding-questions 파서의 negative fixture 를 `verify.sh --selftest` 에 편입 — Codex R1-F2/next-steps 잔여. `--selftest` 는 `VERIFY_MANIFEST` 하나로 fixture 를 물리므로 두 번째 env 오버라이드(`VERIFY_ONBOARDING`)와 재귀 실행 경로 분기가 필요하다. M6 은 계획서 §음성 대조 8종(키 중복·src↔owner 발산·미승인 종료 포함)이 같은 경로를 덮는 데서 멈춘다. selftest 가 fixture 오버라이드를 2개 이상 받도록 일반화될 때 편입
2026-08-07 | LOW | .claude/plans/insuniverse-docs-00-protocol-m5.plan.md | `evidence_grades` 15종의 기계 파생 대조 — Codex R1-F4 잔여. `05-final-spec.md` §2 표가 등급 슬러그(`S-test` 등)를 담지 않아 슬러그↔행 매핑을 새로 정의해야 하고, 그것은 정본에 없는 규약을 책상에서 만드는 일이다. M5 는 사람 대조 결과를 계획서 §키별 파생 근거 에 남기는 데서 멈춘다. §2 가 슬러그를 갖도록 개정되면 기계화 가능
2026-08-10 | LOW | .claude/plans/insuniverse-docs-00-protocol-m6.plan.md | `src`·`q` 의 따옴표 형태 검사를 `oq_records()` 에도 두어 두 경로의 파싱 계약을 일치시킨다 — santa 라운드 12 Reviewer B 제안(결함 아님). 현재 형태 검사는 `run_onboarding_gate` 의 레코드 형태 awk 에만 있고 `gen_report` 는 `oq_records` 를 직접 부른다. 인자 없는 리포트 모드는 `validate_candidate` 를 타지 않으므로 그 경로에서는 형태 검사가 돌지 않는다. 실효는 없다 — 리포트 모드는 정보용이고, 판정 모드(`--check`·`--update`)는 둘 다 게이트를 타며, 형태가 깨지면 `set_sha256` 이 움직여 golden 이 잡는다. 구조적 비대칭만 남으므로 수렴 라운드에서 미검토 코드를 더하지 않고 이월한다
2026-08-10 | HIGH | .claude/plans/insuniverse-docs-00-protocol-m5.plan.md | doc-kit `lint-docs.mjs` 에 config 파싱 결과 출력 모드(`--print-config` 류)를 열어 `verify.sh` 가 자기 추출값을 lint 의 추출값과 **직접 대조**하게 한다 — santa m5 라운드 1~4 흡수 6건이 전부 이 축이었다(`tc_list`/`tc_scalar` vs `parseFlatYaml` 이 같은 파일을 읽는 독립 구현 둘). 매 라운드 정확히 한 건씩 발산이 나왔고(중복 키 · 블록형 · `]#c` · `'…'`/따옴표 안 `#` · 리스트 원소 `"…"` · 콜론 뒤 공백), 문법 하위집합을 열거해 막는 방식은 열거가 끝났음을 증명할 수 없다. 값 대조 1건이 이 축 전체를 닫는다. m5 가 못 한 이유: `lint-docs.mjs` 에 덤프 모드가 없고 `parseFlatYaml` 은 내부 함수이며 doc-kit 은 동결 자산이자 이 PRD 배타 소유 경로 밖이다. `doc-template-kit` PRD 소관이며 그쪽이 열어 주면 m5 의 열거식 좁히기(현재 tc_guard 5종 검사)를 대조 1건으로 대체할 수 있다
2026-08-10 | HIGH | .claude/plans/insuniverse-docs-00-protocol-m7.plan.md | `ownership.md` §공유 자산 충돌 방지 프로토콜 5행을 `<자산>\|<소유자>\|<나머지 PRD의 접근>` 행 단위로 정규화해 우산 표와 대조한다 — Codex R4-F1 잔여(동결 라운드 이월). 현 계획의 검사 3 은 **자산명 열만** 보므로 `docs/00-index.md` 의 소유자를 다른 PRD 로 바꾸거나 "읽기 전용" 규칙을 지워도 5개 이름만 유지되면 통과하고, `ownership.shared_assets` golden 도 같은 열만 동결한다. `ownership.md` 가 소유권 정본이 되는 계획이므로 잘못된 쓰기 권한이 정본으로 출하될 수 있다. 수정 자체는 R2-F0 이 PRD 표에 이미 적용한 행 단위 정규화의 일반화 1건이며(소유자·접근 열만 바꾸는 음성 대조 2종 동반), 라운드 상한 초과로 body 를 동결한 뒤 나와 이월한다
2026-08-10 | HIGH | .claude/plans/insuniverse-docs-00-protocol-m7.plan.md | **사용자 결정 필요** — `00-index.md` 사후 재생성 경로를 남길 것인가, UI3 대로 완전 동결할 것인가. Codex R1-F0 · R2-F2b · R4-F0 이 세 라운드에 걸쳐 같은 축을 제기했고 매번 부분 기각했다. 사실관계: 파일 단위 트리의 정본은 `05-final-spec.md` §4 하나뿐이고, 우산 §분할 맵은 디렉터리 glob 만 규정하며, 문서 PRD 5개는 전부 DRAFT 이고 `50-domain` OQ 가 *"§4 묶음을 그대로 쓸 것인가"* 를 열어 두었다. 계획은 3단계 개정 경로(정본 개정 → `00-protocol` 소유자가 인덱스 재생성 → `--update`)를 남겼는데, 이는 UI3 *"이후 아무도 이 파일을 건드리지 않게"* · 우산 `:143` 읽기 전용 규약과 문언상 충돌한다. 대안 A: 현행 유지(잠정 트리 + 기록된 개정 경로) — 하류가 잠정 경로로 착수했다가 정본이 바뀌면 문서가 낡은 경로에 생길 위험. 대안 B: M7 완료 전 파일별 트리 확정 — `50-domain` OQ 가 `10-index-git` 의 `Admin/Point` 판별을 기다리고 인덱스 3종 미착수라 M7 이 손자 마일스톤에 매달린다. 계획은 A 를 택하고 잠정성을 문서·PRD OQ·golden 3중으로 기록했으나, 선택 자체는 사용자 몫이다 — NOT-OURS 2026-08-24: 이 PRD 는 그 행의 **인용 대상**일 뿐 판정 주체가 아니다. `docs/00-index.md` 는 이 PRD 에 읽기 전용이고(배타 소유 밖) 재생성 경로의 결정은 사용자 몫으로 그대로 열려 있다. 이 PRD 의 Open Question(§4 묶음)이 그 행에 인용된 것이 소유 이전을 뜻하지 않는다
2026-08-10 | MEDIUM | .claude/plans/insuniverse-docs-00-protocol-m7.plan.md | `ownership.md` 무손실 승계 검사(검사 2d)를 하류 8개 PRD 로 일반화한다 — 구현 시점 Codex IF3 잔여. m7 은 이 파일의 소유 PRD(`00-protocol`) 하나에만 "PRD §배타 소유 경로 ⊆ ownership.md 소유 쌍" 을 강제한다. 일반화가 지금 불가한 이유는 표기 정규화다: 우산은 `comments.*.jsonl` 같은 축약을 쓰고 10·11·12 자기 PRD 는 전 경로를 쓰며, 문서 PRD 5종은 우산에 없는 `docs/_meta/findings/<id>.md`·`docs/_meta/term-requests/<id>.md` 를 각자 선언한다 — 지금 넣으면 DRAFT 표기 차이가 곧바로 거짓 실패가 된다. 하류가 착수하며 자기 선언을 확정할 때 정규화 규약과 함께 넣는다
2026-08-10 | RESOLVED(m7 구현) | .claude/plans/insuniverse-docs-00-protocol-m7.plan.md | 위 `2026-08-10 | HIGH | …공유 자산 충돌 방지 프로토콜 5행을 행 단위로 정규화…` 항목은 m7 구현에서 닫혔다 — 구현 시점 Codex IF4 가 같은 축을 다시 제기했고, `md_table` 3열 정규화 + `ownership.shared_assets_sha256` golden 행 + 음성 대조로 흡수했다. 이월 상태 아님
2026-08-10 | MEDIUM | .claude/plans/insuniverse-docs-00-protocol-m7.plan.md | m7 이 추가한 파서 6종(`md_section`·`md_table`·`ow_rows`·`tree_paths`·`path_overlaps`·`lint_glob_covers`)을 `--selftest` fixture 로 편입한다 — 코드 리뷰 잔여. 현 `--selftest` 는 `VERIFY_MANIFEST` 하나로 fixture 를 물려 manifest 파서 불변식 11종만 돈다. 신규 6종에는 manifest 파서에 fixture 를 둔 이유(조용한 fail-open)가 그대로 있고, m7 은 반사실 대조를 사람이 손으로 돌리는 데서 멈췄다. 편입 경로는 2026-08-07 HIGH 항목(onboarding fixture)과 같다 — selftest 가 fixture 오버라이드를 2개 이상 받도록 일반화될 때 둘을 함께 넣는다
2026-08-10 | LOW | .claude/plans/insuniverse-docs-00-protocol-m7.plan.md | m7 게이트의 구조적 잔여 4건 — 코드 리뷰 잔여, 전부 현재 도달 불가이거나 대칭 상쇄된다. 1) `lint_glob_covers` 의 `case` 패턴은 `*` 가 `/` 를 넘어(`docs/0*/` 가 `docs/01-foundation/sub/` 에 매치) 실제 pathname 확장과 의미가 다르다 — `doc_prd_paths` 정규식이 `docs/NN-name/**` 한 단계로 막아 도달 불가. 2) `run_index_gate` 검사 4 가 `99-deprecated` 파일 2개를 스크립트 리터럴로 박았다 — 같은 파일이 "리터럴은 검사 없는 규범" 을 세 곳에서 말하는 것과 어긋나나 fail-closed 다. 3) `tree_paths` 의 `pre[]` 가 초기화되지 않아 앞선 디렉터리 없는 깊이에 낡은 접두가 붙을 수 있다 — index·spec 이 같은 추출기를 쓰므로 검사 1 에서 대칭 상쇄된다(전사 대조의 구조적 한계이며 `tree_sha256` 이 동결로 받는다). 4) `ownership.shared_assets` 열거를 공백으로 잇는데 자산명 `발견한 버그·불일치` 에 공백이 있어 경계가 모호하다 — 완결성은 같은 라운드의 `shared_assets_sha256` 이 맡는다
2026-08-10 | LOW | .claude/plans/insuniverse-docs-00-protocol-m7.plan.md | `verify.sh` 2160행 · `run_ownership_gate` 150행 — 파일 800행 · 함수 50행 기준 초과. 게이트 4종을 별 파일로 뗄 수 있으나 `--selftest` 가 자기 파일을 재귀 실행하는 구조라 분할이 그 경로를 건드린다. 위 fixture 일반화와 같은 라운드에서 함께 본다
2026-08-10 | MEDIUM | .claude/plans/insuniverse-docs-12-index-runtime-m5.plan.md | .mcp.json 이 UTF-8 BOM(ef bb bf)으로 시작해 JSON.parse 가 실패하고, Playwright 실행 경로가 호스트 로컬 Naver Whale 절대경로로 고정돼 있다 (12-index-runtime 축 밖 — 별도 처리)
2026-08-11 | RESOLVED(santa m7 R5) | .claude/plans/insuniverse-docs-00-protocol-m7.plan.md | 위 `2026-08-10 | MEDIUM | …파서 6종을 --selftest fixture 로 편입…` 항목은 닫혔다. 편입 경로가 2026-08-07 HIGH(onboarding fixture)와 같을 것이라는 전제가 틀렸다 — 그쪽은 `VERIFY_MANIFEST` 처럼 **스크립트를 재호출**해 fixture 를 물리므로 두 번째 env 오버라이드가 필요했지만, md 파서는 순수 함수라 `expect_fn` 으로 **in-process** 호출하면 된다. env 오버라이드 일반화 없이 fixture **24건**이 들어갔고(`tree_paths` 5 — 정상 출력 포함 · `md_section` 2 · `md_table` 1 · `prd_finding_items` 4 · `prd_status_enum` 3 · `findings_structure_ok` 8 · `overlap_kind` 1. 초판이 적은 25 는 `tree_paths` 안의 정상 출력을 따로 세어 중복한 것이며 santa m7 R7 이 `expect_fn` 19 + 직접 `ok` 5 로 실측 정정했다), `validate_candidate` 에 배선해 `--check` 에서도 돈다. **onboarding fixture 도 같은 수단으로 열린다** — `oq_records`·`oq_slice` 는 함수이므로 `expect_fn` 이 그대로 쓰이며, 재귀 실행 분기는 필요 없다. 2026-08-07 HIGH 항목은 그 경로로 재검토
2026-08-11 | RESOLVED(santa m7 R5) | .claude/plans/insuniverse-docs-00-protocol-m7.plan.md | 위 `2026-08-10 | LOW | …구조적 잔여 4건…` 의 3) `tree_paths` 의 `pre[]` 잔류는 닫혔다. *"index·spec 이 같은 추출기를 쓰므로 검사 1 에서 대칭 상쇄된다"* 는 판단이 틀렸다 — 같은 교란을 양쪽에 넣으면 상쇄가 아니라 **양쪽이 같이 틀린다**. santa R3 이 홀수 들여쓰기로(접두어 없는 basename), R5 가 형제 가지 dedent 로(앞 가지의 접두어가 잔류) 각각 실측했고, 2의 배수 단언 + 상위 문맥 단언 + 얕아질 때 깊은 `stack[]`·`pre[]` 삭제로 닫았다. 같은 항목의 2) `99-deprecated` 리터럴도 santa R1 에서 닫혔다(기대값을 검사 1 이 정본에 묶어 둔 트리에서 유도). 1)·4)는 그대로 유효
2026-08-11 | PARTIAL(santa m7 R3) | .claude/plans/insuniverse-docs-00-protocol-m7.plan.md | 위 `2026-08-10 | MEDIUM | …검사 2d 를 하류 8개 PRD 로 일반화…` 는 절반 닫혔다. 표기 정규화 문제는 `docs/_meta/index/**` 계열에만 있고(우산 축약 vs 자기 PRD 전 경로), `docs/_meta/findings/<id>.md`·`docs/_meta/term-requests/<id>.md` 는 **양쪽 다 전 경로**라 그 문제가 없다. 검사 2e 를 신설해 전 PRD 의 그 두 계열을 `ownership.md` 와 대조하고 `ownership.md` §승계 시 추가에 15행을 실었다. `docs/_meta/index/**` 로의 확장만 이월 — 하류가 착수하며 자기 선언을 확정할 때 정규화 규약과 함께 넣는다
2026-08-11 | MEDIUM | .claude/plans/insuniverse-docs-00-protocol-m7.plan.md | 발견 기록의 `근거 앵커` 에 동결 SHA 가 병기됐는지를 기계 검증한다 — santa m7 R4 Reviewer B 제안, 규약 형식 문제로 기각·이월. 규약은 *"행 번호는 동결 SHA 를 병기한다"* 인데 `findings/00-protocol.md` 는 SHA 를 발견 머리의 표에 한 번 두고 앵커 항목에는 `파일:행` 만 적는다 — 항목 본문 단위로는 판정할 수 없다. 앵커 표기 형식을 PRD §발견 기록 규약에서 먼저 정해야 기계화 가능하며, 그 결정은 발견 파일을 실제로 쓰는 하류가 몇 건 쌓은 뒤가 맞다
2026-08-11 | MEDIUM | .claude/plans/insuniverse-docs-00-protocol-m7.plan.md | `--selftest` 실행 건수를 기계가 내고 판정문이 그 출력을 인용하게 한다 — santa m7 R7 Reviewer B 제안, 종료 라운드라 이월. R7 의 지적 6건 중 3건이 *"사람이 손으로 센 수를 산문에 적었고 아무도 다시 세지 않았다"* 부류였다(selftest 25 vs 실측 24 · backlog 3 vs 6 · 열린 질문 6 vs 8). 처방 후보 둘 다 지금은 못 쓴다: 리터럴 기대 총수는 이 저장소가 세 번 기각한 *"검사 없는 규범"* 이고, golden 동결(`selftest.case_count`)은 `gen_report` 배선과 selftest 호출 순서를 건드려 종료 판정 라운드에 미검토 코드를 더한다(라운드 12 규칙). 다음에 `verify.sh` 를 여는 라운드에서 golden 동결 쪽으로 넣는다 — 위 파일 크기 항목의 분할과 같은 라운드가 맞다
2026-08-11 | LOW | .claude/plans/insuniverse-docs-00-protocol-m7.plan.md | `md_table`·`ow_rows` 출력의 구분자 재진입 — santa m7 R3 기각·이월. 두 파서는 GFM 이스케이프 파이프(`\|`)를 셀 값으로 복원한 뒤 출력을 `|` 로 잇고, 소비부가 다시 `|` 로 쪼갠다. 실측 결과 fail-open 은 없다 — 필드 시프트가 일어나는 열(소유자·경로·범위 한정)에서는 폭 검사 또는 근거 검증이 즉시 실패하고, 시프트가 무해한 열(사유·근거)은 `inherited_additions_sha256` 이 전 행을 동결한다. 별도 구분자(예: `\001` 유지) 도입은 세 파서와 모든 소비부를 건드리는 변경이라 현재 이익이 비용을 넘지 않는다. 셀에 파이프가 정당하게 필요한 표가 생기면 재검토
2026-08-11 | HIGH | .claude/plans/insuniverse-docs-00-protocol-m7.plan.md | **UI8 위반이 이미 발생했고 되돌릴 수 없다** — PR-Codex F2. UI8 은 *"이 세션은 Agent tool 과 Workflow 를 쓰지 않는다"*(constraint) 인데 `notes/insuniverse-docs-00-protocol-m7.md:55·210` 이 santa 리뷰어 A 를 "Claude Opus 서브에이전트" 로 기록한다. 그 리뷰가 낸 수정은 이미 코드에 반영됐으므로 산출물에서 분리할 수 없다 — 지금 할 수 있는 것은 기록의 정직성뿐이고, notes 가 이미 그 역할을 한다. 남는 결정 두 가지: 1) UI8 이 santa 리뷰어 축에도 걸리는지(리뷰어 A 는 구현자가 아니라 반증자이고 read-only 로 묶였다) 아니면 구현 경로에만 걸리는지를 제약 원문에서 갈라 적는다 — 지금 원문은 구분하지 않는다. 2) 갈리지 않는다면 해당 라운드 산출물의 재검증 범위를 정한다. PR 은 감사된 override 로 통과시켰고 `## PR-Codex Override` 가 이 사실을 PR body 에 싣는다
2026-08-11 | REJECTED(PR-Codex F3) | .claude/plans/insuniverse-docs-00-protocol-m7.plan.md | *"UI4 배타 소유 경로 밖에 18파일을 만들었다"* 는 지적은 기각한다. PRD §배타 소유 경로 목록의 목적은 본문이 명시하듯 *"8개 worktree 가 `docs/` **산출물**을 두고 충돌하지 않게"* 하는 것이며 mccp 워크플로 산출물(`.claude/PRPs·notes·plans·receipts`)은 그 대상이 아니다. 실측 선례: `origin/main` 에 같은 부류가 이미 **77건** 있고 `12-index-runtime`(#1)·`doc-template-kit` 이 동일 방식으로 머지됐다. 지적이 유효하려면 UI4 가 아니라 그 선례 전체를 되돌려야 한다
2026-08-10 | MEDIUM | .claude/plans/insuniverse-docs-10-index-git-m7.plan.md | R15 F1 — Validation 2·3 은 파일명·필드명 토큰 존재만 본다. 건수·파일별 표·타입·enum·뜻·근거 앵커를 산출물과 대조하지 않으므로 R-01 은 기계 검증된 해소가 아니다. 마일스톤 8 에서 내용 대조 게이트를 붙인다
2026-08-10 | MEDIUM | .claude/plans/insuniverse-docs-10-index-git-m7.plan.md | R15 F2 — 사이드카는 CSV 를 경로로 직접 여는 소비자에게 도달한다는 보장이 없다(디렉터리 열거도 로더 계약도 강제되지 않음). UI2 가 컬럼·파일명 변경을 막으므로 마일스톤 8 의 컬럼명 변경 결정과 함께 재판정. 그때까지 R-02 는 직접 소비 경로에 한해 잔여가 있다
2026-08-10 | HIGH | .claude/plans/insuniverse-docs-10-index-git-m7.plan.md | Implement-Codex R1 F1 잔여 — plan §Codex Adversarial Review 의 'Deferred to backlog: 0 · 무변경' 과 mccp-plan-codex receipt 의 deferred_findings_count=0 이 실제 backlog 2행(R15 F1·F2)과 어긋난다. implement 세션은 은폐 축만 닫을 수 있고(기준선 커밋 분리·명시 기록), 서술과 receipt 재봉인은 plan 본문 수정 + /mccp:plan 재실행 소관이다
2026-08-11 | HIGH | .claude/meta/09-operational-knowledge-remediation.md | **[사용자 지시 2026-08-11: `00-protocol` main 머지 완료 후 검토. 그 전에는 손대지 않는다]** main 에서 `verify.sh --check` 가 exit 1 이다 — CI 가 없어 이 스크립트가 우산 PRD 제약 #7(lint 전수)을 강제하는 유일한 지점인데 그것이 돌지 않는다. 증상: 파서가 `repos:` 블록 밖 `path:` 까지 집계해 `extraction-manifest.yaml:320`(`reproduce.runtime_scale_oracle.path`)을 4번째 저장소로 잡는다(정상 `:54,59,64`). **원인은 코드 결함이 아니라 머지 비대칭이다** — main = manifest v8(runtime 축, `bdd05bc`) + verify.sh 구버전(605행, 미스코프 파서 `:204`) 조합. **수정은 이미 `feat/insuniverse-docs-00-protocol-m3-recheck` 에 있다**(verify.sh 2,764행, `:206` "먼저 섹션을 자른다" 섹션 절단 + `:2687` selftest 불변식 6 "repos 섹션 밖의 name/path/head 3행은 저장소가 아니다"). 조치: 머지 후 `--check` 재실행으로 확인만. 머지해도 남는 것은 `lint.files 0`(문서 0건 → `--bootstrap` 한시 통과, 스크립트 자체 안내)뿐. 소유 `00-protocol`
2026-08-11 | HIGH | .claude/meta/09-operational-knowledge-remediation.md | 주석 분류에 정의 축이 없다 — 3저장소 12,688 블록 중 `policy_candidate` 1,370(10.8%)이고 spec §6-3 추정 25~40% 하한에도 못 미친다. 키워드 목록(규칙/정책/기준/제한…)이 규범문 전용이라 "X는 Y다" 정의문을 못 잡는다. 용어별 유실 75~93%(머니 211→15 · 청구서 101→8 · 심평원 75→16). 조치: `6_definition` 클래스 + `glossary_candidate` 플래그 신설(`policy_candidate` 정의는 불변 → 기존 산출 재현성 유지). 확정 전 `3_impl` 200블록 표본 라벨링으로 precision/recall 측정 필수. 소유 `00-protocol`(manifest) + `10-index-git`(extract-comments.mjs)
2026-08-11 | MEDIUM | .claude/meta/09-operational-knowledge-remediation.md | `client_result_codes` namespace 분리 — `E0001` 이 `api.constant.ts:16`(UNAUTHORIZED) · `admin.constant.ts:62`(INVALID_PARAMETER) · `client.constant.ts:29`(INVALID_AUTHORIZATION) 3중 충돌인데 셋째는 **대외 고객사 API 계약**이라 층이 다르다(`resultCode`/`resultMsg`, `S0000`, 기능별 앞 2자리 규약). manifest `error_codes: '^E[0-9]{4}$'` 가 셋을 한 통에 담는다. 소속을 출처(`client.constant.ts`)로 판정 — findings 발견 9 의 `membership: pattern | source` 규약 적용. 소유 `00-protocol`
2026-08-11 | MEDIUM | .claude/meta/07-domain-knowledge-gap.md | FAX 머니 차감 경로 이원화 — `fax-user.controller.ts:107,114` 와 `fax.service.ts:797-799` 는 실차감 경로인데 `fax.service.ts:99,110,148,595` 에 `TODO: 포인트 차감` · `TODO: 포인트 환불` · 주석 처리된 잔액 부족 예외가 남아 있다. "포인트는 FAX 사용에 소모"라는 운영 진술이 일부 경로에서만 강제된다. 코드 수정은 우산 PRD Out of scope → `docs/_meta/findings/50-domain.md` 기록 대상. 소유 `50-domain` — OWNED-DEFERRED 2026-08-24: 이 PRD 소유가 맞다. 기록처는 `docs/_meta/findings/50-domain.md` 인데 그 파일을 만들면 golden 의 `findings.files` · `fixtask.findings_headings` 두 키가 움직이고 `verify.sh --update` 가 필요한데 `docs/_meta/verify/**` 에 이 PRD 의 개정 위임이 없다. 마일스톤 1 은 파일을 만들지 않고(게이트 `#11`) 그 벽을 아래 2026-08-24 HIGH 행으로 사용자 판정에 부친다
2026-08-11 | LOW | .claude/meta/07-domain-knowledge-gap.md | `client-analyze.controller.ts` 가 `@ApiTags('고객사 분석상세')` 를 달고 라우트 0개 — 껍데기. `dead-code-candidate` 판정 회부. 소유 `60-history-deprecated`
2026-08-11 | HIGH | .claude/meta/07-domain-knowledge-gap.md | 기업구독 변경 차단이 클라이언트 게이트만 확인된다 — `SubscriptionCard.tsx:94,99,104` 이 `user.memType === "일반"` 으로 버튼을 숨기지만, `subscribe.controller.ts:24` 는 클래스 레벨 `@UseGuards(JwtAuthGuard)` 하나뿐이고 `memType`/corp 조건 guard 가 없다. `@Post('prompt')`(구독즉시변경, `:72`)는 `@Body()` 만 받는다. `subscribe.service.ts` 의 `memType` 사용처는 엑셀 컬럼 분기뿐(`:907,910,947`)이고 변경 차단 분기 0건. `06-access-model-findings.md` §2(메뉴 권한이 API 를 막지 않음)와 같은 형태. **미확인**: `subscribeService.prompt()` 본문 전수 미독 — 부재 증명 아님. 런타임 반증 미실시. 소유 `30-contracts-limits` 또는 `50-domain` — ABSORBED-M1 2026-08-24: 소유를 `50-domain` 으로 닫았다(PRD §Open Questions). 이 관측이 실릴 산출물이 `docs/10-server/03-subscription-order.md` · `docs/20-site/03-subscription-payment.md` 두 배타 소유 경로이고, `30-contracts-limits` 소유 `docs/03-contracts/**` 는 계약 형식 축이라 강제 부재를 담는 자리가 아니다. 본문 기록은 마일스톤 6·8
2026-08-11 | HIGH | .claude/meta/08-operational-blindspot-causes.md | `onboarding-questions.yaml` 55문항에 운영 축 질문이 0건이다 — 고객사/client 0 · 채널 0 · 제공 단위 0 · 심평원 0 · 청구서 0 · B2C 0 · 대상선정기준 0 (대리점 1 · 머니 1). 파일 헤더가 "질문은 지어내지 않고 각 PRD 원문에서 파생한다(`src:`)"라고 규정하는데, 그 PRD 들이 코드 인덱스에서 도출됐으므로 **코드가 답할 수 있는 질문만 질문이 되는 순환**이 그대로 구현됐다(`08` 원인 6 이 예측한 실패 모드). Q01 이 "actor 는 몇 종"만 묻고 제공 단위 축을 묻지 않는 것이 `08` 원인 5(축 불일치)의 직접 증거다. 결과: 신입이 55문항을 100% 답해도 이 서비스가 무엇을 파는지 모른다. 조치 제안 — 구술(`.claude/meta/10`)·`planning/`(등급 L) 목차에서 파생한 질문을 추가하고 신설 카테고리 3종(구조·역방향·부재확인)을 도입. **00-protocol 이 이미 archived 이므로 재개 주체 지정이 선행 필요.** 소유 미지정
2026-08-11 | MEDIUM | .claude/meta/09-operational-knowledge-remediation.md | `docs/00-service-overview.md` 소유자가 없다 — 00-protocol 이 close·archive 되면서 이 신설 문서를 얹을 PRD 가 사라졌다. 우산 PRD 제약 #7 lint 예외 목록에는 경로가 등재돼 있으나 분할 맵의 어느 행도 소유하지 않는다. 서비스 정의·가치 사슬·제공 단위 3종·참여자 지도를 담을 자리이며 근거는 `08` 원인 4. 소유 미지정 — 사용자 배정 필요
2026-08-12 | MEDIUM | .claude/plans/ops-doc-reconcile-r5.plan.md | R5 F3 — 추적된 `.claude/receipts/mccp-plan-codex/main.json` 이 삭제되고 내용 동일한 미추적 `main.legacy.json` 이 생겼다. 이 우산의 작업이 만든 변경이 아니라 세션 중 돈 receipt store migration 결과다(`.migrations/v0.2.8-generic-quarantine` 이 receipt status 에 보인다). 복원 여부는 유지보수자 판단 — rename 이 플러그인 자체의 상태 전이일 수 있어 일방 되돌림은 store 를 어긋나게 할 수 있다. 계획의 Validation 5 가 기존 receipt 의 수정·삭제에 exit 1 하므로 이 상태가 조용히 출하되지는 않는다. 기록은 `ops/findings/ops-00-protocol.md` F-OPS-00-04
2026-08-13 | MEDIUM | ops/_meta/ops-manifest.yaml | santa-loop R2 — 잔재 가지치기가 **확장자로 좁혀졌을 뿐 닫히지는 않았다**. `<sources_root>/**/.claude/state/**/*.jsonl` 은 내용과 무관하게 집합에서 빠지므로 그 파일이 진짜 소스나 민감정보로 교체돼도 lock 행·해시·사람 판정 없이 `--check` 가 exit 0 이다. 저장소 유입은 `.gitignore` 의 `.samples/` 가, 파싱은 `state: parsed` 한정이 닫고 있고 계수는 `sources_pruned` 로 나므로 UI3·UI10·UI11 hard constraint 위반은 아니다 — 종료 규칙상 이월. 대안은 D5 를 되돌려 `exclusions[]` 수기 등재로 가는 것이고 그 비용은 훅이 흘릴 때마다의 lock 편집이다. 회부 O-10 으로 상신했다. 소유 `ops-00-protocol`
2026-08-13 | MEDIUM | ops/_meta/verify-ops.sh | santa-loop R1 — 게이트가 **자기 산출물(protocol 분류)의 부재**를 잡지 않는다. 재현: `ops/_meta/package-lock.json` 과 `ops/findings/ops-00-protocol.md` 를 지우고 `--check` → exit 0 · `verdict ok`. golden 열거 오라클이 자식(child) 산출물만 동결하고, `manifest`·`sources.lock` 만 sha256 으로 따로 박혀 있기 때문이다. 결과로 PRD Success Metric *"의존 재현성 — `npm ci` 2회 트리 해시 일치"* 의 정본인 `package-lock.json` 이 사라져도 게이트는 초록이다. 계획 Task 6 이 약속한 검사 5종 밖이고 UI3 같은 hard constraint 를 건드리지 않아 종료 규칙상 이월. 조치안: `ownership.protocol_files` 를 **존재 요구 목록**으로도 읽고 부재를 `protocol_missing` 정수로 낸다. 소유 `ops-00-protocol`
2026-08-11 | HIGH | (origin/main 선행 결함) | `verify.sh --check --bootstrap` 이 origin/main `0ca575e` 에서 exit 1 이다 — "ownership.md 승계 표가 우산 §PRD 분할 맵과 행 단위로 다르다". 원인 특정: `10-index-git` 머지가 우산 분할 맵의 자기 행에 산출물 3종(`README.10-index-git.md` · `cross-repo-days.md` · `index-pins.lock`)을 추가했으나 `docs/_meta/ownership.md` 에 전파하지 않았다(우산 1 : ownership 0, 3종 모두). PRD 이름 집합은 일치하므로 차이는 셀 내용뿐이다. **`docs/operational-knowledge-regrade` 의 rebase 해소가 원인이 아님을 격리 검증했다** — 우산 PRD 를 origin/main 판으로 되돌려도 같은 실패가 재현된다. 조치: ownership.md 승계 표에 3종 추가(단순 전파). 소유 `00-protocol`(archived — 재개 주체 지정 필요) 또는 `10-index-git`
2026-08-14 | HIGH | .claude/plans/ops-10-cells.plan.md | Plan-Codex R4 F0 — UI4 소유 경계 검사가 **중첩 worktree 를 통째로 놓친다**. `git status --porcelain -z --untracked-files=all` 도 중첩 저장소는 `?? .claude/worktrees/ops-40-db-snapshot/` 한 건으로 축약하고, 그 경로를 `readFileSync` 하면 `EISDIR` 이라 기준선이 해시를 `null` 로 저장한다. 종료 검사도 같은 경로·상태·null 해시를 비교하므로 그 안의 파일을 임의로 바꿔도 Validation 5 가 통과한다. M0 산출물이 아니라 **검증 하네스의 구멍**이고, D1 판정과 Task 2~6 의 내용을 바꾸지 않아 봉인 라운드 계약대로 이월. 조치안: 해시 불가 porcelain 항목(디렉터리 등)이 나오면 기준선에서 fail-closed 하거나 중첩 저장소의 자체 porcelain 을 재귀 캡처한다 + 중첩 worktree 를 변경하는 음성 fixture 1종. 소유 `ops-10-cells` (M0 착수 시 Task 1 에서 처리)
2026-08-14 | MEDIUM | .claude/plans/ops-10-cells.plan.md | Plan-Codex R4 F1 — findings 내용 검사가 **빈 골격 7개를 승인한다**. Validation 3 은 `##` 블록 7개와 각 블록의 `###` 제목 6개 순서만 보고 본문 비어 있음·근거 앵커·D1 사용자 답을 확인하지 않으므로, 일곱 사실이 전부 누락돼도 00 등재와 golden 갱신 후 M0 가 초록이 된다. R3 F5 흡수가 형식은 닫고 내용은 안 닫은 것이다. 조치안: 일곱 finding 에 안정 ID 를 부여하고 6개 절의 비어 있지 않은 본문과 필수 근거 토큰을 검사하며, 발견 7에서 선택된 D1 안과 승인·반려 문장을 파싱해 `missing_fields` 정수 0 만 통과시킨다 + 빈 골격 음성 fixture 1종. 소유 `ops-10-cells` (M0 Task 6 에서 처리)
2026-08-14 | MEDIUM | .claude/plans/ops-10-cells.plan.md | Plan-Codex R5 F0 — comment **author 값 자체가 한 번도 단언되지 않는다**. Task 4 는 소스별 건수 4개·양방향 차집합·키 충돌만 보는데, exceljs 는 author 를 보존하지 못하므로(`comment-xform.js:50`) 최소 리더의 author 매핑을 교차 검증할 상대가 없다. 리더가 기대한 5개 ref 를 내면서 author 를 빈 문자열이나 엉뚱한 값으로 채워도 나열된 단언이 전부 통과해 M1 의 정본 필드를 거짓 인증한다. 계획 본문 Task 4 표의 부수 증명 열에 다섯 좌표(`도출자료정리` `G95` `G104` `E113` `G113` `F122`)와 author `rs05` 가 이미 적혀 있으므로 구현자는 값을 알고 있고, 빠진 것은 **단언**이다 — R4 의 두 건과 같은 검증 하네스 층이라 재앵커 라운드 계약대로 이월. 조치안: `(sheet_id, ref, author)` 5튜플 고정 단언 + `comment_author_missing` 정수 0 요구 + `authorId` 범위 밖/부재 매핑 음성 fixture 1종. 소유 `ops-10-cells` (M0 Task 4 에서 처리)
2026-08-14 | MEDIUM | .claude/plans/ops-10-cells.plan.md | Implement-Codex R1 F6 — `.claude/receipts/mccp-plan-codex/main.json` 이 추적 상태인데 워킹트리에 없다(`main.legacy.json` 이 미추적으로 대체). ops-10-cells 작업물이 아니다: `git worktree add ops-10-cells HEAD` 로 새 worktree 를 만든 **직후에도** 같은 상태가 재현되므로 mccp receipt-store 마이그레이션이 체크아웃 뒤 옮긴 것이고, `.claude/receipts/**` 는 UI4 쓰기 금지라 M0 가 되돌릴 수도 없다. M0 는 이것을 정당한 사전 삭제로 기준선에 박고(상태 `D` + hash null) 종료 검사까지 그대로 문다 — 새로 지우면 잡힌다. 조치안: receipt-store 마이그레이션이 추적 파일을 옮길 때 git 삭제를 남기지 않도록 하거나, `main.legacy.json` 으로의 재앵커를 커밋으로 확정한다. 소유 `ops-00-protocol` 또는 mccp 도구 층
2026-08-18 | MEDIUM | .claude/plans/ops-20-statements.plan.md | R5 F1 · R10 F2 · R11 F2 · R12 F3 — nonce receipt 발급·소비(.issued -> .claimed -> .consumed)와 사본 거부 fixture, realpath 결박을 M0 하네스에서 뺐다. 사용자 지시(UI15 선 배포 후 일괄 수정)에 따른 순서 결정이고 지적이 틀려서가 아니다. 남는 것: 기준선 스냅샷은 <snapdir> 평범한 파일이라 지어내면 통과한다. 앞 판도 적대적 구현자는 못 막는다고 이미 적었고 이 축의 실질은 사고 방지였다. 소유 ops-20-statements (M0 배포 후 재검토)
2026-08-18 | MEDIUM | .claude/plans/ops-20-statements.plan.md | R15 F2 · R16 F2 · R17 F2 — submodule 상태 전이 대조를 뺐다. 이 워크트리의 gitlink 3건은 전부 미초기화이고, 나중에 기록된 커밋으로 초기화되면 소유 경로 밖에 트리 전체가 생기는데 superproject 스냅샷은 clean 이다. 미검 축이다. 소유 ops-20-statements (M0 배포 후 재검토)
2026-08-18 | LOW | .claude/plans/ops-20-statements.plan.md | R15 F0 · R16 F0 · R17 F4 — 연속행 lint 와 그 lint 의 자기시험 3종을 뺐다. 대체: 하네스가 줄 끝 백슬래시 다음 줄에 판정을 두지 않는다(전부 if ! ...; then fail; fi). 탐지기를 세우는 대신 그 형태를 안 쓴다. bash -n 자기검사는 남았다. 소유 ops-20-statements
2026-08-18 | MEDIUM | .claude/plans/ops-20-statements.plan.md | R9 F0 · R10 F0 · R11 F1 · R17 F0 — 소유 비교기 자기시험 6종(c1~c6)과 일회용 저장소 실물 전제를 뺐다. 비교기가 실제로 무는지는 구현 중 손으로 한 번 확인하고 기계 단언은 두지 않는다. 소유 ops-20-statements (M0 배포 후 재검토)
2026-08-18 | MEDIUM | .claude/plans/ops-20-statements.plan.md | R4 F1 — 스냅샷 내용 sha256 대조를 뺐다. 경로와 상태 문자만 본다. 기준선에서 이미 M 이던 범위 밖 파일의 추가 변경은 안 잡힌다. 소유 ops-20-statements (M0 배포 후 재검토)
2026-08-18 | LOW | .claude/plans/ops-20-statements.plan.md | R10 F3 — 우산 rc·토큰 기준선 기록을 뺐다. 회부 R1·R2 가 이미 그 상태를 추적한다. 소유 ops-20-statements
2026-08-18 | LOW | .claude/plans/ops-20-statements.plan.md | R14 F1 — porcelain 미인식 상태 문자(T typechange 등)의 즉시 실패를 뺐다. 상태 문자를 그대로 실어 비교하므로 조용히 사라지지는 않으나 거부하지도 않는다. 소유 ops-20-statements
2026-08-18 | RESOLVED | .claude/plans/ops-20-statements.plan.md | 같은 날 위에 올린 "R4 F1 스냅샷 내용 sha256 대조를 뺐다" 행을 **되돌렸다**. Plan-Codex R18 F2 가 그 이월이 UI3 를 증명하는 검사에서 UI3 를 못 무는 자리를 연다고 지적했고 사실이다. 판정 대상 경로(소유 밖 · 도구 밖)에만 sha256 을 붙이는 형태로 흡수했으므로 ignored 대량 트리를 훑지 않는다. 같은 지적의 submodule 초기화 전이 축은 흡수하지 않고 이월로 남는다
2026-08-18 | LOW | .claude/plans/ops-20-statements.plan.md | Plan-Codex R21 F1 후반부 이월 — 커밋된 도구 경로 변경이 `tool_paths_changed` 에 합산되지 않는다. 기준선과 종료 시점이 둘 다 clean 인 커밋된 `.claude/**`·`.mccp/**` 변경은 워킹트리 비교기에 나타나지 않으므로 계수가 0으로 보고된다. 거짓 실패를 내던 축(`.mccp/**` 가 커밋 술어에 없던 것)은 이번에 흡수했고, 남은 것은 **계수의 정확도**이지 게이트의 통과/거부가 아니다. UI15 선 배포 후 일괄 처리 대상. 소유 ops-20-statements
2026-08-18 | HIGH | .claude/plans/ops-20-statements.plan.md | Plan-Codex R22 F0 이월 — 토큰 전수 대조(Acceptance 9)는 **토큰 단위**라 한 토큰 아래의 여러 독립 불변식 중 한 분기만 구현해도 통과한다. 실측 두 자리: (1) `id-doc-mismatch` 한 건으로 doc·sheet 일치를 함께 증명하려 하는데, doc 만 어긋난 fixture 면 sheet 검사는 한 번도 실행되지 않는다. (2) Task 2 의 필수 필드 9개를 `OPS_INV_RECORD_SCHEMA` 누락 fixture **한 건**이 대표하므로 9개 중 1개만 검사하는 체커가 통과한다. 조치안: 오류 토큰과 별도로 세분 불변식 id 를 두고 `선언 == 실행` 을 그 단위로 대조하고, doc 불일치와 sheet 불일치를 가르며 필수 필드 누락을 9개로 매개변수화한다. **UI14·UI15 로 이월** — 이것은 약속한 규칙에 fixture 가 아예 없는 것이 아니라 커버리지 **조밀도**이고, 흡수하면 계획 본문이 또 커져 재진입 라운드가 이어진다. 구현 시 Task 2 문면이 9개 필드를 다 열거하므로 구현자는 목록을 알고 있고, 빠진 것은 기계 단언이다. 소유 ops-20-statements (M0 배포 후 일괄 처리)
2026-08-18 | MEDIUM | .claude/plans/ops-20-statements.plan.md | Plan-Codex R25 F0 이월 — 하위 명령 두 개의 마지막 LF 가 하네스에서 사라진다. `--fixture-tree` 출력은 command substitution 이 trailing LF 를 떼고 나서야 검사되고, `--list-tokens` 출력은 `sort` 가 레코드 종결자를 다시 쓴다. 따라서 두 하위 명령이 마지막 LF 없이 출력해도 통과한다. 조치안: 두 하위 명령의 원시 stdout 을 먼저 파일로 받아 `ends_lf` 를 건 뒤 파싱·정렬한다. **이월 사유**: 이것은 R24 흡수가 낳은 결함이고, 계획 §Validation 서두가 적어 둔 종료 신호(*다음 라운드가 또 새 장치의 결함만 낸다면 게이트가 아니라 하네스가 비대한 신호*)에 정확히 해당한다. UI5 가 지키려는 것은 **기계 산출**(원장·리포트)의 LF 고정이고 그것은 Acceptance 2 가 문다 — 여기 남은 것은 하네스 내부 하위 명령 두 개의 출력이다. UI14·UI15. 소유 ops-20-statements (M0 배포 후 일괄 처리)
2026-08-18 | LOW | .claude/plans/ops-20-statements.plan.md | 문면 정정 — plan §Codex Adversarial Review 가 `Deferred to backlog: 12행` 이라고 적었으나 실제는 **11행**(이월 7 + 되돌림 1 + R21 F1 후반 + R22 F0 + R25 F0)이고, 이 정정 행을 더하면 12행이 된다. 또한 receipt 의 `meta.deferred_findings_count` 는 0 인데, 그 필드는 runner 가 **마지막 라운드의 adjudication** 에서만 채우므로 누적 backlog 행 수와 일치하지 않는다 — 정본은 이 파일이다. 계획 본문을 고치면 plan_hash 가 stale 이 되어 봉인을 다시 해야 하므로 UI15 대로 여기에 적는다. 소유 ops-20-statements
2026-08-18 | MEDIUM | .claude/plans/ops-20-statements.plan.md | Implement-Codex R1 F3 — 대표셀 정규 정렬의 **열 축이 실행으로 안 지난다**. 계획 §Task 2 의 경계 예시는 `["D19","C19"]`(한 글자 열)과 `["B2","B10"]`(행 수치순)뿐이고 양성 fixture `valid-one` 의 앵커도 `["B2","B10"]` 이라, 열을 사전순으로 비교하는 구현이 20 case 전건을 통과한다. 실측 갈림: `["AA2","Z2"]` 의 정규형은 base-26 으로 `Z2`, 사전순으로 `AA2`. 구현은 열을 base-26 정수로 비교하지만 그 사실을 무는 단언이 없다. 조치안: `["AA2","Z2"]` 앵커에 `:Z2` 를 요구하는 양성 1종 + `:AA2` 를 `OPS_INV_ID_PRIMARY_NOT_CANONICAL` 로 무는 음성 1종. **이월 사유**: 계획 §Validation 의 fixture 목록은 봉인됐고 여기서 늘리면 plan_hash 가 stale 이 된다. R22 F0 과 같은 커버리지 조밀도 축이며 UI14·UI15 로 일괄 처리. 소유 ops-20-statements (M0 배포 후 일괄 처리)
2026-08-18 | MEDIUM | .claude/plans/ops-20-statements.plan.md | Implement-Codex R1 F4 — lock 유래 계수 3종(`cells_docs_expected` · `cells_docs_present` · `cells_docs_missing`)이 **상수로 만족된다**. 하네스는 생산 lock 의 현재값 한 점(`2` · `0` · `2`)에서만 물고, parsed 기수가 다른 트리도 `counts.parsed` 가 `sources[]` 와 어긋나는 트리도 돌리지 않는다. 따라서 세 값을 상수로 찍는 체커나 `counts.parsed` 를 그대로 읽는 체커가 M0 를 통과하고, lock 이 바뀌는 순간 조용히 낡는다. 구현은 `sources[].state === "parsed"` 를 독립 열거하고 `counts.parsed` 를 읽지 않지만 그 사실을 무는 단언이 없다. 조치안: parsed 기수가 3인 fixture lock 과 `counts.parsed` 를 일부러 어긋나게 한 fixture 를 두고 세 계수를 알려진 집합에서 대조한다. **이월 사유**: F3 과 같다 — 봉인된 fixture 목록 밖이고 커버리지 조밀도 축이다. 소유 ops-20-statements (M0 배포 후 일괄 처리)
2026-08-18 | HIGH | ops/statements/_harness/m0.sh | ops-20 M0 실측 — `ops/**` 이 루트 `.gitattributes` 밖이고 `core.autocrlf=true` 라 재체크아웃하면 acceptance 하네스가 CRLF 가 된다. `git checkout-index` 로 꺼낸 `m0.sh` 는 19339 bytes · CR 325(워킹트리는 19014 bytes · CR 0)이고 `git add` 가 "LF will be replaced by CRLF" 를 경고한다. CRLF `m0.sh` 는 bash 에서 실행 자체가 깨지고, `ops/statements/` 는 `child_prefixes` 라 golden 이 원바이트 해시(`ops/_meta/verify-ops.sh:289`)이므로 같은 사유로 어긋난다. `check-statements.mjs` 는 변환되지 않았다(사유 미검증). **M0 가 만든 조건이 아니다** — `ops/_meta/verify-ops.sh` 도 같은 노출에 있고 이미 출하돼 있다. 조치안 두 갈래: (1) 루트 `.gitattributes` 에 `ops/** text eol=lf` — 소유 `ops-00-protocol` / 정책 우산, 회부 O-1 과 같은 자리, (2) `ops/statements/.gitattributes` 로 자기 서브트리만 고정 — 소유 경로 안이지만 계획 `Files to Change` 4행 밖이라 implement-time 파일 확장이다. **UI14·UI15 로 이월.** 기록은 `ops/findings/ops-20-statements.md` F-OPS-20-E3. 소유 ops-00-protocol 또는 ops-20-statements (M0 배포 후 결정)
2026-08-18 | MEDIUM | ops/statements/check-statements.mjs | 로컬 code-review 흡수 — fail-open 2건을 코드에서 닫았다. (H1) 정규화하면 빈 문자열이 되는 `text` 가 규칙 2 의 `includes(want)` 를 무조건 만족시켜 내용 없는 진술이 `stated`·`grade: "O"` 로 도출 인증을 받았다. 스키마가 본 `length > 0` 은 **정규화 전** 길이다. (H2) `semanticKey` 가 `text` 만 정규화 사다리를 태우고 `value` 는 원본 직렬화해서, `{raw, norm}` 과 `{norm, raw}` 가 다른 키가 되고 같은 진술 두 건이 규칙 6 을 빠져나갔다. 음성 fixture 2종(`schema-text-blank` · `collision-value-key-order`)을 더했고 **반사실로 확인**했다 — 두 fixture 다 수정 전 구현에서 rc 0 · `verdict ok` 로 통과하고 수정 후 rc 1 + 기대 토큰으로 죽는다. 남는 것: 계획 §Task 5 가 봉인한 "양성 2 + 음성 17 + 의미 키 3" 이 **24종**이 됐고 §Validation 이 본문에 싣고 있는 하네스 원문도 갈렸다. plan_hash 재봉인은 재진입 라운드를 요구하므로 UI15 대로 여기에 적는다. 소유 ops-20-statements
2026-08-18 | LOW | ops/statements/_harness/m0.sh | 로컬 code-review 흡수 — 하네스 4건. (1) 주입 표면 첫 대조가 유일하게 `env -u NODE_OPTIONS -u NODE_PATH` 없이 돌아 운영자 셸의 그 변수로 `INJ_DIFF_ENV` 가 거짓 실패할 수 있었다 — 형태를 맞췄다. (2) `<snapdir>` 이 저장소 안이면 `inventory()` 가 스캔 전에 쓰는 `$SNAP/.raw` 가 목록에 실려 소유 검사가 자기 증거로 깨진다 — `SNAP_INSIDE_REPO` 로 이름을 줬다(경로 비교는 node 로 정규화, MSYS·Windows 형이 섞이기 때문). (3) 기준선 이후 merge 가 들어오면 2-dot diff 가 병합분을 이 브랜치의 쓰기로 보고한다. 3-dot 은 답이 아니다 — 기준선이 여전히 HEAD 의 조상이라 merge-base 가 그대로다. `MERGE_SINCE_PREFLIGHT` 로 원인을 이름으로 낸다. 이 저장소 규약이 자식 브랜치에 merge 를 요구하므로 실제 위험이다. (4) `derive_fail` · `semantic_key_collisions` 는 리포트가 성공 경로에서만 나오므로 **구조적 상수 0** 인데 세는 변수(`deriveFail++`)가 있어 "측정했는데 0" 으로 읽혔다 — dead store 를 지우고 상수임을 문면에 박았다. 실측 정수는 계획 회부 R5 대로 M1 소관. 곁들여 `readCells` 의 조용한 JSON 파싱 건너뛰기(전 행이 깨진 doc 도 `cells_docs_present` 에 계수됐다)와 모르는 fixture case 의 `OPS_INV_` 접두 오용(파일 말미 규약 위반)도 제거했다. 소유 ops-20-statements
2026-08-18 | HIGH | .claude/plans/ops-40-db-snapshot-m2.plan.md | PR-Codex R1 F1 — `assertNotTrackable` 이 CSV realpath 를 포함하는 worktree root 를 하나도 못 찾으면 `OPS_DB_CSV_ROOT_UNRESOLVABLE` 로 실패한다(`ops/db/normalize-db.mjs` 162-165 행). 그래서 UI1 의 *"수령 CSV 는 저장소 밖에 두고"* 를 문자 그대로 이행한 경로(`D:\snapshots\q8.csv` 같은 저장소 완전 외부)는 정규화를 못 돌린다. plan 466-476 행·D2 는 `128`(저장소 밖)을 `1`(추적 가능)과 구분하는 데까지만 갔고 "저장소 밖 = 정상 입력" 은 정하지 않았으며, 검증된 정본 CSV 루트는 부모 worktree 아래의 gitignored `.samples/` 다(plan 1445 행 R19-F5). 즉 구현은 "밖 = 커밋 불가" 로 읽었고 Codex 는 "밖 = worktree 밖" 으로 읽는다. **조치안**: worktree 밖 해석 가능 경로를 정상 입력으로 허용하고 `check-ignore` 검사는 worktree 안일 때만 적용. 경로 탈출 방지·sha256 검증은 유지. `ops/db/requests/README.md` 의 `.samples/` 안내도 외부 보관소 예시 병기. 소유 `ops-40-db-snapshot` — RESOLVED 2026-08-24 (ops-40 M4): `assertNotTrackable` 이 저장소 완전 외부 루트를 정상 입력으로 받는다. 다만 조치안의 *"worktree 밖"* 을 그대로 쓰지 않고 **"어느 저장소에도 안 들어감"** 으로 좁혔다 — `worktreeRoots()` 는 남의 저장소를 모르므로 공집합만 보고 통과시키면 남의 저장소의 추적 가능한 경로가 새 나간다 (Implement-Codex R1 F2). 그 경우 `git rev-parse --show-toplevel` 로 저장소를 되묻고 거기서 `check-ignore` 를 적용한다. realpath 선행 · basename 해석 · sha256 대조 3종은 바이트 불변. fixture: `I-EXT`(외부에서 실제 방출) · `D-OTHERREPO`(남의 저장소 = `OPS_DB_CSV_TRACKABLE`). `ops/db/requests/README.md` 도 정정.
2026-08-18 | HIGH | .claude/plans/ops-40-db-snapshot-m2.plan.md | PR-Codex R1 F2 — `agree_eligible` 이 `presence == "observed" && completeness == "complete"` 만 보고 파일별 provenance 검증 여부를 안 본다(`ops/db/normalize-db.mjs` 517 행). 실제 산출물이 `snapshot_unverified: 419` 인데 q8_table·q8_column 은 `complete` · `agree_eligible: true` 다. 두 번째 CSV 에 자체 q0 환경·시각 sentinel 이 없으므로 파일마다 다른 환경·시점에서 추출돼도 sha256 만 맞으면 419 행이 근거로 노출된다. plan 213 행이 이 규칙을 그대로 정의했고 287 행은 `agree_eligible=false` 잔존을 의도된 상태로 봉인했으며, 생산자 주석은 completeness 축의 독립 유도 부재를 계수된 한계로 적고 구조적 폐쇄를 회부로 올렸다 — 즉 **알려진 한계이나 provenance 축은 그 회부 문구에 없다**. **조치안**: 파일별 q0 sentinel 이 없는 라벨을 `uncheckable` 로 강제하거나, 02 쿼리에 독립 환경·시각 sentinel 을 추가하고 `rows.jsonl` 재생성. 소유 `ops-40-db-snapshot` · 인계 계약은 `ops-30-reconcile` — RESOLVED 2026-08-24 (ops-40 M4): `provenance`(`verified`|`unverified`) 축을 신설하고 `agree_eligible` 을 세 항 결합으로 바꿨다. q8 3라벨 419행이 `false` 로 내려갔다. `completeness` 를 `uncheckable` 로 덮어쓰는 길은 쓰지 않았다 — 두 축이 독립이라 겹치면 강등 **이유**를 읽을 수단이 사라진다. 02 쿼리 개정과 CSV 재수령은 이 마일스톤이 요구하지 않는다 (UI6); 그 파일이 자기 `q0_meta` 를 갖게 되는 순간 같은 코드가 자동으로 `verified` 를 낸다. 오라클(원시 행 `.every()`)과 생산자(계수기)가 같은 문장을 독립 구현하며 갈리면 `OPS_DB_STATUS_DISAGREE` 다 (`D-PROV`). 관측 기록 `F-OPS-40-R6`.
2026-08-18 | MEDIUM | .claude/plans/ops-40-db-snapshot-m2.plan.md | PR-Codex R1 F4 — PRD 7 행의 배타 소유 경로는 `ops/db/**` · `ops/findings/ops-40-db-snapshot.md` 뿐인데 이 PR 은 `.claude/plans/**` · `.claude/PRPs/reports/**` · `.claude/notes/**` · `.claude/receipts/**` 를 추가·변경한다(UI3 우산 제약 6 위반). 다만 그 파일들은 mccp 게이트 체인 자신의 산출물이고 `/mccp:pr` Phase 3.0 은 `.claude/receipts/mccp-pr-codex/` 를 스스로 커밋하도록 규정돼 있어, 제약과 체인이 구조적으로 충돌한다. plan 64 행은 `.claude/prds/**` 에 회부할 소유자가 없음을 이미 관측했다. **조치안**: 우산 PRD 에 "mccp 체인 산출물은 배타 소유 예외" 를 명시하거나, 자식 PR 에서 `.claude/**` 를 분리해 우산 소유자 별도 변경으로 반영. 판단 주체는 우산 소유자. 소유 미지정 — 사용자 배정 필요
2026-08-19 | MEDIUM | mccp scripts/hooks/goal-phase-guard.js | milestone-close 실측 — `/goal` 격리 lock 이 활성인 동안 **저장소 자신의 acceptance 하네스를 못 돌린다**. `BASH_ALLOW_PATTERNS` 는 git read · gh read · goal-phase-lock · goal-detect · `ls` · `pwd` · `echo` · `cat` 뿐이고 나머지는 default-deny 다(`:75-86`, `:172-177`). 그래서 `bash ops/statements/_harness/m0.sh validate` 도 `sed -n` 도 `export VAR=1` 도 차단된다. 결과: milestone-close 가 셸 실행형 acceptance 를 가진 마일스톤에서 **검증 없이 verdict 만 받는 구조**가 된다 — 사용자가 `goal-done:` 을 적으면 closure-doc 이 실측 없이 봉인된다. 이번에는 lock 을 먼저 exit 하고 실측한 뒤 진행했다(순서 역전). 조치안: allowlist 에 저장소 소유 하네스 경로 실행을 허용하거나, guard 를 write 축(Edit/Write/receipt/commit)만 막고 read/exec 는 통과시킨다. 소유 mccp 도구 층
2026-08-19 | MEDIUM | ops/statements/_harness/m0.sh | 출하 후 **재검증 경로가 없다**. `preflight` 는 산출물이 존재하면 `PRE_EXISTS` 로 죽고(`:79-84`), 기존 기준선은 이 저장소 규약이 요구하는 부모 브랜치 merge 하나로 `MERGE_SINCE_PREFLIGHT` 가 되어 못 쓴다. 실측: 기준선 `1fd2ab0` · 현 HEAD `9b0320e`(merge 73a0751 포함) → rc 1. 봉인 커밋 `dac7b6e` 로 detach 해야만 `validate ok` 가 재현된다. 즉 acceptance 는 일회용이고 브랜치 head 에서는 영영 못 돈다 — 메모리 `harness-must-be-validated-before-the-milestone` 가 예고한 형태다. 조치안: `revalidate` 모드(현 clean 트리를 기준선으로 잡고 소유 경계 검사만 건너뛴다) 또는 `--baseline-ref <sha>` 로 기준선을 커밋에서 유도. 소유 ops-20-statements (M1 착수 시)
2026-08-19 | HIGH | mccp commands/milestone-close.md + scripts/receipt/hash.js | `/mccp:milestone-close` 가 plan body 에 붙이는 `## Milestone Closure Provenance` 7행이 **선행 게이트 receipt 를 전건 stale 로 만든다**. milestone-close.md 14·180 행은 그 stamp 가 "다음 `/mccp:pr` 의 plan_hash anchor 에 자동 포함" 된다고 적었으나, `validate-cmd.js` 363-375 행은 체인의 **모든** gate receipt 에 대해 현재 plan 을 재해시한다 — stamp 이전에 봉인된 mccp-plan-codex·mccp-implement-codex 는 plan_hash 불일치로 `stale` 에 떨어지고, `validate-cmd.js` 857-860 행의 `ok` 는 `stale.length === 0` 을 요구하며 stale 에는 우회 env 가 없다. 그래서 `/mccp:pr` 2.5.8·2.5.9 가 fail-closed 로 막힌다. 반사실 실측: `dac7b6e` 판(stamp 이전) `planAwareMarkdownHash` = `sha256:dfef6a06…` (= 두 receipt 의 `plan_hash`), 현 HEAD 판 = `sha256:a265e416…`. `canonicalizeMarkdownStructural`(hash.js 152-159 행)은 checkbox·PR 자리표시자·표 status 토큰만 정규화하고 provenance 절은 정규화하지 않는다. 영향 반경: ops-20-statements 의 receipt 2건, plan 1개. completion-ledger 는 이 저장소에 부재하므로 TRACKED_RECEIPT_OVERWRITE 가드가 보호하는 ledger↔receipt 결박은 여기서 0건이다. **조치안**: `canonicalizeMarkdownStructural` 에 `## Milestone Closure Provenance` 절 strip 을 추가(근본 수정, option B 유지) 하거나, milestone-close 를 plan body 미변경 + 별도 receipt(option A)로 전환. 재앵커는 답이 아니다 — 게이트는 `a265e41` 을 본 적이 없으므로 receipt 를 그 해시로 다시 쓰면 위조다. 소유 mccp 도구 층
2026-08-19 | HIGH | ops/statements/check-statements.mjs | PR-Codex R2 F2 잔여 — `value[].norm` 이 `raw` 와 **수치로 일관한지** 안 본다. R2 흡수로 `raw` 는 앵커 셀에서 도출되게 묶었으나(규칙 2b, `stated` 한정), `norm` 은 여전히 자유값이라 `raw:"12,900원"` + `norm:99999` 가 통과한다. 실측: 흡수 후에도 그 조합에 위반 0건. **지금 고치지 않은 이유**: 판정에 숫자 정규화 계약(통화 기호·단위·천단위 구분자 제거 순서)이 필요한데 PRD 는 예시 1건(`"12,900원"` → `12900`)만 주고 계약을 정하지 않았다. 여기서 지어내면 그 예시에 과적합한 규칙이 봉인된다. **조치안**: PRD 에 숫자 정규화 사다리를 명시한 뒤 `norm` 을 `raw` 에서 결정론적으로 유도해 대조하고, 불일치 fixture 를 더한다. 소유 ops-20-statements (M1)
2026-08-19 | MEDIUM | ops/statements/check-statements.mjs | PR-Codex R2 F2 파생 — 규칙 2b(`value.raw` 앵커 결박)를 규칙 2 와 같은 범위인 `stated` 로만 걸었다. `confidence: "inferred"` 레코드의 `value` 는 앵커 결박이 **미검증**이다. 범위를 맞춘 이유는 UI8 이 도출 실패를 거부가 아니라 강등으로 정했기 때문이고, value 축만 더 조이면 계획이 정하지 않은 정책을 게이트가 새로 만든다. **조치안**: `inferred` 의 value 가 실물에서 어떤 모양으로 나오는지 M1 에서 관측한 뒤 결박 여부를 정한다. 소유 ops-20-statements (M1)
2026-08-19 | MEDIUM | ops/statements/check-statements.mjs · .gitattributes | PR-Codex R2 F3 — UI13(PII 를 저장소에 들이지 않는다)이 **기계로 강제되지 않는다**. `actor` 는 허용 키지만 타입·내용 검사가 없고 `text` · `value[].raw` 도 자유 문자열이다. 실측: `actor:"person@example.com"` · `text:"홍길동 010-1234-5678 승인"` 둘 다 위반 0건. 정상 판독 과정에서 이름·이메일이 영구 git 이력에 들어갈 수 있다. **지금 고치지 않은 이유**: 계획이 UI13 을 제약으로만 적고 비식별화 계약(`actor` 를 null 로 둘지 안정 가명 ID 로 둘지, `text` 의 인용 범위를 어디까지 둘지)을 정하지 않았다. 규칙을 지어내면 실물 판독이 시작되기 전에 형태를 못 박는다. 아울러 R2 F4 잔여 — 원장 경로의 체크아웃 LF 고정(`.gitattributes` `eol=lf`)은 이 게이트 소유가 아니다. **조치안**: 비식별화 계약을 PRD 에 정한 뒤 `actor` 제약 + PII 음성 fixture 를 더하고, `.gitattributes` 는 인프라 소유자에게 회부. 소유 미지정 — 계약은 사용자 배정 필요
2026-08-19 | 정정 | ops/statements/check-statements.mjs | 위 3행 중 두 축의 **하한선은 반영했다** (PR-Codex R3 재제기 수용). PII 는 이메일·국내전화·주민번호 패턴을 `text`·`actor`·`value[].raw`·`value[].unit` 에서 `OPS_INV_PII_PRESENT` 로 거부하고, `norm` 은 숫자열이 `raw` 의 숫자열 안에 없으면 `OPS_INV_NORM_NOT_IN_RAW` 로 거부한다. 앞 이월 사유는 "전체 계약이 미정" 과 "기계적 하한선이 불가능" 을 섞은 것이었고 Codex 가 그 혼동을 정확히 지적했다 — 어떤 비식별화 계약도 생 이메일·전화·주민번호를 허용하지 않고, 어떤 숫자 정규화 사다리에서도 `norm` 의 숫자열은 `raw` 에서 나온다. **남는 것**: 비식별화 계약(`actor` 를 null 로 둘지 가명 ID 로 둘지, 이름·주소·사번 등 패턴 밖 PII), 숫자 정규화 사다리(부분 숫자열 `norm:129` 는 여전히 통과), `inferred` 의 value 앵커 결박. PII 패턴은 예외 문법을 두지 않아 정당한 문서 인용도 거부된다 — 사용자 판단(2026-08-19)으로 fail-closed 를 골랐다. 상세는 findings `F-OPS-20-L7`. 소유 위와 같음
2026-08-19 | MEDIUM | ops/statements/ · 판독 규약 | PR-Codex R6 F3 잔여 — `actor` 는 비식별 안정 ID(`ACTOR_RE`, 소문자 ASCII 슬러그)로 닫았으나 **`text` 안의 실명은 여전히 통과한다**. `text` 를 제약하지 않은 이유는 그것이 문서 인용이고 UI2 가 앵커 셀에서의 도출을 요구하기 때문이다 — 좁히면 도출 설계가 깨진다. 실측: `text:"홍길동 승인"` 위반 0건(패턴 3종에 안 걸린다), `text:"홍길동 010-1234-5678"` 는 전화 패턴으로 걸린다. **조치안**: 판독 규약에 "인명은 인용하지 않고 `actor` 가명으로만 적는다" 를 명시하거나, `text` 도 도출 가능성을 유지한 채 인명 마스킹을 거치는 형태를 M1 에서 정한다. 아울러 가명 ↔ 실명 대응표의 보관 위치가 미정이다 — 저장소 안에 두면 UI13 을 우회한다. 소유 ops-20-statements (M1) · 대응표 위치는 사용자 배정
2026-08-19 | 정정2 | ops/statements/check-statements.mjs | 위 `norm` 이월행 정정 — 하한선을 **수 토큰 일치**로 올렸다 (PR-Codex R9 F1). 앞 판의 숫자열 부분 포함은 퇴화해서 `raw:"12,900원"` 에 대해 `norm:0` · `norm:9` · `norm:129` 가 전부 통과했다(한 자리 숫자는 거의 모든 raw 에 들어 있다). 지금은 `raw` 에서 천단위 쉼표를 걷고 수 토큰을 뽑아 `|norm|` 이 그중 하나와 같아야 하며 부호도 맞아야 한다. 앞서 이월했던 부분 숫자열 구멍은 이것으로 닫혔다. **남는 것**: `qty`·`unit` 은 타입만 닫혔고 앵커와 대조되지 않아 `{qty:999, unit:"USD", raw:"12,900원", norm:12900}` 이 통과한다. 수량·통화의 셀 도출 규칙은 PRD 에 없다(예시 레코드 1건뿐). 아울러 `norm` 을 `raw` 에서 **유도**하는 정규화 사다리 자체는 여전히 미정 — 토큰 일치는 유도가 아니라 실재 확인이다. 소유 ops-20-statements (M1)
2026-08-19 | MEDIUM | ops/statements/check-statements.mjs `normalize()` | PR-Codex 최종 라운드 F3 — 규칙 2 의 정규화 사다리가 **토큰 경계를 지운다**. 공백과 쉼표를 무조건 걷으므로 셀 값 `12, 900원` 과 진술 `12900원` 이 같은 문자열로 접힌다(실측: `normalize()` 결과 동일). 원문에 토큰으로 존재하지 않는 금액이 `stated` 로 인증될 수 있다 — UI2 가 막으려는 형태다. **지금 고치지 않은 이유**: 그 사다리는 계획이 정의하고(`### Task 3` 규칙 2) fixture 가 4단계 전부를 단언하는 봉인된 규칙이다. `CELL_B2` / `TEXT_OK` 가 전각·공백·쉼표·대소문자를 한 번에 태우도록 설계돼 있어, 좁히면 규칙 2 자체를 다시 정의해야 하고 그것은 M0 범위 밖이다. `value` 축은 이 형태에서 벗어나 있다 — `norm` 은 수 토큰 일치라 경계를 지우지 않는다. **조치안**: 규칙 2 를 "정규화 후 부분문자열 포함" 에서 "정규화 후 토큰 경계 유지 대조" 로 올릴지 M1 에서 실물 표기 변형을 보고 정한다. 소유 ops-20-statements (M1)
2026-08-19 | MEDIUM | mccp scripts/lib/history-leak-scan.js | `/mccp:pr` Phase 3.1 pre-push HISTORY-leak 게이트가 **서브모듈 gitlink 에서 거짓 차단**한다. 스캐너가 트리 엔트리를 전부 blob 으로 보고 `git cat-file -t <oid>` 를 부르는데, `160000 commit` 엔트리의 oid 는 부모 저장소에 객체로 없어(설계상 정상) 실패하고 그 실패가 `pattern: "scan-error"` 로 `leaks[]` 에 실려 rc 1 이 된다. 실측: `insuniverse-admin`(7df733a) · `insuniverse-server`(c7597fc) 둘 다 `git ls-tree HEAD` 에서 `160000 commit` 이고, `scanned_blobs 150` 중 실제 내용 유출은 **0건**이며, 두 경로는 이 PR diff(`origin/feat/ops-doc-reconcile...HEAD`)에 **없다**(스캐너는 `origin/main` 기준 39커밋을 훑는다). gitlink 은 원리상 텍스트를 못 담으므로 유출 대상이 아니다. **조치안**: 트리 순회에서 mode `160000` 엔트리를 건너뛰거나, `cat-file -t` 가 `commit` 을 내는 oid 를 스캔 대상에서 제외. `scan-error` 를 fail-closed 로 두는 것 자체는 유지한다 — 읽을 수 없는 blob 은 여전히 막아야 한다. 소유 mccp 도구 층
2026-08-19 | MEDIUM | ops/_meta/ops-manifest.yaml | ops-30 M0 회부 — `ops/findings/ops-{10-cells,20-statements,30-reconcile}.md` 3건이 `ownership.child_files`(`:68`)에 미등재라 우산 게이트가 `OPS_INV_UNCLASSIFIED` 로 빨갛다. `ops/_meta/**` 는 UI4 쓰기 금지라 이 브랜치가 `--update` 로 못 닫는다. 소유 ops-00-protocol · 차단 마일스톤 없음 · 안정 ID F-OPS-30-R1
2026-08-19 | MEDIUM | ops/_meta/verify-ops.sh | ops-30 M0 회부 — `reproduce.reconcile`(`ops-manifest.yaml:103`)이 `node ops/reconcile/reconcile.mjs --check` 로 이름만 있고 실행 지점에 배선돼 있지 않다. manifest 리더가 `map` 으로 파싱만 한다. 실행되지 않는 스크립트는 fail-closed 게이트가 아니다. 소유 ops-00-protocol · 차단 마일스톤 없음 · 안정 ID F-OPS-30-R2
2026-08-19 | HIGH | docs/_meta/index/policy-candidates.code.jsonl | ops-30 M0 회부 — 파일이 없다(디스크 실측). `insuniverse-docs-11-index-code` M6 가 `pending` 이라 M3 의 "인덱스 3축" 전제가 성립하지 않는다. 실재는 git 2870행 + runtime 50행(meta 1)의 2축이다. 소유 insuniverse-docs-11-index-code · 차단 마일스톤 ops-30 M3 · 안정 ID F-OPS-30-R3
2026-08-19 | LOW | .claude/prds/ops-30-reconcile.prd.md | ops-30 M0 회부 — PRD 문면의 "인덱스 3축이 이미 실재한다" 가 실측(2축)과 어긋난다. 소유 PRD 소유자 · 차단 마일스톤 없음 · 안정 ID F-OPS-30-R4
2026-08-19 | HIGH | ops/statements/statements.jsonl | ops-30 M0 회부 — 0바이트다(ops-20 M1 미착수). 층 3 원장이 참조할 진술이 0건이라 ops-30 M1~M3 착수 불가. 소유 ops-20-statements · 차단 마일스톤 ops-30 M1 · 안정 ID F-OPS-30-R5
2026-08-19 | HIGH | .claude/prds/ops-30-reconcile.prd.md · 우산 | ops-30 M0 회부 — `stale 비율 < 30%` 규칙에 투영 확정 절차와 마이그레이션 사건의 분리가 없다. 실측: `26aeb9f`→`41ca4fa` 인덱스 재생성에서 공통 2870행 전건(100.0%) 해시 불일치, 원인은 `legal_boilerplate` 필드 신설 1회(값 분포 true 18 · false 1352 · null 1500). 소유 우산/PRD 소유자 · 차단 마일스톤 없음 · 안정 ID F-OPS-30-R6
2026-08-19 | HIGH | docs/_meta/index/policy-candidates.git.jsonl | ops-30 M0 회부 — git 축 후보 id 1370건(`source: comment` 전건)이 `:<시작행>-<끝행>` 로 행 번호에 결박돼 있어 무관한 줄 이동이 대상 부재를 만든다. 행 번호 독립 안정 키 또는 재결박 절차가 필요하다. M0 는 `OPS_RC_TARGET_ABSENT` fail-closed + 부재 전건 목록까지만 한다. 소유 insuniverse-docs-10-index-git · 차단 마일스톤 ops-30 M3 · 안정 ID F-OPS-30-R7
2026-08-19 | LOW | ops/db/normalize-db.mjs | ops-30 M0 회부 — `canonicalize` 를 순수 공용 모듈로 분리 검토. 지금은 그 함수 하나를 쓰려고 정적 import 폐쇄집합 4개(`normalize-db.mjs` · `lib/csv.mjs` · `lib/lock.mjs` · `lib/oracle.mjs`)를 fixture 트리에 복사해야 한다. 소유 ops-40-db-snapshot · 차단 마일스톤 없음 · 안정 ID F-OPS-30-R8 — RESOLVED 2026-08-24 (ops-40 M4): `ops/db/lib/canon.mjs` 로 분리했다 — **import 0** 인 순수 모듈이라 `canonicalize` 하나만 쓰려는 소비자는 이 한 파일만 가져가면 된다. `normalize-db.mjs` 는 `import` + `export` 로 re-export 해 공개 표면을 바이트 단위로 보존한다 (`ops/reconcile/reconcile.mjs` 26 행의 import 와 1155 행의 `===` 참조 동일성 둘 다 유지). **selftest fixture 트리의 사본 수는 줄지 않았다** — 전 진입점을 실행하므로 5개(`normalize-db` + `canon` + `csv` + `lock` + `oracle`)를 복사한다. 줄어든 것은 *소비자가 지불하는 폐쇄집합*이지 fixture 의 것이 아니다.
2026-08-19 | HIGH | docs/_meta/index/extract-policy-candidates.mjs | ops-30 M0 회부 — `summarize()`(`:728`)가 실제 개행에서 끊어 `summary` 가 첫 줄뿐이라, 다중행 comment 의 둘째 줄 이후 정책 변경이 인덱스 어느 필드에도 안 나타난다(2870행 전건 `summary_truncated: false`, 최대 126자). 전체 block text 의 정규화 digest 를 후보 행에 실어 달라 — M0 의 `anchor_commit.sha` 결박은 대리이지 등가가 아니다. 소유 insuniverse-docs-10-index-git · 차단 마일스톤 없음 · 안정 ID F-OPS-30-R9
2026-08-19 | HIGH | ops/statements/_harness/m0.sh | ops-30 범위 밖 결함 — MSYS bash(Windows)에서 `env -u NODE_OPTIONS -u NODE_PATH node <절대경로>` 형태가 **node 를 조용히 삼킨다**: rc 0 · stdout 0바이트다. 반사실 실측: 같은 인자를 `env -u` 없이 부르면 정상 출력, `env -u` 를 씌우면 `node -e 'console.log(...)'` 조차 아무것도 안 낸다. 그 하네스는 `run_case` 전건과 빈 원장 실행을 이 형태로 부르므로 이 호스트에서는 fixture 실행이 공허 통과가 될 수 있다(양성 case 의 계수 단언이 방어선이지만, `want_tok` 이 빈 양성 경로에서만 걸린다). ops-30 하네스는 셸 `unset` + 트리 cd + 상대 경로 + 비공허 단언으로 우회했다. 조치안: ops-20 하네스도 같은 형태로 바꾸고 양성 경로에 stdout 비공허 단언을 넣는다. 소유 ops-20-statements · 차단 마일스톤 없음 · 안정 ID F-OPS-20-H1
2026-08-19 | MEDIUM | .claude/plans/ops-30-reconcile.plan.md §Files to Change | ops-30 범위 밖 결함 — 계획이 도구 경로 허용을 5종 열거로 좁히면서 `.claude/prds/**` 를 뺐는데, 마일스톤 종료는 PRD Delivery Milestones 표의 `Status` 를 `in-progress` → `complete` 로 넘겨야 한다. 반사실 실측: 112행 상태를 플립한 뒤 `bash ops/reconcile/_harness/m0.sh validate` 가 `OUT_OF_SCOPE .claude/prds/ops-30-reconcile.prd.md` + `BASELINE_LOST` 로 rc 1(게이트는 설계대로 경로 이름을 댔다). 영향 반경은 `.claude/prds/ops-30-reconcile.prd.md` 1파일 1행이며 산출물 정확성에는 닿지 않는다. 그래서 M0 acceptance 를 지키려고 플립을 **되돌렸고 PRD 상태는 여전히 `in-progress`** 다. 조치안: 허용 열거에 `.claude/prds/<이 PRD>.md` 를 더하거나, 상태 플립을 acceptance 창 밖(별도 단계)으로 분리한다. 소유 ops-30-reconcile (M1 착수 시) · 차단 마일스톤 없음 · 안정 ID F-OPS-30-H2
2026-08-19 | LOW | .claude/plans/ops-30-reconcile.plan.md §Files to Change | ops-30 범위 밖 결함(F-OPS-30-H2 와 같은 뿌리) — `/mccp:prp-implement` Phase 5 는 구현 보고서를 `.claude/PRPs/reports/<plan>-report.md` 에 쓰라고 하는데 그 경로도 허용 5종 밖이다. 그대로 쓰면 acceptance 가 `OUT_OF_SCOPE` 로 깨지므로 이번 판은 보고서를 허용 경로인 `.claude/notes/ops-30-reconcile-m0.md` 안에 넣었다. 조치안: 허용 열거에 `.claude/PRPs/reports/<이 plan>-report.md` 를 더하거나, 보고서 자리를 notes 로 계약한다. 소유 ops-30-reconcile (M1 착수 시) · 차단 마일스톤 없음 · 안정 ID F-OPS-30-H3
2026-08-20 | 해소 | .claude/plans/ops-30-reconcile.plan.md §Files to Change | `F-OPS-30-H2` 정정 — 도구 경로 허용 열거에 `.claude/prds/ops-30-reconcile.prd.md` 를 더했다(조치안 1안). 아울러 `.claude/settings.json`(이 브랜치에서 이미 수정돼 있었는데 어느 대기열에도 미등재였다) 과 `.gitattributes`(층 3 원장 EOL 고정) 도 같이 등재했다. 열거는 유지한다 — `.claude/**` 통째 면제가 아니다(반사실: `.claude/prds/ops-20-statements.prd.md` 는 여전히 거부). 세 벌로 복사돼 있던 허용 목록을 `OWNED_*`/`TOOL_*` 4변수 + `PRED_JS` 한 곳으로 합쳤다. 소유 ops-30-reconcile · 안정 ID F-OPS-30-H2
2026-08-20 | MEDIUM | ops/reconcile/reconcile.mjs · .claude/plans/ops-30-reconcile.plan.md §토큰 우선순위 전표 | ops-30 M0 로컬 리뷰 흡수 — 색인 파손 전용 토큰 `OPS_RC_INPUT_NOT_JSONL` 을 신설해 check 집합이 19 → **20** 이 됐고 전표 번호가 4번부터 한 칸씩 밀렸다. 계획 본문은 `mccp-plan-codex` receipt 의 `plan_hash` 앵커라 고치지 않았다(재앵커는 위조다). 구현·하네스·notes 는 20 을 쓰고 계획서는 19 를 적은 상태다. **조치안**: M1 착수로 계획을 다시 열 때 전표를 20 으로 맞춘다. 우선순위 관계 자체는 보존됐다(신설 토큰이 구조 그룹 끝·행 그룹 앞). 소유 ops-30-reconcile (M1 착수 시) · 차단 마일스톤 없음 · 안정 ID F-OPS-30-H4
2026-08-20 | LOW | .claude/state/fix-task.md | ops-30 M0 로컬 리뷰 — 회부 등재 대기열이 `**/.claude/state/` 로 gitignore 돼 커밋되지 않는다. 하네스 11)이 무는 증거가 워킹트리 한정이라 리뷰어가 검증할 수 없고, stop-review-loop 가 소진 후 `fix-task-applied.md` 로 개명하면 파일 이름까지 갈린다(이번 판은 하네스가 두 이름을 다 받게 해서 막았다). **조치안**: 회부 등재 정본을 커밋되는 `codex-findings-backlog.md` 한쪽으로 좁히고 `fix-task` 는 작업 큐로만 쓸지 정한다. 소유 mccp 도구 층 · 차단 마일스톤 없음 · 안정 ID F-OPS-30-H5
2026-08-20 | MEDIUM | ops/reconcile/_harness/m0.sh | ops-30 M0 milestone-close 실측 — 소유 검사의 도구 경로 열거에 `.claude/cache/` 가 없어 **시각 의존 거짓 실패**가 난다. `inventory()` 가 `--ignored` 로 훑으므로 대시보드 렌더 산출 4종(`.claude/cache/STATUS.md` · `status.html` · `.trigger-pending` · `.last-render.json`)이 preflight↔validate 사이에 한 번만 갱신돼도 `OUT_OF_SCOPE` 4행 + `BASELINE_LOST` 4행으로 `M0_FAIL OWNERSHIP_WORKTREE` 가 뜬다. 반사실 실측: 같은 트리·같은 커밋(`4dbd772`)에서 09:44 판 `validate ok` rc 0, 10:00 재실행 rc 1 `tool_paths_changed 12` — 저장소 변경은 0건이고 갈린 것은 대시보드 캐시뿐이다. 봉인 커밋에 detached checkout 해 기준선을 새로 잡으면 `tool_paths_changed 0` · `validate ok` rc 0 으로 통과한다. **조치안**: `TOOL_PREFIXES` 에 `.claude/cache/` 를 더한다(gitignored·untracked 기계 생성물이고 커밋 축 9)는 tracked diff 만 보므로 보호 손실이 없다). `.claude/**` 통째 면제는 여전히 쓰지 않는다. 소유 ops-30-reconcile (M1 착수 시) · 차단 마일스톤 없음 · 안정 ID F-OPS-30-H6
2026-08-20 | MEDIUM | ops/reconcile/_harness/m0.sh (일회용 하네스 재현 규약) | ops-30 M0 milestone-close 실측 — 하네스 머리말이 "봉인 커밋으로 detached checkout 한 뒤 preflight/validate 를 다시 잡는다" 고 적었으나 그 절차가 이 저장소에서 그대로는 안 돈다. (1) 기준선 커밋(`0f701b9`)에는 층 3 원장의 LF 를 고정하는 `.gitattributes` 항목이 아직 없다 — 그 항목은 봉인 커밋 `4dbd772` 가 넣었다. 그래서 golden 트리를 `git checkout <sha> -- <path>` 로 복원하면 smudge 필터가 CRLF 를 넣고 preflight 가 `M0_FAIL GOLDEN_STMT_NONZERO OPS_INV_LEDGER_NOT_LF` 로 죽는다. `git cat-file blob <sha>:<path>` 로 복원해야 원 바이트가 온다. (2) preflight 195행이 `_harness/` 내용물을 정확히 `golden m0.sh` 로 요구하므로 하네스 한 본만 복원하면 `M0_FAIL HARNESS_INVENTORY m0.sh` 다 — golden 트리를 같이 복원해야 한다. 둘 다 하네스 결함이 아니라 **재현 절차의 누락**이고, 절차를 모르면 이 하네스는 봉인 이후 영영 못 돈다. **조치안**: 머리말 재현 절차에 두 줄(cat-file 복원 · golden 동반 복원)을 명시한다. 소유 ops-30-reconcile (M1 착수 시) · 차단 마일스톤 없음 · 안정 ID F-OPS-30-H7
2026-08-20 | LOW | mccp commands/milestone-close.md Phase 4 | closure-doc 의 secret mask 호출 예시가 `require(...).applySecretMask; mask(RAW).text` 인데 `scripts/derive/mask.js` 의 `applySecretMask` 는 **문자열을 그대로 반환**한다(래퍼 객체가 아니다). 문서대로 쓰면 `MASKED` 가 `undefined` 가 되어 closure-doc 의 Goal Loop Result 절이 통째로 비고, 그 오류는 조용하다. 실측: `typeof applySecretMask(text) === "string"` · `String(r) === input` (이 closure 에서 치환 0건). 참고로 `.text` 를 가진 것은 같은 모듈의 다른 export 가 아니라 아무것도 아니다 — export 는 `maskModel,maskPath,scrubAbsPaths,maskSecrets,applySecretMask,applyPathMask,isSevereKind,SECRET_PATTERNS,SEVERE_KINDS,REPO_PLACEHOLDER` 다. **조치안**: 문서 예시를 `mask(RAW)` 로 고친다. 소유 mccp 도구 층 · 차단 마일스톤 없음 · 안정 ID F-OPS-30-H8
2026-08-20 | HIGH | .claude/receipts/mccp-implement-codex/ops-30-reconcile.json | ops-30 M0 출항 감사 공백 — 이 PR 은 `/mccp:pr` 게이트 **밖**에서 수동 생성됐다. `mccp-pr-codex` receipt 가 없고 PR body 에 Codex/Design 리뷰 절도 없다. 원인 확정: implement receipt 가 `meta.security_skipped=true`(사유 "Agent(Task) tool 호출이 금지된 세션") 로 봉인됐고, `mccp-implement-codex` 는 `STRICT_SECURITY_GATES`(`validate-cmd.js` 27행) 이므로 `validate --command mccp:pr` 가 blocking 을 낸다(실측 rc 2). 반사실: 같은 트리에서 `--command mccp:code-review` 는 `blocking: []` — 즉 strict 목록 소속만이 원인이다. 우회 부재: env 탈출구는 `security_force_override=true` **가 receipt 안에 박혀 있을 때만** warning 강등(`validate-cmd.js` 455행)이고, 그 필드를 넣으려면 receipt 재작성이 필요한데 이 파일은 git-tracked 라 해시가 갈려 `TRACKED_RECEIPT_OVERWRITE` fail-closed(`store.js` 145행)다. santa-loop 도 못 푼다 — `santa_*` 는 hash carve-out 이 아니어서(`write.js` 734행) 같은 슬러그 재작성이 같은 가드에 걸린다. 영향 반경: 슬러그 `ops-30-reconcile` 로 출항하는 모든 PR(=이 브랜치 전부). 같은 브랜치 재실행으로는 영영 안 풀리고, `store.js` 가 대는 유일한 합법 경로는 새 브랜치명(=새 슬러그)에서 plan+implement 게이트를 다시 발급하는 것이다. **조치안**: M1 착수 시 새 슬러그로 재출항해 `security_skipped=false` receipt 를 확보하거나, mccp 도구 층에 supersession 스키마(현재 Out of Scope)를 요청한다. 소유 ops-30-reconcile (M1 착수 시) · 차단 마일스톤 없음 · 안정 ID F-OPS-30-H9
2026-08-20 | 정정 | .claude/receipts/mccp-implement-codex/ops-30-reconcile.json | `F-OPS-30-H9` 조치안 정정 — "새 브랜치명(=새 슬러그)이 유일 경로" 는 틀렸다. 브랜치는 그대로 두고 **새 슬러그로 재앵커**하면 된다(검증된 경로). `ops-30-reconcile-ship` 으로 `mccp-plan-codex` + `mccp-implement-codex` 두 receipt 를 다시 쓴다. implement 는 security-reviewer 를 실제로 돌려 `security_skipped=false` 로 쓰는 게 정본이고, 못 돌리는 경우에만 `--security-force-override --security-force-override-reason "<30자+3단어>"` 를 쓴다(`security_force_override` 는 blocking 아니라 warning — `validate-cmd.js` 455행). 원본 슬러그 receipt 는 손대지 않으므로 "게이트 당시 skip" 사실이 히스토리에 남고 `TRACKED_RECEIPT_OVERWRITE` 도 안 건드린다. 함정 2개: (1) `mccp-plan-codex` 는 `INTENT_IN_SCOPE_GATES` 소속이라 `MCCP_SKIP_INTENT_GATE="<사유>"` 감사 override 가 필요하고 `intent_gate_verdict=incomplete` 가 봉인된다 — implement 게이트는 intent 범위 밖이라 그냥 써진다. (2) 새 슬러그엔 대응 계획 파일이 없어 `/mccp:pr` 2.5.8·2.5.9 가 `.claude/plans/<slug>.plan.md` 를 유도해 stale HALT 하므로 `PR_PLAN_PATH=.claude/plans/ops-30-reconcile.plan.md` 를 **각 validate 호출마다** 붙여야 한다(블록마다 셸이 갈려 export 를 못 믿는다). 소유 ops-30-reconcile (M1 착수 시) · 안정 ID F-OPS-30-H9
2026-08-21 | MEDIUM | .claude/plans/ops-10-cells-m1.plan.md | ops-10 M1 Implement-Codex R1 F3 잔여 — 게시 통제 파일(`.publish-lock` · `.publish-marker.json` · `.tmp-*`)은 `ops/cells/` 안에 살아야 한다(UI4 가 M1 에 준 유일한 쓰기 경로이고, 마커는 강제 종료를 넘겨 살아야 해서 프로세스 스크래치로 못 옮긴다). 그런데 `verify-ops.sh:563` `classify` 는 `child_prefixes` 아래 정규 파일 전수를 자식 산출로 분류하므로, 게시가 도는 동안과 강제 종료 직후에 이 파일들이 **일반 golden 어긋남**으로 보이고 `OPS_INV_PUBLISH_INCOMPLETE` 같은 고유 토큰이 안 나온다. M1 은 자기 쪽에서 `--ownership-check` 가 `publish_control_files_present` 를 정수로 내고 봉인 시점 잔여를 fail-closed 로 막는 데까지 했다. 나머지 절반(게이트가 통제 파일을 고유 토큰으로 부르는 것)은 `ops/_meta/verify-ops.sh` 개정이라 UI5 로 M1 이 못 한다. **조치안**: manifest `ownership` 에 통제 파일 이름을 좁게 등재하는 축이나 `verify-ops.sh` 가 자식 통제면을 별도 토큰으로 내는 축 중 하나를 00 이 정한다. 소유 insuniverse-docs-00-protocol (ops 우산 규약) · 차단 마일스톤 없음 · 안정 ID F-CELL-M1-C1
2026-08-24 | MEDIUM | .claude/settings.json | mccp env-contract 레지스트리와 소비처의 열거가 두 토글에서 갈린다. (1) `MCCP_SANTA_SEVERITY_GATE` — `registry.js:115` 는 `['off','high','critical']` 로 선언하는데 `santa/gate.js:83` 은 `['enforce','off']` 만 받는다. 레지스트리를 보고 `high` 를 쓰면 148행이 loud warn 을 내고 `enforce` 로 되돌려, 설정은 매 실행 경고만 남기는 죽은 값이 된다. (2) `MCCP_CONTEXT_MONITOR_COST_MODE` — `registry.js:168` 은 `['off','observe','enforce']` 인데 `ecc-context-monitor.js:68` 은 `notify|notification|info|informational` 만 인식해 `off` 를 포함한 레지스트리 3값 전부가 무동작이다. 실측: `parseBool` 은 정상(`on/off` 별칭 수용)이고 이 둘만 enum 축에서 갈린다. 영향: 레지스트리를 정본으로 읽은 설정이 조용히(또는 경고만 내고) 무효가 된다 — `/mccp:dashboard-audit` 이 값을 그대로 보고하므로 원장에서도 유효해 보인다. **조치안**: 레지스트리를 소비처 열거에 맞추거나(가장 싸다), 소비처가 레지스트리 열거를 받도록 넓힌다. 이 저장소는 그동안 `MCCP_SANTA_SEVERITY_GATE=enforce` · `MCCP_CONTEXT_MONITOR_COST_WARNINGS=off` 로 우회한다. 소유 mccp 도구 층 · 차단 마일스톤 없음 · 안정 ID F-OPS-30-H10

## 표 원장 (mccp 소비자 앵커 — `derive/sources/backlog.js` 가 이 헤더를 문다)

위 평문 행들은 `/mccp:plan` §5.4 형식의 수기 기록이고 mccp 소비자에게는 보이지 않는다.
아래부터가 기계가 읽는 표다. 기존 행은 옮기지 않는다 — append-only 원장이다.

| Date | Severity | Source plan | Finding |
|---|---|---|---|
| 2026-08-25 | HIGH | .claude/plans/ops-10-cells-m3.plan.md | L2 security: Validation harness references undefined error token `OPS_INV_CELL_DIGEST_INDEPENDENT` which is not declared in the plan specification · 원문 .claude/reviews/plan-review-ops-10-cells-m3.md · id=8bca5157 |
| 2026-08-25 | FAIL | .claude/plans/ops-10-cells-m3.plan.md | L2 security: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-10-cells-m3.md · id=d9199f48 |
| 2026-08-25 | CRITICAL | .claude/plans/ops-10-cells-m3.plan.md | L2 invariant: Receipt does not anchor to the plan being reviewed · 원문 .claude/reviews/plan-review-ops-10-cells-m3.md · id=a5311b59 |
| 2026-08-25 | HIGH | .claude/plans/ops-10-cells-m3.plan.md | L2 invariant: Receipt shows stale review state: claims convergence at R1 when plan documents 5 completed rounds · 원문 .claude/reviews/plan-review-ops-10-cells-m3.md · id=943f4daf |
| 2026-08-25 | HIGH | .claude/plans/ops-10-cells-m3.plan.md | L2 invariant: Receipt contains contradictory verdict: converged=true but codex_verdict=divergent · 원문 .claude/reviews/plan-review-ops-10-cells-m3.md · id=af442638 |
| 2026-08-25 | HIGH | .claude/plans/ops-10-cells-m3.plan.md | L2 invariant: Receipt findings array is empty despite plan documenting extensive codex findings · 원문 .claude/reviews/plan-review-ops-10-cells-m3.md · id=0312de81 |
| 2026-08-25 | CRITICAL | .claude/plans/ops-10-cells-m3.plan.md | L2 invariant: Gate loses binding force: receipt cannot be used to validate this plan version · 원문 .claude/reviews/plan-review-ops-10-cells-m3.md · id=145440cb |
| 2026-08-25 | FAIL | .claude/plans/ops-10-cells-m3.plan.md | L2 invariant: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-10-cells-m3.md · id=882327ba |
| 2026-08-25 | HIGH | .claude/plans/ops-10-cells-m3.plan.md | Implement D-I6: §Validation 하네스 1541·1568 행이 줄이음 `\` + 개행 대신 리터럴 `\n` 을 실어 `grep ... "$T/fc-anchor.err" n \|\| fail` 이 된다. `bash -n` 은 통과한다. 실행본에서 고쳤고 계획 본문은 봉인 유지 |
| 2026-08-25 | MEDIUM | .claude/plans/ops-10-cells-m3.plan.md | Implement D-I7: §Validation 17) `outofscope_dirty 0` 은 `.claude/**` 게이트 산출물이 커밋되기 전에는 성립 불가. `observeTree()` 가 `ops/` 밖 전건을 세고 D6b 의 `.claude/**` 구역 분리를 모른다 |
| 2026-08-25 | HIGH | .claude/plans/ops-10-cells-m3.plan.md | Implement D-I8: §Validation 6) 은 `artifact_sha256` 이 `--report` 에 없어야 한다 하고 10) 은 `--report` 행을 `--loss-census` 22행 전건과 `cmp` 하라 한다. 동시 성립 불가 — R5 F6 이 census 를 22행으로 넓힐 때 10) 이 17행 문면으로 남았다. 미수정 하네스가 정확히 이 단계에서 실패함을 실측 |
| 2026-08-25 | MEDIUM | .claude/plans/ops-10-cells-m3.plan.md | 로컬 리뷰 M-4: `ops/cells/extract-cells.mjs` 가 4030행(M3 이 +444)으로 리뷰 상한 800 을 크게 넘는다. 축별 분할은 가능하나 M3 범위 밖 — `ckCellArtifacts`(check) ↔ `listCellArtifacts`(extract) 쌍은 **의도된 오라클 독립성**이므로 분할·DRY 어느 쪽도 이 둘은 합치면 안 된다. 소유 ops-10-cells 후속 마일스톤 · 차단 없음 · 안정 ID F-CELL-18 |
| 2026-08-25 | LOW | .claude/plans/ops-10-cells-m3.plan.md | 로컬 리뷰 L-1: §Risks "잔재 집합 검사가 임시 파일을 물어 게시가 자기를 죽인다" 행이 완화책을 "`TMP_PREFIX_RE` 로 배제" 로 적었는데 기전이 틀렸다. 그 정규식은 끝 앵커(`/\.tmp-[0-9a-f]{16}$/`)라 걸리는 이름은 `.jsonl` 로 끝날 수 없어 `continue` 가 안 탄다 — 실제 배제는 `.jsonl` 접미 검사다. 계획은 봉인이라 코드 주석 두 곳에만 적었다. 다음 계획 개정 때 문면 정정 · 소유 ops-10-cells · 차단 없음 · 안정 ID F-CELL-19 |
| 2026-08-25 | HIGH | .claude/plans/ops-10-cells-m2.plan.md | F-CELL-17-MAIN · 층 1 산출 교체가 소비자에게 원자적이지 않다 — 00 판정(2026-08-25)으로 `feat/ops-doc-reconcile` 병합은 출항 아님으로 좁혔고 조정 축 (가)소비자 잠금·마커 / (나)세대 디렉터리+포인터 는 미정이다. `main` 병합의 선행조건으로 이월. 소유는 `ops/statements/**` · PRD |
| 2026-08-25 | MEDIUM | .claude/plans/ops-10-cells-m3.plan.md | O-M3-1 · PRD §Open Questions 의 `t` 타입 정규화 항목 문면 갱신 — M1 이 원형 보존으로 닫았고 실측(`t_dist` n/null/s 3종만 관측)이 그것을 보인다. PRD 는 UI17 로 읽기 전용이라 이 축이 직접 못 닫는다. 사용자 판정 대기 |
| 2026-08-25 | MEDIUM | .claude/plans/ops-10-cells-m3.plan.md | M3 가 findings 에 `## ` 비-발견 절 2개(PRD 계수 답 · census 블록)를 더해 M1 Task 7 이 못박은 `--findings-check rc 0` 계약을 깼다(HEAD 실측 rc 1). `spike-m0-style-axis.mjs` 에 부록 명부 + 위치 검사를 세워 닫았다 — O-M3-3(census 블록 소유)의 실측 답이다. 잔여: 부록 명부가 리터럴이라 새 부록마다 검사기를 고쳐야 한다 |
| 2026-08-25 | HIGH | .claude/plans/ops-10-cells-ship.plan.md | ship receipt 에 내구성 있는 tamper-evident attestation 이 없다 — `/mccp:pr` 2.5.7 finalize 가 낸 `receipt_hash` 를 2.5.9 가 `--expected-receipt-hash` 로 무는 것은 **같은 실행 안**뿐이고, 실행이 끝난 뒤 파일이 바뀌었는지 재확인할 사후 결박이 없다. 소유는 이 축이 아니라 mccp 게이트 프레임워크다 (L2 R3 security HIGH · ops-40 이 같은 지적을 `F-OPS-40-H7` 로 올렸으나 그 행은 이 브랜치 backlog 에 없다 — 실측 `grep -c F-OPS-40` → 0) |
| 2026-08-25 | HIGH | .claude/plans/ops-10-cells-ship.plan.md | receipt 스키마에 security-reviewer 가 **실제로 돌았다**는 양성 표기가 없다 — `security_*` 필드 4개가 전부 부정형(`security_skipped` · `security_skip_reason` · `security_force_override` · `security_force_override_reason`)이라 "돌았다" 를 두 부정 표기의 동시 부재로만 표현할 수 있고, 그 상태는 "실제로 돌았다" 와 "안 돌렸는데 플래그를 안 세웠다" 를 구별하지 못한다. 소유는 이 축이 아니라 mccp 게이트 프레임워크다 (L2 R7 security HIGH · `F-OPS-40-H7` 과 같은 부류) |
| 2026-08-25 | CRITICAL | .claude/plans/ops-10-cells-ship.plan.md | L2 test: Validation 8 will fail because ops/findings/ops-10-cells.md contains only F-CELL-01 through F-CELL-07 and no F-CELL-17 section exists · 원문 .claude/reviews/plan-review-ops-10-cells-ship.md · id=db352442 |
| 2026-08-25 | HIGH | .claude/plans/ops-10-cells-ship.plan.md | L2 test: Validation 10 always fails before Task 2 executes, so the plan cannot be fully validated before proceeding · 원문 .claude/reviews/plan-review-ops-10-cells-ship.md · id=0b4f032c |
| 2026-08-25 | FAIL | .claude/plans/ops-10-cells-ship.plan.md | L2 test: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-10-cells-ship.md · id=703288e9 |
| 2026-08-25 | CRITICAL | .claude/plans/ops-10-cells-ship.plan.md | L2 invariant: Stale receipt anchoring — the plan hash changed since the recorded review completion · 원문 .claude/reviews/plan-review-ops-10-cells-ship.md · id=7f502de7 |
| 2026-08-25 | CRITICAL | .claude/plans/ops-10-cells-ship.plan.md | L2 invariant: Security execution gap — Validation 10 cannot verify the security reviewer actually executed · 원문 .claude/reviews/plan-review-ops-10-cells-ship.md · id=fc88a6f0 |
| 2026-08-25 | HIGH | .claude/plans/ops-10-cells-ship.plan.md | L2 invariant: Skip predicate — later gates may assume security ran from flags that do not prove execution · 원문 .claude/reviews/plan-review-ops-10-cells-ship.md · id=5b56f2ba |
| 2026-08-25 | HIGH | .claude/plans/ops-10-cells-ship.plan.md | L2 invariant: Validation is not enforced by the gate — acceptance depends on operator-run validation · 원문 .claude/reviews/plan-review-ops-10-cells-ship.md · id=3c25569e |
| 2026-08-25 | HIGH | .claude/plans/ops-10-cells-ship.plan.md | L2 invariant: Contradictory Task 2 action — the receipt records that security ran while security-reviewer execution is not in the plan gate's scope · 원문 .claude/reviews/plan-review-ops-10-cells-ship.md · id=3eb28a69 |
| 2026-08-25 | FAIL | .claude/plans/ops-10-cells-ship.plan.md | L2 invariant: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-10-cells-ship.md · id=9a7e4cd3 |
| 2026-08-25 | MEDIUM | .claude/plans/ops-10-cells-ship.plan.md | 소스 루트 이탈 가드가 **심볼릭 링크를 따라가지 않는다** — `path.resolve` 는 경로 문자열만 정규화하고 `fs.readFileSync` 는 링크를 따르므로, `OPS_SOURCES_ROOT` 안에 밖을 가리키는 링크가 있으면 가드를 통과한다. 완화책 2종은 실재한다(lock 은 protocol 소유 읽기 전용 · `golden.txt` 가 `sources.lock.sha256` 고정). 닫으려면 `fs.realpathSync` 로 비교해야 하고 그것은 원본 트리 모양에 대한 새 전제를 만든다 — 판정 필요 (PR 범위 security 재검토) |

---

## 리뷰 패널 적재분 (기계 추가)

이 저장소의 backlog 는 처음부터 `YYYY-MM-DD | severity | source | finding` **평문 행**이었다.
mccp 소비자 `scripts/derive/sources/backlog.js` 는 `| Date | Severity | Source plan | Finding |`
헤더 한 줄에 표를 앵커하므로, **위쪽 평문 행 전건이 그 소비자에게 보이지 않는다**. 실측:
`plan-review backlog-append` 가 `appendRows: ... has no header row` 로 exit 12.
아래 헤더는 그 앵커를 세운 것이고, 이 줄 위의 기존 행들을 표로 이관하는 것은 별건이다.

| Date | Severity | Source plan | Finding |
|---|---|---|---|
| 2026-08-20 | HIGH | .claude/plans/ops-doc-reconcile-m0-gates.plan.md | L2 architect: Error handling patterns are claimed to be mirrored but actually use three inconsistent implementations across modules · 원문 .claude/reviews/plan-review-ops-doc-reconcile-m0-gates.md · id=78462339 |
| 2026-08-20 | FAIL | .claude/plans/ops-doc-reconcile-m0-gates.plan.md | L2 architect: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-doc-reconcile-m0-gates.md · id=c685290e |
| 2026-08-20 | FAIL | .claude/plans/ops-doc-reconcile-m0-gates.plan.md | L2 test: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-doc-reconcile-m0-gates.md · id=25665434 |
| 2026-08-20 | MEDIUM | .claude/plans/ops-doc-reconcile-m0-gates.plan.md | Implement-Codex R1 F4 이월 — 원천 문서(층 1) 쪽 인명 비식별화. 층 2 `text` 는 규칙 2 가 앵커 셀 도출을 강제하므로 셀에 없는 이름은 못 들어간다. 남는 위험은 원천 셀 자체에 실명이 있는 경우이고 그것은 층 1 추출 계약 소관이다. 층 2 에 인명 정규식을 두는 안은 거부했다 — 한국어 인명은 열린 집합이라 정상 문구를 대량 거부하면서 실제 이름을 놓친다. **조치안**: `ops-10-cells` 가 셀 값 비식별화 계약을 정할 때 함께 판정한다. 소유 ops-10-cells · 차단 마일스톤 없음 · 안정 ID F-OPS-20-D4 |
| 2026-08-20 | MEDIUM | .claude/plans/ops-doc-reconcile-m0-gates.plan.md | 축 D 이월 — `confidence: "inferred"` 레코드의 `value[]` 앵커 결박을 이 M0 는 닫지 않는다. `inferred` 실물이 원장에 0건이라 형태를 관측할 상대가 없고, 규칙 2·2b 는 UI8(강등 요구)에 맞춰 `stated` 로 범위가 잡혀 있다. 지금 `inferred` 까지 조이면 계획이 정하지 않은 정책을 게이트가 새로 만든다. **조치안**: `ops-20-statements` M1 이 `inferred` 실물을 넣을 때 함께 정한다. 소유 ops-20-statements (M1) · 차단 마일스톤 없음 · 안정 ID F-OPS-20-D3 |
| 2026-08-20 | LOW | .claude/plans/ops-doc-reconcile-m0-gates.plan.md | 계획 Task 1 전제 정정 — "커밋된 CR" 은 0건이다. 실측: `git show HEAD:<path> | tr -dc '\r' | wc -c` 가 8개 파일 전건 0. CR 은 `core.autocrlf=true` 가 **체크아웃 때** 넣는다(`git checkout-index` 사본 합계 3307: verify-ops.sh 1098 · rows.jsonl 669 · reconcile/_harness/m0.sh 531 · statements/_harness/m0.sh 437 · db/requests/01 416 · db/requests/02 82 · cells/spike txt 52 · golden.txt 22). 따라서 조치는 blob 재작성이 아니라 `.gitattributes` 한 곳이고, 워킹트리 3본은 `tr -d` 로 맞추면 인덱스와 다시 일치한다. 계획이 지목한 3개 파일과 계수는 맞았고 "커밋된" 이라는 귀속만 틀렸다. **조치안**: 이 정정을 findings 에 실측으로 기록(완료). 소유 ops-doc-reconcile M0 · 안정 ID F-OPS-00-A1 |
| 2026-08-20 | 해소 | ops/_meta/verify-ops.sh · .gitattributes · ops-manifest.yaml | ops-doc-reconcile M0 축 A·B·C 해소. (A) `.gitattributes` 에 `ops/**/*.{sh,jsonl,txt,sql} text eol=lf` 4줄 — `git checkout-index` 사본 CR 합계 3307→0. (B) `manifest.reproduce` 4축을 `verify-ops.sh` 검사 4a 에서 실제 실행하고 `reproduce_ran 3` · `reproduce_unavailable 1` 을 golden 에 동결 — `F-OPS-20-R2` · `F-OPS-30-R2` 해소. (C) `ownership.child_files` 에 findings 3건 등재(`unclassified 3→0`) + protocol 산출물 5건을 golden 에 등재(`protocol_present 5`) — `F-OPS-20-R1` · `F-OPS-30-R1` 해소. 반사실 3건 실행: CR 3307 · `reproduce_unavailable.1 statements entry_absent:...` + rc 1 · `package-lock.json` 부재 시 rc 1 + 그 경로. 안정 ID F-OPS-00-A1 · F-OPS-00-B1 · F-OPS-00-C1 |
| 2026-08-20 | 해소 | ops/statements/check-statements.mjs | ops-doc-reconcile M0 축 D 해소. 규칙 2c 신설 — `value[].qty` 앵커 수 토큰 멤버십 · `value[].unit` 폐쇄 enum + 표기 도출 · 수 토큰 경계. 토큰 4개(`OPS_INV_VALUE_QTY_NOT_DERIVABLE` · `OPS_INV_VALUE_UNIT_UNKNOWN` · `OPS_INV_VALUE_UNIT_NOT_DERIVABLE` · `OPS_INV_NUMBER_TOKEN_BOUNDARY`)와 음성 fixture 4건. 반사실 4/4: 봉인 SHA 4bc4a99 체커에서 전건 rc 0 `verdict ok`, 현행에서 각각 다른 토큰으로 rc 1. 정규화 사다리는 한 글자도 안 바꿨다(봉인 fixture 4단계). 안정 ID F-OPS-20-D1 · F-OPS-20-D2 |
| 2026-08-20 | 해소 | ops/reconcile/reconcile.mjs · 두 하네스 | ops-doc-reconcile M0 축 E 해소. (1) `OPS_RC_LEDGER_EMPTY` 진단문에서 "정상 상태다" 제거 — rc 1 은 유지(제약 5). (2) `ops/reconcile/_harness/m0.sh` `TOOL_PREFIXES` 에 `.claude/cache/` — 렌더 산출 4종이 `OUT_OF_SCOPE`→`tool`. (3) `ops/statements/_harness/m0.sh` 에 `reverify` 세 번째 위치 모드 — 구본은 rc 2(usage), 현행은 rc 0 + `provenance_proven 0`. 소유 경계 2검사는 reverify 에서 건너뛰고 그 사실을 계수로 낸다. 안정 ID F-OPS-30-E1 · F-OPS-30-E2 · F-OPS-30-E3 |
| 2026-08-20 | MEDIUM | .claude/plans/ops-doc-reconcile-m0-gates.plan.md | 계획 `## Validation` 블록 2건이 **실행 불가**였다(범위 밖 아님 — 계획 자신의 결함이고 이번에 정정본으로 완주했다). (1) 220행 `node ops/statements/check-statements.mjs --selftest` — 그 체커에 `--selftest` 가 없다. 서브커맨드는 `--check` · `--fixture-tree` · `--list-tokens` 셋이고 usage 는 exit 2 다. 대체: `--list-tokens` 신설 토큰 확인 + 하네스의 `TOKEN_COVERAGE`(선언 집합 == fixture 가 문 집합 전수 대조). (2) 227·228행 `bash ops/{statements,reconcile}/_harness/m0.sh validate` — 두 하네스 모두 `<snapdir>` 필수(없으면 exit 2)고 `validate` 는 기준선이 없으면 `NO_BASELINE` 이다. 대체: statements 는 신설 `reverify`, reconcile 은 baseline 없이 못 도므로 `PRED_JS` 술어 반사실로 대신했다. 계획 본문은 고치지 않았다 — `mccp-plan-codex` receipt 가 `plan_hash` 로 결박돼 있어 편집이 선행 게이트를 stale 로 떨어뜨린다. 정정본은 `.claude/notes/ops-doc-reconcile-m0-gates.md` 가 정본. 안정 ID F-OPS-00-V1 |
| 2026-08-20 | MEDIUM | mccp scripts/lib/plan-conflict-detector.js | `parseFilesToChange` 가 `Files to Change` 표의 백틱을 벗기지 않아 **모든 경로가 미매칭**이고, 그래서 계획대로 구현해도 `conflict:true signal=file-expansion` 이 항상 뜬다. 실측: 이 계획에서 파싱 결과가 `` `.gitattributes` `` 같은 백틱 포함 문자열 17건이고 `normalizePath` 는 백슬래시·`./` 만 벗긴다(`isInPlan` 은 정확 일치 또는 `/` 접미 일치라 백틱이 남으면 영원히 false). 반사실: 파싱 결과에 `.replace(/`/g,"")` 하나만 걸면 변경 21건 중 미계획이 4건으로 떨어지고 그 4건은 전부 mccp 게이트 산출물(계획 파일 자신·receipt 2·implement 리뷰 notes)이다 — 구현 파일 확장은 0건. 저장소 관행이 표 첫 열을 백틱으로 감싸는 것이므로(이 저장소 계획 전건) 이 검출기는 이 저장소에서 상시 거짓 양성이다. **조치안**: mccp 도구 층에 `normalizePath` 백틱 제거를 요청한다. 소유 mccp 도구 층 · 차단 마일스톤 없음 · 안정 ID F-OPS-00-T1 |
| 2026-08-20 | 해소 | ops/statements/check-statements.mjs | 로컬 리뷰 HIGH-1·HIGH-2 흡수 — 규칙 2c 정정. (H1) `unit` 도출이 앵커 셀 전문에 대한 생 `includes` 라 폐쇄 enum 이 목록 **밖**만 막고 목록 안 6종끼리 서로 통과했다. 실측 2건: 셀 `구독 3개월` + `unit:"EA"` rc 0 `verdict ok`, 셀 `작성일 기준 7 회차` + `unit:"DAY"` rc 0 `verdict ok` (`개` ⊂ `개월`, `일` ⊂ `작성일`). 조치: 표기를 수 토큰에 결박하고 그 자리에서 **가장 긴** 표기가 단위다(`개월` 이 `개` 를 이긴다). (H2) `qty` 를 `String(v.qty)` 문자열 멤버십으로 대조해 셀 `12.50%` 와 `qty:12.5` 가 갈려 정상 레코드를 거부했다 — 수치 비교로 고쳤다. 음성 fixture 2건 + **양성** fixture 1건 신설. 안정 ID F-OPS-20-D5 · F-OPS-20-D6 |
| 2026-08-20 | 해소 | ops/statements/_harness/m0.sh | 로컬 리뷰 환경 차단·M1 흡수 (`F-OPS-20-H1` 해소). (1) `env -u VAR ... node` 형태가 PATH 앞자리의 비-coreutils `env`(uv 의 `~/.local/bin/env`) 때문에 node 를 삼켰다 — rc 0 · 0바이트. `unset` 으로 교체. (2) `FIXTURE_ESCAPE` 가 MSYS `$dir` 와 Windows `$tree` 를 문자열 대조해 영원히 안 맞았다 — 같은 파일의 `SNAP_INSIDE_REPO` 가 이미 쓰는 node 정규화 비교로 교체. (3) `NODE_OPTIONS --require` 와 `OPS_CELLS_ROOT` 가 MSYS 경로라 주입 표면 검사가 조용히 무의미했다 — `T_NODE` 로 정규화. (4) `--git-path` 상대 경로 폴백. 이제 기본 PATH·기본 TMPDIR 에서 `reverify ok`. 안정 ID F-OPS-20-D7 |
| 2026-08-20 | 해소 | ops/reconcile/_harness/m0.sh | 로컬 리뷰 M3 흡수 (`F-OPS-30-H7` 해소) — ops-30 하네스에 `reverify` 세 번째 위치 모드. 앞 판은 `PRE_EXISTS` + `MERGE_SINCE_PREFLIGHT` 두 문이 함께 닫혀 브랜치 head 에서 영영 못 돌았다. 돌리자 검사 11) 의 `fix-task` 결박이 드러났다 — 그 큐는 stop-review-loop 이 소진하며 덮어쓰는 도구 소유 파일이라 출하 후 재현되지 않는다(실측: `fix-task.md` 부재, `fix-task-applied.md` 에 `F-OPS-30-R*` 0건). 영구 원장 `backlog` 만 물고 `fixtask_proven 0` 으로 낸다. 소유 경계 2검사는 `provenance_proven 0`. 안정 ID F-OPS-30-E4 |
| 2026-08-20 | 해소 | ops/_meta/verify-ops.sh | 로컬 리뷰 HIGH-3·LOW-1 흡수. (H3) 검사 4a 의 신설 토큰 2개(`REPRODUCE_FAILED` · `REPRODUCE_MUTATED_TREE`)에 결함 fixture 가 0건이었다 — 특히 자가 치유 fail-open 을 기계가 물게 하려던 장치가 무는지를 아무것도 증명 안 했다. case (aa)·(bb) 신설. (L1) case (k) 링크 거부가 이 호스트에서 **항상** SKIP 이었다 — 전제("심링크를 못 만든다")가 틀렸고 디렉터리 junction 은 권한 없이 만들어진다(선례 `extract-releases.mjs`). junction 폴백 + `lstat` 판정으로 실행. selftest `pass=27 skip=1` → `pass=30 skip=0`. 안정 ID F-OPS-00-C2 · F-OPS-00-D1 |
| 2026-08-20 | 해소 | ops/db/rows.jsonl | 로컬 리뷰 M2 흡수 — `.gitattributes` 범위 확대(`ops/**`)가 다른 PRD 소유 경로에 내용 델타 0 의 영구 ` M` 을 남겼다(worktree CR 0 == HEAD blob CR 0, 335239 == 335239 바이트). 소유 경계 하네스가 잡으라고 있는 바로 그 형태의 잔여다. `git add --renormalize` 로 인덱스를 맞춰 status 에서 내렸다. 확대 자체는 UI8 면제로 유지한다(근거 실측 CR 3307→0). 안정 ID F-OPS-00-A1 |
| 2026-08-20 | LOW | ops/_meta/verify-ops.sh | 잔여 한계 기록(로컬 리뷰 L3) — `reproduce_ran <axis> rc=<n>` 을 golden 에 **사실로** 동결하는 설계상, 이 오라클은 "배선됐고 건강함" 과 "배선됐고 깨짐" 을 구별하지 못한다. 현재 `db rc=1` · `reconcile rc=1` 이 초록으로 동결돼 있다. 층 3 은 빈 원장에서 rc 1 이 설계(제약 5)이므로 rc 를 판정으로 승격하면 게이트가 계획에 없는 정책을 새로 만든다 — 그래서 그대로 둔다. **조치안**: 축별 기대 rc 를 manifest 에 선언하고 그것과 대조한다. 소유 ops-00-protocol · 차단 마일스톤 없음 · 안정 ID F-OPS-00-L3 |
| 2026-08-20 | LOW | ops/reconcile/reconcile.mjs · ops/_meta/verify-ops.sh · ops/statements/check-statements.mjs | 잔여 한계 기록(로컬 리뷰 L5) — 세 파일이 일반 800행 기준을 넘는다(1383 · 1213+ · 1082+). 주석 밀도가 설계상 높아(반사실·실측·거부한 대안을 본문에 싣는 규율) 행 수만으로는 분할 근거가 되지 않는다. 분할하면 그 근거들이 파일 경계로 흩어져 다음 편집자가 같은 함정을 다시 판다. **조치안**: 분할하지 않는다. 기록만. 소유 각 파일 소유자 · 차단 마일스톤 없음 · 안정 ID F-OPS-00-L5 |
2026-08-21 | HIGH | .claude/plans/ops-40-db-snapshot-m3.plan.md | Plan-Codex R1 F4 이월 — `.claude/settings.json` 워킹트리 수정분이 `MCCP_PLAN_REVIEW` 를 `multi-agent` 로 둔다. 실측으로 살아 있다(node 자식 프로세스에서 `process.env.MCCP_PLAN_REVIEW === "multi-agent"`; 셸 `env` 에는 안 보인다 — 하네스가 자식 프로세스 환경에만 주입한다). 이 세션은 Agent tool·Workflow 사용이 금지돼 있어 `/mccp:plan` 매 실행에 `MCCP_PLAN_REVIEW=codex` 를 명시로 줘야 하고, 안 주면 L1+L2 패널이 `mccp:review-*` 에이전트 4개를 띄운다. 이 실행의 경로 선택 증거는 `.claude/state/plan-review/mode.json` (`mode: codex` · `fires.l2: false`) 에 실재한다. **M3 산출물이 아니고 이 세션 이전의 사용자 미커밋 수정분이라 이 마일스톤이 되돌리지 않는다** — 커밋할지 되돌릴지는 사용자 판단이다. 조치안: 설정을 커밋하기 전에 이 세션의 Agent 금지와 어느 쪽을 정본으로 둘지 정한다. 소유 사용자 · 차단 마일스톤 없음 · 안정 ID F-OPS-40-H1
2026-08-21 | MEDIUM | .claude/meta/11-prod-db-snapshot.md §6 | Plan-Codex R2 F3 이월 — 그 문서 §6 이 회부 7건의 상신 주체를 전부 `ops-40-db-snapshot` 으로 적는데 ops 회부 채널(`ops/findings/**`)에 오른 것은 `O-6` 하나뿐이다. `M-2`(§6-2 의 `data-dependent-unknown` 적용 범위 — 배분 관측과 4/5 그룹 소속 0명을 함께 적는다) · `M-4`(`legal-surfaces.yaml` `기업별_문구` status 갱신) · `M-5`(`COLUMN_COMMENT` 를 새 근거원으로 등재 + `codes/*.yaml` 미선언 63건) · `M-6`(콜레이션 3종 혼재를 조인 규약에 반영할지) · `M-7`(B2C·고객사 축 문서 신설 우선순위) 다섯 건은 상신 기록이 없다(`M-3` 은 그 문서가 철회로 표시). M3 는 ops-40 의 마지막 마일스톤이라 이 축에서 더 올릴 자리가 없다. **로컬 `M-n` 은 부모 PRD `.claude/prds/ops-doc-reconcile.prd.md` 의 정본 회부 표에 없는 식별자이므로 자식이 번호를 발행하지 않는다**(R1 F3) — 미상신이라는 사실만 `ops/findings/ops-40-db-snapshot.md` `F-OPS-40-R5` 로 관측 기록했다. 조치안: 정책 우산 소유자가 다섯 건을 정본 표에 `O-n` 으로 발행해 인수하거나, 인수하지 않는다는 판정을 남긴다. 소유 정책 우산(`00-protocol`) · 차단 마일스톤 없음 · 안정 ID F-OPS-40-H2
2026-08-21 | HIGH | .claude/plans/ops-40-db-snapshot-m3.plan.md | Plan-Codex R14 F0 이월 — 두 게이트의 decision 슬러그 출처가 갈린다. 실측: `derive-decision --command mccp:pr` 는 브랜치명에서 `ops-40-db-snapshot` 을 내고, `derive-decision --command mccp:prp-implement --args .claude/plans/ops-40-db-snapshot-m3.plan.md` 는 `ops-40-db-snapshot-m3` 를 낸다. 이 라운드가 plan-codex receipt 를 `-m3` 로 재앵커해 implement 차단은 풀렸으나(`validate --command mccp:prp-implement` rc 0, blocking 공집합), `/mccp:pr` 은 여전히 브랜치 기준 구 슬러그를 본다. 그 자리의 `mccp-plan-codex/ops-40-db-snapshot.json` 은 plan_hash 가 `15edc8a3…` 로 현 본문 `8be1260b…`(구조 해시) 와 갈려 stale 이고 대응 implement receipt 도 없다. 리뷰어 권고안(구 receipt 를 `.legacy.json` 으로 격리)은 **그대로 쓰면 안 된다** — 같은 이름의 `.claude/receipts/mccp-plan-codex/ops-40-db-snapshot.legacy.json` 이 이미 git-tracked 로 존재해 덮어쓴다. 감사 산출물에 대한 파괴적 조작이라 게이트가 임의 실행하지 않았다. **조치안**: 출항 시점에 셋 중 하나를 사용자가 고른다 — (1) `/mccp:pr` 에 `-m3` decision 을 명시로 넘길 수 있는지 확인해 넘긴다, (2) 구 슬러그로도 plan+implement receipt 를 발급해 두 축을 다 채운다, (3) 구 receipt 를 `.legacy2.json` 등 충돌하지 않는 이름으로 격리한다. 소유 사용자 · 차단 마일스톤 M3 출항 · 안정 ID F-OPS-40-H3
2026-08-21 | HIGH | .claude/plans/ops-40-db-snapshot-m3.plan.md | Plan-Codex R24 F0 이월 — Task 5 범위 하네스의 기준선이 문서화된 재시작 경로로 자기를 승인할 수 있다. R20 흡수로 Task 0 은 기준선을 `flag: "wx"` 배타 생성하므로 재실행이 기존 파일을 **덮어쓰지는** 못한다. 그러나 같은 흡수가 넣은 오류 메시지가 "의도적 재시작이면 그 파일을 지우고 다시 돌려라" 라고 지시하고, 기준선 digest 는 `.claude/state/**`(gitignore 9 행으로 무시 대상) 밖 어디에도 앵커돼 있지 않다. 그래서 부분 실행이 불변 경로나 `ops/db` 산출물을 이미 바꾼 뒤 그 지시를 그대로 따르면 바뀐 바이트가 새 기대값으로 기록되고 Validation 8 이 같다고 보고한다. 흡수하지 않고 이월한 근거 3가지: (1) 이 루프가 닫아 온 R14~R23 지적은 전부 **조용한** 통과였는데 이 경로는 사람이 의도적으로 `rm` 을 쳐야 열려 위험 부류가 다르다, (2) 계획서가 이 한계를 과장 없이 적는다 — Acceptance 는 "재실행이 덮어쓰지 못한다"까지만 주장하고 삭제 방지는 주장하지 않으며 Task 0 오류 메시지가 탈출구를 명시하므로 이 계획서가 반복 감점당한 선언·실제 불일치는 없다, (3) R24 를 이 루프의 마지막 라운드로 미리 정하고 두 번 예고했다. **조치안**(리뷰어 권고 그대로): 무조건적인 삭제 후 재실행 지시를 감사 가능한 override(사유 문자열 요구 + 새 기준선에 그 사유 기록)로 바꾸고, 기준선 digest 를 `.claude/state/**` 밖의 내구성 있는 기록에 앵커해 재시작이 원 기준선을 유지하거나 Task 0 이전 상태를 복원·검증하도록 강제한다. 소유 ops-40-db-snapshot-m3 · 차단 마일스톤 없음 · 안정 ID F-OPS-40-H4 — RESOLVED 2026-08-24 (ops-40 M4): 무조건적 *"지우고 다시 돌려라"* 를 감사 가능한 override 로 바꿨다 — `OPS40_M4_BASELINE_REASON` 이 30자 이상일 때만 기존 기준선을 대체하고, 그 사유와 이전 payload 의 sha256 을 새 기준선에 함께 적는다. 내구성 있는 앵커는 **HEAD** 다: 기준선 생성이 최초·재시작 **양쪽에서** `git diff --quiet HEAD -- ops/db/rows.jsonl ops/db/snapshot.lock` 을 먼저 단언하고, 판정 불능(status != 1)은 통과로 접지 않는다. Validation 9 가 `head_clean_at_baseline` 과 `restart` 스키마를 직접 문다.

## mccp 게이트 적재 (표 구획)

`derive/sources/backlog.js` 는 아래 헤더 행을 앵커로 잡고 **그 아래의 파이프 행만** 읽는다.
위 평문 행들은 이 앵커 이전이라 소비자에게 보이지 않는다 — 사람이 읽는 원장이고, 아래가 기계가 읽는 구획이다.

| Date | Severity | Source plan | Finding |
|---|---|---|---|
| 2026-08-24 | LOW | .claude/plans/ops-40-db-snapshot-m4.plan.md | Implement 실측 — Validation 7 의 PRD 5열 검사 awk 가 표 끝에서 멈추지 않는다. `/^\| # \| Milestone \| Outcome \| Status \| Plan \|/{h=1}` 로 h 를 세운 뒤 되돌리는 조건이 없어 파일 나머지의 모든 파이프 행을 같은 규칙으로 감사한다. 그래서 Delivery Milestones 뒤에 오는 `## Risks` 표(4열, 153 행)에서 `n=6` 으로 exit 1 한다 — 실측: 밀스톤 표 7행은 전부 `n=7` 로 정상이고 trip 은 153 행이다. 이 검사는 Delivery Milestones 뒤에 다른 표가 있는 어떤 PRD 에서도 통과할 수 없다. **조치안**: 헤더 뒤 첫 비-파이프 행에서 `h=0`/`exit 0` 하도록 범위를 표 블록으로 좁힌다 — `awk '/^\| # \| Milestone \| Outcome \| Status \| Plan \|/{h=1} h&&!/^\|/{exit 0} h{n=split($0,a,"|"); if(n!=7) exit 1}'`. 소유 ops-40-db-snapshot · 차단 마일스톤 없음 · 안정 ID F-OPS-40-H5
| 2026-08-25 | MEDIUM | .claude/plans/ops-40-db-snapshot-m4.plan.md | Plan-Codex R1 F1 (ops-40 M4 ship 재앵커) — Validation 10 이 `git diff -U0 HEAD -- ops/db/rows.jsonl` 의 변경 행이 정확히 42 일 것을 요구한다. 그 42 는 구현 **중** 의 워킹트리를 문는 수라 구현이 커밋된 뒤에는 항상 0 이고, 사후 재실행이 구조적으로 통과할 수 없다 — 실측: 현재 HEAD 에서 그 명령의 변경 행은 0 이다. 같은 성질이 Validation 9 의 `rows.jsonl 이 안 바뀌었다 — 재생성이 없었다` 항에도 있다. 그래서 M4 계획서는 자기 마일스톤이 닫힌 뒤에는 자기 하네스로 자기를 재검증할 수 없고, 재앵커·감사·회귀 확인이 전부 막힌다. **조치안**: 기준을 "HEAD 대비 diff" 가 아니라 (a) 구현 커밋의 부모 대비 diff 또는 (b) 산출물 다이제스트 고정(앵커 647행 `id + row_sha` sha256)으로 바꾼다. (b) 는 이미 Validation 3 에 있으므로 10 은 그 축과 중복이며 삭제해도 강도가 떨어지지 않는다. 소유 ops-40-db-snapshot · 차단 마일스톤 없음 · 안정 ID F-OPS-40-H6
| 2026-08-25 | HIGH | .claude/plans/ops-40-db-snapshot-m4-sec.plan.md | Plan-Codex R5 F0+F1 (ops-40 M4 ship 재앵커) — ship receipt 에 **내구성 있는 tamper-evident attestation 이 없다.** `validate --check-ship-verdict` 는 receipt 가 자기와 정합한지만 보므로, 같은 decision·plan·head_sha 를 가진 과거의 self-consistent receipt 로 파일이 교체돼도 승인한다. 실제 결박은 `/mccp:pr` 2.5.7 finalize 가 **같은 실행 안에서** 돌려주는 `receipt_hash` 를 2.5.9 가 `--expected-receipt-hash` 로 무는 in-process 경로뿐이라, 그 실행이 끝나면 재현 불가다 — 사후 감사나 신선한 체크아웃에서는 어떤 ship receipt 가 정본이었는지 증명할 수단이 없다. 해시를 `.claude/state/**` 사이드카로 내보내는 판을 시도했다가 걷어냈다: gitignore 대상이라 체크아웃에 없고, nonce·lock 이 없어 receipt 와 짝을 맞춘 채 통째로 교체되며, 동시·재진입 실행에서 first run 이 자기 finalize 가 돌려준 것과 **다른** receipt 를 승인할 수 있다. 같은 뿌리에서 순서 보증도 성립하지 않는다 — 최종 상태 검증은 부분 실패·재진입 경로의 발급 이력을 재현하지 못하고, ship 판정이 상류 plan·implement receipt 해시를 묶지 않아 오래된 implement receipt 위에서 ship 이 finalize 된 뒤 그 implement 가 교체돼도 최종 검사가 전부 통과한다. **조치안**: (a) ship receipt 에 invocation nonce 와 상류 `plan_hash`·implement `receipt_hash` 를 봉인해 체인을 자기 안에서 닫거나, (b) append-only attestation(예: completion-ledger 를 실제로 채우는 경로)에 `<decision>__<receipt_hash>` 를 적고 validate 가 그것을 대조하도록 하거나, (c) finalize/write/validate 구간을 결정별 lock 으로 묶는다. 소유는 이 축이 아니라 **mccp 게이트 프레임워크**다 · 차단 마일스톤 없음 · 안정 ID F-OPS-40-H7
| 2026-08-26 | HIGH | .claude/plans/ops-20-statements-m1-ship.plan.md | L2 architect: ops-40-db-snapshot-m2.json demonstrates the pattern of 'security 축은 두 부정 필드의 동시 부재로만 돌았다 를 표현한다' (simultaneous absence of two negation fields to express 'ran') · 원문 .claude/reviews/plan-review-ops-20-statements-m1-ship.md · id=e316268f |
| 2026-08-26 | FAIL | .claude/plans/ops-20-statements-m1-ship.plan.md | L2 architect: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-20-statements-m1-ship.md · id=22e35d1e |
| 2026-08-26 | FAIL | .claude/plans/ops-20-statements-m1-ship.plan.md | L2 test: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-20-statements-m1-ship.md · id=87916c51 |
| 2026-08-26 | CRITICAL | .claude/plans/ops-20-statements-m1-ship.plan.md | L2 invariant: Plan requires PR body must contain '### Security Reviewer' section as proof security-reviewer ran, but this critical requirement is not formalized as any Validation or Gate. It is only … · 원문 .claude/reviews/plan-review-ops-20-statements-m1-ship.md · id=67a50d28 |
| 2026-08-26 | HIGH | .claude/plans/ops-20-statements-m1-ship.plan.md | L2 invariant: Post-validation block (Validations 7, 8, 10, which verify receipts were created and security fields are correct) is not machine-enforced by any Gate. These validations are manual shell … · 원문 .claude/reviews/plan-review-ops-20-statements-m1-ship.md · id=097ffc92 |
| 2026-08-26 | FAIL | .claude/plans/ops-20-statements-m1-ship.plan.md | L2 invariant: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-20-statements-m1-ship.md · id=dc5006c7 |
| 2026-08-26 | MEDIUM | `.claude/plans/ops-20-statements-m1-ship.plan.md` | 커밋되는 산출물이 절대 호스트 경로 `C:/tmp/...` 를 문서에 싣는다. PR-step security-reviewer 가 CRITICAL 로 냈으나 실측상 severity 가 성립하지 않아 강등: `C:/tmp` 는 일반 Windows temp 루트로 사용자 신원·디렉터리 구조를 드러내지 않고(diff 내 `C:\Users`/`madsc` 0건), §0 auto-CRITICAL 목록 어디에도 없다. **다만 축이 저장소 전체다** — 추적본 10+ 파일(ops-10-cells-m2/m3 계획서, ops-30/ops-20 findings, ops-doc-reconcile notes)이 같은 리터럴을 쓰고 이 PR 안에만 9건/3파일이다. 계획서 1건만 고치면 나머지 8건이 남아 목적을 못 이루고, 계획서 본문은 두 receipt 의 plan_hash 결박이라 수정 시 체인 전체 재발급이 강제된다. 조치는 `git rev-parse --git-path mccp/tmp` 유래 경로로의 저장소 일괄 이관이며 별도 결정으로 연다 |
| 2026-08-27 | HIGH | .claude/plans/ops-20-statements-m2-ship.plan.md | L2 architect: Plan cites mirror pattern at `ops-20-statements-m1-ship.plan.md` (355行) · 원문 .claude/reviews/plan-review-ops-20-statements-m2-ship.md · id=982df964 |
| 2026-08-27 | CRITICAL | .claude/plans/ops-20-statements-m2-ship.plan.md | L2 architect: Task 2 Gate check (existing slugs unchanged) is not listed in Task 2 Validate section · 원문 .claude/reviews/plan-review-ops-20-statements-m2-ship.md · id=de27c654 |
| 2026-08-27 | FAIL | .claude/plans/ops-20-statements-m2-ship.plan.md | L2 architect: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-20-statements-m2-ship.md · id=9b94deda |
| 2026-08-27 | FAIL | .claude/plans/ops-20-statements-m2-ship.plan.md | L2 test: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-20-statements-m2-ship.md · id=ba618dbc |
| 2026-08-27 | HIGH | .claude/plans/ops-20-statements-m2-ship.plan.md | L2 invariant: Validation 11 in M2-ship plan omits receipt_hash integrity check present in mirrored M1-ship reference plan · 원문 .claude/reviews/plan-review-ops-20-statements-m2-ship.md · id=6c708fd3 |
| 2026-08-27 | CRITICAL | .claude/plans/ops-20-statements-m2-ship.plan.md | L2 invariant: Plan lacks safeguard against manually tampered receipts in security validation · 원문 .claude/reviews/plan-review-ops-20-statements-m2-ship.md · id=db56f349 |
| 2026-08-27 | CRITICAL | .claude/plans/ops-20-statements-m2-ship.plan.md | L2 invariant: Gate erosion: fail-closed invariant is weakened through validation regression · 원문 .claude/reviews/plan-review-ops-20-statements-m2-ship.md · id=b5b76d41 |
| 2026-08-27 | FAIL | .claude/plans/ops-20-statements-m2-ship.plan.md | L2 invariant: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-20-statements-m2-ship.md · id=3a2b0425 |
| 2026-08-27 | HIGH | .claude/plans/ops-20-statements-m2-ship.plan.md | L2 invariant: Plan asserts manual receipt field edits will be caught by hash mismatch (lines 223-229) but doesn't verify receiptHash() actually includes security fields in its calculation · 원문 .claude/reviews/plan-review-ops-20-statements-m2-ship.md · id=0fd2622c |
| 2026-08-27 | FAIL | .claude/plans/ops-20-statements-m2-ship.plan.md | L2 invariant: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-20-statements-m2-ship.md · id=972a5f7e |
| 2026-08-27 | FAIL | .claude/plans/ops-20-statements-m2-ship.plan.md | L2 invariant: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-20-statements-m2-ship.md · id=e6d01731 |
| 2026-08-27 | HIGH | .claude/plans/ops-20-statements-m2-ship.plan.md | L2 architect: Reverify mode is acceptable for receipt validation despite skipping ownership checks (provenance_proven 0) · 원문 .claude/reviews/plan-review-ops-20-statements-m2-ship.md · id=442f556c |
| 2026-08-27 | FAIL | .claude/plans/ops-20-statements-m2-ship.plan.md | L2 architect: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-20-statements-m2-ship.md · id=a8c4e41c |
| 2026-08-27 | CRITICAL | .claude/plans/ops-20-statements-m2-ship.plan.md | L2 invariant: Plan file hash does not match reviewed plan hash — receipt anchoring is broken · 원문 .claude/reviews/plan-review-ops-20-statements-m2-ship.md · id=c08cdcdf |
| 2026-08-27 | CRITICAL | .claude/plans/ops-20-statements-m2-ship.plan.md | L2 invariant: Review verdict is stale — it applies to old plan version not current version · 원문 .claude/reviews/plan-review-ops-20-statements-m2-ship.md · id=0b9a5551 |
| 2026-08-27 | FAIL | .claude/plans/ops-20-statements-m2-ship.plan.md | L2 invariant: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-20-statements-m2-ship.md · id=217d5e11 |
| 2026-08-27 | HIGH | `.claude/plans/ops-20-statements-m2-ship.plan.md` | 절대 호스트 경로 축의 **잔여분**: `ops/findings/ops-20-statements.md` 634 · 647 · 669행이 `/c/Users/<user>/...` · `C:/Users/<user>/AppData/...` 를 싣는다. 사용자명이 드러나므로 `C:/tmp` 강등 근거(2026-08-26 MEDIUM 행)가 이 3건에는 성립하지 않는다. 이 축이 고치지 못하는 이유는 범위다 — `ops/**` 무변경이 `ops-20-statements-m2-ship` 계획서의 UI2 이자 Validation 7 · 12 이고, 고치면 이 축이 자기 게이트를 깬다. 세 줄 다 base(`origin/feat/ops-doc-reconcile`)에 이미 있어 이 PR 이 들여온 것이 아니다 (diff 추가행 기준 0건). 조치는 `ops/**` 를 여는 별도 결정에서 한다 |
| 2026-08-27 | MEDIUM | `.claude/plans/ops-20-statements-m2-ship.plan.md` | implement 게이트의 security-reviewer 가 낸 CRITICAL 2건을 닫으면서 `.claude/plans/ops-20-statements-m2.plan.md` 를 편집했고, 그 결과 `ops-20-statements-m2` 슬러그의 plan-codex · implement-codex receipt 2본이 `stale` 로 떨어졌다 (`plan_hash` `8cb1fff4` → `c2049645`). 그 결정은 편집 전에도 `ok:false`(blocking `security_skipped`)였고 `ops-20-statements-m2-ship` 체인이 이미 대체하므로 출항 경로에는 영향이 없다 (실측: m2-ship `stale 0 · blocking 0`). stale 은 손상이 아니라 정확한 상태다 — 계획서가 실제로 바뀌었다. 봉인된 마일스톤 기록을 되살리려면 `m2` 슬러그 체인을 재발급해야 하고, 그것은 이 축의 범위가 아니다 |
| 2026-08-27 | LOW | `.claude/plans/ops-20-statements-m2-ship.plan.md` | 절대 호스트 경로 축의 **조상 blob 잔여**: tip 트리는 정리됐으나 `a5bfe24` 의 blob 2본(`.claude/notes/ops-20-statements-m2.md` · `.claude/plans/ops-20-statements-m2.plan.md`)에 수정 전 문자열이 남는다. `/mccp:pr` Phase 3.1 의 history-leak 게이트는 이것을 차단하지 않는다 — `buildLeakPatterns(repoRoot, oldNames)` 가 **저장소 루트 앵커**라 `<root>/_projects/insuniverse-temp` 형태만 물고, 유출분은 그 형제인 `<root>/.claude/plugins/cache/...` 라 매칭 밖이다. 즉 이 게이트는 repo-root 유출을 단속하지 사용자명 일반을 단속하지 않는다. 순수화하려면 미push 히스토리를 재작성해야 하는데, 그러면 `d7e5925` 를 무는 receipt 결박이 끊기고 이것이 `pr.md` Phase 3.2 가 `[MCCP-PUSH-HALT]` 로 경고하는 dangling receipt 그 자체다. 비용이 잔여의 성격보다 커서 재작성하지 않는다. 저장소 일괄 이관 결정에서 함께 다룬다 |
| 2026-08-27 | HIGH | `.claude/plans/ops-20-statements-m2-ship.plan.md` | `/mccp:pr` Phase 3.1 의 필수 history-leak 게이트(`history-leak-scan.js`)가 이 저장소에서 **완주하지 못한다**. 스캔 범위는 6커밋 / blob 쌍 25개로 사소한데 10분 벽시계에도 산출이 0바이트다. 이 저장소에 gitlink 5개(`insuniverse-admin` · `insuniverse-server` · `insuniverse-site` + 중첩 worktree 2)가 있고, 서브모듈 저장소에서 이 스캐너가 막히는 것은 기등재된 성질이다. 이번 출항은 같은 의미론의 대체 검사로 대신했다 — 루트 경로 세그먼트를 구분자 유연하게 이어붙인 정규식(worktree 루트 + 메인 체크아웃 루트 2종)으로 `<base>..HEAD` 신규 blob 25개를 전수 훑어 `LEAKS 0` · 28초. 즉 **유출은 없고 도구가 못 도는 것**이다. 조치는 스캐너가 gitlink 항목을 건너뛰도록 고치는 것이며 mccp 플러그인 소관이라 이 저장소에서 닫을 수 없다. 그때까지 이 게이트는 매 출항에서 수동 대체가 필요하다 |
| 2026-08-28 | LOW | `.claude/plans/ops-20-statements-m3.plan.md` | acceptance 하네스 4본(`m0.sh` · `m1.sh` · `m2.sh` · `m3.sh`)이 snapdir 기본값을 `git rev-parse --git-path mccp/tmp` 로 잡는데, 그 경로는 **linked worktree 에서만** 저장소 트리 밖으로 풀린다 (`<main>/.git/worktrees/<name>/mccp/tmp`). 평범한 체크아웃에서는 `$ROOT/.git/mccp/tmp` 라 트리 안이고, 네 하네스가 공통으로 든 `SNAP_INSIDE_REPO` 가치가 그 자리에서 죽는다 — `reverify` 는 인자 없이 못 돌고 `validate` 는 findings 재현 절차에 적힌 명령 그대로는 못 돈다. 이 브랜치는 linked worktree 에서 도므로 실측 rc 0 이고, 편차는 M3 이 들여온 것이 아니라 네 하네스가 같은 형태를 공유한다. 한 본만 고치면 형태가 갈리므로 네 본을 함께 고치는 별도 결정에서 닫는다. 그때까지 재현 절차에 조건을 병기했다 (`ops/findings/ops-20-statements.md` 의 `F-OPS-20-M3` 재현 절차) |
| 2026-08-28 | HIGH | `.claude/plans/ops-20-statements-m3.plan.md` | 루트 `.gitattributes` 의 4확장자 경계(`ops/**` 밑 `*.sh` · `*.jsonl` · `*.txt` · `*.sql`)가 **근거를 잃었다.** 그 파일 66~68행은 `.mjs` · `.md` · `.yaml` · `.json` · `.lock` 을 면제한 이유를 *게이트가 그것들을 개행 정규화 해시(`verify-ops.sh` 의 `sha256Text`)로 뜨므로 EOL 에 결박되지 않는다* 로 적는다. M3 이 그 전제를 무효화했다 — `check-statements.mjs` 의 `runFindingsCensus` 가 `ops/findings/ops-20-statements.md` 의 census 블록을 `lines[i] === CENSUS_FENCE` **정확 일치**로 물기 때문이다. `core.autocrlf=true` 호스트에서 새 체크아웃하면 그 파일에 CR 2,451개가 생기고 여는 펜스를 못 찾아 `--check` 가 rc 1 (`OPS_INV_FINDINGS_CENSUS ... 블록이 0개다`) 이다. 실측: 현재 워킹트리 121,113 bytes · CR 0 · fenceExact 1 대 새 체크아웃 123,564 bytes · CR 2,451 · fenceExact 0. detached 워크트리 재현에서 `m3.sh validate` 가 이것 때문에 한 회차 붉었고 `-c core.autocrlf=false` 로만 초록이 됐다. 2026-08-18 HIGH 행(ops-20 M0 실측)의 **잔여**이고 당시 노출분은 4확장자 추가로 닫혔다. 조치는 같은 자리 · 같은 모양 `ops/**/*.md text eol=lf` 한 줄이며 면제 근거 주석도 함께 정정돼야 한다. 루트 파일이라 이 브랜치의 배타 소유(`ops/statements/**` · `ops/findings/ops-20-statements.md`) 밖이다. 소유 `ops-00-protocol`. 기록은 `.claude/milestone-closures/3-m3-report.md` 관측 1 |
| 2026-08-31 | HIGH | `.claude/plans/ops-20-statements-m4.plan.md` | UI6 은 이 계획의 게이트를 multi-agent 리뷰 패널로 돌리라고 적고 그 건에 한해 Agent·Workflow 사용을 승인하는데, 실제 봉인은 codex 축 15라운드로 났다. 대체를 고른 이유 둘 다 실측이다 — (1) 패널의 상대 경로가 중첩 워크트리를 벗어나 부모(`.worktrees/ops-reconcile/`)로 풀려 R12·R13·R14 세 라운드 연속으로 CRITICAL 7 · HIGH 2 를 전부 거짓으로 냈고(이 브랜치 `ops/statements/check-statements.mjs` 는 2,110행 127,526바이트인데 지적이 인용한 문자열은 부모 워크트리의 1,146행 66,796바이트 동명 파일의 것과 한 글자도 같다), (2) 봉인을 낸 세션은 Agent·Workflow 호출이 금지돼 패널을 재발화할 수단이 없었다. 사용자가 승인한 것은 패널 실행이지 다른 게이트로의 대체가 아니므로 이 이탈은 저자가 닫을 수 없다 — **최종 게이트를 어느 축으로 세울지는 사용자 결정**이다. 패널 축으로 되돌리려면 그 환경 결함이 먼저 닫혀야 하고 그것은 mccp 플러그인 소관이다. 판정 근거는 계획서 `## Codex Adversarial Review` 의 R1~R15 기록에 있다 |
| 2026-09-02 | MEDIUM | `.claude/plans/ops-20-statements-m4-ship.plan.md` | Plan-Codex R1 F2 이월 (DEFER_TO_BACKLOG) — §Validation 6 과 10 의 receipt 변경 검사기가 node status parser 호출 뒤에 무조건 성공으로 접는 꼬리를 달아, 허용 밖 경로를 찾은 정상 비영 종료와 프로세스 기동 실패 · 예외 · 자원 고갈을 구분하지 못한다. 후자면 출력이 비어 다음 분기가 "변경 없음" 으로 판정하므로 degraded 상태에서 외부 receipt 변조를 놓친다. 같은 형태가 사전 블록과 중간 블록 두 자리에 복제돼 있다. 이 축에서 문면을 고치지 않는 이유는 범위가 아니라 결박이다 — 계획서 본문을 고치면 방금 봉인한 plan receipt 의 plan_hash 가 그 자리에서 어긋나 이 축의 존재 이유인 stale 해소가 실패한다. 이번 출항에서는 두 검사를 그 꼬리 없이 parser 종료 코드를 보존한 채 돌려 런타임 위험을 상쇄했고, 문면 수정은 계획서를 여는 별도 결정에서 닫는다 |
| 2026-09-02 | HIGH | `.claude/plans/ops-20-statements-m4-ship.plan.md` | Implement-Codex R1 F0 이월 (DEFER_TO_BACKLOG) — `ops/statements/_harness/m4.sh` 71~79행 `snapdir_usable` 이 후보 디렉터리를 `mkdir -p` 로 잡아 **이미 있던 `ops20-<label>.$$` 를 이 실행의 소유로 받아들인다**. 프로브가 실패하면 그 자리에서 `rm -rf` 가 돌고, 성공해도 뒤 정리가 재귀 삭제한다. 크래시 후 PID 가 재사용되면 남의 증거나 무관한 내용을 지울 수 있다. 같은 헬퍼가 `m0.sh`~`m3.sh` 에 복제돼 있어 다섯 본을 함께 고쳐야 형태가 안 갈린다. 권고는 무작위 접미로만 생성하고(`mktemp -d` 급) 기존 경로는 거부하며 소유를 명시 추적해 자기가 만든 것만 지우는 것. 이 축에서 고치지 못하는 이유는 범위다 — `ops/**` 무변경이 이 계획서의 UI8 이자 Validation 7 · 12 · 13b 이고, 고치면 이 축이 자기 게이트를 깬다. 대상 다섯 본은 전부 base 로 나가는 M4 델타에 이미 실려 있다. 조치는 `ops/statements/**` 를 여는 별도 결정에서 한다 |
| 2026-09-02 | MEDIUM | `.claude/plans/ops-20-statements-m4-ship.plan.md` | Implement-Codex R1 F1 이월 (DEFER_TO_BACKLOG) — `ops/statements/check-statements.mjs` 1778~1786행 carryover 바이트 봉인이 **닫는 펜스를 백틱 3개로 시작하는 아무 줄이나 받고** 본문 비교에서는 빈 줄과 공백만인 줄을 제거한다. 그래서 "바이트 비교" 라는 이름과 달리 그 두 변형을 반려하지 못한다. 리뷰어 실측: 본문에 빈 줄을 넣은 경우와 닫는 펜스를 백틱 3개 뒤 문자열로 바꾼 경우 둘 다 rc 0 · `verdict ok` 였고, 후자는 뒤따르는 회부 내용이 마크다운 펜스 안에 갇힌다. 권고는 닫는 줄을 CRLF 정규화 후 정확 일치로 요구하고 본문 전체 바이트를 걸러내지 않고 비교하며 세 종(빈 줄 · 공백만인 줄 · 닫지 않는 백틱 줄) 음성 fixture 를 더하는 것. UI8 로 이 축 밖이다 |
| 2026-09-02 | MEDIUM | `.claude/plans/ops-20-statements-m4-ship.plan.md` | Implement-Codex R1 F2 이월 (DEFER_TO_BACKLOG) — `ops/statements/check-statements.mjs` 1864~1885행 호스트 경로 게이트가 **순회 실패와 파일 읽기 실패를 삼키고** 선언한 범위를 실제로 훑었다는 증명 없이 `verdict ok` 로 간다. 리뷰어 실측: `_harness/m4.sh` 읽기가 EACCES 를 내도 rc 0 이었다. 심볼릭 링크 항목도 디렉터리와 정규 파일만 처리하느라 통째로 빠진다. 결과적으로 `OPS_INV_HOST_USER_PATH` 는 접근 불가하거나 건너뛴 소유 내용에 대해 붉어질 수 없다. 권고는 순회 · stat · read 실패를 이름 있는 진단과 함께 fail-closed 로 받고 심볼릭 링크를 명시 거부하거나 검사하며 권한 강등 fixture 와 링크 fixture 를 더하는 것. UI8 로 이 축 밖이다 |
| 2026-09-02 | MEDIUM | `.claude/plans/ops-20-statements-m4-ship.plan.md` | Implement-Codex R1 F3 이월 (DEFER_TO_BACKLOG) — `ops/statements/_harness/m4.sh` 244~249행 음성 검사가 추적 파일 `ops/findings/ops-20-statements.md` 를 **제자리에서** 고친 뒤 EXIT · INT · TERM 정리에서 `cp` 뒤에 무조건 성공으로 접는 꼬리를 달아 복원한다. 복원이 실패하거나 반쪽으로 끝나도 그 사실이 가려진 채 임시 상태가 지워지고 원래 종료 코드로 나간다. 추적 원장이 조용히 손상된 상태로 남을 수 있다. 권고는 변조 검사를 임시 저장소 사본에서 돌리거나 원자적으로 복원하고 복원 실패가 하네스 결과를 덮어쓰되 백업은 남기는 것. UI8 로 이 축 밖이다 |
| 2026-09-02 | HIGH | `.claude/plans/ops-30-reconcile-m1.plan.md` | Implement-Codex R1 F3 이월 (DEFER_TO_BACKLOG) — 안정 ID `F-OPS-30-M1L5`. `ops/reconcile/reconcile.mjs` 의 `readStatements` 가 진술 색인의 **쓸 수 없는 행**(객체가 아니거나 문자열 `id` 가 없는 행)을 계수만 하고 통과시킨다. 대상 축(`buildTargets`)은 같은 정책이 정당하다 — `ops/db/rows.jsonl` 이 11종 `kind` 가 섞인 스냅샷이고 `row_sha` 없는 22행이 실측으로 존재하기 때문이다. 진술 색인에는 그런 정당한 비-statement 행이 없으므로 같은 정책이 여기서는 손상 은폐가 된다. 원장이 그 행을 참조하지 않으면 `stmt_rows_dropped > 0` 인 채로 `verdict ok` 가 나온다. fail-closed 로 닫으려면 21번째 check 토큰이 필요하고, 그것이 이 축에서 못 고치는 이유다 — 계획서 Task 3 Gate 가 신설을 금지하고 `ops/reconcile/_harness/m0.sh` 303행이 토큰 집합 크기 20 을 리터럴로 못박으며 같은 하네스 6d 절의 전수 대조가 새 토큰마다 음성 fixture 를 요구한다. 셋 다 앞 창에서 봉인된 계약이라 여기서 열면 M1 이 앞 창 acceptance 를 깬다. 완화는 둘 — (1) 생산 트리는 그 파일의 소유 게이트(`node ops/statements/check-statements.mjs --check`, 실측 rc 0)가 이미 막고 층 분리(UI1)상 진술 스키마 판정은 층 3 의 일이 아니다, (2) M1 은 `stmt_rows_dropped` · `stmt_index_missing` 두 계수를 방출하고 `locality-base` fixture 실행에서 둘이 0 임을 하네스가 문다. 조치는 check 토큰 집합을 여는 별도 결정에서 하며 그때 `m0.sh` 의 20 결박과 6d 전수 대조를 함께 옮겨야 한다 |
| 2026-09-02 | HIGH | `.claude/plans/ops-30-reconcile-m1.plan.md` | 회부 `F-OPS-30-S1` (ops-20-statements 소유) — statement id 가 `ops:<doc>:<시트>:<첫 셀>` 4세그먼트이고 143/143 이 그 형태다. `anchor.cells` 가 2개 이상인 80건은 id 에 첫 셀만 적힌다. 검사기는 id 의 4번째 세그먼트가 `canonicalCell(anchor.cells)` 와 정확히 일치하기를 요구하므로(`ops/statements/check-statements.mjs:586`), 시트에 행 하나가 삽입되면 앵커 좌표가 움직이고 id 가 따라 바뀐다. 층 3 원장에서 그 편집은 `stale` 이 아니라 `OPS_RC_STMT_ABSENT` 로 떨어진다 — M1 이 `locality-stmt-id-renamed` fixture 로 그 전이를 못박았다. 두 상태는 사람이 할 일이 다르다(재판정 대 좌표 재결박). 행 번호 독립 안정 키 또는 재결박 절차가 필요하며 `F-OPS-30-R7` 의 statement 축 쌍둥이다. 이 축에서 못 고치는 이유는 소유다 — `ops/statements/**` 는 ops-20 소유이고 이 브랜치의 배타 소유는 `ops/reconcile/**` 와 `ops/findings/ops-30-reconcile.md` 다. 기록은 `ops/findings/ops-30-reconcile.md` 의 `F-OPS-30-S1` |
| 2026-09-02 | MEDIUM | `.claude/plans/ops-30-reconcile-m1.plan.md` | 회부 `F-OPS-30-S2` (ops-20-statements 소유) — `ops/statements/check-statements.mjs:398` `READ_SCOPE` 가 판독 대상 6시트를 모듈 상수로 들고 CLI 주입 지점이 없다. 규칙 8 은 그 시트의 모든 행이 진술이나 미판독 중 하나로 계정되기를 요구하고 시트가 층 1 에 없으면 `OPS_INV_CELLS_ABSENT` 로 죽는다. 그래서 그 검사기를 교차 오라클로 쓰는 소비자의 손작성 트리는 판독 범위가 늘 때마다 시트를 따라 늘려야 하고, 그 결합은 조용하다 — 진단문이 "판독 범위 상수가 늘었다" 가 아니라 "시트가 없다" 라고 적는다. 실측: 이 결박 때문에 앞 창 하네스 `m0.sh reverify` 가 M1 head 에서 `GOLDEN_STMT_NONZERO OPS_INV_SKIPPED_LEDGER` 로 죽어 있었다. M1 은 golden 트리를 6시트 × 최소 행으로 채우고 미판독 원장을 넣어 흡수했다(D7). 판독 범위를 트리에서 주입할 수 있으면 소비자가 자기 트리 크기를 자기가 정한다. 기록은 `ops/findings/ops-30-reconcile.md` 의 `F-OPS-30-S2` |
| 2026-09-02 | LOW | `.claude/plans/ops-30-reconcile-m1.plan.md` | 회부 `F-OPS-30-S3` (우산 / PRD 소유자) — `F-OPS-30-R5` (*"`ops/statements/statements.jsonl` 이 0바이트다"*) 해소 확인. M1 착수 시점 실측은 143행 47,571바이트이고 `node ops/statements/check-statements.mjs --check` 가 rc 0 · `verdict ok` 다. backlog 의 그 행을 닫아 달라. 원 findings 기록은 지우지 않았다 — 지우면 그때 왜 층 3 이 막혀 있었는지가 사라진다. 기록은 `ops/findings/ops-30-reconcile.md` 의 `F-OPS-30-S3` |
| 2026-09-02 | LOW | `.claude/plans/ops-30-reconcile-m1.plan.md` | 회부 `F-OPS-30-S4` (insuniverse-docs-10-index-git 소유) — `F-OPS-30-R9` 보강 실측. 스키마 안정 재생성 리비전 쌍에서 투영 해시가 움직인 행은 공통 2870행 중 26행이고 그 `source` 분포는 `deleted_path` 20 · `revert` 6 이다. `comment` 는 같은 리비전에 1370행이 있는데 표류가 0건이다. R9 의 주장(*"`summary` 가 첫 줄뿐이라 다중행 주석의 둘째 줄 이후 변경이 인덱스에 안 나타난다"*)과 같은 방향의 관찰이지만, 이 쌍에서 `comment` 행 내용이 실제로 안 움직였을 가능성과 구분되지 않는다 — 인과는 미검증이다. `docs/_meta/index/**` 는 이 브랜치가 읽기 전용이다. 기록은 `ops/findings/ops-30-reconcile.md` 의 `F-OPS-30-S4` |
| 2026-09-02 | HIGH | `.claude/plans/ops-30-reconcile-m1.plan.md` | 회부 `F-OPS-30-S5` (PRD 소유자 / 우산) — PRD Success Metric *"한쪽 1건 변경 시 stale 집합 == 그 앵커를 가진 행 집합"* 이 실 원장 상태에서 무조건 참이 아니다. `ops/reconcile/reconcile.mjs:651` 이 `unresolvable` 행을 해시 대조 전에 건너뛰고, `ops/reconcile/reconcile.mjs:696` 이 저장 `stale` 행을 계수로만 세고 `stalePresent` 목록에는 넣지 않는다 — 두 부류는 앵커를 가져도 stale 집합에 안 들어온다. M1 이 `locality-mixed-sealed` / `locality-mixed-base` 두 fixture 로 정수로 드러냈다: 같은 원장(바이트 동일)에서 봉인 상태는 `effective_stale 1` · `effective_unresolvable 1` 을 내고, 진술 A 를 변조하면 쌍 목록에 A 의 봉인 행 5건만 실린다(6건이 아니다). 문면에 봉인 행 한정을 넣어 달라 — 없으면 M2 이후가 그 명제를 무조건으로 읽고 두 부류가 조용한 누락이 된다. `.claude/prds/**` 는 이 브랜치의 배타 소유가 아니다. 기록은 `ops/findings/ops-30-reconcile.md` 의 `F-OPS-30-S5` |
| 2026-09-04 | FAIL | `.claude/plans/ops-30-reconcile-m3.plan.md` | L2 test: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-30-reconcile-m3.md · id=0296a88e |
| 2026-09-04 | CRITICAL | `.claude/plans/ops-30-reconcile-m3.plan.md` | L2 invariant: Divergence gate is fail-open at plan-review time. The plan removes the code-based gate `OPS_RC_NO_DIVERGENCE` (which the plan admits is broken for the policy-candidate axis, D11:211-221… · 원문 .claude/reviews/plan-review-ops-30-reconcile-m3.md · id=4e143872 |
| 2026-09-04 | CRITICAL | `.claude/plans/ops-30-reconcile-m3.plan.md` | L2 invariant: PRD requirement 3 (stale ratio < 30%) has no automated gate at plan-review time. The plan claims to measure regeneration stale ratio via counterfactual (lines 154-164, D5) but the Valid… · 원문 .claude/reviews/plan-review-ops-30-reconcile-m3.md · id=52c35b89 |
| 2026-09-04 | HIGH | `.claude/plans/ops-30-reconcile-m3.plan.md` | L2 invariant: The plan relocates critical gates from automated code enforcement to a Validation block that plan itself states is not run by /mccp:plan gate. This creates a fail-open window: the appro… · 원문 .claude/reviews/plan-review-ops-30-reconcile-m3.md · id=aa2d8993 |
| 2026-09-04 | HIGH | `.claude/plans/ops-30-reconcile-m3.plan.md` | L2 invariant: The plan's harness mode dependency structure (D13) creates an unreachable gate: Task 1 is supposed to create m3.sh baseline mode, but later Tasks 4, 5, 7, 8 add other modes to the same … · 원문 .claude/reviews/plan-review-ops-30-reconcile-m3.md · id=6a6963c6 |
| 2026-09-04 | FAIL | `.claude/plans/ops-30-reconcile-m3.plan.md` | L2 invariant: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-30-reconcile-m3.md · id=36c9de1e |
| 2026-09-07 | HIGH | `.claude/plans/ops-30-reconcile-m3.plan.md` | Implement-Codex R2 D-R1: 계획서 §Validation 의 판정 문장 **다섯**이 실행 가능한 형태가 아니다 — (1) `--list-tokens | wc -l` 이 26 을 20 과 비교 (`check` 접두 필터 누락) (2) `want m0`/`want m1` 이 D6-급 만료를 초록으로 요구하고 `m1` 은 하위명령 `reverify` 누락으로 rc 2 usage (3) `want ledger-untouched git diff --quiet reconcile.jsonl` 이 M3 산출 자체를 붉음으로 읽는다 (4) `want verify-ops` 는 rc 가 항상 0 이라 판정이 아니다 (F-OPS-30-M3R4) (5) **`want golden-covers-pc` (계획서 567-577행) 의 `node -e` 본문 JS 문자열 안에 `\n` 이 실제 개행으로 들어가 있어 `SyntaxError: Invalid or unexpected token` 으로 죽는다** — 2026-09-07 종결 리뷰에서 codex 와 fable 이 독립으로 발견했고 둘 다 재현했다. 불변식(골든이 policy-candidate 세 모양을 실제로 태우는가)은 옳게 돌리면 성립한다 (golden pc 4행 · 세 모양 전건 존재 · rc 0). 불변식은 다섯 다 옳고 옳은 셸 형태는 `.claude/notes/ops-30-reconcile-m3.md` §계획 대비 이탈 의 교정표에 실측으로 확정돼 있다. 소관이 `/mccp:plan` 인 이유: Codex 가 요구한 renewed plan review/receipt 는 `plan-codex-runner.js` 만 만들 수 있고 `/mccp:prp-implement` 본문이 "there is no CLI path that can reproduce it" 이라 못박아, implement 가 본문만 고치면 `plan_hash` 가 stale 로 남아 `/mccp:pr` 이 막힌 채 남는다 · Open Question OQ-M3R2-1 · Codex threadId 01a07a46-bca6-7262-b623-59d5acd717d4 |
| 2026-09-07 | MEDIUM | `.claude/plans/ops-30-reconcile-m3.plan.md` | Implement-Codex R2 OQ-M3R2-2 (소관: mccp 도구, 이 저장소 밖): implement 게이트에 supersession 경로가 없어 /mccp:prp-implement 재진입이 자기 라운드의 리뷰 verdict 를 receipt 에 스탬프할 수 없다. `receipt write` 가 git-tracked receipt 를 다른 해시로 덮는 것을 E4 audit anchor 로 거부하고(옳다), 필드 보존 재스탬프는 `restamp-grounding`·`restamp-routed` 둘뿐이라 `resolution.codex_verdict` 를 갱신할 경로가 없다. CLI 자신이 "Overwriting an existing slug is disallowed until a supersession schema exists (Out of Scope)" 라 적는다. 새 슬러그는 대안이 아니다 — 저장소 선례 insuniverse-docs-00-protocol-m3-recheck 가 plan-codex 와 implement-codex 를 둘 다 가져야 성립함을 보여주고 plan 축은 implement 가 만들 수 없다. 실측 귀결: 라운드 1 의 codex_verdict=skipped 가 receipt 에 남고 라운드 2 의 divergent 는 notes 에만 남는다. dedupe 는 두 값 모두에서 fail-closed 이므로 기계적 손실은 없고 기술만 뒤처진다 |
| 2026-09-07 | MEDIUM | `ops/reconcile/_harness/m3.sh` | 종결 리뷰 Codex-B (`/mccp:milestone-close` 2중 리뷰, 2026-09-07): `pc-divergence/axis-count` 가 축 분할을 안 문다. 검사가 무는 것은 (a) `pc_rows` == 원장 재열거 (b) `pc_axis_git + pc_axis_runtime + pc_unresolvable` == 원장 행 수 (c) `pc_unresolvable` == 원장 무좌표 행 수 (d) 두 축 각각 >= 1 이다. 합 항등식과 양수 하한만으로는 분할이 고정되지 않아 실제 `9/3` 을 `8/4` 로 변조해도 통과한다 (Codex 음성 프로브 실측). 주석은 *"방출 계수를 원장에서 독립으로 재열거한 값과 대조한다"* 라고 적었으나 축 분할에 대해서는 그 재열거가 없다 — 주석이 구현보다 강하다. 현재 원장의 `9/3` 자체는 종결 리뷰에서 target.id 파싱 + 양 색인 멤버십 대조로 독립 확인됐으므로 산출 결함은 아니고 하네스 보호 범위 결함이다. 교정: 원장에서 축을 독립 재열거해(`vendor:` 접두 대 그 밖) 두 계수와 값으로 대조한다 · 종결 문서 `.claude/milestone-closures/3-m3-policy-candidate.md` §2중 리뷰 |
| 2026-09-07 | LOW | `ops/reconcile/_harness/m3.sh` | 종결 리뷰 Codex-D 격하분 (2026-09-07): `m3.sh` 가 `m2.sh` 의 **갈래 A**(원장을 비운 채 `m0.sh`·`m1.sh` 를 완주시켜 검사 4번 이후의 눈멂을 닫는 경로)를 승계하지 않았다. `m3.sh baseline` 은 착수 SHA 에서 `m2.sh reverify` 만 부르고, `run_reverify` 는 419행 `records_total 143` 만료 리터럴에서 fail-fast 로 죽어 523행 `run_baseline`(갈래 A)에 도달하지 못한다. 즉 M3 head 의 `reconcile.mjs` 로 두 하네스를 완주시키는 경로가 M3 하네스 안에 없다. **불변식 자체는 성립한다** — 종결 리뷰에서 `m2.sh baseline` 을 M3 head 에서 직접 돌려 `prior_m0_rc_at_m0_state 0` · `prior_m1_rc_at_m0_state 0` · `prior_onehot_expired 2` · rc 0 을 확인했다 (fable 과 본 세션이 독립 재현). 배선 결함이므로 LOW. 교정: `m3.sh baseline` 이 `m2.sh baseline` 을 head 에서 한 번 더 부르고 두 계수를 이름 줄로 낸다 |
2026-09-07 | HIGH | .claude/plans/ops-30-reconcile-m3.plan.md | `m3.sh run_baseline` 이 워킹트리 추적 파일 3개를 **제자리에서** 착수 SHA 로 교체하는 설계 자체가 남긴 경쟁 — 백업 검증과 워킹 파일 덮어쓰기 사이(`git show` 구간 포함)에 에디터가 저장하면 그 편집이 어느 백업에도 남지 않는다. PR-Codex R2·R4·R5·R7·R8·R9 가 같은 뿌리의 변주를 여섯 번 지적했고, R9 는 기준본을 START_SHA 에서 직접 만드는 R8 수정으로도 이 경로가 닫히지 않음을 명시했다. 근본 처방은 baseline 검증을 워킹트리가 아니라 `git worktree add --detach <착수 SHA>` 격리 트리에서 돌리는 것이고, 그러면 백업·복원·보존·heal 기계가 전부 삭제된다. 이월 사유: 봉인된 M3 의 acceptance 장치 재설계이고 `ops/findings` 까지 되돌려져 baseline 귀속 의미가 바뀌며, 이미 커밋된 M3 report·closure·plan 이 사라진 설계를 기술하게 된다. 현 위험 등급은 "사람이 2분 30초 창 안에 특정 3파일을 저장해야 성립하는 개발 하네스 경쟁" 이고 제품 결함이 아니다 — 별도 마일스톤에서 재설계한다
| 2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m4.plan.md | L2 architect: D6 의 불변식(‘상신 표가 각 행에 소관과 대기 상태를 적는다’)을 Task 4 가 정의한 표 구조도 게이트도 담지 못한다. 이 계획의 유일한 ‘높음’ 리스크(소유권 창 종료 후 미결 회부 3건 무주화)의 완화가 구조적으로 비어 있다. · 원문 .claude/reviews/plan-review-ops-30-reconcile-m4.md · id=99adadfc |
| 2026-09-08 | FAIL | .claude/plans/ops-30-reconcile-m4.plan.md | L2 architect: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-30-reconcile-m4.md · id=f57213a6 |
| 2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m4.plan.md | L2 test: F-OPS-30-M4L1 의 PII 실측 정수(주민번호 패턴 28건이 전건 probe:sha256: digest 오탐 · 전화/이메일 0건)는 어떤 하네스 모드도 재도출하지 않는다 — 계획서 자신의 D5 논리("적힌 시점에만 참인 문장")가 정확히 이 정수에 적용되는데 falsifier 가 없다 · 원문 .claude/reviews/plan-review-ops-30-reconcile-m4.md · id=cc0c0c68 |
| 2026-09-08 | FAIL | .claude/plans/ops-30-reconcile-m4.plan.md | L2 test: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-30-reconcile-m4.md · id=a51bde46 |
| 2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m4.plan.md | L2 invariant: D5 의 처분표 검산이 '저장 verdict' 재도출에만 결박되고 유효(effective) verdict 는 판정에서 빠져 있다. 이 PRD 최상위 위험(UI15 · PRD:153 '낡은 값이 agree 로 오판돼 본문 진입')을 잡아야 할 유일한 게이트가, 정확히 stale 강등이 발생한 날에 초록으로 남는다. · 원문 .claude/reviews/plan-review-ops-30-reconcile-m4.md · id=f2f377ef |
| 2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m4.plan.md | L2 invariant: 처분표 검산에 행 수 6 고정 검사가 없어, 건수 0 인 행(`stale` · `code-only`)을 표에서 통째로 빼도 합 155 와 행별 일치가 모두 성립해 게이트가 초록이다. UI6 '조용한 0건은 통과가 아니다' 를 게이트가 강제하지 않는다. · 원문 .claude/reviews/plan-review-ops-30-reconcile-m4.md · id=9faaabae |
| 2026-09-08 | FAIL | .claude/plans/ops-30-reconcile-m4.plan.md | L2 invariant: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-30-reconcile-m4.md · id=5e36dfd7 |
| 2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m4.plan.md | L2 architect: 표 B 의 `유효` 열이 결박될 대상(`--check` 의 축별 방출)이 존재하지 않는다. D1 이 생산 스크립트를 열지 않겠다고 못박았으므로 census 의 (b)·(e) 는 오늘 구현 불가능하거나, 하네스가 stale 강등 규칙을 원장에서 재구현해 불변식의 두 번째 소유자가 된다. · 원문 .claude/reviews/plan-review-ops-30-reconcile-m4.md · id=7872d44f |
| 2026-09-08 | FAIL | .claude/plans/ops-30-reconcile-m4.plan.md | L2 architect: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-30-reconcile-m4.md · id=62eb0c96 |
| 2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m4.plan.md | L2 security: 표 C 의 PII 실측과 `m4.sh pii-recount` 재도출이 정규화(NFKC) 없이 원문에 정규식을 돌리는 형태로 기술돼 있어, 전각 표기 PII 는 '0건' 으로 측정되고 그 거짓 0 이 정책 PRD 5종이 읽는 커밋 문서(ops/findings/ops-30-reconcile.md)에 실측으로 굳는다. 이 저장소는 같은 … · 원문 .claude/reviews/plan-review-ops-30-reconcile-m4.md · id=b37b83b7 |
| 2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m4.plan.md | L2 security: D8·D9 의 조합이 `basis` 자유텍스트 PII 유입 경로를 강제 지점 없이 남긴 채 이 PRD 의 배타 소유 창을 닫는다. 우산 제약 5·8 이 요구하는 `pii_excluded` 계수 필드가 ops/reconcile 에 존재하지 않는데, M4 는 새 `O-` 번호를 발행하지 않으므로 그 사실이 회부 채널에 오르지 않고 로컬… · 원문 .claude/reviews/plan-review-ops-30-reconcile-m4.md · id=cd890910 |
| 2026-09-08 | FAIL | .claude/plans/ops-30-reconcile-m4.plan.md | L2 security: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-30-reconcile-m4.md · id=f4cc7fba |
| 2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m4.plan.md | L2 test: 표 B 의 `유효` 열을 무는 falsifier가 존재할 수 없다 — `--check` 는 축별 verdict 방출을 하지 않으며, D1 이 생산 스크립트 수정을 금지하고 Validation 3 이 `reconcile.mjs` 를 착수 SHA 바이트 동등으로 못박는다. 따라서 `census` 는 항상 `CENSUS_EMISSION_ABSE… · 원문 .claude/reviews/plan-review-ops-30-reconcile-m4.md · id=8fca9249 |
| 2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m4.plan.md | L2 test: 플랜 자신이 축별 유효값의 출처에 대해 모순된 두 진술을 한다 — 실측표는 축별 분해를 '원장 직접 재도출'로, Task 2 는 '`--check` 축별 방출'로 적는다. 어느 쪽이 정본인지 정해지지 않아 게이트가 무엇을 무는지 falsifiable 하지 않다. · 원문 .claude/reviews/plan-review-ops-30-reconcile-m4.md · id=f1a8b144 |
| 2026-09-08 | FAIL | .claude/plans/ops-30-reconcile-m4.plan.md | L2 test: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-30-reconcile-m4.md · id=51901a41 |
| 2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m4.plan.md | L2 invariant: 표 B 의 `유효` 열에는 대조할 데이터원이 존재하지 않는다. D5/Task2(e) 는 '유효 열 == `--check` 축별 방출' 을 요구하지만 `reconcile.mjs` 는 축별 verdict 방출을 내지 않으며(축 관련 방출은 `pc_axis_git`·`pc_axis_runtime`·`pc_unresolvable`·`pc… · 원문 .claude/reviews/plan-review-ops-30-reconcile-m4.md · id=d7e7f117 |
| 2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m4.plan.md | L2 invariant: Task 2 의 Action 문면이 라운드 2 HIGH 로 폐기된 단일 `건수` 열 표 B 를 그대로 지시한다. 구현자가 읽는 실행 지시와 D5/Acceptance 가 충돌하며, Action 을 따르면 강등 날 눈머는 형태가 산출된다. · 원문 .claude/reviews/plan-review-ops-30-reconcile-m4.md · id=bbd406d4 |
| 2026-09-08 | FAIL | .claude/plans/ops-30-reconcile-m4.plan.md | L2 invariant: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-30-reconcile-m4.md · id=c53487a1 |
2026-09-08 | MEDIUM | .claude/plans/ops-30-reconcile-m4.plan.md | [해소됨 2026-09-08] m4.sh under_snap() 이 path.resolve() 만 써 심링크를 안 따라가는데 주석은 realpath 판정이라 주장했다 (mccp:security-reviewer S1). PR-Codex R2 F2 가 HIGH 로 올렸고 realpath 판정으로 교체 — 이월 판단이 틀렸다
2026-09-08 | LOW | .claude/plans/ops-30-reconcile-m4.plan.md | reconcile.mjs:783 migrationUnattributable 이 dep 의 kind/axis spec 을 안 봐서 dep 쪽 투영 변경이 stale_by_content_drift 로 오귀속된다 (mccp:security-reviewer S2)
2026-09-08 | MEDIUM | .claude/plans/ops-30-reconcile-m4.plan.md | reconcile.mjs validateRecord — dep_targets 선택 키에 시험이 0건 (로컬 리뷰 H2, 미검증 이월 · F-OPS-30-M4R2)
2026-09-08 | MEDIUM | .claude/plans/ops-30-reconcile-m4.plan.md | reconcile.mjs validateRecord — unresolvable 행이 dep_targets 를 들어도 통과하고 runCheck 가 그보다 먼저 건너뛴다 (로컬 리뷰 M1, 미검증 이월 · F-OPS-30-M4R2)
2026-09-08 | MEDIUM | .claude/plans/ops-30-reconcile-m4.plan.md | reconcile.mjs dep 해시가 늘 CURRENT_PROJECTION_VERSION 인데 target_sha 는 행의 ver 를 쓴다 — 투영 상승 시 구버전 행 dep 전건 어긋남 (로컬 리뷰 M2, 미검증 이월 · F-OPS-30-M4R2)
2026-09-08 | MEDIUM | .claude/plans/ops-30-reconcile-m4.plan.md | reconcile.mjs runPropose 가 중복 id 에 조용히 산출을 낸다 — --check 는 OPS_RC_ID_DUPLICATE 로 죽는다 (로컬 리뷰 M3, 미검증 이월 · F-OPS-30-M4R2)
| 2026-09-08 | CRITICAL | .claude/plans/ops-30-reconcile-m5.plan.md | L2 architect: D9(토큰 20→21)과 Task 1(a)/Validation 5(m0~m3 초록)가 서로를 배제한다. m0·m1·m3 하네스가 check 토큰 집합 크기를 리터럴 20 으로 못박고 있어, `OPS_RC_PII_PRESENT` 를 추가하는 순간 m0·m1·m3 이 `TOKEN_SET_SIZE`/`SELF_TOKEN_SET_SIZE… · 원문 .claude/reviews/plan-review-ops-30-reconcile.md · id=718b5bd3 |
| 2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m5.plan.md | L2 architect: 만료 귀속 설계가 m4 하나에만 걸려 있다. 실제로는 m0·m1·m3 도 M5 head 에서 만료로 붉어지는데(위 토큰 리터럴 + selftest fixture 44→48 등 계수 리터럴), 계획은 그 셋을 '초록'으로 단언해 만료와 회귀를 구분할 이름 검사를 두지 않았다. 즉 D2 가 세운 '붉음의 이름을 문는다' 불변식이 실제… · 원문 .claude/reviews/plan-review-ops-30-reconcile.md · id=7859d0bf |
| 2026-09-08 | FAIL | .claude/plans/ops-30-reconcile-m5.plan.md | L2 architect: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-30-reconcile.md · id=df48cf7b |
| 2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m5.plan.md | L2 security: M5 permanently expires m4.sh, which is the ONLY green enforcement of the sanctioned referral path-anchor hardening; the plan specifies a replacement check in m5.sh without carrying forwa… · 원문 .claude/reviews/plan-review-ops-30-reconcile.md · id=89462a96 |
| 2026-09-08 | FAIL | .claude/plans/ops-30-reconcile-m5.plan.md | L2 security: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-30-reconcile.md · id=d7f397e9 |
| 2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m5.plan.md | L2 test: Plan Validation §5 and Task 1(a) assert `m0~m3 reverify` stay green, but D9's 21st token makes m0.sh fail deterministically. The plan provides expiry/attribution only for m4.sh, so a load-be… · 원문 .claude/reviews/plan-review-ops-30-reconcile.md · id=097644f5 |
| 2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m5.plan.md | L2 test: The plan's designated falsifier for its top risk ('결박을 고쳤지 판정을 안 고쳤다') is tautological: `stored_*` is counted straight off the ledger's `verdict` field and cannot change from any Task 2 code… · 원문 .claude/reviews/plan-review-ops-30-reconcile.md · id=95d686f4 |
| 2026-09-08 | FAIL | .claude/plans/ops-30-reconcile-m5.plan.md | L2 test: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-30-reconcile.md · id=35c4dded |
| 2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m5.plan.md | L2 invariant: Task 1 의 m4 만료 귀속("붉음이 FROZEN_DRIFT ops/reconcile/reconcile.mjs 임")은 Files to Change 가 허용한 `reconcile.jsonl` 재생성 분기에서 구조적으로 성립할 수 없다. m4.sh 의 결박 루프는 FROZEN_PATHS 순서대로 돌며 첫 불일치에서 `fail` … · 원문 .claude/reviews/plan-review-ops-30-reconcile.md · id=acad27d3 |
| 2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m5.plan.md | L2 invariant: M5 기간 동안 생산 데이터 두 파일(`reconcile.jsonl`·`proposal.jsonl`)이 어떤 바이트 앵커도 갖지 않는다. m4 의 결박은 D2 로 '만료' 선언되고, m5.sh 는 하네스 m0~m4 다섯만 결박한다. 즉 원장은 M5 내내 무앵커 상태이며, 앵커 공백을 메운다고 계획이 내세우는 유일한 대체 검사는 집… · 원문 .claude/reviews/plan-review-ops-30-reconcile.md · id=7ec9868c |
| 2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m5.plan.md | L2 invariant: "판정을 안 고쳤다"를 문는 유일한 검사(Validation 3 · Acceptance)가 못 깨지는 단언이다. `stored_*` 6값은 원장 파일에서 그대로 세는 집계라 Task 2 의 결박 변경으로는 정의상 변하지 않고, 행 단위 값 교체·verdict 교환에도 불변이다. 실제로 움직이는 축은 `effective_*` 인데(… · 원문 .claude/reviews/plan-review-ops-30-reconcile.md · id=41b6e781 |
| 2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m5.plan.md | L2 invariant: Task 1 (a) 와 Validation 5 의 "m0~m3 reverify 초록" 전제가 선행 하네스가 스스로 기록한 실측과 충돌한다. m0·m1 은 M2 가 원장을 채운 시점부터 `EMPTY_LEDGER_ZERO_EXIT` 로 죽는 것이 정답으로 못박혀 있다. 이 전제대로 구현하면 m5.sh baseline 은 M5 와 무관… · 원문 .claude/reviews/plan-review-ops-30-reconcile.md · id=d7531972 |
| 2026-09-08 | FAIL | .claude/plans/ops-30-reconcile-m5.plan.md | L2 invariant: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-30-reconcile.md · id=59e8280b |
| 2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m5.plan.md | L2 architect: 경계 모순: M5 는 `ops/reconcile/reconcile.mjs` 와 `reconcile.jsonl` 을 여는데, 그 두 파일의 바이트 해시를 못박고 있는 오라클(`ops/_meta/golden.txt`)을 계획이 스스로 '소유 밖 (없음)' 으로 선언한다. 코드를 여는 순간 우산 게이트는 GOLDEN_MISMATCH 로… · 원문 .claude/reviews/plan-review-ops-30-reconcile-m5.md · id=7e698e72 |
| 2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m5.plan.md | L2 architect: 우산 게이트 통과 주장이 오라클과 정면으로 어긋난다. 계획은 `F-OPS-30-R2` 를 '해소' 로 닫으며 `reproduce_ran.2 reconcile rc=0` 을 근거로 대고 Validation 6 도 `rc=0` 을 기대하지만, golden 은 `rc=1` 로 동결돼 있고 `reconcile.jsonl` 항목은 빈 파일… · 원문 .claude/reviews/plan-review-ops-30-reconcile-m5.md · id=417b8efe |
| 2026-09-08 | FAIL | .claude/plans/ops-30-reconcile-m5.plan.md | L2 architect: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-30-reconcile-m5.md · id=b045491d |
| 2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m5.plan.md | L2 security: D7 의 digest 제외는 `basis` 자유텍스트에서 우회를 실제로 막지 못하며, 계획이 그 완화라고 내세운 `pii-hex-span-evasion` 음성 검사와 정면으로 모순된다. `basis` 는 사람이 쓰는 자유 문자열이고 `probe:sha256:` 접두 역시 자유 문자열이므로, 공격자(=원장 작성자)는 접두를 그냥 타이… · 원문 .claude/reviews/plan-review-ops-30-reconcile-m5.md · id=487b8081 |
| 2026-09-08 | FAIL | .claude/plans/ops-30-reconcile-m5.plan.md | L2 security: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-30-reconcile-m5.md · id=8c7d605c |
| 2026-09-08 | CRITICAL | .claude/plans/ops-30-reconcile-m5.plan.md | L2 test: D12 의 핵심 주장 — "m4 는 M5 head 에서 FROZEN_DRIFT <경로> 로 붉다" — 는 계획 자신의 D9(토큰 20→21) 때문에 결코 성립하지 않는다. m4.sh 는 MODE 분기 **이전에** self_check 를 무조건 돌리고 그 안에서 토큰 집합 크기를 리터럴 20 으로 못박으므로, 토큰이 21 이 되는 순간 m… · 원문 .claude/reviews/plan-review-ops-30-reconcile-m5.md · id=4011b1d5 |
| 2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m5.plan.md | L2 test: D2 표의 m2 행(기대 이름 `COUNTER_MISSING check [records_total 143]`)도 같은 이유로 거짓이 된다. m2.sh 역시 self_check 를 dispatch 전에 무조건 돌리고 토큰 20 을 못박으므로, Task 3 이 토큰을 21 로 올린 뒤 m2 의 붉음 이름은 SELF_TOKEN_SET_SIZE … · 원문 .claude/reviews/plan-review-ops-30-reconcile-m5.md · id=f68a9f8d |
| 2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m5.plan.md | L2 test: 실측 L 이 근거 데이터로 틀렸다 — 토큰 집합 크기 20 을 리터럴로 못박는 하네스는 m0·m1·m3 셋이 아니라 다섯(m2·m4 포함)이다. 이 오측이 위 두 결함의 원인이고, 계획이 반복해 주장하는 "M5 가 새로 발생시키는 만료는 정확히 하나(m3)" (plan:93-95, Acceptance 마지막 항) 역시 falsifiable… · 원문 .claude/reviews/plan-review-ops-30-reconcile-m5.md · id=c8c1ae7d |
| 2026-09-08 | FAIL | .claude/plans/ops-30-reconcile-m5.plan.md | L2 test: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-30-reconcile-m5.md · id=4107d0c1 |
| 2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m5.plan.md | L2 invariant: Task 2 requires the unbindable target axis to fall to the PERMISSIVE side of `sealed`, contradicting the fail-closed pattern it claims to mirror, and the plan never states the direction… · 원문 .claude/reviews/plan-review-ops-30-reconcile-m5.md · id=be501a41 |
| 2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m5.plan.md | L2 invariant: D13's `LEDGER_REGENERATED` transition is an unanchored re-seal: the only condition for dropping the M5-start byte anchor on `reconcile.jsonl`/`proposal.jsonl` is that 12 aggregate count… · 원문 .claude/reviews/plan-review-ops-30-reconcile-m5.md · id=493dad6c |
| 2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m5.plan.md | L2 invariant: Validation step 2 pins `pii_excluded 0` while 실측 E establishes 9 digest spans that D7's exclusion is specifically built to exclude. Either the exclusion counter is dead (silent zero — t… · 원문 .claude/reviews/plan-review-ops-30-reconcile-m5.md · id=69d39568 |
| 2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m5.plan.md | L2 invariant: Validation step 5's regression detector cannot fail. The harness-drift check is `grep -q ... &amp;&amp; echo "REGRESSION: 하네스가 움직였다"` — it prints a string and exits 0 either way; the same appli… · 원문 .claude/reviews/plan-review-ops-30-reconcile-m5.md · id=e810274d |
| 2026-09-08 | FAIL | .claude/plans/ops-30-reconcile-m5.plan.md | L2 invariant: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-30-reconcile-m5.md · id=88aa6d6a |
2026-09-08 | CRITICAL | .claude/plans/ops-30-reconcile-m5.plan.md | RESOLVED(implement) L2 test: m4 의 self_check 가 dispatch 앞에서 토큰 20 을 못박아 FROZEN_DRIFT 에 영영 도달 못 한다 → D12 재작성, m5.sh 가 7경로 결박을 승계
2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m5.plan.md | RESOLVED(implement) L2 test: 토큰 20 을 못박는 하네스는 3 이 아니라 5 이고 전부 실패 지점보다 앞이다 → 실측 L 정정 · D2 표 2열화
2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m5.plan.md | RESOLVED(implement) L2 invariant: unresolvable 의 targetMatch 가 거짓이라 69행이 stale 로 떨어진다 (pin 의 정반대) → D15 신설, 자격 기반 제외
2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m5.plan.md | RESOLVED(implement) L2 invariant: pii_excluded 0 pin 이 제외기 미작동 상태를 인증한다 → 실측 O 로 9 확정
2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m5.plan.md | RESOLVED(implement) L2 invariant: Validation 5 의 grep -q && echo 가 불합격을 못 낸다 → 명시적 실패 분기로 재작성
2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m5.plan.md | RESOLVED(implement) L2 security + Codex F1: probe:sha256: 접두 제외가 타이핑 가능한 우회로 → D7 재작성, probe 색인 멤버십 결박
2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m5.plan.md | RESOLVED(implement) L2 invariant + Codex F3: D13 집계 동등이 무단 재봉인을 허용 → 행 단위 동일성 대조로 재작성
2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m5.plan.md | RESOLVED(implement) Codex F2: 토큰 만료가 뒤따르는 검사를 가린다 → D16 신설, m5.sh 승계 계약
2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m5.plan.md | REFUTED(measured) L2 architect: golden.txt 가 M5 때문에 붉어진다 → 실측 P, 이미 98행 어긋나 있고 verify-ops 는 rc0/verdict fail
2026-09-08 | HIGH | .claude/plans/ops-30-reconcile-m5.plan.md | REFUTED(measured) L2 architect: golden 의 reproduce rc=1 이 Validation 6 과 모순 → 실측 P, 오늘 reproduce_ran.2 reconcile rc=0 이 실제로 방출된다
2026-09-14 | HIGH | .claude/plans/ops-30-reconcile-m5.plan.md | DEFERRED(pr-gate) plan-codex receipt stale — implement 단계 Codex R1 흡수로 D7·D12·D13 재작성·D15 신설 후 plan_hash 7f7fa55e→fdbe36bc, implement-codex receipt 는 새 hash 로 봉인 · 근거 .claude/receipts/mccp-plan-codex/ops-30-reconcile-m5.json plan_hash vs validate stale[0]
2026-09-14 | MEDIUM | .claude/plans/ops-30-reconcile-m5.plan.md | RESOLVED(pr-gate, plan UPDATE 표기로 정정) L1 C3_CREATE_EXISTS: Files to Change 가 이미 구현된 ops/reconcile/_harness/m5.sh 를 CREATE 로 둔다 (plan:242) — 구현 후 재리뷰에서 L1 이 구조적으로 막히는 자리
2026-09-14 | LOW | .claude/plans/ops-30-reconcile-m5.plan.md | RESOLVED(pr-gate, 전체 경로로 정정 → L1 converged) L1 C6_UNRESOLVED_CITATION ×7: 경로 없는 맨 파일명 인용 m0.sh·m1.sh·m2.sh·m3.sh·m4.sh (plan:59·107·495) · db-probe.mjs (plan:541) · a.md (plan:544, S4 공격 예시 문자열) — 전체 경로 표기로 고치면 해소, 단 plan 수정은 implement receipt 를 stale 로 만든다
| 2026-09-14 | HIGH | .claude/plans/ops-30-reconcile-m5.plan.md | L2 architect: The plan contradicts itself on what m5.sh baseline checks for m0/m1/m2. Task 1 says the m0, m1 and m2 rows are 'green on both sides' with one expected name. D2 says their red names chan… · 원문 .claude/reviews/plan-review-ops-30-reconcile-m5.md · id=1e5877c3 |
| 2026-09-14 | FAIL | .claude/plans/ops-30-reconcile-m5.plan.md | L2 architect: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ops-30-reconcile-m5.md · id=ecc5ec4f |
2026-09-14 | HIGH | .claude/plans/ops-30-reconcile-m5.plan.md | DEFERRED(pr-gate) plan-codex receipt 재봉인 거부 — L1 정정 후 L2 R2(plan_hash a109e28b, 3/4 pass, single-pass divergent)를 봉인하려 했으나 receipt/store.js TRACKED_RECEIPT_OVERWRITE(disk 9962a943 ≠ new 22659018). 같은 slug 복구 불가, 새 slug(m5r) 재ship 필요 — 사용자 결정으로 게이트 없이 PR 진행
| 2026-09-14 | MEDIUM | .claude/plans/ops-30-reconcile-m5.plan.md | L2R2 architect (non-blocking): The token order the plan promises does not match the code. D9 and Task 3 put OPS_RC_PII_PRESENT right after OPS_RC_BASIS_EMPTY as slot 7. In the code it is slot 8, with four other tokens between the t… · 원문 .claude/reviews/plan-review-ops-30-reconcile-m5.md |
| 2026-09-14 | MEDIUM | .claude/plans/ops-30-reconcile-m5.plan.md | L2R2 architect (non-blocking): D7's safety argument rests on the probe index being computed independently. The plan's own S1 entry says that is false: db-probe.jsonl is owned by the same writer. The code now recomputes each digest,… · 원문 .claude/reviews/plan-review-ops-30-reconcile-m5.md |
| 2026-09-14 | MEDIUM | .claude/plans/ops-30-reconcile-m5.plan.md | L2R2 architect (non-blocking): The PII scan now covers db-probe.jsonl as well as the ledger, but D7's exclusion table and Task 3 list only the ledger. The expected pii_excluded value moves between 9 and 17 in different parts of the… · 원문 .claude/reviews/plan-review-ops-30-reconcile-m5.md |
| 2026-09-14 | MEDIUM | .claude/plans/ops-30-reconcile-m5.plan.md | L2R2 architect (non-blocking): Many line citations the plan relies on no longer point at the cited code. :703-706 is now the duplicate-key block, not the unresolvable continue. :783 is not where `sealed` is computed. :360 is not th… · 원문 .claude/reviews/plan-review-ops-30-reconcile-m5.md |
| 2026-09-14 | LOW | .claude/plans/ops-30-reconcile-m5.plan.md | L2R2 architect (non-blocking): D13 identifies rows by stmt + target.id. Every unresolvable row has target.id null, so if one statement has more than one unresolvable row, the key does not tell those rows apart when the ledger is co… · 원문 .claude/reviews/plan-review-ops-30-reconcile-m5.md |
| 2026-09-14 | MEDIUM | .claude/plans/ops-30-reconcile-m5.plan.md | L2R2 security (non-blocking): The PII floor checks string values but not object keys. For `db-probe.jsonl`, which gets no schema validation, this lets PII in and can also put it in stderr. A probe row with a key like `010-1234-567… · 원문 .claude/reviews/plan-review-ops-30-reconcile-m5.md |
| 2026-09-14 | MEDIUM | .claude/plans/ops-30-reconcile-m5.plan.md | L2R2 test (non-blocking): The plan's key D14 falsifier is not what was built. The plan says that tampering with one unresolvable row must give exactly `effective_unresolvable 68` and `effective_stale 1`, and that only that row… · 원문 .claude/reviews/plan-review-ops-30-reconcile-m5.md |
| 2026-09-14 | MEDIUM | .claude/plans/ops-30-reconcile-m5.plan.md | L2R2 test (non-blocking): The plan contradicts itself on the expected `pii_excluded` value, and its exact-value checks do not match the harness. D7 says today's value is 9, while Task 3 and Validation 2 require 17. m5.sh delib… · 원문 .claude/reviews/plan-review-ops-30-reconcile-m5.md |
| 2026-09-14 | LOW | .claude/plans/ops-30-reconcile-m5.plan.md | L2R2 test (non-blocking): The Task 6 Validate line only requires rc != 0, so any failure would pass it. The harness does check the token name, but the plan's own Validate line does not. · 원문 .claude/reviews/plan-review-ops-30-reconcile-m5.md |
| 2026-09-14 | MEDIUM | .claude/plans/ops-30-reconcile-m5.plan.md | L2R2 invariant (non-blocking): D7 still rests the PII exclusion on a claim the plan itself later disproves. D7 says the author cannot get a chosen 64-hex into an "independently computed probe_sha set". S1 then shows db-probe.jsonl … · 원문 .claude/reviews/plan-review-ops-30-reconcile-m5.md |
| 2026-09-14 | MEDIUM | .claude/plans/ops-30-reconcile-m5.plan.md | L2R2 invariant (non-blocking): The exclusion count pinned as the approval value contradicts itself. D7 and the Validation 2 comment say 9, but Task 3 and the Validation regex require 17. The extra 8 come from counting db-probe.json… · 원문 .claude/reviews/plan-review-ops-30-reconcile-m5.md |
| 2026-09-14 | MEDIUM | .claude/plans/ops-30-reconcile-m5.plan.md | L2R2 invariant (non-blocking): Task 1 Validate contradicts D2's two-column rule. It says rows m0, m1 and m2 are green 'at both times', which only works if one expected name serves before and after. D2 requires baseline to check the… · 원문 .claude/reviews/plan-review-ops-30-reconcile-m5.md |
| 2026-09-14 | LOW | .claude/plans/ops-30-reconcile-m5.plan.md | L2R2 invariant (non-blocking): The Validation 5 regression loop is a check that can never fire. It greps the m0-m4 stderr for FROZEN_DRIFT, but D12 says every harness now dies at self_check before reaching that code. The real check… · 원문 .claude/reviews/plan-review-ops-30-reconcile-m5.md |
| 2026-09-14 | MEDIUM | .claude/plans/ops-30-reconcile-m5.plan.md | L2R2 invariant (non-blocking): The gate ran out of order. Implementation started and a receipt was written before the security review came back, so this plan approval is gating work that already exists. The plan records the deviati… · 원문 .claude/reviews/plan-review-ops-30-reconcile-m5.md |
2026-08-07 | CRITICAL | .claude/plans/ops-alert-system-m1.plan.md | 알림 상태 아웃박스 테이블 + idempotency key + 조건부 UPDATE 승격 — 다중 writer(다중 API 레플리카 직접 발송)가 생기면. M1 은 GET_LOCK + 상태 선기록 + 롤백으로 단일 writer 전제 하에 봉합
2026-08-07 | HIGH | .claude/plans/ops-alert-system-m1.plan.md | 채널별 발송 실패의 내구성 있는 기록 + 재시도 큐 — 일시 장애로 알림이 영구 소실될 여지. 마일스톤 3 자기감시(채널별 실패율)와 함께 설계
2026-08-07 | MEDIUM | .claude/plans/ops-alert-system-m1.plan.md | M6 "등록 1건" 실증 — 5번째 규칙을 실제로 붙여 DI·기본값·검증·화면·라우팅이 레지스트리 메타만으로 파생되는지 계측. 마일스톤 2 의 A1/A3/A4/A6 추가 시점에 수행
2026-08-10 | HIGH | .claude/plans/ops-alert-system-m1.plan.md | `statistics.service.ts:598` 의 googleChat 웹훅 직접 발송을 alert 경로로 흡수 — R4 전역 불변식("웹훅 발신자 1곳")이 이것 때문에 M1 에서 성립하지 않는다. 페이로드가 `cardsV2` 라 `{text}` 규칙 모델에 안 맞아 별도 설계 필요 (Santa R1 S4)
2026-08-10 | LOW | .claude/plans/ops-alert-system-m1.plan.md | `libs/chat/src/chat.service.ts` 삭제 — 주입 0건 사문화 웹훅 코드. R4 전역 불변식의 나머지 한 건 (Santa R1 S4)
2026-08-10 | MEDIUM | .claude/plans/ops-alert-system-m1.plan.md | 알림 목적지 변경 감사 로그 + 변경 시 기존 채널로 통지 — 최상위 관리자 계정 탈취 시 알림이 조용히 리다이렉트되는 잔여 위험(D9-c). 마일스톤 3 자기감시와 함께 (Santa R3 S20)
2026-08-10 | HIGH | .claude/plans/ops-alert-system-m1.plan.md | best-effort → at-least-once 승격: 경고 해소 후에도 살아남는 목적지 단위 발송 의도(아웃박스 행 + idempotency key). 조건: 다중 writer 등장 또는 미전달 유실이 실제 관측될 때 (Plan-Codex R4 F1)
~~2026-08-10 | HIGH | .claude/plans/ops-alert-system-m1.plan.md | 리스·상태 조건부 UPDATE 의 실 MySQL 동시성 검증 하네스 — fake repository spec 은 SQL 의미론(행 잠금 시 WHERE 재평가, 파생테이블 EXISTS, `CAST` 폴백)을 증명하지 못한다. 조건: stg 실측에서 겹침이 관측되거나 다중 writer 등장 (Implement-Codex R1 F2)~~ — **RESOLVED 2026-08-10**: DB 구성 후 실 MySQL(20 커넥션 풀)로 14/14 통과. 20-way 동시 획득 승자 1명, 패자 19명 상태 오염 0건, 유효 리스 재획득 시 `affectedRows=0/changedRows=0` 확인. 근거: `.claude/notes/ops-alert-system-m1.md` §실 DB 검증
2026-08-10 | HIGH | .claude/plans/ops-alert-system-m2.plan.md | A3 하트비트 grace=2.0 이 스케줄러 알림을 실행 주기 하나만큼 늦춘다 — Q11(UI5 vs UI9 우선순위)·Q8(EventBridge 실주기) 확정 시 초기값을 함께 정한다. 순수 설정값이라 재배포 불필요 (Plan-Codex R4 F1)
2026-08-10 | HIGH | .claude/plans/ops-alert-system-m2.plan.md | `api-error-rate_window_ms` max 가 60분인데 `alert:req|5xx` 카운터 TTL 이 30분 — 30분 초과 창에서 앞쪽 버킷이 만료돼 분모가 줄고 5xx 실패율이 부풀려진다(오탐 방향). 결제 카운터에 적용한 규칙(TTL > 창 상한)을 동일하게 적용할 것 (Plan-Codex R4 F2)
2026-08-10 | HIGH | .claude/plans/ops-alert-system-m2.plan.md | §D2 예시 코드가 결제 시도 카운터를 `await` 해 직렬 결제 루프에 Redis 왕복을 건당 추가한다. 같은 블록의 예외 카운터처럼 fire-and-forget(`void ….catch()`)이어야 UI14·UI17 에 맞는다 (Plan-Codex R4 F3)
2026-08-10 | MEDIUM | .claude/plans/ops-alert-system-m2.plan.md | 지속되는 warn 이 쌓이면 다이제스트 본문이 목적지 상한을 넘어 매 회차 같은 실패를 반복할 수 있다 — 발송 시 `groupFindings` 를 그대로 태워 분할할 것(M1 이 같은 실패 모드에 2800자 상한을 넣은 선례) (Plan-Codex R4 F4)
~~2026-08-12 | HIGH | .claude/plans/ops-alert-system-m3.plan.md | `overall` 의 degraded 조건이 규칙 health `never` 를 세지 않는다 — `alert:ruleStat` write 가 실패·유실·파손되거나 전 규칙이 개별 OFF 인 상태에서 활성 규칙이 한 번도 점검되지 않았는데도 `live` 가 될 수 있다. `never` 를 degraded 사유에 포함하고, 전 규칙 OFF 는 `stopped` 로 승격할 것 (Plan-Codex R9 F1)~~ — **RESOLVED 2026-08-13**: Implement-Codex R1 F1 로 재확인되어 흡수. `alert-monitor.ts` `decideOverall()` 이 활성 규칙 0개를 `stopped` 로, 활성 규칙 중 `never` 존재를 `degraded` 사유로 판정한다. 근거: `.claude/notes/ops-alert-system-m3.md` §Codex Implementation Review
~~2026-08-12 | HIGH | .claude/plans/ops-alert-system-m3.plan.md | 채널 URL·토큰을 바꿔도 `alc_id` 가 유지되므로 채널별 최근 창이 **이전 목적지의 성공 이력을 상속**한다 — 새 목적지가 미검증이거나 전부 실패해도 `rate:0`·`live` 가 된다(UI24 정면). 이력 행에 목적지 식별자(마스킹 URL)를 함께 두고 현재 채널 URL 과 다른 행은 창에서 제외하거나, `alc_updated_at` 이후 행만 세도록 할 것 (Plan-Codex R9 F2)~~ — **RESOLVED 2026-08-13**: Implement-Codex R1 F2 로 재확인되어 흡수. 신규 컬럼 없이 기존 `tn_alert_channel.alc_updated_at` 이후 행만 채널 창에 센다(`channelRates()`). 자격증명 파생값을 저장하지 않으므로 §D1 R5-F1 과 충돌하지 않는다
2026-08-12 | HIGH | .claude/plans/ops-alert-system-m3.plan.md | `POST /snooze` 의 스냅샷 무효화가 실행 중인 `run()` 과 직렬화되지 않는다 — 옛 스누즈 값을 읽은 회차가 마지막에 `snoozeUntil=0` 스냅샷을 되쓰면 이후 DB 폴백이 스누즈 중 발송한다. 반대로 `minutes:0` 수동 해제 직후 DB 가 죽으면 스냅샷 부재로 침묵한다. 스냅샷 write 를 리스 조건부로 묶거나 스냅샷에 스누즈 설정 버전을 실어 fencing 할 것 (Plan-Codex R9 F3)
2026-08-12 | HIGH | .claude/plans/ops-alert-system-m3.plan.md | 타입별 `sentAt` 이 회차 끝 단일 리스 조건부 write 라, 웹훅 성공 후 크래시·리스 상실이면 실제 발송이 화면에 영원히 반영되지 않는다(다중 규칙 다이제스트 행은 `alh_rule_id NULL` 이라 이력으로도 복구 불가). 발송 직후 증분 기록으로 바꾸거나 다이제스트 행에 규칙 목록을 별도 컬럼으로 남길 것 (Plan-Codex R9 F4)
2026-08-13 | HIGH | insuniverse-server apps/api/src/modules/alert/alert-monitor.ts | 미래 틱 가드가 벽시계 따라잡기까지만 유효하다 — 시계가 N분 앞선 인스턴스가 틱을 찍고 죽으면 `now - lastTickAt` 이 음수인 구간은 `unknown` 이지만, T+N 부터 `deadAfterMs` 동안 `live` 로 돌아온다. 런너는 그 사이 내내 죽어 있다. 닫으려면 `lastTickAt` 을 인스턴스 시계가 아니라 DB 권위 시각으로 재야 하는데 `tn_alert_setting.als_updated_at` 은 앱이 `dayjs()` 로 찍으므로 같은 시계다 — `NOW()` 기반 읽기 경로 신설이 필요하고 그것은 `dead` 판정 전체의 설계 변경이다 (santa-loop R2, Reviewer B)
2026-08-14 | HIGH | insuniverse-server apps/api/src/modules/alert/alert-signal.service.ts | 이력 구멍 표지(`alert:historyGap`)가 Redis 전용이라 **Redis 재시작을 넘기지 못한다** — DB 장애로 발송이 원장에 못 들어간 뒤 관리자가 화면을 보기 전에 Redis 가 재시작하면 `history.available:true`·`gapAt:null` 이 되어 **불완전한 원장이 완전한 것처럼 보인다**. 표지가 필요한 시점에 내구성 있는 저장소(DB)는 정의상 죽어 있으므로 세 번째 저장소 없이는 못 닫는다 — 계획 §D1 저장 범위 밖이고 PRD Q14 와 같은 축이다. 완화 후보는 DB 회수 시점에 표지를 KV 로 승격하는 것이며 창을 좁힐 뿐 닫지 못한다. 실측: V11 (santa-loop R4, Reviewer B — 기각·이월)
2026-08-14 | LOW | insuniverse-server apps/api/src/modules/alert/alert-monitor.ts | 채널 실패율 창의 하한이 1초 해상도다 — `alc_updated_at` 은 앱이 `dayjs().format()` 으로 찍고 `alh_created_at` 은 MySQL `CURRENT_TIMESTAMP` 이며 둘 다 `DATETIME` precision 0 이라, 채널 편집과 발송이 같은 초에 겹치면 옛 실패 행이 새 창에 남아 고친 채널이 한 박자 늦게 초록으로 돌아온다. 다음 발송 한 번으로 자기 치유되고 계획 V31 이 이미 "반복"을 지시하므로 blocking 이 아니다. 닫으려면 두 시각의 소스를 하나로 통일해야 한다(`NOW(3)` 기반) (santa-loop R4, Reviewer B — 기각·이월)
2026-08-14 | MEDIUM | .claude/plans/ops-alert-system-m4.plan.md | drift-throw 가 **이미 큐에 들어간 다이제스트 발송을 막지 못한다** — §D10 은 서명 불일치 회차에 웹훅이 나가지 않는다고 적었으나, `AlertService` 의 다이제스트 경로(`alert.service.ts:805-823`)는 저장된 큐를 병합해 flush 할 때 `isUnevaluated` 를 보지 않는다. drift 이전에 큐잉된 `treat-vendor` warn 이 drift 회차에 발송되고 `sentAt` 까지 전진할 수 있다. 억제·streak·스누즈 로그는 보존되므로 허위 복구(R7 F1)와는 다른 축이고 blocking 이 아니다 — 나가는 것이 **옛 임계로 판정된 실제 관측**이라 거짓은 아니지만, 설정이 바뀐 뒤 도착한다는 점이 오해를 만든다. 닫으려면 다이제스트 flush 가 미평가 규칙의 엔트리를 건너뛰고 보존하도록 공용 경로를 고쳐야 하며, 그것은 M4 범위 밖의 공용 계약 변경이다. 대안은 "drift 이전 큐는 나갈 수 있다"를 §D10 에 명시하는 문서화 (Plan-Codex R8 F2 — 사용자 결정으로 HIGH 만 흡수, 이월)
2026-08-14 | HIGH | .claude/plans/ops-alert-system-m4.plan.md | `--target-fpr` 변환이 실제 발화율을 보장하지 않는다 — §D5-4b 는 `p(100-fpr)` 을 올림해 임계로 쓰지만 런타임 `passesRatio()` 는 `>=` 라 동률이 많은 이산 분포에서 목표를 크게 넘긴다. 적격 버킷 100개 중 10개가 정확히 0.30 이고 나머지가 0 이면 p99=0.30, 임계도 0.30 이라 과거 버킷의 10% 가 발화하는데 스크립트는 `OK` 서명을 낸다. 닫으려면 후보 임계를 **런타임과 같은 `>=` 조건으로 역검증**해 실제 초과 비율이 목표 이하인 최소값을 고르고, 없으면 서명을 내지 않아야 한다. 동률 분포 골든 픽스처 필요 (Plan-Codex 봉인 라운드 F0 — 사용자 결정으로 이월)
2026-08-14 | HIGH | .claude/plans/ops-alert-system-m4.plan.md | 산출 버킷이 런타임의 **슬라이딩 창을 재현하지 않는다** — 산출은 기간을 `window_ms` 고정 버킷으로 자르는데 런타임은 매 폴링마다 직전 `window_ms` 를 다시 읽는다. 경계에 걸친 5건이 고정 버킷에서는 2+3 으로 갈려 둘 다 표본 미달이어도 런타임 창에서는 5건 전부가 판정 대상이 된다. 저볼륨일수록 경계 효과가 지배적이라 §실측 근거의 일 1~3건 구간에서 특히 크다. 게다가 서명에 `alert_poll_interval_ms` 가 없어 주기를 바꿔도 §D10 이 못 잡는다. 닫으려면 과거 데이터를 폴링 시각마다 `[t-window, t]` 로 재생하고 폴링 주기·창 정렬 규약을 서명에 넣어야 한다 (Plan-Codex 봉인 라운드 F1 — 사용자 결정으로 이월)
2026-08-14 | HIGH | insuniverse-server apps/api/src/modules/alert/alert.service.ts | warn 다이제스트가 `channelHint` 를 버려 **벤더 전용 채널 라우팅이 끊긴다** — `DigestEntry`(`:74-81`)에 `channelHint` 필드가 없고, 큐잉(`:611-612`)이 `{key,text,t,ruleId}` 만 싣고, flush(`:1105-1108`)가 힌트 없이 finding 을 재구성한다(세 지점 코드 확인). M4 의 `vendor:<key>` warn 은 전부 다이제스트로 가므로 `channelHint=tprKey` 가 발송 시점에 소실된다. 벤더 전용 채널만 등록된 상태면 목적지가 0곳이라 큐가 남고, 일반 채널이 있으면 그리로 나간다. **M4 범위 밖의 공용 경로 변경**이며(전 규칙의 warn 이 같은 큐를 탄다) `DigestEntry` 에 힌트를 저장·병합·복원하도록 고쳐야 한다. 벤더 전용 채널만 있는 상태에서 큐잉→flush 라우팅 통합 테스트 필요 (Plan-Codex 봉인 라운드 F2 — 사용자 결정으로 이월)
2026-08-14 | HIGH | .claude/plans/ops-alert-system-m4.plan.md | 귀속 검사가 **판정 불가 잔여를 지배 벤더의 증거로 쓴다** — §D4 는 leave-one-out 잔여 표본이 `min_sample` 미만이면 그 벤더를 설명자로 세지만, 그 잔여는 "건강함"이 아니라 "모름"이다. `A 5/5 · B 2/2`(하한 5)에서 둘 다 전패인데 규칙은 A 만 `vendor-dominant:a` critical 로 부르고 `channelHint=a` 로 목적지를 좁히며 풀 critical 을 억제한다. Codex 는 잔여를 3상태(미만/초과/판정불가)로 두고 판정 가능한 잔여가 임계 미만일 때만 지배로 부르자고 한다 — 증거가 없으면 넓게(풀) 내보내자는 방향이다. 계획은 설명자를 "이 벤더를 빼면 풀이 나쁘다고 말할 근거가 사라지는가"로 정의했으므로 문면상 일관되고, 하한 미달 벤더의 침묵은 UI16 이 의도한 동작이라 계획 쪽도 방어 가능하다. 갈리는 지점은 "증거가 없을 때 좁게 내보낼 것인가 넓게 내보낼 것인가" 하나이며, 뒤집으려면 §D4 표와 Task 2 Gate 픽스처를 함께 고쳐야 하므로 plan 개정이 선행 조건이다. 곁가지로 §D4 4행("뺄 벤더가 없다")은 구조적 사실이고 잔여 미달은 관측 부족이라 성격이 다른데 같은 분기로 접혀 있다 (Implement-Codex R1 F3 — 이월)
2026-08-14 | MEDIUM | insuniverse-server apps/api/src/modules/alert/alert.service.ts | critical 이 warn 으로 내려앉으면 **잔여가 24시간 침묵한다** — `firedKeys` 는 `perFinding` 에서만 채워지는데(`:632-636`) `severitySplit` 규칙의 warn 은 `digestAdds` 로 빠져 거기 들어가지 않는다. `treat-vendor` 에서 풀 축이 내려가 `vendor-dominant:X` critical 이 사라지고 `vendor:X` warn 만 남는 회차가 그것이다. 복구 자체는 의미상 옳다(풀 규모 사건이 실제로 끝났다) — 문제는 대체 신호인 warn 이 `alert_digest_interval_ms`(기본 24시간) 동안 큐에 갇혀, 목적지에 남는 마지막 메시지가 복구 하나뿐이라는 것이다. M4 는 발화 문면의 주어를 벤더에서 풀로 바꿔 복구가 "벤더 정상화"로 읽히는 축만 닫았다. 나머지는 다이제스트 지연 자체이며 전 규칙 공용 경로라 R8 F2·봉인 F2 와 같은 이유로 이월한다 — 닫으려면 warn→critical 승격이나 즉시 flush 트리거가 필요하고 둘 다 §D5 발송 스케줄 계약 변경이다 (code-review 2026-08-14)
2026-08-14 | MEDIUM | insuniverse-server apps/api/src/modules/alert/rules/treat-vendor.rule.ts | `vendor-dominant:<key>` critical 이 **풀 규모 사건인데 목적지는 벤더 채널 한 곳**이다 — `destinationsFor()` 는 `channelHint` 가 잡히면 그 채널만 쓰고 일반 채널과 합집합하지 않는다(`alert.service.ts:377-384`, §D7 "합집합이 아니라 우선순위"). 벤더 채널과 운영 채널이 둘 다 등록돼 있으면 운영 채널은 풀 장애를 못 본다. 같은 규모·같은 심각도가 설명자 유무에 따라 다른 곳으로 간다(`vendor-pool` 분기는 힌트가 없어 일반 채널로 간다). 계획 §D4 가 "원인 벤더와 채널이 살아남는 것이 이 분기의 존재 이유"라고 적고 Task 2 Gate 픽스처가 `channelHint='inhouse'` 를 고정하므로 뒤집으려면 plan 개정이 선행 조건이다. backlog 의 Implement-Codex R1 F3 이 이 좁힘을 곁가지로 언급하지만 그쪽은 "판정 불가 잔여" 케이스 한정이고, 좁힘 자체는 모든 `vendor-dominant` 회차에 걸린다 (code-review 2026-08-14)
2026-08-14 | LOW | insuniverse-server apps/api/src/modules/alert/alert-noise.ts | 발송 본문에 **아이콘·태그가 두 번 붙는다** — 규칙 5종이 전부 `text` 에 `🔴 [위험]` 을 넣는데 `formatFindingLine()`(`:52-57`)이 `level` 로 같은 접두를 다시 만들어 `🔴 [위험] 🔴 [위험] …` 이 나간다. 그룹 경로(`groupFindings` `:83`)와 단건 경로(`alert.service.ts:700`) 둘 다 같다. M1 부터 실운영에 나간 형태이며 어느 spec 도 최종 본문을 단언하지 않아 잡히지 않았다. M4 신규 규칙은 기존 관행을 그대로 따랐을 뿐이라 여기서 고치면 M4 만 문면이 달라진다 — 닫으려면 규칙 5종의 `text` 에서 접두를 걷거나 `formatFindingLine` 을 항등으로 바꾸고, 발송 본문을 단언하는 spec 을 함께 넣어야 한다 (code-review 2026-08-14)
2026-08-18 | HIGH | insuniverse-server apps/api/src/schedules/analysis-status.schedule.ts | `alert_poll_interval_ms` 가 **평가 주기를 바꾸지 않는다** — 이 설정의 유일한 소비처는 `alert.service.ts:640` 의 `if (!entry.ok && now - entry.t < pollMs) continue` 하나이며(전 파일 grep 으로 확인, 나머지는 `alert-monitor.service.ts` 의 기대치 산출과 spec), 미전달 억제 엔트리의 **재시도 창**이지 스케줄러가 아니다. 실제 기동은 EventBridge 고정 5분이라 설정을 1분으로 내려도 5분마다, 60분으로 올려도 5분마다 돈다. UI6 이 "주기"를 이름으로 지목하므로 문면상 미충족이다. 다만 이 축은 M4 diff 밖(M1·M2 표면, 이번 8파일에 없음)이고, 저장소는 이미 이 성질을 알고 있다 — `alert-monitor.spec.ts:212` 가 "최소값 60000 으로 내려도 5분 주기 런너가 dead 가 아니다" 를 단언하고, 2.5 잔여조건이 "EventBridge 실주기"를 local 미증명 축으로 열거한다. 닫으려면 런너를 최소 지원 주기로 기동하고 설정 간격이 지날 때까지 원자적으로 건너뛰거나, 설정 구동 스케줄러를 도입해야 한다 — 외부 트리거 주기가 설정 정의역의 하한을 만족하는지가 선행 조건이다 (PR-Codex 2026-08-18 F2 — M4 범위 밖, 이월)
2026-08-18 | MEDIUM | insuniverse-server apps/api/src/modules/alert/alert.service.ts | 복구 발송이 **한 번 실패하면 영구 소실된다** — `alert.service.ts:751-755` 가 `Promise.allSettled` 결과와 무관하게 `delete state[recoveries[i].key]` 를 돌린다(주석이 "복구 시도 후에는 어느 쪽이든 상태를 정리한다"로 의도를 명시). 웹훅이 타임아웃·거부되면 `failures++` 만 세고 억제 엔트리는 사라지므로 다음 회차에 재시도할 대상이 없다. 목적지에 남는 마지막 메시지가 "사고 진행 중" 인 채로 굳고, 억제 기록이 없어 사후 복구도 어렵다. M1 부터의 의도된 설계이며 M4 diff 밖이다. 닫으려면 성공한 복구만 삭제하고 실패분을 명시적 pending 상태로 보존해 backoff·만료를 두어야 하며, 실패한 복구가 재시도되고 성공 후에만 정리되는 것을 단언하는 테스트가 필요하다 (PR-Codex 2026-08-18 F3 — M4 범위 밖, 이월)
2026-08-18 | HIGH | .claude/plans/alert-console-redesign.plan.md | Plan-Codex R1 F3 (범위 밖): scripts/alert-inject.ts 시나리오가 공유 억제 상태(alert:state)를 지우고 복구하지 못한다 — 시나리오 실패 시 억제 상태가 초기화된 채 남는다
2026-08-18 | MEDIUM | .claude/plans/alert-console-redesign.plan.md | Plan-Codex R1 F4 (범위 밖): scripts/alert-inject.ts 시나리오 판정이 대상 규칙이 아닌 아무 critical 로도 PASS 한다 — 다른 규칙 소음이 판정을 통과시킨다
2026-08-19 | MEDIUM | .claude/plans/alert-console-redesign.plan.md | D6 테스트 메시지 형식(`🔔 [테스트] {규칙 표시명} — 채널 연결 확인`)에 대응 게이트가 없다 — 형식은 산문으로만 존재 (L2 패널 R4 test)
2026-08-19 | MEDIUM | .claude/plans/alert-console-redesign.plan.md | 게이트 #15 가 grep 이라 `testTargets` 응답 스키마 `{hints, legacyGlobal}` 구조를 관측하지 못한다 (L2 패널 R1·R2·R4)

2026-08-19 | HIGH | .claude/plans/alert-console-redesign.plan.md | R17 F1 — brand-guard 가 무관한 타입 오류를 억제해도 게이트 `#15`(파일 존재 + `@ts-expect-error` 토큰)를 통과하고 `#18` 도 TS2578 을 안 낸다. 가드 내용을 골든 고정해야 닫힌다 — 구현물이 있어야 쓸 수 있는 형태라 이번 계획 루프에서 미흡수
2026-08-19 | HIGH | .claude/plans/alert-console-redesign.plan.md | R17 F2 — 런타임 계약 `testTargets 계약: legacyGlobal 원문 미노출` 이 "원문 URL 미포함" 이라 `raw.replace(/^https:\/\//,'')` 같은 변형이 경로·키·토큰을 남긴 채 통과한다. 계약을 `maskWebhookUrl` 실제 출력 형태(`{protocol}//{host}/***`)와의 정확 일치로 바꿔야 닫힌다 — 구현 착수 후 처리
2026-08-19 | MEDIUM | .claude/plans/alert-console-redesign.plan.md | Implement-Codex R1 F2 — `destinationsFor` 를 accepted/rejected 후보 단일 trace 반환으로 재구성해 운영 라우팅과 `sendTest` 진단이 같은 소스를 쓰게 한다. 현행 계획은 제외 사유를 두 번째 스캔으로 복제하므로 레거시 URL 이 `empty`/`dup`/`allowlist` 로 탈락한 경우를 채널 행 없이는 분류하지 못한다. 이번 계획은 `sendTest` 가 자기 `legacyUrls` 를 기존 사유 코드 + `channelId: null` 로 적는 부분 해소만 한다 (스키마 무변경)
2026-08-20 | HIGH | .claude/plans/alert-console-redesign-r2.plan.md | 환경 라벨 제거 후 배포별 fail-closed 발송 경계가 0 — webhook fingerprint 필수 설정으로 대체 필요 (Plan-Codex R1 F1 · `alert_enabled` 는 fail-open 실측)
2026-08-20 | MEDIUM | .claude/plans/alert-console-redesign-r2.plan.md | 규칙 문면 16자리를 순수 formatter 로 추출해 evaluate() 와 테스트 발송이 같은 함수를 쓰게 한다 — sampleText 복제의 드리프트 해소 (Plan-Codex R1 F2)
2026-08-20 | MEDIUM | .claude/plans/alert-console-redesign-r2.plan.md | 게이트 `#7` 의 원시 규칙 id 검사가 **변수명 기반**이다(`\{(r|h|s|row)\.(id|ruleId)\}`). 구현 실측에서 `AlertInfo` 안(요구가 원한 자리)의 `{row.ruleId}` 가 걸렸고, 같은 코드가 다른 두 화면에서는 반복 변수명이 `rule`·`sup` 이라 통과했다 — 즉 이 검사는 "표면에 뿌렸는가" 가 아니라 "변수 이름이 무엇인가" 를 본다. 자리(표 셀 vs 상세 disclosure)를 보려면 렌더 관측이나 JSX 구조 판정이 필요하다
2026-08-20 | LOW | .claude/plans/alert-console-redesign-r2.plan.md | 게이트 `#8` 의 `<table` 카운트가 **주석 안의 `<table>` 언급까지 센다**. 구현 중 `Collapsed` 의 설계 주석이 `<table>` 을 인용해 monitor-tables=2 로 떨어졌다(주석 문구를 고쳐 통과). 게이트 `#1` 은 주석행을 걷어내고 세는데 `#8` 은 안 한다 — 같은 파일군에 두 규약이 공존한다
2026-08-20 | MEDIUM | .claude/plans/alert-console-redesign-r3.plan.md | 계기판층 정본 `.tm-tip-pop` 이 `.tm-table-wrap`(`overflow:auto`) 안 마지막 열에서 **+304px 잘린다**(실측). 진료 모니터링 화면은 이 라운드의 회귀 범위가 아니라 미수정 — 같은 `positionStrategy` 또는 포털 처방이 그 화면에도 필요하다
2026-08-20 | MEDIUM | .claude/plans/alert-console-redesign-r3.plan.md | `--al-sub`/`--tm-sub`(`#868d98`)를 `--tile`(`#f6f7f9`)·`paper-head`(`#fcfcfc`) 위에 얹는 자리가 전부 **3.12~3.26:1** 로 WCAG 1.4.3 미달이다. 이번 라운드는 탭 하나만 `--al-ink` 로 이탈시켰고 마커·폼 라벨·표 헤더는 그대로 — 토큰 값을 바꾸면 계기판층과 갈리므로 두 층을 함께 보는 별도 라운드가 필요하다
2026-08-20 | LOW | .claude/plans/alert-console-redesign-r3.plan.md | `알림 종류`·`renderSetting` 의 `<label>` 이 `AlertInfo` 트리거(`?자세히`)를 감싸고 있어 체크박스의 **접근가능한 이름에 툴팁 트리거 문구가 섞인다**. 팝오버 본문은 포털로 빠지지만 트리거 텍스트는 남는다 — 라벨 구조 재편이 필요하고 이번 범위 밖
2026-08-20 | LOW | .claude/plans/alert-console-redesign-r3.plan.md | 이 backlog 파일은 표 헤더(`| Date | Severity | Source plan | Finding |`)가 없어 평문 행이 mccp 소비자(`derive/sources/backlog.js`)에 **전건 비가시**다. 헤더 도입은 기존 30+ 행의 형식을 함께 바꿔야 해 별도 판정
2026-08-21 | HIGH | .claude/plans/alert-console-redesign-r3.plan.md | **배포 구분 fail-closed 경계가 0개다.** r2 `UI14` 가 환경 라벨을 게이트까지 제거하면서 `configuration.ts` 의 `alert.envLabel`(빈 값이면 무발송) · `alert.service.spec.ts` 의 D4 단언 · `alert-monitor.ts:465` 의 `stopped` 사유가 함께 사라졌고 현재 `apps/api/src` 에 `envLabel` 0건이다. 남은 fail-closed 는 `webhookHostAllow`(어느 호스트냐)와 `activeChannelCount===0`(보낼 곳이 있냐)뿐이라 **stg/prod 를 가르는 축이 없다** — stg 설정에 운영 웹훅 URL 이 들어가면 그대로 나간다. `UI14` 는 "라벨을 지워라" 에 답한 것이지 "경계를 없애라" 에 답한 것이 아니다. 라벨이 아닌 축(배포 식별 지문 · 채널 네임스페이스 등)으로 복원하는 별도 라운드가 필요하다. 출처 Plan-Codex R2 F1 (conf 0.99, 사실 관계 대조 완료)
2026-08-21 | MEDIUM | .claude/plans/alert-console-redesign-r3.plan.md | ~~게이트의 `css_block` awk 가 `@media`·중첩 규칙을 오인하지만 전부 fail-closed 라 미수정~~ — **이 판정은 틀렸고 R4 에서 닫혔다.** `@media (…) { .alert-pages { --al-ink: … } }` 재정의 사본이 게이트 `#8` 을 `al=9 tm=9` 로 **통과**시키는 fail-OPEN 이었다(실측 exit 0). CSS 파서 도입은 INV1 위반이라, 파서 대신 파일 전역 선언 수와 게이트가 훑은 블록 합을 대조하는 트립와이어를 넣어 시야 부족 자체를 exit 1 로 만들었다. 남은 잔여는 없음. 기록 목적으로 남긴다 — 추론으로 "fail-closed 다" 라고 적고 실행하지 않은 것이 원인이었다. 출처 Plan-Codex R3 F2 → R4 F2 (conf 0.99)
2026-08-21 | LOW | .claude/plans/alert-console-redesign-r3.plan.md | 게이트 `#13` 의 `count_occurrences` 는 **주석 안의 언급까지 센다** — 픽스처에서 `// <AlertTipHost />` 주석 한 줄이 `hostUse=2` 를 만들어 정상 구현을 실패시켰다. r2 게이트 `#8` 에서 이미 같은 축이 관측됐고(위 2026-08-20 행) 같은 파일군의 `#1` 계열과 규약이 갈린다. 주석 제거 헬퍼를 게이트 공통으로 넣는 것은 기존 검사 전체의 카운트 기준선을 함께 바꾸므로 별도 판정
2026-08-21 | MEDIUM | .claude/plans/alert-console-redesign-r3.plan.md | react-tooltip 의 `disableStyleInjection` 은 **모듈 전역 플래그**(dist `b={core:!1,base:!1}`)라 화면 단위로 못 막는다. 앱 안의 다른 `Tooltip`(`widgets/DataTable.tsx`)이 먼저 마운트하면 라이브러리 기본 스타일이 `head` 끝에 주입되고, 그 뒤로는 어느 화면이 어떤 prop 을 주든 소용이 없다. r3 는 겹치는 선언 3종을 `.al-tip-pop.al-tip-pop`(0,2,0)으로 올려 국소 해소했지만, 저장소의 다른 react-tooltip 사용처는 전부 같은 취약점을 갖는다 — 전역으로 닫으려면 앱 진입점에서 한 번 주입을 끄고 CSS import 순서를 규약화해야 하며 그건 이 라운드 범위 밖이다. 출처 Implement-Codex R1 F2 (conf 0.95, 렌더 실측 확정)
2026-08-21 | MEDIUM | .claude/plans/alert-console-redesign-r3.plan.md | mccp design-grounding 하네스가 **서브모듈 변경을 못 본다.** `impeccable-detect.js` 도 Phase 2.5.5b 라우팅도 부모 저장소의 `git diff --name-only HEAD` 를 읽는데, 이 저장소의 UI 코드는 전부 `insuniverse-admin` 서브모듈 안이라 gitlink 한 줄로만 보인다 — 순수 리디자인 라운드에서도 `design_signal=false` · `renderingSurface=0` 이 나와 Phase 3.6/3.7 이 통째로 no-op 이 된다(r3 에서 실측). `MCCP_DESIGN_INTENT_REASON` 감사 우회는 트리거만 켜지 탐지 시야를 못 넓힌다. 서브모듈 diff 를 포함하는 탐지가 필요하고 그건 mccp 본체 축이다
2026-08-21 | MEDIUM | insuniverse-server apps/api/src/modules/alert/alert.entity.ts | `DEFAULT_SCHEDULE_EXPECT` 15종의 기대주기가 **EventBridge 실설정과 대조된 적이 없다** — 값의 출처는 각 스케줄러 파일 헤더 주석의 "동작주기" 하나이며 그 사실이 상수 주석에 적혀 있다(PRD Q8 미해소). 주석이 "확인필요"인 `delete-analysis`·`delete-fc` 는 하루로 두었는데, 기대주기를 길게 잡는 것은 **미탐 방향**이라 배포 직후 오탐 폭주는 안 만들지만 그 두 스케줄러가 실제로 죽어도 최대 2일(= 기대주기 × `alert_stale_grace`)까지 침묵한다. 임계 = 기대주기 × 배수라 이 표가 틀리면 `schedule-heartbeat` 전 항목의 판정이 함께 틀어진다. 닫으려면 EventBridge 규칙 15종의 `ScheduleExpression` 을 실조회해 표와 대조하고 어긋난 항목을 `alert_schedule_expect` 로 정정해야 한다 — 설정이라 재배포는 불필요하다. 기존 backlog 의 `alert_poll_interval_ms`(2026-08-18 HIGH) 와 A3 grace 초기값(2026-08-10 HIGH) 은 각각 다른 축이며 이 행은 **기대주기 표 자체의 미대조**를 가리킨다 (사용법 정리 2026-08-21 §9-5)
2026-08-21 | MEDIUM | insuniverse-admin src/pages/Admin/Site/Alert/AlertTestPage.tsx | 테스트 발송의 **레거시 전역 목적지(`testTargets.legacyGlobal`) 축은 도달성이 미검증**이다 — 화면이 `옛 전역 목적지 … (표시 전용 · 발송하지 않음)` 으로 적고 실제로 보내지 않는다. 이유는 운영 경로에서 그 URL 의 발송 여부가 **발화한 경고의 종류 문자열**에 걸려 발화 없이는 재현할 수 없기 때문이며, 그래서 이 화면이 답하는 질문("이 종류의 경고가 실제로 어디로 가는가")에 이 축만 답이 없다. 관리자가 전역 행 발송 성공을 "모든 목적지 도달"로 읽으면 그 축이 조용히 빠진다. `treat-monitor` 가 유일한 레거시 URL 축이므로 영향 범위는 그 규칙 한 종이다. 닫으려면 `sendTest` 가 레거시 후보를 실제 목적지로 포함하거나(운영 라우팅과 같은 소스로), 최소한 그 URL 이 §URL 검증 5조건을 통과하는지만이라도 발송 없이 판정해 화면에 적어야 한다 (사용법 정리 2026-08-21 §9-4)
2026-08-21 | LOW | .claude/plans/alert-console-redesign.gate.sh | `sendtest` 안전 계약 게이트가 **기대값 자체의 정당성을 못 본다** — 게이트가 스스로 `sendtest-contract blind-spot=expected-values-unverified` 를 출력한다. 계약 7종(교집합·라벨 fail-closed·사유 코드 8종·미등록 ruleId 거부·unknown-hint 사전 차단·목적지 URL 정확 일치·legacyGlobal 원문 미노출)은 구현이 기대값과 같은지만 보고, 그 기대값이 운영에서 옳은 목적지 집합인지는 어느 검사도 보지 않는다. 층위 7(검사 자신에 대한 주장에 검사가 있는가)에 해당하며 게이트가 사각지대를 출력에 드러내는 것까지가 현행 상한이다. 닫으려면 기대값을 자기 단언이 아니라 외부 기준(운영 `destinationsFor` 재실행 결과와의 집합 대조)으로 세워야 하고, 그것은 backlog 2026-08-19 `destinationsFor` 단일 trace 재구성과 같은 선행 조건을 갖는다 (사용법 정리 2026-08-21 §9-6)
2026-08-21 | MEDIUM | insuniverse-admin package.json | admin `npm run lint` 이 **사전 파손 상태**라 알림 화면 세 라운드(r1·r2·r3) 게이트 전부에서 제외됐다 — r1 리포트가 "admin `npm run lint` 가 사전 파손 상태라 계획서 §Risks 가 제외했다" 로 명시한다. 그 결과 admin 쪽 정적 검증은 `tsc --noEmit` 하나뿐이고, 타입이 통과하는 규약 위반(미사용 변수·hook 의존 배열·`react-refresh/only-export-components`)은 어느 게이트도 안 본다. r3 에서 변경 2파일에 `eslint` 를 **직접 지정해** 돌린 선례가 있으므로(0 errors · 경고 2건) 파손은 저장소 전역 실행 경로에 있고 파일 지정 실행은 된다. 닫으려면 `npm run lint` 스크립트/설정을 고치거나, 최소한 알림 디렉터리 한정 lint 를 게이트에 넣어야 한다 (사용법 정리 2026-08-21 §9-8)
2026-08-21 | LOW | insuniverse-server tsconfig.json | 서버 `tsc --noEmit` 이 **비알림 사전 파손 19행을 상시 낸다**(`agency` · `medication-standard` · `libs/hyphen` · `libs/octover` spec 4파일) — 그래서 게이트는 전체 0건을 요구하지 못하고 "알림 모듈 error 0행" 으로 범위를 좁히며 그 제외 구간을 출력에 적는다(`server-tsc alert-errors=0 other-errors=19`). 이 상태에서 `tsc` 종료코드는 항상 **2**(진단 있음)라 종료코드 기반 가드는 알림 모듈의 신규 오류와 사전 파손을 구별하지 못한다 — r1 에서 실제로 `case 0|1)` 가드가 어떤 구현도 통과시킬 수 없는 상태였고 실측 3방향으로 고쳤다. 사전 파손이 19행에서 더 늘어도 게이트는 그 사실을 숫자로만 적고 세우지 않는다. 닫으려면 4파일을 고쳐 전체 0건으로 만들거나, `other-errors` 를 골든 동결해 증가를 exit 1 로 만들어야 한다 (사용법 정리 2026-08-21 §9-9)
2026-08-21 | MEDIUM | insuniverse-server apps/api/src/modules/alert/alert.entity.ts | 콘솔 카탈로그의 `alert_poll_interval_ms` **설명 문구가 성립하지 않는 보장을 관리자에게 단언한다** — `description: '알림 판정을 이 간격으로 돌립니다. 통보 지연의 하한이 이 값입니다.'` 인데 실제 기동은 EventBridge 고정 5분이고 이 값의 유일한 런타임 소비처는 `alert.service.ts:895` 의 미전달 억제 엔트리 재시도 창 하나다. 행동 축은 2026-08-18 HIGH 행이 이미 잡고 있으나 **그 행이 등재된 뒤 이 브랜치가 새로 추가한 것이 이 문구**이고, 화면이 저장에 성공한 값을 "판정 주기"로 되읽어 주므로 장애 대응자가 존재하지 않는 지연 보장을 신뢰하게 된다. 닫는 방법은 두 갈래이며 행동 축과 독립이다 — 런너를 설정 구동으로 바꾸거나(2026-08-18 행), 그게 안 되면 이 설정의 label·description 을 실제 의미인 "미전달 재시도 창"으로 개명하는 것이다. 후자는 서버 상수 한 줄이라 이월 비용이 작다 (PR-Codex 2026-08-21 F2 — 재제기, 문구 축은 신규)

## insuniverse-docs-11-index-code — 마일스톤 5 (5a·5b 분할)

2026-08-11 | MEDIUM | `insuniverse-docs-11-index-code-m5a.plan.md` | skip 증거 비교 키가 `token` 누락과 명시적 `null` 을 같게 직렬화한다 — bucket 별 판별 공용체 검사(`Object.hasOwn` 요구 · 선언은 비지 않은 문자열 · 미해석은 명시적 `null` · `channel`/`form` 상호배타 · 잉여 키 거부)로 닫을 것. 구현 단계 `--selftest` 소관
2026-08-11 | MEDIUM | `insuniverse-docs-11-index-code-m5b.plan.md` | 위와 같은 결함이 5b 3자 대조에도 있다 — 같은 처방을 양쪽에 적용
2026-08-11 | MEDIUM | `insuniverse-docs-11-index-code-m5a.plan.md` | 분할 후에도 두 계획이 각각 300~400행이고 픽스처 전수를 superseded 통합 계획에서 참조한다 — 픽스처를 계획 문면이 아니라 `--selftest` 코드에 두고 계획은 범주만 적는 쪽이 맞다. 구현 단계 결정
2026-08-11 | LOW-MED | `insuniverse-docs-11-index-code-m5a.plan.md` | PRD 선행 개정의 **기계 검사는 철회**됐다(7판 전부 홀). 리뷰 항목으로 남았으므로, 구현 착수 전 리뷰어가 소유 절의 항목 4개 · `id` 계약의 긍정문 · 5a/5b 행의 Plan·Status·Outcome 온전성 · `git log --reverse` 커밋 순서를 눈으로 확인할 것

2026-08-11 | **HIGH · 흡수됨(santa R1)** | `insuniverse-docs-11-index-code-m5a.plan.md` | 블록 스칼라를 **물리적 행별**로 스캔하면 CI 호출을 거짓 확정한다 — `if false; then` 다음 행의 `npm test` 가 단독 명령으로 분류되고, `run: >` 는 YAML folding 으로 두 행이 한 명령으로 접히는데 각각을 명령으로 세면 오인한다. 처방: 스칼라 스타일을 보존해 `|` 본문 전체와 `>` 의 folding 결과 전체를 `single_simple_command` 에 넘기고, 안전 해석 불가면 `shell_reachability_unresolved` 로 낮춘다. 픽스처: 다중행 false-if · folded echo. **오늘 실측 CI 호출 0건이라 현재 값에는 영향 없음**(전 행 `in_ci: null`). → **흡수 완료**: m5a Task 2 `입력 단위` 절 + 픽스처 (A22)(A23) + Acceptance 1행, m5b Task 1 블록 스칼라 절 + Acceptance 1행
2026-08-11 | **HIGH · 흡수됨(santa R1)** | `insuniverse-docs-11-index-code-m5a.plan.md` + `-m5b` | `runner: none` 행에 합법적 `selection_basis` 가 없다 — 어휘가 `config_pattern`/`runner_default` 둘뿐인데 5b 는 러너 미발견 시 `runner: none` 행을 만들게 해, 테스트 파일은 있고 러너 설정은 없는 저장소에서 근거를 지어내거나 추출을 실패시켜야 한다. 처방: `runner_absent` 값 추가 + 설정 앵커 nullable + 상태 매핑 강제 + 해당 selftest. **어휘 표와 5b 소비 지점을 함께 고치는 계약 변경** — 양쪽 동시 편집 규칙 적용. 현재 admin 0파일이라 실측에 안 드러났을 뿐 구조는 박혀 있다(발견 1d). → **흡수 완료**: m5a 어휘 정본 표 `selection_basis` 3값 + Task 3 상호 강제 절 + 픽스처 (A24)(A25) + Acceptance 1행, m5b Task 1 러너 판정 + Acceptance 1행

2026-08-11 | MEDIUM | 두 계획 | Acceptance 86항목 중 최소 15개가 **소스 리뷰로만 판정되는 항목**인데 개별 `[REVIEW]` 태그가 없다 — 이번 라운드는 두 계획 Acceptance 서문에 그 부류를 선언하는 것으로 닫았다. 항목별 태깅과 기계화 가능한 부분(import 그래프 · 금지 파일 목록) 분리는 구현 단계 결정 (santa R1 · D1)

### santa-loop 종료 기록 — 2026-08-11 · R1

- **구성**: Reviewer A·B 모두 `codex exec` / `gpt-5.6-sol` / `model_reasoning_effort=xhigh`, 컨텍스트 격리 + **렌즈 분리**(A: 5a↔5b 인터페이스 드리프트와 계획 내부 자기모순 / B: fail-closed 와 반증가능성). **모델 다양성은 확보하지 못했다** — 이 세션은 Agent 도구 금지(UI7)이고 서브에이전트 모델도 haiku 로 고정돼 있어, Claude 쪽 리뷰어를 세우면 렌즈 분리보다 얻는 것이 적었다.
- **결과**: A = BLOCKING 5 · DEFERRABLE 1 → 전건 흡수. B = BLOCKING 7 · DEFERRABLE 1 → BLOCKING 전건 흡수, D1 은 위 이월.
- **자체 발견 1건**: H1 흡수가 "블록 스칼라는 `unsupported_constructs` 에 안 들어간다" 와 충돌 → YAML 층 미지원과 셸 층 도달성으로 갈라 적었다. B1 도 H2 흡수가 만든 새 구멍(`selected_by_runner: false` 가 확정 음성을 발행)이었다.
- **종료 판정**: 두 렌즈가 낸 BLOCKING 12건이 **전부 문서를 고쳐야 착수 가능한 부류**였고 전부 닫혔다. 남은 지적은 구현 단계 `--selftest`/리뷰에서 닫히는 DEFERRABLE 뿐이다. 계획 단계 루프는 여기서 멈춘다 — 다음 라운드의 실질은 구현 없이는 더 나오지 않는다.

### 마일스톤 5 이전 이월분 (통합 계획 R1~R21)

2026-08-11 | — | `insuniverse-docs-11-index-code-m5.plan.md` (SUPERSEDED) | 케이스 단위 행 — 안정된 케이스 id 를 만들 수단이 없다. M6 이 조인에서 막히면 근거를 갖고 다시 연다
2026-08-11 | — | 동 | 테스트↔정책/생산 심볼 연결 — import 해석 + assertion 분석이 필요한 새 축이고 PRD Scope 밖
2026-08-11 | — | 동 | CLI 선택자→파일 집합 해석기 — 오늘 러너 호출이 0건이라 입력이 없다. 실제 호출이 생기면 연다
2026-08-11 | — | 동 | manifest 에 제3자 액션 참조 등록 — 등록되면 `ci_status` 를 `not_invoked` 로 확정할 수 있다(현재는 `undetermined`)

### 미결 — 사용자 결정 대기

2026-08-11 | 결정필요 | `insuniverse-docs-11-index-code-m5b.plan.md` | PRD Outcome("S등급 근거의 **실제 유효성**이 확인됨")이 정적 인덱스로 달성되지 않는다. 세 갈래(A: Outcome 개정 / B: 런타임 검증을 별도 산출물로 추가 / C: 3저장소 CI 에 테스트 스텝 추가) 중 선택 전까지 마일스톤을 `complete` 로 넘기지 않는다
2026-08-11 | 사실 | 3저장소 체크아웃 | site HEAD 가 manifest 와 어긋나 있고(`ed183ca6` vs `b9a90a42`) admin 작업트리에 `package.json` 수정본이 있다. 5b 의 입력 리비전 게이트가 착수 시 이것을 차단한다 — 착수 전에 체크아웃을 manifest 리비전으로 맞출 것
2026-08-12 | MEDIUM | .claude/plans/insuniverse-docs-11-index-code-m5a.plan.md | `invocation_script` has no type, no null rule, and no deterministic choice when more than one package script reaches the runner (santa-loop R3 reviewer B)
2026-08-12 | MEDIUM | .claude/plans/insuniverse-docs-11-index-code-m5a.plan.md | `defined_in` is mandatory and must pass `checkAnchor`, but neither plan says which source occurrence or token supplies that single anchor (santa-loop R3 reviewer B)
2026-08-12 | MEDIUM | .claude/plans/insuniverse-docs-11-index-code-m5a.plan.md | branches 3 and 4 of the `invocation_discovery` ladder both yield `undetermined` with no fixture pinning that the residue-empty vs residue-present distinction survives into the output (santa-loop R3 reviewer A)
2026-08-12 | MEDIUM | .claude/plans/insuniverse-docs-11-index-code-m5a.plan.md | `meta.entry_count` never says whether it counts the meta line, so the gate mode's `entry_count` and the meta field can legitimately differ by one (santa-loop R3 close-out key audit)
2026-08-13 | HIGH | .claude/plans/insuniverse-docs-11-index-code-m5a-fix.plan.md | 재사용 워크플로 call site 가 anchor 기반 `invocations[].id` 에서 충돌한다 — 같은 로컬 재사용 워크플로가 서로 다른 `if:` 로 두 번 불리면 내부 `run:` 이 같은 앵커에 다른 reachability·잔여를 갖는다. 앵커 **형식**(`verify-code-index.mjs` 소유)을 열어야 풀리므로 5b 소유 후속 계획의 필수 선행 (Implement-Codex R1 F1 = 계획 R8)
2026-08-13 | HIGH | .claude/plans/insuniverse-docs-11-index-code-m5a-fix.plan.md | `rescanInvocations` 탐색 범위가 5b 생산자 범위를 못 덮는다 — 재사용 워크플로 재귀 추적과 action `file:` 입력으로 고르는 Dockerfile 이 빠진다. 지금은 집합 대조가 그 `id` 를 지목해 fail-closed 로 떨어지지만, 5b 가 그 경로를 켜는 순간 정상 문서가 거부된다. F1 과 같은 편집에서 함께 닫을 것 (Implement-Codex R1 F4 부분)
2026-08-13 | MEDIUM | plugins/mccp/scripts/lib/plan-conflict-detector.js | `Files to Change` 표를 읽을 때 셀의 백틱을 안 벗긴다 — 계획이 `` `docs/x.mjs` `` 로 적으면 diff 의 `docs/x.mjs` 와 절대 안 맞아 **계획대로 고친 파일 전부가 `file-expansion` 으로 뜬다**. 실측: 백틱 붙인 경로를 넘기면 같은 입력이 `conflict:false`. 오탐이 정당한 작업을 멈추므로(모듈 자체 주석의 보수 원칙 위반) 정규화 필요
2026-08-14 | HIGH | .claude/plans/insuniverse-docs-11-index-code-m5a-fix-2.plan.md | parseDockerfileRuns 는 물리 행 파서다 — 선행 지시어의 연속행이 유령 RUN 호출을 만들고, 대소문자 다른 'Run' 과 소문자 파일명 'dockerfile'(insuniverse-server/apps/api/dockerfile 실재)은 통째로 안 읽힌다. 논리 명령 파서로 바꾸면 5b 생성기가 같은 편집을 요구한다(UI6)
2026-08-14 | HIGH | .claude/plans/insuniverse-docs-11-index-code-m5a-fix-2.plan.md | wire 가 클램프 전 select 를 안 실어 run_in_ci 를 그것을 낸 호출에 결속할 수 없다 — anchors[] == invocations[].id 집합 동일성은 '모든 호출에 앵커가 있다' 만 증명한다. 어느 행에도 양성을 못 주는 resolved 호출로도 기존 resolved·unblocked 존재 검사와 함께 만족된다. 결속하려면 계약이 클램프 전 select 를 실어야 한다(계약 변경)
2026-08-14 | HIGH | .claude/plans/insuniverse-docs-11-index-code-m5a-fix-2.plan.md | D-2 논리 파서 spec 이 Dockerfile `# escape=` 대체 escape 문자와 heredoc(`COPY <<EOF` … `EOF`) 범위를 정의하지 않는다 — 그 안에서 물리적으로 `RUN ...` 로 시작하는 행을 새 지시어로 오인해 유령 호출이 난다. 정본 파서를 양쪽이 공유하므로 parity·anchor·container_observation 이 같이 틀린다. 손으로 센 oracle(server apps/api/dockerfile)은 backslash 연속행만 덮는다. **구현 시 파서에 넣고 픽스처로 고정할 것**
2026-08-14 | MEDIUM | .claude/plans/insuniverse-docs-11-index-code-m5a-fix-2.plan.md | `container_workdir_unresolved.detail` 이 stage 초기화를 안 해 이전 stage 의 `WORKDIR /old` 를 새 `FROM` 이후 호출의 관측값으로 발행할 수 있다. `detail` 은 좌표가 아니라 관측 기록이지만 확보하지 못한 값을 싣는 것은 UI3 위반이다. **구현 시 `FROM` 에서 wd 를 리셋하고 부재는 `"unknown"`** (한 줄)
2026-08-14 | MEDIUM | .claude/plans/insuniverse-docs-11-index-code-m5a-fix-2.plan.md | D-4b 이름-only sweep 의 **우주**가 열거 우주와 비대칭이다 — 검증기는 `walkFiles` + `EXCLUDE_GLOB`(node_modules·dist·build·coverage·.next·out·.turbo·.cache) 로 가지치기하는데 생성기는 `git ls-files` 라 가지치기가 없다. tracked `build/Dockerfile` 은 생성기엔 보이고 sweep 엔 안 보여 "선언 안 된 결손" 검사가 그 경로에서 공허해진다. 실측 적중 0건(세 저장소의 tracked dockerfile* 셋 다 제외 디렉터리 밖)이라 이번 마일스톤에서 닫지 않는다. 우주를 넓히면 untracked 빌드 산출물이 거짓 error 를 내므로 답은 "sweep 우주를 열거 우주에 맞추기" 이고 그것은 검증기의 파일 열거 계약 변경이다 (Implement-Codex R1 F3)

## insuniverse-docs-11-index-code — 마일스톤 6a (정책 후보 통합)

2026-08-18 | MEDIUM | `insuniverse-docs-11-index-code-m6-r12.plan.md` | 산출물 두 개가 원자적으로 커밋되지 않는다 — `writeDocs`(build-code-index.mjs)의 commit 단계가 rename 을 **순차**로 돌아, 두 rename 사이에 읽는 소비자는 섞인 쌍을 보고 그 사이 프로세스가 죽으면 그 상태가 영구히 남는다. rollback 은 잡힌 동기 예외만 다룬다. **판정기를 돌리면 검출된다** — id 집합이 갈린 쌍은 `meta.sibling.set_sha256`, 입력이 갈린 쌍은 `meta.inputs[].sha256`, id 집합이 같고 payload 만 다른 쌍은 검사 (l)(`CANONICAL_PAYLOAD_FIELDS` 전수 재계산)과 `meta.gap` 재렌더 대조가 잡는다. 입력·코드가 같으면 생성이 결정적이라 찢어진 쌍이 애초에 바이트 동일이다 (code-review 2026-08-18 — 초판이 적었던 "`gap`·`status` 만 바뀐 재생성" 잔여는 그래서 성립하지 않는다). **남는 잔여는 소비자 쪽이다**: 판정기를 안 돌리고 두 파일을 직접 읽는 소비자에게는 어느 검사도 걸리지 않고, 프로세스가 두 rename 사이에서 죽으면 그 섞인 쌍이 영구히 남는다. 처방은 버전 디렉터리 + 포인터 원자 교체 또는 트랜잭션 마커이고, `writeDocs` 는 마일스톤 1 소유의 공용 자산이라(다른 축 6종이 이미 쓴다) 고치면 계약 변경이다 — 계획 「계약 변경 규칙」대로 별도 correction 마일스톤 (Implement-Codex R2 F6)
2026-08-18 | HIGH | .claude/plans/insuniverse-docs-11-index-code-m6b.plan.md | Task 3 selftest·Task 4 --report 가 아직 `--allow-fs-read='*'` 를 쓴다 — 그 권한으로 `.git/logs/HEAD` 를 읽을 수 있음이 실증됐고 Acceptance 의 "와일드카드면 FAIL" 과 모순. 래퍼 정의를 한 곳에 두고 모든 호출을 파생시킬 것 (Plan-Codex R11 F0)
2026-08-18 | HIGH | .claude/plans/insuniverse-docs-11-index-code-m6b.plan.md | 최소권한 selftest 가 OS 임시 디렉터리를 못 써 `ERR_ACCESS_DENIED` 로 시작부터 실패한다 — Validation 블록이 현재 문면대로는 완주 불가. 모든 selftest 호출에 `--selftest-dir ./docs/_meta/index/.selftest` 같은 허용 scratch 명시 (Plan-Codex R11 F1)
2026-08-18 | HIGH | .claude/plans/insuniverse-docs-11-index-code-m6b.plan.md | main 병합이 테스트 축 행 번호 앵커 2개를 끊었다 — `.claude/meta/05-final-spec.md` 에 113행이 들어가며 `meta/05-final-spec.md:168`(`항목`) → 242, `:172`(`skip`) → 246 으로 밀렸다. `build-tests.mjs:139,141` · `verify-tests.mjs:152,153` · 산출물 `tests.jsonl` 의 `meta.s_grade_rule.{rule_anchor,not_source_wide_anchor}` 3파일 재핀 필요. 반사실 확인: 병합 전 `0e3c9dc` 의 168·172 는 요구 토큰을 담고 있었다. 소유는 마일스톤 5b 이고 6b Files to Change 밖이라 6b 는 이 축을 상류 게이트에서 분리하고 진행한다 (사용자 결정 2026-08-18 — 범위 밖은 backlog 후 진행). **근본 원인은 행 번호 핀 자체다** — 남의 PRD 파일이 움직이면 언제든 또 끊긴다. 내용/헤딩 기반 앵커로 교체하고 `00-protocol` 에 회부할 것
2026-08-18 | MEDIUM | .claude/plans/insuniverse-docs-11-index-code-m6b.plan.md | 계획 Validation 의 상류 판정기 루프가 `verify-tests.mjs` 를 인자 없이 부른다 — 그 파일은 모드 플래그가 없으면 usage 를 내고 exit 1 이라 **원리적으로 통과하지 못한다**. 테스트 축 정식 게이트는 `check-tests-crosscheck.mjs --repos-root <루트> --report <report.json> --jsonl docs/_meta/index/tests.jsonl` 이고 report 는 `build-tests.mjs --repos-root <루트> --report --json` 이 낸다(쓰기 없음). 하네스 문면을 마일스톤 착수 전에 검증하지 않은 자리
2026-08-18 | HIGH | .claude/plans/insuniverse-docs-11-index-code-m6b.plan.md | 계획 Task 1 의 전제가 실측과 다르다 — `env-gates.yaml` 재생성은 15종이 아니라 **13종**을 낸다. `RUN_MODE` · `SCHEDULER_TYPE` 은 코드 축 스캔 우주(manifest `repos[].src_roots` 아래 `.ts/.tsx`) **밖**이고 컨테이너·CI 선언 파일에서만 선언·독출된다 (`insuniverse-server/apps/api/dockerfile:37-41` ENV/CMD 분기 · `.github/workflows/api.yml:126,226`). 6a `env-gates.yaml` gap 이 "넷 다 코드에 실재(각각 4·4·1·1 파일)" 라고 적은 것은 이 우주 밖 파일까지 센 것이다. 따라서 `verify-policy-values.mjs:471` 하한이 이 2종을 계속 막고 판정기 종료코드가 1 로 남는다. 닫으려면 **생성기와 판정기의 독립 재스캔 우주를 함께** 넓혀야 하며(3자 대조가 한쪽만 넓히면 갈린다) `verify-policy-values.mjs` 는 6b Files to Change 밖이고 우주 정의는 manifest(00-protocol) 소유다. 컨테이너 논리 명령 파서는 마일스톤 5a-fix-2 가 이미 만들었으므로 재작성하지 말고 재사용할 것. 6b 는 이 축을 상류 게이트에서 분리하고 진행한다 (사용자 결정 2026-08-18)
2026-08-18 | HIGH | .claude/plans/insuniverse-docs-11-index-code-m6b.plan.md | Implement-Codex R2 F1 — 생성된 `env-gates.yaml` 이 자기 정본 판정기(`verify-policy-values`)를 통과하지 못한 채 출하된다. 원인은 위 항목(스캔 우주 밖 2종)과 같고 처방도 같다. 재출하 전에 우주 확장 또는 manifest 규약 개정 중 하나가 선행돼야 한다 — findings §2 (g) · 이월 14
2026-08-18 | HIGH | .claude/plans/insuniverse-docs-11-index-code-m6b.plan.md | 마일스톤 6b 출하가 security-reviewer 미실행 상태로 나간다 — implement-codex receipt 의 `meta.security_skipped=true` 가 `/mccp:pr` 를 hard-block 했고, 그 receipt 는 git-tracked 라 제자리 재발급이 `TRACKED_RECEIPT_OVERWRITE` 로 막힌다. 사용자 결정(2026-08-18: 릴리스 우선, 후속 수정)에 따라 **새 슬러그 `insuniverse-docs-11-index-code-m6b-ship`** 로 plan/implement 두 receipt 를 재앵커하고 security 축을 `security_force_override`(감사 escape, blocking → warning)로 기록했다. 원본 m6b receipt 2종은 손대지 않았다. 부수 효과 2건: (1) plan-codex 는 intent 게이트가 CLI 표면이 없어 `MCCP_SKIP_INTENT_GATE` 감사 override 를 썼고 `intent_gate_verdict=incomplete` 가 봉인됐다 — cross-gate dedupe 는 계속 fail-closed 다. (2) 새 슬러그에 대응하는 계획 파일이 없어 `/mccp:pr` 의 2.5.8·2.5.9 는 `PR_PLAN_PATH=.claude/plans/insuniverse-docs-11-index-code-m6b.plan.md` 없이는 stale 로 HALT 한다(무설정 실측: stale 2건). **후속 필수**: security-reviewer 서브에이전트를 실제로 돌려 4개 표면(경로 처리·gitdir 권한 경계·자식 프로세스·신뢰 경계) 수동 점검 결과를 대체하고, 그때 다시 새 슬러그로 재앵커할 것
2026-08-18 | MEDIUM | .claude/plans/insuniverse-docs-11-index-code-m5a-fix-2.plan.md | Phase 3.1 HISTORY-leak 게이트가 잡은 실제 leak 1건 — Validation 셸 fence 319행이 `cd C:/Users/<user>/_projects/insuniverse-temp/.worktrees/index-code` 로 로컬 절대경로(사용자명 포함)를 담고 있었다. 작업트리에서 `<repo-worktree-root>` 플레이스홀더로 치환했으나 **조상 커밋의 blob 은 그대로 남아** 게이트는 여전히 실패한다(스캔 대상이 `origin/main..HEAD` 전체 blob). 사용자 결정(2026-08-18: PRIVATE 저장소 + 같은 경로가 이미 origin/main 4개 파일에 존재 + 게이트 실패의 5/6 이 오탐)에 따라 게이트를 무시하고 push 했다. **부작용**: 종료된 마일스톤 `insuniverse-docs-11-index-code-m5a-fix-2` 의 plan 본문이 봉인 후 변경돼 그 plan-codex·implement-codex receipt 2종의 `plan_hash` 가 stale 이 된다 — 닫힌 마일스톤이라 재검증 대상은 아니다. **후속**: 계획서 Validation fence 에 절대경로를 쓰지 않는 규약을 `00-protocol` 에 넣을 것
2026-08-18 | HIGH | scripts/lib/history-leak-scan.js (mccp 1.27.2 하네스) | Phase 3.1 leak 스캐너가 **submodule gitlink 를 leak 으로 오탐**한다. `insuniverse-admin`(7df733a5) · `insuniverse-server`(c7597fc7) · `insuniverse-site`(b9a90a42) 는 트리 모드 `160000` 인데 스캐너가 superproject 에서 `git cat-file -t <submodule-sha>` 를 돌려 `could not get object info` 로 죽고, 그 실패를 `pattern=scan-error` leak 으로 계상한다. 이번 실행에서 leak 6건 중 **5건이 이 오탐**이었다(실제 1건). 서브모듈을 쓰는 이 저장소에서는 게이트가 **영구 fail-closed** 라 어떤 PR 도 통과 못 한다. 처방: 스캐너가 blob 스캔 전에 트리 모드를 확인해 `160000` 을 건너뛸 것. 오탐이 실제 leak 을 가리는 게 더 큰 위험이다 — 5:1 비율이면 운영자가 게이트 출력을 읽지 않게 된다
2026-08-11 | MEDIUM | .claude/plans/insuniverse-docs-13-relation-contract-m1.plan.md | Task 1 step 4 의 롤백이 비대칭이다 — `git checkout -- docs/_meta/ownership.md` 는 파일 전체를 인덱스에서 복원하므로 step 3 이 방금 세운 §개정 위임 절과 무관한 미스테이지 작업까지 지우고, 우산 PRD 의 제약 #6 예외는 적용된 채로 남아 인가가 절반만 설치된 상태가 된다. 스테이징 여부에 따라 결과도 달라져 결정적이지 않다. 조치: 두 파일의 편집 전 상태를 먼저 캡처하고 불일치 시 해당 패치만 역적용하거나 두 파일을 원자적으로 함께 복원. whole-file checkout 앞에 clean index/worktree 가드. 발동 조건은 "진단이 예상과 다를 때" 하나뿐이라 M1 실행 시 관측되면 그때 처리한다. 소유 `13-relation-contract` — CLOSED-BY-DECISION 2026-08-21: M1 종료로 그 롤백 경로 자체가 소멸했다. 지금 `git checkout -- ownership.md` 를 부르는 자리가 없고, 되살리는 것은 끝난 마일스톤의 Task 본문을 고치는 일이다
2026-08-12 | HIGH | .claude/plans/insuniverse-docs-13-relation-contract-m1.plan.md | 위임 표 `승인` 열이 임의 비공백 문자열이면 통과한다 — 승인 provenance 를 위조 불가 artifact 에 묶을 것. UI11 의 재검토 조건(위임 PRD 2개 이상) 도달 시 처리 — OUT-OF-OWNERSHIP 2026-08-21: 인수처: UI11 재검토 조건(위임 PRD 2개 이상) 도달 시점. 승인 provenance 를 위조 불가 artifact 에 묶는 것은 gate 승격이며 UI11 이 그것을 막는다
2026-08-12 | HIGH | .claude/plans/insuniverse-docs-13-relation-contract-m1.plan.md | golden 5키 whitelist 가 키 이름만 제한한다 — `ownership.paths_sha256` 는 집계값이라 두 표를 똑같이 잘못 고치면 흡수된다. 의미 delta 검사는 M4·M5 게이트 갱신에서 — OUT-OF-OWNERSHIP 2026-08-21: 인수처: golden 의미 delta 검사를 여는 다음 창. 행이 적은 인수처(M4·M5 게이트 갱신)는 두 계획서가 동결돼 소멸했다 — 그 블록을 고치면 `plan_hash` 가 깨진다
2026-08-12 | HIGH | .claude/plans/insuniverse-docs-13-relation-contract-m1.plan.md | 위임 계약이 M1 종료 후 무감시다 — Validation 3-2 를 재사용 가능한 validator 로 추출해 후속 마일스톤이 착수 시 돌리게 할 것. UI11 은 gate 승격을 막지만 비-gate 상시 검증까지 막지는 않는다 — OUT-OF-OWNERSHIP 2026-08-21: 인수처: UI11 재검토 조건(위임 PRD 2개 이상) 도달 시점
2026-08-12 | HIGH | .claude/receipts/mccp-plan-codex/insuniverse-docs-13-relation-contract.json | 옛 슬러그 receipt 가 untracked 로 남아 있다 (head 6529042, decision 은 -m1 없는 PRD 단위). -m1 receipt 가 실제 앵커이고 validate 는 decision 으로 스코프하지만, 파일이 남아 있으면 승인 증거로 오인될 수 있다. 그 decision 소유 세션이 정리할 것 — RESOLVED-ALREADY 2026-08-21: 전제 `미추적` 이 거짓이다 — `.claude/receipts/mccp-plan-codex/insuniverse-docs-13-relation-contract.json` 은 지금 `git ls-files` 추적 대상이다(실측). 추적되면 조용히 사라지지 않고 `validate` 는 `decision` 으로 스코프하므로 승인 증거 오인 경로가 닫혔다
2026-08-12 | HIGH | .claude/plans/insuniverse-docs-13-relation-contract-m1-r2.plan.md | golden 화이트리스트가 허용 키 **안쪽**의 의미 손실을 통과시킨다 — 기존 findings 파일 삭제 + 신규 추가가 동시에 일어나면 `findings.files` 한 키만 바뀌어 `golden 변경 key 집합` 단언이 통과하고 `--update` 가 그 삭제를 정본으로 동결한다. 인수처: M4·M5 게이트 갱신. 필요한 것은 값 delta 단언(기존 항목 제거 0 · 기대 추가분 정확 일치 · `prd_count` +1) — OUT-OF-OWNERSHIP 2026-08-21: 인수처: golden 화이트리스트의 값 delta 검사를 여는 다음 창. `fixtask.findings_headings` 가 findings 방향 한 갈래는 닫았으나(`#6`) 화이트리스트 일반은 열려 있다
2026-08-12 | HIGH | .claude/plans/insuniverse-docs-13-relation-contract-m1-r2.plan.md | 하류 선행조건 split-brain — 두 표는 13 을 요구하는데 실제 소비 지점인 20~60 PRD 본문은 `10·11·12` 로 남는다. 제3의 강제 경로 후보: 오케스트레이션 preflight 가 정본 하나를 소비하게 하기(제약 #6·UI11 둘 다 회피). M1 범위 밖 — OUT-OF-OWNERSHIP 2026-08-21: 인수처: `20`~`60` 문서 PRD 착수 시점. 활성 PRD 본문에 선행조건을 쓰는 것은 우산 제약 #6 이 금지한다
2026-08-12 | HIGH | .claude/plans/insuniverse-docs-13-relation-contract-m1-r2.plan.md | 위임 권한에 M1 이후 상시 검증자가 없다 — `3-2` 여섯 단언은 일회성 plan 블록에만 있다. 제안: 6열 검사를 비게이트 재사용 검증기로 추출하고 M2~M6 preflight 가 호출. UI11 재검토 조건(위임 PRD 2개 이상) 미충족이라 보류 — OUT-OF-OWNERSHIP 2026-08-21: 인수처: UI11 재검토 조건 도달 시점. 위 `06ab55ee…` 와 같은 축이다
2026-08-13 | HIGH | .claude/plans/insuniverse-docs-13-relation-contract-m1-r2.plan.md | 위임 장부 파서가 **행 선택 술어에서 샌다** — `3-2` 여섯 단언과 `5-3` 최종 튜플이 전부 `/^\| `/`(첫 셀 백틱) 로 행을 거르므로, 첫 셀 백틱만 뺀 정상 6열 행을 8행째로 추가하면 validator 에 **아예 안 보인다**. 반증 실측: 정상 표와 공격 표가 행 수 7 · 열 수 6 · `PRD 전행 13` 7 · 승인 순서 튜플 · 경로|상태 튜플 · 5-3 레코드 수 7 **전부 동일**(실제 본문 행은 6 대 7). 열 여섯 개를 값에 묶은 R6~R14 의 작업이 전부 이 필터 뒤에 있다. 이 절은 `run_ownership_gate`·golden 범위 밖이라 다른 검사가 무단 위임을 못 잡는다 — UI2 의 제한된 개정 권한이 조용히 확대되고 UI9·UI10 의 계산 가능성이 깨진다. 조치(게이트 승격 아님, UI11 준수): `3-2`·`5-3` 이 표 본문 **전 행**(`^| ` 이고 구분자 아님)을 먼저 모아 7행·각 6열을 단언한 뒤 정본 튜플과 비교하고, 백틱 표기는 별도 단언으로 분리 — 인식 못 한 행은 무시가 아니라 실패. R16 봉인 규약(본문 불변)에 따라 defer → **해소됨: 사용자가 `/mccp:plan` 을 재진입해 R17 로 흡수했다.** `deleg_rows()` 하나가 여덟 자리의 술어를 대신하고 백틱 표기는 별도 단언. 단언 47 → 48 — CLOSED-BY-DECISION 2026-08-21: 셸 마크다운 표 파서 축 — M1-r2 9라운드에서 *"여기서 근사를 그만둔다"* 로 종결됐다. 정공법(파서 도입)은 INV1 이 막는다
2026-08-13 | MEDIUM | .claude/plans/insuniverse-docs-13-relation-contract-m1-r2.plan.md | 위임 표 `백틱 표기 7행` 단언이 **접두만 본다** — `grep -c '^| `'` 는 첫 셀 앞의 정확히 한 칸 + 여는 백틱만 세므로 (1) 첫 셀의 **닫는 백틱을 전부 지워도** 값이 7 로 통과하고 (2) 정상 행을 compact 표기 `|`owner`|…|` 로 바꾸면 최종 7×6 튜플은 동일한데 이 단언만 0 으로 **거짓 실패**한다. 경로·PRD 셀의 백틱은 아예 안 본다. 권한 영향은 없다 — owner|path·PRD·승인·사유·상태 튜플이 전부 백틱을 `gsub` 로 벗겨 표기 무관이고, 장부의 경계는 행 수·닫는 불변식이 잡는다. 조치: 셀을 trim 한 뒤 첫 셀 전체를 `^`[^`]+`\(archived\)$` 로 판정하고 구분자 주변 공백은 허용. 계약이 경로·PRD 셀 백틱도 요구하면 같은 방식으로 확장. R20 에서 MEDIUM 이라 defer(HIGH 이상만 흡수) — CLOSED-BY-DECISION 2026-08-21: 같은 축(셸 표 파서 근사). M1-r2 9라운드 판단 종결
2026-08-13 | HIGH | .claude/plans/insuniverse-docs-13-relation-contract-m1-r2.plan.md | 위임 장부 술어의 **다섯 번째 성질 — 여기서 셸 파서를 그만 깎아야 한다**. GFM 은 바깥 파이프 생략을 허용하므로 `evil-owner(archived) | secret/** | 13 | unbounded | 완료 | 동 |` 는 **유효한 표 행**인데 `^|` 가 아니라 모든 단언에 안 보인다 — 실측: 행 수 7 · secret 행 0 · 닫는 불변식 `9=9` 전부 통과. **R20 이 기록한 "계열을 닫았다" 는 주장은 이것으로 반증됐다**(그 불변식은 *블록 밖 파이프 줄* 만 닫지 *파이프로 시작 안 하는 행* 은 못 닫는다). 더해 구분자 판정 `^\|[ :\|-]+$` 는 하이픈 없는 `|||||||` 도 통과시킨다 — 표가 아닌 블록이 표로 판정된다. 계열: R17 백틱 → R18 공백·내용 → R19 연속성 → R20 두 번째 블록 → R21 바깥 파이프·구분자 문법. 다섯 라운드가 같은 질문에 **점점 좁은 근사**로 답했다. 조치는 한 줄 패치가 아니다 — (a) 6열 GFM 표 하나를 문법대로 파싱하거나 (b) 절 안의 인식 불가 비공백 줄을 **무시하지 말고 실패**시키거나 (c) 장부를 셸이 모호 없이 읽는 형식으로 옮긴다. (c) 는 UI11 의 재검토 조건과 함께 사용자 판단. **사용자 결정 필요** — CLOSED-BY-DECISION 2026-08-21: 같은 축(GFM 바깥 파이프 생략). M1-r2 9라운드 판단 종결
2026-08-13 | HIGH | .claude/plans/insuniverse-docs-13-relation-contract-m1-r2.plan.md | 술어 계열 **여섯 번째 성질 — 1열 헤더/구분자**. 헤더 판정은 2번째 필드가 `원 소유자` 인지만, 구분자 판정은 허용 문자만 본다. 헤더를 `| 원 소유자 |` 로, 구분자를 `|---|` 로 줄이고 6셀 본문 7행을 그대로 두면 서명이 정상 표와 **완전히 동일**(`원 소유자/1/1/7/6/7/9`)해 `3-2`·`5-3` 전체가 통과한다. GFM 상 유효한 **1열 표**이고 본문의 초과 셀 5개는 무시되므로, 경로·위임 PRD·사유·상태·승인이 표 관계에서 사라져도 완료 판정이 초록이다 — UI9·UI10 의 계산 가능한 매핑과 Task 5 의 6열 계약이 동시에 깨진다. R21 과 같은 인수처(구조 선택 (a)/(b)/(c))로 이월 — CLOSED-BY-DECISION 2026-08-21: 같은 축(1열 헤더·구분자 서명 충돌). M1-r2 9라운드 판단 종결
2026-08-13 | HIGH | .claude/plans/insuniverse-docs-13-relation-contract-m1-r2.plan.md | **Task 0b harness 가 실제 파서를 시험하지 않는다.** R20 이 harness 를 실행 가능하게 만들면서 self-contained 로 두었는데(별도 실행이라 그렇게 했다), 그 결과 `deleg_lines`·`deleg_rows` 를 **복제**하고 실제 `assert_eq` 계약 대신 **고정 서명 문자열**만 대조한다. 본 Validation 의 파서만 회귀하거나 기대 행·열 수가 잘못 바뀌어도 복제본의 `ACTUAL == EXPECT` 는 계속 PASS 다 — 여덟 소비 지점이 한 함수에 몰려 있고 이 절은 게이트·golden 밖이라, 이 분기 하나가 무단 위임 행을 모든 실제 검사에서 동시에 숨길 수 있다. 조치: 파서와 위임 계약 검사를 `validate_delegation` 하나로 단일화하고 실제 `$SECT` 와 전 픽스처가 **같은 함수**를 호출하게 한 뒤, 정상 픽스처는 성공·음성 픽스처는 비정상 종료를 직접 단언. 위 두 항목(R21·R22 F0)과 같은 구조 작업이라 함께 결정 — CLOSED-BY-DECISION 2026-08-21: 같은 축(harness 가 파서를 복제). M1-r2 9라운드 판단 종결
2026-08-13 | HIGH | .claude/plans/insuniverse-docs-13-relation-contract-m1-r2.plan.md | **셸 파서로는 Markdown 블록 문맥을 정확히 못 판정한다 — 여기서 근사를 그만둔다(9라운드).** `deleg_sect`·`deleg_norm` 은 ```/~~~ 표식과 HTML 주석 구분자에 **불리언 하나**를 토글하며 펜스 문자·여는 길이·같은 줄에서 닫히는 주석을 구분하지 않는다. 실측: 바깥 4-백틱 펜스 + 안쪽 3-백틱 줄 + 정본 7행 + 닫는 4-백틱 이면 렌더링된 표가 없는데 `rc=0` 7행을 낸다. `<!-- harmless -->` 한 줄 뒤 주석 처리된 정본 표도 같은 방식으로 토글이 어긋난다. (a12)·(a15) 픽스처는 짝 맞는 펜스와 단순 주석만 덮는다. 계보: R17 백틱 → R18 공백·내용 → R19 연속성 → R20 두 번째 블록 → R21 바깥 파이프·구분자 문법 → R22 1열 헤더 → R23 펜스 → R24 절 추출·주석·들여쓰기 → R25 중첩 펜스·주석 desync. **열 번째 술어를 더 넣는 대신 R21 의 구조 선택지 (c) 로 간다** — 장부를 셸이 모호 없이 읽는 형식으로(예: `docs/_meta/` 아래 별도 데이터 파일 + 표는 그것에서 생성) 옮긴다. UI11 재검토 조건과 맞물리므로 **사용자 결정 필요**. 그 전까지 남는 노출: `ownership.md` §개정 위임 이 게이트·golden 밖이므로, 중첩 펜스/주석 desync 로 위장한 장부는 M1 완료 판정을 통과한다 — CLOSED-BY-DECISION 2026-08-21: 이 행이 그 종결 선언 자체다 — *"셸 파서로는 Markdown 블록 문맥을 정확히 못 판정한다. 여기서 근사를 그만둔다(9라운드)."*
2026-08-13 | MEDIUM | .claude/plans/insuniverse-docs-13-relation-contract-m1-r2.plan.md | **백틱 표기 계약이 최종 장부에서 보증되지 않는다 (R30, 같은 항목 세 번째 이월).** `위임 표 백틱 표기 7행` 은 정규화된 행의 **첫 셀이 여는 백틱으로 시작하는지만** 센다 — 닫는 백틱이 없어도 통과하고 경로·PRD 셀의 백틱은 아예 안 본다. 더구나 이 단언은 Task 8 **이전** 스냅샷에서만 돌고 최종 검사(`5-3`)는 백틱을 전부 제거한 뒤 비교하므로, 상태 전환 편집 중에 백틱이 깨져도 최종 완료 판정이 통과한다. 권한 영향은 여전히 0 — owner|path·PRD·승인·사유·상태 튜플이 표기 무관이고 장부 경계는 파서 계약과 행 수가 잡는다. 조치: 셀을 trim 한 뒤 첫 셀 전체를 `^`[^`]+`\(archived\)$` 로 판정하고 경로·PRD 셀도 같은 방식으로, 그리고 그 단언을 `assert_delegation_ledger` 안에 두어 `1-2c`·`3-2`·최종 스냅샷이 함께 보게 한다. HIGH 이상만 흡수하는 규약대로 이월 — CLOSED-BY-DECISION 2026-08-21: 같은 축(백틱 표기 계약, 세 번째 이월). M1-r2 9라운드 판단 종결
2026-08-13 | HIGH | .claude/plans/insuniverse-docs-13-relation-contract-m1-r2.plan.md | **`UI6 수용은 ops 예외로 한정` 단언이 예외 집합과 처리 시점을 안 본다 (P10 봉인 라운드, 사용자 지시로 defer).** 새 단언은 `수용 대상` 마커가 정확히 하나이고 그 줄에 `ops-doc-reconcile` 이 있는지만 본다 — 예외가 `O-2·O-4·O-6` 세 건인지, 처리 시점이 M4 인지는 검증하지 않는다. 지적이 든 시나리오(수용이 `O-4` 하나로 좁아짐)는 UI6 위반의 **반대 방향**이고(exclusion 을 더 지킨다), 실제 위반 방향인 **다른 출처의 수용**은 현 단언이 잡는다(반사실 실측: ops 외 수용 한 줄 추가 시 `2:1` 실패). 처리 시점이 M1 로 당겨지는 경우는 Files to Change 6종·Task 2~9 열거가 정본이고 `05-final-spec.md`·`template-config.yaml` 이 그 목록에 없다. 권고대로 `O-2·O-4·O-6` 리터럴과 `M4` 문자열을 박으면 P6·P7 이 네 자리에서 걷어낸 PRD 결합이 되살아난다 — PRD 는 다른 세션에서 회부 3→5→7→8, 마일스톤 6→7 로 움직였고 ops 가 `O-6` 을 닫거나 재번호하면 정상 PRD 가 거짓 실패한다(방금 고친 UI6 catch-22 가 정확히 그 결함이었다). **인수처: 마일스톤 4** — 그 마일스톤이 ops 수용 3건을 실제 처리하므로 집합·시점이 외부 의존이 아니라 자기 작업 목록이 된다 — CLOSED-BY-DECISION 2026-08-21: P10 봉인 라운드에서 **사용자 지시로 defer** 됐다. 그 지시가 판단이다
2026-08-14 | MEDIUM | docs/_meta/verify/verify.sh | **게이트 성공 메시지가 낡았다** — 2403 행이 `ok  ownership 게이트 (PRD **9행** 결속 …)` 를 리터럴로 찍는데 M1 이 10번째 행을 넣어 golden `ownership.prd_count` 는 이제 `10` 이다. 게이트 자신이 자기 범위를 잘못 보고하므로 다음 마일스톤이 이 줄을 근거로 행 수를 세면 틀린다. **M1 이 못 고친다** — Acceptance `verify.sh 본체 무수정` 과 Validation `3-2` 의 `verify.sh 무수정` 단언이 동시에 막는다(고치면 그 단언이 실패한다). 인수처: 게이트를 갱신하는 마일스톤 4·5. 조치는 리터럴 `9행` 을 golden 의 `prd_count` 에서 읽어 찍거나 숫자를 메시지에서 빼는 것 — 후자가 같은 결함의 재발을 막는다 — RESOLVED 2026-08-19: M5 Task 9 가 메시지에서 수를 없앴다(골든에서 읽어 찍는 대신). 게이트 `#12` 가 그 메시지에 숫자 리터럴 0 을 단언한다
2026-08-14 | MEDIUM | .claude/plans/insuniverse-docs-13-relation-contract-m2.plan.md | **Task 0 게이트가 명시되지 않은 두 번째 커밋 없이는 통과 불가 (R15 F1, 사용자 지시로 HIGH 미만 이월).** Task 0 은 서브모듈 3경로만 바꾸는 정합 커밋 A 를 만들고 그 SHA 를 `.claude/notes/m2-alignment.sha` 에 기록하라고 한다. 그런데 검사 `#10`(분리 스크립트 `…-m2.gate10.sh`)은 R9 F1 흡수로 기록 파일을 워킹트리가 아니라 `HEAD` 트리에서 읽고(`git cat-file -e HEAD:$ACF` · `git show HEAD:$ACF`), 동시에 정합 커밋이 **정확히 3경로만** 바꿀 것을 요구한다. 기록 파일을 커밋 A 에 넣으면 3경로 불변식이 깨지고, 안 넣으면 `HEAD` 조회가 실패한다 — 기록 전용 커밋 B 를 임의로 추가하지 않는 한 `#10` 이 통과할 수 없고 Task 0b 가 시작되지 못한다. 그 파일은 Files to Change 에도 없다. 조치: 커밋 A 뒤에 기록 파일만 담는 커밋 B 를 Task 0 에 명시하고 Files to Change·Acceptance·승인 경계에 싣거나, 3경로 전용 불변식과 clean-clone 재현성을 동시에 지키는 다른 기록 방식을 정의한다. 인수처: M2 착수 시 Task 0 실행 직전 — CLOSED-BY-DECISION 2026-08-21: M2 R15 F1 — **사용자 지시로 HIGH 미만 이월**. M2 는 종료했고 그 Task 0 게이트는 동결 블록 안이다
2026-08-14 | MEDIUM | .claude/plans/insuniverse-docs-13-relation-contract-m2.plan.md | **2축 OR 의 온보딩 성공 경로가 selftest 에 없다 (R17 F1, 사용자 지시로 HIGH 미만 이월).** `selftest_ia_gate` 사례 10종은 음성 9 + 정상 1(`accept-viewer-axis`)뿐이고, 정상 경로가 `onboarding=false · viewer=true` 하나만 고정된다. 현 실데이터도 같은 조합이라 검사 `#7` 도 그 한 경로만 지난다. 따라서 `onboarding=true · viewer=false · ia_consumed=true` 를 **잘못 거부하는** `oq_ia_gate` 구현이 계획의 모든 게이트를 통과하고, `screen_inventory: true` 레코드가 다시 등장하면 기존 소비 판정 경로가 조용히 깨진다. 조치: `accept-onboarding-axis` 정상 사례를 `oq_ia_gate` 통합 selftest 로 추가하고, 가능하면 OR 의 정상 truth-table 네 조합을 전부 고정한다. 인수처: `screen_inventory: true` 가 재등장하는 마일스톤(온보딩 축이 실제로 참이 되는 시점) — 그 전까지 즉시 노출은 없다 — CLOSED-BY-DECISION 2026-08-21: M2 R17 F1 — **사용자 지시로 HIGH 미만 이월**. `selftest_ia_gate` 정상 경로 확장은 그 지시가 닫은 축이다
2026-08-18 | MEDIUM | C:/Users/<user>/.claude/plugins/cache/mccp/mccp/1.27.2/scripts/lib/plan-conflict-detector.js | **`normalizePath` 가 백틱을 안 벗겨 `Files to Change` 대조가 상시 전건 unplanned 로 떨어진다 (M2 구현 중 실측).** 43행 `normalizePath` 는 `\`→`/` 와 선두 `./` 만 처리하고, `parseFilesToChange` 는 표 1열을 그대로 돌려준다 — mccp 계획 템플릿이 경로를 `` `path` `` 로 감싸므로 반환값이 `` "`docs/_meta/verify/verify.sh`" `` 이고 `isInPlan` 의 정확·접미사 일치가 맨 경로와 절대 성립하지 않는다. 실측: M2 계획서 10경로 중 **10건 전부** unplanned, 백틱만 벗기면 3건. `/mccp:prp-implement` 의 Handling Deviations 가 이 판정으로 `fix-task.md` verdict `plan_conflict` + `STATE.md.chain_aborted=true` 를 쓰게 돼 있어, 정상 구현이 체인을 멈추는 **거짓 escalation** 이 된다. 조치: `normalizePath` 에 백틱 제거를 넣거나 `parseFilesToChange` 가 셀에서 인라인 코드 스팬을 벗긴다. **B1 — mccp 파일은 이 저장소에서 고치지 않는다.** 상류 환류 대상(B5). 인수처: 상류 이슈 제기
2026-08-18 | LOW | docs/_meta/verify/verify.sh | **단일 파일 3157행 — 리뷰 체크리스트 800행 기준의 4배 (code-review L4, 흡수 대신 이월).** 게이트·추출기 배선·selftest 픽스처가 한 파일에 있어 한 마일스톤이 더할 때마다 선형으로 는다(M2 만 +299 → +364). INV1(신규 의존 0)은 파서 도입만 막지 순수 셸 파일 분할을 막지 않으므로 `source` 로 쪼갤 수는 있다 — 다만 `set -euo pipefail`·`TMP`·`ROOT` 전역과 `expect_fn`/`SELFTEST_FAILED` 규약이 파일 경계를 넘어야 하고, 그 경계가 곧 새 사각지대다(분할 자체가 검사 대상이 된다). 조치: 분할하려면 selftest 하네스부터 별 파일로 빼고 `--selftest` 가 그 파일 부재에서 fail-closed 임을 먼저 게이트로 박는다. 인수처: 게이트를 크게 손대는 마일스톤 4·5
2026-08-18 | HIGH | .claude/plans/insuniverse-docs-13-relation-contract-m3.plan.md | **동결 엣지 튜플이 `지점` 열을 담지 않는다 (Implement-Codex R1 F1).** Task 7 의 출력 계약 `<flow> edge <target> | <condition>` 과 하네스 `check8`(a) 의 재열거(`gates.mjs` 585~591행, `pair(parseExitToken(cells[2]).value, cells[1])`)가 둘 다 `cells[0]`(지점)을 버린다. 조건·대상이 같은 엣지를 다른 단계로 **옮기면** 엣지 집합과 동결 파일이 그대로라 `--probe=relation` 이 exit 0 을 낸다 — 흐름 위상이 바뀌었는데 게이트가 초록이다(층위 6). 화면 축은 R6 에서 `surface-edge` 튜플로 이 문제를 닫았는데 flow 엣지 축은 같은 처리를 안 받았다. 조치: 튜플을 `<flow> edge <point> -> <target> | <condition>` 으로 넓히고 `cells[0]` 만 바꾸는 6번째 반사실(exit 2 요구)을 추가한다. **M3 에서 못 한다** — 계획서 Task 7 의 5행 계약 · Validation `#8` 의 `# 기대:`/`# 음성:` · `parseProbe` 정규식 · 동결 파일이 동시에 움직이는 봉인 계약 개정이고 `plan_hash` 재산출을 동반한다. 인수처: 관계 축을 다시 여는 마일스톤(M5 `--probe=history`) 또는 `/mccp:plan` 재진입 — RESOLVED 2026-08-19: M5 Task 6 이 출력 계약을 `<flow> edge <point> -> <target> | <condition>` 으로 넓히고 동결을 재생성했다. 게이트 `#9` 가 지점만 바꾼 사본을 exit 2 로 떨어뜨린다 — OUT-OF-OWNERSHIP 2026-08-21: 인수처: M3 계획서 재진입 시점. 동결 엣지 튜플과 `check8` 은 M3 Validation 블록 안이라 이 창이 못 고친다
2026-08-18 | HIGH | .claude/templates/doc-kit/lint-docs.mjs | **`isRelativeRef` 가 `..` 탈출을 막지 않는다 (Implement-Codex R1 F2, 부분 흡수 후 잔여).** M3 은 절대경로 · URI scheme · rooted-backslash(`\x.md#id`) · UNC 를 거부하지만 `../../../../outside.md#id` 는 통과하고 `resolveRefItem` 의 `path.resolve(dirname(doc.file), rel)` 에 경계 검사가 없다. 대상 파일 부재가 **관용 채널**이라, 작성자 로컬에만 있는 문서를 가리키는 참조가 다른 환경에서는 조용히 미해결로 강등된다 — 이식성·결정성 결함이며 신뢰 경계를 넘는 입력은 없다(입력이 전부 저장소 추적 마크다운). **naive 한 봉쇄가 게이트를 깬다**: 저장소 루트 결박은 `run_template_config_gate` 의 `$TMP/tc/docs/20-site/` 스테이징 실행을 통째로 거부하고, 문서 자기 트리 결박은 설계가 의존하는 정상 미해결 참조 `../30-admin/ia-authority.md#security-authority-add` 를 거부한다. 조치: 해석 루트를 명시 인자(`--root`)나 config 키로 받아 `path.relative(root, resolved)` 가 `..` 로 시작하지 않음을 단언하고, 탈출·rooted-backslash·UNC fixture 를 `--selftest` 에 건다. 스테이징 게이트가 그 루트를 넘겨줘야 하므로 `verify.sh` 와 함께 움직인다. 인수처: 게이트를 크게 손대는 마일스톤 4·5 — RESOLVED 2026-08-19: M5 Task 7 이 참조를 해석하는 전 CLI 모드에서 `--root` 를 필수로 만들고 realpath containment 하나로 참조와 `config:` 를 함께 통과시킨다. 게이트 `#10` 이 루트 밖 동명 id · config 탈출 · 루트 안 정션을 각각 반사실로 본다
2026-08-19 | HIGH | docs/_meta/extraction-manifest.yaml | **`repos[].head` 정합 방향이 main 과 이 브랜치에서 반대다 (M4 merge 중 실측).** `ca3f12c` 는 포인터를 manifest v9(`4d798f55`/`767d1e44`/`fb001e1d`)로 되돌렸고, main 은 manifest 를 bump 된 포인터(`c7597fc7`/`b9a90a42`/`7df733a5`)에 맞췄다 — INV2 를 각자 다른 방향으로 만족시킨다. merge 자동 병합은 main 판 manifest + 이 브랜치 포인터라는 **어느 쪽도 아닌 조합**을 만들고 그 상태가 기준선을 깬다. 반사실 실측: main 판 SHA 로 재핀하면 `verify.sh --check --bootstrap` 이 exit 1 — dead-code 표본 2건이 코퍼스에 미접지(`insuniverse-site/front/src/features/analyze/ui/AnalyzeForm.tsx:22,207`) · `screen_codes.route_count` 282→284 · `commits.*`·`spec_files.*`·`roles.*`·`comments.*`·`sample.stratum_sha256` 전 키 공란. v9 로 되돌리면 exit 0 · `check PASS`. `golden.txt` 는 이 merge 로 0행 변경이고 v9 기준으로 동결돼 있어 v9 가 이 브랜치의 정본이다. 이 merge 는 v9 를 택했고 main 의 3행을 되살렸다 — **다음 merge 마다 재발한다.** 조치는 두 축의 정본을 하나로 정하는 것(포인터를 bump 로 인정하고 golden·표본 라벨을 재산출하거나, main 의 manifest 를 v9 로 되돌리거나)이며 재현성 지표의 소유가 `00-protocol`(archived — 재개 주체 지정 필요)이라 이 PRD 밖이다. 소유 `00-protocol`
2026-08-19 | MEDIUM | .claude/plans/insuniverse-docs-13-relation-contract-m4.plan.md | **§6-2 권한 DB 전제 정정이 소유 밖 인용 5자리를 덮지 못한다 (M4 Task 8·11).** `05-final-spec.md` §6-2 와 §0 은 `snapshot_state=pending` · `receipt_route=ops-40-db-snapshot` 로 정정됐으나, 그 전제를 인용하는 다섯 자리는 옛 문면 그대로다 — `.claude/prds/insuniverse-docs-20-foundation-access.prd.md` 23행 · 115행 (소유 `20-foundation-access`) · `.claude/prds/insuniverse-policy-docs.prd.md` 101행 · 194행 · 221행 (소유 우산 PRD). `.claude/meta/06-access-model-findings.md` 221행은 **대상이 아니다** — 2026-08-05 범위 정정이고 지금도 유효하다. 이 PRD 는 그 다섯을 고칠 수 없다: `ownership.md` §개정 위임 표의 위임 사유는 제약 #6 예외 · 분할 맵 10행 · 선행조건 열 셋뿐이고 권한 DB 전제는 없다. 발동 신호 — `ops-40-db-snapshot` 이 스냅샷을 수령해 `snapshot_state` 가 `received` 로 바뀌는 시점, 또는 두 소유 PRD 중 하나가 본문을 여는 시점. 수용 조건 — 각 소유자가 자기 파일의 해당 행을 정정하고 `05-final-spec.md` §6-2 를 인용원으로 남긴다. 절 제목은 바꾸지 않는다(인용 5자리가 그 제목에 결박돼 있다). 소유 `20-foundation-access` · 우산 PRD — OUT-OF-OWNERSHIP 2026-08-21: 인수처: 인용 5자리 각각의 소유 PRD 착수 시점. `05-final-spec.md` 밖 인용은 이 PRD 의 배타 소유 경로가 아니다
2026-08-19 | MEDIUM | .claude/PRPs/plans/archived/insuniverse-docs-10-index-git-m6.plan.md · .claude/PRPs/plans/archived/insuniverse-docs-11-index-code-m4.plan.md | **아카이브 계획서 2건이 리터럴 NUL 로 binary 판정 — diff·grep 가 내용을 못 읽는다 (code-review 로컬 라운드, 같은 결함의 잔여분).** 검증기 3건은 `386a9a7` 이 `\u0000`/`\u0001` 이스케이프로 고쳤으나(선례 `docs/_meta/index/extract-comments.mjs:1240`), 두 아카이브 계획서는 같은 키 표현을 코드 펜스에 리터럴 제어문자로 품고 있다. 실측: `git ls-files --eol` 이 `i/-text w/-text` 를 찍고 `grep -r` 이 `Binary file … matches` 로 내용을 건너뛴다 — 이 두 계획서는 이후 어떤 검색·리뷰에서도 **조용히 표본에서 빠진다**. `.gitattributes` pin 대상이 아니라 EOL 정책 영향은 없다. **이 축에서 못 고친다** — 아카이브 계획서 본문 변경은 `plan_hash` 와 그에 결박된 receipt 3종을 무효화한다(memory `tracked-receipt-needs-new-slug`). 조치: 해당 PRD 를 다시 여는 시점에 이스케이프 치환 + receipt 재앵커를 함께 하거나, 계획서를 정본에서 내리고 색인만 남긴다. 인수처: 10-index-git · 11-index-code 재개 시점
2026-08-19 | MEDIUM | .claude/PRPs/plans/archived/insuniverse-docs-12-index-runtime-m1-r2.plan.md | **`#5c-2` EOL churn 게이트가 `git ls-files --eol` 출력을 못 파싱해 공허 통과할 수 있다 (code-review 로컬 라운드, 실측 2건).** 그 검사는 "`eol=lf` 가 걸린 추적 파일이 전부 인덱스 `i/lf`" 를 단언하는데, 출력 형식에 두 자리 함정이 있다 — (1) attr 필드가 `attr/text eol=lf` 로 **공백을 포함**하므로 `attr\/(\S*)` 류 파싱은 `eol=lf` 를 못 잡고 `pinned=0` 을 낸다. 이 계획의 `if(!pinned.length) FAIL` 이 그 경우를 잡지만, 잡는 이유가 실제 churn 이 아니라 파싱 실패라 **원인이 뒤바뀐 실패**다. (2) 서브모듈 gitlink 3행은 `i/`·`w/` 가 **빈 문자열**이라 `(\S+)` 가 실패하고 `경로 파싱 실패` 로 떨어진다 — EOL 개념이 없는 행이므로 정상 입력인데 게이트가 죽는다. 반사실 실측: `\S+` 파서는 실제 위반 3건(`i/-text`)이 있는 상태에서 `eol=lf pinned=0 index-not-lf=0` 을 찍고 **exit 0**; tab 분리 + `(\S*)` + gitlink 제외로 고치면 위반을 정확히 지목하고 수정 후 `추적 488건(파일 485 · gitlink 제외 3) · eol=lf pin 60건 전부 i/lf` 로 통과한다. 조치: 파서를 tab 분리로 바꾸고 gitlink 제외분을 **출력에 드러낸다**(층위 8). 인수처: 12-index-runtime 재개 또는 게이트를 크게 손대는 마일스톤
2026-08-19 | MEDIUM | .claude/settings.json | **`MCCP_REVIEW_SINGLE_PASS=deadline_pressure` 가 추적 파일에 저장소 전역으로 들어갔다 (M5 plan-codex R5 F5).** 워킹트리 diff 로 실측 — 커밋되면 이후 모든 `/mccp:plan`·`/mccp:pr` 라운드 상한이 1 로 고정되고(`review-single-pass.js#effectiveRoundCap`), 패널 모드에서는 quorum 불일치가 HALT 대신 `divergent` 로 통과한다. 이번 M5 게이트에는 영향이 없었다 — plan-codex 경로는 라운드를 사람이 몰았고 실제로 5라운드를 돌았다. **범위 밖이다**: M5 §Files to Change 에 `.claude/settings.json` 이 없고 이 변경의 주체는 사용자다. **REJECTED — 사용자 판정 (2026-08-19). 의도된 상시 설정이며 유지한다.** 사유: 리뷰 피드백이 오히려 변경의 제약이 되는 경우가 있어, 계획을 확장 가능한 free 상태로 넓게 가져가고 **최종 확인은 PRD 검토 시점에 한 번** 한다. 라운드 상한 1 은 그 운용의 일부다. 이 판정 뒤로 이 항목은 재보고 대상이 아니다 — 게이트가 divergent 를 정직하게 봉인하고 dedupe 는 fail-closed 로 남으므로 `/mccp:pr` 의 PR-Codex 는 여전히 돈다.
2026-08-19 | HIGH | .claude/receipts/mccp-implement-codex/insuniverse-docs-13-relation-contract.json | **미추적 stale implement receipt 가 M5 의 교차 모델 리뷰를 생략시킬 수 있다 (M5 plan-codex R10 F0).** 실측 — 그 파일은 generic 슬러그(`-m5` 없음)이고 `plan_hash` 가 M4 의 `sha256:395cd81d…` 인데 `resolution.converged: true` 다. M5 계획서의 현재 해시는 `sha256:bef99f9a…` 이므로 두 값이 다르다. `git ls-files` 상 **미추적**(2026-08-19 02:40 생성)이라 이력에도 없다. dedupe 가 generic 결정의 plan/implement receipt 쌍을 신뢰하면 M5 구현이 어느 쪽에서도 검토되지 않은 채 PR-Codex 가 skip 될 수 있다. **범위 밖이다** — M5 §Files to Change 에 receipt 가 없고 이 파일은 M4 세션의 잔여물이다. 조치: (a) 미추적이므로 지우거나 (b) `/mccp:pr` 진입 전에 dedupe 가 **현재 계획 해시와 정확히 일치하는 receipt 쌍**만 `skip_safe` 로 인정하는지 확인한다. **M5 의 `/mccp:pr` 선행조건으로 다룬다.** 사용자 결정 필요 — RESOLVED-ALREADY 2026-08-21: 전제 `미추적` 이 거짓이다 — `.claude/receipts/mccp-implement-codex/insuniverse-docs-13-relation-contract.json` 도 지금 추적 대상이다(실측). M5 는 종료했고 그 창의 교차 모델 리뷰 생략은 일어나지 않았다
2026-08-19 | HIGH | docs/_meta/index/extract-commits.mjs | **추출기가 `assertNoGraphRewrite` 도 `--no-replace-objects` 도 쓰지 않는다 (M5 Implement-Codex R1 F2, 부분 흡수 후 잔여).** 형제 추출기 `extract-releases.mjs` 는 102~106행에서 전 git 호출에 `--no-replace-objects` 를 붙이고 498·1100·1182행에서 `assertNoGraphRewrite` 를 부르며 973~977행이 그 fail-closed 를 selftest 로 상시 검사한다. `extract-commits.mjs` 는 셋 다 없어 `refs/replace/*` 가 있는 로컬에서 커밋 그래프가 대체된 채로 인덱스가 생성될 수 있고, 그러면 M5 `--probe=history` 의 재현 대조가 **위조된 입력과 위조된 재현을 대조**하게 된다. M5 는 자기 git 호출만 경화했다(키트 의존성 0 규약상 index-shared import 불가) — 추출기 소유는 `10-index-git` 이고 UI7 이 인덱스 산출물 미소유를 못 박으므로 이 마일스톤에서 고칠 수 없다
2026-08-19 | HIGH | scripts/lib/plan-codex-runner.js (mccp 1.29.0 하네스) | plan-codex receipt 가 **비수렴 판정을 수렴으로 기록**한다. `push-deeplink-almtype` R2 봉인 실측: `resolution.converged: true` 인데 같은 객체의 `resolution.codex_verdict: "divergent"` 이고, ACCEPT_NOW 6건을 판정했는데 `accepted: []` · `open_questions: []` 이며, 두 번째 리뷰 라운드인데 `round: 1` · `resolution.rounds: 1` 이다. `resolution.converged` 만 읽는 하류 게이트는 divergent 계획서를 승인으로 받는다. cross-gate dedupe 는 `codex_verdict` 를 보므로 현재는 fail-closed 지만, 두 필드가 한 객체 안에서 서로를 부정하는 상태 자체가 감사 기록을 무효화한다. 처방: `converged` 를 `codex_verdict === 'converged'` 에서 파생하고, 재진입 라운드마다 `round` 를 증가시키며, adjudication 결과를 `accepted`/`open_questions` 에 실을 것. B1(mccp 파일 미수정)에 걸려 이 저장소에서는 못 고친다 — 상류 이슈로 환류할 것. 검출: Codex R3 F3 (conf 0.99), 실측 대조로 확인
2026-08-20 | MEDIUM | .claude/prds/insuniverse-policy-docs.prd.md | 우산 PRD 49행이 `"05-final-spec.md §4 docs 트리 50문서 중 IA 없음"` 과 `"판정은 00-protocol 마일스톤 6 이 한다"` 를 함께 말하는데 둘 다 지금 거짓이다 — M2 가 `ia_doc_consumed` 판정을 이미 뒤집었고 M6 이 트리에 IA 2건을 얹어 문서 수가 움직였다. `13-relation-contract` 의 위임 사유는 제약 #6 예외 · 분할 맵 10행 · 선행조건 열 셋뿐이라 우산 본문을 고칠 수 없다. 인수처: 우산 PRD 소유자가 §전제 절을 여는 시점 — OUT-OF-OWNERSHIP 2026-08-21: 인수처: 우산 PRD `insuniverse-policy-docs` 소유자. 우산 본문 정정은 제약 #6 이 금지하고 위임 사유 셋 어디에도 없다
2026-08-20 | MEDIUM | .claude/prds/insuniverse-docs-13-relation-contract.prd.md | §Success Metrics `트리 정합` 행의 세 절 중 `3단계 개정 경로로만 도달` 만 기계 검증이 없다. 앞 두 절(계수 · 사본↔정본 exact-diff)은 `run_index_gate` 와 M6 게이트 `#5` 가 판정하지만, **절차를 밟았는가**는 종점만 보는 어떤 검사로도 구별되지 않는다 — golden 을 손수 정확한 값으로 적어도 `do_check` 는 통과한다. 필요한 것은 CI 나 서명된 인덱스 생성기이며 이 저장소에 CI 가 없고 INV1 이 신규 의존을 막는다. 인수처: CI 가 생기거나 서명된 인덱스 생성기가 도입되는 시점 — CLOSED-BY-DECISION 2026-08-21: *"3단계 개정 경로로만 도달"* 은 **종점만 보는 어떤 검사로도 절차를 증명할 수 없다** — 행 자신이 그렇게 적었다. 없는 검사를 있는 척 만들지 않는다(UI6). 앞 두 절은 `run_index_gate` 와 `#11` 이 판정한다
2026-08-20 | MEDIUM | .claude/templates/doc-kit/template-config.schema.md | `deferred_ref_targets` 의 경로 기준이 구현과 반대로 문서화됐다 — 스키마는 **참조 문서 기준**이라 적는데 `lint-docs.mjs` 는 `ctx.configDir` 에서 `deferKey()` 를 계산하고 README 와 config 예시 둘 다 **config 파일 기준**이라 적는다. M5 산출물이고 M6 §Files to Change 밖이라 M6 이 고치지 않는다 (그 파일을 고치면 M5 게이트 표본이 움직인다). 인수처: doc-kit 재개
2026-08-20 | MEDIUM | .claude/plans/insuniverse-docs-13-relation-contract-m6.plan.md | (Implement-Codex R1 F1) 게이트 `#1` 이 트리 행의 **설명 열을 보지 않는다** — `tree_of` 와 `verify.sh` 의 `tree_paths` 둘 다 `.md` 토큰만 뽑고 `index.tree_sha256` 도 코드펜스 전체가 아니라 경로 집합에서 나온다. 정본과 사본의 설명이 서로 달라도 전 게이트가 초록이다. M6 구현은 두 IA 행을 설명 열까지 바이트 동일로 넣고 raw 행 `diff` 로 1회 확인했으나 그 대조는 상시 검사가 아니다. 인수처: 이 계획서가 `/mccp:plan` 으로 재진입하거나 검사가 재사용 검증기로 승격되는 시점 — FIXED-M8 2026-08-21: 대체 검사 `#11` — `verify.sh` `tree_rows_raw` 가 정본↔사본 트리를 설명 열까지 raw 로 대조한다 (`.md` 토큰만 뽑던 `tree_of`·`tree_paths` 대체)
2026-08-20 | MEDIUM | .claude/plans/insuniverse-docs-13-relation-contract-m6.plan.md | (Implement-Codex R1 F2) 게이트 `#2` 가 `cr == 0` 을 성공 분기로 받는다 — `docs/00-index.md` 를 전면 LF 로 정규화해도 통과하며, 그것이 바로 Task 1 이 막으려던 상태다. `#1` 은 삽입 0건만 잡고 전면 정규화는 못 잡는다. M6 구현은 `cr == tot ∧ tot == 착수값+2` 를 편집 스크립트 안에서 직접 단언해 우회했다. 인수처: 위와 같음 — FIXED-M8 2026-08-21: 대체 검사 `#7` — `cr == 0` 성공 분기를 바이트 계수(`cr_count`)로 바꿨다. CRLF fixture 에서 3경로(바이트·BINMODE·grep) 합치와 0 아님을 함께 본다
2026-08-20 | MEDIUM | .claude/plans/insuniverse-docs-13-relation-contract-m6.plan.md | (Implement-Codex R1 F3) 게이트 `#6` 의 fix-task 투영 검사가 **파일명 부분문자열 3개**만 본다 — 세 이름을 한 문장에 몰아넣은 파일도 통과한다. 항목 수·날짜·심각도·인수처·backlog 행과의 1:1 대응 중 무엇도 보지 않고, M6 에는 M4·M5 의 `<plan>.gates.mjs materialize-fixtask` 같은 생성기가 없다. 인수처: 위와 같음 — FIXED-M8 2026-08-21: 대체 검사 `#5` — `verify.sh` 가 `fixtask-projection.mjs verify` 를 기본 모드로 상시 호출한다. 파일명 부분문자열이 아니라 backlog 재생성본과의 exact-diff 이고, 변이 3종(drop·severity·merged) fixture 가 되돌림을 잡는다
2026-08-20 | MEDIUM | .claude/plans/insuniverse-docs-13-relation-contract-m6.plan.md | (Implement-Codex R1 F4) findings 신규 항목을 요구하는 검사가 M6 어디에도 없다 — `verify.sh` 의 findings 검사는 **이미 있는 항목의 6항목 구조**만 보므로 기록을 아예 빼도 마일스톤이 `complete` 가 된다. Acceptance 에도 그 줄이 없다. 인수처: 위와 같음 — FIXED-M8 2026-08-21: 대체 검사 `#6` — findings 파일별 `## ` 표제 수를 golden 에 동결(`fixtask.findings_headings`)하고 표제 0개를 거부한다. 항목을 지우면 `--check` 가 붉어진다
2026-08-20 | HIGH | (mccp 본체) scripts/lib/plan-conflict-detector.js | `parseFilesToChange` 가 File 셀의 **마크다운 백틱을 벗기지 않는다** — `normalizePath` 는 `\`→`/` 치환과 `./` 제거만 하므로 planFiles 가 `` `docs/00-index.md` `` 형태로 남고 `isInPlan` 의 exact/suffix 비교가 **항상 실패**한다. 결과: file-expansion 축이 언제나 conflict=true 를 내며 `/mccp:prp-implement` 의 "Handling Deviations" 가 매 마일스톤 거짓 escalate 를 요구한다. 반사실 실측(2026-08-20 · M6) — 같은 계획서를 `sed 's/`//g'` 로 백틱만 벗겨 같은 파일 목록으로 재실행하니 `conflict:false`. 영향 반경 전수: `## Files to Change` 를 가진 추적 계획서 55건 중 **54건**의 File 셀이 백틱이다(즉 이 축은 이 저장소에서 사실상 항상 오탐). 부차 요인 하나 더 — 이 명령은 `--files-changed` 에 `git diff --name-only origin/main..HEAD` 를 주는데 M6 처럼 선행 마일스톤이 미커밋인 워킹트리에서는 그 입력에 남의 파일이 섞인다. B1 이라 mccp 파일을 고치지 않는다. 인수처: 상류 이슈 제기 (#127·#128 계열)
2026-08-20 | HIGH | .claude/plans/insuniverse-docs-13-relation-contract-m7.plan.md | **회부 장부가 수신 PRD 의 소비 경로에 결속되지 않는다 (M7 Plan-Codex R1 F0, DEFER_TO_BACKLOG).** `ownership.md` §회부 인계가 도달 경로로 신설되지만 `50-domain` · `70-viewer` 에는 그 절도 형제 `findings/` 도 읽는다는 계약이 없다. 게이트 `#3`·`#5` 는 **발신 측 기록끼리만** 대조하므로 두 PRD 의 각 2건이 착수 입력에 나타나지 않아도 M7 이 `complete` 가 된다 — 수용 시점을 뒤당기는 문제가 아니라 **전달 자체가 보장되지 않는** 문제다. 지적의 권고(수신자별 pending 회부 조회를 착수 경로에 결속)는 활성 PRD 본문 편집을 요구하고 우산 §핵심 제약 6 이 그것을 금지한다(예외는 archived 소유자 한정). M7 은 같은 관측을 GROUND 에 싣고 Acceptance 에 `(미검증)` 으로 남기며 두 PRD 를 backlog·fix-task 양쪽에 이미 올려 두었다. 조치: 그 두 PRD 착수 시 `ownership.md` §회부 인계에서 자기 수신 행을 조회해 2건씩 나오는 것을 착수 조건으로 삼는다. 인수처: `50-domain` · `70-viewer` 착수 시점 — OUT-OF-OWNERSHIP 2026-08-21: 인수처: `50-domain` · `70-viewer` 착수 시점. 회수 계약을 활성 PRD 본문에 쓰는 것이라 우산 제약 #6 이 금지한다 — ABSORBED-M1 2026-08-24 (50-domain 분): 이 행이 요구한 조치를 마일스톤 1 이 이행했다 — PRD §착수 조건 1 이 `ownership.md` §회부 인계 에서 자기 수신 행을 조회하는 것을 착수 조건으로 싣고, 게이트 `#3` 이 그 전건을 PRD 판정표와 집합·문자열로 결속한다. **잔존 수신처 `70-viewer`** — 그쪽 몫은 그 PRD 착수 시점에 그대로 남는다
2026-08-20 | HIGH | .claude/plans/insuniverse-docs-13-relation-contract-m7.plan.md | **게이트 `#1` 의 링크 검출이 인라인 형태만 본다 (M7 Plan-Codex R1 F1, DEFER_TO_BACKLOG · intent_conflict UI7).** `\]\([^)]+\)` 는 참조형 링크(`[x][ref]` + `[ref]: target`) · autolink(`<https://…>`) · raw HTML(`<a href=…>`) 을 전부 통과시키고, `.md` 화이트리스트도 `.md` 가 없는 대상은 보완하지 못한다. 따라서 UI7 과 PRD 지표 #1 의 machine stand-in 으로는 부분적이다. **권고인 Markdown AST 도입은 INV1(신규 의존 0)이 막고**, 셸 마크다운 파서는 이 저장소에서 수렴하지 않는 축으로 이미 판정돼 있다. 실제 실패 모드인 개별 흐름 문서 열거는 md 토큰 화이트리스트가 잡으며 반례를 실행해 exit 1 을 확인했다(§GATE-RUN). 값싼 보강 3형태: 참조 정의행 `^[[:space:]]*\[[^]]+\]:` · autolink `<[a-z]+:[^>]+>` · `<a[[:space:]]` 를 검사에 더한다. 라운드 상한 1(`MCCP_REVIEW_SINGLE_PASS`)이라 본문 편집이 재진입을 강제해 이번 창에서 넣지 않았다. 인수처: 이 계획서가 `/mccp:plan` 으로 재진입하는 시점 — OUT-OF-OWNERSHIP 2026-08-21: 인수처: M7 계획서 재진입 시점. `#1` 은 M7 Validation 블록 안이며 권고(Markdown AST)는 INV1 이 막는다
2026-08-20 | MEDIUM | .claude/plans/insuniverse-docs-13-relation-contract-m7.plan.md | **게이트 `#3` 이 회부 내용과 수용 시점을 대조하지 않는다 (M7 Plan-Codex R1 F2, DEFER_TO_BACKLOG).** 두 표에서 `(R번호, 수신)` 두 열만 정규화해 diff 하므로 `회부 내용` 이 비거나 다른 작업으로 바뀌어도, `수용 시점` 이 `대상 PRD 착수 시점` 이 아닌 값이어도 `8/8` 로 통과한다. 올바른 수신자에게 **의미가 손상된 회부**가 전달되거나 이미 수용된 것으로 오기될 수 있다. 값싼 보강: 내용 열을 공백 정규화해 함께 exact-diff 하고 빈 셀·중복 id 를 거부한다. 잔여 위험은 제한적이다 — 두 표의 내용 열은 같은 저자가 한 창에서 옮기고 수신자 오배송은 `#3` 이 이미 잡는다. 라운드 상한 1 이라 이번 창에서 넣지 않았다. 인수처: 이 계획서가 `/mccp:plan` 으로 재진입하는 시점 — OUT-OF-OWNERSHIP 2026-08-21: 인수처: M7 계획서 재진입 시점. `#3` 은 M7 Validation 블록 안이다
2026-08-20 | MEDIUM | .claude/plans/insuniverse-docs-13-relation-contract-m7.plan.md | **게이트 `#2` 의 소절 계수가 파일 전역이고 본문을 읽지 않는다 (M7 Implement-Codex R1 F3, DEFER_TO_BACKLOG).** 289행 `ns=$(grep -c '^### 읽기 축 2 — 흐름 진입$' "$SPEC")` 는 `05-final-spec.md` **전체**를 세므로 소절이 §4 안에 있는지 판정하지 않는다. 나머지 단언 둘은 트리 경로 집합 `diff` 뿐이라, 소절을 §7 에 두거나 본문을 비워도 — 즉 흐름 축 정본이 아예 없어도 — `#2` 가 초록이다. 계획서 Task 1 이 요구하는 세 문장 중 어느 것도 읽히지 않는다(층위 6: 게이트가 보는 대상). 값싼 보강: `sec`/`awk` 로 §4 슬라이스를 먼저 떠서 그 안에서만 계수하고, 소절 본문의 비공백 행 수 하한과 코드펜스 0 을 단언한다. **M7 에서 못 고친다** — 검사가 계획서 Validation 블록 안이라 흡수가 `plan_hash` 를 깨고 `plan-codex-runner.js` 가 exit 12 로 재진입을 강제하는데 라운드 상한이 1(`MCCP_REVIEW_SINGLE_PASS=deadline_pressure`)이다. 완화: M7 구현은 소절을 §4 안 지정 위치(트리 코드펜스 · `**모바일**:` 문단 뒤, `### 모든 정책 문서 공통 형식` 앞)에 넣고 배치를 1회 육안 확인했다. 인수처: 이 계획서가 `/mccp:plan` 으로 재진입하는 시점 — FIXED-M8 2026-08-21: 대체 검사 `#12` — 파일 전역 `grep -c` 대신 정본 `05-final-spec.md` §4 슬라이스 안에서 판정하고 본문 범위를 (대상 h3 다음 행 ~ 다음 depth<=3 헤딩 직전 또는 EOF, 경계 헤딩 제외)로 정의했다
2026-08-20 | MEDIUM | .claude/plans/insuniverse-docs-13-relation-contract-m7.plan.md | **fix-task 투영 검사가 파일명 부분문자열만 보는 축의 2회차 (M7 Implement-Codex R1 F4, DEFER_TO_BACKLOG).** M6 `#6` 에서 같은 축이 이미 기록됐고(위 `…-m6.plan.md` 행) M7 `#8` 이 같은 형태를 그대로 물려받았다 — `KEYS` 3개를 `grep -qF` 로 backlog·투영 양쪽에서 찾을 뿐이라 세 이름을 한 문장에 몰아넣은 파일도 통과하고, 항목 수·날짜·심각도·인수처·backlog 행과의 1:1 대응 중 무엇도 보지 않는다. M7 판의 추가 관측 둘 — (a) `KEYS` 가 계획 시점에 고정돼 있어 **이번 창에서 새로 난 Implement-Codex 이월분은 검사 표본 밖**이다, (b) `.claude/state/` 가 gitignore 라 clean checkout 에서 투영이 사라져도 마일스톤은 `complete` 로 남는다(정본이 backlog 라는 계획서 단언이 그 사각을 인정하지만 게이트는 그 단언을 검사하지 않는다). 값싼 보강: 투영을 backlog 선택 행에서 생성하고 `(날짜, 심각도, 경로, 인수처)` 정규화 튜플과 개수를 exact-diff 한다(M4·M5 의 `<plan>.gates.mjs materialize-fixtask` 선례). **같은 축 3회차면 층위를 올린다** — 다음 재제기 시 개별 계획서 흡수가 아니라 재사용 생성기로 승격한다. 인수처: 이 계획서가 `/mccp:plan` 으로 재진입하거나 투영 생성기가 재사용 검증기로 승격되는 시점 — FIXED-M8 2026-08-21: 대체 검사 `#5` — 같은 축 2회차. 계획서별 일회용 검사가 아니라 `docs/_meta/verify/` 의 상시 층으로 올려 재생산을 멈췄다
2026-08-20 | HIGH | .claude/prds/insuniverse-docs-50-domain.prd.md · .claude/prds/insuniverse-docs-70-viewer.prd.md | **두 수신 PRD 가 형제 `findings/` 회수를 계약하지 않아 `ownership.md` §회부 인계가 유일한 도달 경로다 (M7 실측).** `60-history-deprecated` 는 회수를 세 자리에 선언한다 — 87행(*"형제가 `dead-code-candidate` 를 발견하면 … 이 PRD가 회수해 판정"*) · 105행(`docs/_meta/findings/**` 을 형제 보고 회수용 **읽기** 경로로 명시) · 125행(마일스톤 5 = 형제 findings 회수 + 재판정). `50-domain`(98·106행)과 `70-viewer`(85·95·228행)는 **자기 파일 쓰기만** 선언하고 형제 파일을 읽는다는 문장이 없다. 따라서 R-1·R-2(→`50-domain`)와 R-3·R-5(→`70-viewer`) 4건은 M7 이 신설한 `docs/_meta/ownership.md` §회부 인계 하나에만 걸려 있다. **M7 이 못 닫는다** — 닫으려면 활성 PRD 본문에 착수 조건을 써야 하고 우산 §핵심 제약 6 이 그것을 금지한다(예외는 archived 소유자 한정). 게이트 `#4` 가 그 금지를 기계로 문다. 조치: 두 PRD 착수 시 `ownership.md` §회부 인계에서 자기 수신 행을 조회해 각 2건이 나오는 것을 착수 조건으로 자기 PRD 에 적는다. 인수처: `.claude/prds/insuniverse-docs-50-domain.prd.md` · `.claude/prds/insuniverse-docs-70-viewer.prd.md` 착수 시점 — ABSORBED-M1 2026-08-24 (50-domain 분): 형제 `findings/` 회수 계약이 이 PRD 본문에 신설됐다 — §회부 §형제 findings 회수 표와 §착수 조건 2 가 그것이고, 게이트 `#4` 가 출처↔표를 양방향으로 문다. **잔존 수신처 `70-viewer`** — 그 PRD 는 여전히 자기 파일 쓰기만 선언하며 이 마일스톤이 대신 계약하지 않는다
2026-08-20 | MEDIUM | .claude/plans/insuniverse-docs-13-relation-contract-m6.plan.md | **M6 Implement-Codex R1 F1~F3 이 남긴 M6 게이트 사각지대 3건이 아직 열려 있다 (M7 재확인).** 위 세 행(`#1` 이 트리 행의 설명 열을 안 본다 · `#2` 가 `cr == 0` 을 성공 분기로 받아 전면 LF 정규화를 통과시킨다 · `#6` 의 fix-task 투영 검사가 파일명 부분문자열 3개만 본다)은 전부 M6 계획서 Validation 블록 안의 검사이며 M7 이 그 블록을 상속하지 않는다. M7 의 추가 관측 — `#2` 의 `cr == 0` 분기는 이번 창에서 **실제로 문제가 됐다**: `docs/00-index.md` 는 워킹트리에서 전면 CRLF(147/147)인데 `awk '/\r$/'` 도 `grep -c $'\r'` 도 0 을 낸다(아래 별도 행). `cr == 0` 을 성공으로 받는 게이트는 그 blind 관측과 실제 LF 정규화를 **구별할 수 없다**. 조치: M6 계획서가 `/mccp:plan` 으로 재진입할 때 세 검사를 함께 손보고 `#2` 는 바이트 계수로 바꾼다. 인수처: `.claude/plans/insuniverse-docs-13-relation-contract-m6.plan.md` 재진입 시점 — FIXED-M8 2026-08-21: 대체 검사 `#7` — 이 행이 재확인한 셋 중 EOL(`cr == 0`) 축. 나머지 둘은 위 두 행이 각각 `#11`·`#5` 로 명명한다
2026-08-20 | HIGH | docs/_meta/verify/verify.sh · .claude/plans/insuniverse-docs-13-relation-contract-m7.plan.md | **이 저장소의 EOL 측정 관용구 중 `awk '/\r$/'` 가 이 플랫폼에서 blind 다 (M7 구현 중 관측 · M8 에서 실측 정정).** Git-Bash 의 gawk 5.4.0 은 레코드 분리 단계에서 CR 을 소비해 `$0` 에 넣지 않으므로 전면 CRLF 파일에서도 `awk '/\r$/' f | wc -l` 이 0 을 낸다 — 정규식이든 `index($0,"\r")` 든 같은 이유로 못 본다. **`grep` 은 blind 가 아니다 — M7 이 적은 *"둘 다 0"* 은 거짓이었다.** M8 이 `docs/00-index.md`(바이트 계수 CRLF 163행)에서 재측정한 표: `awk '/\r$/'` 0 · `awk '{if(index($0,"\r"))n++}END{print n+0}'` 0 · `awk -v BINMODE=r '/\r$/'` 163 · `grep -c $'\r'` 163 · `grep -cU $'\r'` 163 · `sed -n $'/\r$/p'` 163 · `tr -d '\r'` 바이트 delta 163 · `git ls-files --eol` `i/lf w/crlf`. 영향 둘 — (1) **M7 계획서 §GROUND 의 *"개행은 전 파일 LF 다 … 넷 다 CRLF 0행이다(`awk '/\r$/'` 계수)"* 는 거짓이다.** M6 GROUND 의 *"사본은 CRLF"* 가 맞았고 M7 이 그것을 blind 관측으로 뒤집었다. M7 산출물에는 영향이 없다 — 구현이 파일별 EOL 을 바이트로 검출해 보존했고 `core.autocrlf=true` 라 인덱스는 어차피 LF 다. (2) **M6 게이트 `#2` 의 `cr == 0` 성공 분기가 이 blind 관측으로 충족될 수 있다** — 전면 LF 정규화와 구별되지 않는다(위 행). 조치(M8 이 이행): `verify.sh` 에서 CR 을 재는 자리를 바이트 계수(`cr_count`)로 고정하고, gawk 로 CR 을 재야 하는 자리에만 `BINMODE=r` 을 **국소로** 붙인다 — 전역 적용은 이 스크립트의 다른 awk 파서들이 gawk 의 CR 제거에 의존해 동작하므로 그것들을 한꺼번에 깬다. M7 이 제안한 *"셸 정규식 `\r` 대조를 게이트에서 뺀다"* 는 grep·sed 가 정상이라 과잉이었고 채택하지 않았다. gawk 기본값은 **진단으로만 보고**한다 — 통과 조건으로 걸면 gawk 가 고쳐지는 순간 이 저장소가 red 가 된다. — FIXED-M8 2026-08-21: 대체 검사 `#7` — CRLF fixture 에서 바이트 계수·`BINMODE=r`·`grep` 3경로 합치. gawk 기본값은 진단 보고이지 통과 조건이 아니다
2026-08-20 | LOW | (mccp 본체) scripts/receipt/cli.js | **receipt `meta.deferred_findings_count` 가 이월 건수를 안 싣는다 (M7 코드리뷰 실측).** `.claude/receipts/mccp-plan-codex/insuniverse-docs-13-relation-contract-m7.json` 과 같은 경로의 implement receipt 둘 다 `deferred_findings_count: 0` 이고 `resolution.accepted` · `rejected` 도 빈 배열이다. 실제는 plan-codex 3건 · implement-codex 5건을 backlog 로 이월했고 그 기록은 `.claude/notes/insuniverse-docs-13-relation-contract-m7.md` 에만 있다. `codex_raw_verdict` 도 `null` 이라 `divergent` 로 접힌 뒤의 원문이 receipt 에 안 남는다(memory `pr-codex-receipt-loses-raw-verdict` 의 plan/implement 판). 기계로 읽는 소비자가 receipt 만 보면 **이월 0건으로 오독**한다. B1 이라 mccp 파일을 고치지 않는다 — 이 저장소에서 이월 정본은 notes 와 이 backlog 다. 인수처: 상류 이슈 제기 (#127·#128 계열) — OUT-OF-OWNERSHIP 2026-08-21: 인수처: 상류 이슈 제기(#127·#128 계열). 경계 B1 이 mccp 본체 수정을 금지한다
2026-08-20 | HIGH | .claude/plans/insuniverse-docs-13-relation-contract-m8.plan.md | **M8 기준선의 신뢰 SHA 가 브랜치 산출물이라 외부 앵커가 아니다 (M8 Plan-Codex R5 F0, DEFER_TO_BACKLOG).** 게이트 `#16` 은 대체 매핑의 기준선을 *매핑 경로의 유일 최초 추가 커밋*으로 잡고 그 커밋의 부모 `codex-findings-backlog.md` blob 을 착수 전 신뢰 SHA 의 blob 과 대조한다. 그런데 그 신뢰 SHA 를 **Task 0b 자신이 기록**하므로, 판정 뒤 이력을 재작성하면서 매핑 최초-add 커밋과 신뢰 SHA 기록을 함께 다시 만들면 (최초 추가 1회 · 후속 수정 0 · backlog 무편집 · 부모 blob 일치)가 전부 성립해 판정 결과에 맞춰 저작된 매핑이 독립 기준선으로 승인된다. 정공법은 신뢰 SHA 를 브랜치 밖 불변 입력(CI 가 고정한 PR 시작 SHA · 보호 ref)에서 받는 것인데 **이 저장소에는 CI 가 없고**(같은 이유의 선례: 이 원장 `2026-08-05 | HIGH | doc-template-kit` 행) INV1 이 그것을 만들 신규 의존을 막는다. 없는 앵커를 있는 척 검사하면 M8 이 다섯 라운드에 걸쳐 지운 바로 그 실패 모드가 된다. 공격 조건은 **저자가 자기 감사기록을 위조하려 고의로 이력을 재작성**하는 것이며 게이트가 보호하는 당사자와 우회하는 당사자가 같다 — 경계 B1 이 *"규범이고 위반은 리뷰에서만 잡힌다"* 로 인정한 것과 같은 부류다. M8 은 `#16` 이 증명 가능한 것만 지게 하고 잔여를 `(미검증)` Acceptance 로 노출한다. 인수처: CI 또는 보호 ref 도입 시점 — OUT-OF-OWNERSHIP 2026-08-21: 인수처: CI 또는 보호 ref 도입 시점. 이 저장소에 둘 다 없고 INV1 이 도입을 막는다 — 없는 앵커를 있는 척 검사하지 않는다
2026-08-20 | HIGH | scripts/lib/plan-conflict-detector.js (mccp 1.29.0 하네스) | `file-expansion` 판정이 **모든 계획서에서 무조건 conflict** 를 낸다. `parsePlanFilesToChange` (60~81행) 가 `File` 열 셀에서 마크다운 링크 `[x](y)` 만 벗기고 **백틱 코드스팬은 안 벗긴다** — 그래서 planFiles 에 `` `insuniverse-server/apps/...ts` `` 가 백틱째로 들어가고, `detectFromFileExpansion` (111~120행) 이 실제 변경 경로를 전부 unplanned 로 센다. 실측(`push-deeplink-almtype`, 2026-08-20): 계획서가 정의한 7파일과 실제 변경 7파일이 **완전히 같은데** `plan defines 7 files; diff has 7 unplanned` 를 냈다. 반사실: 같은 경로를 백틱으로 감싸 `--files-changed` 로 넘기면 `conflict:false` 로 뒤집힌다. 영향 반경 전수: 이 저장소 계획서 7/7 이 `File` 열을 백틱으로 쓴다(mccp 템플릿 자체 관례) → prp-implement Phase 3 의 `[MCCP-PLAN-CONFLICT-STOP]` 이 항상 발화하는 구조다. 처방: `parsePlanFilesToChange` 에서 링크 해체 뒤 `` ` `` 를 제거할 것(1행). B1(mccp 파일 미수정)이라 이 저장소에서는 못 고친다 — 상류 이슈로 환류할 것. 이번 마일스톤은 이 축을 게이트에서 분리하고 진행했다(전역 지시 2026-08-18 범위 밖 결함 처리): 실제 파일 확장 여부는 계획서 자체 게이트 `#9`(allowlist 대조)가 독립으로 검사했고 `dirty=0 changed=6 outside=0` 으로 통과했다
2026-08-20 | MEDIUM | docs/_meta/verify/** (저장소 EOL 상태) | `.gitattributes:27` 이 `docs/_meta/verify/*.mjs text eol=lf` 를 선언했는데 **커밋된 blob 이 전부 CRLF** 다(실측: 30개 추적 파일 전건, `verify-tests.mjs` 4218 · `verify-policy-values.mjs` 969). 결과: checkout 이 CRLF 를 쓰고 `text` 정규화가 비교 시점에 LF 로 되돌려 **파일 mtime 이 건드려지는 즉시 영구 ` M`** 이 된다 — `git checkout --` 으로 안 지워진다(실측: 삭제 후 `git checkout HEAD --` 해도 CRLF 로 복원). 지금은 stat 캐시 덕에 30개 중 mtime 이 바뀐 1개만 노출된다. 반사실: `git add` 하면 blob 이 LF 로 정규화돼 **969행 진짜 diff** 가 스테이지된다(실측: staged blob CR 0, numstat 969/969) — 즉 아무 작업이나 이 디렉터리 파일을 열기만 해도 무관한 969행이 커밋에 섞일 수 있다. 처방: 한 번의 정규화 커밋(`git add --renormalize docs/_meta/verify/`)으로 blob 을 LF 로 맞출 것. 그 커밋은 전 파일 전 행 diff 라 독립 chore 로 분리해야 하며, `verify.sh` golden 대조(`docs/_meta/verify/.gitattributes` 가 `verify.sh`·`golden.txt` 만 이미 고정)와 `extraction-manifest.yaml` CRLF 의존(`tr -d '\r'` 정규화 지점)을 먼저 실측 확인할 것. 이번 마일스톤 범위 밖이라 스테이지하지 않고 분리했다(전역 지시 2026-08-18)
2026-08-21 | MEDIUM | .claude/plans/insuniverse-docs-13-relation-contract-m8.plan.md | **M6 사각 3건 재확인 행에 EOL 거짓 진술이 남아 있다 (M8 구현 중 실측).** 이 원장의 `2026-08-20 | MEDIUM | …-m6.plan.md` 행(M6 게이트 사각 3건 재확인)은 *"`docs/00-index.md` 는 워킹트리에서 전면 CRLF(147/147)인데 `awk '/\r$/'` 도 `grep -c $'\r'` 도 0 을 낸다"* 를 담는다. **grep 절이 거짓이다** — 같은 파일에서 `grep -c $'\r'` 은 163 을 낸다(M8 발견 F-10 (1) 측정표). M8 은 같은 축의 EOL 행 하나만 정정했고 그 정정의 계보 `(old -> new)` 는 **기준선 커밋에 동결**돼 있다 — 지금 이 행까지 정정하면 그 행의 동결 digest 가 계보 없이 사라져 게이트 `#1` 의 부분집합 포함이 실패하고, 계보를 뒤늦게 더하면 기준선이 판정 뒤로 이동해 `#16` 이 겨냥한 바로 그 우회가 된다. 조치: 다음 창이 이 행의 grep 절을 실측표로 정정하면서 그 창의 계보에 `(old -> new)` 를 함께 얼린다. 인수처: M8 이후 이 원장을 여는 다음 창 — OUT-OF-OWNERSHIP 2026-08-21: 인수처: M8 이후 이 원장을 여는 다음 창. 계보가 기준선 커밋에 동결돼 이 창에서는 정정 자체가 게이트를 깨뜨린다
2026-08-21 | MEDIUM | .claude/plans/insuniverse-docs-13-relation-contract-m8.plan.md | **M8 계획서 §GROUND 관측 3 이 거짓이다 (M8 구현 중 실측).** 관측 3 은 *"`findings_structure_ok` 는 표제가 하나도 없는 파일을 통과시킨다 — 파서가 세는 `nfound` 를 어떤 판정도 읽지 않는다"* 라고 적었다. 착수 커밋 `9f1e09a` 의 `docs/_meta/verify/verify.sh:2551` 은 `if (nfound == 0) { printf "`## ` 발견이 0건이다" > "/dev/stderr"; F = 1 }` 이며, 표제 0개 파일을 그 함수에 직접 넣으면 `rc=1` 이다(실행 확인). 그 판정은 커밋 `2f57448`(m7 라운드 2)이 넣었다. 원장의 `…-m6.plan.md` R1 F4 행이 말한 열린 축은 *표제 0개*가 아니라 **파일은 두고 항목만 지우는** 방향이며, M8 은 그쪽을 `fixtask.findings_headings` golden 동결로 닫았다. 계획서 본문은 `mccp-plan-codex` receipt 의 `plan_hash` 에 결박돼 있어 이 창에서 정정할 수 없다 — 정정하면 receipt 가 stale 이 된다. 인수처: M8 계획서 재진입 시점 — OUT-OF-OWNERSHIP 2026-08-21: 인수처: M8 계획서 재진입 시점. `plan_hash` 결박이라 본문 정정이 불가하고 실측은 findings F-10 (3) 에 남긴다
2026-08-21 | LOW | .claude/plans/insuniverse-docs-13-relation-contract-m8.plan.md | **M8 계획서 §GROUND 의 원장 규모 `140행` 은 파싱 방식의 산물이다 (M8 구현 중 실측).** 착수 커밋 `9f1e09a` 에서 필드를 정확히 4개로 요구하는 파싱(`^<날짜> \| <심각도> \| <source> \| <finding>$`, finding 에도 `|` 금지)은 140행을, source 만 `|` 를 금지하고 본문에는 허용하는 파싱은 154행을 낸다 — 차이 14행은 본문에 `|` 를 담은 행이다. M8 구현이 승계한 M4 `parseBacklogRow` 는 후자이며 이 PRD 소속 35행은 두 파싱에서 같다. 계획서의 GROUND 표는 그 자체가 *"착수 시점 관측이고 리터럴 규범으로 박지 않는다"* 로 선언돼 있어 산출물에는 영향이 없다. 인수처: M8 계획서 재진입 시점 — OUT-OF-OWNERSHIP 2026-08-21: 인수처: M8 계획서 재진입 시점. GROUND 표는 규범이 아니라 관측으로 선언돼 있어 게이트 어디에도 물려 있지 않다
2026-08-21 | MEDIUM | .claude/plans/insuniverse-docs-13-relation-contract-m8.plan.md | **상시검사 `#6` 은 findings 기록의 *삭제* 방향만 닫는다 (M8 구현 중 관측).** 원장의 `…-m6.plan.md` R1 F4 행은 *"findings 신규 항목을 **요구**하는 검사가 없다"* 였고, M8 이 세운 `#6` 은 (a) `## ` 표제 0개 거부 (b) 파일별 표제 수를 `fixtask.findings_headings` 로 golden 동결 — 둘 다 **줄어드는 것**을 잡는다. *마일스톤마다 새 항목이 하나 늘어야 한다* 는 요구는 여전히 어떤 검사에도 없다. 그것을 기계로 걸려면 마일스톤 경계와 findings 항목의 결속이 필요하고 그 결속은 이 PRD 의 산출물이 아니다. 인수처: findings 신규 항목 요구를 여는 다음 창 — OUT-OF-OWNERSHIP 2026-08-21: 인수처: findings 신규 항목 요구를 여는 다음 창. M8 이 닫은 것은 삭제 방향이고 그 절반은 `#6` 이 실제로 진다
2026-08-21 | LOW | .claude/plans/insuniverse-docs-13-relation-contract-m8.plan.md | **`.claude/state/fix-task.d/` 5건을 새 생성기 형식으로 재생성하면서 손으로 적힌 작업 메모가 사라졌다 (M8 구현 중 관측).** `…-m5.md` 투영에는 원장 행에서 유도되지 않는 표 2행(`MCCP_REVIEW_SINGLE_PASS` 유지 확정 · 미추적 stale receipt) 이 손으로 적혀 있었고, `fixtask-projection.mjs render` 는 투영을 **원장 행의 결정적 함수**로 다시 만들므로 그 두 행이 남지 않는다. 그 파일들의 머리 주석이 스스로 *"정본은 backlog 행이며 이 파일은 작업 사본"* 이라 선언하고 `.claude/state/` 는 gitignore 대상이라 이력에도 없다 — 그 두 판정의 정본은 `.claude/notes/…-m5.md` 와 이 원장이다. 인수처: 없음 (규약이 이미 허용한 손실) — CLOSED-BY-DECISION 2026-08-21: 투영이 원장 행의 결정적 함수라는 것이 M4 이래의 규약이고, 그 규약이 손으로 적은 내용을 애초에 허용하지 않는다. 판정 정본은 notes 와 이 원장이다
2026-08-21 | MEDIUM | .claude/plans/insuniverse-docs-13-relation-contract-m8.plan.md | **`plan-conflict-detector.js` 가 이 계획서의 §Files to Change 표를 한 행도 매칭하지 못한다 (M8 구현 중 실측).** `detect --plan <m8 계획서> --files-changed "$(git diff --name-only 1515c48^..HEAD)"` 은 `{"conflict":true,"signal":"file-expansion","reason":"plan defines 34 files; diff has 53 unplanned"}` 를 낸다. diff 49건 중 `codex-findings-backlog.md` · `…-m8.gates.mjs` 처럼 **표에 명시된 파일까지 unplanned 로 센다** — 즉 매칭 0건이며 53 은 diff 전건이다. 같은 입력을 손으로 대조하면 표 34행 중 미변경 0건 · 표 밖 9건이다(전부 Implement-Codex R1 흡수 산출물과 정상 fixture). 이 상태에서 검출기 판정을 그대로 따르면 **거짓 `plan_conflict` 로 체인을 세우고** `STATE.md.chain_aborted` 를 켠다 — 검사가 자기 입력을 못 읽는데 그 출력이 차단 권한을 갖는 형태다. mccp 본체 파일이라 경계 B1 이 수정을 금지한다. 인수처: 상류 이슈 제기(#127·#128 계열) — OUT-OF-OWNERSHIP 2026-08-21: 인수처 상류 이슈. B1 이 mccp 본체 수정을 금지하고, 이 창은 검출기 출력을 실측으로 반증한 기록만 남긴다
2026-08-24 | MEDIUM | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m1.plan.md | **findings 파일 신설이 이 창의 소유가 아니다 (M1 착수 전 실측 · 계획서 관측 8).** `docs/_meta/verify/golden.txt` 101행 `findings.files` 가 현재 6개 파일을 동결하고 있어 `docs/_meta/findings/40-runtime-vendor-legal.md` 를 만들면 그 키가 어긋난다. 그런데 `docs/_meta/verify/**` 는 `docs/_meta/ownership.md` 상 `00-protocol` 소유이고 개정 위임은 `13-relation-contract` 에게 갔으며 그 상태가 `완료` 다 — 40 에게는 위임이 없다. 위임이 있었더라도 이 worktree 는 서브모듈 3종이 빈 디렉터리라 `verify.sh --update` 가 `router 디렉터리를 찾을 수 없다` 로 즉사한다(관측 1). 결과: 이 PRD 의 §회부 기록 자리(`docs/_meta/findings/40-runtime-vendor-legal.md`)가 **PRD 문면에는 있고 트리에는 없다.** M1 은 그 대신 문서 `limitations` 와 부록 산문에 관측을 담았다. 인수처: `golden.txt` 갱신 위임을 받는 창, 또는 서브모듈이 실재하는 worktree 에서 `verify.sh --update` 를 도는 창
2026-08-24 | MEDIUM | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m1.plan.md | **`schedules.yaml` 이 15건의 주석 선언 주기를 `cron: external-unknown` 한 값으로 접었다 (M1 구현 중 실측 · 계획서 관측 5).** 동결 stg `4d798f55` 의 `apps/api/src/schedules/` 16파일 중 15개가 `* 동작주기 : …` 주석을 갖고 그 값이 서로 다르다 — `5분` · `10분` · `매일 자정` · `매일 오전 6시` · `매일 23:59:59 (한국시간 기준)` · `매월 1일 자정` · `매일 아침 9시 / 저녁 18시` · `오후 7시` · `1분`, 그리고 `확인필요` 2건(`delete-analysis.schedule.ts:9` · `delete-fc.schdule.ts:8`). 인덱스는 이 15값을 전부 `external-unknown` 으로 접었고, 그래서 *"저장소가 의도 주기를 말한 배치"* 와 *"의도 주기조차 말하지 못한 배치"* 가 인덱스에서 구별되지 않는다. M1 은 그 구별을 문서 부록에 되살렸으나 그것은 산문이지 인덱스 필드가 아니다 — 다음 소비자는 다시 인덱스를 읽는다. 인수처: `12-index-runtime` 재진입 창 (예: `declared_cycle_comment: {value, anchor}` 필드 신설). 이 창은 `docs/_meta/index/**` 읽기 전용이라 못 고친다
2026-08-24 | HIGH | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m1.plan.md | **PRD §반드시 지킬 것·§Risks 의 `active-prod` 지시가 실측에 반증됐다 (D-1, 사용자 판정 대기).** PRD 는 *"선언 상태는 저장소로 전수 판정되므로 본문(`active-prod`)"* 을 지시하는데, `policy-candidates.runtime.jsonl` 의 `axis: schedule` **17/17** 이 `reachability.deployment_evidence: false` 이고 배포 스케줄러 16종은 `status_basis: gate-value-unknown` 이다. 정본 어휘(`.claude/meta/05-final-spec.md` §3)의 `active-prod` 는 *prod 도달* 과 *게이트 부재·활성* 두 다리를 요구하는데 둘 다 서지 않는다. M1 산출물은 실측을 따라 선언 축도 `conditional-unknown` 부록으로 두었고, 그 결과 본문 정책이 0건이다 — 게이트 `#14a` 가 `active-prod` 자격을 0건으로 계수해 그 사실을 기계로 낸다. **계획서가 이 PRD 로 판정받으므로 같은 창이 PRD 문면을 고치면 기준과 결과가 함께 움직인다**(계획서 관측 17). 인수처: 사용자 판정 — PRD 지시를 실측에 맞춰 개정하거나 다른 배치 근거를 제시할 것. 그 판정 전에는 마일스톤 1 을 `complete` 로 닫지 않는다 — RESOLVED 2026-08-25(사용자 판정, 커밋 `9768d49`): PRD §반드시 지킬 것 3번째 항목이 선언 축을 본문(`active-prod`)으로 지시하던 것을 두 축 모두 `conditional-unknown` 부록으로 개정하고 §Risks 해당 행 확률을 `실현됨` 으로 바꿨다. 승격 경로(`#14c`·`#14d` 인덱스 유도)를 문면에 박았다. 이 행이 세운 종료 조건(*그 판정 전에는 마일스톤 1 을 `complete` 로 닫지 않는다*)은 그 커밋으로 해제됐고 `46069af` 가 마일스톤을 `complete` 로 전이했다. closure 정본 `.claude/milestone-closures/1-04-runtime-topology.md` §착수 전 해소
2026-08-24 | LOW | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m1.plan.md | **PRD §착수 전 판정 P-3 의 samsung 라벨 한 낱말이 정본과 다르다 (D-2, 사용자 판정 대기).** P-3 은 라벨 2개를 `samsung-s2-report` · `samsung-s2-report-preview` 로 적었으나 `docs/_meta/index/schedules.yaml` 의 실제 `variants[].label` 은 `samsung-s2-report-final` · `samsung-s2-report-preview` 다 (prod `2d3b238e` 의 `apps/api/dockerfile` 55행·54행 그대로). M1 은 정책 id 를 `variants[].label` 에서 유도하므로 게이트는 깨지지 않는다(`#8` 이 18단위 exact 대조로 통과). 다만 PRD 문면이 자기 근거 파일과 어긋난 채 남으면 다음 독자가 PRD 를 정본으로 읽는다. 인수처: 사용자 판정 — PRD P-3 문면 정정 여부. 같은 창이 자기 판정 기준을 고치지 않는다는 규약(관측 17)에 따라 M1 이 손대지 않았다 — RESOLVED 2026-08-25(사용자 판정, 커밋 `9768d49`): PRD §P-3 의 samsung 라벨을 `samsung-s2-report` → `samsung-s2-report-final` 로 정정했다. 스케줄러 키를 라벨로 오기한 것이었다. closure 정본 `.claude/milestone-closures/1-04-runtime-topology.md` §착수 전 해소
2026-08-24 | LOW | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m1.plan.md | **`.claude/prds/.claude/state/hook-trace/` 에 다른 세션의 훅 추적 잔재가 미추적으로 남아 있다 (M1 구현 중 관측).** `.gitignore` 는 저장소 루트의 `.claude/state/` 를 제외하지만 `.claude/prds/.claude/state/` 는 그 패턴에 걸리지 않아 `git status` 에 상시 노출된다. 어떤 게이트도 이 경로를 보지 않고 M1 의 산출과 무관하므로 이 창은 손대지 않았다(전역 지시 2026-08-18 범위 밖 결함 처리). 인수처: `.gitignore` 를 여는 창 — `**/.claude/state/` 로 넓히거나 잔재를 지울 것 — RESOLVED 2026-08-24(code-review L3 수용): 잔재 1파일 296바이트를 지웠다. `.gitignore` 는 `00-protocol` 소유라 손대지 않았고 패턴은 그대로다 — 같은 경로에 다시 쓰이면 재발한다. 패턴 확장은 여전히 `.gitignore` 를 여는 창 몫
2026-08-24 | MEDIUM | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m1.plan.md | **Acceptance 한 항목의 검증 방법이 이 브랜치 상태에서 성립하지 않는다 (code-review M1 수용).** 계획서 Acceptance 는 *"이 창이 Source PRD 의 규범 문면을 편집하지 않고 마일스톤을 `complete` 로 전이하지 않는다 — `(미검증)` … diff 로 확인한다"* 인데, `git log main..HEAD` 가 **0건**이라 plan 창의 PRD 편집과 implement 창의 편집 사이에 커밋 경계가 없다. 실제로 `git diff HEAD -- <PRD>` 안에 D-1 이 지적한 `+**스케줄러 활성 정책은 … 본문(active-prod)**` 규범행이 들어 있고, 그것이 어느 창 산출인지 diff 만으로는 귀속되지 않는다. 절반(마일스톤 `in-progress` 유지)은 PRD 200행으로 확인되지만 나머지 절반은 판정 불가다 — 명시된 검증 절차가 그 대상을 못 본다(층위 5). 계획서는 `plan_hash` 결박이라 이 창이 Acceptance 문면을 고치지 않는다. 인수처: 다음 마일스톤 계획 저작 — 창별 커밋 경계를 전제로 하는 Acceptance 항목은 그 경계를 먼저 만들거나(plan 창 산출을 선커밋) `(미검증)` 사유에 "커밋 경계 부재로 귀속 불가" 를 명시할 것
2026-08-24 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m1.plan.md | 검사 #8 의 프로브 4종이 하네스 안에서 생성되고 실행 후 삭제되며 --selfprobe 매트릭스(#3·#4·#5·#6·#10)에 #8 도 그 생성기도 들어 있지 않다 — 픽스처 생성과 출력 분류가 같이 틀리면 이 창의 유일한 키 부재 측정이 공허하게 통과한다 (Plan-Codex R1 F3, DEFER_TO_BACKLOG). 처방은 버전 관리된 IA·policy 예제에서 트리를 씨앗 삼아 source digest 를 확인하고 지정 config 키 하나만 변이시킨 뒤 #8 과 그 생성기를 selfprobe 매트릭스에 넣는 것. 이 창에서 못 하는 이유는 상시 픽스처가 .claude/templates/doc-kit/** 소유이고 이 PRD 에 그 개정 위임이 없기 때문이다(계획서 관측 6). 인수처: doc-kit 픽스처 오버라이드 일반화를 여는 창 — PARTIALLY-RESOLVED 2026-08-24 (Plan-Codex R2 F3): 프로브를 합성 대신 examples/ia-example.md · policy-example.md · template-config.insuniverse.yaml 정본 예제 복사 + source digest 확인으로 바꾸고, 대조군에서 exits 대상 관측 1건을 셋째 단언으로 요구하도록 검사 #8 을 고쳤다. 복사는 읽기 전용이라 위임이 필요 없다. 남은 잔여는 #8 과 그 생성기를 --selfprobe 매트릭스에 넣는 것 하나이며 그것만 doc-kit 소유다 — OWNED-DEFERRED 2026-08-24: 마일스톤 1 구현으로 잔여가 다시 좁아졌다. 검사 `#8` 의 프로브는 정본 예제 복사 + digest 대조로 구현됐고 대조군 2종이 실제로 통과한다. `--selfprobe` 행렬은 **표 추출기 호출부** 축으로 돌며 `#8` 의 프로브 생성기는 그 축에 없다 — 그것을 넣으려면 상시 픽스처가 필요하고 `.claude/templates/doc-kit/**` 소유다. 인수처 불변
2026-08-24 | HIGH | .claude/prds/insuniverse-docs-50-domain.prd.md | **사용자 결정 필요 — 이 PRD 가 발신한 회부 R-50-1 이 도달할 활성 소유자가 없고, 같은 벽이 `docs/_meta/findings/50-domain.md` 개설에도 선다 (마일스톤 1 실측).** (1) `docs/_meta/onboarding-questions.yaml` 에서 `owner: 50-domain` 인 질문 23건 중 9건의 `src` 가 `"…prd.md §MVP — 산출 문서 18종"` 인데 그 절 제목은 이제 `### MVP — 산출 문서 20종` 이다. 그 파일은 `00-protocol`(archived) 배타 소유이고 `ownership.md` §개정 위임 표에 그 경로의 위임을 받은 PRD 가 하나 실려 있으나 그 PRD 도 종료·archived 다 — **고칠 수 있는 활성 주체가 없다.** `verify.sh` 의 onboarding 레코드 검사는 `src` 의 접두와 `§` 뒤 비어 있지 않음만 보므로 게이트도 잡지 못한다. (2) `docs/_meta/findings/50-domain.md` 를 만들면 golden 의 `findings.files` · `fixtask.findings_headings` 두 키가 움직여 `verify.sh --update` 가 필요한데 `docs/_meta/verify/**` 도 같은 소유다 — 20·30·40·60·70 다섯 PRD 가 첫 findings 를 열 때 같은 벽에 선다. 대안 A: archived 소유 경로에 대한 개정 위임을 활성 PRD 하나에 연다. 대안 B: golden 재동결을 `--update` 없이 허용하는 예외를 verify 소유자가 신설한다. 대안 C: 현행 유지 — 발신 기록과 이 행으로 남기고 다음 창이 다시 선다. 마일스톤 1 은 C 를 택하되 선택 자체는 사용자 몫이다. 인수처: 사용자 판정 — OWNED-DEFERRED 2026-08-24: 이 PRD 가 관측했고 이 PRD 가 못 닫는다. 마일스톤 1 은 findings 파일을 만들지 않는 것으로 (2) 를 우회했고(게이트 `#11`) (1) 은 발신 기록에서 멈춘다
2026-08-24 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m1.plan.md | **단일통과 토글이 이 저장소에서 발화하지 못한다 — backlog 헤더 부재 (마일스톤 1 계획 창 실측).** `MCCP_REVIEW_SINGLE_PASS=deadline_pressure` 가 설정돼 있고 relaxation 이 실제로 걸렸으나, 그 전제인 backlog 자동 적재가 exit 12 로 막혔다: *"`.claude/plans/codex-findings-backlog.md` has no `| Date | Severity | Source plan | Finding |` header row — derive/sources/backlog.js anchors the table on exactly that line"*. 이 저장소의 backlog 는 헤더 없는 평문 행 원장이고 그 형식이 이 파일 머리에 규약으로 적혀 있다. 게이트가 스스로 낸 복구 지시가 *"토글을 끄고 흡수하라"* 였고 계획 창이 그 경로를 탔다 — 이견 9라운드가 자동 적재 없이 손으로 판정됐다. 헤더 정규화는 mccp 소비자 쪽 형식이며 이 PRD 의 축이 아니다. 인수처: backlog 형식 정규화를 여는 창 또는 상류 이슈 — OWNED-DEFERRED 2026-08-24: 사실만 올린다. 이 창은 형식을 바꾸지 않는다 — 바꾸면 이 원장을 읽는 기존 게이트(`fixtask-projection.mjs` · 이 마일스톤의 검사 `#5`)가 함께 움직인다
2026-08-24 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m1.plan.md | **계획서 검사 `#9` 의 기대가 두 개의 서로 다른 계수를 같은 것으로 적었다 (마일스톤 1 구현 중 실측).** 그 기대는 *"규칙 수 유도 5행이 `#6`·`#7` 의 파티션과 값까지 일치"* 라고 적고 근거를 *"총수·전체는 `#6` 의 트리 전수에서, flow·policy·ia 는 `#7` 이 검사한 템플릿 파티션에서 유도해 대조한다"* 로 둔다. 그러나 selftest 의 그 5행은 **lint 규칙 수**(총수 20 · 전체 13 · flow 4 · policy 2 · ia 1, 근거 `.claude/templates/doc-kit/README.md` 77행과 `lint-docs.mjs` 의 `RULE_SCOPES`)이고 `#6`·`#7` 의 파티션은 **문서 수**(트리 전수 53 · ia 2 · policy 8 · flow 10)다. 두 수열은 어느 항도 같지 않으므로 문면 그대로 구현하면 검사가 **항상 붉다**. 구현은 두 축으로 갈랐다 — (a) 5행의 `산문`/`유도` 두 수를 하네스가 직접 파싱해 같은지 재확인하고(`ok` 토큰을 믿지 않는다) (b) PRD 규칙표 4행이 각 규칙에 붙인 문서 부류를 `lint-docs.mjs` 가 코드에서 유도한 `RULE_SCOPES[].templates` 와 대조한다. (b) 가 이 검사의 외부 기준 대조 자리를 대신한다. 인수처: 이 마일스톤 (구현에서 흡수 완료) — ABSORBED-M1 2026-08-24: 기대 문면의 오류이고 계획서는 봉인돼 있어(`plan_hash`) 본문을 고치지 않았다. 실제 검사는 위 (a)+(b) 이며 그 사실을 구현 리포트와 이 행에 남긴다
2026-08-25 | MEDIUM | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m1.plan.md | **본문 산문의 `dockerfile:<행>` 인용 67건은 여전히 한정자가 없다 (PR-Codex R1 F1 흡수 잔여).** F1 흡수는 프론트매터에 `anchors_qualified` 를 세우고 게이트 `#9a` 가 그 값을 해석하도록 닫았다 — 기계 판독 경로는 자족한다. 그러나 독자가 실제로 읽는 §강제 지점·부록 산문의 인용(`insuniverse-server/apps/api/dockerfile:55` 등 67건)은 bare 그대로이고, `#9b` 는 `src/schedules/**`·`push/**` 인용만 보므로 dockerfile 인용을 한 건도 검사하지 않는다. 그래서 `declaration:samsung-s2-report-final` 의 산문 인용 `dockerfile:55` 를 문서 `last_verified: 4d798f55`(stg)로 읽으면 `delete-invoice-files` 를 짚는다 — F1 이 프론트매터에서 지적한 것과 같은 어긋남이 산문에 남아 있다. 본문 164·185·194행이 두 기준점의 행 밀림을 산문으로 설명하지만 그것은 세 정책에 대한 서술이고 인용 67건 전체를 덮지 않는다. 이 창이 닫지 않은 이유: 인용 67건 재작성은 문서 전역 문법 변경이고 그 검사(`#9c`)까지 함께 세워야 하는데, PR 게이트는 review-only 라 그 범위를 이 창에서 열 수 없다. 인수처: 이 PRD 마일스톤 2 착수 창 — 산문 인용에 한정자를 붙이고 `#9b` 를 dockerfile 인용까지 넓힐 것
2026-08-25 | MEDIUM | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m1.plan.md | **`.github/workflows/api.yml` 이 인용되지 않은 배포 선언 근거다 (PR-Codex R2 F1 실측).** 동결 stg `4d798f55` 의 그 파일 `deploySchedules` 잡이 `TYPES=( … )` 로 스케줄러 **15종을 이름으로 열거**하고 task-def env 에 `RUN_MODE=scheduler` · `SCHEDULER_TYPE=$TYPE` 를 기록한다(191~235행). 인덱스 `schedules.yaml` 도 이 문서도 이 파일을 근거로 들지 않으며, 어느 게이트도 이 파일을 읽지 않는다. 세 계수가 서로 다르다 — workflow TYPES **15** · dockerfile CMD 라벨 **17**(prod 기준, samsung 2종 포함) · 인덱스 배포 스케줄러 **16**. 이 어긋남은 현재 아무 검사도 보지 않는다. 이 창이 닫은 것은 그로 인해 **거짓이 된 문면**뿐이다(`unknown_reason` 의 *"그 값은 저장소 밖"* → 실측 문면으로 정정, 31건). 판정(`conditional-unknown`)은 바뀌지 않는다 — `active-prod` 자격은 `deployment_evidence` 가 정하고 그것은 후보 인덱스 소유다(D-1 봉인). 인수처: `12-index-runtime` 재진입 창(workflow 를 `variants[].anchors` 근거로 승격) → 그 뒤 이 PRD 창이 세 계수 대조 게이트를 세운다 — PARTIALLY-RESOLVED 2026-08-25(PR-Codex R3 흡수): 게이트 쪽 절반을 닫았다. `#7b` 가 두 기준점에서 이 파일의 `TYPES` 를 파싱해(stg 15 · prod 17) 정책 `variants[].label` 과 조인하고, 문서의 주장 문장을 그 값에서 유도해 프론트매터·본문 양쪽에 강제한다. 남은 절반은 인덱스 쪽 — `schedules.yaml` `variants[].anchors` 가 이 파일을 근거로 담지 않으며 그 승격은 `12-index-runtime` 배타 소유다. dockerfile CMD 라벨 17 과의 세 계수 대조도 그 승격 뒤에 선다
2026-08-25 | HIGH | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m1.plan.md | **`delete-fc` 배치는 소스 수준에서 진입 함수가 호출되지 않는다 (PR-Codex R6 F1 실측 · 저장소 밖 결함).** 동결 stg `4d798f55` 와 prod `2d3b238e` 양쪽에서 `apps/api/src/schedules/delete-fc.schdule.ts` 최상위가 `async () => { … };` 함수 **표현식**이고 그것을 부르는 구문이 없다. 다른 15종은 같은 자리에 `})();` IIFE 를 둔다. 진입점 분기가 이 라벨을 골라 `node dist/…/delete-fc.schdule.js` 를 실행해도 `NestFactory.createApplicationContext` 와 `deleteFc()` 에 도달하지 않는다. 이 배치의 주석은 *탈퇴 이후 일년이 지난 경우 유저 정보를 삭제합니다* 이므로 **보존 정책이 수행된다는 전제가 저장소 관측으로 반증된다.** 이 창이 한 일은 관측을 문서·게이트에 고정한 것뿐이다 — `#9c` 가 진입 호출 증거(IIFE · @Cron · 명명 호출)를 유도해 미호출 집합을 문서 `limitations` 와 양방향 대조한다. **소스 수정은 이 저장소 소유가 아니다**(`insuniverse-server` 서브모듈, INV2 로 포인터도 동결). 인수처: insuniverse-server 저장소 — 한 줄 수정(`};` → `})();`)이지만 그 배치가 그동안 한 번도 돌지 않았다는 뜻이므로 보존 정책 소급 영향 판단이 함께 필요하다. 사용자 판정 대상
2026-08-25 | HIGH | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m2.plan.md | **FAX 응답 대기 임계에서 스케줄러 주석과 서비스 코드가 갈린다 (M2 구현 중 실측 · 계획서 관측 4 가).** 동결 stg `4d798f55` 에서 `apps/api/src/schedules/fax-status.schedule.ts:12` 는 `* - 3시간 초과 시: FAILED 처리 (응답 시간 초과)` 인데 실제 임계는 `apps/api/src/modules/fax/fax.service.ts:1195` 의 `const TIMEOUT_MS = 1 * 60 * 60 * 1000; // 1시간` 이다. 같은 메서드 스팬 안 수량 주석 5행(1173 · 1178 · 1195 · 1221 · 1245)이 전부 1시간이라 갈리는 것은 스케줄러 docblock 한 줄뿐이다. 기원은 `efe6d58f`(2026-04-13) — 코드만 3시간에서 1시간으로 옮기고 docblock 을 두고 갔다. M2 는 판정하지 않고 `03-monitoring.md` 근거 대조표에 판정 `불일치` 로 두 원문을 함께 실었으며 게이트 `#5` 가 그 판정을 재계산한다. 인수처: insuniverse-server 저장소 — docblock 정정 또는 임계 환원 중 어느 쪽이 의도인지 판단이 필요하다
2026-08-25 | HIGH | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m2.plan.md | **인증 stale 임계에서 주석 2개소와 코드가 갈린다 (M2 구현 중 실측 · 계획서 관측 4 나).** 동결 stg `4d798f55` 에서 `apps/api/src/modules/order/order-detail/order-detail.repository.ts:259` 가 `5분이상` 이라 적고 같은 메서드 `:265` 는 `.subtract(10, minute)` 다. 같은 오기가 `order-detail.service.ts:410` 에도 있다. 스케줄러 docblock `analysis-status.schedule.ts:11` 은 `일정시간 경과` 로 숫자를 적지 않아 그 자리에서는 갈림이 보이지 않는다. 기원은 `3abbba06`(2025-04-17) — 코드만 10분으로 옮기고 주석 두 곳을 두고 갔다. 사용자 관점에서는 인증 대기가 실패로 정리되기까지가 5분인지 10분인지가 갈린 채 남아 있다. M2 는 판정하지 않고 근거 대조표에 판정 `불일치` 로 실었다. 인수처: insuniverse-server 저장소
2026-08-25 | LOW | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m2.plan.md | **정산 스케줄러 2종의 docblock 제목이 같다 (M2 구현 중 실측 · 계획서 관측 5).** 동결 stg `4d798f55` 에서 `settlement-agency.schedule.ts:8` 과 `settlement-client.schedule.ts:8` 이 둘 다 `* 기업 정산 스케줄러` 다. 파일명과 호출하는 정산 서비스(`AgencySettlementService` 대 `ClientSettlementService`)로만 갈린다. 어떤 게이트도 이 축을 보지 않으며 M2 는 `02-billing-cycles.md` 의 `billing:settlement-agency` `limitations` 와 부록 산문에 관측으로 남겼다. 인수처: insuniverse-server 저장소 — docblock 제목 정정
2026-08-25 | MEDIUM | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m2.plan.md | **주석 수량 유도가 한글 수사를 못 본다 (M2 구현 중 실측 · 계획서 관측 13 사각 2).** M2 하네스의 주석 정규 쌍 추출은 아라비아 숫자 + 한글 단위 7종만 읽으므로 `delete-fc.schdule.ts:9` 의 `탈퇴 이후 일년이 지난 경우` 가 커버리지 단위 밖이다. 게이트 `#12d` 가 그 건수를 매 실행 찍지만(현재 1건) 그 행을 요구하지는 않는다. 한글 수사 어휘를 늘리는 것은 수렴하지 않는 축이라 목록을 표본으로 두고 계수만 낸다. 인수처: 같은 유도기를 재사용하는 다음 창 — 수사 어휘를 늘릴지 아니면 소스 주석을 아라비아 숫자로 정정할지 판단
2026-08-25 | MEDIUM | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m2.plan.md | **`docs/_meta/findings/40-runtime-vendor-legal.md` 신설이 M2 에서도 닫히지 않는다 (계획서 관측 8 재확인).** `docs/_meta/verify/golden.txt` 101행 `findings.files` 가 6개 파일을 동결하고 있고 `docs/_meta/verify/**` 는 40 소유가 아니다. M1 과 같은 자리이며 변동이 없다. M2 는 그 대신 세 문서의 `limitations` 와 근거 대조표가 관측을 담았다. 인수처: `golden.txt` 갱신 위임을 받는 창, 또는 서브모듈이 실재하는 worktree 에서 `verify.sh --update` 를 도는 창
2026-08-25 | MEDIUM | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m2.plan.md | **M1 산문의 `dockerfile:<행>` 인용 67건 한정자 부착 인수처가 M2 로 지정돼 있었으나 M2 가 못 받는다 (M2 구현 중 판정).** 2026-08-25 자 `PR-Codex R1 F1 흡수 잔여` 행이 인수처를 *이 PRD 마일스톤 2 착수 창* 으로 지정했다. 그런데 M2 계획서 §NOT Building 이 `04-runtime-topology.md` 재편집을 명시적으로 금지하고 게이트 `#0` 이 그 파일의 워킹트리 변경 0 을 검사한다 — M1 창에 receipt 3종이 봉인돼 있어 같은 파일을 M2 가 고치면 그 봉인이 stale 로 떨어진다. 즉 인수처 지정과 M2 의 범위 계약이 충돌하며 M2 는 계약을 따랐다. 인수처 재지정 필요: M1 문서를 다시 여는 별도 창(예: M1 재봉인 창) 또는 이 PRD 의 마일스톤 6(리뷰 수렴)
2026-08-25 | LOW | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m2.plan.md | **M2 계획서 §근거 대조 로케이터 산문의 계수 둘이 실측과 다르다 (M2 구현 중 실측).** 계획서 관측 14 는 *로케이터 19건* · *수량 주석 20행* 이라 적었으나 같은 절의 표는 21행이고 하네스 유도는 임계 15행 · 수량 주석 21행 · 로케이터 21건이다. 계획서 Validation 의 `#12c` 기대 문면은 이 값들을 `<L>`·`<t>`·`<c>` 로 두어 게이트가 계산해 찍게 했으므로 검사는 영향받지 않는다(UI7 이 의도한 형태가 그것이다). 어긋난 것은 산문 계수뿐이다. 계획서 본문은 `plan_hash` 앵커라 착수 후 편집하지 않았다. 인수처: 다음 창의 계획서 저작 — 산문에 계수를 적을 때는 그 자리에도 유도 출력을 인용할 것
2026-08-25 | MEDIUM | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m2.plan.md | **게이트 `#6` 의 존재 다리가 구조적으로 도달 불가능하다 (M2 구현 중 음성 프로브 관측).** `#6` 은 두 다리를 본다 — (a) `unknown_reason` 이 `04-runtime-topology.md#schedule:<id>` 를 문자열로 담는가 (b) 그 `schedule:<id>` 가 M1 프론트매터에 실재하는가. 음성 프로브에서 참조 id 를 없는 이름으로 바꾸면 (a) 가 먼저 떨어져 (b) 의 메시지에 도달하지 않는다. (b) 가 단독으로 떨어지려면 문서의 정책 집합에는 있고 M1 프론트매터에는 없는 스케줄러가 필요한데, `#2c` 가 정책 집합을 PRD 펜스에 결박하고 M1 프론트매터가 17종 전건을 담고 있어 그 상태가 성립하지 않는다. 즉 (b) 는 다른 게이트가 무너질 때만 발화하는 fail-closed 후위 검사이며 이 창에서 음성 관찰을 얻지 못했다. 인수처: M1 프론트매터를 줄이는 창이 생기면 그 창에서 관찰할 것
2026-08-25 | MEDIUM | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m2.plan.md | **Codex R4 재봉인 라운드를 못 돌렸다 (M2 plan 창 판정 · implement 창 재확인).** 계획서 §Codex Adversarial Review 가 R1~R3 3라운드 완주와 R4 미완주를 기록하고, 사유가 계획서가 아니라 companion 장애임을 최소 프로브(`--focus "Reply with the single word OK."` 가 300초 초과)로 반증했다. implement 창에서도 같은 wrapper 가 `classification=disabled`(전역 `MCCP_CODEX_DISABLED=1`)로 short-circuit 해 Implement-Codex 라운드가 0이다 — receipt 는 `codex_verdict=skipped` · `codex_disabled=true` 이며 `converged` 가 아니라 cross-gate dedupe 는 fail-closed 로 남는다. 리뷰를 못 받은 축: 계획서 쪽 R4 겨냥분(Patterns to Mirror 인용의 실재 · Files to Change 누락 · Task Action 실행 가능성)과 구현 쪽 implement-time 결정 5건(`.claude/notes/insuniverse-docs-40-runtime-vendor-legal-m2.md` §2.5.2 목록). 인수처: companion 복구 후 `/mccp:plan` 재실행 또는 `MCCP_CODEX_DISABLED` 를 되돌린 뒤 `/mccp:prp-implement` 재진입
2026-08-25 | LOW | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m2.plan.md | **`golden.txt` `fixtask.cohort_count` 동결값이 워킹트리 유도값과 이미 1 벌어져 있다 (M2 구현 중 실측).** 동결값은 42 이고 `node docs/_meta/verify/fixtask-projection.mjs digest-set .claude/plans/codex-findings-backlog.md | wc -l` 은 43 을 낸다. **이 창이 더한 10행은 그 계수를 움직이지 않는다** — `digest-set` 의 기본 filter 가 `DEFAULT_FILTER`(다른 PRD 축 slug)이고 이 창의 행은 그 문자열을 담지 않아 코호트 밖이다. 유도 전후 실측으로 43 → 43 을 확인했다. 남은 1 의 벌어짐은 M8 이후 추가된 1행에서 왔고 `docs/_meta/verify/**` 갱신 위임이 40 에게 없어 이 창이 닫을 수 없다. 인수처: `golden.txt` 갱신 위임을 받는 창 — 위 findings 파일 행과 같은 인수처다
2026-08-25 | LOW | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m2.plan.md | **계획서 §Validation 펜스가 `check0` 을 13회 재실행한다 (code-review Local Mode 지적 6 · 실측).** 펜스는 `node "$G" check0` 뒤 `check1`~`check12` 를 차례로 부르는데, 하네스의 선행 검사 핸드오프(`M2_GATES_CHECK0`)는 `all` 이 자기 자식에게만 넘긴다. 그래서 개별 `checkN` 진입마다 `check0` 이 다시 돌고 그때마다 M1 하네스 `all`(node 15프로세스)을 spawn 한다. 실측: `check0` 단독 37초 · 펜스 전체 약 8분 · `all` 서브커맨드는 40초대. 고칠 자리는 펜스 첫 `check0` 성공 뒤 `export M2_GATES_CHECK0=ok` 한 줄이며 `set -e` 아래라 fail-closed 성질은 그대로다. **이 창이 닫을 수 없는 이유: 그 한 줄이 계획서 본문이고 `mccp-plan-codex` receipt 가 `plan_hash` 로 봉인한다.** 인수처: 이 PRD 의 다음 계획 저작 창 — 게이트 하네스를 계획서 밖 스크립트로 빼는 저장소에서는 펜스가 선행 검사 핸드오프를 명시적으로 export 하도록 규약화할 것
2026-08-25 | LOW | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m2.plan.md | **흡수 라운드가 검사 3종(`#6b` · `#9b` · `#12e`)과 `#11` 자기검증 6건을 신설해 계획서 §Validation 의 검사 목록보다 실제 출력이 넓어졌다 (code-review 흡수 부수효과).** 계획서는 `#0`~`#12` 를 선언하고 `# 기대:` 문면에 각 검사의 정상 출력을 적는다. 신설분은 전부 접미 라벨 추가라 기존 문면은 축자 그대로이고 **줄어든 문면은 없다** — 어긋남은 출력이 늘어난 방향 하나뿐이며 펜스는 출력을 문자열로 단언하지 않아 rc 0 이다. 그럼에도 계획서를 읽는 사람은 검사 목록이 전부라고 읽는다. 인수처: 다음 계획 저작 창 — 검사 목록을 계획서가 아니라 하네스 `--help` 에서 유도해 인용하는 형태로 옮길 것
2026-08-28 | HIGH | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m7.plan.md | **PRD Success Metric *리뷰 불일치 수렴 = 2라운드 연속 0건* 이 M7 종료 시점에도 미충족이다.** 라운드 1 수렴 계수가 8 이고 라운드 2 가 0 이어도 수열은 `8, 0` 이라 연속 0건 2회는 라운드 3 이 있어야 성립한다. M7 은 궤도의 두 번째 점을 실측으로 찍을 뿐 지표를 충족시키지 못하며, 게이트 `#13` 이 그 상태를 `미충족` 으로 출력한다. 인수처: 이 PRD 의 후속 창 — 라운드 3 원장을 세우는 첫 창 · id=40m7-round3-pending
2026-08-28 | HIGH | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m7.plan.md | **`docs/_meta/findings/40-runtime-vendor-legal.md` 개설이 다섯 번째 창에서도 막혔다 (M7 Task 0 프로브 실측).** `golden.txt` 101행 `findings.files` 동결 8건에 이 파일이 없고, `verify.sh` 는 그 값을 `find docs/_meta/findings -maxdepth 1 -type f` 로 유도하므로 파일을 세우는 순간 유도 집합이 9가 돼 `--check` 가 어긋난다. 해소에 필요한 `verify.sh --update` 는 `docs/_meta/verify/**` 위임분이고 이 PRD 는 그 위임을 받지 않았다. 같은 golden 파일 95행 `ownership.inherited_additions` 는 반대로 이 파일을 이미 싣는다 — 한 파일 안에서 두 키가 서로 반대를 말한다. 인수처: `00-protocol` 의 golden 개정 위임을 받는 창 · id=40m7-findings-file-still-blocked
2026-08-28 | HIGH | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m7.plan.md | **이 원장을 읽는 두 소비기의 파싱 규칙이 정확히 반대라 어느 쪽에서도 전건이 보이지 않는다 (M7 게이트 `#12` 실측).** mccp `derive/sources/backlog.js` 는 표 헤더를 찾아 그 **아래**만 스캔하고, 저장소 `docs/_meta/verify/fixtask-projection.mjs` 의 `parseBacklogRow` 는 행이 날짜로 **시작**할 것을 요구해 헤더 **위**만 읽는다. 이 PRD 행 기준 각각 43·21 이고 교집합은 0 이다. 두 파서의 통일은 한쪽이 저장소 밖(mccp)이고 다른 쪽이 `docs/_meta/verify/**` 소유라 이 PRD 범위 밖이다. 인수처: `00-protocol` — `docs/_meta/verify/**` 개정 위임을 여는 창 · id=40m7-backlog-parser-split

## 패널 이월 (mccp 소비자 앵커)

`derive/sources/backlog.js` 와 `plan-review/backlog-append.js` 는 아래 헤더 행을 앵커로 표를 읽는다 —
헤더가 없으면 적재분이 **전 소비자에게 비가시**다. 위쪽 평문 행들은 이 저장소의 원래 형식이며
그대로 둔다(추가 전용 원장 — 기존 행은 고치지 않는다). 신규 이월은 이 표 아래로만 붙는다.

위 평문 행이 그 상태로 쌓여 있었고 `backlog-append` 가 exit 12 로 그것을 드러냈다(2026-08-24 실측).
기존 평문 행의 표 이설은 별건이며 여기서 하지 않는다.

| Date | Severity | Source plan | Finding |
|---|---|---|---|
| 2026-08-24 | CRITICAL | .claude/plans/insuniverse-docs-60-history-deprecated-m1.plan.md | L2 test: Validation checks #1-#11 comprehensively validate that the plan was implemented correctly · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated-m1.md · id=898a3cb3 |
| 2026-08-24 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m1.plan.md | L2 test: The plan's Acceptance criteria state that findings file `60-history-deprecated.md` will contain exactly observations G16 and G17 (line 431: '`findings/60-history-deprecated.md` 에 G16 · G17 두… · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated-m1.md · id=27024676 |
| 2026-08-24 | FAIL | .claude/plans/insuniverse-docs-60-history-deprecated-m1.plan.md | L2 test: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated-m1.md · id=2862500d |
| 2026-08-24 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m1.plan.md | **findings 파일의 내용 동일성을 보는 검사가 없다 (M1 구현 중 확인 · L2 test HIGH 판정 대조).** Acceptance 는 `findings/60-history-deprecated.md` 에 G16·G17 두 관측이 있다고 적고 게이트를 `#1` 로 단다. 그런데 `verify.sh` 가 보는 것은 `fixtask.findings_headings` 의 표제 **수**(=2)와 필수 6항목 구조뿐이다 — 다른 주제 2건도 같은 값을 낸다. 즉 그 Acceptance 항목은 실제로는 `(미검증)` 인데 그렇게 적혀 있지 않다. 계획서 본문은 `plan_hash` 로 receipt 에 결박돼 있어 이 창에서 고치지 않는다(고치면 plan-codex receipt 가 stale). 인수처: 이 PRD 의 M2 — 실 폐기 문서를 발행하면서 findings 항목↔관측 결속을 열 수 있는 첫 창 · id=27024676-adj |
| 2026-08-24 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m1.plan.md | **검사 `#3`·`#7` 의 기준선 앵커가 변경 창 안에 있다 (계획서가 `(미검증)` 으로 이미 노출한 잔여의 원장 기록).** 두 검사는 `git log --diff-filter=A -- <하네스>` 로 특정한 커밋의 blob 을 유도 원본으로 읽어 같은 창 자기승인을 막는다. 그 커밋 자체는 이 브랜치가 만들었고 이 저장소에는 CI 도 보호 ref 도 없어 이력 재작성으로 앵커를 다시 쓸 수 있다 — 변경 창 밖 앵커가 없다. 없는 앵커를 있는 척 검사하지 않는다(INV4). 인수처: 없음 — 외부 앵커(보호 ref·CI)가 생기는 시점까지 구조적으로 해소 불가이며 그것이 판정이다 · id=60m1-anchor |
| 2026-08-24 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m1.plan.md | **이 창의 backlog 이월분이 `fixtask.cohort_*` 동결 밖이다 (M1 구현 중 실측).** m8 이 세운 코호트 동결은 `fixtask-projection.mjs` `parseBacklogRow` 가 읽는 **평문 행**만 담는다. 이 파일은 이제 mccp 소비자(`derive/sources/backlog.js` · `plan-review/backlog-append.js`)가 요구하는 표 형식 절을 함께 갖고, 신규 이월은 그 표로 들어간다 — `digest-set` 은 기준선 blob 과 현재 파일 양쪽에서 42건 동일을 내고 `fixtask.cohort_count`·`cohort_m8` 은 움직이지 않는다. 즉 **표에 적은 이월 행은 나중에 지워도 어떤 게이트도 붉어지지 않는다** — m8 관측 5 가 닫으려던 바로 그 자리가 새 형식에서 다시 열렸다. 계획서 G14(*backlog 한 행이 golden 2키를 움직인다*)는 평문 행에 한해 참이다. 검사 `#7` 이 그 발산을 `note` 행으로 드러내되 FAIL 로 두지는 않는다 — 해소 경로 둘(투영기가 표 행을 읽게 개정 · 형식 통일)이 각각 `docs/_meta/verify/**` 위임 사유(`--update` 재동결 한정) 밖과 §NOT Building 밖이다. 인수처: 이 PRD 의 M2 — `docs/_meta/verify/**` 위임 확장을 올리는 창과 같다 · id=60m1-cohort-blind |
| 2026-08-25 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m1.plan.md | **R-4 `sha` 는 형태만 검사되고 실재하는 커밋으로 해석되지 않는다 (PR-Codex R2 F2).** `FIELD_RE.sha` 가 7~40자리 hex 정규식뿐이라 `deadbee` 처럼 어느 저장소에도 없는 값이 `check10` 을 통과한다. 해석 축을 이 창에서 세우지 않는 근거 둘 (둘 다 실측): (a) **R-4 4필드에 저장소 식별자가 없다** — 대상은 서브모듈 3종(server·site·admin)이고 7자리 접두어는 셋에서 동시에 해석될 수 있어 *정확히 하나로 해석* 이 정의상 미결이다. 필드 추가는 13 에서 온 회부 계약의 개정이라 새 회부 라운드가 필요하다. (b) **저장소 안 커밋 인덱스가 이력의 부분집합이다** — 2026-08-25 실측: golden `commits.insuniverse-admin.total`·`-server`·`-site` 가 1163·2590·2450 인데 `docs/_meta/index/commits.{admin,server,site}.jsonl` 행수는 1157·2587·2446 (차 6·3·4). 그 인덱스로 대조하면 **유효한 sha 를 거짓 거부**한다. 서브모듈 이력 직접 조회는 워크트리에서 빈 디렉터리라 불가하고 INV2 가 포인터를 동결한다. M1 시점 실 폐기 문서는 0건이라 해석 대상도 0 이다. 인수처: 이 PRD 의 M2 — 실 sha 가 처음 생기는 창이며 저장소 식별자 회부와 앵커 선택을 같이 판정한다. **2026-08-28 (m2c) — M2 행은 `complete` 로 종료됐으나 이 이월은 닫히지 않았다.** `.claude/plans/insuniverse-docs-60-history-deprecated-m2c.plan.md` 창이 revert 축 확정 0건을 이유로 **발행을 하지 않았고**, 실 sha 가 하나도 생기지 않아 해석 규약을 판정할 대상이 여전히 0이다. 인수처는 revert 축에 새 확정이 생기는 창으로 넘어간다 · **2026-09-02 (m6) — 이 창도 두 행을 닫지 않는다.** 마일스톤 6 은 폐기 축이 아니라 연혁 축(등급 U `00-origin.md` · 등급 O `04-ops-intent.md` 자리)이고 `docs/99-deprecated/` 아래에 **0건 발행**했다. 그 디렉터리는 실측상 트리에 존재조차 하지 않으므로 판정 대상이 여전히 0이고 인수처는 그대로다. 검사 `#7` 이 발행 0건과 이 두 행의 열림을 함께 찍는다. · id=60m1-sha-unresolvable |
| 2026-08-25 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m1.plan.md | **`deprecated[]` 멤버십은 *판정 완료* 를 뜻하는데 그것을 증명하는 기계 근거가 없다 (PR-Codex R5 F1).** `validateDeprecated` 는 `reason` 의 존재와 비어있지 않음만 본다 — `reason: 미판정 — 근거 조사 중` 같은 산문이 그대로 통과하고, 그 항목은 형제 문서가 `supersedes` 로 가리키는 순간 *죽은 정책* 으로 가르쳐진다. UI5 가 발행 id 를 되돌릴 수 없게 만들므로 오판 비용이 비대칭이다. **금지어 목록은 답이 아니다** — INV4 가 겨냥하는 리터럴이고 다른 표현 한 번으로 우회된다. 필요한 것은 판정 레코드다: 후보(`docs/_meta/index/policy-candidates.*.jsonl`)에서 `deprecated-confirmed` 로 옮긴 근거가 기계로 읽히는 자리이며, 그 상태값은 이미 `index.status_legend` 에 있다(`golden.txt`). 그 결속은 실 폐기 노드가 없는 M1 에서는 대상이 0건이라 세울 수 없다. **다만 이 창이 남기는 것은 기록만이 아니다** — `check10` 의 발행 차단 축이 이 행의 닫힘을 요구하므로, 이 이월이 열려 있는 한 `docs/99-deprecated/**` 에 문서를 발행하면 게이트가 붉어진다(UI8). 인수처: 이 PRD 의 M2 — 후보↔노드 결속을 판정하는 첫 창. **2026-08-28 (m2c) — M2 행은 `complete` 로 종료됐으나 이 이월은 닫히지 않았다.** `.claude/plans/insuniverse-docs-60-history-deprecated-m2c.plan.md` 창이 확정 0건을 이유로 폐기 노드를 **0건 발행**했으므로 결속을 세울 실 노드가 없다. 인수처는 revert 축에 새 확정이 생기는 창으로 넘어간다 · **2026-09-02 (m6) — 이 창도 두 행을 닫지 않는다.** 마일스톤 6 은 폐기 축이 아니라 연혁 축(등급 U `00-origin.md` · 등급 O `04-ops-intent.md` 자리)이고 `docs/99-deprecated/` 아래에 **0건 발행**했다. 그 디렉터리는 실측상 트리에 존재조차 하지 않으므로 판정 대상이 여전히 0이고 인수처는 그대로다. 검사 `#7` 이 발행 0건과 이 두 행의 열림을 함께 찍는다. · id=60m1-adjudication-unproven |
| 2026-08-24 | HIGH | .claude/plans/insuniverse-docs-20-foundation-access-m1.plan.md | L2 architect: Task 3 creates overlapping edit delegations without formal semantics: PRD 13 ('완료' status) and PRD 20 ('진행' status) will both have rows in §개정 위임 table for identical paths (docs/_meta/t… · 원문 .claude/reviews/plan-review-insuniverse-docs-20-foundation-access-m1.md · id=75d7e69e |
| 2026-08-24 | FAIL | .claude/plans/insuniverse-docs-20-foundation-access-m1.plan.md | L2 architect: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-insuniverse-docs-20-foundation-access-m1.md · id=12aac3a8 |
| 2026-08-24 | HIGH | .claude/plans/insuniverse-docs-20-foundation-access-m1.plan.md | L2 test: The plan specifies exact code anchors for each actor term in Task 2 (lines 85-101) and checks will verify these anchors point to real files/lines via check#2 · 원문 .claude/reviews/plan-review-insuniverse-docs-20-foundation-access-m1.md · id=d7749bff |
| 2026-08-24 | HIGH | .claude/plans/insuniverse-docs-20-foundation-access-m1.plan.md | L2 test: Gates.mjs file will be created in Task 1 and implement checks #1-#8, #13, #14 with specified behavior including markdown parsing, config comparison, and 10 selftest dual-contrast verificatio… · 원문 .claude/reviews/plan-review-insuniverse-docs-20-foundation-access-m1.md · id=0d1b12b4 |
| 2026-08-24 | FAIL | .claude/plans/insuniverse-docs-20-foundation-access-m1.plan.md | L2 test: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-insuniverse-docs-20-foundation-access-m1.md · id=f8dce54e |
| 2026-08-24 | CRITICAL | .claude/plans/insuniverse-docs-20-foundation-access-m1.plan.md | L2 invariant: Plan documents an unpreventable fail-open window in check6 that allows bad data to pass if both files agree · 원문 .claude/reviews/plan-review-insuniverse-docs-20-foundation-access-m1.md · id=b6aa7431 |
| 2026-08-24 | HIGH | .claude/plans/insuniverse-docs-20-foundation-access-m1.plan.md | L2 invariant: Plan gates are anchored to manually observed golden baseline, not machine-verified precondition · 원문 .claude/reviews/plan-review-insuniverse-docs-20-foundation-access-m1.md · id=e3505bd5 |
| 2026-08-24 | HIGH | .claude/plans/insuniverse-docs-20-foundation-access-m1.plan.md | L2 invariant: Plan assumes Task-level gate enforcement mechanism that is not specified or documented in mccp framework · 원문 .claude/reviews/plan-review-insuniverse-docs-20-foundation-access-m1.md · id=474113d0 |
| 2026-08-24 | HIGH | .claude/plans/insuniverse-docs-20-foundation-access-m1.plan.md | L2 invariant: Plan shifts critical correctness checks to external review marked (미검증), creating reviewer dependency for things that should be gated · 원문 .claude/reviews/plan-review-insuniverse-docs-20-foundation-access-m1.md · id=e3fbad37 |
| 2026-08-24 | FAIL | .claude/plans/insuniverse-docs-20-foundation-access-m1.plan.md | L2 invariant: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-insuniverse-docs-20-foundation-access-m1.md · id=a8f3a068 |
| 2026-08-25 | MEDIUM | .claude/plans/insuniverse-docs-20-foundation-access-m1.plan.md | Implement-Codex R1 F3: 검사당 변이 1 개 규약이 `#4`·`#5`·`#7` 의 나머지 단언(GA 용어·히트 집합 / 값 일치 / 표 5열·Plan 셀)을 음성 대조 없이 통과시킨다. 해소하려면 단언별로 검사를 쪼개야 하고 그러면 게이트 `#9`(selftest 10+1 행 고정)·`#10`(번호 집합 대조)이 함께 개정 대상이 된다 · 원문 이 마일스톤 notes `.claude/notes/insuniverse-docs-20-foundation-access-m1.md` |
| 2026-08-25 | LOW | .claude/plans/insuniverse-docs-20-foundation-access-m1.plan.md | 코드리뷰 L8: `lint-docs.mjs --strict-refs` 가 문서 간 상대 링크의 **대상 존재**를 보지 않는다. `01-glossary.md` 의 끊긴 상대 참조 7건(`../02-access/` · `../02-access/01-authn.md` · `../02-access/02-authz-roles.md` · `../02-access/03-authz-capabilities.md` · `../03-contracts/05-external-client-api.md` · `../06-vendors/` · `../07-legal/`)이 검사 `#1` 의 `strict=ok` 로 통과했다(2026-08-25 실측). 후속 마일스톤 전방참조라 지금은 정상이지만, 대상이 생긴 뒤 경로 오타가 나도 같은 방식으로 통과한다 — `--strict-refs` 라는 이름이 링크 무결성 보증으로 읽히는 것이 결함이다. 검사기는 `13-relation-contract` 소유(doc-kit)라 이 마일스톤이 고치지 않는다(경계). 인수처: `deferred_ref_targets` 만료 규약을 여는 창 — 원문 이 마일스톤 notes `.claude/notes/insuniverse-docs-20-foundation-access-m1.md` |
| 2026-08-24 | CRITICAL | .claude/plans/insuniverse-docs-30-contracts-limits-m1.plan.md | L2 invariant: Gate #1e is fail-open: it validates only format of D6 approval field, not truthfulness or actual user authorization · 원문 .claude/reviews/plan-review-insuniverse-docs-30-contracts-limits.md · id=8342cc04 |
| 2026-08-24 | CRITICAL | .claude/plans/insuniverse-docs-30-contracts-limits-m1.plan.md | L2 invariant: Blocking precondition (D6 approval) cannot be enforced by Task 2's validation gate. Plan claims 'D6 은 이 계획서가 GROUND 에서 새로 찾아낸 것이며 승인되지 않았다' but gate accepts any conforming date string w… · 원문 .claude/reviews/plan-review-insuniverse-docs-30-contracts-limits.md · id=67586680 |
| 2026-08-24 | CRITICAL | .claude/plans/insuniverse-docs-30-contracts-limits-m1.plan.md | L2 invariant: Receipt anchoring failure: plan claims approval is not yet received (line 24: 'D6 은...승인되지 않았다'), yet the plan's own execution path in Task 2 will accept any conforming date without bin… · 원문 .claude/reviews/plan-review-insuniverse-docs-30-contracts-limits.md · id=2f8a1336 |
| 2026-08-24 | HIGH | .claude/plans/insuniverse-docs-30-contracts-limits-m1.plan.md | L2 invariant: User Intent UI2 vs Gate Behavior mismatch: UI2 (line 47) explicitly rejects gate escalation ('위임 규약을 게이트로 승격하지 않는다'), yet Task 2 Action requires a human judgment gate (D6 approval) that… · 원문 .claude/reviews/plan-review-insuniverse-docs-30-contracts-limits.md · id=9a371f46 |
| 2026-08-24 | HIGH | .claude/plans/insuniverse-docs-30-contracts-limits-m1.plan.md | L2 invariant: No unknown-input path prevents false approval injection. Task 2 validation regex accepts any date YYYY-MM-DD (including future dates, meaningless dates) without semantic validation or t… · 원문 .claude/reviews/plan-review-insuniverse-docs-30-contracts-limits.md · id=2ac8ed87 |
| 2026-08-24 | FAIL | .claude/plans/insuniverse-docs-30-contracts-limits-m1.plan.md | L2 invariant: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-insuniverse-docs-30-contracts-limits.md · id=cd8935d6 |
| 2026-08-24 | MEDIUM | .claude/plans/insuniverse-docs-30-contracts-limits-m1.plan.md | Implement-Codex R1 F5: 판정 원장(.claude/notes/…-m1.md)이 receipt 에 해시 결속되지 않는다 — design_doc_hash 공집합 · findings/accepted/rejected 공집합이라, blocking 지적을 기각한 근거가 인가 산출물과 독립으로 변경 가능하다. mccp receipt 발급 정책 축 · threadId 01a032a3 |
| 2026-08-24 | HIGH | .claude/plans/insuniverse-docs-30-contracts-limits-m1.plan.md | Plan-Codex R15 F2 (DEFER, Task 2·Task 8 실행 정확성): 하네스가 **위임 행의 단계를 모른다**. `sig` 가 `상태` 를 빼고(Task 8 이 뒤집으므로) `#1b` 는 `진행`·`완료` 둘 다 받으며 `#8b` 는 `완료` 6 만 센다 — Task 2 가 여섯 행을 **처음부터 `완료`** 로 적어도 정당한 Task 8 전환과 구별되지 않는다. 그러면 archived 경로를 편집하는 중에 장부가 위임 종료를 주장하고, `상태: 진행` 2개 이상이라는 재검토 조건도 발동하지 않는다. 두 수리 시도가 실측으로 무력했다 — (1) `완료` 를 green `#7` 에 묶기: **기준선 게이트가 이미 rc 0**(G1)이라 Task 2 시점에도 green. (2) 상태 전건 동일 요구: 공격 형태가 *전부 `완료`* 라 통과. 남는 `--sealed` 플래그는 이르게 `완료` 를 적을 실행자가 이르게 주므로 가정을 옮길 뿐이다. 조치: Task 2 직후 `--fast` 실행 출력에 6행 `진행` 을 사람이 확인하고, Task 8 전환 전 `--check --bootstrap` exit 0 을 사람이 확인한다 · run_nonce 93187d9d |
| 2026-08-24 | HIGH | .claude/plans/insuniverse-docs-30-contracts-limits-m1.plan.md | Plan-Codex R10 F0 (DEFER, Task 2 착수 전 필수): 게이트가 **기존 8행의 생존을 요구하지 않는다**. `#1a` 는 신규 30행 서명만, `#1c` 는 같은 경로 미완료 선행행만, `#2a` 는 (발신,#) 유일성만, `#2b` 는 신규 R-1 실재만 본다 — `ownership.md` §개정 위임 8행과 §회부 인계 8행을 통째로 지워도 전건 통과한다. 승인·회부 provenance 가 archived 소유 파일에서 소실되는 경로다. 수리는 `#1d`·`#6d` 와 같은 앵커(`m1-baseline.sha` 리비전 `git show`)로 기존 행 전건 잔존을 요구하는 것 · run_nonce 2865c7d1 — **해소됨(2026-08-24): `/mccp:plan` R11 이 흡수했다.** 검사 `#1f`(위임 8행)·`#2c`(회부 8행) 신설, 분모는 `#1d`·`#6d` 와 같은 `m1-baseline.sha` 리비전 `git show`. 반사실 실행 확인 — 수리 전에는 두 장부 16행 삭제가 게이트 출력을 전혀 바꾸지 않았고(`FAIL 누계 15` 동일), 수리 후 같은 입력이 `#1f want=0 got=8` · `#2c want=0 got=8` 로 뒤집힌다 |
| 2026-08-25 | MEDIUM | .claude/plans/insuniverse-docs-30-contracts-limits-m1.plan.md | 구현 라운드 실측(계획 미예측): `docs/_meta/onboarding-questions.yaml` 은 `approved_sha256` 로 **레코드 집합 전문**(owner·src·approved·q 6필드)을 봉인하고 `verify.sh:2016` 이 그것을 `--update`/`--check` 양쪽에서 강제한다. D3 은 `src:` 3곳만 고치는데 그 봉인이 함께 깨져 첫 `--update` 가 rc=1 로 멈췄다 — `golden.txt` 는 쓰이지 않았다(G16 가드 정상 동작). 계획서 Task 5 Validate 는 `RESIDUAL/DUPKEY/ORPHAN` 만 예상했고 이 필드를 이름 붙이지 않았다. 조치: 같은 라운드에서 `approved_sha256` 재봉인(04739e18… → 94d84678…). `q:` 본문은 한 글자도 바뀌지 않았으므로 사용자 승인의 **내용**은 보존된다. 남는 축: 이 파일을 위임받는 다음 PRD 도 같은 자리에서 멈추므로 `ownership.md` 위임 사유나 doc-kit 에 "src 편집은 approved_sha256 재봉인을 동반한다" 를 적을지 판단 필요 |
| 2026-08-25 | LOW | .claude/plans/insuniverse-docs-30-contracts-limits-m1.plan.md | 구현 라운드 관측: PRD `insuniverse-docs-30-contracts-limits.prd.md` 57·130·225행이 아직 `entry_count 53`·`doc_count 52` 를 리터럴로 싣는다. 마일스톤 1 재동결 후 정본은 54/53 이다. 세 자리 전부 **마일스톤 1 착수 전 상태를 적은 GROUND·Success Metric 서술**이라 이번 라운드 §Files to Change(PRD 개정 3건) 밖으로 뒀다. 계획서 Task 7 이 지시한 §Risks 3키 목록과 §개정 위임 3키 서술 두 자리는 이 라운드가 6키로 교체했다. INV4 축이므로 다음 라운드가 golden 유도값 인용으로 바꾸거나 연혁으로 이름 붙일지 판단 필요 |
| 2026-08-25 | MEDIUM | .claude/plans/insuniverse-docs-30-contracts-limits-m1.plan.md | code-review M1: **봉인된 계획서의 동결 출력 계약이 조용히 깨졌다.** `.claude/PRPs/plans/review-round-remediation.plan.md` 검사 `#4` 가 `total=11 ok=11 mismatch=0` 을 리터럴로 파싱하고 Acceptance 498행도 같은 값을 싣는다. 이 라운드가 픽스처를 11 → 17 로 늘려 그 게이트는 재실행 시 영구 FAIL 이다. 어디에도 기록이 없었다(`grep total=11` 이 notes·backlog·리포트 전건 0). **봉인 계획서는 고치지 않는다** — 재앵커는 위조이고 `plan_hash`·receipt 체인이 그 리비전에 묶여 있다. 남는 축: (a) 그 계획서를 archived 로 옮겨 게이트 재실행 대상에서 빼거나 (b) `#4` 의 기대값을 리터럴이 아니라 `FIXTURES` 유도값으로 바꾸는 후속 창을 여는 것. INV4 축이므로 (b) 가 정합이다. 인수처: plan-kit 을 다음에 여는 창 |
| 2026-08-25 | LOW | .claude/templates/plan-kit/lint-plan.mjs | code-review L5(사각지대 공시, 수리 안 함): 인용 토큰 추출이 `line.match()` 라 **줄 안 첫 `.gates.*` 토큰**을 고른다 — 인터프리터의 첫 피연산자와 같지 않다. `node --require=./a.gates.mjs b.gates.mjs` 는 `a` 를 고른다. 값을 받는 플래그를 가르려면 인터프리터별 인자 문법이 필요하고 그 형태가 이 저장소 실사용에 없어 들이지 않았다. README §검사 본문이 계획서 밖에 있을 때 에 이름 붙여 공시했다. 인수처: 그 형태가 실제로 나타나는 창 |
| 2026-08-25 | MEDIUM | .claude/plans/insuniverse-docs-30-contracts-limits-m1.plan.md | **main merge 가 봉인된 M1 하네스를 6건 FAIL 로 뒤집는다 (merge 후 실측).** `.claude/plans/insuniverse-docs-30-contracts-limits-m1.gates.sh` 는 분모를 `.claude/notes/m1-baseline.sha` 한 리비전으로 잡는다. `origin/main` 을 병합하면 형제 창(`60-history-deprecated` · `40-runtime-vendor-legal`)의 산출이 그 분모 밖에서 들어와 `#1g` 위임 신규 5행 · `#2c`·`#2d` 회부 R-4·R-8 수용 표기 2행 · `#6a` 예상 밖 변동 키 4건(`findings.files` · `fixtask.cohort_count` · `fixtask.cohort_m8` · `fixtask.findings_headings`) · `#6e`·`#6f` 트리 증분 want=1 got=3 으로 떨어진다. 실측 대조: `#6a` 가 든 golden **4키 전건**의 병합 후 값이 `origin/main` blob 과 **문자열 동일**하고 트리 증분 3 은 30 의 1행 + 60 의 2행이다 (초판은 *"세 golden 키"* 로 적었다 — 4건을 열거하고 3건만 대조했다고 쓴 자기모순이었고, PR-Codex R1 F1 지적 뒤 `fixtask.cohort_m8` 까지 대조해 4/4 동일을 확인했다) — 손실도 위조도 아니고 **하네스가 형제 창을 볼 줄 모르는 것**이다(층위 6, 표본 ≠ 범위). `m1-baseline.sha` 재지정은 판정 뒤로 분모를 옮기는 것이라 하지 않는다. 저장소 상시 게이트는 green 이다 — `#7 verify.sh --check exit 0` 이 병합 후에도 PASS 다. 인수처: 마일스톤 2 하네스 저작 — 분모를 단일 리비전이 아니라 `merge-base` 로 잡거나, 형제 창 산출을 이름 붙여 빼는 allowlist 를 검사 출력에 드러낼 것. PR-Codex R1 F1(conf 0.97) 이 같은 축을 HIGH 로 다시 들었다 — *"서사적 backlog 예외는 실행 가능한 잔여 0건 게이트가 아니다"*. 수용분: 리포트의 `EXIT=0` 주장을 측정 리비전 `33130b8` 에 앵커하고 HEAD 결과(`FAIL 6 · EXIT=1`)를 `§병합 후 하네스 상태` 로 공시했다. 미수용분: 병합 인지 하네스 신설은 이 창(review-only) 밖이라 인수처를 그대로 둔다 |
| 2026-08-25 | LOW | .claude/templates/plan-kit/lint-plan.mjs | PR-Codex R1 F2(conf 0.96, 수용·수리함) 의 **잔여 사각지대**: 외부 게이트 소재지 이탈 봉쇄는 2층인데 상시 검사는 문법 층 하나만 진다. 픽스처 `bad-pl5-escape.plan.md` 는 `..` 구간을 쓰고, 실경로 층(`insideRoot()` — 심볼릭 링크·정션 이탈)에는 대조군이 없다. 링크 픽스처가 플랫폼별 생성 권한에 의존해 이 창에서 세우지 않았다 — memory `windows-symlink-fixture-is-possible` 이 `extract-releases.mjs` 의 junction 선례로 *"못 만든다"* 를 이미 반증했으므로 불가능이 아니라 **미착수**다. 반사실은 문법 층에 대해서만 확인했다(두 층 무력화 사본에서 같은 표본 위반 0건 · exit 0, 층 복원 시 `PL5` 2건). 인수처: 링크 픽스처를 세우는 다음 plan-kit 창 — RESOLVED 2026-08-25(같은 창): 커밋된 픽스처가 아니라 `--selftest` 의 **런타임 프로브** `linkprobe` 로 닫았다. 임시 저장소에 정션을 만들고 그 너머 게이트를 인용하는 계획서를 린트한다 — 인용 경로에 `..` 도 절대경로도 없어 문법 층을 지나 실경로 층에만 닿는다. **층별 반사실**(제자리 실행): 실경로 층만 끄면 `bad-pl5-escape` 는 `OK` 그대로인데 `linkprobe` 가 `got=none MISMATCH` 로 뒤집힌다 — 두 층이 서로를 가리지 않는다. 정션 생성 불가 환경은 `SKIP` 을 이름 붙여 출력하고 mismatch 로 세지 않는다(조용한 통과 금지). `total` 은 매핑표 계수 그대로 18 이며 프로브는 거기 안 들어간다 |
| 2026-08-25 | MEDIUM | .claude/plans/insuniverse-docs-30-contracts-limits-m1.plan.md | **2차 main 병합(`a88ed70`)이 하네스를 FAIL 6 → 8 로 올렸다 — 새 부류 2건 (병합 후 실측).** 같은 축(단일 리비전 분모)의 연장이지만 **새로 나타난 실패 형태**라 따로 적는다. (1) `#1c 동일 경로 선행 행 미완료 want=0 got=1` — `20-foundation-access` 가 `docs/_meta/verify/**` 를 상태 `진행` 으로 열었고 그것이 `30` 의 `docs/_meta/verify/golden.txt` 와 접두를 공유한다. `30` 행은 `완료` 이고 `20` 보다 **먼저** 섰으므로 §개정 위임 의 *"기존 위임 행이 전건 `완료`"* 규약을 깬 것이 아니다 — 검사가 **선후를 안 본다**(층위 6). `20` 자신의 재검토도 같은 자리를 *"완료 ↔ 열림 관계이며 같은 시점에 열려 있는 위임은 `20` 하나뿐"* 으로 판정했다. **다만 살아 있는 제약이 하나 남는다**: 이 브랜치가 앞으로 `golden.txt` 를 다시 동결해야 하면 `20` 의 열린 위임과 같은 창에서 겹친다. 이번 병합은 그럴 필요가 없었다 — `verify.sh --check` 가 `golden 대조 (헤더 + 페이로드) ok` 로 드리프트 0 을 냈다. (2) `#7 verify.sh --check exit want=0 got=2` — `--bootstrap` 이 저장소 전체에서 **더는 유효하지 않다**. `insuniverse-docs-20-foundation-access.prd.md` 가 `complete` 로 전이해 *"lint 대상을 소유한 문서 PRD 가 전부 DRAFT 인 동안만 유효하다"* 조건이 깨졌다(`m1-check.err`). 하네스가 그 플래그를 리터럴로 박아 두었다 — **계획서 자신이 예고한 결과**다(gates.sh `#8a` 주석: *"이 줄을 옮기면 형제 PRD 4종의 --bootstrap 이 함께 거부된다"*). `--bootstrap` 없는 `verify.sh --check` 는 **rc 0 · `check PASS`** 다 — 저장소 상시 게이트는 green 이고 깨진 것은 하네스의 동결된 호출 형태뿐이다. `#6a` 도 4키 → 5키로 늘었다(`template_config.actors` 추가). **5키 전건이 `origin/main` blob 과 문자열 동일**임을 실측했다. 인수처: 위 2026-08-25 MEDIUM 행과 같다 — 마일스톤 2 하네스 저작에서 분모를 `merge-base` 로 잡고 `--bootstrap` 사용 가능 여부를 **리터럴이 아니라 유도**할 것 |
| 2026-08-25 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m2.plan.md | **revert `deprecated-confirmed` 2건이 5중 필터 1·2 를 못 넘어 M2 가 `deprecated[]` 를 0건으로 남겼다 (M2 구현 중 실측 · `docs/_meta/findings/60-history-deprecated.md` F-06).** 계획서 Task 2 는 *실측 posture 는 revert 확정 2건이 필터 4·5 를 넘고* 로 적었으나 필터 1·2 를 재지 않았다. 실측: 두 건의 env 게이트(`B2C_BYPASS_SLOT` 기본 `2` · `TREAT_POOL` 기본 `octover:30:3:1,coocon:30:3:1`)가 살아 있고 관련 코드가 동결 HEAD `4d798f55…` 에 실재한다 — 필터 1(env 기본값 off)·2(HEAD 코드 부재) 가 `pass` 가 아니다. UI8·UI9 로 발행이 막히고 M1 `check10` 이 빈 `deprecated[]` 를 거부하므로 `docs/99-deprecated/02-reverted-policies.md` 자체가 이 창에서 생성 불가다. 인수처: 사용자 판정 — (a) 필터 2 를 *되돌린 패치의 형태* 로 좁힐 것인가 *정책 재도입까지* 볼 것인가(PRD §Open Questions 의 재도입 항목과 같은 축) · (b) M2 를 판정 원장 없이 닫고 발행을 뒤 마일스톤으로 미룰 것인가 · id=60m2-revert-filters-fail |
| 2026-08-25 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m2.plan.md | **계획서 G19 의 golden 기대 4키 중 `fixtask.cohort_count`·`fixtask.cohort_m8` 2키는 이 창에서 안 움직인다 (M2 구현 중 실측).** G19 는 backlog 편집이 그 두 키를 확정으로 움직인다고 적었으나, 투영기 `docs/_meta/verify/fixtask-projection.mjs` `parseBacklogRow` 는 행이 날짜로 시작하는 **평문**만 받는다 — 이 창의 이월은 mccp 소비자가 요구하는 표 행이라 그 정규식 밖이다. 같은 사실이 backlog `id=60m1-cohort-blind` 에 이미 적혀 있었고 G19 가 그것을 반영하지 않았다. 하네스 검사 `#7` 은 기대 집합을 리터럴이 아니라 *각 키의 입력이 움직였는가* 로 유도해 이 발산을 흡수한다. 인수처: 없음 — 계획서 본문은 `plan_hash` 로 receipt 에 결박돼 이 창에서 고치지 않는다 · id=60m2-golden-expect-drift |
| 2026-08-25 | LOW | .claude/plans/insuniverse-docs-60-history-deprecated-m2.plan.md | **계획서 G19 의 *golden 은 105키다* 가 실측 102키다 (M2 구현 중 실측).** `grep -vc '^#|^$' docs/_meta/verify/golden.txt` 가 102 를 낸다. 계수는 어떤 게이트도 읽지 않고 검사 `#7` 은 키 **집합** 비교라 이 오차에 영향받지 않는다. 인수처: 없음 — 계획서 본문 불변 · id=60m2-golden-key-count |
| 2026-08-25 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m2.plan.md | **M2 Task 0 기준선 앵커도 변경 창 안에 있다 (M1 `id=60m1-anchor` 와 같은 잔여의 M2 판).** 검사 `#3`·`#7` 이 `git log --diff-filter=A -- <M2 하네스>` 로 특정한 커밋의 blob 을 유도 원본으로 읽는다. 그 커밋은 이 브랜치가 만들었고 이 저장소에는 CI 도 보호 ref 도 없어 이력 재작성으로 앵커를 다시 쓸 수 있다. 없는 앵커를 있는 척 검사하지 않는다(INV4). 인수처: 없음 — 외부 앵커가 생기는 시점까지 구조적으로 해소 불가이며 그것이 판정이다 · id=60m2-anchor |
| 2026-08-25 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m2.plan.md | **`.claude/meta/05-final-spec.md` §3 필터 4 의 `server 10 / site 10건` 이 실측과 다르다 (M2 구현 중 실측 · findings F-03).** `docs/_meta/index/dead-candidates.yaml` 유도값은 patch-id 그룹 8건(server 4 · site 4 · admin 0)이다. 이 PRD 가 받은 `05-final-spec.md` 위임 사유는 **§4 트리 2행 추가**로 한정되고 §3 은 그 밖이다. 게이트가 읽지 않는 산문이며 기계 정본은 그 yaml 이다. 인수처: 없음 — 위임 확장은 사용자 판정 사항이고 그 판정 전까지 findings 기록이 전부다 · id=60m2-spec-filter4-literal |
| 2026-08-25 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m2.plan.md | **하네스 5검사가 계획서 음성 케이스를 통과로 뒤집었다 (M2 리뷰 실측).** `check10` 이 `Status !== "complete" && files === 0` 에서 `#10 ok 요구 꺼짐` 으로 조기 return 한다 — 계획서 Validation `# 음성:` 은 같은 상태를 `#10 FAIL: 요구가 켜지지 않았다` 로 적었고 §Risks 의 *Task 4 순서가 뒤집혀 check10 이 요구가 꺼진 채 초록이 된다* 완화 문면(`실 대상 <n>파일` 이 0이 아님을 함께 본다)도 그 통과 분기와 모순이다. 같은 `요구 꺼짐` 분기가 `#4`(이월 열림 2 를 ok) · `#5` · `#6` · `#11` 에도 있다. 발행 보류 판정 자체는 정당하나 **11검사 중 5개의 통과 조건이 계획서와 달라진 것이 §Deviations 5건 어디에도 없었다** — `check-all 10/10` 을 게이트 계약 충족으로 읽게 된다. 이 리뷰에서 구현 리포트 §Deviations 6번째 항목으로 명시했다. 계획서 본문은 `plan_hash` 결박이라 고치지 않는다. 인수처: 마일스톤 2b — 실 발행이 처음 생겨 `요구 꺼짐` 분기가 죽는 창이며, 그때 분기를 지우고 계획서 음성과 일치시킨다 **2026-08-26 (2b 실측) — 이 이월은 `2b` 에서 닫히지 않는다.** 인수처 문면은 *실 발행이 처음 생겨 `요구 꺼짐` 분기가 죽는 창* 을 전제했으나, 2b 는 6축 전부 `pass` 인 행이 0이라 확정이 0건이고 `docs/99-deprecated/` 아래 발행도 0건이다. 분기가 죽는 조건이 이 창에 없어 그 분기는 살아 있다. 남은 인수처는 실 발행이 처음 생기는 창이다 · id=60m2-gate-requirement-off |
| 2026-08-25 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m2.plan.md | **계획서 §Codex Adversarial Review 가 선언한 *Deferred to backlog: 1* 이 backlog 에 없었다 (M2 리뷰 실측).** 그 이월분은 *R1 흡수 3건(F0·F1·F2)이 적대 리뷰로 재검증되지 않았다* 이며, Codex 사용량 소진으로 R2 를 못 돌려 `mccp-plan-codex` receipt 가 `codex_verdict=skipped` 로 봉인됐다. 계획서 자신이 *`converged` 를 지적 0건 라운드로 증명하지 못했다* 로 적었는데 receipt 는 `resolution.converged=true` 다. **receipt 복원은 불가능하다** — `mccp-plan-codex` 는 `INTENT_IN_SCOPE_GATES` 유일 원소라 `cli.js write` 가 `intentDecision` 없이는 `INTENT_GATE_BLOCKED` 로 던지고, `MCCP_SKIP_INTENT_GATE` 우회는 `intent_gate_verdict=incomplete` 를 봉인해 지금의 정당한 `skipped` 보다 나쁜 상태를 만든다(실행해 확인). 지원 경로인 `/mccp:plan` 재실행은 계획서 본문을 다시 써 `plan_hash` 앵커와 충돌한다. 따라서 **R1 3건의 정본은 계획서 §Codex Adversarial Review 본문뿐이고 receipt 는 그것을 담지 못한다** — 하류 dedupe 가 빈 `accepted` 를 읽어 아무것도 못 거르며, PR-Codex 가 가용해지는 첫 창에서 F0·F1·F2 가 재제기될 수 있다. 인수처: Codex 가용해지는 첫 창 — 그때 M2 계획서 본문을 대상으로 라운드 1회 · id=60m2-r1-absorb-unverified |
| 2026-08-25 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m2.plan.md | **`mccp-implement-codex` receipt 가 구현보다 앞선 커밋에 결박돼 있고 제자리 수정이 거부된다 (M2 리뷰 실측).** `head_sha=64d2506` · `created_at=2026-08-25T08:06:06Z`(17:06 KST)인데 실 구현은 `b6cbe8a`(17:25)·`b8a08d1`(18:26)이다 — receipt 의 `subject_hash` 가 실제 산출물을 하나도 안 덮는다. 같은 PRD 의 M1 선례는 `base b674f52 → head 34baeab` 로 head 가 구현 커밋에 전진했으므로 저장소 관행에서도 이탈이다. `cli.js write` 재발행은 `refusing to overwrite git-tracked receipt with a different hash … A tracked ship receipt is an audit-binding anchor (E4) … use a NEW decision slug` 로 거부된다(실행해 확인). 새 슬러그는 체인 슬러그를 `…-m2` 에서 갈라 `/mccp:pr`(브랜치 유도)와 어긋나므로 고침이 아니라 체인 증식이다. **하류 영향 없음** — `preflight --command mccp:pr` 이 `ok: true` · `stale: []` (경고는 `impeccable_silent_skip` 1건뿐). 남는 것은 감사 정확성 손실이다. 인수처: mccp 상류 — receipt supersession 스키마가 생기는 시점, 또는 이 브랜치가 새 마일스톤 슬러그로 넘어가는 창 · id=60m2-implement-receipt-pre-dates-code |
| 2026-08-25 | HIGH | .claude/plans/insuniverse-docs-50-domain-m2.plan.md | **`docs/_meta/index/codes/screen.yaml` 의 화면 코드 집합이 동결 정본과 2건 어긋나고 두 pin 이 분기 관계다 (마일스톤 2 창 실측).** 사본에만 `admin:/alarm` 과 `admin:/alarm/:param` 이 있고 `docs/_meta/extraction-manifest.yaml` §screen_codes 재실행값(282 · `0471c759…`)에는 0건이다. 낡음이 아니다 — 사본 `source_sha.admin` `7df733a5` 와 manifest `repos[].head` `fb001e1d` 사이에 `git merge-base --is-ancestor` 가 거짓이고, `git show 7df733a5:src/app/router/routes/page.routes.tsx` 51행에 `path: "/alarm"` 이 있는데 `fb001e1d` 의 같은 파일에는 `alarm` 이 0건이다. 사본 헤더는 `route_count: 284` · `entry_count: 284` 인데 그 값을 담는 골든 키가 없어 매 실행 재검증되지 않는다. 이 PRD 는 사본을 고치지 않는다 — `docs/_meta/index/**` 는 `11-index-code` 소유다. 인수처: 그 PRD 의 화면 코드 축 재동결 창 · id=50m2-screen-yaml-divergence |
| 2026-08-25 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m2.plan.md | **IA 문서의 exits 는 기계로 전수 유도되지 않는다 — 3소스 밖은 미검증으로 남는다 (마일스톤 2 창 실측).** `insuniverse-admin/src` 의 `navigate(` 호출 449건 중 큰따옴표 리터럴 대상은 19종뿐이고 그중 절대경로는 16종이다. 나머지는 템플릿 리터럴로 경로를 조립하거나(`` `/b2c/analysis-log/${id}` ``) 질의문자열만 바꾼다(`?page=1`) — 라우트 인벤토리에서 대상을 되짚을 수 없다. 메뉴 트리도 근거가 못 된다: `docs/_meta/index/codes/menu_db.yaml` 이 `row_count: 104` 중 `enumerated: 10` · `complete: false` 다. 그래서 `docs/30-admin/00-ia.md` 의 `surfaces[].exits` 는 라우트 경로 중첩 · 리터럴 `navigate` 대상 · 라우터 진입점 가드 셋에서만 유도했고 각 surface 의 `limitations` 에 이탈 전수 미검증을 적었다. 자동 추출기를 세우려면 `docs/_meta/verify/**` 개정 위임이 필요한데 이 PRD 에 없다. 인수처: 그 경로의 개정 위임을 받은 창 또는 메뉴 트리 전수 열거가 서는 창 · id=50m2-exits-underivable |
| 2026-08-26 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m3.plan.md | **관리자 쓰기 경로에서 동시 저장 충돌을 막는 장치가 두 자리에만 관측된다 (마일스톤 3 창 실측).** `SELECT … FOR UPDATE` 는 `insuniverse-server` 전체에서 2건이고 둘 다 `apps/api/src/modules/money/money.repository.ts` 다 — 회원 머니가 1859행, 대리점 머니가 2073행이다. 그 밖의 관리자 쓰기 경로(정산 확정 취소 · 기준 데이터 수정 · 회원 상태 변경)에서는 낙관적 잠금도 버전 열도 나오지 않았다. **부재 증명이 아니다** — 검색어는 `version` · `optimistic` · `forUpdate` · `FOR UPDATE` 넷이고 그 밖의 구현은 이 검색이 보지 못한다. 문서 축의 조치는 끝났다: `docs/30-admin/01-admin-console.md` 의 동시 저장 흐름이 두 자리를 이름으로 적고 나머지를 미판정으로 남기며 검색어를 `limitations` 에 병기한다. 코드 수정은 이 PRD 범위 밖이다(§Out of scope). 인수처: 관리자 쓰기 경로의 동시성 계약을 여는 창 · id=50m3-concurrency-lock-absent |
| 2026-08-26 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m3.plan.md | **관리자 조작의 변경 이력을 남기는 코드가 관측되지 않는다 (마일스톤 3 창 실측).** `audit` · `admin_log` · `tnAdminLog` 세 어휘로 `insuniverse-server/apps/api/src/modules/` 전체를 훑어 파일 0건이다. 그래서 *"확정 정산을 누가 언제 무엇으로 바꿨는가"* 와 *"회원 상태를 누가 바꿨는가"* 를 문서가 답하지 못한다. **부재 증명이 아니다** — 세 어휘 밖의 구현(예: DB 트리거 · 별도 스키마 · 외부 수집기)은 이 검색이 보지 못한다. 문서 축의 조치는 끝났다: `docs/30-admin/01-admin-console.md` 의 정산 정정 흐름과 회원 생애주기 흐름이 그 미상을 `실패·이탈` 표 행과 `limitations` 에 각각 적는다. 인수처: 감사 로그 계약을 여는 창 또는 운영 DB 스냅샷이 서는 창 · id=50m3-audit-log-absent |
| 2026-08-26 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m3.plan.md | **admin 태그 질문의 답변 성립을 이 창이 판정할 수 없다 (마일스톤 3 창 실측).** 이 PRD §Delivery Milestones 3행의 Outcome 은 *"admin 태그 질문을 admin 각론 + 총론만으로 답할 수 있다"* 인데 총론이 0건이다 — `docs/02-access/**` · `docs/03-contracts/**` · `docs/04-limits/**` · `docs/06-vendors/**` · `docs/07-legal/**` 에 이 창 기준 한 파일도 없고 전부 형제 PRD 소유다. 우산 지표 §단독 온보딩 성립 의 측정 시점도 축 종료 판정 시이며 그 축은 마일스톤 7 에 끝난다. 이 창이 기계로 낸 것은 **배정의 전수 일치**뿐이다: `docs/_meta/onboarding-questions.yaml` 의 `service: admin` 질문 전건이 흐름 원장에 배정됐고 미배정 흐름은 전건 사유를 갖는다(하네스 검사 `#6`). 답변 성립 여부는 계획서 Acceptance 에 `(미검증)` 으로 남겼다. 인수처: 총론 5종이 서는 창들과 축 종료 판정 창 · id=50m3-onboarding-verdict-deferred — ADJUDICATED 2026-08-31: 인수 — 마일스톤 9(축 종료 판정 창)가 admin 14건의 답변 성립을 판정했다. 성립 7 · 미성립 7 이며 미성립분은 마일스톤 9 의 admin 온보딩 이월 행으로 다시 나갔다. 원장은 `.claude/notes/insuniverse-docs-50-domain-m9.md` §온보딩 답변 원장 이고 게이트 `#12` 가 좌표 해석까지 매 실행 대조한다 |
| 2026-08-26 | HIGH | .claude/plans/insuniverse-docs-50-domain-m3.plan.md | **오류 시나리오 테스터 컨트롤러에 계정 종류 층이 통째로 없다 (마일스톤 3 창 실측).** `insuniverse-server/apps/api/src/modules/treat-test/treat-test.controller.ts:16` 이 `@UseGuards(AdminJwtAuthGuard)` 하나만 달고 `RolesGuard` 도 `@Roles` 도 0건이다. 그래서 인증된 관리자면 계정 종류와 무관하게 이 모듈의 쓰기 핸들러(같은 파일 30·33·42·49·56·63·70행)를 부를 수 있다 — 시나리오 실행과 카탈로그 편집·삭제가 전부 그 층 아래 있다. 대응 화면은 이 창의 유일한 미배포 화면이며 라우트 등록이 환경 판정에 걸려 있으나, **그 판정은 화면 등록만 막고 서버 경로는 막지 않는다.** 문서 축의 조치는 끝났다: `docs/30-admin/05-treat-monitoring.md` 의 테스터 흐름이 권한 표에서 그 층을 `해당 없음 — 층 자체가 없다` 로 적고 이탈 표가 그 귀결을 낸다. 코드 수정은 이 PRD 범위 밖이다. 인수처: 관리자 API 인가 매트릭스를 소유한 창 · id=50m3-treat-test-no-roles-guard |
| 2026-08-26 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m3.plan.md | **권한 그룹 삭제가 메뉴 매핑 행을 함께 지우지 않는다 (마일스톤 3 창 실측).** `insuniverse-server/apps/api/src/modules/authority/authority.repository.ts:136-138` 의 `delete` 는 `tn_auth` 만 지우고 `tn_menu_auth_map` 을 건드리지 않으며 트랜잭션도 열지 않는다. 같은 파일의 생성(32·47행)과 수정(57·71·82행)은 둘 다 트랜잭션 안에서 매핑을 함께 다룬다 — 세 경로의 태도가 갈린다. 남은 매핑 행의 귀결은 DB 외래키 제약에 달려 있고 **그 제약의 실재를 이 창에서 대조하지 않았다.** 문서 축의 조치는 끝났다: `docs/30-admin/04-authority-management.md` 의 그룹 생성 흐름이 그 비대칭을 절차 본문과 이탈 표에 적고 `limitations` 에 미대조를 남긴다. 인수처: 스키마 제약 대조가 서는 창 또는 관리자 데이터 무결성 계약 창 · id=50m3-authority-delete-orphan-map |
| 2026-08-26 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m3.plan.md | **실패한 분석을 관리자가 다시 돌리는 경로가 관측되지 않는다 (마일스톤 3 창 실측).** `insuniverse-server/apps/api/src/modules/analyze/analyze-admin.controller.ts` 의 핸들러 일곱(72·90·110·128·142·162·182행)이 전부 `@Get` 이고 `apps/api/src/modules/treat/monitor/treat-monitor.controller.ts` 의 핸들러 여섯도 마찬가지다 — 조회와 엑셀 내보내기뿐이고 상태를 바꾸는 경로가 없다. 관측된 회복 경로는 배치 하나(`apps/api/src/schedules/analysis-status.schedule.ts:25`)이고 그 배치의 활성은 판정되지 않았다. **부재 증명이 아니다** — 관측 단위는 `treat` 와 `analyze` 두 모듈의 데코레이터 조회이고 관리자 컨트롤러 전수 정독이 아니다. 재시도 상한·벤더 재조회 비용·사용자 재통지 셋도 코드로 답하지 못했다. 문서 축의 조치는 끝났다: `docs/30-admin/05-treat-monitoring.md` 의 재처리 흐름이 그 셋을 각각 미상으로 적는다. 인수처: 실패 회복 계약을 여는 창 · id=50m3-reprocess-endpoint-absent |
| 2026-08-26 | LOW | .claude/plans/insuniverse-docs-50-domain-m3.plan.md | **환불 관리자 컨트롤러가 파일 전체 주석 처리 상태다 (마일스톤 3 창 실측).** `insuniverse-server/apps/api/src/modules/refund/refund-admin.controller.ts` 는 1행부터 끝까지 주석이며 `@Controller('admin/refund')` 와 세 핸들러가 전부 그 안에 있다. 대응 화면 라우트는 등록돼 있어 **화면은 열리고 서버 경로는 없다**는 비대칭이 남는다. 결제 승인 후 후속 처리가 어긋난 건의 정정에서 이 자리가 개발자 개입 지점이 되며 그 연락 경로는 문서가 알지 못한다. 문서 축의 조치는 끝났다: `docs/30-admin/01-admin-console.md` 의 결제 정정 흐름이 이탈 표에서 그 자리를 `막다름` 으로 적는다. 인수처: 사장 후보 판정을 소유한 창 · id=50m3-refund-controller-commented |
| 2026-08-26 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m3.plan.md | **관리자 인증 가드가 토큰 검증 없이 통과하는 분기를 둘 갖는다 (마일스톤 3 로컬 코드리뷰 실측).** `insuniverse-server/apps/api/src/modules/auth/admin/jwt.guard.ts:33` 은 핸들러 메타데이터 `isPublic` 이 참이면 쿠키를 읽고도 검증 없이 `return true` 하고, 같은 파일 42~45행은 `jwtService.verify` 가 던진 뒤 `isDevSwaggerRequest(request)` 가 참이면 `DEV_ADMIN`(`admId 19` · `admLoginId 'rsteam'`)을 요청에 주입하고 통과시킨다. **지금 도달 가능한 분기는 없다** — `SetMetadata('isPublic')` 생산자가 `apps/` 전체에 0건이고 소비자만 3곳이며, `isDevSwaggerRequest` 는 `apps/api/src/helpers/request.helper.ts:19-25` 에서 `NODE_ENV === 'dev'` 와 referer 의 `swagger` 포함과 `x-forwarded-for == '211.48.209.5'` 셋을 함께 요구한다. 다만 뒤의 두 조건은 클라이언트가 정하는 헤더이고 앞의 `isPublic` 은 환경 판정 없이 서므로 **데코레이터 한 줄이 생기는 순간 운영에서 인증 층이 조용히 꺼진다.** 문서 축의 조치는 끝났다: `docs/30-admin/01~05` 다섯 편이 `## 흐름 목록` 앞 문단에서 두 분기를 이름으로 적고, 권한 표의 `차단` 판정과 이탈 표의 `HTTP 401` 이 그 분기가 거짓일 때의 값임을 명시한다. 코드 수정은 이 PRD 범위 밖이다. 인수처: 관리자 API 인가 매트릭스를 소유한 창 · id=50m3-admin-jwt-guard-bypass-branches |
| 2026-08-26 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m2.plan.md | **main 병합이 검사 `#7` 을 두 방향으로 뒤집는다 (병합 후 실측 · 30-m1 `744672f`·`3332b22` 와 같은 축).** 기준선은 Task 0 커밋 `b6cbe8a` 이고 그 시점은 형제 창 산출(`20`·`30`·`40`)이 main 에 들어오기 전이다. (1) *기대 밖 4키* — `fixtask.tree_rows_sha256`·`onboarding.comments_sha256`·`onboarding.set_sha256`·`template_config.actors` 가 움직였는데 `expectedGoldenDelta` 는 `60` 의 입력 4소스(deferred 원소·findings 표제·backlog 평문 행·00-index 트리 펜스)만 열거하므로 형제 창 델타를 **구조적으로** 못 본다. (2) *안 움직인 2키* — `fixtask.cohort_count`·`fixtask.cohort_m8` 을 backlog 평문 행 186→202 로 예측했으나 실제 golden 은 안 움직였다. 병합이 들여온 16 평문 행이 m8 코호트에 합류하지 않았다는 뜻이며, id=60m1-cohort-blind 가 표 행에서 관측한 성질이 **평문 행에서도** 성립한다는 실측이다(과대예측). 분모 재지정도 게이트 확장도 하지 않는다 — 봉인된 계획서의 기준선을 병합 뒤로 옮기면 그 창의 자기승인 차단이 사라진다. 저장소 상시 게이트는 병합 후에도 green: `verify.sh --check` rc 0 이고 나머지 9검사 통과(check-all 9/10). 인수처: 병합 인지 기준선을 계획 저작 계약에 넣는 별건
| 2026-08-26 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m2.plan.md | **PR 발행 뒤 main 이 움직이면 ship receipt 를 재앵커할 수 없다 (PR #24 · 2차 병합 실측).** `/mccp:pr` 은 `mccp-pr-codex` receipt 를 `head_sha` 로 묶고 Phase 2.5.9 가 `validate --check-ship-verdict` 로 그것을 다시 읽는다. PR 을 낸 뒤 형제 PR(50-m2 #23)이 main 에 들어와 이 브랜치가 CONFLICTING 이 되면, 충돌 해소 병합이 HEAD 를 옮기므로 게이트가 `ship-gate-stale-head` 로 붉어진다(실측: receipt `487c078` vs HEAD `6265919`). 그런데 재발행은 `finalize-receipt` 가 거부한다 — *refusing to overwrite git-tracked receipt with a different hash … use a NEW decision slug*. 새 슬러그는 `-m2` 체인을 갈라 plan·implement receipt 와의 결속을 끊으므로 고치는 것이 아니라 두 번째 체인을 만드는 것이다. 따라서 **post-PR 병합의 stale-head 는 우회 불가이고 정직한 상태로 남긴다** — 살아 있는 제약은 하나: 그 receipt 가 증명하는 diff 는 병합 전 `487c078` 의 것이고, 병합이 들여온 9파일은 이 게이트가 안 본 델타다(형제 창 산출이라 이 PR 의 리뷰 표면도 아니다). 인수처: mccp 본체 — post-PR 재앵커를 위한 supersession 스키마가 없다(가드 문면이 *Out of Scope* 로 명시)
| 2026-08-26 | HIGH | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m3.plan.md | **PRD P-2 의 배치 예측이 후보 인덱스 규칙표로 반증됐다.** P-2 는 *"24개 입도면 격리가 `no_data` 3칸으로 국소화되고 본문에 21칸이 남는다"* 고 적었는데, 배치를 정하는 것은 `coverage`(resolved/unknown)가 아니라 `status` 이고 `status` 는 추출기 규칙표(`extract-runtime-policy-candidates.mjs` `RULE_TABLE.status_rules`)가 정한다. 실측(2026-08-26): `axis: vendor` 25행 중 V1 16행 전건 `conditional-unknown`(`assignment_state: assigned`) · V2 9행 전건 `null`(`pending` · `deployment-unproven`)이고, `template-config.yaml` 의 `conditional-unknown` `placement` 는 `appendix` 다. pending 9행을 M1 유도 규칙에 넣어도 `conditional-unknown` 이 나온다. **본문 자격 0건이므로 본문 정책 0건이며 예측과 반대다.** 마일스톤 3 은 그 실측대로 저작했고 게이트 `#3c` 가 항등을 문다. PRD 문면 정정은 이 창이 하지 않는다 — 같은 창이 판정 기준을 고치면 기준과 결과가 함께 움직인다. 인수처: 이 PRD 의 소유자 판단 · id=40m3-p2-placement-prediction-refuted |
| 2026-08-26 | MEDIUM | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m3.plan.md | **택소노미 주석의 벤더 수와 코드의 벤더 수가 갈린다.** 동결 stg `4d798f55` 실측: `apps/api/src/modules/treat/error/treat-error-category.ts:1` 의 주석이 이 택소노미를 진료내역 4벤더의 것으로 적는데, 같은 창 `apps/api/src/modules/treat/error/treat-error-vendor-map.ts:5` 의 벤더 유니온은 5종이고 같은 파일 `:178` 부터의 벤더 맵도 5키다(다섯째는 `inhouse`). 주석만 읽은 독자는 자체 수집기에 통합 분류가 없다고 결론짓는다. 문서는 어느 쪽이 옳은지 판정하지 않고 둘을 앵커와 함께 실었다(`vendor:inhouse:*` 3건의 `limitations`). 코드 정정은 저장소 소유자 소관이다 · id=40m3-taxonomy-comment-vendor-count |
| 2026-08-26 | MEDIUM | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m3.plan.md | **택소노미 두 파일이 출처로 적는 설계 문서가 저장소에 없다.** `treat-error-category.ts:3` 과 `treat-error-vendor-map.ts:3` 이 `server/docs/treat-vendor-error-handling.md` 를 설계 출처로 적는데 동결 stg `4d798f55` 트리에 그 경로가 없다(`ls-tree` 매칭 0건). 이것이 실무에 걸리는 자리는 `vendor:codef:no_data` 다 — 자료없음 분류 0건이 *코드 목록 미완성* 인지 *벤더가 실제로 구분하지 않음* 인지를 갈라 줄 유일한 근거가 그 문서인데, 그것이 없어 그 칸이 `분류 부재` 로 닫힌다. **관측된 부재이고 미확인이 아니다** · id=40m3-design-doc-absent |
| 2026-08-26 | MEDIUM | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m3.plan.md | **택소노미의 메시지·대상 층이 사용자 분석 응답 경로에 배선돼 있지 않다.** 동결 3트리 재계수(2026-08-26): `userMessage` server 5 · site 0 · admin 4 / `alimtalkMessage` server 2 · site 0 · admin 0 / `audience` server 3 · site 0 · admin 1. 사용자 경로에 닿는 신호는 `retryable` 하나뿐이고(site 축 전용 토큰 교집합 3파일) 그 값은 `NO_DATA` 와 `INPUT_INVALID` · `AUTH_CODE_WRONG` · `UNKNOWN` 에서 모두 거짓이라 **자료없음과 실패가 사용자 화면에서 갈리지 않는다.** 이것은 사실 기술이지 개선 요구가 아니다 — 화면 개선은 뷰어 축과 서비스 소유자 소관이며 이 PRD 의 범위 밖이다. 인수처: 사용자 화면 오류 표시를 여는 창 · id=40m3-taxonomy-message-layer-unwired |
| 2026-08-26 | LOW | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m3.plan.md | **`docs/_meta/findings/40-runtime-vendor-legal.md` 를 이 PRD 가 신설하지 못한다 (M2 에서 이월된 축의 연장).** 신설하면 `golden.txt` 의 `findings.files` 행이 붉어져 명시적 `--update` 를 강제하는데 `docs/_meta/verify/**` 는 이 PRD 소유가 아니다. 마일스톤 3 의 관측은 그래서 문서 본문과 이 원장에만 남는다. 인수처: `docs/_meta/verify/**` 를 소유하는 창 · id=40m3-findings-file-blocked |
| 2026-08-26 | LOW | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m3.plan.md | **계획서가 리뷰를 받지 못한 축 넷 (`MCCP_CODEX_DISABLED=1` env 정책).** (1) 정책 25건 전건을 부록에 두고 본문을 비우는 판정이 PRD P-2 문면과 어긋나는 것을 이월로만 처리한 선택 (2) 라우팅 행 `vendor:__dispatch__:fallback` 을 마일스톤 4 가 아니라 이 문서가 소유한다는 배분 (3) 신호 소비 파일 수 계수를 구별 가능성의 오라클로 삼는 설계 — 다의어 오탐이 Risks 에 자백돼 있고 게이트 `#6c` 가 벤더 축 전용 토큰으로 좁히지만 그 좁힘의 충분성은 판정받지 않았다 (4) 검사 `#13` 의 코드값 패턴이 표본이라는 사각. 그 토글을 되돌리고 `/mccp:plan` 을 재실행하면 네 축이 실제 verdict 로 재봉인된다 · id=40m3-four-axes-unreviewed |
| 2026-08-26 | LOW | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m3.plan.md | **계획서 관측 10 의 계수가 한 칸 틀렸다 (구현 창 실측).** 관측 10 은 동결 admin `fb001e1d` 의 `src/**` 에서 `NO_DATA` 가 0건이라고 적었으나 실측은 1건이다 — `src/pages/Admin/Subscription/TreatMonitor/TreatMonitorPage.tsx:80` 의 주석 `// NO_DATA, DUPLICATE 등`. **최초 기록은 이 사각이 판정에 안 닿는다고 적었으나 같은 창의 코드리뷰가 그것을 반증했다** — 그 주석 한 줄이 admin 축 파일 집합을 세우던 유일한 근거였고, 따라서 `category`·`userMessage`·`NO_DATA` 세 행의 `도달` 판정 전부가 그 위에 서 있었다. 흡수: 축 판별과 신호 교집합 양쪽을 코드행 등장만 보도록 좁혔고 `NO_DATA` 행이 `진단 표면만` → `미도달` 로 뒤집혔다(반사실 CF4·CF6'). **드러난 것은 계수기의 사각이 아니라 판정의 결박이다.** 게이트 `#6b` 가 코드/주석 판별과 그 잔여 사각을 매 실행 출력에 찍는다. 계획서 본문은 `plan_hash` 앵커라 고치지 않는다 · id=40m3-obs10-admin-nodata-count |
| 2026-08-26 | MEDIUM | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m3.plan.md | **게이트의 축 토큰이 계획서 Risks 행보다 하나 넓어졌다 (코드리뷰 흡수).** 계획서 Risks 표는 벤더 축 전용 토큰으로 `NO_DATA` 와 `isRetryableTreatError` 둘을 지명했는데, 실측(2026-08-26) 동결 admin `fb001e1d` 의 `src/**` 에서 그 둘의 **코드행 등장이 0**이다 — admin 축 집합이 주석 한 줄로만 서 있었다. 하네스는 `VENDOR_ERROR` 를 셋째 축 토큰으로 더했다(같은 파일 `catGroup` 코드행에서 잡히고 site 축 0건). 반사실 CF7 이 그 토큰을 빼면 `category`·`userMessage` 가 거짓 `미도달` 로 떨어짐을 보였다 — 하중이다. **계획서 본문은 `plan_hash` 앵커라 고치지 않았고** 게이트와 계획서 문면의 이 편차는 판정되지 않은 채 남는다. 인수처: `/mccp:plan` 재실행으로 봉인을 갱신하는 창 · id=40m3-axis-token-widened |
| 2026-08-26 | LOW | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m3.plan.md | **코드/주석 판별의 잔여 사각 하나가 fail-open 이다.** 하네스는 행 안에서 토큰이 `//`·`/*`·`*` 뒤에 있는가로 코드행을 가른다. 사각 둘의 방향이 반대다 — 문자열 리터럴 안의 `//`(URL 등)를 주석 시작으로 오인하면 도달을 과소평가하고(fail-safe), **접두 마커 없는 블록 주석 속행은 코드로 세어 과대평가한다(fail-open)**. 뒤쪽은 `도달` 판정을 거짓으로 뒤집을 수 있고 게이트가 잡지 못한다. 동결 3트리의 현 표본에서는 실현되지 않았으나 그 부재는 관측이지 보장이 아니다. 인수처: 축 판별을 토큰 위치가 아니라 구문으로 옮기는 창(INV1 상 파서 도입 불가라 이 PRD 범위 밖) · id=40m3-comment-detect-fail-open |
| 2026-08-26 | LOW | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m3.plan.md | **`#6a` 의 산문 수치 금지가 아라비아 숫자만 본다.** 소비 사슬 `소비 표면` 열은 재유도되지 않는 산문 열이라 수치를 담으면 검사 없는 리터럴이 된다(INV4). 검사를 넣었으나 `/d/` 라 **한글 수사를 못 본다** — 이번 지적의 원인이 정확히 그 형태였다(`사용자 인증 화면 여섯이 분기한다`, 실측 2). 금지 문자열 목록으로 한글 수사를 열거하는 방향은 수렴하지 않으므로 택하지 않았다. 그 열에 수를 쓰지 않는다는 규약 자체는 사람이 지킨다 · id=40m3-prose-numeral-korean |
| 2026-08-26 | LOW | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m3.plan.md | **`#8` 의 기대 앵커 3건은 좌표 선택이 검사되지 않는다.** 후보 인덱스 `evidence` 가 빈 행(`vendor:aligo:no_data` · `vendor:smartro:no_data` · `vendor:toss:no_data`)은 유도 출처가 없어 하네스가 문서와 같은 좌표를 리터럴로 들고 있다 — 그 행에서 검사는 저자와 저자를 대조한다. 해석 가능성(경로 존재 · 행 범위 · 행 비어있지 않음)은 여전히 검사된다. 흡수: `#8` 출력을 `인덱스 26건 / 하네스 리터럴 3건` 으로 갈라 찍고 사각 줄을 붙였다. 근본 해소는 추출기가 그 세 행에 부재의 관측 지점을 `evidence` 로 넣어야 하며 `docs/_meta/verify/**` 는 이 PRD 소유가 아니다 · id=40m3-anchor-literal-unverified |
| 2026-08-26 | HIGH | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m4.plan.md | L2 architect: Gate #2d prevents Axis 2 (code-only policy) omissions by scanning configuration.ts vendor keys. However, only 3 of 10 Axis 2 policies have configuration.ts anchors (30% coverage). The o… · 원문 .claude/reviews/plan-review-insuniverse-docs-40-runtime-vendor-legal-m4.md · id=ce608c82 |
| 2026-08-26 | FAIL | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m4.plan.md | L2 architect: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-insuniverse-docs-40-runtime-vendor-legal-m4.md · id=347f3746 |
| 2026-08-26 | HIGH | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m4.plan.md | **PRD Evidence `[구-SHA]` 3행의 재측정 결과가 셋으로 갈린다 — 같은 어휘로 적으면 세 번째가 첫 번째처럼 읽힌다.** (1) 웹뷰 브리지 규모는 **정확히 일치**한다 — 동결 site `767d1e44` `front/src` 에서 `BRIDGE_NAME` 32회/20파일 · `postMessage` 9회/5파일이고 구값과 같다(게이트 `#14b` 가 매 실행 재계수한다). (2) FCM 파일 수는 **부분 일치**다 — server 는 `modules/fcm/` 4파일 · `modules/push/` 7파일로 구값과 같으나 site 푸시 표면은 구값 *1파일* 이 아니라 **3파일**이다(`PushEventConsentPopup.tsx` · `PushSettingsPage.tsx` · `PushConsentModal.tsx`). (3) 결제 벤더 모드는 **재현 불가**다 — 참조 지점 두 곳은 동결 site 에서 열리지만 그 트리에 `.env` 계열 파일이 0건이라 구값 두 개가 앵커로 결박되지 않는다. 구값은 워킹트리 독출이었다. 문서 `03-payments.md` §환경별 모드가 (3)을 그대로 적었고 값은 옮기지 않았다. PRD 규범 문면 정정은 이 창이 하지 않는다 — 같은 창이 판정 기준을 고치면 기준과 결과가 함께 움직인다. 인수처: 이 PRD 소유자 · id=40m4-old-sha-remeasure-three-ways |
| 2026-08-26 | HIGH | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m4.plan.md | **벤더 인덱스의 키워드 집합이 구조적 사각 넷을 만든다 (FCM 포함).** `extract-runtime-scale.mjs` 의 `VENDOR_KEYWORDS` 8원소가 `vendor-behaviors.yaml` 의 카디널리티 불변식과 묶여 있어 그 집합 밖 연동은 항목이 될 수 없다. 실측(게이트 `#14a`, 2026-08-26): `configuration.ts` 최상위 블록 키 중 **동결 server 트리에 같은 이름의 전용 통합 유닛(`libs/<키>/` 또는 `apps/api/src/modules/<키>/`)을 갖는 것**은 12종이고 키워드 8종을 뺀 차집합이 `{fcm, mailer, s3, user}` 다. `fcm` 은 설정 블록·통합 유닛·예외 형태 세 구조 시험을 전부 통과하는데 이름만으로 배제됐다. `mailer` 는 **발송 축이라 04-messaging 이 열 수도 있었던 연동**이며 이 창은 열지 않고 이월로 올린다. 문서는 넷 전건을 `## 인덱스 사각 — FCM` 에 기술했고(게이트 `#14` 가 전건 기술을 문다) 판별의 사각(블록 키와 유닛 디렉터리 **이름이 어긋나는** 연동 — 본인확인·챗봇 웹훅·동영상 API·CDN)도 같은 절에 적었다. 인수처: `12-index-runtime`(키워드 집합 소유) · 발송 축을 다시 여는 창(`mailer`) · id=40m4-vendor-keyword-blind-spots |
| 2026-08-26 | MEDIUM | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m4.plan.md | **결제·발송 축 벤더 코드값이 코드 인덱스 namespace 에 구조적으로 못 들어간다.** `codes/vendor.yaml` 의 `pattern` 이 진료수집 축 다섯 접두만 받으므로 toss·smartro·aligo 코드는 그 namespace 밖이다. 실무에 걸리는 자리는 정기결제 벤더의 **사용자 노출 분기**다 — `libs/pg/src/toss/toss.service.ts:14` 의 노출 대상 상수 집합이 `:71` 에서 사용자 메시지 여부를 가르는데, 참조할 인덱스 항목이 없어 그 목록의 정본이 코드뿐이다. 문서 `03-payments.md` §사용자 노출 분기는 **값을 열거하지 않고** 분기 존재와 좌표만 적었다(게이트 `#13` 이 코드값 리터럴 0건을 문다). 목록화 인수처: `11-index-code` · id=40m4-payment-codes-outside-namespace |
| 2026-08-26 | MEDIUM | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m4.plan.md | **자동차 수집 전역 토글을 두 메서드가 다른 극성으로 읽는다.** 동결 stg `4d798f55` `apps/api/src/modules/treat/provider/treat-provider.service.ts:110` 은 `!== false`(거짓이 아니면 켜짐) · 같은 파일 `:139` 는 `=== true`(참일 때만 켜짐)이다. `apps/api/src/config/configuration.ts:47` 이 그 키를 항상 불린으로 만들어 지금은 두 식의 결과가 같지만, 설정 블록이 그 정규화를 잃으면 두 경로가 갈린다. 문서는 어느 쪽이 옳은지 **판정하지 않고** 두 앵커를 `treat-provider:__car__:scope` 의 `limitations` 에 함께 실었다. 코드 정정은 저장소 소유자 소관이다 · id=40m4-car-toggle-polarity-split |
| 2026-08-26 | MEDIUM | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m4.plan.md | **본문 정책 0건이 네 마일스톤 연속이다 (PRD Risk 행의 실현 계속).** M4 의 45정책도 전건 부록이며 사유는 배치 규칙의 귀결이다 — 본문 배치를 갖는 상태 3종(`정상`·`게이트 활성`·`미정합`)이 전부 *지금 도달해 활성* 이라는 주장을 담는데 이 PRD 의 어느 축에도 그 근거가 저장소 안에 없다. 게이트 `#3c` 가 세 문서에서 *본문 배치 자격 건수 == 본문 정책 건수* 를 문어 그 항등을 유지한다. **다만 M4 는 그 위에 판정을 하나 더한다** — 미판정이 두 종류이고 하나(`데이터 의존` 3건)는 닫을 경로가 `ops-40-db-snapshot` 이라는 이름을 갖는다. 인수처: 이 PRD 소유자 판단 · id=40m4-body-zero-fourth-time |
| 2026-08-26 | LOW | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m4.plan.md | **`docs/_meta/findings/40-runtime-vendor-legal.md` 신설이 여전히 불가 (M2·M3 에서 이월된 축의 연장).** 신설하면 `golden.txt` 의 `findings.files` 행이 붉어져 명시적 `--update` 를 강제하는데 `docs/_meta/verify/**` 는 이 PRD 소유가 아니다. 마일스톤 4 의 관측도 문서 본문과 이 원장에만 남는다. 인수처: `docs/_meta/verify/**` 를 소유하는 창 · id=40m4-findings-file-blocked |
| 2026-08-26 | MEDIUM | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m4.plan.md | **게이트의 env 토큰이 계획서 리터럴보다 넓다 — 넓히지 않으면 거짓 `none` 이 나온다.** 계획서 §축 4 는 env 토큰을 `process.env.` · `configService.get(` · `this.config.get(` 리터럴로 봉인했는데, TypeScript 제네릭 호출 `configService.get<string>(` 이 그 리터럴에 걸리지 않는다. 실측(2026-08-26): `libs/aligo/src/aligo.service.ts` 의 env 접근 8건이 **전부 제네릭 형태**라 리터럴 매칭이면 E=0 → 게이트 종류가 `none` 으로 떨어진다. `none` 은 §축 4 가 *"두 토큰이 다 없었다는 관측"* 으로 정의한 값이므로 그 거짓은 정의를 직접 깬다. 하네스는 제네릭 인자를 관용하는 정규식을 쓰고 그 토큰 목록을 `#5a` 출력에 매 실행 찍는다. **계획서 본문은 `plan_hash` 앵커라 고치지 않았고** 이 편차는 판정되지 않은 채 남는다. 인수처: `/mccp:plan` 재실행으로 봉인을 갱신하는 창 · id=40m4-env-token-generic-widened |
| 2026-08-26 | MEDIUM | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m4.plan.md | **`#2d` 의 귀속 경로가 계획서의 셋에서 넷으로 늘었다.** 계획서는 설정 블록 벤더성 키가 (a) 인덱스 벤더 8종 · (b) 축 2 표 이름 · (c) `## NOT Building` 명시 중 하나에 귀속돼야 한다고 적었다. 실측 벤더성 키 12종 중 `mailer`·`s3`·`user` 는 셋 어디에도 없고 계획서 본문은 `plan_hash` 앵커라 `## NOT Building` 에 이름을 더할 수 없다. 하네스는 (c') **`04-messaging.md` 의 `## 인덱스 사각` 절에 이름으로 기술됨** 을 넷째 경로로 두고, 어느 키가 그 경로로 닫혔는지를 `#2d` 출력에 매 실행 이름으로 낸다. (c') 는 우회가 아니다 — 계획서 `#14` 가 **같은 집합의 전건 기술**을 이미 요구하므로 그 경로로 닫힌 키는 조용히 빠진 것이 아니라 문서가 이름으로 관측한 사각이다. 인수처: `/mccp:plan` 재실행 · id=40m4-2d-fourth-discharge-path |
| 2026-08-26 | MEDIUM | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m4.plan.md | **인덱스 층 35칸 중 8칸에 앵커가 없어 승계 규칙 셋이 필요했다.** 계획서 §축 4 는 스캔 단위를 *"정책 `anchors[]` 가 가리키는 파일들의 합집합"* 으로 정하고 *"스캔 대상 0파일은 `none` 으로 접지 않고 exit 1"* 을 못박았는데, `vendor-behaviors.yaml` 의 비-treat `fallback` 3칸과 `mapper: null` 인 `normalization` 5칸에는 `anchors[]` 가 없다. 그 여덟을 규칙대로 두면 정상 층이 죽는다. 하네스는 승계를 3단으로 둔다 — (1) 층 `anchors[]` (2) `normalization.mapper` 경로(행은 첫 `export` 로 결박) (3) 그 벤더 `timeout.anchors` 의 파일 집합(= 진입 파일, 8벤더 전건 보유). 어느 규칙이 쓰였는지는 `derive` 와 `#5a` 가 층마다 낸다. 계획서 본문은 고치지 않았다 · id=40m4-layer-anchor-inheritance-rules |
| 2026-08-26 | LOW | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m4.plan.md | **`#14b` 는 계획서 §Validation 에 없던 검사다.** 계획서 Task 5 가 *"계수는 게이트가 동결 site 에서 재계수하며 저자가 적지 않는다"* 를 요구했는데 `#0`~`#15` 어느 검사도 플랫폼 차이 표의 계수를 재유도하지 않았다 — 주장에 대응 게이트가 없는 자리다. Task 5 의 게이트가 `#12`·`#14` 이므로 `#14b` 로 붙였다. 그 재계수는 **부분 문자열 매칭**이어야 한다 — 단어 경계 매칭은 `REACT_APP_BRIDGE_NAME` 을 `BRIDGE_NAME` 으로 잡지 못해(밑줄이 단어문자다) 실측에서 0건으로 떨어졌다. 인수처: `/mccp:plan` 재실행 · id=40m4-14b-added-recount |
| 2026-08-26 | LOW | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m4.plan.md | **계획서 `#2c` 문면의 '선행 4문서' 가 실측 5문서다.** 같은 계획서 `#0b` 는 같은 집합을 '선행 5문서' 로 적는다 — `05-schedules/` 4 + `06-vendors/02-failure-semantics.md` 1 이 실측이다. 하네스는 5를 쓰고 그 계수를 `#2c` 출력에 낸다(선행 5문서 id 74종 · 교집합 0). 계획서 본문은 고치지 않았다 · id=40m4-2c-prior-doc-count |
| 2026-08-26 | HIGH | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m4.plan.md | **이 마일스톤은 `divergent` 로 봉인된 계획 위에서 구현됐다.** `mccp-plan-codex` receipt 의 `resolution.review_verdict` 가 `divergent` 이고 L2 패널 quorum 이 3/4 에 미달했다(architect fail · security·test·invariant pass). 원인은 `MCCP_REVIEW_SINGLE_PASS=deadline_pressure` 로 라운드 캡이 1에 고정돼 **흡수 라운드 없이 반려가 그대로 봉인**된 것이다. 구현 창은 architect 4건·invariant 3건을 건별로 판정해 하네스로 흡수하거나(A1·A4 → `#2d` 사각 계수 자백 · I1 → `preflight` 재실행 가능 · I3 → `#0c` 동결 포인터 대조 신설) 설계대로임을 확인했고(A3), 그 판정은 `.claude/notes/insuniverse-docs-40-runtime-vendor-legal-m4.md` §반려 흡수에 있다. **봉인된 verdict 는 지우지 않았다.** 인수처: `MCCP_REVIEW_SINGLE_PASS` 를 풀고 `/mccp:plan` 을 재실행해 실제 verdict 로 재봉인하는 창 · id=40m4-plan-sealed-divergent |
| 2026-08-26 | MEDIUM | .claude/plans/insuniverse-docs-20-foundation-access-m3.plan.md | 부록 정책의 **산문 논리 주장**을 재유도 값으로 검산하는 검사 신설 — `check8` 은 세 자리의 앵커 집합만 대조하고 조건 조합의 결론은 보지 않는다. 그래서 부록 NONPROD_AUTH_BYPASS 가 "두 우회의 활성 상태가 서로 반대" 로 뒤집혀 적힌 채 16/16 을 통과했다 (2026-08-26 리뷰 H1 · 문면은 같은 창에서 수정 완료). 검사 수는 계획서 검사 `#19` 의 `checks=1,…,16` 리터럴과 `#18` 의 `total=16` 이 결박하므로 이 창에서 늘리지 못한다 — 다음 마일스톤 하네스 소관 |
| 2026-08-26 | LOW | .claude/plans/insuniverse-docs-20-foundation-access-m3.plan.md | 본문 앵커의 행 범위 검사 부재 — `check4` 는 `frontmatterAnchors` 로 프론트매터만 읽고 `lint-docs.mjs` `anchor-repo` 규칙도 `it.anchors` 만 본다. `docs/02-access/01-authn.md` 의 예외·폴백 표와 플랫폼 차이 절 앵커 8건이 어느 검사 사정거리에도 없다 (2026-08-26 리뷰 L1 · 손 대조 8/8 일치이므로 사각이지 결함 아님). `check4` 의 앵커 원본을 문서 전문으로 넓히는 것이 답이나 계획서 검사 `#4` 기대문이 "프론트매터 anchors 행 수" 로 결박 — 다음 마일스톤 하네스 소관 |
| 2026-08-26 | LOW | .claude/plans/insuniverse-docs-20-foundation-access-m3.plan.md | 연혁 표에 저장소 열이 없어 다중 저장소 SHA 가 해석되지 않는다 — `docs/02-access/01-authn.md` 의 `f74117bb` 는 site 저장소이고 나머지 6건은 server 저장소라 server 에서 찾으면 unknown revision 이다. `docs/01-foundation/02-identifier-namespaces.md` 가 3저장소를 같은 4열 형식으로 이미 섞고 있어 이 창이 만든 축이 아니라 저장소 전역 규약이며, 열 추가는 `lint-docs.mjs` `history-columns` 규칙과 `policy-doc@1` 템플릿을 함께 건드린다 — 그 둘의 소유자 소관 |
| 2026-08-26 | LOW | .claude/plans/insuniverse-docs-20-foundation-access-m4.plan.md | **문서 트리 행이 코드에 없는 식별자로 문서를 설명한다.** `docs/00-index.md:82` 가 `03-authz-capabilities.md` 를 `corpAnalysisViewLevel` 로 소개하나 동결 SHA `4d798f55` 의 server 트리에 그 식별자가 0건이다 — 실물은 열 `agc_analysis_view` 와 그 드리즐 필드다. 산출 문서는 그 이름을 쓰지 않는 쪽을 택해 정확하며 이 행만 낡았다. `docs/00-index.md` 는 `00-protocol`(archived) 소유 읽기 전용 공유 자산이라 이 창의 쓰기 범위 밖이고, 같은 파일 83행의 계수 불일치는 `docs/_meta/findings/20-foundation-access.md` 가 관측으로 이미 열었다. 인수처: 그 파일 소유자 · id=20m4-index-row-stale-identifier |
| 2026-08-26 | MEDIUM | .claude/plans/insuniverse-docs-70-viewer-m5.plan.md | **뷰어 산출 루트가 `docs/_meta/ownership.md` 에 등재돼 있지 않다 (마일스톤 5 실측).** `ownership.md` §승계 시 추가 의 70-viewer 행은 `docs/_meta/findings/70-viewer.md` 하나만 지목하고 뷰어 산출 루트(`docs/viewer/**`)는 그 표에 없다. PRD §배타 소유 경로 코드펜스는 세 경로를 선언하지만 `run_ownership_gate` 검사 1·2 는 `ownership.md` 와 우산 PRD 의 표를 서로 대조할 뿐이라 이 공백을 보지 않는다 — 즉 뷰어가 `docs/viewer/**` 를 소유한다는 선언이 소유권 정본에는 없다. 이 창이 닫지 않은 이유: 등재는 `ownership.paths_sha256` 과 `ownership.inherited_additions` 두 golden 키를 움직이고, 그 재동결 슬롯을 형제 PRD `20-foundation-access` 마일스톤 2 가 `in-progress` 로 쥐고 있다(`ownership.md` 184 행 `docs/_meta/verify/**` 행이 `20`/진행). 마일스톤 5 는 golden 을 움직이지 않는 것이 게이트 `#12` 의 조건이므로 여기서 열 수 없다. 인수처: 이 PRD 마일스톤 2 착수 창 — `docs/_meta/findings/70-viewer.md` 신설과 같은 창에서 슬롯 해제를 확인하고 두 등재를 함께 할 것 |
| 2026-08-26 | LOW | .claude/plans/insuniverse-docs-70-viewer-m5.plan.md | **PRD 앵커 rot 기준선 `24.7% (162 중 40)` 은 `policies[]` 축 부분집합이었다 (마일스톤 5 전수 실측).** §재분석 기록 절차 1 이 그 수치를 냈을 때 모집단은 policy 축만이었고 `surfaces[]` 362 · `flows[]` 42 가 기준선 밖에 있었다. 전수는 566 앵커 · 대상 파일 263건이고 rot 는 14.0% 다. **관측 자체는 옳았다** — policy 축 3값(`intact` 122 · `modified` 39 · `deleted` 1)이 이 창의 재현과 글자 단위로 같다. 틀린 것은 그 관측이 전수라는 전제뿐이며 PRD §Success Metrics 는 이 창에서 정정했다. 이월하는 이유: 같은 형태의 축 누락이 §Success Metrics 의 다른 행에도 있는지 확인되지 않았다. B1(항목 조립 스팬)과 B2(연결 추적 조작 수)의 기준선도 `정책 60건` · `문서 13개` 를 분모로 적고 있어 3축 전수 기준인지 policy 축 기준인지가 문면으로 갈리지 않는다. 인수처: 마일스톤 2 — 표면을 세우면 B1·B2 를 실제로 재는 창이 열리므로 그때 분모를 3축으로 재확인할 것 |
| 2026-08-26 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m4.plan.md | **admin 리뷰 라운드 2 는 이 창에서 돌 수 없다 — 측정자가 유지보수자다 (마일스톤 4 창 실측).** 우산 지표의 종료 조건은 *"유지보수자 표기가 2라운드 연속 0건"* 이고 라운드 1 만 이 창이 돌렸다: `.claude/plans/insuniverse-docs-50-domain-m4.ledger.jsonl` 의 886행 전건에 표기가 붙었고 수렴 계수(`사실과다름`+`빠짐`)는 흡수 전 38 · 흡수 후 0, `미검증` 213 은 그 0 옆에 따로 적힌다(하네스 검사 `#8`). 라운드 2 는 문서를 실제로 쓰는 사람이 같은 원장에 두 번째 `round` 값으로 표기해야 성립하며 그 사람은 이 창의 입력이 아니다. 그래서 PRD 마일스톤 표 4행은 `complete` 가 아니라 `in-progress` 로 둔다. 인수처: 유지보수자 표기 라운드를 여는 창 · id=50m4-round2-pending — 갱신 2026-08-26(마일스톤 5 창): PRD 마일스톤 표 4행을 `complete` 로 뒤집었다. 뒤집은 근거는 라운드 2 의 **수행**이 아니라 마일스톤 4 창의 산출과 ship 영수증에 대한 판정이며, 라운드 2 자체는 여전히 열려 있다 — 이 행은 닫히지 않는다. 근거 `.claude/plans/insuniverse-docs-50-domain-m5.plan.md` §NOT Building. 인수처는 그대로다 · id=50m4-round2-pending |
| 2026-08-26 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m4.plan.md | **우산 지표가 정한 표기 carrier 를 이 PRD 가 쓸 수 없어 대체했다 (마일스톤 4 창 실측).** 우산 PRD 는 리뷰 단위를 `docs/_meta/index/policy-candidates.*.jsonl` 행으로 정하는데 그 셋은 인덱스 축 소유이고 그 PRD 는 archived 이며 `docs/_meta/ownership.md` §개정 위임 표에 이 PRD 앞으로 그 경로 행이 없다. `docs/_meta/findings/50-domain.md` 개설도 골든 두 키(`findings.files` · `fixtask.findings_headings`)를 움직여 `docs/_meta/verify/**` 위임을 요구하고 그 위임이 없다 — 마일스톤 1·2·3 이 전부 현행 유지를 택한 자리다. 그래서 carrier 를 `.claude/plans/insuniverse-docs-50-domain-m4.ledger.jsonl` 로 두었고 **그 행은 policy-candidate 행이 아니라 문서 주장 행**이다. 우산이 policy-candidate 를 고른 것은 그 문면이 쓰일 때 각론 문서가 하나도 없었기 때문이며 지금은 문서 자신이 행 형태의 주장 단위를 갖는다. 이 대체가 우산 지표를 대신할 만한지는 우산 소유자의 판정이고 계획서 Acceptance 에 `(미검증)` 으로 남겼다. 인수처: 우산 PRD 지표 문면을 소유한 창 · id=50m4-ledger-carrier-substitution |
| 2026-08-26 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m4.plan.md | **라운드 1 이 원장 886행 중 213행을 `미검증` 으로 남겼다 — 코드 좌표가 없는 서술 주장이다 (마일스톤 4 창 실측).** 부류별로 `limit` 28 · `exit` 58 · `step` 56 · `pre` 55 · `auth` 16 이고 공통 성질은 하나다: 그 행이 부르는 소스 좌표가 없어 동결 트리 대조로 참·거짓을 가릴 수 없다. **좌표를 담은 행은 전건 판정했다** — 판정 축이 인용하는 고유 코드 좌표 45개를 `insuniverse-server` 동결 HEAD `4d798f55` 에서 직접 읽어 서술과 대조했고 어긋난 것은 1건이다(`docs/30-admin/05-treat-monitoring.md` 정체 감시 흐름의 권한 표 계정 종류 셀 — 강제 지점이 통과 분기 `roles.guard.ts:22` 인데 실패 시 열이 `HTTP 403` 이었고 같은 문서 다른 흐름 셀은 같은 축을 `해당 없음` 으로 적어 두 셀이 어긋났다). 그 자리는 이 창에서 흡수했다. 남은 213행은 코드 근거를 더하거나 운영 관측을 붙여야 판정되며 둘 다 이 PRD 범위 밖이다. 인수처: 운영 관측이 서는 창 또는 서술 주장에 좌표를 붙이는 문서 개정 창 · id=50m4-prose-claims-unverified |
| 2026-08-26 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m4.plan.md | **코드스팬↔앵커 결박이 흐름 단위가 아니라 문서별 첫등장 단위다 (마일스톤 4 로컬 코드리뷰 실측).** `docRecords` 의 `code` 부류는 `seen` 집합을 문서 스코프에 두고 스팬 텍스트로 dedupe 하므로, 같은 스팬이 뒤 흐름에 다시 나오면 레코드를 아예 받지 않는다. 검사 `#7` 은 그 위에서 `미대응 계수 0` 을 낸다. 실측: 발생 164건 = 첫등장 91 + 반복 73 이고 **반복 73건 중 52건은 자기 흐름의 `anchors:` 에 그 파일이 없다** — 상위 흐름 `treat-monitor-view-token` 6 · `sales-console-agency-scope` 5 · `treat-monitor-analysis-stall` 5 · `admin-console-settlement-adjust` 4. 가장 날카로운 자리는 `docs/30-admin/05-treat-monitoring.md` 흐름 `treat-monitor-analysis-stall` 로, 권한 표가 부르는 5개 스팬 전부가 그 흐름 앵커 (스케줄러 3건)에 없다. 이 창의 조치는 **사각지대 공개까지**다: `#7` 이 등록부 밖 독립 스캐너 `repeatSpans` 로 전 발생을 재열거해 보존식(발생 == 첫등장 + 반복)을 게이트하고 제외 계수·미대응 계수·상위 흐름을 이름으로 낸다. 단위를 `(흐름, 스팬)` 으로 넓히려면 앵커 수십 건 신설이 필요하고 그것이 원장 전 행의 id 재배치를 부른다 — 이 창 범위 밖이다. 인수처: 흐름 단위 결박을 여는 창 · id=50m4-flow-scoped-code-binding |
| 2026-08-26 | LOW | .claude/plans/insuniverse-docs-50-domain-m4.plan.md | **마일스톤 3 하네스가 이 창 이후 `check-all` 12/14 다 (마일스톤 4 로컬 코드리뷰 실측).** `#14` 는 PRD `*Status:` 가 마일스톤 4 로 넘어가며 붉어졌고 m4 검사 `#11` 이 기대값으로 선언해 둔 자리다. `#1` 은 그와 **별개로 이 창 이전부터** 붉다 — 기준선 `4b209112` 의 `docs/30-admin` 이 `00-ia.md` 하나가 아니라 마일스톤 3 산출 5편을 더 갖기 때문이며, m3 `#1` 은 저작 시점 기준선을 그대로 보고 있다. m4 `#11` 은 m3 `check2`~`check13` 만 돌리므로 `#1` 을 **구조적으로 보지 않는다**. 더해 m3 하네스는 개별 검사가 `FAIL:` 을 찍고도 rc 0 을 낸다(`check1`·`check14` 실측) — m4 `m3Twelve()` 는 `#N ok` 양성 매칭을 함께 요구해 그 함정을 막아 뒀다. 형제 창이 m3 `check-all` 을 직접 돌리면 사유 없이 rc 1 을 본다. 인수처: 종료된 마일스톤 하네스의 기준선 재지정 규약을 정하는 창 · id=50m4-m3-harness-red-post-transition |
| 2026-08-27 | HIGH | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m5.plan.md | **PRD Evidence F-13 행이 활성성이 서로 다른 두 사실을 한 근거로 묶었다 (마일스톤 5 실측).** 그 행은 *"약관 테이블에 버전 컬럼이 없다"* 와 *"두 unique 제약이 타입당 1행을 강제한다"* 를 하나의 `[신]` 근거로 적는다. 동결 트리 행 단위 blame 은 둘을 가른다 — 컬럼 부재는 `e9ae08db`(2024-09-02) · `78ca58ff`(2026-05-18) 로 운영 도달이고 두 제약은 `c577fd29`(2026-07-16) 하나로 운영 미도달이다. 이 창은 두 사실을 다른 정책으로 갈라 배치까지 다르게 했고(`terms:version-column-absent` 본문 · `terms:one-row-per-type` 부록) 그 판정은 게이트 `#5` 가 매 실행 재유도한다. PRD 규범 문면은 이 창이 고치지 않는다 — 같은 창이 자기 기준을 고치면 기준과 결과가 함께 움직인다. 인수처: 이 PRD 소유자 · id=40m5-f13-mixed-reachability |
| 2026-08-27 | MEDIUM | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m5.plan.md | **`legal-surfaces.yaml` 의 `동의_시각: partial` 은 stg 문면이고 운영 문면은 그보다 얇다 (마일스톤 5 실측).** 인덱스가 `paths_with_timestamp_observed: 1` 로 적은 그 하나(`tn_treat_car_request` 동의 5필드)는 `8507677b`(2026-07-20) 라 운영 미도달이고, 운영에 도달한 동의 기록은 `bod_marketing_agree`(`110e08e3`, 2025-12-22) 참·거짓 한 칸뿐이다. 즉 인덱스 값은 동결 stg 트리를 본 값이며 도달성 축을 담지 않는다. 문서는 두 문면을 갈라 적었으나 인덱스 자체는 그대로다. 인수처: `12-index-runtime` — 인덱스에 도달성 축을 더할지의 판단 · id=40m5-consent-partial-is-stg-only |
| 2026-08-27 | MEDIUM | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m5.plan.md | **마스킹 정본의 주석↔코드 갈림과 함수명↔동작 갈림 (마일스톤 5 실측).** `mask.helper.ts` 의 연락처 함수는 10자리 분기 주석이 코드가 만드는 출력과 다른 형태를 적고(인덱스도 `comment_matches_code: false` 로 기록), `maskLastTwoChars` 는 이름과 달리 앞 3자리를 남기고 나머지 전부를 가린다. 어긋남을 만든 커밋은 `712f6fd4`(2025-07-15, 운영 도달)이고 이 파일은 동결 시점까지 1년 넘게 바뀌지 않았다. 이 창은 사실 기술만 하고 정정을 제안하지 않는다(§NOT Building) — 소스 수정은 저장소 소유자 소관이다. 인수처: `insuniverse-server` 소유자 · id=40m5-mask-comment-code-drift |
| 2026-08-27 | MEDIUM | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m5.plan.md | **마스킹 정본에 무마스킹 통과 경로가 넷 있다 (마일스톤 5 실측).** 이메일 로컬파트가 3자 이하면 별표가 0개라 입력과 출력이 같고, 도메인은 어떤 경우에도 노출되며, 연락처는 자릿수가 10·11 이 아니면 입력을 그대로 반환하고, 통합 함수의 기본 분기는 알려진 5종 밖 입력을 예외 없이 그대로 낸다. 네 경로 전건이 운영 도달 코드다. 이 창은 형태 기술만 하고 그 형태가 의도된 것인지 판정하지 않는다. 인수처: `insuniverse-server` 소유자 · id=40m5-mask-passthrough-paths |
| 2026-08-27 | MEDIUM | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m5.plan.md | **감사 축이 `legal-surfaces.yaml` 의 자기 선언 사각이라 인덱스 개정 회부가 필요하다 (마일스톤 5 실측).** 그 파일 `consent_record.blind_spots` 에 `audit-log-table` 이 있고 후보 인덱스 `axis: legal` 7행에 감사 행이 없다. 이 창은 코드에서 우주를 넓혀 4부류(전용 감사 기록 0 · 행위자 컬럼 보유 표 9 · 운영 로그 표 5 · 업무 이력 표 7)를 유도해 `docs/07-legal/03-audit.md` 로 냈고 게이트 `#14` 가 그 계수를 매 실행 재유도한다. 그러나 인덱스 자신은 여전히 그 축을 담지 않으므로 형제 문서가 같은 자리를 다시 열면 또 코드에서 유도해야 한다. 인수처: `12-index-runtime` · id=40m5-audit-axis-index-gap |
| 2026-08-27 | LOW | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m5.plan.md | **`insuniverse-site/publish/**` 가 manifest `src_roots` 밖인데 앵커로는 쓰인다 (마일스톤 5 실측).** `terms_corpus.sources` 의 정적 배포 파일 5건이 약관 본문 소재로 인덱스에 실려 있고 인덱스도 `role_axes.publish_covered: false` 로 그 사실을 적는다. 즉 같은 파일이 코퍼스 축에서는 원소이고 코드 스캔 축에서는 우주 밖이다. 이 창은 그 차이를 `docs/07-legal/02-privacy-and-masking.md` 본문에 적는 것까지 했고 manifest 는 읽기만 한다(UI11). 인수처: `00-protocol` — `src_roots` 선언과 코퍼스 우주의 관계를 정하는 창 · id=40m5-publish-outside-src-roots |
| 2026-08-27 | LOW | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m5.plan.md | **`docs/_meta/findings/40-runtime-vendor-legal.md` 신설이 여전히 불가하다 (마일스톤 5 실측 · M2~M4 이월의 연장).** `golden.txt` `findings.files` 에 그 이름이 없고 파일 개설은 그 키를 움직인다. 재동결은 `docs/_meta/verify/**` 위임을 요구하는데 이 PRD 에는 그 위임이 없다. 마일스톤 1~5 가 전부 같은 자리에서 현행 유지를 택했다. 인수처: `docs/_meta/verify/**` 위임이 열리는 창 · id=40m5-findings-file-still-blocked |
| 2026-08-27 | HIGH | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m5.plan.md | **M4 하네스 `#15` 가 형제 창의 미커밋 PRD 편집에 죽는다 (마일스톤 5 구현 중 실측).** M4 `check15` 는 `git diff HEAD -- <PRD>` 에 hunk 가 하나라도 있으면 그것을 **자기 갱신**으로 읽고 `Plan 셀이 M4 계획서 경로인 추가 행` 을 요구한다. M5 가 같은 표의 5행을 고치면 그 조건이 깨져 `#15b FAIL: 변경 행이 1개다 (기대 2)` 가 나고, M5 `#0a` 가 M4 `all` 을 요구하므로 **M5 의 모든 검사가 선행 검사에서 막힌다**(실측: `#0a FAIL: M4 rc=1 (검사 check15 에서)`). 모드 분기의 키가 *"이 파일에 diff 가 있는가"* 이지 *"내 행에 diff 가 있는가"* 가 아닌 것이 원인이다. 이 창의 해소는 순서다 — PRD 편집을 커밋한 뒤 `all` 을 돌리면 두 하네스가 함께 커밋 후 모드로 간다. M4 하네스는 이 창의 `## Files to Change` 밖이라 고치지 않는다. **M6 도 같은 자리에서 막힌다.** 인수처: 종료된 마일스톤 하네스의 모드 분기 키를 행 단위로 좁히는 창 · id=40m5-m4-gate15-sibling-prd-edit |
| 2026-08-27 | LOW | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m5.plan.md | **계획서 §GROUND 관측 8·11 의 계수 두 개가 실측과 다르다 (마일스톤 5 구현 중 실측).** 관측 8 은 업무 이력 표 `th_*` 7종 중 *"행위자 컬럼은 그중 3종만"* 이라 적었으나 동결 `drizzle/schema.ts` 재열거에서 `adm_id` 계열 칸을 가진 것은 `th_money_corp` · `th_money_payment_cancel` **2종**이다. 관측 11 은 `terms_corpus.sources` 의 site 항목을 *"10종"* 이라 적었으나 실제 site 항목은 13건(front-const 4 · front-page 4 · static-html 5)이고 13/13 이 행수 일치한다. 두 자리 모두 문서는 **게이트 유도값**을 실었고 계획서 산문은 `plan_hash` 앵커라 고치지 않았다 — 게이트가 이기는 축이며 `#14`·`derive` 출력이 매 실행 실측을 낸다. 인수처: 없음 — 계획서 산문의 오기이고 산출물은 옳다 · id=40m5-plan-prose-count-drift |
| 2026-08-27 | LOW | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m5.plan.md | **계획서 축 2 의 앵커 2건이 하중 없는 행을 가리킨다 (마일스톤 5 구현 중 실측).** `terms:revocation-record` 의 `drizzle/schema.ts 1772행` 은 소비 시각 칸(`tcr_consumed_at`)이고 동의 철회 시각 칸은 1773행이며, `terms:reconsent-absent` 의 `terms.service.ts 98행` 은 빈 행이다. 구현은 두 정책의 프론트매터 `anchors` 에 실 하중 행을 **더했고**(1773 · 99) 계획서 표 전사(`planCells`)는 원문 그대로 두어 `#2b` 집합 대조를 보존했다. 보정 사실은 `#2 앵커 보정:` 줄이 매 실행 이름으로 낸다. 두 보정 행 모두 원 앵커와 정의 커밋이 같아 도달성 판정은 불변이다. 인수처: 없음 — 계획서 앵커의 정밀도 문제이고 산출물은 보정됐다 · id=40m5-plan-anchor-imprecision |
| 2026-08-26 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m5.plan.md | **site 라우트 4건이 어느 등록 라우트에도 대응하지 않아 빈 화면으로 떨어진다 (마일스톤 5 실측).** `insuniverse-site` 동결 HEAD 의 `front/src` 에서 큰따옴표 리터럴 `navigate` 대상 고유 49건을 뽑아 `front/src/App.tsx` 의 리터럴 라우트 경로 전수(잎·비잎 포함)와 대조했다. 34건은 정확 일치 · 2건은 `:param` 패턴 일치 · 8건은 파라미터 조립 접두 · 1건은 절대경로가 아닌 상대 이동(`select-payment-card`)이고, 남은 4건 `/account/signin` · `/join` · `/mypage/money/auto-charge` · `/step-fail/b2c` 는 어떤 라우트 패턴과도 맞지 않는다. 등록된 라우트가 없으므로 와일드카드 라우트(`path="*"`, `element={<></>}`)로 떨어져 **빈 화면**이 된다. **계획서 관측 7 은 같은 49건을 비param 화면 집합과 대조해 31/14/4 로 갈랐다 — 중간 부류의 수는 대조 기준 집합에 따라 달라지고 총수 49건과 dangling 4건만 두 기준에서 같다.** 그 두 수는 이 창의 하네스 검사 `#7` 이 매 실행 재유도해 이 행과 대조한다. 이 창은 코드를 고치지 않는다(PRD §Out of scope) — 문서 `docs/20-site/00-ia.md` 의 해당 화면 `limitations` 에 4건 전건을 적었고 그 결박도 `#7` 이 진다. 인수처: `insuniverse-site` 코드를 고치는 창 또는 site 흐름 문서가 이탈을 서술하는 창 · id=50m5-dangling-navigate-targets — OWNED-DEFERRED 2026-08-27: 마일스톤 6 이 문서 서술로 인수했다. 4건 전건이 귀속 흐름을 갖고 그 흐름의 `실패·이탈` 표에 **등록 라우트 부재**로 실려 있다(check4 가 귀속과 문서 등재를 함께 문다) — `/account/signin`·`/mypage/money/auto-charge` 는 `subscription-money`, `/join` 은 `account-recovery`, `/step-fail/b2c` 는 `alimtalk-b2c-certify` 다. 인수 중 새 사실 하나: `/mypage/money/auto-charge` 호출은 **주석 처리된 JSX 블록 안에 있어 현재 도달하지 않는다**(`PaymentPage.tsx:341`). 코드 수정은 이 PRD 범위 밖이라(UI5) 서술과 이월에서 멈춘다 |
| 2026-08-26 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m5.plan.md | **site 화면 집합에 저장소 차원의 동결 대조가 없다 — 판정 기준이 같은 창의 추출기다 (마일스톤 5 실측).** `docs/_meta/extraction-manifest.yaml` §`screen_codes` 의 `derived_from` 은 admin 라우트 인벤토리 하나이고 `route_count`·`set_sha256`·`per_router` 세 값 전부 admin 만 담는다. site 를 담는 대응 키는 manifest 에도 `docs/_meta/index/codes/` 아래에도 없다. 그래서 마일스톤 5 는 화면 집합을 동결 blob 에서 직접 유도했고 그 재검증을 자기 하네스가 진다 — 하네스는 2회 실행 sha256 동일성으로 **재현성만** 판정하며 그 값을 골든에 싣지 않는다. **추출기가 틀리면 문서와 추출기가 함께 틀리고 게이트는 초록이다.** 닫으려면 추출기를 `docs/_meta/verify/` 에 커밋하고 manifest 에 집합을 동결해야 하는데 그 경로는 이 PRD 의 배타 소유 밖이고 개정 위임도 없다 — 발신 `R-50-2` 로 기록에서 멈췄다. 인수처: `docs/_meta/extraction-manifest.yaml` 과 `docs/_meta/verify/**` 의 개정 위임을 받은 창 · id=50m5-site-inventory-not-frozen |
| 2026-08-26 | LOW | .claude/plans/insuniverse-docs-50-domain-m5.plan.md | **site 라우트 2건은 경로가 빌드 환경변수 식이라 동결 트리만으로 값을 알 수 없다 (마일스톤 5 실측).** `front/src/App.tsx` 의 결제 결과 라우트 둘이 `path={process.env.REACT_APP_TOSS_SUCCESS_URL ?? ""}` · `path={process.env.REACT_APP_TOSS_FAIL_URL ?? ""}` 로 등록된다. 기본값이 빈 문자열이라 변수가 없으면 부모 경로와 겹치는 라우트가 되고, 값이 있으면 화면 집합이 그만큼 늘어난다 — 어느 쪽인지는 동결 트리에 없다. 같은 축에서 `front/src/main.tsx` 의 `basename` 도 `process.env.REACT_APP_PUBLIC_PATH` 에서 오므로 배포 시 전 라우트에 접두가 붙을 수 있다. 두 사실 모두 `docs/20-site/00-ia.md` 의 H1 아래 고지에 적었고 이 두 라우트는 사유를 붙여 화면 집합에서 제외했다. 인수처: 빌드 환경변수 집합을 문서화하는 창 또는 배포 설정을 소유한 축 · id=50m5-env-dependent-routes |
| 2026-08-26 | LOW | .claude/plans/insuniverse-docs-50-domain-m5.plan.md | **종료된 마일스톤 하네스의 허용 집합이 후속 창의 산출을 범위 위반으로 잡는다 (마일스톤 5 실측).** 마일스톤 4 하네스 `check12` 는 마일스톤 행 판정 뒤에 자기 창의 허용 집합으로 범위 검사를 한 번 더 하는데, 그 집합은 저작 시점에 없던 `docs/20-site/` 를 모른다. 그래서 마일스톤 5 가 산출 문서를 만든 **순간부터** — 전이 전인데도 — `check12` 가 `범위 밖 변경 1건 — docs/20-site/00-ia.md` 로 죽는다. 계획서 관측 9 는 그 두 번째 축을 세지 않았고 *전이로 정확히 한 검사가 붉어진다* 로만 적었다(전이 **후** 문면으로는 여전히 맞다 — 마일스톤 행 판정이 먼저 죽는다). 이 창의 조치는 귀속 검사다: 마일스톤 5 하네스 `check11` 이 전이 전 붉음을 그냥 받아들이지 않고 m4 가 이름낸 경로 전건이 **이 창의 허용 집합 안**인지 묻고, 하나라도 밖이면 실패한다. 근본 해소는 종료된 하네스의 기준선·허용 집합을 후속 창이 어떻게 다룰지 정하는 규약이며 그것은 이 창 범위 밖이다. 인수처: 종료된 마일스톤 하네스의 기준선 재지정 규약을 정하는 창 · id=50m5-prev-harness-scope-set-stale |
| 2026-08-26 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m5.plan.md | **exits 유도가 각 화면의 페이지 컴포넌트 파일 한 겹에서만 돌았다 — 그 페이지가 렌더하는 feature 컴포넌트의 이동은 세지 않았다 (마일스톤 5 로컬 코드리뷰 실측).** 계획서 관측 7 의 소스 2 는 *리터럴 `navigate` 대상 중 실재 화면으로 해석되는 것* 이라 범위가 `front/src` 전수로 읽히는데, 실제로 exits 에 실린 것은 `surfaces[].anchors` 가 부르는 페이지 파일 안의 이동뿐이다. 표본 `site-auth-find` — `FindPage` 가 렌더하는 `features/findForm/` 이 `/auth/login`(실재 화면)과 `/join`(dangling)으로 가는데 그 화면의 exits 에는 가드발 `site-main` 하나뿐이다. **`/join` 이 문서에 빠져 있던 것이 이 결함의 관측 계기다** — dangling 4건 중 나머지 3건은 이동이 페이지 파일 안에 있어 잡혔다. 이 창의 조치는 **범위 공개까지**다: 문서 H1 고지 5항과 화면별 `limitations` 문면을 *그 화면의 페이지 컴포넌트 파일 안* 으로 좁혔고, 하네스 `#7` 이 리터럴 `navigate` 보유 파일 중 문서 anchors 밖인 것과 그 파일에만 있는 이동 대상을 매 실행 계수로 낸다. 근본 해소는 import 그래프를 따라가는 귀속이며 라우트 트리만으로는 서지 않는다 — 이 창 범위 밖이다. 인수처: site 흐름 5종을 쓰는 창(마일스톤 6) · id=50m5-exits-page-file-scoped — OWNED-DEFERRED 2026-08-27: 마일스톤 6 이 인수했다. 흐름 문서 5편의 이동 대상 유도를 **import 그래프 귀속**으로 넓혀 이 지적의 근본 해소를 흐름 축에서 냈다 — 별칭 해석 + 배럴 재귀로 페이지 진입 45건에서 심볼 518건을 해결(미해결 0)하고 그 파일들의 리터럴 이동 대상 40건을 모았으며, 유도 불가 56건(조립 35 · 템플릿 8 · 변수 13)을 게이트가 매 실행 이름으로 낸다(`insuniverse-docs-50-domain-m6.gates.mjs` check4). **IA `surfaces[].exits` 자체는 넓히지 않았다** — 템플릿이 IA 와 flow 의 경계를 화면 대 순서로 정했고, IA 를 고치면 마일스톤 5 하네스 check7 이 예정에 없던 사유로 붉어진다. IA 쪽 잔여는 마일스톤 7 의 관계 축 종료 판정으로 넘긴다 |
| 2026-08-26 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m2r.plan.md | L2 test: Filter5 reference-count conjunct for rows 5-6 is marked n/a and won't affect judgment if resolver later, making all 8 rows permanently fail-containing · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated.md · id=41cebcae — RESOLVED 2026-08-26: 로컬 리뷰가 같은 축을 더 깊게 잡았다. 검사 `#8` 이 5축을 **완전 재유도 3축 · 부분 1축(필터3 0/8) · 사람 판정 10칸** 으로 쪼개서 출력하도록 바뀌었고, 필터5 conjunct 의 `n/a` 취급이 그 배분표에 명시된다. 진짜 하중 자리는 필터5 가 아니라 행 `8e03420` 의 필터4 오버라이드였고(그 행의 유일한 fail), 원장·`#8`·Acceptance 에 명문화됨 |
| 2026-08-26 | FAIL | .claude/plans/insuniverse-docs-60-history-deprecated-m2r.plan.md | L2 test: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated.md · id=278f578e — 열림: 재리뷰 전까지 닫지 않는다. 계획서 body 가 흡수로 바뀌었으므로 `plan_hash` 가 이동했고 receipt 는 stale 이다 — `/mccp:plan` 재진입으로만 재봉인된다 |
| 2026-08-26 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m2r.plan.md | **receipt 가 `converged: true` · `findings: []` · `open_questions: []` 인데 패널은 `divergent` 이다 (로컬 리뷰 실측).** `MCCP_REVIEW_SINGLE_PASS=deadline_pressure` 로 봉인되면서 L2 차단 2건(test/HIGH · test/FAIL)이 receipt 에 안 실렸다. `/mccp:code-review` Phase 2.5.4 와 implement preflight 는 `resolution.open_questions` 를 auto-CRITICAL 로 스캔하므로 빈 배열이면 **차단 지적이 하류 어느 게이트도 못 세운다**. 흔적은 backlog 2행뿐이고 그 2행은 어느 게이트도 안 읽는다. 인수처: mccp 본체 — single-pass 봉인 시 차단 finding 을 `open_questions` 로 싣는 경로가 없다 · id=60m2r-receipt-open-questions-empty
| 2026-08-26 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m2r.plan.md | **`dead-candidates.yaml` `state` 가 patch-id 그룹 밖 재도입을 못 본다 — 8행 중 2행 실측.** `70af9b5` 는 `state: absent`(`state_basis: ordering`, 마지막 사건이 revert)인데 동결 HEAD 에 mapper 가 복원돼 있고, `8e03420` 은 `state: unresolved`(`state_basis: none`)인데 `event_sequence` 말단이 `A` 2건이다. 이 창은 원장에서 `UI4-override(state=<인덱스값>)` 표기로 닫고 인덱스를 고치지 않는다 — 생성기 개정 위임이 없다. 인수처: `11-index-code` 축 · id=60m2r-index-state-blind-to-reintroduction
| 2026-08-26 | LOW | .claude/plans/insuniverse-docs-60-history-deprecated-m2r.plan.md | **`revert_groups` 1건이 다원소라 `[0]` 소비자가 최종 사건을 잃는다.** `3aa7570` 이 `reverts`·`targets` 각 2원소이고 그 그룹 `final_event` 는 `reverts[1]`(`eb1bed93…`) 이다. 이 창은 원장 SHA 두 열을 전건 열거로 바꾸고 `#8` 을 집합 대조로 놓았다. 다른 소비자(발행 문서·후속 창)는 아직 `[0]` 가정을 쓸 수 있다. 인수처: `2b` 또는 revert 축 발행 창 **2026-08-26 (2b 실측) — 이 이월은 `2b` 에서 닫히지 않는다.** 2b 는 삭제 축이고 `revert_groups` 소비자를 만들지 않는다(§NOT Building — revert 축은 M2·2r 소관). 다원소 그룹의 `[0]` 가정을 쓰는 자리가 이 창에 0건이라 판정 대상이 없다. 남은 인수처는 revert 축 발행 창이다 · id=60m2r-revert-group-multivalued
| 2026-08-26 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m2b.plan.md | **삭제 축 참조 카운트의 측정 시점이 정의되지 않았다 (2b 실측).** 5중 필터 5 의 참조 conjunct 는 *어느 시점의 트리에서 세는가* 를 정해야 값이 난다. 현재 유일한 산출 축인 코드 축은 동결 HEAD 에서 스캔하고 삭제 경로는 정의상 그 트리에 없어 `defined_in` 앵커 5,202건과 삭제 경로의 교집합이 0 이다(env 게이트 축도 앵커 15경로에 교집합 0). `05-final-spec.md` §3 은 그 시점을 정의하지 않는다. 열려면 측정 시점을 삭제 직전 부모 트리로 옮긴 새 유도가 필요하고 그 선택은 사용자 판정 사항이라 계획서가 대신 내리지 않는다(UI3). 인수처: 사용자 판정 — PRD §Open Questions *삭제 축 참조 카운트의 측정 시점* **2026-08-27 (m3 실측) — 이 이월은 이 창에서도 닫히지 않는다.** `.claude/plans/insuniverse-docs-60-history-deprecated-m3.plan.md` 는 삭제 축이 아니라 발산 축인데 **뿌리가 같다** — 두 축 다 하류 인덱스가 동결 stg HEAD 를 기준선으로 잡고, 삭제 경로는 정의상 그 트리에 없으며 prod-only 는 정의상 `--not <frozen head>` 다. 발산 축 실측: prod-only 102건 ∩ `commits.<repo>.jsonl` 6,190행 = 0 이고 `comments.*`·`code`·`runtime` 5축에는 커밋 앵커 필드 자체가 없다(findings F-11). 측정 시점이 판정되기 전에는 어느 축에서도 값이 나지 않는다 · id=60m2b-refcount-measurement-point
| 2026-08-26 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m2b.plan.md | **삭제 축 사정거리의 대부분이 `unknown` 으로만 막혀 재판정 대상으로 남는다 (2b 실측).** 사정거리 335행 중 `fail` 을 하나라도 가진 행은 4건뿐이고(`prod_reached: false` = 배포된 적 없음) 나머지 331행은 `unknown` 으로만 막힌다. 2r 이 revert 축 8행 각각에 최소 1축 `fail` 을 세워 *축이 열려도 결과가 안 바뀐다* 까지 간 것과 달리, 이 331행은 측정 시점 판정이 내려지면 결과가 바뀔 수 있다. 그 집합은 하네스 `ledger` 가 매 실행 이름으로 출력하므로 축이 열릴 때 다시 세지 않아도 된다. 인수처: `id=60m2b-refcount-measurement-point` 가 닫히는 창 · id=60m2b-deletion-axis-unknown-only
| 2026-08-26 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m2b.plan.md | **M2b Task 0 기준선 앵커도 변경 창 안에 있다 (`id=60m1-anchor`·`id=60m2-anchor` 와 같은 잔여의 2b 판).** 검사 `#5`·`#6` 이 `git log --diff-filter=A -- <M2b 하네스>` 로 특정한 커밋의 blob 을 유도 원본으로 읽는다. 그 커밋은 이 브랜치가 만들었고 이 저장소에는 CI 도 보호 ref 도 없어 이력 재작성으로 앵커를 다시 쓸 수 있다. 없는 앵커를 있는 척 검사하지 않는다(INV4). 인수처: 없음 — 외부 앵커가 생기는 시점까지 구조적으로 해소 불가이며 그것이 판정이다 · id=60m2b-anchor
| 2026-08-27 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m2b.plan.md | **main 병합이 검사 `#6` 을 형제 창 델타로 붉힌다 (병합 후 실측 · m2 `id=60m2-merge-flips-check7` 과 같은 축).** `#6` 은 기준선을 Task 0 커밋 `ccd2106` 로 고정하고 `golden.txt` 변동 키 집합이 기대 집합과 **정확히 일치**할 것을 요구한다. 기대 집합은 이 창의 입력 하나(`findings` 표제 6→9)에서만 유도되므로 형제 창 델타를 구조적으로 못 담는다. `origin/main` 병합이 `20-foundation-access` 의 findings 파일 개설을 들여와 `findings.files` 키가 움직였고 `#6` 이 *기대 밖 [findings.files]* 로 exit 1 한다 — 나머지 7검사는 rc 0. **재앵커하지 않는다**: 기준선을 병합 팁으로 옮기면 이 창 자신의 델타(`fixtask.findings_headings`)까지 기준선에 삼켜져 검사가 공허해지고, 하네스는 `mccp-implement-codex/...-m2b converged` 로 이미 봉인됐다. 귀속은 `git diff ccd2106:docs/_meta/verify/golden.txt origin/main:docs/_meta/verify/golden.txt` 2키로 재현된다. 인수처: 회귀 검사를 **귀속 검사**로 바꾸는 창 — 기대 집합을 이 창 입력에서만 유도하지 말고 `merge-base` 이후 형제 델타를 빼고 비교한다 · id=60m2b-merge-reddens-golden
| 2026-08-26 | MEDIUM | .claude/plans/insuniverse-docs-70-viewer-m2.plan.md | **`docs/_meta/findings/70-viewer.md` 신설이 이월됐다 (마일스톤 2 착수 조건 A3 미충족).** `docs/_meta/verify/verify.sh` 의 `FINDINGS` 순회가 `fixtask.findings_headings` 를, `golden.txt` 의 `findings.files` 가 같은 목록을 담아 파일 하나가 두 golden 키를 움직인다. 재동결 슬롯은 `ownership.md` 의 `docs/_meta/verify/**` 행이 `20-foundation-access` **진행**으로 쥐고 있고 그 PRD 마일스톤 4·5·6 이 `pending` 이다. **인수처**: 그 슬롯이 해제되는 시점. 그때까지 이 창의 발견은 `.claude/notes/insuniverse-docs-70-viewer-m2.md` 가 진다 |
| 2026-08-26 | MEDIUM | .claude/plans/insuniverse-docs-70-viewer-m2.plan.md | **`ownership.md` §승계 시 추가 의 뷰어 산출 루트 등재가 이월됐다 (마일스톤 5 이월 행의 재이월).** `ownership.inherited_additions` 2키를 움직이므로 위 행과 같은 슬롯에 묶인다. 마일스톤 2 는 `docs/viewer/build/` 로만 산출하고 `.gitignore:59` 의 `build/` 가 그것을 덮어 등재 없이도 성립했다 — 산출물을 커밋하기로 판정하면(PRD §Open Questions) 등재가 **선행조건이 된다**. **인수처**: 같은 슬롯 해제 시점 |
| 2026-08-26 | MEDIUM | .claude/plans/insuniverse-docs-70-viewer-m2.plan.md | **B1 스팬 정의를 고정하면서 초판 기준선이 무효가 됐다 (마일스톤 2 실측).** 정의를 "조각의 최소~최대 바이트 거리" 로 박고 조각 종류를 템플릿 정본의 플레이스홀더에서 유도하니 policy 축 조각 수가 4~7 로 넓어졌다 — `## 예외·폴백` 표 행과 `## 부록` H3 가 조각에 들어왔다. 계획서 관측 5 의 `3조각 78 · 4조각 31` 은 `적용 범위` 표 행만 세던 좁은 정의의 값이다. 초판 PRD 기준선 `평균 6.4 KB · 최대 56.8 KB` 와 현행 산출(`policies avg=36225 max=75306`)은 **다른 정의의 값**이라 감소율이 계산되지 않는다. **인수처**: 마일스톤 3 — 새 기준선을 마일스톤 2 산출로 삼을지 옛 정의로 재산출할지 판정 — ABSORBED-M3 2026-08-27: **판정으로 닫았다.** 마일스톤 2 산출을 새 기준선으로 동결하고 옛 정의로 재산출하지 않는다. 근거 둘 — 초판 기준선은 정의가 문면에 없던 값이라 '옛 정의' 가 복원이 아니라 재구성이고, 모집단이 정책 60→177 로 움직여 감소율의 분모가 성립하지 않는다. 판정 규칙을 '초판 대비 감소율' 에서 **같은 실행 안의 부등호**(원본 평균 > 조립 후 평균)로 바꿨고 마일스톤 2 검사 `#9` 가 이미 그것을 문다. 판정 문면은 PRD §Success Metrics 의 `B1 스팬 기준선 판정 (마일스톤 3)` 인용 블록이며 §Open Questions 의 같은 항이 종결됐다. 게이트 `#14` 가 그 문면과 이 행의 인수 표기를 함께 본다 |
| 2026-08-26 | LOW | .claude/plans/insuniverse-docs-70-viewer-m2.plan.md | **계획서 관측 6 의 미작성 계수 37 은 38 이다 (마일스톤 2 실측).** 트리 경로 56 · 실재 문서 18 이므로 트리에 있고 파일이 없는 자리는 38 이다. 관측 6 이 자기 참조 1건을 55 에서 한 번 빼고 18 에서 또 뺐다. 생성기와 검사 `#5` 는 계수를 리터럴로 갖지 않고 트리에서 유도하므로 산출은 처음부터 38 이었다(INV4 가 값을 냈다). **인수처**: 없음 — 기록만. 계획서 산문은 봉인이라 고치지 않는다 |
| 2026-08-26 | LOW | .claude/plans/insuniverse-docs-70-viewer-m2.plan.md | **`docs/00-index.md` 는 프론트매터가 없어 `parseDoc` 이 절을 0건으로 낸다 (마일스톤 2 실측).** `lint-docs.mjs` `parseDoc` 은 1행이 `---` 이 아니면 `indexBody` 를 부르지 않고 즉시 반환한다 — `sections` 0건 · `fenced` 전건 false. 그 파일이 nav 순서 정본(§문서 트리)을 지므로 0절을 "절 없음" 으로 읽으면 정본을 못 읽는다. 생성기는 `indexUnfronted` 로 ATX·코드펜스 두 축만 채워 우회했고 setext 는 채우지 않는다(그 파일에 없다). **인수처**: doc-kit 소유자 — `parseDoc` 에 프론트매터 없는 문서용 진입점을 둘지 |
| 2026-08-27 | MEDIUM | .claude/plans/insuniverse-docs-70-viewer-m3.plan.md | **`--freshness` 항목 집합 대조가 형제 PRD 의 문서 추가에 fail-closed 로 반응한다 (마일스톤 3 실측).** 생성기는 `anchor-freshness.json` 의 `{doc, axis, item}` 집합과 이 실행의 항목 집합을 **양방향으로** 요구하고 어긋나면 이름 있는 실패를 낸다 — 다른 문서 트리 산출을 물리면 조인이 조용히 비기 때문이다. 그 대가로 형제 PRD 가 문서를 하나만 더해도 `anchor-freshness.mjs` 를 먼저 다시 돌리지 않으면 `--freshness` 빌드가 거부된다(실측 378 == 378 로 현재는 성립). 완화(부분 조인 허용)는 이 창에서 **의도적으로 안 했다** — 부분 조인은 '앵커가 없다' 와 '아직 안 쟀다' 를 같은 빈칸으로 접는다. **인수처**: 두 생성기의 실행 순서를 빌드 게이트로 묶는 마일스톤 6 — ABSORBED-M6 2026-08-31: 마일스톤 6 이 `docs/viewer/gate.mjs` 를 신설해 두 생성기의 실행 순서를 단일 진입 안으로 묶었다. `build` 는 앵커 생성기를 먼저 돌리고 성공했을 때만 그 산출을 `--freshness` 로 문서 생성기에 물린다. 낡은 산출을 물렸을 때의 이름 있는 실패는 `probe` 의 `stale-freshness` 프로브가 매 실행 재현한다 (게이트 `#4`·`#9`). **완화(부분 조인)는 여전히 안 한다** — 그 판정은 이 인수의 대상이 아니었다 |
| 2026-08-27 | LOW | .claude/plans/insuniverse-docs-70-viewer-m3.plan.md | **어휘 리터럴 금지 검사는 주석을 못 본다 (마일스톤 3 설계 판정).** 게이트 `#3` 은 생성기 소스의 **코드 문자열 리터럴**만 스캔하고 주석은 뺀다 — 주석의 어휘는 행동에 닿을 수 없으므로 금지 대상이 아니고, 세면 이 검사는 리터럴이 아니라 산문을 지킨다(층위 6). 대가로 *주석에만 있는 옛 어휘가 낡아도 검사가 안 본다*. `#3` 이 그 계수를 출력에 함께 내 사각지대를 드러낸다(현행 4블록). **인수처**: 없음 — 기록만. 주석 어휘의 신선도를 기계로 보려면 그것은 이 축이 아니라 주석 rot 축이고 별개 도구가 필요하다 |
| 2026-08-27 | LOW | .claude/plans/insuniverse-docs-70-viewer-m3.plan.md | **`APPENDIX_SECTION`·`INTACT_BUCKET` 두 상수가 게이트에 복제돼 있다 (마일스톤 3 실측).** 게이트는 `lint-docs.mjs` 를 부르지 않는 것이 독립 재열거의 조건이라 두 값을 자기 소스에 갖는다. 조용한 복제를 막기 위해 `#6` 은 `lint-docs.mjs` 의 `const APPENDIX_SECTION = "…"` 선언과, `#11` 은 `anchor-freshness.mjs` 의 `BUCKETS` 배열과 각각 문자열로 대조해 갈리면 이름 있는 실패를 낸다. **남는 결함**: 두 정본이 *동시에* 같은 새 값으로 바뀌면 게이트는 통과하고 뷰어만 옛 값을 본다 — 그 자리는 이 대조가 못 잡는다. **인수처**: doc-kit 소유자 — 두 값을 export 로 올리면 복제가 사라진다 |
| 2026-08-28 | LOW | .claude/plans/insuniverse-docs-70-viewer-m3.plan.md | **검색 색인이 1.2MB 이고 코퍼스와 함께 큰다 (코드 리뷰 라운드 실측).** `search-index.js` 1228128바이트 — 항목 705519 · 절 348855. 두 스크립트가 `</body>` 직전이라 첫 페인트는 안 막지만 적재 시 파싱 비용이 문서 수에 선형이다. **상한을 리터럴로 박지 않는다**(INV4) — `metrics.json` 의 `search_index.bytes` 와 `item_haystack_max_chars`·`section_haystack_max_chars` 가 이미 분포를 낸다. 이 창은 그 값을 게이트로 세우지 않았다: 어느 고정 상한도 형제 PRD 의 문서 추가에 거짓 실패한다. **인수처**: 문서 모집단이 두 배가 되는 시점 — 그때 축은 '크기 상한' 이 아니라 '문서당 색인 바이트의 분포 이동' 이다 |
| 2026-08-28 | LOW | .claude/plans/insuniverse-docs-70-viewer-m3.plan.md | **생성기가 1564행이고 분할이 게이트에 결박돼 있다 (코드 리뷰 라운드 판정).** `docs/viewer/build-docs.mjs` 는 모델 조립 · 렌더 · 지표 세 덩이가 주석으로 이미 갈려 있으나 한 파일이다. **이 창에서 안 쪼갰다**: 게이트 `#3`(어휘 리터럴 스캔)과 `#13`(시계 참조 스캔)이 `read(GEN)` 으로 **단일 파일**을 읽어, 모듈로 나누면 두 검사가 조용히 나머지 파일을 안 보게 된다 — 리팩터가 게이트의 사정거리를 줄이는 자리다(층위 6). 분할은 두 검사를 파일 집합으로 여는 작업과 **같은 창**에서만 안전하다. **인수처**: 생성기에 네 번째 덩이가 붙는 창 |
| 2026-08-27 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m3.plan.md | **배포 승격 판정이 이 창 밖이고 저장소 안에 그것을 확증할 증거가 없다 (m3 실측).** `03-divergence.md` 가 커밋 단위 발산 257건을 발행하지만 그 항목들이 *실제로 배포됐는가* 는 판정하지 못한다. 3저장소 전부 태그 0개이고 `refs/replace/*` 도 비어 있어 릴리스를 확증할 독립 증거가 저장소 안에 없다. `releases.yaml` `prod_merge` 45건은 제목 일치(`release_note_pattern`)와 부모 토폴로지의 기록일 뿐 배포 승격 판정이 아니며 그 머리말이 판정을 `00-protocol` 소관으로 이미 밀었다. CI·PR 메타데이터는 이 저장소의 범위 밖이다. 그래서 이 문서는 배포 여부를 `unknown` 으로 적고 판정 주체의 이름만 남긴다. 인수처: `00-protocol` — 배포 승격 판정 절차를 정의하는 창 **이 창(m4)에서도 닫히지 않는다** — `01-timeline.md` 가 `prod_merge` 45건의 시점과 제목을 발행하지만 연대기 축에도 배포를 확증할 독립 증거가 없다. 3저장소 태그 0 · `refs/replace` 0 은 이 창에서 재유도해 같은 값이었고, `prod_merge` 는 여전히 제목 일치와 부모 토폴로지의 기록이다. 축이 발산에서 연대기로 바뀌어도 뿌리가 같다 **이 창(m5)에서도 닫히지 않는다** — `02-epics.md` 가 에픽 소속 커밋 185/185 와 랜딩 114/114 의 locked prod tip 도달을 재유도하지만 그것은 조상 관계의 관측이지 배포 승격의 판정이 아니다. 3저장소 태그 0 · `refs/replace` 0 을 이 창에서도 재유도해 같은 값이었다. 축이 연대기에서 에픽 경계로 바뀌어도 뿌리가 같다. · id=60m3-deploy-verdict-out-of-scope
| 2026-08-27 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m3.plan.md | **발산 축의 참조 카운트가 구조적으로 부재라 PRD §Risks 완화책이 작동하지 않는다 (m3 실측).** *prod 발산 항목이 실제로는 미배포 코드* 리스크의 완화책이 *참조 카운트 병행 확인 · 둘이 어긋나면 `unknown`* 인데 그 입력이 없다. prod-only 102건 ∩ `commits.<repo>.jsonl` 6,190행 = **0** 이고(모든 하류 인덱스가 동결 stg HEAD 를 기준선으로 잡는데 prod-only 는 정의상 `--not <frozen head>` 다), `comments.server/site/admin.jsonl` 12,688행과 `policy-candidates.code.jsonl` 1,994행 · `.runtime.jsonl` 50행에는 커밋 앵커 필드 자체가 없다. `policy-candidates.git.jsonl` 2,870행의 적중 102건은 전부 `source: prod_only` 인 자기 행이라 외부 참조가 0 이다. **`교집합 0` 과 `축 부재` 를 한 칸에 접지 않는 것이 산출의 일부다** — 앞은 재봤는데 안 맞은 것이고 뒤는 잴 필드가 없는 것이다(findings F-11). 인수처: `id=60m2b-refcount-measurement-point` 가 닫히는 창 — 같은 뿌리(동결 HEAD 기준선)다 · id=60m3-divergence-refcount-structural
| 2026-08-27 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m3.plan.md | **M1 하네스 `check6` (2) 의 `deferred_ref_targets` 기준선이 영구히 어긋난다 (m3 실측 · 이 창의 위임 밖).** 이 창은 `check6` (1) 의 *M1 무산출* 단언을 귀속 검사로 옮겼고 그 결과 (1) 이 통과해 (2) 에 도달한다. (2) 는 `template-config.yaml` 의 `deferred_ref_targets` 를 M1 기준선 blob 과 축자 비교하는데, M2 가 UI13 판정으로 그 원소를 `../99-deprecated/legacy-admin-view.md#LEGACY_ADMIN_VIEW_TOKEN` → `../fixtures/superseded-placeholder.md#LEGACY_ADMIN_VIEW_TOKEN` 로 **정당하게 재지정**했고 M1 기준선은 그 앞이라 두 값이 영구히 다르다. 실측 rc 1 · 사유 *deferred_ref_targets 가 기준선과 다르다*. **이 창이 만든 것이 아니고 이 창의 위임 안도 아니다** — 검사 `#11` (a) 가 개정 후 실패 사유가 (1) 이 아니라 (2) 임을 단언해 수술이 들었음과 잔여의 정체를 같은 출력에서 드러낸다. **2026-08-27 (로컬 code-review) — 이 행을 닫으면 M3 하네스 `#11` (a) 가 붉어진다.** (a) 는 개정 후 `check6` 의 실패 사유가 (2) 임을 **요구**하므로, (2) 의 기준선 어긋남이 해소되면 실 호출이 rc 0 이 되어 `(a) 실 호출이 rc 0 이다` 로 죽는다. 인수 창은 그 자리에서 (a) 의 전제를 함께 갱신해야 하며, 그 결박이 앞 방향 지시로 적혀 있지 않던 것이 이 덧붙임의 사유다. 인수처: M1 의 회귀 기준선을 귀속 기준선으로 바꾸는 창 — `id=60m2b-merge-reddens-golden` 과 같은 부류다 · id=60m3-m1check6-deferred-residual
| 2026-08-27 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m3.plan.md | **M1 하네스 `check1`·`check12` 가 부르는 `verify.sh --check --bootstrap` 이 형제 착수로 영구 거부됐다 (m3 실측 · 이 창의 인과 밖).** `bootstrap_permitted` 가 *"lint 대상을 소유한 문서 PRD 가 전부 DRAFT 인 동안만 유효하다"* 로 만료 조건을 걸어 두었는데 형제 `20-foundation-access`(complete) · `30-contracts-limits`(complete) · `50-domain`(in-progress) 이 착수해 그 모드가 rc 2 즉시 거부로 바뀌었다 — stderr 445바이트 *"이미 착수한 PRD: 20(complete) · 30(complete) · 50(in-progress)"*. **같은 저장소 상태에서 `--bootstrap` 없이 돌리면 `verify.sh --check` 는 rc 0 · `check PASS` 다.** 즉 M1 `check-all` 의 5/10 중 최소 두 자리가 발견이 아니라 만료된 호출이다. 한 줄 수정으로 보이지만 M1 의 verify 계약을 손대는 일이고 M3 의 발행이 만든 자리가 아니라 이 창은 고치지 않는다. 인수처: M1 하네스의 verify 호출 계약을 재판정하는 창 · id=60m3-m1-bootstrap-expired
| 2026-08-27 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m3.plan.md | **M3 Task 0 기준선 앵커도 변경 창 안에 있다 (`id=60m1-anchor`·`id=60m2-anchor`·`id=60m2b-anchor` 와 같은 잔여의 m3 판).** 검사 `#8`·`#10` 이 `git log --diff-filter=A -- <M3 하네스>` 로 특정한 커밋의 blob 을 유도 원본으로 읽는다. 그 커밋은 이 브랜치가 만들었고 이 저장소에는 CI 도 보호 ref 도 없어 이력 재작성으로 앵커를 다시 쓸 수 있다. 없는 앵커를 있는 척 검사하지 않는다(INV4). 인수처: 없음 — 외부 앵커가 생기는 시점까지 구조적으로 해소 불가이며 그것이 판정이다 · id=60m3-anchor
| 2026-08-27 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m3.plan.md | **계획서 §Validation 의 `# 기대:` 문면을 실 출력과 대조하는 게이트가 없다 (로컬 code-review 실측).** 13검사 중 9건의 `# 기대:` 가 하네스 실 출력과 다르고 2건이 실질적이다 — `#7` 은 계획서가 `Risk 문면 1` 인데 실측이 `2` 라 **두 문면 검사 중 하나가 빠져 출력이 `1` 이 되면 계획서 기대와 일치한다**(층위 3 항체가 거짓 통과를 승인하는 방향으로 선다). `#11` 은 구현 단계에서 폐기된 `기준선=HEAD` 방식을 여전히 계약으로 싣고 인용한 실패 문자열은 하네스에 존재한 적이 없다. `#12` 는 `# 검사 #N:` 마커의 **번호 집합**만 대조하므로 문면 전건이 검사 밖이다. **계획서 본문은 고치지 않는다** — 고치면 `plan_hash` 가 움직여 `mccp-plan-codex`·`mccp-implement-codex` receipt 2종이 함께 stale 이 되고 재앵커는 `/mccp:plan` 재실행 없이는 불가하다. 문면 정정 정본은 `.claude/notes/insuniverse-docs-60-history-deprecated-m3.md` §로컬 code-review 반영 이고, 남는 것은 *기대 문면에 검사가 없다* 는 구조다. 기대 행은 날짜·계수를 담아 축자 대조가 불가하므로 답은 **주장 술어 대조**(계수 자리만 유도값과 물리기)이지 문자열 동결이 아니다. 인수처: plan-kit lint 에 기대 문면 규칙을 세우는 창 · id=60m3-plan-expected-drift
| 2026-08-28 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m2c.plan.md | **비발행 방향이 Outcome 의 문자열 토큰 하나로 켜진다 (m2c 실측 · 층위 6 잔여).** `m1.gates.mjs` `m2PublishedViolations` 는 M2 Outcome 이 `발행하지 않는다` 를 담는지로 요구 방향을 뒤집는다. 토큰은 문면 매치라 *뜻이 아니라 글자* 를 본다 — 무관한 문장이 우연히 그 어구를 담으면 방향이 뒤집힌다. **완화 방향의 우회는 닫혀 있다**: 토큰을 지우면 방향이 발행 요구로 돌아가 오히려 붉어지고, 토큰을 더해 방향을 뒤집으려면 `2r` 행이 `complete` 여야 한다(m2c `#3` 이 `2r=pending` 사본 rc 1 로 관측). 남은 것은 *강화 방향의 오탐* 뿐이며 그것은 게이트를 느슨하게 만들지 않는다. 정본 해소는 비발행을 문면이 아니라 **구조 필드**로 옮기는 것이고, 그것은 PRD 마일스톤 표 스키마 개정이라 이 창의 위임 밖이다. 인수처: PRD 표 스키마를 개정하는 창 · id=60m2c-nonpublish-token-surface |
| 2026-08-28 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m2c.plan.md | **M2 인수처였던 발행 차단 이월 2건이 이 창에서도 닫히지 않고 다음으로 넘어간다 (m2c 실측).** `60m1-sha-unresolvable` 과 `60m1-adjudication-unproven` 은 둘 다 *M2 가 첫 실 sha / 첫 폐기 노드를 낼 때* 판정한다는 전제로 M2 를 인수처로 적었다. 그 전제가 깨졌다 — M2 는 확정 0건이라 **발행을 하지 않고** 종료했고, 판정 대상이 0인 채로 남는다. 두 행에 그 사실을 덧붙였고 인수처를 *revert 축에 새 확정이 생기는 창* 으로 옮겼다. **이 창은 그 둘을 닫을 자격이 없다** — 발행 0건인 창은 발행 차단 계약을 판정하지 못하며, 하네스 `#8` 이 닫힘 표식을 거부한다. 인수처: revert 축에 새 확정이 생기는 창 · id=60m2c-blocking-deferrals-carried |
| 2026-08-28 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m2c.plan.md | **M2 행 Outcome 개정이 산출물 서술이 아니라 계약 개정이다 (m2c 실측).** 앞 판 Outcome 은 *"확정분이 SHA·발행 id 로 발행됨"* 을 인수 조건으로 걸었고, 그 조건은 `2r` 이 확정 0건을 증명한 뒤 **도달 불가**가 됐다(확정 0건 → `deprecated[]` 공집합 → `check10` 이 문서를 거부). 이 창은 그 문장을 *비발행 확정* 으로 바꿨다 — 즉 **마일스톤의 완료 정의 자체를 고쳤다**. 게이트를 약하게 하지 않으려고 반대 이빨을 함께 물렸다(비발행 선언 + 발행 실재 = 거부 · 선언 없음 + 발행 없음 = 거부 · `2r` 미종료 = 거부). 그래도 *완료 조건을 사후에 고쳐 초록을 만들었다* 는 부류의 위험은 남고, 그 판정은 사람이 진다. 인수처: 없음 — 사용자 판정 사항(UI3·UI4)이며 기록이 판정이다 · id=60m2c-m2-outcome-contract-amended |
| 2026-08-28 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m2c.plan.md | **형제 하네스 3종이 착수 전부터 붉어 계획서 Task 6 의 *"네 하네스 전건 rc 0"* 전제가 거짓이었다 (m2c 실측 · 이 창의 인과 밖).** 이 창이 한 파일도 안 건드린 시점 실측: 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. 원인은 전부 이 창 밖이다 — `verify.sh --bootstrap` 만료(`60m3-m1-bootstrap-expired`) · `deferred_ref_targets` M2 재지정(`60m3-m1check6-deferred-residual`, **닫으면 m3 `#11`(a) 가 붉어진다**고 그 행에 못 박혀 있다) · golden·findings 를 후행 창이 움직임. 도달하려면 이 계획서 §NOT Building 이 금지한 일(`docs/_meta` 개정 · golden 재동결 · ownership 수정)을 해야 한다. **그래서 `#7` 을 회귀가 아니라 귀속으로 구현했다** — 기준선 실패 집합을 Task 0 커밋 blob 에 동결하고 현재 집합과 양방향 대조해 *이 창이 새 붉음을 만들지 않았는가* 만 판정하며, 이 창이 방향을 뒤집은 4검사(`m1:check10` `m2:check10` `m2b:prd` `m3:prd`)는 rc 0 을 강제한다. 계획서 Acceptance 의 해당 1줄은 사실과 다르다. 인수처: 형제 하네스의 회귀 기준선을 귀속 기준선으로 일괄 전환하는 창 — `60m2b-merge-reddens-golden` 과 같은 부류다 · id=60m2c-sibling-harness-baseline-red |
| 2026-08-28 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m2c.plan.md | **M2c Task 0 기준선 앵커도 변경 창 안에 있다 (`id=60m1-anchor`·`id=60m2-anchor`·`id=60m2b-anchor`·`id=60m3-anchor` 와 같은 잔여의 m2c 판).** 검사 `#7`·`#9`·`#10` 이 `git log --diff-filter=A -- <M2c 하네스>` 로 특정한 커밋의 blob 을 유도 원본으로 읽는다(`CHAIN_BASELINE` · `NEW_DEFERRALS` · golden). 그 커밋은 이 브랜치가 만들었고 이 저장소에는 CI 도 보호 ref 도 없어 이력 재작성으로 앵커를 다시 쓸 수 있다. 없는 앵커를 있는 척 검사하지 않는다(INV4). 인수처: 없음 — 외부 앵커가 생기는 시점까지 구조적으로 해소 불가이며 그것이 판정이다 · id=60m2c-anchor |
| 2026-08-27 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m6.plan.md | **리터럴 밖 이동 대상이 흐름 문서에 서술되지 않는다 (마일스톤 6 실측).** 이 창의 import 그래프 귀속기는 큰따옴표 리터럴 `navigate` 대상만 유도한다. 게이트가 매 실행 유도 불가 56건을 부류별로 낸다 — 조립 경로 35(`"/alimtalk/step-fail/" + code` 형태로 접두까지만 유도됨) · 백틱 템플릿 8 · 변수 대상 13. 접두가 같은 조립 경로는 흐름 문서에 서술돼 있으나 **템플릿·변수 부류 21건은 대상 자체를 모른다.** 근본 해소는 TS 파서 기반 상수 전파이며 이 저장소의 신규 의존 0 원칙과 충돌한다(INV1). 인수처: 관계 축 종료 판정 창 또는 파서 도입을 여는 창 |
| 2026-08-27 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m6.plan.md | **IA `surfaces[].exits` 의 잔여를 이 창이 닫지 않았다 (마일스톤 6 판정).** 흐름 축에서는 배럴 재귀 귀속으로 해소했으나 화면 축의 `exits` 문자열은 여전히 페이지 파일 한 겹 유도다. 고치지 않은 이유 셋을 계획서 §GROUND 관측 5 에 적었다 — 템플릿이 IA(화면이 무엇인가)와 flow(어떤 순서로 지나는가)의 경계를 직접 정하고, 앞 창 하네스의 고지 검사가 예정에 없던 사유로 붉어지며, IA 재저작이 이 마일스톤의 Outcome 이 아니다. 인수처: 관계 축 종료 판정 창(`--probe` 도달 경로가 두 축을 함께 본다) |
| 2026-08-27 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m6.plan.md | **리뷰 라운드 2 가 이 창에 없다 (마일스톤 6 범위 판정).** 지표 §리뷰 수렴 의 종료 조건이 *2라운드 연속 0건* 이고 측정자가 유지보수자다. 이 창은 라운드 1 을 원장으로 돌려 지적 10건을 냈고 전건 흡수했다(수렴 계수 10 · 미검증 166). 라운드 2 는 이 창 밖이며 그 사실을 계획서 Acceptance 에 `(미검증)` 으로 남겼다. 인수처: 유지보수자 |
| 2026-08-27 | LOW | .claude/plans/insuniverse-docs-50-domain-m6.plan.md | **`config.actors` 축에 lint 검사가 없다 (마일스톤 6 실측).** `lint-docs.mjs` 의 `rule(` 선언 전수에 actor 축이 없고 `template-config.yaml` 의 주석이 스스로 *"lint 는 검사하지 않는다"* 라고 적는다. 즉 flow 문서의 `actor` 에 무엇을 써도 통과한다 — 이 창의 게이트 `#5` 가 어휘 밖 건수를 세어 출력하는 것으로 대신했으나 그것은 이 창의 일회용 하네스이고 상시 층이 아니다. 회부 `R-50-3` 의 둘째 항목과 같은 축이며 판정 주체는 그 경로의 소유 PRD 다 |
| 2026-08-27 | LOW | .claude/plans/insuniverse-docs-50-domain-m6.plan.md | **리뷰 원장의 부류 8종이 굵은 문단을 담지 않는다 (마일스톤 6 실측).** 추출기가 읽는 것은 프론트매터 항목·리스트 항목·표 행·코드스팬이고, `**…**` 로 시작하는 산문 문단은 어느 부류에도 들어가지 않는다. 라운드 1 지적 중 하나가 그 문단에 있었고 원장에 대응 행이 없어 별도 프로브가 먼저 잡았다. 즉 이 원장은 문서의 주장 전수가 아니라 **열거 가능한 형태의 주장**만 담는다. 부류를 늘리려면 문단 경계 정의가 먼저 필요하다. 인수처: 흐름 문서를 다시 여는 창 |
| 2026-08-27 | LOW | .claude/plans/insuniverse-docs-50-domain-m6.plan.md | **`verify.sh --check` 가 이 환경의 배경 실행에서 출력 없이 rc=0 을 낸다 (마일스톤 6 실측).** 같은 스크립트의 `--selftest` 는 같은 배경 실행에서 891바이트를 정상 출력하고 `--nosuch` 는 usage 를 내며 rc=2 다. `--check` 만 12분을 돌고 stdout·stderr 둘 다 0바이트로 끝나는 실행이 **2회 연속** 나왔고, 같은 명령의 3회차는 12,090바이트 + 3,050바이트를 정상으로 냈다 — 재현이 아니라 **간헐**이다. `do_check` 는 성공 경로에서 `check PASS` 를 stdout 에, `ok  golden 대조` 를 stderr 에 반드시 찍으므로 출력 소실이다. 이 창의 판정은 rc=0 과 `golden.txt` 바이트 무변동(게이트 `#1`·`#10` 이 버퍼 비교로 따로 문다) 둘로 대신했다. 원인 미상이며 인수처: `verify.sh` 를 여는 창 |
| 2026-08-27 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m6.plan.md | **앞 창 하네스의 범위 검사가 두 겹 뒤까지 연쇄로 붉어진다 (마일스톤 6 실측).** 이 창의 선언 산출물 `docs/_meta/term-requests/50-domain.md` 가 마일스톤 4 하네스의 `docs/_meta` 무변동 요구를 깨고, 마일스톤 5 하네스는 그 4 하네스를 회귀로 돌리므로 **한 파일이 두 창 뒤의 검사를 함께 붉힌다.** 계획서 §GROUND 관측 10 은 앞 창 하네스 한 겹만 세었고 연쇄는 세지 않았다 — 이 창의 게이트 `#12` 가 그 사실을 발견해 회귀 검사를 **귀속 검사**로 바꿨다(m4 가 이름으로 낸 경로 전건이 이 창의 허용 집합 안인지 묻는다). 근본 축은 종료된 창의 허용 집합이 뒤 창의 신설 경로를 모른다는 것이며 `50m5-prev-harness-scope-set-stale` 과 같다. 창이 늘수록 연쇄 깊이가 깊어진다 — 계획 저작 계약에 *앞 창 하네스는 한 겹이 아니라 사슬* 을 넣는 것이 인수처다 |
| 2026-08-28 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m6.plan.md | **import 그래프 귀속기가 명명형 이중따옴표 import 하나만 보고 기본 import 를 통째로 못 본다 (마일스톤 6 로컬 코드리뷰 실측).** `attributeFlow` 의 스캔 정규식이 `import { … } from "…"` 뿐이라, 앵커 페이지 진입 45파일에서 기본 import 227문 · 네임스페이스 1문이 귀속 파일 집합에 들어오지 않고 그 아래 컴포넌트의 `navigate()` 는 후보 집합에도 `문서에 이름이 없는 후보 대상` 목록에도 나타나지 않는다. 따라가지 않은 상대·별칭 스펙은 119종이며 다수가 `App.tsx` 의 `./pages/**` · `./layouts/**` 다. 그러므로 `#4` 의 `미해결 0건` 은 전수에 대한 0 이 아니라 **본 것 중의 0** 이다. 이 창의 조치는 **사각지대 공개까지**다: `#4` 가 유니크 진입 파일 위에서 못 본 문 계수와 미추적 스펙 종수를 매 실행 이름으로 내고 PRD `*Status:` 문면도 그 경계를 적는다. 정규식을 기본·네임스페이스·단일따옴표로 넓히면 귀속 파일 집합이 커져 `실패·이탈` 표의 이탈 전수 판정이 다시 열리고, 그것이 흐름 20건의 문서 개정을 부른다 — 이 창 범위 밖이다. 인수처: 이탈 전수를 다시 여는 창 또는 관계 축 종료 판정(마일스톤 7) · id=50m6-import-scan-named-only |
| 2026-08-28 | LOW | .claude/plans/insuniverse-docs-50-domain-m6.plan.md | **하네스 디스패치의 오류 두 줄만 `console.log` 로 stdout 에 나간다 (마일스톤 6 로컬 코드리뷰 실측).** 나머지 실패 경로는 전부 `die` 를 거쳐 stderr 로 나가고 저장소 루트 접두를 `fold` 로 벗기는데, 서브커맨드 부재와 unknown 서브커맨드 두 자리만 `console.log` 다. `#2` 가 `out + err` 를 합쳐 읽으므로 현재 판정에는 영향이 없고, 고치면 `#2` 의 unknown 거부 경로를 함께 건드린다. 흡수하지 않고 나열만 했다. 인수처: 하네스를 다음 마일스톤으로 옮기며 손보는 창 · id=50m6-dispatch-stdout-inconsistency |
| 2026-08-28 | HIGH | .claude/plans/insuniverse-docs-50-domain-m6.plan.md | **게이트 봉인 후 계획서가 편집돼 receipt 두 장이 커밋 시점부터 stale 이었다 (마일스톤 6 종결 실측).** `mccp-plan-codex`(07:23:31Z) · `mccp-implement-codex`(07:39:09Z) 가 앵커 `sha256:82d7fff5…` 로 봉인됐는데 커밋 `d90a856` 의 계획서 blob 은 `sha256:74b67b7e…` 다. 계획서 이력에 커밋이 하나뿐이라 봉인 바이트는 어디에도 남아 있지 않다 — 구현 창이 봉인 뒤 본문을 더 고치고 재봉인 없이 함께 커밋했다. `stale` 에는 우회 env 가 없어 `/mccp:pr` 이 Phase 1.6 에서 막힌다. **조치**: tracked 덮어쓰기 가드가 지정한 경로(`use a NEW decision slug`)를 따라 슬러그 `insuniverse-docs-50-domain-m6-reseal` 로 두 게이트를 현재 본문에 재봉인했다. plan 게이트는 `/mccp:plan` Phase 5.2z 로 `plan-codex-runner.js` 를 실제로 돌렸고(`intent_gate_verdict=skipped` · `intent_skip_proof=codex_disabled` · `plan_digest=74b67b7e…`), implement 게이트는 Phase 2.5.6 의 write 만 돌렸다 — Phase 3 은 이미 완주했고 다시 걸으면 확정 산출물을 편집한다. 구 슬러그 두 장은 손대지 않았다(역사 기록이며 지금도 stale 로 읽힌다). **잔여**: `/mccp:pr` 의 슬러그는 브랜치에서 유도되므로 `insuniverse-docs-50-domain-m6-reseal` 로 손수 갈아끼워야 한다. 그리고 이 부류를 잡는 검사가 없다 — 어느 창의 하네스도 "계획서 해시 == receipt 앵커" 를 묻지 않아 봉인 후 편집이 조용히 통과한다. 인수처: 계획서↔receipt 앵커 검사를 게이트로 세우는 창 · id=50m6-receipt-anchor-drift |
| 2026-08-28 | MEDIUM | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m6.plan.md | **우산 지표의 표기 carrier 를 이 PRD 가 쓸 수 없어 대체 판정을 내렸다 (M6 관측 2).** 우산 PRD 는 리뷰 단위를 `policy-candidates.*.jsonl` 행으로 정하지만 `docs/_meta/index/**` 는 인덱스 축 PRD(archived) 소유이고 `ownership.md` §개정 위임 표에 이 PRD 앞으로 그 경로 행이 없다. `docs/_meta/findings/40-runtime-vendor-legal.md` 개설도 `golden.txt` 101행 `findings.files` 를 움직이며 재동결 위임은 `docs/_meta/verify/**` 행을 `20-foundation-access` 가 상태 `진행` 으로 쥐고 있어 막혀 있다. 그래서 carrier 를 `.claude/plans/insuniverse-docs-40-runtime-vendor-legal-m6.ledger.jsonl` 로 대체했고 그 행은 policy-candidate 행이 아니라 **문서 주장 행**이다. `50-domain` 마일스톤 4 가 같은 판정을 같은 사유로 내렸다. 인수처: 우산 PRD 소유자 — 지표 문면이 이 대체를 인정하는지의 판정 · id=40m6-carrier-substitution |
| 2026-08-28 | HIGH | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m6.plan.md | **라운드 2 가 이 창에 없다 — 마일스톤 6 은 `in-progress` 로 남는다 (M6 UI2·UI3).** 종료 조건은 *표기가 2라운드 연속 0건* 이고 측정자가 사람이다. 이 창은 원장과 라운드 1 까지만 냈다. 라운드 1 결과는 수렴 계수(사실과다름+빠짐) 8 · 미검증 138 · ok 0 이며 검사 `#8` 이 두 계수를 따로 낸다. 인수처: 유지보수자 — 라운드 2 표기 · id=40m6-round2-pending |
| 2026-08-28 | HIGH | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m6.plan.md | **M1 하네스가 `적용 범위`·`예외·폴백`·`강제 지점` 을 어느 검사로도 읽지 않는다 (M6 라운드 1 실측).** m2~m5 는 각자 `check10` 이 그 세 절의 id 집합을 정책 집합과 양방향 대조하고 빈 칸 0 을 문다. M1 하네스 소스에는 `적용 범위`·`예외·폴백` 문자열이 0건이다. 결과로 `04-runtime-topology.md` 의 강제 지점 35 · 적용 범위 35 · 예외·폴백 53 = 123행이 미결박이고 원장에서 `미검증` 으로 표기됐다. 이 창이 기계로 확인한 것은 id 집합 정합(정책 35 == 강제 지점 35 == 적용 범위 35 · 예외·폴백 53행 전건이 정책 id · 누락 0)까지다. M1~M5 하네스는 종료된 창의 자산이라 이 창이 고치지 않는다. 인수처: M1 문서를 다시 여는 창 또는 이 축을 신설하는 창 · id=40m6-m1-unbound-common-sections |
| 2026-08-28 | MEDIUM | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m6.plan.md | **`07-legal/01-terms-and-agreements.md` 의 `## 동의 기록의 두 문면` 표 5행이 어느 검사로도 결박되지 않는다 (M6 라운드 1 실측).** 같은 문서군의 다른 고유 표는 각각 m5#check4(표면 대조) · m5#check7(마스킹 규칙) · m5#check14(인덱스 사각 — 감사) 가 문다. 이 절만 없다. 원장에서 `미검증` 5건으로 표기됐다. 인수처: 07-legal 축을 다시 여는 창 · id=40m6-consent-table-unbound |
| 2026-08-28 | MEDIUM | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m6.plan.md | **`04-runtime-topology.md` 의 본문 코드 인용 32건은 앵커로 흡수할 수 없다 (M6 관측 5).** 그 문서의 앵커는 두 파일뿐이고 본문이 부르는 스케줄러 소스는 그 집합 밖이다. 앵커를 더하면 m1 `check9` 가 `anchors_qualified` 를 `schedules.yaml` 과 exact 대조하므로 즉시 떨어지고, 인덱스 쪽 개정은 `12-index-runtime` 소유라 이 PRD 에 위임이 없다. 그래서 결박 수단을 앵커가 아니라 검사로 두었다 — 이 창의 `m6#check5` 가 본문 인용 296건을 동결 트리에 직접 해석한다. 인수처: `schedules.yaml` 개정 위임이 열리는 창 · id=40m6-topo-anchor-unreachable |
| 2026-08-28 | LOW | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m6.plan.md | **계획서 검사 `#5` 음성 케이스의 좌표가 한 칸 어긋난다 (M6 구현 중 실측).** 계획서는 첫 미해석 건을 `docs/05-schedules/01-retention.md 109행` 으로 적었으나 실제 좌표는 108행이다(`` `delete-fc.schdule.ts:9` `` 가 있는 줄). 하네스는 계수를 리터럴로 갖지 않고 재열거로 좌표를 내므로 산출은 처음부터 108 이었다. 계획서 본문은 `plan_hash` 로 receipt 에 결박돼 있어 이 창에서 고치지 않는다. 인수처: 없음 — 기록만 · id=40m6-neg-case-line-offset |
| 2026-08-28 | LOW | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m6.plan.md | **원장 `kind` 어휘가 계획서 관측 7 의 8부류가 아니라 9부류다 (M6 구현 중 실측).** Task 8 이 온보딩 대응표를 `onboarding` 부류 행으로 올리도록 지시하고 검사 `#10a` 가 그 부류를 분모로 세므로, 문서 유도 8부류에 `onboarding` 이 더해진다. 검사 `#4c` 는 그 사실을 `kind 어휘 9부류(문서 8 + onboarding)` 로 출력에 드러내고 `#3` 은 문서 8부류만 문서 재열거와 대조한다. 인수처: 없음 — 기록만 · id=40m6-kind-vocab-nine |
| 2026-08-28 | MEDIUM | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m6.plan.md | **프론트매터 앵커 238건 중 2건은 행 번호가 없다 (M6 구현 중 실측).** `04-runtime-topology.md` 의 `declaration:push.scheduler` · `schedule:push.scheduler` 가 `insuniverse-server/apps/api/src/modules/push/push.scheduler.ts` 를 행 없이 가리킨다. 행을 필수로 두면 그 둘이 형태 오류로 떨어지는데 그것은 문서 결함이 아니라 파서의 범위 오류다. 검사 `#6` 은 행을 선택으로 받고 `행 없는 파일 앵커 2건(행 초과 판정 대상 밖)` 을 출력에 계수로 낸다 — 행 초과 검사가 그 둘을 보지 않는다는 사실이 숨지 않게. 인수처: 없음 — 기록만 · id=40m6-anchor-without-line |
| 2026-08-28 | HIGH | .claude/plans/insuniverse-docs-50-domain-m7.plan.md | **`--probe=history` 의 입력 계약이 `policy-doc@1` 뿐이라 관계 축 12종을 받지 못한다 (마일스톤 7 실측).** PRD §Success Metrics 는 연혁 조인 가능성의 측정자로 그 도구를 지목했는데, 12종을 그대로 넘기면 `ia-doc@1` 2종은 위치 인자 이전에 걸러지고 `flow-doc@1` 10종은 전건 `계약 부족  <경로>: template 이 policy-doc@1 이 아니다` 로 rc 1 이다. 지목이 도구 사정거리와 어긋난 것이며 도구를 넓히든 측정자 지목을 정정하든 정본이 정해야 한다. 이 창은 하네스가 조인을 독립 재현해 지표를 실측했고(217행 · matched 200 · orphan 17 · unknown 0) 그것은 우회이지 해소가 아니다. 해소 소유 축: `docs/_meta/verify/**` · `.claude/templates/doc-kit/**`. 회부 `R-50-4` (2)번 항목과 같은 건이다. 인수처: 없음 — 기록만 · id=50m7-probe-history-out-of-range |
| 2026-08-28 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m7.plan.md | **관계 축 동결이 저장소 상시 게이트가 아니다 (마일스톤 7 실측).** `--probe=relation` 동결 838행을 `.claude/plans/insuniverse-docs-50-domain-m7.relation-expected.yaml` 에 만들었으나 `docs/_meta/verify/verify.sh --check` 가 그 파일을 읽지 않는다. 배선을 넣으려면 `docs/_meta/verify/**` 를 고쳐야 하는데 그 경로는 인덱스 축 소유라 이 PRD 의 배타 소유 밖이다. 무는 것은 이 창의 하네스 검사 `#5` 뿐이고 그 계획서가 아카이브되면 관계 계산 가능성의 재검증 경로가 사라진다. 마일스톤 5 가 라우트 인벤토리에서 만난 것과 같은 벽이다(회부 `R-50-2`). 회부 `R-50-4` (1)번 항목과 같은 건이다. 인수처: 없음 — 기록만 · id=50m7-relation-freeze-not-repo-gated |
| 2026-08-28 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m7.plan.md | **온보딩 질문 19건 중 7건이 자기 각론 안에서도 답이 없다 (마일스톤 7 실측).** `Q36`·`Q46`·`Q49`·`Q50`·`Q51`·`Q53`·`Q55` 일곱이며 전건 문서가 스스로 `답하지 못한다`·`확정하지 못했다`·`판정하지 않는다`·`알지 못한다` 로 판정을 유보한 자리다. 타 서비스 각론 의존 축은 19/19 로 성립이므로 두 축을 섞지 않는다. 해소하려면 서브모듈 소스를 새로 정독해야 하고 그것은 이 창의 계획된 작업이 아니며 추측으로 메우는 것은 문서가 스스로 거부한 것이다. 판정 원장은 `.claude/notes/insuniverse-docs-50-domain-m7.md` §온보딩 답변 원장 이다. 인수처: 없음 — 기록만 · id=50m7-onboarding-unmet-seven |
| 2026-08-28 | LOW | .claude/plans/insuniverse-docs-70-viewer-m4.plan.md | **`splitExitItem` 복제의 동시 변경 사각지대 (마일스톤 4 관측 5).** `surfaces[].exits` 의 ` :: ` 구분 정본은 `.claude/templates/doc-kit/lint-docs.mjs` 의 `splitExitItem` 하나인데 export 목록에 없다. 뷰어는 복제하되 게이트 `#3` 이 두 선언 소스를 문자열 대조한다. **남는 구멍**: 두 정본이 *동시에* 같은 새 값으로 바뀌면 대조가 통과하고 뷰어만 옛 동작을 한다 — 게이트 출력이 이 사각지대를 매 실행 문면으로 낸다. **인수처**: `docs/_meta/viewer-requests.md` 계약 #8(`splitExitItem` export) 수용 시점. 수용되면 복제와 대조를 함께 지운다 |
| 2026-08-28 | MEDIUM | .claude/plans/insuniverse-docs-70-viewer-m4.plan.md | **actor 축이 항목 492 중 195 만 덮고 그 판정이 뷰어 밖이다 (마일스톤 4 관측 4).** 못 덮은 297 = 적용 범위 절이 없는 템플릿의 항목 266 + actor 열이 없는 문서의 정책 31. 덮은 175 중 129 는 열이 전건 `—` 다. 뷰어는 구멍을 계수로 드러내는 데서 멈춘다(UI8·UI12) — 실제로 닫으려면 `ia-doc@1` 에 actor 를 부여할지(`00-protocol`)와 actor 열 없는 문서 6건의 부재가 의도인지(문서 소유자)를 정해야 한다. **인수처**: 계약 #6 판정 시점. PRD §Open Questions 에 같은 항이 열려 있다 |
| 2026-08-28 | LOW | .claude/plans/insuniverse-docs-70-viewer-m4.plan.md | **앞 창 하네스가 산출 신선도와 실행 순서에 결박돼 있고 이 창도 그것을 못 풀었다 (마일스톤 4 관측 1).** M2 는 `build/d/` 가 옛 모집단이면 붉고 M3 는 `--freshness` 항목 집합 불일치로 붉다 — 순서는 `anchor-freshness.mjs` → `build-docs.mjs` → M2 → M3 다. 이 창의 `#15` 는 그 순서를 자기 안에 담고 계약 자체는 낡은 `--freshness` 픽스처로 매번 재현하지만, **하네스가 순서를 요구한다는 사실 자체**는 그대로다. **인수처**: 마일스톤 6(빌드 게이트 승격) — 두 생성기 실행을 하나의 게이트로 묶는 창 — ABSORBED-M6 2026-08-31: 순서의 소재지가 계획서 창(`m4.gates.mjs` 검사 `#15`)에서 배타 소유 경로 안의 `docs/viewer/gate.mjs` 로 옮겨졌다. 앞 창 하네스가 여전히 신선한 산출을 요구한다는 사실은 그대로이나, 그 요구를 만족시키는 재생성이 이제 `gate.mjs build` 한 줄이다 — 마일스톤 6 검사 `#13` 이 그 명령으로 재생성한 뒤 앞 창 하네스를 돌려 귀속을 가른다. `m4.gates.mjs` 는 바이트 하나 안 고쳤다 |
| 2026-08-28 | LOW | .claude/plans/insuniverse-docs-70-viewer-m4.plan.md | **역인덱스 지면 파일명이 sha256 접두라 사람이 못 읽는다 (마일스톤 4 구현 판정).** 생성기의 `ident()` 가 `[A-Za-z0-9_-]` 밖을 접어 한글 어휘 9종이 전부 빈 문자열로 충돌하므로 해시를 썼다. 부수 효과로 어휘 문자열이 경로에 들어가지 않아 경로 주입 축이 구조적으로 닫힌다. **인수처**: 어휘 → 안정 slug 규약이 `template-config.yaml` 에 생기는 시점(계약 #6 과 같은 자리일 수 있다). 그 전에는 해시가 결정성·충돌 안전을 함께 만족하는 유일한 선택이다 |
| 2026-08-28 | HIGH | .claude/plans/insuniverse-docs-70-viewer-m4.plan.md | **값 우연 일치가 산문 필드를 엣지 운반체로 승격해 빌드를 중단시킨다 (PR-Codex 라운드 1 · gpt-5.6-sol).** 운반체 채택이 `classified >= 1` 이라 `config.surface_exit_kinds` 의 `없음` 처럼 한국어 레코드의 흔한 부재 값 하나만 겹쳐도 그 필드가 통째로 후보가 되고 나머지 산문 전건이 미분류 fail-closed 를 때려 exit 1 이 된다. 정상 문서 편집 하나가 뷰어 출하를 막을 수 있다. 이 자리는 notes §이탈 1 이 잔여 위험으로 이미 적었고 로컬 리뷰 M2 가 실패 메시지에 승격 사유를 병기하는 것으로 흡수했다 — 조용하지 않다는 것이 그때의 판정 근거였다. Codex 판정은 그보다 강하다: 진단 가능해도 빌드는 멈춘다. 인수처: 운반 필드를 `lint-docs.mjs` 나 템플릿 계약에서 export 해 값 형태 유도를 대체하는 창 · id=70m4-value-shape-carrier-promotion
| 2026-08-28 | MEDIUM | .claude/plans/insuniverse-docs-70-viewer-m4.plan.md | **actor 운반체 전건 일치 규칙이 신규 어휘 하나에 기존 색인을 통째로 지운다 (PR-Codex 라운드 1 · gpt-5.6-sol).** 레코드 필드는 값 전건이 표에서 유도된 actor 어휘에 들어갈 때만 운반체로 인정된다. 따라서 flow 에만 등장하는 신규 actor 하나가 생기면 그 값뿐 아니라 같은 필드의 기존 actor 전부가 역인덱스에서 사라지고 rc 0 으로 출하된다 — 커버리지 지표도 같이 거짓이 된다. 엣지 축은 같은 결함류를 `classified >= 1` + 미분류 이름 있는 실패로 이미 닫았는데 actor 축만 전건 일치로 남았다. 표 헤더에서 `config.services` 밖 열을 전부 actor 로 보므로 config 반영이 늦은 신규 서비스도 actor 로 오분류된다. 인수처: actor·service 운반체 판별을 정본 메타데이터에서 얻고 채택 후 관측 원문 값을 전건 색인하는 창 · id=70m4-actor-carrier-all-or-nothing
| 2026-08-28 | MEDIUM | .claude/plans/insuniverse-docs-70-viewer-m4.plan.md | **어휘가 줄어든 재빌드가 폐기된 역인덱스 지면을 계속 배포한다 (PR-Codex 라운드 1 · gpt-5.6-sol).** 생성기는 `build/x/` 에 현재 지면을 덮어쓸 뿐 기대 밖 파일을 열거하거나 지우지 않는다. actor·서비스 어휘가 삭제·변경되면 옛 sha256 이름의 HTML 이 남고 빌드는 성공한다. 새 개관에서 링크가 사라져도 정적 호스팅과 북마크는 폐기 지면을 계속 낸다. Task 12 의 결정성 검사는 같은 입력 2회 비교라 이 축소 재빌드 축을 구조적으로 못 본다. 인수처: `x/` 하위 트리를 임시 디렉터리에서 만들어 원자 교체하거나 기대 파일 manifest 대조로 잔존을 지우고, 어휘 축소 연속 재빌드 픽스처를 더하는 창 — ABSORBED-M8 2026-08-31: 발행이 스테이징 + 소유 집합 교체가 되어 소유 안인데 스테이징에 없는 엔트리를 되돌리지 않는다 — 어휘가 줄어든 재빌드에서 폐기 지면이 함께 사라진다. 하네스 `insuniverse-docs-70-viewer-m8.gates.mjs` 검사 `#6` 이 문서를 지운 사본으로 재발행해 `d/`·`x/` 기대 계수를 두 실행의 산출에서 유도하고 폐기 0 을 요구한다 (진입 시점 실측 42→42 · 이 창 이후 42→34) · id=70m4-shrinking-rebuild-leaves-stale-pages
| 2026-08-28 | HIGH | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m7.plan.md | **PRD Success Metric *리뷰 불일치 수렴 = 2라운드 연속 0건* 이 M7 종료 시점에도 미충족이다.** 라운드 1 수렴 계수가 8 이고 라운드 2 가 0 이어도 수열은 `8, 0` 이라 연속 0건 2회는 라운드 3 이 있어야 성립한다. M7 은 궤도의 두 번째 점을 실측으로 찍을 뿐 지표를 충족시키지 못하며, 게이트 `#13` 이 그 상태를 `미충족` 으로 출력한다. 인수처: 이 PRD 의 후속 창 — 라운드 3 원장을 세우는 첫 창 · id=40m7-round3-pending |
| 2026-08-28 | HIGH | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m7.plan.md | **`docs/_meta/findings/40-runtime-vendor-legal.md` 개설이 다섯 번째 창에서도 막혔다 (M7 Task 0 프로브 실측).** `golden.txt` 101행 `findings.files` 동결 8건에 이 파일이 없고, `verify.sh` 는 그 값을 `find docs/_meta/findings -maxdepth 1 -type f` 로 유도하므로 파일을 세우는 순간 유도 집합이 9가 돼 `--check` 가 어긋난다. 해소에 필요한 `verify.sh --update` 는 `docs/_meta/verify/**` 위임분이고 이 PRD 는 그 위임을 받지 않았다. 같은 golden 파일 95행 `ownership.inherited_additions` 는 반대로 이 파일을 이미 싣는다 — 한 파일 안에서 두 키가 서로 반대를 말한다. 인수처: `00-protocol` 의 golden 개정 위임을 받는 창 · id=40m7-findings-file-still-blocked |
| 2026-08-28 | HIGH | .claude/plans/insuniverse-docs-40-runtime-vendor-legal-m7.plan.md | **이 원장을 읽는 두 소비기의 파싱 규칙이 정확히 반대라 어느 쪽에서도 전건이 보이지 않는다 (M7 게이트 `#12` 실측).** mccp `derive/sources/backlog.js` 는 표 헤더를 찾아 그 **아래**만 스캔하고, 저장소 `docs/_meta/verify/fixtask-projection.mjs` 의 `parseBacklogRow` 는 행이 날짜로 **시작**할 것을 요구해 헤더 **위**만 읽는다. 이 PRD 행 기준 각각 43·21 이고 교집합은 0 이다. 두 파서의 통일은 한쪽이 저장소 밖(mccp)이고 다른 쪽이 `docs/_meta/verify/**` 소유라 이 PRD 범위 밖이다. 인수처: `00-protocol` — `docs/_meta/verify/**` 개정 위임을 여는 창 · id=40m7-backlog-parser-split |
| 2026-08-28 | MEDIUM | .claude/plans/insuniverse-docs-20-foundation-access-m6.plan.md | **우산 지표의 리뷰 carrier 를 이 PRD 가 쓸 수 없다 (M6 관측 2).** 우산 PRD 는 리뷰 단위를 `docs/_meta/index/policy-candidates.*.jsonl` 행 단위로 정하지만 그 경로는 인덱스 축 PRD 소유이고 그 PRD 들은 archived 이며 `docs/_meta/ownership.md` §개정 위임 표에 이 PRD 앞으로 그 경로 행이 없다. 이 창은 대체 carrier 로 `.claude/plans/insuniverse-docs-20-foundation-access-m6.ledger.jsonl` 을 썼고 그 행은 policy-candidate 행이 아니라 문서 주장 행이다. 우산 지표 문면 개정은 이 PRD 소유가 아니므로 우산 소유자의 판정이 필요하다. |
| 2026-08-28 | MEDIUM | .claude/plans/insuniverse-docs-20-foundation-access-m6.plan.md | **마일스톤 6 종료 조건이 라운드 2 를 기다린다 (M6 §NOT Building).** 종료 조건은 유지보수자 표기가 2라운드 연속 0건이고 측정자가 사람이다. 이 창은 원장과 라운드 1 까지만 냈고 표 6행은 `in-progress` 로 둔다. `complete` 전이는 `/mccp:milestone-close` 소유이며 라운드 2 뒤다. |
| 2026-08-28 | MEDIUM | .claude/plans/insuniverse-docs-20-foundation-access-m6.plan.md | **라운드 1 의 `미검증` 잔여가 127건이다 (M6 검사 `#8`).** 내역은 `fallback` 81 (예외 조건에서 폴백 동작으로 가는 런타임 주장을 동결 트리에서 재유도하는 검사가 없다) · `policy` 36 (`status=active-prod` 의 참거짓을 재유도하는 검사가 없다) · `onboarding` 10 (좌표의 실재만 기계가 보고 그 절이 문항에 답하는가는 사람 몫이다). 수렴 계수(사실과다름+빠짐)는 1 이며 두 계수를 합치지 않는다. |
| 2026-08-28 | LOW | .claude/plans/insuniverse-docs-20-foundation-access-m6.plan.md | **`docs/_meta/verify/**` 개정 위임 슬롯의 해제 시점이 정해지지 않았다 (M6 §NOT Building).** 그 슬롯의 `진행 → 완료` 전이는 마일스톤 6 종결 창의 일이고 라운드 2 뒤다. 형제 두 PRD 가 그 슬롯을 기다린다. |
| 2026-08-28 | LOW | .claude/plans/insuniverse-docs-20-foundation-access-m6.plan.md | **M6 검사 `#12a` 가 표 6행 Status 를 `in-progress` 리터럴로 문다 (M6 구현 중 실측).** 계획서가 그 값을 Acceptance 로 못박아 그대로 구현했으나, `/mccp:milestone-close` 가 6행을 `complete` 로 옮기는 순간 이 검사는 자기 마일스톤의 정상 종료에 붉어진다. 형제 창은 PRD provenance 행과 closure 문서 sha256 으로 종료 전/후 모드를 갈라 같은 함정을 피했다 — 다음 창이 그 모드 분기를 이 하네스에 포팅한다. **해소 (2026-08-31 · `/mccp:milestone-close` 6):** `#12c` 를 신설해 종료 여부를 closure 파일 해시로 판정하고 `#12a` 를 양방향으로 바꿨다. `#0a` 모드 유도에도 `complete` 를 더했다. |
| 2026-08-28 | MEDIUM | .claude/plans/insuniverse-docs-20-foundation-access-m6.plan.md | **계획서 관측 9 가 `*Status:` 축을 재지 않았다 (M6 구현 중 실측).** 관측 9 는 `*Status:` 이동과 마일스톤 표 6행 전이를 한 모드로 뭉쳐 `in-progress` 모드 기대를 12건으로 적었다. 실측은 13건이다 — m1 `check7` 이 `*Status:` 첫 토큰을 마일스톤 표 **1행** Status 에 결박하고, 토큰이 `complete` 를 벗어나는 순간 붉어진다. 착수 시점에 초록이던 것은 토큰이 우연히 `complete` 였기 때문이다. 하네스 `#0a` 는 모드를 둘로 갈라 두 값을 각각 디스크에서 유도하는 것으로 흡수했다. 형제 PRD 의 리뷰 창도 같은 축을 갖는지 확인이 필요하다. |
| 2026-08-31 | MEDIUM | .claude/plans/insuniverse-docs-20-foundation-access-m6.plan.md | **형제 40축의 `#12c` 스탬프가 EOL 변환으로 이미 깨져 있다 (M6 종료 중 실측).** `.claude/milestone-closures/**` 는 `.gitattributes` 밖이고 이 저장소는 `core.autocrlf=true` 라 커밋본 LF 가 체크아웃에서 CRLF 가 된다. `insuniverse-docs-40-runtime-vendor-legal-m6.gates.mjs` `#12c` 는 raw 바이트를 해시하므로 이 워킹트리에서 스탬프 `sha256:103170d8…` 과 실측 `sha256:4d5e4834…` 이 다르다 — 그 하네스는 저작 머신 밖에서 전건 붉다. 이 축은 해시 대상을 EOL 정규화 내용으로 바꿔 닫았고, 40축 적용은 종료된 형제 PRD 의 자산이라 이월한다. 대안으로 `.gitattributes` 에 `.claude/milestone-closures/** text eol=lf` 한 줄도 같은 자리를 닫는다. |
| 2026-08-31 | HIGH | .claude/plans/insuniverse-docs-20-foundation-access-m6.plan.md | **`#7a` 가 gate 값의 형태와 실재만 보고 그 검사가 그 행을 실제로 덮는지는 묻지 않는다 (PR-Codex 라운드 1 · gpt-5.6-sol).** 검사는 `<하네스키>#<검사이름>` 정규식과 그 하네스 서브커맨드 열거의 실재 두 가지만 본다. 그러므로 미검토 행에 무관한 실재 검사명(예 `m6#check1` — `--help` rc 검사)을 적어도 통과하고, `#8` 의 표기 요구는 `gate === null` 인 행에만 걸리므로 그 행은 리뷰 분모에서 조용히 빠진다. 즉 `#8` 이 내는 `미검증 127 · 수렴 계수 1` 은 저작이 성실하다는 전제 위에서만 참이다. 실측으로 현재 원장에서 오귀속은 확인되지 않았다(결박 770건 전건이 형태·실재 통과). 해소는 검사마다 자기가 덮은 행 id 를 내고 원장 집합과 양방향 대조하는 축이며, 13검사 전건의 출력 계약을 바꾸는 새 축이라 이 창에서 열지 않는다. 인수처: 리뷰 원장을 다시 여는 창 · id=20m6-gate-binding-is-not-coverage |
| 2026-08-31 | MEDIUM | .claude/plans/insuniverse-docs-20-foundation-access-m6.plan.md | **원장 meta 레코드의 `counts`·`total`·`frozen`·`plan` 을 어느 검사도 재산출과 대조하지 않는다 (PR-Codex 라운드 1 · gpt-5.6-sol).** `#2` 는 데이터 행의 `MACHINE_FIELDS` 6종만 비교하고 `#4` 는 `docs[].sha256` 9건과 `onboarding_source.sha256` 만 본다. 그래서 meta 첫 줄의 총수·부류별 계수·동결 SHA·계획서 경로가 낡거나 날조돼도 13검사가 전건 초록이다 — 원장을 읽는 하류 감사자가 그 수를 믿는다. 실측으로 현재 meta 는 사실이다(부류 9종 계수 불일치 0 · `total` 946 == 데이터 행 946). 해소는 `#2` 가 커밋된 meta 를 `metaRecord(fresh)` 와 정규화 후 통째로 비교하는 것이며, 검사 문면 개정이라 계획서 §Validation 결박과 receipt 앵커를 함께 건드린다. 인수처: 리뷰 원장을 다시 여는 창 · id=20m6-ledger-meta-record-unverified |
| 2026-08-31 | MEDIUM | .claude/plans/insuniverse-docs-20-foundation-access-m6.plan.md | **`resolveCitation` 이 행 범위의 위쪽 경계만 검사한다 (PR-Codex 라운드 1 · gpt-5.6-sol).** `hi > 동결 파일 행수` 만 거부하고 `lo >= 1` 도 `lo <= hi` 도 묻지 않는다. `CITE_RE` 는 `0` 을 포함한 임의 정수를 받으므로 `foo.ts:0` 과 `foo.ts:999-1` 이 정상 해석으로 통과한다. 그러므로 `#5` 가 내는 `해석 405/405 · 행 초과 0` 은 **그 두 형태를 못 본 채의 405** 다. 실측으로 현재 인용 405건 중 `lo<1` 또는 `lo>hi` 는 0건이다. 해소는 `1 <= lo <= hi <= 행수` 를 요구하고 음성 프로브(행 0 · 역전 범위 · 시작 초과)를 더하는 것이며 검사 문면 개정이다. 같은 축이 `parseAnchor` 의 행 번호에도 있다. 인수처: 코드 인용 축을 다시 여는 창 · id=20m6-citation-range-lower-bound-unchecked |
| 2026-08-28 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m4.plan.md | **릴리스 내용(`p1..p2` 델타)의 균일 유도가 부모 토폴로지 때문에 불가하다 (m4 실측).** 3저장소 `rev-list --first-parent <locked prod tip>` 재유도상 `prod_merge` 45건의 사슬 적중이 넷으로 갈린다 — server `(1,1,0)` 24 · site `(0,0,1)` 7 · admin `(0,0,1)` 10 · admin `(0,0,0)` 4. `p1` 이 사슬 밖인 것이 21건이고 그중 4건은 두 부모가 다 사슬 밖이다. `parents_on_prod_first_parent` 로 방향을 갈라 쓰는 우회가 남지만 그 필드가 빈 4건에는 답이 없고, 빈 값을 한쪽으로 채우는 것은 추론의 사실화(UI3)다. 그래서 `01-timeline.md` 는 릴리스 시점과 제목만 싣는다. 인수처: 없음 — 저장소 밖 증거(CI·PR 메타데이터)가 생기거나 부모 토폴로지가 균일해지는 시점까지 구조적으로 해소 불가이며 그것이 판정이다 · id=60m4-release-content-topology |
| 2026-08-28 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m4.plan.md | **연대기가 이력 708일 중 13일만 덮어 Q28 의 시점 축이 이 문서로 닫히지 않는다 (m4 실측).** 릴리스 노트 커밋 45건은 8일(`2026-06-06` ~ `2026-06-19`, 폭 13일)에만 있고 `commits.<repo>.jsonl` 3파일은 `2024-08-27` ~ `2026-08-05` 폭 708일 · 6,190행이다. 그 6,190행 중 릴리스 창 안이 264행이고 창 밖이 5,926행이다. `01-timeline.md` 는 창 밖에 대해 어떤 주장도 하지 않으며 태그 0 · `refs/replace` 0 이라 다른 축을 대신 세울 수도 없다. 인수처: 형제 문서 `## 연혁` 절(`13-relation-contract` M5 의 `anchors[]` 계약) · 이 PRD 마일스톤 5 `02-epics.md` — 두 자리가 창 밖 구간의 시점 역추적을 나눠 진다 · id=60m4-timeline-coverage-gap |
| 2026-08-28 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m4.plan.md | **`release_like_pattern` 이 manifest 밖 추출기 국소 상수라 near-miss 5건의 분류 근거가 인덱스 계약 밖이다 (m4 실측 · F-10-10 의 소비).** `releases.yaml` 머리가 `release_note_pattern` 은 *manifest `release_rules` 원문* 으로 적고 `release_like_pattern` 은 *manifest 에 없다 — 추출기 국소 상수* 로 적었다. `01-timeline.md` §릴리스 노트를 닮았으나 아닌 5건은 그 상수로 갈린 집합이므로 그 5건의 경계는 인덱스 계약이 보증하지 않는다. 문서가 그 사실을 §기준점에 적고 게이트 `#1` 이 문면을 요구하지만, 상수 자체를 계약으로 올리는 것은 이 창의 위임 밖이다(UI8·UI12 — 인덱스를 재생성하지 않는다). 인수처: `10-index-git` — `extraction-manifest.yaml` `release_rules` 에 이 상수를 올릴지 판정하는 창 · id=60m4-release-like-pattern-local |
| 2026-08-28 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m4.plan.md | **M4 Task 0 기준선 앵커도 변경 창 안에 있다 (`id=60m1-anchor`·`id=60m2-anchor`·`id=60m2b-anchor`·`id=60m3-anchor`·`id=60m2c-anchor` 와 같은 잔여의 m4 판).** 검사 `#8`·`#9`·`#11`·`#12` 가 `git log --diff-filter=A -- <M4 하네스>` 로 특정한 커밋의 blob 을 유도 원본으로 읽는다(PRD 행 Status · findings 표제 · golden · `CHAIN_BASELINE`). 그 커밋은 이 브랜치가 만들었고 이 저장소에는 CI 도 보호 ref 도 없어 이력 재작성으로 앵커를 다시 쓸 수 있다. 없는 앵커를 있는 척 검사하지 않는다(INV4). 인수처: 없음 — 외부 앵커가 생기는 시점까지 구조적으로 해소 불가이며 그것이 판정이다 · id=60m4-anchor |
| 2026-08-28 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m4.plan.md | **후속 창이 공유 원장을 늘리면 앞 창 하네스의 *신설 집합* 검사가 구조적으로 붉어진다 (m4 실측 · 계획서 Task 12 전제의 반증).** 형제 하네스 3종이 *자기 기준선 blob 이후에 늘어난 것* 을 자기 산출로 간주한다 — `m3:findings` 는 신설 표제 집합을 자기 계획서 열거와 정확 대조하고, `m2c:backlog` 는 신설 이월 id 집합을 자기 `NEW_DEFERRALS` 와 정확 대조하며, `m2c:chain` 은 앞의 붉음을 전이로 받는다. 이 창이 F-13·F-14·F-15 와 이월 4건을 정당하게 늘리자 그 3자리가 새로 붉어졌다(m2c 9/10→7/10 · m3 11/11→10/11). 같은 축이 이미 한 번 관측됐다 — m2b 의 `findings`·`golden` 은 m3 의 신설로 붉어진 채 이 창의 기준선에 들어 있다. 계획서 Task 12 는 *신규 붉음 0* 을 기대했으나 그것은 발행 창에서 성립할 수 없다. 구현은 기대를 **귀속 규칙**으로 바꿨다 — 새 붉음의 실패 출력이 이 창이 선언한 토큰(`#9` 의 신설 표제 · `#10` 의 신설 이월 id)을 이름으로 들거나, 이미 설명된 붉음만을 전이로 들 때만 통과한다. 설명되지 않는 붉음은 그대로 실패다. 인수처: 없음 — 형제 하네스를 수술하지 않는다는 §NOT Building 이 유지되는 한 구조적으로 해소 불가이며, 해소하려면 앞 창 하네스의 신설 집합 검사를 *자기 창 커밋 범위* 로 한정하는 별도 창이 필요하다 · id=60m4-successor-reddens-ledger-gates |
| 2026-08-31 | HIGH | .claude/plans/insuniverse-docs-50-domain-m8.plan.md | **`docs/00-index.md` 118행과 `.claude/meta/05-final-spec.md` 375행의 주석 "modules 40개" 가 동결 실측과 어긋난다 (마일스톤 8 창 실측).** 동결 HEAD `4d798f55` 의 `apps/api/src/modules/` 는 **45** 이고 상위 체크아웃(`hotfix/deeplink-prod`)은 44 다 — 세 값이 전부 다르다. 두 문면 다 이 PRD 의 배타 소유 밖이고 `index.tree_sha256` 이 golden 에 걸려 있어 이 창이 고치지 않았다. 이 창의 게이트 `#3` 은 리터럴을 쓰지 않고 동결 트리에서 매 실행 유도하므로 이 어긋남에 영향받지 않는다. 인수처: `docs/00-index.md` 소유 창 또는 `.claude/meta/**` 개정 위임을 받은 창 · id=50m8-modules-40-vs-45 |
| 2026-08-31 | HIGH | .claude/plans/insuniverse-docs-50-domain-m8.plan.md | **`allow-ip` 관리자 입구에 판정 층이 결선돼 있지 않다 (마일스톤 8 리뷰 라운드 1 F1 실측).** `insuniverse-server/apps/api/src/modules/allow-ip/allow-ip-admin.controller.ts:15` 의 인증 층 결선 줄이 주석 처리돼 있고 그 파일에 다른 결선이 없다 — 경로 이름은 `admin/ip` 인데 목록·등록·수정이 로그인 없이 닿는다. 같은 저장소의 무인증 노출로 이미 올라 있는 `GET /admin/menu/all` 행과 같은 부류다. 코드 수정은 우산 PRD Out of scope 라 이 창은 관측만 문서화했다(`docs/10-server/05-agency-corp.md#ALLOW_IP_MASTER`). 인수처: 사용자 판정 · id=50m8-allow-ip-unauthenticated |
| 2026-08-31 | HIGH | .claude/plans/insuniverse-docs-50-domain-m8.plan.md | **원본 진료자료 내려받기 입구에 판정 층이 결선돼 있지 않다 (마일스톤 8 리뷰 라운드 1 F3 실측).** `insuniverse-server/apps/api/src/modules/medical/medical.controller.ts:8` 의 처리기 선언 위에 결선 층이 하나도 없고, `GET medical/:oddId/download` 가 건 식별자만으로 열린다. 반환물이 수집 원문이라 노출 등급이 분석 결과보다 높다. 코드 수정은 우산 PRD Out of scope 라 이 창은 관측만 문서화했다(`docs/10-server/02-treat.md#MEDICAL_RAW_EXPORT`). 인수처: 사용자 판정 · id=50m8-medical-download-unauthenticated |
| 2026-08-31 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m8.plan.md | **server 온보딩 Q20 미성립 — 요청 진입부터 수집 개시까지의 모듈 관여 순서를 잇는 서술이 없다 (마일스톤 8 실측).** 완료 이후 팬아웃은 `docs/10-server/02-treat.md#ANALYSIS_COMPLETION_FANOUT` 이 네 단계로 답하고 수집 분산은 같은 문서 `TREAT_COLLECT_DISPATCH` 가 답하나, 주문상세 생성에서 수집 개시까지의 모듈 순서가 8편 어디에도 없다. 해소에 서버 호출 사슬 재정독이 필요해 이 창의 범위를 넘는다. 인수처: server 축 후속 창 · id=50m8-q20-entry-order — ADJUDICATED 2026-08-31: 인수 — 마일스톤 9 가 재확인했고 판정이 바뀌지 않았다. 요청 진입부터 수집 개시까지의 모듈 관여 순서를 잇는 서술이 `docs/10-server/` 8종에 여전히 없다. 미성립으로 원장에 서고 이 행이 그 이월처로 남는다 |
| 2026-08-31 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m8.plan.md | **server 온보딩 Q21 미성립 — 총론 한도 규칙의 이 도메인 적용 자리를 추적하지 않았다 (마일스톤 8 실측).** 구독·주문·정산의 연결은 `docs/10-server/03-subscription-order.md` 와 `04-settlement-money.md` 가 답하나, 한도 규칙이 이 도메인 자료에서 실제로 어디서 소비되는지를 잇는 서술이 없다. 한도 정의는 `30-contracts-limits` 소유라 이 창이 그 축을 다시 쓰지 않았다. 인수처: server 축 후속 창 · id=50m8-q21-limit-application — ADJUDICATED 2026-08-31: 인수 — 마일스톤 9 가 재확인했고 판정은 유지되나 **사유가 바뀌었다**. 상류 병합으로 한도 총론 3종이 섰으므로 더는 *총론이 0건* 이 아니고, 각론 20종이 그 19개 정책 id 를 한 건도 참조하지 않는 것이 지금의 사유다. 새 사유는 `id=50m9-limits-policies-unreferenced` 로 나갔다 |
| 2026-08-31 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m8.plan.md | **id 없는 총론 복제의 기계 탐지기가 없다 (마일스톤 8 계획 창 판정, 구현에서 유지).** 게이트 `#8` 은 총론 `policies[].id` **문자열의 등장 형태**만 보므로 오류코드 표나 역할 정의를 id 없이 내용만 옮긴 복제를 못 본다. 구조적 서명도 금지 문자열 목록도 이 저장소에서 세 번 수렴하지 않은 축이라 들이지 않았다 — `#8` 이 자기 사각지대를 매 실행 출력에 찍고 `#11` 의 문서 단위 복제 판정 행(본문 digest 결박)이 그 자리를 진다. 인수처: 탐지기 축을 여는 창 · id=50m8-idless-duplication-detector |
| 2026-08-31 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m8.plan.md | **45개 모듈을 8개 문서로 묶은 경계의 타당성이 기계 미검증으로 남는다 (마일스톤 8 실측).** 게이트 `#3` 은 전수·배타에 더해 대상 좌표 실재와 앵커 모듈 경로 포괄까지 물지만, 그 배정이 **도메인상 옳은가**는 기계 밖이다. 근거는 `.claude/notes/insuniverse-docs-50-domain-m8.md` §모듈 배정 원장 의 `근거` 열에 모듈마다 남겼고 계획서 Acceptance 가 `(미검증)` 으로 싣는다. 유지보수자 리뷰 라운드 2 의 입력이다. 인수처: 마일스톤 9 종료 창 · id=50m8-module-boundary-unverified — ADJUDICATED 2026-08-31: 인수 — 마일스톤 9(종료 창)가 받았고 **기계로는 닫히지 않는다**. 마일스톤 8 게이트 `#3` 이 진 전수·배타·좌표 실재·앵커 포괄은 이 창에서도 초록이나(게이트 `#17` 이 그 창 등록부를 다시 돌린다) 배정이 도메인상 옳은가는 기계 밖이며 이 저장소에 그 판정을 낼 사람이 없다. 축 종료의 사람 몫 판정과 같은 자리이므로 원장 `kind:"maintainer-verdict"` 가 서는 시점에 함께 닫힌다 — M13-RESOLVED 2026-09-08: 기계로 닫히는 부분과 안 닫히는 부분을 **가르는 것**으로 판정했다. 게이트 `#9` 가 동결 `insuniverse-server` 핀 `4d798f55` 의 `apps/api/src/modules/` 열거와 m8 배정 원장(`.claude/notes/insuniverse-docs-50-domain-m8.md` §모듈 배정 원장)을 차집합 0 양방향으로 문다 — 전수·배타는 매 실행 기계가 진다. **도메인 타당성은 기계 밖으로 확정한다** — 이 저장소에 그 판정을 낼 사람이 없다는 것이 M9 의 인수 판정이었고 M13 도 뒤집지 않는다. 그 사실을 `check9.domain-validity-unverified` 가 매 실행 출력에 이름으로 내고 계획서 Acceptance 가 `(미검증)` 으로 싣는다 |
| 2026-08-31 | LOW | .claude/plans/insuniverse-docs-50-domain-m8.plan.md | **`verify.sh --check` 무출력 관측이 이 창에서 반증됐다 (마일스톤 8 실측).** 마일스톤 6 이 올린 *"배경 실행에서 출력 없이 rc=0"* 과 이 창 계획 시점의 *"전경 10분 출력 0행 · SIGTERM"* 은 이 창 구현에서 재현되지 않았다 — 배경 실행이 stdout 136행을 내고 마지막 줄이 `check PASS`, rc 0 이었다. 앞선 관측은 도구 결함이 아니라 fork 고갈 등 실행 환경 쪽 실패로 보인다. 게이트 `#1` 은 그럼에도 `timeout` 으로 감싸고 **모든 비정상 종료코드**를 부분 stdout 행수와 함께 이름 있는 실패로 가른다 — 침묵 + rc 0 을 통과로 치지 않는다. 인수처: 관측 기록만 · id=50m8-verify-silence-refuted |
| 2026-08-31 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m9.plan.md | **`#1` 의 병합 증명이 이동하는 `origin/main` ref 를 앵커와 비교하고 있었다 (마일스톤 9 Implement-Codex R1 F1b · 구현에서 실측으로 두 번 깨졌다).** 초판 조건은 *상류 팁이 `window_base_sha` 의 조상* 이었고, 그 술어는 (1) 상류가 전진하는 즉시 거짓이 되며 (2) 이 브랜치가 상류에 병합된 뒤에는 방향까지 뒤집힌다. 둘 다 이 창의 결함이 아닌데 게이트가 붉는 형태다 — 실제로 구현 중 `origin/main` 이 `d52c5bb` 에서 `2a074602` 로 움직이자 `#1` 이 `병합 미수행` 으로 죽었다. **기전을 교체했다**: 이제 `#1` 은 앵커 자신의 성질 셋만 문다 — (a) 앵커가 병합 커밋이다 (b) 그 둘째 부모가 현재 `origin/main` 의 조상이다 (c) 원장 기록값이 그 둘째 부모와 정확히 같다. 셋 다 앵커에 붙박이라 상류가 전진해도 값이 변하지 않는다. **잔여**: 이 창이 고친 것은 자기 하네스뿐이고, 종료된 마일스톤 하네스들(m4·m5 가 이미 이월한 축)은 여전히 기준선 재지정 규약이 없다. 인수처: 종료된 마일스톤 하네스의 기준선 재지정 규약을 정하는 창 · id=50m9-anchor-ancestry-inverts-after-merge |
| 2026-08-31 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m9.plan.md | **`check-all` 이 `verify.sh --check` 를 두 번 돌려 완주 하한이 약 800초가 된다 (마일스톤 9 Implement-Codex R1 F3).** 검사 `#1` 이 한 번 부르고, 앞 창 회귀 검사 `#17` 이 도는 마일스톤 8 등록부의 `check1` 이 같은 스크립트를 또 부른다. 검사별 `timeout` 은 개별 호출만 묶고 완주 총시간을 묶지 않는다. 해소는 앞 창 하네스에 건너뛰기 축을 더하거나 결과를 트리 해시로 캐시하는 것인데 둘 다 **종료된 창의 파일을 편집**하는 일이라 이 창의 소유 범위 밖이다. 이 창은 `#17` 이 앞 창 검사별 경과 ms 를 출력해 비용을 보이게 하는 데서 멈춘다. 인수처: 하네스 실행 비용 규약을 정하는 창 · id=50m9-verify-run-twice-in-check-all |
| 2026-08-31 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m9.plan.md | **`docs/20-site/00-ia.md` 의 리뷰 회차가 1 이라 지표 §리뷰 불일치 수렴 의 *2라운드 연속 0* 이 이 문서에서만 정의상 성립하지 않는다 (마일스톤 9 실측).** 그 문서를 낸 마일스톤 5 는 하네스에 리뷰 축이 없었고 계획서가 리뷰를 다음 창으로 미뤘으며, 마일스톤 6 은 흐름 5종만 원장에 담았다. 이 창이 첫 회를 돌려 캐리어 431항(anchor 175 · exit 121 · limit 135)을 판정했고 흡수 대상 지적은 0건이나, 회차가 1 이므로 다음 회차 없이는 연속 2 가 될 수 없다. 나머지 19종은 라운드 1 이 이미 섰으므로 이 결손은 이 한 문서에만 있다. 인수처: 이 문서의 다음 리뷰 회차를 여는 창 · id=50m9-site-ia-round1-only — ADJUDICATED 2026-09-03: 인수 — 마일스톤 10 이 그 회차를 돌렸다. 동결 `insuniverse-site` `767d1e44` 의 `front/src/App.tsx` 에서 `원천 → 주장` 방향으로 화면 라우트를 재구성해 반입한 회차 1 원장과 양방향으로 대조했고 `round2_established=true` 로 회차 2 가 섰다(`#4`). 회차 1 이 구조적으로 못 보던 자리를 봤고 그 지적은 `id=50m10-round2-ia-doc-missed-screen-routes` 로 나갔다. *2라운드* 판정 자체는 여전히 유지보수자 몫이며 이 창은 그 입력만 바꿨다 |
| 2026-08-31 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m9.plan.md | **site 온보딩 `Q29`·`Q36` 미성립 (마일스톤 9 실측).** `Q29`(진료분석 슬롯 포화 시의 화면·대기열·해제 통지)는 site 각론에 *슬롯* 축 자체가 없다 — `analysis-request` 의 실패·이탈 표가 세는 것은 구독 판정 거짓과 기관 API 사용중지 둘이고, 접수와 결과 사이의 서버 상태는 그 흐름이 판정하지 않는다고 본문이 명시한다. `Q36`(인증 완료 시 site·server 동시 진행과 이탈 시 서버 잔여 상태)은 `alimtalk-certify-steps` 의 `unknown_reason` 이 서버 쪽 잔여를 미상으로 두며, 그 답은 server 각론에 있어 지표 판정 규칙(타 서비스 각론 참조 시 FAIL)에 걸린다. 인수처: site 흐름 문서를 다시 여는 창 또는 서버 상태 축을 site 문서가 인용하는 규약을 정하는 창 · id=50m9-site-onboarding-unmet |
| 2026-08-31 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m9.plan.md | **admin 온보딩 7건 미성립 — `Q46`·`Q49`·`Q50`·`Q51`·`Q53`·`Q54`·`Q55` (마일스톤 9 실측).** 일곱 모두 admin 각론이 그 자리에서 *답하지 못했다* 를 명시로 적은 자리이며 얕은 답으로 메우지 않았다: `Q46` 재시도 상한·벤더 재조회 비용·재통지 셋(`treat-monitor-reprocess`), `Q49` 개발자 개입의 연락 경로(`admin-console-payment-reconcile` — 환불 컨트롤러 전체 주석), `Q50` 부분 실패 표시 지점과 실패분 재시도 수단(`admin-console-bulk-operation`), `Q51` 변경 이력의 소재(`admin-console-settlement-adjust` — 감사 어휘 3종 0건), `Q53` 정지의 연쇄와 원상 복구 범위(`admin-console-member-lifecycle`), `Q54` 머니 2경로 밖의 충돌 통지(`admin-console-concurrent-write`), `Q55` 수정의 사용자 노출값·정산·통계 반영 시점(`admin-console-data-correction`). 마일스톤 3 이 `id=50m3-onboarding-verdict-deferred` 로 미룬 판정이 이 창에서 났고 결과가 이 일곱이다. 인수처: 각 축의 계약을 여는 창들(동시성 `id=50m3-concurrency-lock-absent` · 감사 로그 `id=50m3-audit-log-absent` · 실패 회복 `id=50m3-reprocess-endpoint-absent`)과 admin 각론을 다시 여는 창 · id=50m9-admin-onboarding-unmet |
| 2026-08-31 | HIGH | .claude/plans/insuniverse-docs-50-domain-m9.plan.md | **신설된 한도 총론 3종의 정책 19건을 이 PRD 의 각론 20종이 한 건도 참조하지 않는다 (마일스톤 9 실측).** 상류 병합으로 `docs/04-limits/` 에 `01-amounts-and-quotas.md`·`02-ttl-and-timeouts.md`·`03-rate-limits-and-batch.md` 가 들어왔고 그 세 문서의 `policies[].id` 는 19건이다. 각론 20종에서 그 19건의 등장은 0 이다(게이트 `#10` 의 등장 id 열거로 확인). 그래서 온보딩 `Q21`(총론 한도 규칙의 도메인 적용)이 여전히 미성립이며, **미성립의 사유가 바뀌었다** — 계획 시점의 사유는 *한도 총론이 0건* 이었고 지금의 사유는 *총론은 섰는데 각론이 그것을 참조하지 않는다* 다. 참조를 다는 것은 각론 저작이라 이 창의 범위 밖이다. 인수처: server·site·admin 각론에 한도 참조를 다는 창 · id=50m9-limits-policies-unreferenced |
| 2026-08-31 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m9.plan.md | **지표 §연혁 조인 가능성 이 산출 20종 중 8종에서만 자동으로 성립한다 (마일스톤 9 실측).** `--probe=history` 의 입력 계약이 `policy-doc@1` 이라 `docs/10-server/` 8종만 받고 관계 축 12종(`flow-doc@1` 10 · `ia-doc@1` 2)은 위치 인자 이전에 걸러진다. 이 창은 마일스톤 8 동결 398행을 재현해 8종 전건 `rows > 0` · `unknown 0` · `ambiguous 0` · matched 111 · orphan 4 를 확인했고, 12종에 대해서는 **사정거리 밖이라는 사실만** 게이트 `#9` 의 필수 출력행으로 낸다. 도구 개정도 측정자 지목 정정도 `.claude/templates/doc-kit/**` 소유 축이며 회부 `R-50-4` (2)번이 그 자리다 — `id=50m7-probe-history-out-of-range` 와 같은 뿌리이고 이 행은 축 종료 시점의 재측정 기록이다. 인수처: `.claude/templates/doc-kit/**` 개정 위임을 받은 창 · id=50m9-history-join-covers-eight-of-twenty |
| 2026-08-31 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m9.plan.md | **지표 §리뷰 불일치 수렴 의 사람 측정이 이 창에서 서지 않는다 (마일스톤 9 실측).** 이 창이 낸 것은 **기계 회귀**다 — 라운드 1 의 `ok` 를 떠받친 기계 축이 현재 핀과 현재 바이트에서 여전히 무는가이며, 재유도 1750행 전건이 뒤집히지 않았고 흡수 후 수렴 계수는 0 이다. *2라운드 연속 0* 은 그것과 다른 주장이고 PRD 가 측정자를 유지보수자로 지목했다. 이 창은 그 판정을 받을 자리(원장 `kind:"maintainer-verdict"` 행 — 축·`verdict`·관측 시점·근거 좌표·원장 밖 `provenance`·앵커/원장/입력 digest 결박)와 그것을 무는 조건부 게이트 `#16` 만 만들었다. 저자가 그 레코드를 쓰면 측정자를 겸하는 것이라 쓰지 않았다. 인수처: 유지보수자 · id=50m9-review-convergence-human-pending |
| 2026-08-31 | HIGH | .claude/plans/insuniverse-docs-50-domain-m9.plan.md | **`verify.sh --check` 가 저장소 전체에서 붉다 — 상류가 40축 PRD 를 archived 로 옮기면서 들어온 선재 회귀다 (마일스톤 9 실측).** 그 스크립트의 온보딩 게이트가 `.claude/prds` 를 **비재귀로** 읽어 `insuniverse-docs-[2-6]0-*.prd.md` 가 정확히 5종일 것을 요구하는데, 상류 커밋 `5ab63da` 가 40축 PRD 를 `.claude/prds/archived/` 로 옮겨 4종이 됐고 `문서 PRD 를 5종 추출하지 못했다` 로 중단한다. **이 창의 편집과 무관하다** — 활성 문서 PRD 수는 앵커 `bb1da584` 와 `origin/main` 둘 다에서 4 이고 병합 전 팁(`928be8e`)에서는 5 였으며, 이 창은 `.claude/prds/` 의 파일명을 하나도 건드리지 않았다. 같은 스크립트의 `prd_path()` 는 archived 를 이미 감안하는데 이 한 자리만 그 패턴을 따르지 않은 것이 결함의 형태다. `docs/_meta/verify/**` 는 인덱스 축 배타 소유라 이 창이 고치지 않고, 게이트 `#1` 이 그 실패를 **앵커에서 같은 술어를 재유도해** 상속으로만 인정한다(선언이 낡으면 붉는다). 인수처: `docs/_meta/verify/**` 개정 위임을 받은 창 · id=50m9-verify-doc-prd-count-broken-by-archive |
| 2026-08-28 | HIGH | .claude/plans/insuniverse-docs-70-viewer-m6.plan.md | **2단 빌드가 최종 자리에 바로 발행해 실패 시 롤백 경계가 없다 (Plan-Codex 라운드 1 · gpt-5.6-sol).** 앞단이 `anchor-freshness.json` 을 최종 산출 디렉터리에 먼저 쓰고 뒷단 `build-docs.mjs` 가 HTML 과 색인을 점진적으로 덮으므로, 뒷단이 중간에 죽으면 새 앵커 데이터 옆에 옛 지면이 남고 독자는 내부적으로 어긋난 뷰어를 계속 읽는다. 게이트는 non-zero 만 보고할 뿐 이전 완전 산출을 보존하지 않는다. **마일스톤 6 이 절반을 닫았다** — Task 4 의 프로브 선행이 형식 위반을 산출 이전으로 옮겨 그 경로에서는 한 바이트도 쓰이지 않는다. 남는 절반은 비-형식 실패에서의 부분 발행이며, 스테이징 디렉터리 + 사후 교체가 필요하고 Windows 에서 기존 디렉터리 위 교체는 원자가 아니라 2단 스왑이라 그 스왑 자신의 실패 창을 갖는다. `70m4-shrinking-rebuild-leaves-stale-pages` 와 **같은 구조 축**이고 두 행은 같은 창에서 함께 닫아야 한다. 인수처: 산출 발행을 스테이징 + 교체로 바꾸는 창 · id=70m6-two-stage-publish-no-rollback
| 2026-08-28 | HIGH | .claude/plans/insuniverse-docs-70-viewer-m6.plan.md | **두 단계가 가변 문서 트리를 다시 읽어 낡은 앵커 상태를 출하한다 (Plan-Codex 라운드 8 · gpt-5.6-sol).** `gate.mjs build` 는 앵커 생성기(약 5.4초)와 문서 생성기를 잇달아 돌리고 둘 다 문서 트리를 각자 다시 읽는다. 그 사이에 문서가 저장되면 두 단계가 서로 다른 입력을 본다. 현행 `--freshness` 대조는 `{doc, axis, item}` **집합**만 보므로 같은 항목의 `anchors` 값만 바뀐 경우 집합은 그대로 일치하고, 새 문서 내용에 이전 앵커 상태가 결합된 산출이 rc 0 으로 나간다 — 조용한 정합성 실패다. 크기는 작다(1단계 전 문서 트리 digest 를 재고 2단계 직전 다시 재어 갈리면 이름 있는 실패). **이 라운드에서 못 들인 이유**: plan-codex 게이트가 리뷰와 봉인 사이의 계획서 본문 변경을 `incomplete` 로 막아, 흡수는 매번 재진입 라운드를 요구하고 라운드 1~7 이 이미 그 경로를 돌았다. `70m6-two-stage-publish-no-rollback` 과 같은 **체인 정합** 축이며 두 행은 함께 닫는 것이 맞다. 인수처: 산출 발행 축을 여는 창 · id=70m6-mutable-docs-between-stages
| 2026-08-31 | HIGH | .claude/plans/insuniverse-docs-70-viewer-m6.plan.md | **동시 빌드는 앵커 중간산출뿐 아니라 산출 디렉터리 전체를 공유한다 (Implement-Codex 라운드 1 · gpt-5.6-sol).** 마일스톤 6 이 실행별 freshness 이름으로 닫은 것은 앵커 중간산출 한 파일뿐이고, `build-docs.mjs` 는 여전히 같은 `--out` 아래에 문서 지면·색인·검색 데이터·metrics 를 순차로 쓴다. 서로 다른 저장소 팁이나 문서 스냅숏을 가진 두 게이트가 겹치면 그 파일들이 교차로 섞이고, 그 뒤 서로 다른 정본 freshness JSON 을 승격하려 다툰다 — 지면과 앵커 데이터가 어긋난 뷰어가 rc 0 으로 남는다. 잠금을 두지 않는다는 마일스톤 6 의 결정(Task 4)이 이 경로를 연 채로 둔다. **새 축이 아니라 `70m6-two-stage-publish-no-rollback` 의 확장이다** — 그 행은 실패 시 부분 발행을 적었고 이 행은 성공한 동시 발행도 같은 자리에서 깨진다는 관측을 더한다. 두 행은 함께 닫는다. **id 는 공유하지 않는다** — 같은 축이라도 id 로 키잉하는 소비기는 두 행 중 하나를 잃는다. 인수처: 산출 발행을 실행별 스테이징 디렉터리 + 직렬화된 교체로 바꾸는 창 · id=70m6-concurrent-publish-crosses-outputs
| 2026-08-31 | MEDIUM | .claude/plans/insuniverse-docs-70-viewer-m6.plan.md | **문서화된 자식 CLI 직접 호출이 단일 진입 주장을 우회한다 (PR-Codex 라운드 1 · gpt-5.6-sol).** `docs/viewer/build-docs.mjs` 머리 주석 75~82 행은 여전히 `node docs/viewer/build-docs.mjs` 를 사용법으로 싣고, 그 경로는 기본 산출 디렉터리에 쓰며 `--freshness` 를 생략하면 전 항목을 *미측정* 으로 표기한 지면을 정본 자리에 덮는다. 마일스톤 6 이 세운 프로브 선행·순서 계약·앵커 신선도 대조가 전건 건너뛰어지고 낡은 `anchor-freshness.json` 이 그 옆에 남는다. 게이트는 자기 진입점 안에서만 계약을 지므로 PRD 가 말하는 *단일 진입* 은 문서 관행일 뿐 기계로 강제되지 않는다. 이 창의 범위는 배타 소유 경로 안의 게이트 신설이었고 생성기 CLI 계약 개조는 §NOT Building 의 *생성기 파일 분할* 과 같은 축이라 같은 창에서 열어야 한다. 인수처: 생성기 CLI 계약을 게이트 소유로 좁히는 창 · id=70m6-child-cli-bypasses-single-entry |
| 2026-09-08 | HIGH | .claude/plans/drug-diag-api-m5.plan.md | L2 architect: Task 3 의 Validate 가 Task 4 의 산출물을 요구한다 — 계획서가 스스로 세운 순서 불변식(«어떤 Task 의 Validate 도 뒤 Task 가 만드는 것을 요구하지 않는다»)이 깨지고, 정직한 구현에서 Task 3 종료 시 check8 이 하드 실패한다. · 원문 .claude/reviews/plan-review-drug-diag-api-m5.md · id=05481ef7 |
| 2026-09-08 | HIGH | .claude/plans/drug-diag-api-m5.plan.md | L2 architect: `#2`(e) «게이트 인용 폐쇄» 가 담는다고 주장하는 불변식을 실제로 담지 못한다 — 살아 있는 절 목록에 `## Design Decisions` 와 `## GROUND` 가 없고, 바로 그 두 절에 이관된 게이트 `#4` 를 이 창의 검사인 양 인용하는 자리가 둘 남아 있다. (e)가 신설된 이유인 «옮겼는데 가리키던 문장을… · 원문 .claude/reviews/plan-review-drug-diag-api-m5.md · id=76aeb9cd |
| 2026-09-08 | FAIL | .claude/plans/drug-diag-api-m5.plan.md | L2 architect: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-drug-diag-api-m5.md · id=02371f13 |
| 2026-09-08 | HIGH | .claude/plans/drug-diag-api-m5.plan.md | L2 security: 유출 게이트 #13 의 네 축 어디도 커밋 «메시지» 를 보지 않는다 — 이 창이 만드는 site 커밋 1건과 superproject 커밋의 메시지에 실환자 oddId 가 들어가면 전 게이트가 초록이고, 그 커밋은 push 되어 영구 노출이 된다. 이 저장소는 정확히 그 부류의 사고(e56051a — 규칙을 적은 문서가 값을 평문으… · 원문 .claude/reviews/plan-review-drug-diag-api-m5.md · id=d9455b51 |
| 2026-09-08 | FAIL | .claude/plans/drug-diag-api-m5.plan.md | L2 security: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-drug-diag-api-m5.md · id=c6039a3b |
| 2026-09-08 | HIGH | .claude/plans/drug-diag-api-m5.plan.md | L2 test: 정본 게이트 #10 의 허용 집합 두 번째 출처가 이 창이 채택하지 않는 블록에서 유도된다 — `--sub`·`--expanded`·`.ans003-accordion-icon` 은 전부 M5b 로 이관돼 이 창의 NOT Building 이다. 철회/이관된 기전 위에 살아 있는 게이트이며, 그 결과 허용 집합이 이 창이 쓸 이유가 없는 값들… · 원문 .claude/reviews/plan-review-drug-diag-api-m5.md · id=0becc6c0 |
| 2026-09-08 | FAIL | .claude/plans/drug-diag-api-m5.plan.md | L2 test: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-drug-diag-api-m5.md · id=c92a1726 |
| 2026-09-08 | HIGH | .claude/plans/drug-diag-api-m5.plan.md | L2 invariant: 롤백 주장의 앵커가 성립하지 않는다 — 계획서는 «되돌림은 커밋 단위, #12 의 상등이 그것을 한 커밋에 가둔다» 고 적지만, #12 는 `ad536a6b..HEAD` **구간**의 변경 파일 집합만 상등 비교하므로 커밋 수에 대해 아무 말도 하지 않는다. site 편집이 3~5 커밋으로 흩어져도 #12 는 초록이고, 그 상태에… · 원문 .claude/reviews/plan-review-drug-diag-api-m5.md · id=b8c05305 |
| 2026-09-08 | HIGH | .claude/plans/drug-diag-api-m5.plan.md | L2 invariant: css 동결본의 «정규화» 함수가 동결본 자신이 선언하는 값이라, 외부 기준 재유도가 자기참조로 퇴화한다. 정규화를 퇴화시키면(예: 선언 본문을 버리고 선택자만 남기는 정규화) `#1` 의 재유도 대조와 `#5` 의 «전역 `.table-box dl` 무변동» 이 **동시에** 초록인 채로 여섯 화면 공유 전역 규칙 편집이 통과한… · 원문 .claude/reviews/plan-review-drug-diag-api-m5.md · id=16ec5eec |
| 2026-09-08 | FAIL | .claude/plans/drug-diag-api-m5.plan.md | L2 invariant: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-drug-diag-api-m5.md · id=9366bac3 |
| 2026-09-08 | HIGH | .claude/plans/drug-diag-api-m5.plan.md | **교차모델(Codex gpt-6-astra · R12 · 계획서 본문 직독) — `#2`(e)(g)의 «살아 있는 절» 고정 목록이 `## Design Decisions` 를 뺀다.** D4 에 정본과 같은 CSS 선언이 남아 있고 모바일 스택을 «3줄»·«4벌» 로 지시하는데 정본은 5벌이다. 곧 신설 장치가 **현재 존재하는 복제와 표류부터 놓친다.** 선언된 사각지대 목록에 «절 단위 누락» 이 없다. L2 architect 가 같은 축을 독립으로 짚었다(id=76aeb9cd) — 두 모델이 같은 자리를 든 유일한 건이다. 인수처: (e)의 절 범위를 화이트리스트가 아니라 **역목록**(사후 기록 절만 제외)으로 뒤집는 창 · id=m5-e-section-scope-whitelist |
| 2026-09-08 | MEDIUM | .claude/plans/drug-diag-api-m5.plan.md | **교차모델(Codex · R12) — `#2`(g)의 CSS 판별 명세가 두 곳에서 모호하다.** ⑴ «셸 메타문자를 담으면 CSS 가 아니다» 를 문자대로 구현하면 자식 결합자 `>` 를 쓰는 선택자(이 창의 계약 형태 그 자체)가 제외된다 — 저작 시제품은 `["$|;]` 만 배제해 실제로는 안 걸렸으나 **명세가 구현을 결정하므로 명세의 모호가 결함이다.** ⑵ 검사 대상이 «코드 스팬» 인데 Acceptance 는 «CSS 선언 블록» 부재를 주장한다 — D4 의 ```css 펜스는 스팬이 아니다. 인수처: (g) 명세에 배제 문자 집합과 펜스 처리 를 명시하는 창 · id=m5-g-css-detect-underspecified |
| 2026-09-08 | HIGH | .claude/plans/drug-diag-api-m5.plan.md | **교차모델(Codex · R12) — 변이 실행 기전이 세 방향으로 갈린다.** Task 1 «하네스 전체가 읽기 전용» · Task 8 첫 문단 «제자리 변조»(R11 흡수) · **Task 8 다음 문단이 다시 «컴포넌트 사본을 변이»**. 정본은 사본 방식이 테스트에 도달하지 못한다고 기각하고 실제 소스 편집을 요구한다. **R11 이 한 문단만 고쳤고 같은 Task 의 다음 문단을 안 고쳤다** — R11 이 (f)로 겨냥한 부류 그 자체이며, 앵커를 안 붙였으므로 (f)가 못 잡는다. 인수처: 변이 기전을 FACT 앵커로 묶는 창 · id=m5-mutation-mechanism-three-way |
| 2026-09-08 | HIGH | .claude/plans/drug-diag-api-m5.plan.md | **교차모델(Codex · R12) — Task 3 의 Validate 가 Task 4 산출물을 요구한다.** `check8` 이 요구하는 라벨 머리 관용구와 주석 거짓 제거가 Task 4 의 Action 이다. Task 3 만 정직하게 끝낸 상태에서 자기 Validate 를 통과할 수 없고, 계획서가 스스로 세운 순서 불변식(«어떤 Task 의 Validate 도 뒤 Task 가 만드는 것을 요구하지 않는다»)과 배타다. L2 architect 가 같은 축을 짚었다(id=05481ef7). 인수처: Task 3·4 의 Validate 를 8a 팔 단위로 가르거나 Task 를 합치는 창 · id=m5-task3-validate-forward-dep |
| 2026-09-08 | HIGH | .claude/plans/drug-diag-api-m5.plan.md | **교차모델(Codex · R12) — `#13` 판정 술어가 «상등» 과 «⊆ + 도달 불가 허용» 으로 여전히 배타다.** 기대 문자열과 집합 구성 설명은 상등을 요구하고 같은 블록의 최종 계약은 상등을 폐기하며, 계획서 Task 0 과 Acceptance 뒷부분에도 상등이 살아 있다. 동결 커밋이 도달 불가가 되면 두 설계의 판정이 **반대**다. **이것이 R11 의 «형태가 같으면 새 계약도 자동으로 덮인다» 주장을 반증한다** — (f)는 앵커가 붙은 사실만 보므로 이 표류는 여섯 앵커가 전건 동일한 지금도 그대로 남는다. R11 이 그 일반화를 gates.sh `#2` 사각지대 절에 적었고 **그 문장이 과대주장이다.** 인수처: `#13` 술어를 FACT 앵커로 묶고 `#2` 사각지대 문면에서 과대 일반화를 지우는 창 · id=m5-13-predicate-still-exclusive |
| 2026-09-08 | MEDIUM | .claude/plans/drug-diag-api-m5.plan.md | **교차모델(Codex · R12) — «색 선언을 0건 더한다» 를 `#10` 이 검사하지 않는다.** 게이트는 더해진 색이 허용 집합 **안**인지만 세므로 허용 색을 쓰는 새 `.ans003-dx` 규칙을 더해도 통과한다. «새 색상값 없음» 과 «색 선언 추가 없음» 은 다른 계약이다. L2 test 가 같은 축을 짚었다. 인수처: `#10` 에 «이 창이 더한 색 선언 수 == 0» 축을 더하는 창 · id=m5-10-zero-vs-allowed-set |
| 2026-09-08 | MEDIUM | .claude/plans/drug-diag-api-m5.plan.md | **교차모델(Codex · R12) — Task 0 의 «4/4 재유도 · 사각지대 없음» 이 낡았다.** 정본은 leak 기준선에 그 성질이 성립하지 않으며 셋과 묶지 말라고 명시하는데 Task 0 은 여전히 넷을 묶고, Acceptance 는 앞에서 구분했다가 끝에서 다시 사각지대 0 이라 결론낸다. R8 이 «4/4 재유도 순환» 으로 이름 붙인 축의 잔재다. 인수처: Task 0 · Acceptance 의 재유도 주장을 셋으로 좁히는 창 · id=m5-task0-four-baselines-stale |
| 2026-09-08 | MEDIUM | .claude/plans/drug-diag-api-m5.plan.md | **교차모델(Codex · R12) — `#13`(a)가 선언한 계획서 변조 음성이 스캔 대상 밖이다.** (a)는 `Files to Change` 표의 파일만 보는데 그 표에 `plan.md` 자신이 없다. 계획서 워킹트리에 값을 적는 음성은 (a)에도 안 들어가고 커밋 전이라 HEAD 를 보는 (c1)(c2)에도 안 들어간다 — 정본이 예고한 `#13 FAIL: …plan.md` 가 이 대상 정의로는 **성립하지 않는다.** 실환자 식별자가 처음 유출된 자리가 바로 그 파일이다. 인수처: (a)의 대상 정의에 계획서·게이트 파일을 넣는 창 · id=m5-13a-plan-outside-scan |
| 2026-09-08 | MEDIUM | .claude/plans/drug-diag-api-m5.plan.md | **교차모델(Codex · R12 · 재현 확인) — `git grep -c` 의 «0건» 을 성공 종료나 숫자 `0` 출력으로 취급하는 명세가 틀렸다.** 정상 무매치는 **빈 출력 · rc=1** 이고 `set -euo pipefail` 아래에서는 후속 명령에 도달하지 못한다. Codex 가 무해한 미존재 패턴으로 **직접 재현**했다(`rc:1 stdout_bytes:0` · `reached_next_command:False`). CLAUDE.md §1 이 이름 붙인 «`grep -c` 는 0건에 exit 1» 규약이 Task 0 Validate 와 `#13`(c1) 두 자리에서 안 지켜졌다. 인수처: 무매치 rc=1 과 실행 오류를 구별하는 처리를 명세에 넣는 창 · id=m5-git-grep-c-nomatch-rc1 |
| 2026-09-08 | MEDIUM | .claude/plans/drug-diag-api-m5.plan.md | **교차모델(Codex · R12) — 상병 코드·날짜의 `nowrap` 보존을 `#5` 가 검사한다는 주장에 대응 검사가 없다.** D1 은 두 값의 `nowrap` 유지를 `#5` 가 함께 검사한다고 적으나 `#5` 의 계약은 셀 구조·스코프·삽입 순서·overflow·전역 블록 대조이고 `white-space` 보존 항목이 없다. 스코프를 갖춘 `white-space:normal` 추가를 반증하지 못한다(층위 2). 인수처: `#5` 에 두 값의 `white-space` 축을 더하거나 D1 주장을 좁히는 창 · id=m5-d1-nowrap-claim-uncovered |
| 2026-09-09 | HIGH | .claude/plans/drug-diag-api-m5b.plan.md | L2 architect: 위임·재귀속 분할의 **완전성**을 무는 축이 M5b 에서 소유자를 잃는다. M5c `check1` ⑷ 는 `CONTRACT_ARMS ∪ REATTRIBUTED` 가 M5a `--help` 의 「서브커맨드:」 줄(외부 기준)과 **집합 동등**임을 하드 실패로 물어, 「재귀속은 버림이 아니다」를 검사로 만들었다. M5b 는 그 축… · 원문 .claude/reviews/plan-review-drug-diag-api.md · id=e594f1e3 |
| 2026-09-09 | FAIL | .claude/plans/drug-diag-api-m5b.plan.md | L2 architect: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-drug-diag-api.md · id=dc41c14e |
| 2026-09-09 | HIGH | .claude/plans/drug-diag-api-m5b.plan.md | L2 security: M5b 는 실환자 식별자(M5_PROBE_ODD_ID)를 설정한 채 도는 창인데, 이 창이 **커밋하는 파일의 내용**에서 그 식별자를 찾는 게이트 팔이 하나도 없다. 절대 홈 경로에 대해서는 같은 논리로 새 팔을 세웠으면서 식별자에 대해서는 세우지 않았다 — 비대칭 누락이며 결과는 저장소 이력에 실환자 식별자가 남는 것이다. · 원문 .claude/reviews/plan-review-drug-diag-api.md · id=34bd887d |
| 2026-09-09 | FAIL | .claude/plans/drug-diag-api-m5b.plan.md | L2 security: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-drug-diag-api.md · id=22c15192 |
| 2026-09-09 | HIGH | .claude/plans/drug-diag-api-m5b.plan.md | L2 test: D4-a 의 유일한 산출물(`ans003-dx-role` 클래스 부착 + `.ans003-dx .ans003-dx-role dd { font-weight: 600 }` 규칙)을 지시하는 Task 가 계획서에 없다. R1 이 그것을 test MEDIUM 으로 잡고 「Task 3 Action 에 명시」를 정정으로 적었으나 그 정정이 계획서 본… · 원문 .claude/reviews/plan-review-drug-diag-api.md · id=ed32a498 |
| 2026-09-09 | HIGH | .claude/plans/drug-diag-api-m5b.plan.md | L2 test: Task 1 의 Validate 가 자기가 만든 것을 하나도 실행하지 않는다. Task 1 은 `gates.mjs` 나머지 검사 · `probe.mjs` · `fixture.mjs` · `fixture.cases.mjs` 넷을 CREATE 하는데 Validate 는 `check0` 하나이고, `#0` 은 「`gates.sh` 를 텍스트로 … · 원문 .claude/reviews/plan-review-drug-diag-api.md · id=8577b666 |
| 2026-09-09 | FAIL | .claude/plans/drug-diag-api-m5b.plan.md | L2 test: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-drug-diag-api.md · id=5aa549d3 |
| 2026-09-09 | HIGH | .claude/plans/drug-diag-api-m5b.plan.md | L2 invariant: 게이트 `#8`(구간 변경 ⊆ 선언 집합)이 이 창에서 정의상 붉는다 — §Files to Change 가 `.claude/reviews/` 를 하나도 선언하지 않는데 이 창의 리뷰 산출물이 이미 그 아래에 있다. M5c 가 같은 자리를 이미 겪고 «파일 하나를 이름으로 선언» 으로 닫았는데 M5b 가 그 정정을 승계하지 않았다.… · 원문 .claude/reviews/plan-review-drug-diag-api.md · id=784ceaf4 |
| 2026-09-09 | HIGH | .claude/plans/drug-diag-api-m5b.plan.md | L2 invariant: 재귀속 회계가 불완전하다 — M5c `check1` 의 «분할 전수» 팔(⑷)이 D6 표 어디에도 없다. 그 팔이 바로 「M5a 팔이 조용히 사라지지 않았음」을 **외부 기준**(M5a `--help` 서브커맨드 줄)으로 대조하는 유일한 검사이고, 이 창은 그것을 승계하지 않은 채 「직접 위임 6 · 동일 재귀속 4 · 완화 1 … · 원문 .claude/reviews/plan-review-drug-diag-api.md · id=0ee19901 |
| 2026-09-09 | FAIL | .claude/plans/drug-diag-api-m5b.plan.md | L2 invariant: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-drug-diag-api.md · id=43fbefb0 |

<!-- ── drug-diag-api-m5b (마일스톤 7) R2 — 단일통과로 이월된 지적 ──────────────
     receipt: .claude/receipts/mccp-plan-codex/drug-diag-api-m5b.json
     verdict: divergent (봉인 그대로) · single_pass_reason: deferred_to_prd_completion
     plan_hash: sha256:140fd15b… · L2 4/4 fail(16) · L3 divergent(4)
     차단분 10건은 5.2g2 `backlog-append` 가 위에 기계로 적재했다. 아래는 그 CLI 의
     대상 밖인 **비차단 10건 + L3 4건**이고, 각 행 머리의 분류는 이 창의 판정이다:
       A = 계획서가 닫아야 함 — 구현자가 계획서를 따르면 오히려 그 결함에 빠진다
       B = 구현 시 흡수      — 계획서는 옳고, 돌려봐야 채워지는 자리다
       C = 범위 밖          — 살아 있는 결함 0건. 이름 있는 사각지대로 넘긴다
     A 11건(차단 6 + 비차단 5)이 다음 창의 입력이다. -->
| 2026-09-09 | MEDIUM | .claude/plans/drug-diag-api-m5b.plan.md | **[분류 A]** L2 architect(비차단): D6 처분표는 「M5c `#1` 의 축」을 계수까지 붙여 전수인 것처럼 적지만 실제 축 여덟 중 둘(⑶ 재귀속 귀속 게이트 실재 · ⑷ 분할 전수)을 아예 등재하지 않는다. 완전성 주장에 그것을 검사하는 코드가 없는 자리이며(CLAUDE.md §Acceptance), 계수 13 이 무엇의 13 인지 대조할 외부 기준이 없다. · 원문 .claude/reviews/plan-review-drug-diag-api.md · id=8e51d597 |
| 2026-09-09 | MEDIUM | .claude/plans/drug-diag-api-m5b.plan.md | **[분류 A]** L2 architect(비차단): R1 이 「Task 5 Mirror 가 `#5` 가 금지한 `.diag-box` 를 가리킨다 → 정정: 래퍼 제외를 Mirror 에 명시」로 흡수했다고 적었으나, Task 5 의 Mirror 행은 정정되지 않은 원문 그대로다. 흡수를 주장하고 본문에 반영이 없는 자리다(CLAUDE.md §4 「주장으로만 남긴 흡수는 다음 라운드의 지적이 된다」). · 원문 .claude/reviews/plan-review-drug-diag-api.md · id=0be11a2c |
| 2026-09-09 | LOW | .claude/plans/drug-diag-api-m5b.plan.md | **[분류 A]** L2 architect(비차단): 같은 게이트 술어를 가리키는 행 번호 인용이 계획서 안에서 서로 어긋난다. 관측 F·D1 은 M5a `#5` 의 스코프 술어를 각각 `1027행`·`1029행` 으로 적는데 실제는 JSX 노드 계수가 `1025~1026`, CSS 접두 술어가 `1033~1034` 다(계획서 `:358` 은 후자를 맞게 적는다). 1027행은 `.diag-box` 술어다. · 원문 .claude/reviews/plan-review-drug-diag-api.md · id=e6fb1682 |
| 2026-09-09 | MEDIUM | .claude/plans/drug-diag-api-m5b.plan.md | **[분류 B]** L2 security(비차단): `fixture.cases.mjs` 의 「실환자 값을 담지 않는다」는 산문 주장에 대응 게이트가 없다 — 위 누락과 같은 사각지대에 놓인 커밋 파일이다(층위 2). · 원문 .claude/reviews/plan-review-drug-diag-api.md · id=4a71cef0 |
| 2026-09-09 | MEDIUM | .claude/plans/drug-diag-api-m5b.plan.md | **[분류 B]** L2 test(비차단): `#2`~`#6` 의 `# 음성:` 은 실행 관찰이 아니라 예측이다. `gates.mjs` 는 아직 존재하지 않으므로(§Files to Change 296행 CREATE, Glob 결과 m5b 파일은 plan.md·gates.sh 둘뿐) 「이 검사를 지금 돌리면 하드 실패한다」는 문장은 한 번도 실행된 적이 없다. 실행 기록으로 서 있는 것은 입력 계수(`grep`)뿐이고, 「그 계수에서 exit 1 이 나온다」는 검사 구현이 없으면 반증 불가하다 — CLAUDE.md §Validation 블록이 요구하는 「깨진 입력에서 exit 1 임을 실행해 확인한 출력」이 아니다. · 원문 .claude/reviews/plan-review-drug-diag-api.md · id=a025531f |
| 2026-09-09 | MEDIUM | .claude/plans/drug-diag-api-m5b.plan.md | **[분류 A]** L2 test(비차단): Task 8(impeccable 회차)의 Validate 가 그 Task 의 산출물과 무관하다. Task 8 은 §Design Critique 를 계획서에 기록하는데 Validate 는 `check0`(gates.sh 텍스트 계수)이며 §Design Critique 의 실재를 보지 않는다. `Gate: (없음)` 은 규약상 허용이지만 Validate 행은 여전히 「정확성을 증명하는 명령」이어야 하고, 여기서는 아무 관계 없는 검사를 가리킨다. · 원문 .claude/reviews/plan-review-drug-diag-api.md · id=c4e9303d |
| 2026-09-09 | LOW | .claude/plans/drug-diag-api-m5b.plan.md | **[분류 C]** L2 test(비차단): `#6` 대비 검사의 모집단이 D1 이 새로 들이는 잉크를 구조적으로 못 본다. 글리프 `+`/`-` 는 `::before { content }` 로 그려지므로 DOM 텍스트 요소가 아니고, 「렌더된 텍스트 요소의 실효 색·실효 배경 쌍」을 세는 모집단에 들어가지 않는다. 곧 D2 가 2차 칩을 `#f0f2f5` 배경 · `#333333` 로 내린 뒤 1차 칩(`#626976` 면 위 글리프)의 대비는 어느 팔도 안 문다. · 원문 .claude/reviews/plan-review-drug-diag-api.md · id=d219ac20 |
| 2026-09-09 | MEDIUM | .claude/plans/drug-diag-api-m5b.plan.md | **[분류 A]** L2 invariant(비차단): D6 표의 «동일 재귀속» 행이 M5c `check1` ⑹ 의 대상을 틀리게 적었다 — 실제 술어는 **m5** closure 의 추적 여부와 PRD Provenance sha256 대조인데 계획서는 「m5c closure sha256 대조」로 적었다. 재귀속 계약이 원 술어를 잘못 기술하면 「같은 술어로 재귀속」이라는 주장 자체가 검증 불가가 된다. · 원문 .claude/reviews/plan-review-drug-diag-api.md · id=0d5cb9d2 |
| 2026-09-09 | MEDIUM | .claude/plans/drug-diag-api-m5b.plan.md | **[분류 A]** L2 invariant(비차단): `closure..HEAD` 공집합 요구와 PRD Milestone Closure Provenance 스탬프가 상충한다. 이 저장소의 종결 관행은 closure 파일을 만든 **뒤** 그 sha256 을 PRD 표에 스탬프하는 것인데, 그 스탬프 커밋은 정의상 종료 앵커 뒤에 온다. 계획서는 「정정은 closure 전에 하고 closure 를 마지막에 만든다」만 적고 스탬프 커밋의 처분을 어디에도 정의하지 않는다 — `#8` 이 붉거나, 스탬프를 생략해 다음 창의 provenance 대조가 근거 없는 파일을 가리키게 된다(M5c 관측 D 가 이미 겪은 자리). · 원문 .claude/reviews/plan-review-drug-diag-api.md · id=6c5b71cf |
| 2026-09-09 | MEDIUM | .claude/plans/drug-diag-api-m5b.plan.md | **[분류 A]** L2 invariant(비차단): `#4` 의 「가시 요소를 센다」가 술어 미명시다. 이 계획서 자신이 관측 G 에서 이 저장소의 기존 가시성 술어(`getClientRects().length > 0`)가 clip 된 1×1 요소를 «보임» 으로 센다는 것을 실행으로 확정했는데, `#4` 가 어떤 술어로 가시성을 잴지는 어디에도 적지 않았다. 같은 술어를 재사용하면 「접어도 배지가 남는다」는 Acceptance 가 다시 노드 계수와 등가가 된다. · 원문 .claude/reviews/plan-review-drug-diag-api.md · id=08b632ed |
| 2026-09-09 | HIGH | .claude/plans/drug-diag-api-m5b.plan.md | **[분류 A]** **교차모델(L3 Codex · R2)**: Restore the two omitted re-attribution guards — D6 omits M5c check1's orphan-attribution check and external partition-exhaustiveness comparison (m5c.gates.mjs:461–489). Printing fixed disposition counts cannot detect a dropped delegate or missing receiver. Gate #9's receiver-existence requirement covers only M5c check1→#1, not the underlying M5a partition. An implementation can therefore omit an arm while retaining t · 원문 .claude/reviews/plan-review-drug-diag-api.md · id=947e4253 |
| 2026-09-09 | MEDIUM | .claude/plans/drug-diag-api-m5b.plan.md | **[분류 A]** **교차모델(L3 Codex · R2)**: Include the review artifact in the declared commit scope — This working diff modifies .claude/reviews/plan-review-drug-diag-api.md, which line 505 identifies as canonical, but Files to Change omits it. Committing that update inside the declared interval makes Gate #8 reject this window's own artifact. Mirroring M5c does not supply an exemption: its WORKFLOW_PREFIXES contains notes, receipts and reports, but not revie · 원문 .claude/reviews/plan-review-drug-diag-api.md · id=989e178c |
| 2026-09-09 | MEDIUM | .claude/plans/drug-diag-api-m5b.plan.md | **[분류 A]** **교차모델(L3 Codex · R2)**: Resolve provenance stamping before requiring closure to be HEAD — Under the separate post-closure PRD stamp sequence described in the request, the legitimate stamp commit makes closure..HEAD nonempty and permanently fails this acceptance condition. Declaring the PRD path does not help. Task 9 specifies neither atomic stamping nor an audited suffix. This ordering is avoidable: existing commit 94fc814 actually bundled  · 원문 .claude/reviews/plan-review-drug-diag-api.md · id=7022a3b9 |
| 2026-09-09 | MEDIUM | .claude/plans/drug-diag-api-m5b.plan.md | **[분류 B]** **교차모델(L3 Codex · R2)**: Separate predicted gate failures from executed negative evidence — This # 음성 block labels source observations as 실측, then predicts that check5 will fail at the stated assertion. CLAUDE.md:48–62 defines this marker as a record of an actually executed failing check. M5b gates.mjs does not exist; invoking check5 currently fails with MODULE_NOT_FOUND, proving nothing about its assertions. The plan never labels these reco · 원문 .claude/reviews/plan-review-drug-diag-api.md · id=5403ab4f |

<!-- ── drug-diag-api-m8 (마일스톤 8) R1 — 라운드 cap 상한으로 이월된 지적 ──────────
     receipt: .claude/receipts/mccp-plan-codex/drug-diag-api-m8.json
     verdict: divergent (봉인 그대로 · converged=false) · 사유: MCCP_GATE_ROUND_CAP=1 소진
     plan_hash: sha256:bed9580a9181eacada839c6ad075226f0a4687c4fb584fe666a3f13d54896deb
     L2: 4/4 fail · findings 13건(HIGH 6 · MEDIUM 5 · LOW 2) · quorum 3/4 미달
     L3: **말하지 않았다** — `invoked:false` `classification=exit-nonzero blocking=true exit=1`.
         곧 이 라운드에 교차모델 확인은 **0건**이고 판정은 L2 단독이다. 같은 저장소에서
         과거 L3 호출은 `classification=ok` 였으므로 항구적 환경 결함이 아니라 이 호출의
         실패다. 라운드 예산이 소진돼 재호출 경로가 닫혔다(`rounds_so_far=1 cap=1`).
     `backlog-append` CLI 는 `single_pass_reason` 이 있을 때만 적재하므로(backlog-append.js:198)
     이 경로에서는 0건을 냈다. 아래는 전역 CLAUDE.md §mccp 규칙대로 **직접** 적재한
     전건 13 이고, 각 행 머리의 분류는 이 창의 판정이다:
       A = 계획서가 닫아야 함 — 구현자가 계획서를 따르면 오히려 그 결함에 빠진다
       B = 구현 시 흡수      — 계획서는 옳고, 돌려봐야 채워지는 자리다
       C = 범위 밖          — 살아 있는 결함 0건. 이름 있는 사각지대로 넘긴다
     A 12건이 다음 창의 입력이다. 그중 셋(앵커 HEAD · `#7` 술어 +3/-0 · `#9` ANS007 공허)은
     **이번 개정이 새로 들인 결함**이다 — 바이트 동결을 계약으로 내린 대가가 계산보다 컸다. -->
| 2026-09-11 | HIGH | .claude/plans/drug-diag-api-m8.plan.md | **[분류 A]** L2 architect: 게이트 #7 의 첫째 술어 「GroupDetailModal.tsx diff 가 추가 3줄 · 삭제 0줄」은 이 계획서 자신의 구현으로 만족될 수 없다. 현재 파일의 `Modal.Head` 호출부가 이미 `button={{ closeFn: closeModal }}` 한 줄로 존재하므로, D2 가 요구하는 `button={{ backFn: onBack, closeFn: closeModal }}` 로 바꾸려면 그 줄이 반드시 삭제 1줄로 나온다. 곧 최소 diff 는 +3/-1 이고 `#7` 은 올바른 구현에서 하드 실패한다. Acceptance 의 「삭제가 0줄이다 — 게이트 #7」 항목도 같이 거짓이 된다. — **판정**: 이번 개정이 새로 들인 결함이다. 정정은 `#7` 술어 1 을 `+3/-1` 로 고치고 삭제된 1줄이 `button={{ closeFn: closeModal }}` 임을 함께 무는 것 · 증거 insuniverse-site/front/src/features/analysisDetailView/ui/GroupDetailModal.tsx:29 `<Modal.Head button={{ closeFn: closeModal }}>` 대 계획서 L223 「그 셋이 `onBack?: () => void` 선언 · 구조분해 인자 · `button={{ backFn: onBack, closeFn }}` 전달인 것. **삭제 0줄 · 그 밖의 추가 0줄.**」 · 원문 .claude/reviews/plan-review-drug-diag-api-m8.md · id=1ec2af8d |
| 2026-09-11 | MEDIUM | .claude/plans/drug-diag-api-m8.plan.md | **[분류 A]** L2 architect: M5a `#8` 은 GroupDetailModal.tsx 바이트 대조를 **먼저** 하고 `die()` 로 즉시 끝나므로, 이 창이 그 파일을 고치는 순간 같은 검사의 **뒤쪽 팔들**(폐기한 표 레이아웃 처분표가 되살아났는지 · `.ans003-thead` 소비 0건)이 영구히 도달 불가가 된다. 이 창의 `#7`·`#5` 는 그 두 축을 다시 적지 않는다 — 관측 F 는 「승계할 축은 `#7`·`#10` 이 술어를 다시 적어 받는다」고 적었으나 실제로 승계된 것은 모달·라벨 축뿐이고, 처분표 부활 검사와 thead 검사는 이름 없이 사라진다. — **판정**: 바이트 동결을 걷어낸 대가가 계획서가 센 것보다 넓다 — 승계 목록에 처분표 부활 검사와 `.ans003-thead` 계수 둘이 빠졌다 · 증거 `.claude/plans/drug-diag-api-m5.gates.mjs:1321-1323` (바이트 불일치 시 `die`) → 같은 함수의 1331-1349 (`dispositionTable()` 부활 검사 · `.ans003-thead` 계수)가 그 뒤에 있다. 계획서 §NOT Building 「선행 창 게이트 수정 … 고치지 않는다」로 복구 경로도 닫혀 있다. · 원문 .claude/reviews/plan-review-drug-diag-api-m8.md · id=c4707d80 |
| 2026-09-11 | MEDIUM | .claude/plans/drug-diag-api-m8.plan.md | **[분류 A]** L2 architect: 「3단계에서만 `onBack` 이 넘어간다」는 런타임 조건인데 검사는 정적 계수(`#3` 의 `onBack` 전달 1건)와 형제 탭 렌더(`#9` 의 ANS007 0건)뿐이다. 이 창 **자신의 2단계**에서 `.back-btn` 이 0건인지를 세는 축이 어디에도 없다 — `onBack` 을 무조건 넘기는 구현(조건 분기 누락)도 `#3`(전달 1건) · `#9`(ANS007 0건 · 3단계 1건)를 전부 통과한다. — **판정**: `onBack` 을 무조건 넘기는 구현이 `#3`·`#9` 를 전부 통과한다. 정정은 `#9` 에 이 창 2단계 `.back-btn` 0건 축을 더하는 것 · 증거 계획서 L371 「3단계에서만 `onBack` 이 넘어간다 — 2단계 호출부의 `onBack` 전달이 0건이다 — 게이트 `#3`」 대 gates.sh:77-79 (`onBack` 전달 1건) · gates.sh:139 (`#9` 축 목록에 이 창 2단계 `.back-btn` 0건 없음) · 원문 .claude/reviews/plan-review-drug-diag-api-m8.md · id=2e6ff8df |
| 2026-09-11 | LOW | .claude/plans/drug-diag-api-m8.plan.md | **[분류 A]** L2 architect: Patterns to Mirror 와 Task Mirror 의 행 번호가 실제 파일과 2행씩 어긋난다(관측 I 가 말한 M5b 커밋 드리프트로 보인다). 인용 검증이 수동일 때 오도한다. — **판정**: 관측 I 가 말한 M5b 커밋 드리프트. 싸게 고칠 수 있고 인용 검증이 수동인 동안 오도한다 · 증거 계획서 L33 `ANS003BDiagnosis.tsx:289 GroupMetricRow` / L34 `:280 orderGroups` / L264 `:481 useState(null as T · null)` 대 실제 `ANS003BDiagnosis.tsx:287` `export const GroupMetricRow`, `:278` `const orderGroups`, `:480` `useState(null as Dosing30DayDiagnosisGroup · null)` · 원문 .claude/reviews/plan-review-drug-diag-api-m8.md · id=c48171ef |
| 2026-09-11 | HIGH | .claude/plans/drug-diag-api-m8.plan.md | **[분류 A]** L2 security: 게이트 #7 의 「앵커」가 고정 커밋이 아니라 움직이는 HEAD 로 정의돼 있어, 구현 커밋이 들어가는 순간 tamper 검사 넷이 전부 공허하게 통과한다. 이 창이 유일하게 형제 탭 넷(ANS003B·ANS003A·ANS007·ANS009)을 지키는 무결성 축이 스스로를 무력화한다. — **판정**: 3개 관점이 독립으로 같은 것을 찾았다(security·test·invariant HIGH). 정정은 M5a 선례대로 착수 SHA 를 리터럴 상수 + `refs/mccp/m8-anchor` 로 동결하고 `merge-base --is-ancestor` 를 함께 도는 것 · 증거 plan Task 5: 「앵커는 이 창 착수 시점의 `git show HEAD:` 내용이다.」 — 반면 승계 대상이라고 적은 M5a 하네스는 앵커를 리터럴 SHA 로 동결하고 조상성까지 검사한다: `.claude/plans/drug-diag-api-m5.gates.mjs:88` `const ANCHOR = {`, `:96` `const ANCHOR_REF = "refs/mccp/m5-anchor"`, `:959` `merge-base --is-ancestor ANCHOR[key] ANCHOR_REF`, `:1319-1322` 앵커 블롭과 바이트 대조. 저장소 규약 § · 원문 .claude/reviews/plan-review-drug-diag-api-m8.md · id=92f8043e |
| 2026-09-11 | MEDIUM | .claude/plans/drug-diag-api-m8.plan.md | **[분류 A]** L2 security: 커밋되는 새 아티팩트 `m8.fixture.json` 의 「실환자 값 0건」이 저작자 자기 단언일 뿐 어떤 검사도 그것을 보지 않는다. 이 저장소는 커밋 산출물로의 유출 선례(절대경로 `cwd` 유출 → 재봉인)가 있는 축이다. — **판정**: m5b 에서 같은 축(`fixture.cases.mjs` 실환자 값 0건 미검사)이 이미 분류 B 로 이월됐고 닫히지 않았다. 이 창에서 A 로 올린다 — 커밋 파일이고 이 저장소에 유출 선례가 있다 · 증거 plan:239 「관측 A·B 의 **형상**을 승계한 합성 표본. 실환자 값 0건이며 `#2`·`#9` 가 이 파일에서 분포를 다시 센다」 — 그러나 gates.sh 의 `# 검사 #2` 기대 출력(gates.sh:67-72)은 「묶음 <n>건 · 혼재 <m>건 · DxClass 접두 · bucket·role·label 재사용 0건」뿐이고 식별자/실환자 필드 부재를 보는 술어가 없다. Acceptance 어느 행에도 그 축이 없다(plan:384-391). 픽스처는 stg 실응답 형상에서 손으로 옮겨 적는 파일이므로(plan:44-56), 환자 식별자·처방일자가 함 · 원문 .claude/reviews/plan-review-drug-diag-api-m8.md · id=c725e236 |
| 2026-09-11 | HIGH | .claude/plans/drug-diag-api-m8.plan.md | **[분류 A]** L2 test: `#7`·`#11` 의 「착수 앵커」가 정의되지 않았고 `git show HEAD:` 로 잡으면 구현 커밋 뒤 자기 자신과 비교하게 되어 검사가 공허하게 통과한다 — **판정**: 위 security HIGH 와 같은 축. `#11` 까지 같은 구멍임을 이쪽이 명시했다 · 증거 plan Task 5: "앵커는 이 창 착수 시점의 `git show HEAD:` 내용이다". 저장소 규약은 "커밋한 뒤 리뷰어를 돌린다"(CLAUDE.md §4)이므로 게이트 실행 시점 HEAD 에는 이미 `onBack` 변경이 들어 있다 → `GroupDetailModal.tsx` diff 가 +0/-0 이 된다. 선례인 M5a 하네스는 이 자리를 리터럴 SHA 상수로 고정한다 — `.claude/plans/drug-diag-api-m5.gates.mjs:88` `const ANCHOR = {` · `:96` `const ANCHOR_REF = "refs/mccp · 원문 .claude/reviews/plan-review-drug-diag-api-m8.md · id=d45716bb |
| 2026-09-11 | HIGH | .claude/plans/drug-diag-api-m8.plan.md | **[분류 A]** L2 test: `#7` 이 스스로 적은 사각지대(형태 ≠ 출력)를 받는 유일한 검사인 `#9` 의 `ANS007 .back-btn 0건` 축이 공허하게 통과할 수 있다 — 모달이 아예 안 열려도 0건이다 — **판정**: D7 이 스스로 「`#9` 가 받는다」고 적은 자리가 공허 통과 가능하다 — 곧 사각지대를 닫았다는 주장 자체가 미검증. 정정은 `#9` 에 「ANS007 모달이 실제로 열렸다」 술어를 선행 조건으로 두는 것 · 증거 `ANS007.tsx:20` 은 `({ bodId, codId })` 를 받고 `:30` 의 `useEffect` 로 자기 API 를 호출하며, `GroupDetailModal` 은 `:101` 즉 카드 클릭 뒤에만 선다. 계획서 Task 6 은 "형제 탭 `ANS007` 을 같은 표본으로 렌더해 `.back-btn` 노드가 0건" 이라고만 적고, 진단 fixture 는 ANS007 응답 형상이 아니다. Acceptance(line 380)에도 「ANS007 모달이 실제로 열렸다」를 세는 술어가 없다 — 빈 화면 렌더도 0건을 만족한다. · 원문 .claude/reviews/plan-review-drug-diag-api-m8.md · id=1fb7e6b5 |
| 2026-09-11 | MEDIUM | .claude/plans/drug-diag-api-m8.plan.md | **[분류 A]** L2 test: Acceptance 「2단계 화면의 `.gdm-title` 이 0건 — 게이트 `#4`」는 `#4` 가 보는 대상(정적 스캔)으로는 성립할 수 없다 — **판정**: `BucketSection` 이 `gdm-title` 을 계속 내므로 파일 단위 정적 계수는 0 이 될 수 없다. `#4` 를 렌더 축으로 옮기거나 Acceptance 술어를 좁혀야 한다 · 증거 D4 는 `BucketSection` 을 "그대로 둔다"고 하는데 그 정의가 `ANS003BDiagnosis.tsx:436` 에서 `className="gdm-title ans003-dx-bucket-title"` 을 낸다. 곧 파일 단위 `.gdm-title` 계수는 0 이 될 수 없고, 「2단계 화면」이라는 렌더 개념을 구분하려면 렌더 검사(`#9`)여야 한다. gates.sh:87 의 `#4` 기대 출력은 렌더 계수와 정적 계수를 구분하지 않는다. · 원문 .claude/reviews/plan-review-drug-diag-api-m8.md · id=38be5e81 |
| 2026-09-11 | LOW | .claude/plans/drug-diag-api-m8.plan.md | **[분류 C]** L2 test: `#2` 의 표본이 저자가 기대 형상대로 손으로 만든 fixture 라 「분포 재현」 주장이 자기충족적이다 — **판정**: 계획서 Acceptance 가 이미 `(미검증)` 으로 적은 사각지대다 — 실환자 응답을 게이트에 실을 수 없다는 제약의 귀결이고 살아 있는 결함 0건 · 증거 plan line 54: "관측 A·B 의 형상을 합성 표본으로 동결하고(`m8.fixture.json`) 게이트 `#2` 가 그 파일에서 분포를 다시 센다" + Acceptance line 390 "실데이터 분포가 합성 표본의 형상과 같다 — `(미검증)`". 실제 producer(`getDosing30DayDiagnosisGroups`)가 그 형상을 낸다는 것을 잡는 검사는 없다. 계획서가 사각지대로 적어 두었으므로 LOW. · 원문 .claude/reviews/plan-review-drug-diag-api-m8.md · id=c079abb8 |
| 2026-09-11 | HIGH | .claude/plans/drug-diag-api-m8.plan.md | **[분류 A]** L2 invariant: 게이트 #7·#11 의 앵커가 고정 SHA 가 아니라 움직이는 `HEAD` 다 — 커밋한 뒤 게이트를 돌리는 이 저장소 운용(§4 「커밋한 뒤 리뷰어를 돌린다」)에서는 앵커가 곧 변경 후 트리가 되어 다섯 개 바이트 동일성 술어가 전부 공허해진다. 승계 대상인 M5a 하네스는 같은 자리를 리터럴 SHA 로 동결하고 조상 검사까지 돌린다. — **판정**: 위 security·test HIGH 와 같은 축을 세 번째 관점이 독립으로 찾았다. 이쪽이 귀결을 가장 넓게 적었다 — `#7` 의 다섯 술어와 `#11` 이 전부 자동 통과한다 · 증거 plan .claude/plans/drug-diag-api-m8.plan.md:277 「앵커는 이 창 착수 시점의 `git show HEAD:` 내용이다」 — 착수 시점 SHA 를 기록하는 파일이 §Files to Change(:232-243)에 없고 `.gates.sh` 에도 없다. 대조: .claude/plans/drug-diag-api-m5.gates.mjs:88 `const ANCHOR = {` · :96 `ANCHOR_REF = "refs/mccp/m5-anchor"` · :959 `merge-base --is-ancestor` · :1319-1322 앵커  · 원문 .claude/reviews/plan-review-drug-diag-api-m8.md · id=b18672fb |
| 2026-09-11 | HIGH | .claude/plans/drug-diag-api-m8.plan.md | **[분류 A]** L2 invariant: 디스패처가 미지의 서브커맨드를 거부하지 않는다 — 오타 하나면 검사 0건이 돌고 rc=0 과 `[gates] 전건 통과` 가 찍힌다. Task 의 `Validate` 행이 전부 이 형태라 Task 게이트가 조용히 열린다. — **판정**: Task 의 `Validate` 행이 전부 `gates.sh checkN` 형태라 오타 하나면 Task 게이트가 전부 조용히 열린다. 정정은 `want` 디스패처에 미지 서브커맨드 거부를 넣는 것 · 증거 .claude/plans/drug-diag-api-m8.gates.sh:54-55 `ONLY="${1:-}"` · `want() { [ -z "$ONLY" ] ·· [ "$ONLY" = "$1" ]; }` — 알려진 라벨 집합과 대조하는 자리가 없다. :167 `finish` 는 FAILED=0 · SKIPPED=0 이면 `echo "[gates] 전건 통과"; return 0`. 곧 `bash ...gates.sh check12`(또는 plan:272 의 `check10` 을 `check1O` 로 오타)는 아무 검사도 돌리지 않고 성공을 출력한다. 층위 3(명령 ≠ · 원문 .claude/reviews/plan-review-drug-diag-api-m8.md · id=326cd7df |
| 2026-09-11 | MEDIUM | .claude/plans/drug-diag-api-m8.plan.md | **[분류 A]** L2 invariant: rc=2(skip)의 합법 조건이 어디에도 정의되지 않았다 — 어떤 검사가 어떤 입력 부재(fixture 미존재 · vitest 부재 · 앵커 blob 미독)에서 skip 을 낼 수 있는지 계획서·하네스 둘 다 침묵한다. 게이트 기계 자신의 고장이 skip 으로 흐를 경로가 열려 있다. — **판정**: 게이트 기계 자신의 고장이 skip 으로 흐르는 경로. m5c 하네스에서 승계한 `run_check` 의 rc=2 수용을 계획서가 조건 없이 물려받았다 · 증거 .claude/plans/drug-diag-api-m8.gates.sh:40 `2) SKIPPED=$((SKIPPED + 1)); echo "[gates] $label skip (rc=2)"` — 수용은 하는데 #1~#11 의 `# 기대:`·`# 음성:` 어디에도 skip 조건이 없다(gates.sh:58-165). 대조로 M5a 는 입력 부재를 하드 실패로 못박는다(.claude/plans/drug-diag-api-m5.gates.mjs:958 「네트워크 부재도 하드 실패다」). · 원문 .claude/reviews/plan-review-drug-diag-api-m8.md · id=bacaa006 |
| 2026-09-11 | HIGH | .claude/plans/drug-diag-api-m8.plan.md | **[분류 B]** Implement-Codex R1 security-reviewer S2: 계획서 §GROUND 관측 A·B 본문이 stg 실환자 1건에서 온 상병코드 셋(`M766`·`J304`·`E785`)과 실약효분류명(`진해거담제`)을 담은 채 커밋된다. 게이트 `#1`~`#11` 은 전부 코드·CSS·JSON 을 보고 **계획서 산문을 스캔하는 검사는 0건**이라 이 값은 어떤 게이트도 안 본다. — **판정**: 지적은 참이다. 실측으로 그 넷은 `git grep -F <값> HEAD -- .claude` 에서 **0건**이고(대조: 기존 표본 `M170` 은 7건) 곧 새로 이력에 들어가는 값이다. 그런데 제안된 정정(본문에서 실코드를 일반 라벨로 교체)이 이 창에서 **기계적으로 불가**하다 — 계획서는 `mccp-plan-codex` receipt 의 `plan_hash sha256:bed9580a…` 에 결박돼 있고 한 글자만 고쳐도 `validate --command mccp:prp-implement` 가 `stale` 로 `ok:false` exit 2 를 내 Phase 3 진입이 막힌다(형제 m5b 에서 실측: `140fd15b` 대 `64bcaa57`). 노출의 형태는 환자 식별자·날짜·병의원 없는 **상병코드 단독**이라 재식별 경로가 서지 않으며, 위험이 실제로 큰 조합(`provider`+`treatmentStartDate`+`dxCode`)은 같은 라운드의 S1 이 픽스처 쪽에서 기계로 닫았다. 인수처: 이 계획서를 재봉인하는 다음 창 — plan 게이트를 다시 돌리는 자리에서만 본문 정정이 receipt 를 안 깨고 들어간다. 그때까지 커밋 여부는 사람이 마지막 스위치를 잡는다 · id=m8-ground-real-dxcodes |
| 2026-09-11 | HIGH | .claude/plans/drug-diag-api-m8.plan.md | **[분류 A]** Implement-Codex R1 impeccable critique A4: 모달 뒤로가기 버튼에 **접근가능한 이름이 0건**이고, 계획서 §NOT Building 이 그 자리에 적은 「아이콘만으로 서고 `aria-label` 이 이름을 진다」가 **거짓**이다. — **판정**: 실측 3건으로 확정했다. `insuniverse-site/front/src/shared/ui/Modal.tsx:75-81` `const ModalBackButton = ({ onClick }) => (<button type="button" className="back-btn" onClick={onClick}>{Svg.BackIcon}</button>)` 에 `aria-label` 이 없고, `Svg.tsx:210` 의 `BackIcon` 은 `<title>` 도 `aria-label` 도 없는 순수 `<svg>` 이며, 저장소 전역에서 `backFn` 을 넘기는 호출부는 **이 창이 처음**이다(착수 앵커 `6f9bfac5` 기준 0건). 곧 WCAG 4.1.2 위반 컨트롤을 **이 마일스톤이 앱에 처음 도달 가능하게 만든다** — 「기존 결함」이 아니다. 같은 결함이 `ModalCloseButton` 에도 있으나 그쪽은 형제 넷이 이미 렌더하므로 선재 결함이다. 최소 수정은 `ModalBackButton` 에 `aria-label` 한 줄이고, 그 변경은 형제 넷의 **출력을 한 노드도 안 바꾼다**(넷은 `backFn` 미전달이라 그 분기가 노드 0건을 낸다 — D7 이 `GroupDetailModal` 에 대해 편 것과 같은 논증). 다만 그 한 줄이 게이트 `#7` 술어 3(`shared/ui/Modal.tsx` 앵커 바이트 동일)과 §NOT Building 을 동시에 깬다. 인수처: 사람이 판단할 자리 — 이 창에서 예외를 열거나, `Modal.tsx` 를 여는 별도 창 · id=m8-back-btn-no-accessible-name |
| 2026-09-11 | MEDIUM | .claude/plans/drug-diag-api-m8.plan.md | **[분류 B]** Implement-Codex R1 impeccable critique A2: 3단계 부제가 **읽기 필수 정보를 시스템 자신의 활자 하한 아래**에 둔다. — **판정**: 지적은 참이고 근거가 이 저장소 안에 있다. `DESIGN.md:203` 「**The 1.6 Floor Rule.** 읽어야 하는 텍스트는 1.6rem 아래로 내려가지 않는다. 그 아래는 라벨과 날짜의 자리다」 대 `style_new.css:1464-1470` `.group-detail-modal .modal_head h2 .gdm-head-period { color:#888; font-size:1.4rem }`. D2 의 개정분이 3단계 제목을 분류명으로 바꾸면서 **상병명을 제목 크기에서 1.4rem 부제로 강등**했고, 그 상병명이 3단계에서 「지금 어느 상병 안인가」를 말하는 유일한 자리다. 이 창에서 못 고치는 이유 둘: 부제 문면을 줄이는 길은 D2 가 형태를 명시한 자리라 계획서와 어긋나고(`주치료 N · 약품 N종 · 상병명 (dxCode)`), CSS 로 고치는 길은 모달 헤더가 `.ans003-dx` 스코프 **밖**이라 게이트 `#5`(신설 선언 전건 `.ans003-dx` 접두)가 정당하게 막는다. 인수처: 모달 헤더 활자를 여는 창 — 같은 자리에서 `#888` 의 대비(흰 면 3.5:1)도 함께 본다 · id=m8-subtitle-below-type-floor |
| 2026-09-11 | MEDIUM | .claude/plans/drug-diag-api-m8.plan.md | **[분류 B]** Implement-Codex R1 impeccable critique A1: 읽기 폭 상한이 근거로 든 문제를 **부분만** 없앤다. — **판정**: D3 의 주장(「그 폭이 640px 안으로 모인다」)은 참이고 게이트 `#6` 이 그것을 문다. 그러나 라벨–값 사이 빈 자리의 **원인**은 폭 자체가 아니라 `style_new.css:1489-1495` `.group-detail-modal .gdm-card-row { justify-content: space-between }` 이고, 640px 안에서도 짧은 라벨(`진료시작일`)과 짧은 값이 양 끝으로 벌어지는 것은 그대로다 — 상한은 1,000px 을 ~400px 으로 줄일 뿐 0으로 만들지 않는다. 이 창에서 안 고치는 이유: D3 이 「남는 폭은 여백으로 두고 한 단을 유지한다」로 형태를 정했고, 행 레이아웃을 바꾸는 것은 형제 탭 넷이 공유하는 `.group-detail-modal .gdm-card-row` 를 건드리거나 그 위에 스코프 예외를 하나 더 쌓는 일이라 D7 의 「한 뼘」 경계 밖이다. 선례는 같은 파일에 이미 있다 — `style_new.css:2715` 가 판정 사유 행 하나만 `display:block` 으로 쌓는다. 인수처: 넓은 폭의 카드 행 리듬을 여는 창 · id=m8-reading-cap-leaves-dead-space |
| 2026-09-11 | LOW | .claude/plans/drug-diag-api-m8.plan.md | **[분류 B]** Implement-Codex R1 impeccable critique A3: 2단계에서 강조색이 **대부분의 카드에서 사라진다**. — **판정**: 설계가 스스로 인정한 교환이고 살아 있는 결함은 아니다. `ownedBuckets` 는 분류 카드가 가진 구획만 세는데(D1), 1종 묶음이 표본의 다수이고 그 한 구획이 `주치료` 일 확률은 1/4 남짓이다 — 곧 2단계 행 다수가 무채로 서고, 상병 목록이 한 화면 앞에서 훈련시킨 「강조 하나 = 여기를 읽어라」 단서가 한 층 내려가면서 조용히 멈춘다. 제약 안에서 남은 색·토큰 레버가 0이라(UI6 · `#10`) 이 창에서 기계로 고칠 자리가 없다. 인수처: FC 파일럿 관찰 — 계획서 Acceptance 의 `(미검증)` 행과 같은 성격이다 · id=m8-accent-fades-at-level-2 |

<!-- ── drug-diag-api-m8 구현 로컬 리뷰(`/mccp:code-review` Local Review Mode · 2026-09-11) ──
     HIGH 2 · MEDIUM 3 · LOW 4 를 전건 수용해 같은 창에서 흡수했고, 아래 한 건만 이월한다.
     이월 사유는 판단 유보가 아니라 **실측 불가**다 — 고치려면 먼저 재야 하는 값이 있고
     이 워크트리에 그 DB 자격증명이 없다. -->
| 2026-09-11 | MEDIUM | insuniverse-server/apps/api/src/modules/medication-standard/medication-standard.repository.ts | **[분류 B]** 로컬 리뷰: `findEfficacyByDrugNames` 가 `idx_msc_code` 를 타지 못한다 — `REPLACE(msc_code,' ','') COLLATE utf8mb4_general_ci IN (...)` 은 컬럼을 함수로 감싸므로 인덱스가 죽고 매 호출이 `tc_medication_standard` 전체 스캔이다. 판정 화면을 열 때마다 붙는 쿼리다. — **판정**: 이 창의 선택은 그래도 개선이다(기존 `aspEfficacy` 상관 서브쿼리는 처방 행마다 같은 스캔을 1회씩 돌았고, 이쪽은 실행당 1회다). 그러나 그 말은 테이블이 작을 때만 서고, **행 수를 재지 못했다** — 이 워크트리에 stg DB 자격증명이 없다(`.env` 부재 · 인접 워크트리 접근 불가). 재지 않은 채 스키마를 바꾸는 것은 INV4 가 막는 자리이므로 마이그레이션을 넣지 않았고, 대신 그 사실과 인수 조건을 메서드 주석에 박았다. 인수처: DB 접근이 있는 창 — `SELECT COUNT(*) FROM tc_medication_standard` 를 먼저 재고, 큰 값이면 `REPLACE(msc_code,' ','')` 를 생성 컬럼으로 굳혀 인덱스를 얹는다. 결정성 축(`ORDER BY` 부재)은 같은 라운드에서 `asc(mscId)` 로 이미 닫았다 · id=m8-efficacy-lookup-fullscan |
<!-- ── drug-diag-api-m9 (마일스톤 9) R1 — 사용자 지시로 1라운드에서 끊고 이월한 지적 ──────────
     receipt: .claude/receipts/mccp-plan-codex/drug-diag-api-m9.json
     verdict: divergent (봉인 그대로 · converged=false) · 사유: 사용자 지시 「1라운드만 돌리고 backlog 에 기록,
              divergent 로 receipt 를 작성해서 진행」(2026-09-14). 원장 rounds_so_far=1 · 설정 cap=3 — 캡 소진이
              아니라 **지시에 의한 절단**이다. R2 는 돌리지 않았다.
     plan_hash: sha256:455366bd0618360ee336f6904e79ed4c195e9ecd27ae9af9cf8f2fe9dbe8020c (리뷰 시점과 현재 일치 · 재실측)
     L2: 2026-09-11 발화 · 4/4 fail · findings 16건(HIGH 5 · MEDIUM 9 · LOW 2) · quorum 3/4 미달
     L3: 2026-09-14 발화 · `classification=ok verdict-source=structured` · **divergent** · findings 3건(high 2 · medium 1).
         셋 전부 L2 지적과 겹친다(F1 · F8 · F12) — 교차모델 **확인**이고 새 축은 0건이다.
     원문: .claude/reviews/plan-review-drug-diag-api-m9.md · .claude/state/plan-review/l3-findings.json
     `backlog-append` CLI 는 `single_pass_reason` 이 있을 때만 적재하므로 이 경로에서는 0건이다.
     아래는 전역 CLAUDE.md §mccp 규칙대로 **직접** 적재한 전건 16 이다(L3 3건은 겹치는 행에 병기):
       A = 계획서가 닫아야 함 — 구현자가 계획서 문면을 따르면 오히려 그 결함에 빠진다
       B = 구현 시 흡수      — 계획서 방향은 옳고, 게이트·코드에서 채워지는 자리다
       C = 범위 밖          — 살아 있는 결함 0건. 이름 있는 사각지대로 넘긴다
     계획서는 receipt 의 plan_hash 에 결박돼 있어 이 창에서 고치지 않는다. A 는 구현이 **문면을 이탈해**
     흡수하고 그 이탈을 구현 보고서에 적는다 — 이탈을 적지 않으면 다음 리뷰의 지적이 된다. -->
| 2026-09-14 | HIGH | .claude/plans/drug-diag-api-m9.plan.md | **[분류 A]** L2 architect F1 + L3 Codex high: 2단 그리드가 M8 의 읽기 폭 상한 `max-width: 64rem` 래퍼 **안쪽**에 서므로 34rem + minmax(0,64rem) 가 640px 에 갇힌다 — Acceptance(왼쪽 34rem ±2px · 쓰이는 폭 > 좁은 폭 본문)가 계획서대로 구현하면 성립 불가다. — **판정**: 참이다. Task 5 가 열거한 신설 CSS 셋에 래퍼 상한 해제가 없고 §NOT Building 은 「상한 철회 안 함」만 적는다. 흡수 방향: 2단 상태에서만 래퍼 상한을 두 칸 + 간격으로 재정의하고 64rem 상한은 오른쪽 칸이 진다(좁은 폭 상한은 불변 — 철회가 아니다) · 증거 insuniverse-site/front/public/css/style_new.css:2878-2881 · insuniverse-site/front/src/features/analysisDetailView/ui/ANS003/ANS003BDiagnosis.tsx:839 · id=m9-r1-f1-split-inside-64rem-cap |
| 2026-09-14 | MEDIUM | .claude/plans/drug-diag-api-m9.plan.md | **[분류 C]** L2 architect F2: 관측 G 가 `#1` 을 「착수 전 붉다」에 넣었으나 `#1` 은 이미 초록이고 Task 9 는 diff 0줄이다. — **판정**: 참이나 살아 있는 결함 0건이다. PRD 9행 `in-progress` 전이는 계획 저작 시점에 작업 트리에 이미 들어갔고(커밋 전), `#1` 은 그 상태를 정확히 문다. 문면 오류는 관측 G 한 줄뿐이다 · 증거 .claude/prds/drug-diag-api.prd.md 9행(작업 트리 diff +1행) · id=m9-r1-f2-check1-already-green |
| 2026-09-14 | MEDIUM | .claude/plans/drug-diag-api-m9.plan.md | **[분류 B]** L2 architect F3: `DxClassList` 의 `selected` prop 이 상태 `selectedClass` 를 받으면 모달을 연 직후(`null`) 자동 선택된 첫 분류가 목록에서 표시되지 않는다 — UI7 이 깨진다. — **판정**: 참이다. 계획서는 prop 형만 적었고 전달값은 비워 두었다. 흡수: 전달값을 파생값 `openClass?.name` 으로 결속한다(D3 의 정본이 파생값이므로) · 증거 insuniverse-site/front/src/features/analysisDetailView/ui/ANS003/ANS003BDiagnosis.tsx:707 · :744-745 · id=m9-r1-f3-selected-binds-derived |
| 2026-09-14 | MEDIUM | .claude/plans/drug-diag-api-m9.plan.md | **[분류 A]** L2 architect F4: D3 「좁아지면 목록이 선다」와 Acceptance 「넓은 폭에서 좁은 폭으로 바뀌면 목록 단계로 되돌아간다 — #7」 은 2단에서 분류를 고른 뒤 좁아지는 경로에서 거짓이다(그때는 상세 단계가 선다). — **판정**: 문면이 조건을 빠뜨렸다. 동작 자체(사용자가 고른 분류를 좁은 폭에서도 유지)는 옳다고 본다 — 되감으면 사용자의 선택을 버린다. 흡수: 동작은 유지하고, 미선택 경로 축(`m9-resize-wide-to-narrow-falls-back-to-the-list-stage`)과 별도로 선택-후-축소 경로를 테스트 1건으로 문다 · 증거 insuniverse-site/front/src/features/analysisDetailView/ui/ANS003/ANS003BDiagnosis.tsx:723-726 · id=m9-r1-f4-select-then-narrow |
| 2026-09-14 | HIGH | .claude/plans/drug-diag-api-m9.plan.md | **[분류 A]** L2 security F5: M9 의 무결성 술어 전체(`#3`·`#4`·`#10`)가 가변 파일의 `site_anchor_commit` 한 필드에 매달려 있고, m8 이 세운 앵커 치환 방지 항체(`cat-file -e` · `merge-base --is-ancestor`)가 M9 에서 빠졌다 — 앵커를 변경이 들어간 커밋으로 바꾸면 세 검사가 공허 초록이다. — **판정**: 참이다(`anchor()` 는 40자 hex 형식만 본다). 흡수: `anchor()` 에 앵커 커밋 실재 + 서브모듈 HEAD 조상 검사를 되살린다. 남는 사각지대 — 조상이면서 이미 변경이 들어간 커밋으로 앵커를 옮기는 경로는 조상 검사로도 못 잡으므로 앵커 파일의 git 이력(계획서 커밋 이후 무변동)을 함께 문다 · 증거 .claude/plans/drug-diag-api-m9.gates.mjs 의 `anchor()` · .claude/plans/drug-diag-api-m8.gates.mjs 검사 `#7` · id=m9-r1-f5-anchor-ancestry-dropped |
| 2026-09-14 | MEDIUM | .claude/plans/drug-diag-api-m9.plan.md | **[분류 B]** L2 security F6: `#11` 의 도구 부재 실패 문면이 절대 홈 경로(`/home/<사용자>/.cache/ms-playwright` · `/.npm/_npx`)를 그대로 찍고, Acceptance 가 출력 전문을 보고서에 인용하라고 요구하므로 사용자명이 커밋 산출물에 들어갈 수 있다. — **판정**: 참이다. m5c 가 세운 `~` 접기 규약이 승계되지 않았다. 흡수: `die()` 문면에서 `HOME` 을 `~` 로 접는다 · 증거 .claude/plans/drug-diag-api-m9.gates.mjs 검사 `#11`(`pwBase` · `npxBase` 문면) · .claude/plans/drug-diag-api-m5c.gates.mjs 의 HOME 접기 · id=m9-r1-f6-home-path-in-die |
| 2026-09-14 | LOW | .claude/plans/drug-diag-api-m9.plan.md | **[분류 C]** L2 security F7: probe 의 「예외 문면에는 파일 경로가 실린다」 주석이 실제 `fail()`(토큰·인덱스만)과 어긋난다. — **판정**: 주석 부정확이며 동작 결함 0건이다. 실제 유출 자리는 F6 이고 거기서 흡수한다 · 증거 .claude/plans/drug-diag-api-m9.probe.mjs 의 `fail` 정의와 그 아래 주석 · id=m9-r1-f7-probe-comment-drift |
| 2026-09-14 | HIGH | .claude/plans/drug-diag-api-m9.plan.md | **[분류 A]** L2 test F8 + L3 Codex medium: Acceptance 「경계값 1100px 에서는 2단이 안 선다 — #11」 은 반증 불가능하다. probe 가 **자기 리터럴** `w > 1100` 로 좁은 스냅샷을 고르므로 1100px 에서 `n.split` 은 구현과 무관하게 거짓이고, 좁은 스냅샷이 어느 innerWidth 에서 떠내졌는지도 아무도 안 본다. fan-out HIGH 「경계 전이 테스트 없음」의 ABSORBED 선언이 성립하지 않는다. — **판정**: 참이다. 흡수: 스냅샷을 **폭 이름으로** 떠낸다 — 테스트가 실제 컴포넌트를 1440·1100 각 innerWidth 에서 렌더해 `m9-snapshot-<폭>.html` 로 떨구고, probe 는 받은 폭의 파일을 그대로 연다(선택 로직 0). 그러면 컴포넌트가 `>=` 로 발화할 때 1100 스냅샷에 2단이 실려 `#11` 이 붉어진다 · 증거 .claude/plans/drug-diag-api-m9.probe.mjs 의 `const which = w > 1100` · id=m9-r1-f8-boundary-unfalsifiable |
| 2026-09-14 | MEDIUM | .claude/plans/drug-diag-api-m9.plan.md | **[분류 A]** L2 test F9: D2 「발화 축은 하나」와 `#4` 「브레이크포인트 리터럴 1자리」가 사실이 아니다 — 세 번째 사본이 probe 안에 있고 일치를 보는 검사가 없다. — **판정**: F8 과 같은 뿌리다. F8 흡수(probe 가 폭 선택을 안 한다)로 사본 자체가 사라진다 · 증거 .claude/plans/drug-diag-api-m9.probe.mjs 의 `w > 1100` · id=m9-r1-f9-third-literal |
| 2026-09-14 | MEDIUM | .claude/plans/drug-diag-api-m9.plan.md | **[분류 B]** L2 test F10: `#10` 이 「jsdom 기본 폭 1024 < 1100 라 M8 축은 좁은 폭을 본다」를 출력으로 **주장**만 하고, Task 6 의 `innerWidth` 조작 뒤 복원(afterEach)을 요구하는 검사가 없다 — M8 축이 바이트 동일한 채로 넓은 폭에서 돌 수 있다(층위 7). — **판정**: 참이다. 흡수: 테스트가 `innerWidth` 를 afterEach 에서 원래 값으로 되돌리고, `#10` 은 1024 를 리터럴로 찍는 대신 복원 코드의 실재를 문다 · 증거 .claude/plans/drug-diag-api-m9.gates.mjs 검사 `#10` 말미 `say()` · id=m9-r1-f10-jsdom-width-claim |
| 2026-09-14 | MEDIUM | .claude/plans/drug-diag-api-m9.plan.md | **[분류 C]** L2 test F11: Acceptance 「넓은 폭 뒤로가기 0건 · 좁은 폭 상세 단계 1건 — #8·#11」 의 후반부를 `#11` 이 안 본다(`n.back` 미판독). — **판정**: `#11` 인용은 과잉이지만 사각지대는 없다 — `#8` 이 축 `m9-narrow-detail-stage-still-renders-back-button` 으로 같은 술어를 jsdom 에서 문다. 살아 있는 결함 0건 · 증거 .claude/plans/drug-diag-api-m9.gates.mjs `M9_AXES.back` · id=m9-r1-f11-narrow-back-cite |
| 2026-09-14 | HIGH | .claude/plans/drug-diag-api-m9.plan.md | **[분류 B]** L2 invariant F12 + L3 Codex high: `#11` 이 probe 산출 `m9-probe.json` 을 실행 전에 지우지 않고 probe 의 `r.status` 도 안 본다 — probe 가 쓰기 전에 죽으면 이전 성공 실행의 낡은 JSON 으로 표제 주장 전건이 초록이 된다. 게이트 기계 자신의 고장이 승인으로 끝나는 경로다. — **판정**: 참이다(스냅샷에만 「존재가 곧 신선함」 원칙을 적용했다). 흡수: 실행 전 `out` 을 unlink 하고 `r.error`·`r.signal`·`r.status≠0` 을 먼저 거부한다 · 증거 .claude/plans/drug-diag-api-m9.gates.mjs 검사 `#11` 의 unlink 목록과 `run("node", [PROBE…])` 뒤 판독 · id=m9-r1-f12-probe-json-staleness |
| 2026-09-14 | HIGH | .claude/plans/drug-diag-api-m9.plan.md | **[분류 B]** L2 invariant F13: `#5` 의 신설 선택자 파서가 `{` 로 끝나는 줄만 본다 — 여러 줄 선택자 목록의 앞줄(`,` 로 끝남)과 한 줄 규칙이 빠져 「공유 스코프 신설 0건」이 `.group-detail-modal .x,\n.ans003-dx .y {` 한 형태로 우회된다. — **판정**: 참이다. 흡수: 신설 CSS 에서 주석을 지운 뒤 `}` 와 `{` 사이 선택자 텍스트를 줄 경계와 무관하게 떠내 `,` 로 쪼갠 **각 선택자**를 스코프 대조한다 · 증거 .claude/plans/drug-diag-api-m9.gates.mjs 검사 `#5` 의 `.filter((l) => /\{\s*$/.test(l))` · id=m9-r1-f13-selector-parser-line-bound |
| 2026-09-14 | MEDIUM | .claude/plans/drug-diag-api-m9.plan.md | **[분류 B]** L2 invariant F14: Risks 표가 「jsdom 기본 폭이 바뀌면 M8 축이 조용히 2단을 잰다」를 `#10` 이 문다고 적었으나 `#10` 은 소스의 `width >` 문자열만 보고 1024 는 검사 없는 리터럴이다(INV4). — **판정**: F10 과 같은 뿌리이며 같은 흡수로 닫는다 · 증거 .claude/plans/drug-diag-api-m9.gates.mjs 검사 `#10` · id=m9-r1-f14-jsdom-literal-inv4 |
| 2026-09-14 | MEDIUM | .claude/plans/drug-diag-api-m9.plan.md | **[분류 B]** L2 invariant F15: `#6` 이 16진 색만 센다 — `rgb()`·`hsl()`·이름 색으로 신설 색을 넣으면 0건으로 집계되어 「신설 색 전건 frontmatter 안」 초록이 거짓이 된다. — **판정**: 참이다. 흡수: 신설 CSS 의 `rgb(`·`rgba(`·`hsl(`·`hsla(` 출현과 색 속성 값의 이름 색을 계수해 0건을 요구한다(이 창이 쓰는 표기는 16진뿐이다) · 증거 .claude/plans/drug-diag-api-m9.gates.mjs 검사 `#6` 의 `css.match(/#[0-9a-fA-F]{3,8}\b/g)` · id=m9-r1-f15-non-hex-colors |
| 2026-09-14 | LOW | .claude/plans/drug-diag-api-m9.plan.md | **[분류 B]** L2 invariant F16: `gates.mjs` 디스패치가 `checks` 를 `{}` 리터럴로 두어 `constructor`·`toString` 을 알려진 검사로 받는다 — 검사 0건에 rc=0. `.gates.sh` 의 KNOWN 화이트리스트는 이 파일을 직접 부르는 경로에 없다. — **판정**: 참이다. 흡수: `Object.hasOwn(checks, name)` 으로 판정한다 · 증거 .claude/plans/drug-diag-api-m9.gates.mjs 말미 디스패치 `!checks[name]` · id=m9-r1-f16-proto-dispatch |
| 2026-09-14 | MEDIUM | .claude/plans/drug-diag-api-m9.plan.md | **[implement security S6 · DEFER]** `#11` 이 `~/.npm/_npx/*` 에서 집는 `playwright-core` 버전을 핀하지 않는다 — chromium revision 과 어긋날 수 있다. 이 창은 정렬 + 선택 버전 표기까지만 한다. 핀의 기준값(허용 버전)이 저장소 어디에도 없어 새 리터럴을 박으면 INV4 가 된다 · 증거 .claude/plans/drug-diag-api-m9.gates.mjs 검사 `#11` 의 `npxBase` 탐색 · id=m9-impl-s6-pwcore-unpinned |
| 2026-09-14 | MEDIUM | .claude/plans/drug-diag-api-m9.plan.md | **[implement 발견 · DEFER]** D6 의 비색 축(선택 카드는 진입 아이콘을 안 낸다)이 **2단에서 키보드 포커스를 떨군다** — 목록 카드의 진입 버튼에 포커스를 두고 Enter 로 고르면 그 카드가 선택되며 버튼이 언마운트되어 포커스가 `body` 로 간다(WCAG 2.4.3). 좁은 폭은 상세 단계로 화면이 바뀌는 기존 동작이라 해당 없음. 이 창에서 안 고친 이유: 계획서 D6 이 아이콘 부재를 비색 축의 정의로 명시했고 `#9` 가 그 축을 문다 — 고치려면 D6 을 바꾸거나(아이콘 유지 + 다른 비색 표시) 선택 직후 오른쪽 칸으로 포커스를 옮기는 새 동작을 들여야 하며, 둘 다 사람의 결정이다 · 증거 insuniverse-site/front/src/features/analysisDetailView/ui/ANS003/ANS003BDiagnosis.tsx 의 `DxClassList` `selected !== cls.name &&` 분기 · id=m9-impl-split-focus-loss-on-select |
| 2026-09-14 | RESOLVED(로컬 코드 리뷰) | .claude/plans/drug-diag-api-m9.plan.md | 위 `id=m9-impl-split-focus-loss-on-select` 항목은 닫혔다. 사용자가 리뷰 지적 전건 수용을 지시했고, 두 선택지 중 **D6 을 안 바꾸는 쪽**(포커스 이동)을 골랐다 — `handleSelectClass` 가 오른쪽 칸(`tabIndex={-1}`)으로 `focus({ preventScroll: true })` 한다. 진입 아이콘 노드 수가 그대로라 `#9` 비색 축은 불변이다. 렌더 축 `m9-wide-keyboard-selection-moves-focus-to-the-detail-panel` 을 `M9_AXES.select` 에 등재했고, `focus()` 줄 삭제 사본에서 그 축이 `activeElement === body` 로 붉음을 실행해 확인했다 · 증거 insuniverse-site/front/src/features/analysisDetailView/ui/ANS003/ANS003BDiagnosis.tsx 의 `handleSelectClass` |

## santa-loop R0 (drug-diag-api-m9 · 2026-09-14) — DEFER 4건

blocking 아님. 현재 구현에 해당 사례가 0건이라 이 창에서 흡수해도 반사실을 못 만든다.
출처는 Reviewer A(`silent-failure-hunter` · blind lane) 의 suggestion 이며 원문은
`.claude/notes/drug-diag-api-m9.md` §santa-loop R0 에 있다.

| id | 지적 | 층위 | 이연 사유 |
|---|---|---|---|
| m9-r0-atrule-scope | `#5` 의 블록 정규식이 at-rule 래퍼를 못 본다 — `@supports`·`@container` 조건은 선택자가 안 되고 `#4` 는 `@media` 만 센다. D2 「발화 축은 하나다」를 일반으로 지키려면 `#4` 를 `@(media\|container\|supports)` 로 넓힌다 | 7 | 신설 CSS 에 at-rule 0건이라 반사실 대상이 없다. 다음 창이 CSS 축을 더할 때 함께 |
| m9-r0-breakpoint-anchor | `#2` 의 발화 폭 대조가 `new RegExp(String(1100))` — 앵커 없는 부분문자열이라 `11000`·`21100` 도 통과한다. `\b1100\b` 로 | 8 | DESIGN.md 예외 문면에 다른 4자리 수가 0건이라 현재 오탐·누락 0. 한 토큰 변경이며 다음 손질 때 |
| m9-r0-self-path | `#3` 의 `exec*` 자기감사가 `SELF` 를 하드코딩 상대경로로 읽는다. m10 으로 하네스를 복사하면 사본이 m9 파일을 감사하고 0 을 보고한다. `import.meta.url` → `fileURLToPath` | 8 | 복사가 아직 없다. 복사하는 창이 그 자리에서 받는다 |
| m9-r0-changed-set | `#3` 의 동결은 **이름으로 센 8건**이고, 앵커 대비 서브모듈 **변경 파일 집합**이 선언한 셋인지는 안 본다 — 이름에 없는 파일(`DrugDetailCards`·`BucketSummaryNotice`·`GroupMetricRow`)이 움직이면 안 걸린다 | 8 | 이 창의 실제 변경 집합이 선언한 셋과 일치함은 A 가 독립 확인했다(실측). 집합 대조는 §Files to Change 파서가 필요해 이 창의 사정거리 밖 — 사각지대로 `#3` 출력에 적었다 |

## santa-loop R1 (drug-diag-api-m9 · 2026-09-14) — DEFER 6건

루프는 `patch_chasing` 으로 종결됐다(`terminate=true`). 아래는 blocking 이 아니고, 앞 6건은
현재 구현에 해당 사례가 0건이라 반사실을 못 만든다. 마지막 1건은 **구조적으로 이 창에서 못 고친다**.

| id | 지적 | 층위 | 이연 사유 |
|---|---|---|---|
| m9-r1-comment-strippers | 주석 제거기가 하네스에 세 벌이다 — `codeOnly`(JS/TSX) · `addedCss` 의 줄 필터(CSS) · `check5` 안의 문자 스캐너. 셋이 같은 이름의 일을 다른 규칙으로 하고 그 차이가 어느 검사에 영향을 주는지 안 적혀 있다 | 7 | CSS 쪽 둘을 합치면 `#5` 의 중괄호 추적과 `#4`·`#6` 의 스캔 대상이 정의상 같아진다. 현재 불일치로 인한 오판 0건 |
| m9-r1-exception-window | `#2` 가 네 술어(원문 실재·`예외`·식별자·발화 폭)를 규칙 뒤 1,200자 창 안에서 **각각 독립으로** 찾는다. 넷이 같은 문단일 것을 강제 안 하므로 예외 문단이 지워지고 무관한 규칙이 들어와도 우연히 통과할 수 있다 | 6 | 현재 DESIGN.md 에서 넷이 한 문단이다. `after` 를 다음 빈 줄까지로 좁히는 것이 고침 |
| m9-r1-inner-cap-literal | `style_new.css:2946` 의 `min(64rem, 1140px)` 상한은 `#11` 의 어느 조건에서도 발화하지 않는다(비2단 경로 루트 10/15/17.5px → 64rem 이 640/960/1120px). 2950행의 같은 상한만 WIDE 에서 발화한다 — 같은 리터럴 두 자리 중 한쪽만 실행된다 | 8 | 사용자 정의 속성 한 자리(`--dx-inner-cap`)로 뽑으면 두 자리가 갈릴 수 없다. CSS 수정이라 서브모듈 커밋이 따라온다 |
| m9-r1-test-comment-1006 | `ANS003B.test.tsx:1006` 주석이 「2단 여부를 여기서 단언하지 않는다 — 단언하려면 브레이크포인트를 이 파일에 한 번 더 적어야 한다」는데, 같은 블록 897~900행이 이미 `1100` 을 적고 2단 여부를 단언한다 | 1 | 주석이 겨냥한 규범이 파일 안에서 이미 깨졌다. 서브모듈 수정이라 별도 커밋 |
| m9-r1-check3-count | `#3` 의 사각지대 줄이 「이름으로 센 7 + 1」이라 적는데 그 검사가 세는 것은 3(공용) + 4(소비자) = 7 이고 `+1`(훅 파일)은 `#4` 가 센다 — 검사 경계를 넘어 세는 계수라 `#3` 출력만 보고 대조할 수 없다 | 8 | 문면 정정이며 판정에 영향 0. 다음 손질 때 |
| m9-r1-plan-axis-count | 계획서 Task 6(224행)이 「축 아홉 · 2단 3건 · 경계 2건 · 뒤로가기/X 3건 · 선택 표시 2건」인데 실제 `M9_AXES` 는 split 3 · back 3 · select 3 · edge 3 · snapshot 1 = **13** 이다 | 2 | **구조적 불가** — 계획서 본문을 고치면 `plan_hash` 가 `455366bd` 에서 움직여 `mccp-plan-codex`·`mccp-implement-codex` receipt 가 동시에 stale 이 되고, 커밋된 receipt 는 덮어쓸 수 없다. 그 줄이 이미 「이름은 `.gates.mjs` 의 `M9_AXES` 가 정본」이라 적어 정본 위임은 서 있다. 새 slug 를 여는 창에서 받는다 |
| 2026-09-09 | LOW | .claude/plans/ai-insight-report-m1.plan.md | **security-reviewer(구현 R1) — `#11` 이 SIGKILL 되면 변이체가 소스에 남는다.** 반사실 검사가 `ANS015Panels.tsx` 를 제자리에서 변이시키고 `finally` 로 되돌리는데, 그 사이에 프로세스가 강제 종료되면 `point_say_MUTANT` 가 파일에 남는다. 추적 파일이라 `git checkout` 으로 회수되고 복원 확인 코드도 있어 LOW 다. 인수처: 변이 전에 잠금·복구 표식을 남겨 다음 실행이 스스로 되돌리게 하는 창 · id=ai-m1-gate11-sigkill-mutant |
| 2026-09-09 | LOW | .claude/plans/ai-insight-report-m1.plan.md | **Implement-Codex R1 next_step — 구현 diff 를 놓고 다섯 구현 결정을 다시 보라.** R1 호출 시점에 `ANS015` 가 아직 `() => null` 이라 Codex 가 결정 자체를 검증하지 못했다(«구현은 현재 트리에 없다»). 라운드 캡 1 이 봉인돼 있어 이 창에서 R2 는 존재하지 않는다. 인수처: M2 착수 시 M1 diff 를 함께 넣어 교차모델 재검토하는 창 · id=ai-m1-codex-r2-on-real-diff |
| 2026-09-09 | LOW | .claude/plans/ai-insight-report-m1.plan.md | **디자인 게이트가 미추적 신규 파일에 대해 돌지 않는다.** `impeccable-detect` 의 `design_signal` 축이 추적 diff 만 읽어, 이 창처럼 `.tsx`·`.css` 를 전부 새로 만드는 경우 `silent_skip=true · reason=no-signal` 이 된다 — 「디자인 표면이 없다」가 아니라 「탐지기가 못 본다」다. 이 창에서는 레퍼런스가 디자인 정본이라 손실이 아니었으나 다음 창에서는 아니다. 인수처: 상류 mccp 에 미추적 파일 스캔을 제기하거나 `MCCP_DESIGN_INTENT_REASON` 을 운용 규약에 넣는 창 · id=ai-m1-impeccable-untracked-blind |
| 2026-09-09 | HIGH | .claude/plans/ai-insight-report-m2.plan.md | L2 architect: `resolveInsightState` 의 판별 규칙이 이 계획이 스스로 «핵심» 이라 부른 구분(만료 vs 원래 진료 없음)의 한 사분면에서 확실히 틀린다. 규칙은 «진료 0건 + 분석 나이 > 30일 → expired» 인데, 원래부터 진료가 0건이었던 분석은 31일째부터 자동으로 `expired` 로 뒤집힌다. 즉 진료 기록… · 원문 .claude/reviews/plan-review-ai-insight-report-m2.md · id=02f40665 |
| 2026-09-09 | FAIL | .claude/plans/ai-insight-report-m2.plan.md | L2 architect: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ai-insight-report-m2.md · id=8964825e |
| 2026-09-09 | HIGH | .claude/plans/ai-insight-report-m2.plan.md | L2 test: 실제 생산자(`analyze.repository.ts` 인사이트 입력 조회)의 산출 형상·컬럼 매핑을 반증하는 검사가 하나도 없다. `request-is-byte-stable` 은 손으로 기록한 fixture 입력에 매퍼를 재생할 뿐이고, 그 fixture 가 저장소가 실제로 내는 것과 같은지는 어떤 게이트도 묻지 않는다 — 내 렌즈의 전… · 원문 .claude/reviews/plan-review-ai-insight-report-m2.md · id=a1c48260 |
| 2026-09-09 | FAIL | .claude/plans/ai-insight-report-m2.plan.md | L2 test: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ai-insight-report-m2.md · id=b6de352c |
| 2026-09-09 | HIGH | .claude/plans/ai-insight-report-m2.plan.md | L2 invariant: Task 1 의 「러너 산출을 읽지 못하면 빈 동결본을 쓰지 않고 --baseline 자체가 비0 으로 멈춘다」는 코드와 반대다. writeBaseline 은 판독 불가 여부를 검사하기 **전에** 두 동결본을 이미 디스크에 쓴다. 그 결과 `failing: []` · `suites: []` · `_unreadable: true`… · 원문 .claude/reviews/plan-review-ai-insight-report-m2.md · id=3862efbf |
| 2026-09-09 | HIGH | .claude/plans/ai-insight-report-m2.plan.md | L2 invariant: `--rebaseline` 이 회귀 게이트(`#11`·`#13`)를 구현 수정 없이 초록으로 만드는 열린 길이다. 서브모듈 워킹트리에 미커밋 구현을 둔 채 `--rebaseline` 을 돌리면 `observedHeads()` 는 여전히 앵커 HEAD 를 관측하므로 `judgeBaselineHead` 가 통과하고, 그 시점의 신규 … · 원문 .claude/reviews/plan-review-ai-insight-report-m2.md · id=a7e868f5 |
| 2026-09-09 | FAIL | .claude/plans/ai-insight-report-m2.plan.md | L2 invariant: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-ai-insight-report-m2.md · id=bb8736f3 |
| 2026-09-09 | HIGH | .claude/plans/ai-insight-report-m2.plan.md | **교차모델(L3 Codex · R3) — 진료 0건 요청은 API 계약이 거절한다.** 동결 `openapi.json` 의 `InsightFromTreatmentsRequest.treatments` 가 `minItems: 1` 이고 `/insight/treatments` 는 `422` 를 정의한다(실측 확인). 계획은 매 조회마다 POST 를 부르므로 `expired`·`no_treatments` 의 빈 배열 요청이 422 로 거절되고, Task 3 의 「비200 → `unavailable`」 규칙과 결합해 **정상 데이터 부재가 일시 장애로 표시**된다. 유지하기로 한 안내 표도 함께 내려간다. **L2 패널 3라운드가 못 본 축이다.** 인수처: 0건일 때 외부 호출을 생략하고 로컬 상태와 보존된 안내를 반환하도록 Task 3·4 계약을 고치는 창 · id=ai-m2-zero-treatments-422 |
| 2026-09-09 | HIGH | .claude/plans/ai-insight-report-m2.plan.md | **교차모델(L3 Codex · R3) — 나이와 현재 건수로 삭제 이력을 추론할 수 없다.** 원래 진료가 없던 분석과 스윕으로 지워진 분석이 동일한 `analysisAgeDays`·`treatmentCount`·`ddxStatus` 를 갖는다. 삭제는 표식을 남기지 않으므로 순수 함수의 정의역이 두 원인을 원리적으로 구별하지 못한다. L2 architect R3 F1 과 같은 축을 다른 근거로 짚었다(교차모델 합치). 인수처: 수집 결과·삭제 이력을 상태 입력에 넣거나 「원인 미확정」 상태를 두는 창 · id=ai-m2-expired-cause-undecidable |
| 2026-09-09 | MEDIUM | .claude/plans/ai-insight-report-m2.plan.md | **교차모델(L3 Codex · R3) — 응답 해시 사슬에 독립적인 정답이 없다.** `#17` 은 구현자가 만든 응답의 해시를 같은 구현자가 만든 뷰모델의 해시와 비교한다. 최초 응답의 건수·문장·값을 레퍼런스에 맞춰 고르면 그대로 통과하고 `#1` 의 angle·요약 키 검사도 그 선택을 제한하지 않는다 — 사본 일관성은 검증하나 «올바른 변환» 의 외부 검증은 아니다. L2 test R3 F2 와 같은 축. 인수처: 독립 검토한 합성 요청·기준일·룰셋에서 얻은 응답을 복수로 고정하는 창 · id=ai-m2-hash-chain-no-oracle |
| 2026-09-09 | MEDIUM | .claude/plans/ai-insight-report-m2.plan.md | **교차모델(L3 Codex · R3) — 실제 저장소 조회 결과가 필수 검증 밖이다.** `SERVER_SPEC_PATTERN` 이 payload·view·route 스펙만 물어 `analyze.repository.ts` 의 `oddId` 필터 누락이나 조인 중복을 필수 검사가 탐지하지 못한다. **전자는 다른 분석의 의료정보 전송으로 이어진다.** L2 test R3 F1 과 합치. 인수처: 실제 repository 쿼리를 도는 스펙을 패턴과 필수 목록에 넣는 창 · id=ai-m2-repository-query-unspecced |
| 2026-09-09 | MEDIUM | .claude/plans/ai-insight-report-m2.plan.md | **L2 architect R3 F2 — 안내 표 규칙이 자기모순.** `toInsightView` 는 `notices` 를 응답과 별개 인자로 받는데, `unavailable` 에서 안내를 내리는 이유를 「ddx 응답이 없으면 반사할 대상이 없다」로 적었다. 반사 대상은 응답이 아니라 우리가 보낸 입력이고 그것은 `unavailable` 에서도 그대로 있다 — 이유가 함수 정의역과 어긋난다. `notices-follow-state-not-treatments` 가 그 어긋난 규칙을 동결한다. 인수처: 안내 표의 상태별 규칙을 정의역에 맞게 다시 쓰는 창 · id=ai-m2-notices-rule-self-contradictory |
| 2026-09-09 | MEDIUM | .claude/plans/ai-insight-report-m2.gates.mjs | **L2 security R3 F1 — `#4`·`#8` 두 자리가 `names.includes()` 로 남았다.** IDOR 방어 실행 축(`insight-route-rejects-non-canonical-odd-id`)과 PII whitelist 실행 축(`view-drops-person-name-and-identifiers`)이 `it.skip` 으로 건너뛰어도 그 게이트가 초록이다. R2 흡수(`missingOrSkipped`)가 여섯 자리를 배선하면서 이 둘을 빠뜨렸다. 사정거리는 Task 4·5 의 부분 실행이고 전건 실행에서는 `#12` 가 뒤늦게 잡는다. 인수처: 두 자리를 `missingOrSkipped` 로 마저 배선하는 창 · id=ai-m2-skip-blind-in-4-and-8 |
| 2026-09-09 | LOW | .claude/plans/ai-insight-report-m2.gates.mjs | **L2 security R3 F2 — `#7` 의 키 검사가 superproject 를 안 본다.** 이 창이 새로 커밋하는 fixture 4종(`.claude/plans/…request-fixture.json` 등)에 `X-API-Key`·`DDX_API_KEY` 검사가 한 건도 돌지 않는다. 계보가 실제 ddx 프로브이므로 프로브 전사를 굳히면 키가 이력에 남는다. 현재 실현된 유출 0건(실측) — 잔존 위험이다. 인수처: `#7` 의 정의역에 superproject fixture 를 넣는 창 · id=ai-m2-gate7-superproject-blind |
| 2026-09-09 | LOW | .claude/plans/ai-insight-report-m2.plan.md | **L2 architect R3 F3 — `tip` 배지의 값 소유자가 뜬다.** 하위 탭 넷 중 `tip` 만 대응 요약 키가 없는데(`subtabWithoutSummary`), 배지를 상수에서 프롭으로 옮기면서 그 값의 소유자를 어디에도 적지 않았다. 상수를 걷어내는 파일 목록에 `ANS015.fixture.ts` 가 있어 두 소유자 사이에 남는다. PRD §Open Questions 2 가 같은 축을 이미 열어 뒀다. 인수처: `tip` 배지 소유자를 계약에 못 박는 창 · id=ai-m2-tip-badge-owner |
| 2026-09-09 | LOW | .claude/plans/ai-insight-report-m2.gates.mjs | **L2 invariant R3 F3 — `#10` 의 `.css` 정의역이 site 뿐이다.** Acceptance 와 NOT Building 은 「서브모듈에서 변경된 `.css` 0건」으로 서술해 server 트리를 포함하는 것처럼 읽히나 게이트는 `gitSite(...)` 만 쓴다(층위 6). 인수처: 정의역을 넓히거나 주장을 좁히는 창 · id=ai-m2-gate10-site-only |
| 2026-09-09 | LOW | .claude/plans/ai-insight-report-m2.plan.md | **L2 test R3 F2 — `#2` 의 반증력이 동결 응답 1건에 묶인다.** `tableShape.rows` 가 레퍼런스 행수와 상등을 요구하므로 응답 fixture 는 사실상 레퍼런스 형상에 맞춰 저작될 수밖에 없다. 사각지대 6번이 매 실행 공시하므로 은폐는 아니다. 인수처: 위 `ai-m2-hash-chain-no-oracle` 과 같은 창 · id=ai-m2-gate2-single-fixture |
| 2026-09-09 | HIGH | .claude/plans/ai-insight-report-m2.plan.md | 정리 후 소유자 가드가 만료 응답을 차단한다 — `analyze.repository.ts#delete()` 가 `tnOrderDetail.usrId` 를 null 로 만들고 `own-analysis.guard.ts:40-42` 가 소유자 미상을 403 으로 끊는다. `expired` 는 「진료 스윕은 돌고 분석 스윕은 아직」인 창에서만 도달한다. 소유권을 주문→결제→구독→회원 관계로 재설계하는 것은 정회원 라우트 15건 전부를 건드리므로 별도 창 (Codex Implement-R1 F2) |
| 2026-09-09 | MEDIUM | .claude/plans/ai-insight-report-m2.plan.md | 나이와 현재 건수만으로 삭제 원인을 판별할 수 없다 — 원래 빈 분석과 스윕으로 비워진 분석은 `(analysisAgeDays, treatmentCount)` 가 같다. 술어를 바꾸려면 `## Harness Contract` 의 `retention` 과 게이트 `#6`(f) 를 함께 움직여야 한다 (Codex Implement-R1 F3) |
| 2026-09-09 | MEDIUM | .claude/plans/ai-insight-report-m2.plan.md | 분석 스윕이 `tnAnalysisBasic` 을 지우므로 그 뒤에는 안내의 출처 자체가 없다 — 다만 같은 트랜잭션이 `usrId` 를 비워 라우트가 403 이라 화면에 도달하지 않는다. 두 스윕의 주기·기준열이 갈라지는 폭을 실측으로 재는 일이 남는다 (Codex Implement-R1 F4) |
| 2026-09-09 | MEDIUM | .claude/plans/ai-insight-report-m2.plan.md | 「실명 미전송 = 노출 등급 낮음」 프레이밍이 준식별자 조합(진료일 + 의료기관명 + 상병코드)의 재식별 위험을 과소평가한다 — 코드 결함이 아니라 위험 서술 문제이며 PIPA 판정은 법무 검토 소관 (security-reviewer S2) |
| 2026-09-09 | MEDIUM | insuniverse-site/front/vite.config.ts | `loadEnv(mode, process.cwd(), "")` 의 빈 접두가 빌드 프로세스의 `process.env` 전체를 끌어오고 `vite.config.constants.ts` 의 `define: { "process.env": env }` 가 그것을 번들에 정적 치환한다. 저장소 전역의 기존 패턴이며 `VITE_` 접두로 되돌리는 하드닝이 필요하다 (security-reviewer S5) |
| 2026-09-09 | LOW | .claude/plans/ai-insight-report-m2.gates.mjs | 커밋되는 fixture 의 합성 어휘 제약이 `facility_name` 한 필드뿐이다 — `disease_code`·`disease_name`·`treated_on`·`department`·`deductible_amt`·`visit_days`·`occurrences` 7종은 실환자 값을 그대로 굳혀도 걸리지 않는다 (security-reviewer S4) |
| 2026-09-09 | LOW | insuniverse-server/apps/api/src/modules/analyze/analyze.controller.ts | 가드(`Number`)와 파이프(`parseInt`) 분리 패턴이 `AnalyzeController` 의 다른 15개 라우트에도 있으나 이 창은 새 라우트에만 정규형 검사를 더한다 — 일관성 (security-reviewer S6) |
| 2026-09-09 | MEDIUM | .claude/plans/ai-insight-report-m2.plan.md | Task 4·Acceptance 가 `'1e3'` 가드/파이프 발산을 IDOR 로 「실측」 표기했으나 이 컨트롤러의 표준 `ParseIntPipe` 는 `/^-?\d+$/` 게이트를 먼저 통과시켜 `parseInt` 를 부르기 전에 400 이다 — 인과가 거짓이다. 검사 자체는 심층 방어로 유지하되 계획서 문면은 **다음 개정**이 정정해야 한다(봉인된 본문이라 이 창에서 못 고친다). 근거 `.claude/notes/ai-insight-report-m2.md` §S1 |
| 2026-09-09 | LOW | .claude/plans/ai-insight-report-m2.plan.md | `## Files to Change` 가 `analyze-car-visibility.spec.ts`·`analyze-disease-pdf.spec.ts` 를 빠뜨렸다 — Task 4 의 `DdxClient` 주입이 기존 `new AnalyzeService(...)` 호출 2곳을 강제로 고치게 하고 게이트 `#11` 이 그것을 요구한다. `plan-conflict-detector` 가 `file-expansion` 으로 잡았다 (implement 편차) |
| 2026-09-09 | LOW | insuniverse-server/apps/api/src/modules/analyze/analyze.service.ts | **인사이트 조회에 상한도 캐시도 중복 억제도 없다 (local code-review L3).** `getInsight` 는 패널을 열 때마다 그 분석의 진료 원본 전량을 읽어 제공자에게 POST 한다 — 무상태 산출(UI3)의 귀결이라 설계 이탈은 아니나, `ANS015` 가 `analysisTypeAttr` 를 key 로 마운트되므로 하위 탭을 오갈 때마다 재호출이 걸린다. 소유자 가드가 요청자를 자기 분석으로 묶어 남용 축은 닫혀 있고, 30일 스윕이 표를 묶어 행수도 한 사람의 심평원 산출로 유계다. 지금 닫으려면 상한 리터럴(INV4 — 검사 없는 규범 금지)이나 신규 캐시 의존(INV1 — 신규 의존 0) 중 하나를 깨야 하므로 **코드 변경 없이 이월한다.** 인수처: 제공자 호출 비용이 실측으로 문제가 되거나 캐시 계층이 저장소에 생기는 창 · id=ai-m2-insight-call-unbounded |
| 2026-09-10 | MEDIUM | .claude/plans/ai-insight-report-m2.gates.mjs | **종결이 `#16` 을 붉게 만든다 — 창 안에서만 참인 불변식.** `gate16()` 이 PRD 마일스톤 2행에 `in-progress` 를 하드 요구한다(`:1805`). `/mccp:milestone-close` 가 그 행을 `complete` 로 뒤집으므로 **종결 뒤 하네스를 다시 돌리면 `#16` 이 실패**하고 exit 1 이다. closure 본문의 18/18 은 뒤집기 직전 관측이다(실측 2026-09-10). 실패가 아니라 하네스가 「이 창이 진행 중이다」를 불변식으로 든 결과이며, 종결이 정확히 은퇴시키는 명제다. 종결 뒤 구현 산출물을 다시 여는 위험과 `plan_hash` 앵커 때문에 이 창에서는 고치지 않았다. 인수처: 마일스톤 상태 검사를 `in-progress|complete` 로 넓히거나 종결 시점 검사를 분리하는 창 · id=ai-m2-gate16-retired-at-close |
| 2026-09-10 | LOW | .claude/plans/ai-insight-report-m2.plan.md | **«만료» 육안 확인이 stg 에서 도달 불가 — 실측으로 확정.** Acceptance 마지막 항목(`(미검증)`)을 측정했다. `expired` 는 「진료 0건 ∧ 나이 > 30일」인데, 소유자 사슬(`tn_order_detail.usr_id` → `tn_user.mem_id` → `tn_member`)이 온전한 채 그 조건을 만족하는 `oddId` 가 stg 에 **0건**이고 소유자가 살아 있는 주문의 **최대 나이가 26일**이다(실측 2026-09-10). 30일 스윕이 소유자를 먼저 끊어 `OwnAnalysisGuard` 가 403 으로 자른다 — 기존 `F2 DEFER_TO_BACKLOG` 가 「창이 좁다」로 공시한 축이 stg 에서는 「창이 없다」였다. 인접 상태 `no_treatments` 는 실브라우저에서 확인됐다. 인수처: 위 `ai-m2-expired-cause-undecidable`·F2 와 같은 창 · id=ai-m2-expired-unreachable-in-stg |
| 2026-09-10 | HIGH | .claude/plans/ai-insight-report-m3.plan.md | **M3 계획서는 L2/L3 리뷰를 한 라운드도 받지 못했다 — 라운드 예산 소진.** `/mccp:plan` 5.2c `emit-workflow-args` 가 exit 12 로 막았다: `mccp-plan-codex__ai-insight-report` 원장이 3라운드를 기록하는데 캡이 1이고 그 캡은 `MCCP_REVIEW_SINGLE_PASS=deadline_pressure` 로 **pinned** 라 `MCCP_GATE_ROUND_CAP=3` 을 읽지 않는다(실측 2026-09-10). L1 은 converged(위반 0건)이고 패널은 **발화하지 않았다** — 예약 4는 `--actual 0` 으로 반납했고 에이전트 0개가 떴다. 사용자 지시(UI1)에 따라 receipt 를 `divergent` 로 봉인해 교차게이트 dedupe 를 닫아 둔다 — ship 시점에 PR-Codex 가 반드시 돈다. 이 계획서의 **구현 정확성은 이 창에서 외부 검토를 받지 않았다**. 인수처: `MCCP_REVIEW_SINGLE_PASS` 없이 재진입하거나 M3 착수 전 별도 리뷰를 붙이는 창 · id=ai-m3-plan-unreviewed-cap-exhausted |
| 2026-09-10 | MEDIUM | .claude/plans/ai-insight-report-m3.plan.md | **plan 게이트 라운드 원장의 키가 PRD 단위라 마일스톤이 예산을 공유한다.** `receipt/decision.js#slugFromPlanPath` 가 PRD 파일명(`ai-insight-report.prd.md`)에서 슬러그를 뽑으므로 M1·M2·M3 이 전부 `mccp-plan-codex__ai-insight-report` 한 원장을 쓴다. M2 는 `ai-insight-report-m2` 로 따로 잡혀 4라운드를 받았고(원장 파일 2개가 나란히 남아 있다) M3 은 M1 이 쓴 3라운드를 물려받아 착수 시점에 예산이 0이었다 — **두 번째 이후 마일스톤은 구조적으로 리뷰를 못 받는다.** 회피는 `--decision ai-insight-report-m3` 을 명시해 마일스톤별 키를 잡는 것이나, 그러면 hook 이 유도하는 슬러그와 갈라져 receipt 체인이 어긋날 수 있다(미검증). 인수처: 상류 mccp 에 원장 키 입도를 제기하거나 저장소 규약으로 `--decision` 명시를 고정하는 창 · id=ai-m3-round-ledger-key-is-prd-scoped |
| 2026-09-10 | LOW | .claude/plans/ai-insight-report-m3.plan.md | **`getSynthCarPeriods` 에 상한이 없다 (local code-review L4).** `oddId` 로 좁혀 있어 남용 축은 닫혀 있고 행수도 한 회원의 자동차보험 진료로 유계지만, 상한이 어디에도 없다. 지금 닫으려면 상한 리터럴(INV4 — 검사 없는 규범 금지)이나 신규 페이지네이션 의존(INV1 — 신규 의존 0) 중 하나를 깨야 하므로 **코드 변경 없이 이월한다** — 같은 축의 선례 `ai-m2-insight-call-unbounded` 와 한 창에서 닫는다. 인수처: 저장소 조회 비용이 실측으로 문제가 되는 창 · id=ai-m3-synth-car-query-unbounded |
| 2026-09-10 | LOW | .claude/reviews/plan-review-ai-insight-report.md | **원장 키가 PRD 단위라 마일스톤 리뷰 기록이 덮어써진다 (local code-review L3).** `plan-review/cli.js record` 가 PRD 슬러그로 파일명을 잡아 M2 기록이 M3 기록으로 통째 교체됐다(실측 2026-09-10). 세션 시작 시 주입되는 open-findings 4건이 바로 이 경로를 근거로 가리키는데 그 파일에는 findings 가 0건이다 — 인용이 가리키는 곳에 원문이 없다. 이 창에서는 마일스톤별 사본(`-m3.md`)을 떠서 M1·M2 선례와 형식을 맞추는 것으로 완화했고, 근본 해소는 상류 키 입도 문제다(`ai-m3-round-ledger-key-is-prd-scoped` 와 같은 뿌리). 인수처: 상류 mccp 에 기록 파일명 입도를 제기하는 창 · id=ai-m3-review-record-overwritten-by-prd-slug |
| 2026-08-28 | HIGH | .claude/plans/insuniverse-docs-70-viewer-m6.plan.md | **2단 빌드가 최종 자리에 바로 발행해 실패 시 롤백 경계가 없다 (Plan-Codex 라운드 1 · gpt-5.6-sol).** 앞단이 `anchor-freshness.json` 을 최종 산출 디렉터리에 먼저 쓰고 뒷단 `build-docs.mjs` 가 HTML 과 색인을 점진적으로 덮으므로, 뒷단이 중간에 죽으면 새 앵커 데이터 옆에 옛 지면이 남고 독자는 내부적으로 어긋난 뷰어를 계속 읽는다. 게이트는 non-zero 만 보고할 뿐 이전 완전 산출을 보존하지 않는다. **마일스톤 6 이 절반을 닫았다** — Task 4 의 프로브 선행이 형식 위반을 산출 이전으로 옮겨 그 경로에서는 한 바이트도 쓰이지 않는다. 남는 절반은 비-형식 실패에서의 부분 발행이며, 스테이징 디렉터리 + 사후 교체가 필요하고 Windows 에서 기존 디렉터리 위 교체는 원자가 아니라 2단 스왑이라 그 스왑 자신의 실패 창을 갖는다. `70m4-shrinking-rebuild-leaves-stale-pages` 와 **같은 구조 축**이고 두 행은 같은 창에서 함께 닫아야 한다. 인수처: 산출 발행을 스테이징 + 교체로 바꾸는 창 — ABSORBED-M8 2026-08-31: 두 생성기를 `<out>/.staging/<runId>` 에 돌리고 성공 뒤에만 락 아래에서 소유 집합을 교체한다. 뒷단 실패는 스테이징만 버리고 live 를 한 바이트도 안 건드린다(검사 `#4`). 교체 중간의 잡을 수 있는 실패는 저널을 역순으로 되돌린다(`#9`). Windows 2단 스왑 자신의 실패 창은 per-move WAL + 출발지·목적지 실재 기반 복구로 멱등이 됐다(`#15`) · id=70m6-two-stage-publish-no-rollback
| 2026-08-28 | HIGH | .claude/plans/insuniverse-docs-70-viewer-m6.plan.md | **두 단계가 가변 문서 트리를 다시 읽어 낡은 앵커 상태를 출하한다 (Plan-Codex 라운드 8 · gpt-5.6-sol).** `gate.mjs build` 는 앵커 생성기(약 5.4초)와 문서 생성기를 잇달아 돌리고 둘 다 문서 트리를 각자 다시 읽는다. 그 사이에 문서가 저장되면 두 단계가 서로 다른 입력을 본다. 현행 `--freshness` 대조는 `{doc, axis, item}` **집합**만 보므로 같은 항목의 `anchors` 값만 바뀐 경우 집합은 그대로 일치하고, 새 문서 내용에 이전 앵커 상태가 결합된 산출이 rc 0 으로 나간다 — 조용한 정합성 실패다. 크기는 작다(1단계 전 문서 트리 digest 를 재고 2단계 직전 다시 재어 갈리면 이름 있는 실패). **이 라운드에서 못 들인 이유**: plan-codex 게이트가 리뷰와 봉인 사이의 계획서 본문 변경을 `incomplete` 로 막아, 흡수는 매번 재진입 라운드를 요구하고 라운드 1~7 이 이미 그 경로를 돌았다. `70m6-two-stage-publish-no-rollback` 과 같은 **체인 정합** 축이며 두 행은 함께 닫는 것이 맞다. 인수처: 산출 발행 축을 여는 창 — ABSORBED-M8 2026-08-31: 선언된 입력(문서 트리 `.md` 전건 · `docs/_meta/template-config.yaml` · `docs/_meta/extraction-manifest.yaml`)의 digest 를 앞단 전 · 뒷단 전 · 교체 전 세 번 재고 갈리면 이름 있는 실패로 멈추며 스테이징을 버린다. 항목 집합 대조가 못 보는 값 변화를 이 fence 가 문다 — 검사 `#7` 이 `pre-lock` barrier 로 시간에 기대지 않고 주입한다 · id=70m6-mutable-docs-between-stages
| 2026-08-31 | HIGH | .claude/plans/insuniverse-docs-70-viewer-m6.plan.md | **동시 빌드는 앵커 중간산출뿐 아니라 산출 디렉터리 전체를 공유한다 (Implement-Codex 라운드 1 · gpt-5.6-sol).** 마일스톤 6 이 실행별 freshness 이름으로 닫은 것은 앵커 중간산출 한 파일뿐이고, `build-docs.mjs` 는 여전히 같은 `--out` 아래에 문서 지면·색인·검색 데이터·metrics 를 순차로 쓴다. 서로 다른 저장소 팁이나 문서 스냅숏을 가진 두 게이트가 겹치면 그 파일들이 교차로 섞이고, 그 뒤 서로 다른 정본 freshness JSON 을 승격하려 다툰다 — 지면과 앵커 데이터가 어긋난 뷰어가 rc 0 으로 남는다. 잠금을 두지 않는다는 마일스톤 6 의 결정(Task 4)이 이 경로를 연 채로 둔다. **새 축이 아니라 `70m6-two-stage-publish-no-rollback` 의 확장이다** — 그 행은 실패 시 부분 발행을 적었고 이 행은 성공한 동시 발행도 같은 자리에서 깨진다는 관측을 더한다. 두 행은 함께 닫는다. **id 는 공유하지 않는다** — 같은 축이라도 id 로 키잉하는 소비기는 두 행 중 하나를 잃는다. 인수처: 산출 발행을 실행별 스테이징 디렉터리 + 직렬화된 교체로 바꾸는 창 — ABSORBED-M8 2026-08-31: `mkdir` 원자성 락 + 소유자 pid 생존 판정으로 발행자를 직렬화한다. 외부 호출은 대상이 무엇이든 보호 발행이라 마커 부트스트랩 구멍이 없고, 검사 `#16` 이 좌표 없는 기존 산출 트리에서 두 발행을 barrier 로 결정적으로 부딪혀 한쪽 거절과 live 의 섞임 0 을 잰다. **읽기 측 원자성은 안 닫았다** — 새 행 `70m8-reader-sees-torn-tree` · id=70m6-concurrent-publish-crosses-outputs
| 2026-08-31 | MEDIUM | .claude/plans/insuniverse-docs-70-viewer-m6.plan.md | **문서화된 자식 CLI 직접 호출이 단일 진입 주장을 우회한다 (PR-Codex 라운드 1 · gpt-5.6-sol).** `docs/viewer/build-docs.mjs` 머리 주석 75~82 행은 여전히 `node docs/viewer/build-docs.mjs` 를 사용법으로 싣고, 그 경로는 기본 산출 디렉터리에 쓰며 `--freshness` 를 생략하면 전 항목을 *미측정* 으로 표기한 지면을 정본 자리에 덮는다. 마일스톤 6 이 세운 프로브 선행·순서 계약·앵커 신선도 대조가 전건 건너뛰어지고 낡은 `anchor-freshness.json` 이 그 옆에 남는다. 게이트는 자기 진입점 안에서만 계약을 지므로 PRD 가 말하는 *단일 진입* 은 문서 관행일 뿐 기계로 강제되지 않는다. 이 창의 범위는 배타 소유 경로 안의 게이트 신설이었고 생성기 CLI 계약 개조는 §NOT Building 의 *생성기 파일 분할* 과 같은 축이라 같은 창에서 열어야 한다. 인수처: 생성기 CLI 계약을 게이트 소유로 좁히는 창 — ABSORBED-M9 2026-09-03: 두 생성기의 외부 호출이 정본 좌표(`docs/viewer/build` · 그 아래 `anchor-freshness.json`)를 표적으로 삼으면 한 바이트도 쓰기 전에 이름 있는 실패로 거절하고 `docs/viewer/gate.mjs build --repos-root <경로>` 를 문면에 낸다. 판정은 토큰이 아니라 **해석된 절대경로 동등**이라 철자 변형·env 변형·`--staging-internal` 토큰만 쥔 호출로 열리지 않는다(검사 `#4`·`#5`·`#7`). 머리 주석의 사용 예도 함께 정정했고 그 줄들을 **실행해** 봉인 거절 0건을 본다(`#8`) — backlog 행이 지적한 *"문서 관행일 뿐 기계로 강제되지 않는다"* 의 두 절반을 함께 닫는다. 게이트 경로는 생성기에 스테이징 표적만 주므로 봉인에 한 줄도 안 걸린다(`#6` 이 봉인 전 미러와 9개 값을 대조한다) · id=70m6-child-cli-bypasses-single-entry |
| 2026-09-03 | MEDIUM | .claude/plans/insuniverse-docs-70-viewer-m9.plan.md | **게이트 진입 필수화가 독자에게 `--repos-root` 비용을 지운다 (마일스톤 9 자기 관측).** 봉인 뒤 정본 산출을 채우는 유일한 경로는 `docs/viewer/gate.mjs build --repos-root <경로>` 이고, 그 인자는 워킹트리로 조용히 대체되지 않는다. 서브모듈을 체크아웃하지 않은 독자는 뷰어를 정본 자리에 만들 수 없다 — 비정본 `--out` 으로 스크래치 빌드는 되지만 그것은 서빙 자리가 아니다. 이 창은 그 대체 경로를 명시적 범위 밖으로 잘랐다(편의 경로는 계약 넷을 다시 우회한다). 인수처: 게이트에 읽기 전용 진입이나 산출 배포 경로를 여는 창 · id=70m9-gate-entry-requires-repos-root |
| 2026-09-03 | LOW | .claude/plans/insuniverse-docs-70-viewer-m9.plan.md | **좌표 동등 봉인은 경로 별칭을 접지 못한다 (마일스톤 9 자기 관측).** 판정은 `path.resolve` 동등(Windows·macOS 에서는 대소문자 접기 포함)이고 파일시스템을 한 바이트도 읽지 않는다 — 그 순수성이 마커 없는 트리의 부트스트랩 구멍을 막는 조건이다. 대가로 심볼릭 링크 · NTFS 8.3 단축명 · 하드링크처럼 **같은 자리를 가리키지만 경로가 다른** 표기는 봉인을 지난다. `realpath` 를 쓰면 접히지만 그 순간 판정이 파일시스템 상태에 종속되고 부트스트랩 구멍이 되돌아온다. 인수처: 판정 순수성을 깨지 않고 별칭을 접는 방법을 세우는 창 — ABSORBED-M9 2026-09-04: 이 행의 세 표기 중 **둘은 이 창에서 닫혔다.** 리뷰 라운드 1 이 둘을 실측했다 — 확장 길이 접두(`\\?\<정본>`)는 `path.resolve` 가 안 벗겨 문자열이 갈리는데 `readdirSync` 는 정본 트리를 열었고, NTFS 8.3 단축명은 **만들 필요조차 없이**(`dir /x` 가 이미 `ANCHOR~1.JSO` 를 낸다) `--out docs/viewer/build/ANCHOR~1.JSO` 한 줄이 rc 0 으로 정본 JSON 을 덮었다. 그래서 이 행이 링크류와 같은 칸에 둔 도달성 서술이 8.3 에 대해서는 **틀렸다** — 픽스처 0개, 관리자 권한 0개다. 접두는 문자열 접두라 `stripLongPrefix` 로 순수하게 벗기고, 8.3 은 되접기가 `realpath` 를 요구하므로 대신 **정본의 부모 안에서만** `~숫자` 를 거절한다(거절 방향이 안전한 쪽이고, 정본 밖의 8.3 임시 뿌리는 안 문다). 검사 `#7` 철자가 14종에서 20종으로 · `#3` 판정 표본이 14종에서 24종으로 늘었고 정본 밖 양성 3종이 함께 선다. **잔여는 심볼릭 링크 · junction · 하드링크뿐이고 그 셋은 순수 판정으로 못 접는다** — 이 행은 그 잔여로 열려 있다. 인수처: 판정 순수성을 깨지 않고 링크류를 접는 방법을 세우는 창 · id=70m9-canon-seal-blind-to-path-aliases |
| 2026-09-04 | MEDIUM | .claude/plans/insuniverse-docs-70-viewer-m9.plan.md | **앞 창 회귀 검사의 비용이 마일스톤마다 곱해진다 (마일스톤 9 리뷰 라운드 2 실측).** 앞 창 하네스는 자기 안에서 또 앞 창 하네스를 돈다 — `ps` 조상 체인으로 `m9 #12 → m8 check-all → m8 #13 → m6 check-all → m6 #13 → m4 check-all → m4 #15 → m3 check-all → m3 #7` 를 확인했다. 그래서 m8 하나의 단독 완주가 **2121초**이고, 앞 창 6종을 7회 도는 검사의 상한은 3600s × 7 = 7시간까지 열린다. 이 창은 상한을 단위 2에서 4로 올려 정지 감지기를 되살렸을 뿐 **비용 자체를 줄이지 않았다** — 마일스톤 10, 11 이 붙으면 같은 곱셈이 한 겹씩 더 쌓이고, 어느 시점에 이 검사는 사람이 못 기다리는 것이 된다. 그때 상한을 또 올리면 정지 감지기가 무의미해진다. 크기는 작지 않다: 중첩을 끊으려면 앞 창 하네스가 자기 앞 창을 다시 도는 대신 **직전 실행의 판정을 인용**할 수 있어야 하고, 그 인용이 낡지 않았음을 무엇이 보증하는지가 새 계약이다. 인수처: 앞 창 회귀 검사의 중첩 비용을 계약으로 끊는 창 · id=70m9-prev-window-regression-cost-compounds |
| 2026-09-04 | LOW | .claude/plans/insuniverse-docs-70-viewer-m9.plan.md | **앞단 생성기가 발행 원시연산에 모듈 로드 시점으로 결박됐다 (마일스톤 9 리뷰 라운드 1).** `docs/viewer/anchor-freshness.mjs` 가 정본 좌표와 봉인 판정을 쓰려고 최상위 `await import` 로 `docs/viewer/publish.mjs` 를 연다. 그 파일이 없거나 깨지면 이름 있는 실패가 아니라 `ERR_MODULE_NOT_FOUND` 로 죽고, 목적지를 아예 안 여는 경로(`--selftest`)까지 같이 죽는다 — 이 생성기는 마일스톤 8 까지 그 모듈에 의존이 0이었다. 뒷단 생성기가 이미 같은 패턴이라 이 창은 일관을 택했고(두 파일이 다른 규약을 갖는 것이 더 나쁘다), 결박 자체는 남는다. 크기는 작다: 동적 import 를 `try` 로 감싸 이름 있는 실패로 바꾸면 닫히지만 그 한 줄이 두 생성기에서 갈리면 안 되므로 **양쪽을 같은 창에서** 바꿔야 한다. 인수처: 두 생성기의 발행 원시연산 결박을 함께 다루는 창 · **ABSORBED-M10 2026-09-07** — 두 생성기의 최상위 await import 를 감싸 이름 있는 실패로 만들었다. 실측: publish.mjs 부재에서 rc≠0 이고 stderr 에 ERR_MODULE_NOT_FOUND 0건 · anchor-freshness --selftest 는 그 상태에서도 rc 0(DEFAULT_OUT 지연 평가). fail-sites.txt 동결 무변동(79/79) — 감싸개가 fail( 지점을 안 늘린다 · id=70m9-generators-bound-to-publish-at-load |
| 2026-09-04 | MEDIUM | .claude/plans/insuniverse-docs-70-viewer-m9.plan.md | **`verify.sh --check` 가 아카이브된 PRD 때문에 저장소 전역에서 붉다 (마일스톤 9 창에서 관측 · 선재).** `docs/_meta/verify/verify.sh` 1905행이 `.claude/prds/insuniverse-docs-([2-6]0-[a-z-]+).prd.md` 를 세어 **정확히 5** 를 요구하는데 실측 4다 — `insuniverse-docs-40-runtime-vendor-legal.prd.md` 가 `archived/` 로 옮겨지면서 5→4 가 됐고 기대치가 안 따라갔다. 스크립트는 그 자리에서 rc=1 로 끝나므로 **그 뒤의 게이트가 하나도 안 돈다**. merge-base 에서도 파일 집합이 동일해 같은 값이 나온다(이 창과 무관). 인수처: `docs/_meta/verify/**` 를 소유한 창 · id=verify-prd-count-stale-after-40-archive |
| 2026-08-31 | MEDIUM | .claude/plans/insuniverse-docs-70-viewer-m8.plan.md | **교체 구간에 트리를 여는 독자는 옛 엔트리와 새 엔트리가 섞인 상태를 본다 (M8 §NOT Building · Plan-Codex R1 F0).** 락은 **발행자를 직렬화할 뿐 독자를 막지 않는다.** 소유 집합 교체는 최상위 엔트리를 하나씩 rename 하므로 그 사이에 디렉터리를 여는 독자에게는 일부가 옛 세대다. 검사 `#14` 가 그 창을 실측 밀리초로 남기지만(소형 트리 34ms · 실 코퍼스 26ms) **혼합 가시성 자체는 관측하지 않는다** — 시간만 재고 독자 프로세스를 안 띄운다. 닫으려면 불변 세대 트리 + junction 같은 서빙 간접이 필요하고, 세대 저장소가 `build/` 밖으로 나가야 해 `.gitignore` 59행이 덮지 않는 추적 오염이 생긴다(관측 7). 인수처: 서빙 간접의 추적 오염을 PRD 배타 소유 경로 안에서 푸는 창 · **ABSORBED-M10 2026-09-07** — 디렉터리를 여는 독자의 찢김을 불변 세대(build/.gen/<runId>)와 원자 교체되는 서빙 포인터(build/live)로 닫았다. 실측: open 단위 표본 404,229회 중 교체 구간 안 74,351회, 혼합 0건 · 포인터 부재 0건. **다중 파일 독자 세션의 혼합은 남으며**(2건/893,521회 관측) 그 잔여는 신설 행 70m10-reader-session-not-generation-pinned 가 인수한다 · id=70m8-reader-sees-torn-tree
| 2026-08-31 | LOW | .claude/plans/insuniverse-docs-70-viewer-m8.plan.md | **타 호스트가 잡은 락은 판정 불가라 회수하지 못한다 (M8 §NOT Building).** 소유자 기록의 `host` 가 이 호스트와 다르면 `process.kill(pid, 0)` 으로 생존을 물어볼 수 없다. 원시연산은 그 경우 **회수하지 않고 이름 있는 실패**로 낸다 — 판정 불가를 회수로 접으면 진행 중인 교체 위로 두 번째 교체가 들어간다. 대가는 공유 저장소에서 죽은 원격 소유자의 락이 사람 손을 기다린다는 것이다. 검사 `#8` 이 그 축을 따로 재고 회수 0 을 요구한다. 인수처: 호스트 간 생존 판정(임대 갱신 하트비트 등)을 신규 의존 0 으로 세우는 창 · id=70m8-foreign-host-lock-undecidable
| 2026-08-31 | LOW | .claude/plans/insuniverse-docs-70-viewer-m8.plan.md | **출발지와 목적지가 둘 다 실재하는 복구 상태는 자동 판정하지 않는다 (M8 §NOT Building).** 복구는 완료 표시를 안 믿고 실재를 관측하는데, 한 이동의 두 끝이 모두 있으면 어느 쪽이 정본인지 파일시스템만으로 알 수 없다. 그 자리는 추측하지 않고 두 경로를 이름으로 낸 실패로 멈춘다(검사 `#9` 가 합성 저널로 재현). 나머지 세 조합(목적지만·출발지만·둘 다 없음)은 결정적이라 판정이 없다. 대가는 그 상태에 빠지면 사람이 손으로 판독해야 한다는 것이다. 인수처: 이동마다 내용 digest 를 함께 남겨 정본을 값으로 가르는 창 · id=70m8-ambiguous-both-endpoints-present
| 2026-08-31 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m5.plan.md | **에픽 23건 중 18건의 "왜"가 등급 C 단독이라 서사로 승격할 수 없다 (m5 실측).** 저장소 자신의 등급표(`.claude/meta/01-meta-search-report.md` §4)가 Era A 커밋 제목을 *시점 추정용. 단독 근거 금지* 로 판정해 뒀고, 에픽별 최고 등급이 A 4 · B 1 · C 18 이다. 등급 A·B 가 닿는 5건만 등급 표기 서사를 쓰고 18건은 제목·모듈 축 재료만 싣는다. 보강할 축(등급 A·B 소스)이 그 18건에 닿지 않으므로 이 창에서 해소 불가다. 인수처: 마일스톤 6 이후 — `planning/` 밖 문서나 사람 구술처럼 등급 C 를 보강할 축을 찾는 창 · id=60m5-epic-why-grade-c-only |
| 2026-08-31 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m5.plan.md | **마일스톤 5 Outcome 의 *서사* 부분 개정과 §Open Questions 종결이 이 창 밖이다 (m5 실측).** Outcome 은 *"`feat/*` 8개 에픽의 '왜'가 서사로 남음"* 인데 `8개` 는 사실 정정으로 23 이 됐고, *서사* 는 등급표로 재면 5/23 에만 선다. 후자는 범위 축소라 승인 사항이고, 승인 신호를 이 저장소가 기계로 들고 있지 않다 — Outcome 문면과 OQ 체크박스가 둘 다 이 창이 쓰는 같은 PRD 안의 값이라 게이트가 그것으로 승인을 읽으면 자기 주장을 자기가 검사한다. 새 승인 아티팩트를 이 창에서 정의하는 것도 답이 아니다(INV4 — 선례가 없어 형식 자체가 검사 없는 규범이 된다). 게이트 `#13` 은 Task 0 blob 과의 귀속 diff 로 *이 창의 무변동* 만 판정해 후속 창의 승인된 개정을 막지 않는다. 인수처: 사용자 판정 — 경로 (a) Outcome 개정 · (b) 18건 서사 축 이월 · id=60m5-outcome-change-out-of-window |
| 2026-08-31 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m5.plan.md | **제목 축 23 에픽이 server 도메인 51 중 31만 덮고 20이 결손이다 (m5 실측 · F-23).** 에픽 발견 축은 제목 하나뿐이라 세 정규식에 맞지 않는 방식으로 들어온 작업은 모집단에서 사라진다. 파일경로 축으로 독립 유도하면 `fax` 53 · `disease` 45 · `medication-standard` 31 을 포함한 20 도메인이 에픽 축 밖이고, 그중 셋은 상위 에픽에 필적하는 규모다. 게이트 `#9` 가 결손을 이름으로 양방향 대조하고 문서가 그것을 자기 고지로 싣지만, **결손 도메인이 왜 랜딩 없이 갔는지는 판정하지 않는다** — 이 문서의 축으로는 볼 수 없다. site·admin 은 `modules/` 대응물이 없어 대조 자체가 성립하지 않는다. 인수처: 없음 — 제목 축의 구조적 한계이며 다른 발견 축을 세우는 것이 별건이다 · id=60m5-epic-axis-domain-gap |
| 2026-08-31 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m5.plan.md | **캡처 형식은 3종인데 랜딩을 내는 형식은 2종이다 (m5 실측 · F-17).** `squash_like`(`feat: merge feat/X branch`)의 유일한 표본이 near-miss 라 랜딩을 0건 낸다. 그 형식을 캡처 정규식에서 지우면 그 커밋이 near-miss 절에서도 사라져 배제 사실 자체가 기록되지 않으므로 남긴다. 표본 1건짜리 형식이라 다음 창에서 새 표본이 생기면 판정이 뒤집힐 수 있고, 그때 이 결정을 다시 봐야 한다. 인수처: 없음 — 표본이 늘어나는 시점까지 구조적으로 열린 채다 · id=60m5-landing-form-plural |
| 2026-08-31 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m5.plan.md | **살아있는 `feat/*` ref 8건의 귀속을 판정할 수 없다 (m5 실측 · F-19).** 3저장소 `for-each-ref` 가 내는 `feat/<이름>` 이 server 6 · site 4 · admin 3 (중복 제거 8)이고 랜딩 이름 23건과 교집합이 0 이다. 그 8건이 다른 이름으로 착륙했는지는 스쿼시 병합이 부모 사슬을 남기지 않아 토폴로지로 이을 수 없고, 태그 0 · `refs/replace` 0 이라 대신 세울 축도 없다. 계획서 GROUND 는 이 값을 11(9/6/5)로 적었는데 이 창의 실측은 8(6/4/3)이다 — 그 차이는 `feature/` 접두 3건을 세는지와 측정 시점의 remote prune 에서 온다. 인수처: 없음 — 저장소 안에 증거가 없다 · id=60m5-live-refs-unlanded |
| 2026-08-31 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m5.plan.md | **두 트리 파일의 캡션이 `feat/* 8개 에픽 서사` 로 남아 실측 23 과 어긋난다 (m5 실측).** `docs/00-index.md` 135 행과 `.claude/meta/05-final-spec.md` 392 행이 `02-epics.md` 를 그 캡션으로 등재하고 있다. 두 파일 다 이 PRD 의 배타 소유 밖이다 — `docs/00-index.md` 는 `00-protocol` 읽기 전용이고 `.claude/meta/**` 도 이 PRD 소유가 아니다(UI13). 이 창은 PRD §Evidence 와 마일스톤 5 행만 정정하고 두 캡션은 건드리지 않는다. 인수처: `00-protocol` · `.claude/meta/**` 소유자 · id=60m5-tree-caption-literal-stale |
| 2026-08-31 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m5.plan.md | **검사 `#13`~`#17` 의 기준선 앵커가 변경 창 안에 있다 (이 PRD 의 앞 네 창이 같은 축으로 올린 `-anchor` 이월과 같은 부류 — 형제 하네스가 자기 이월 행을 이름으로 1건 특정하므로 그 id 를 여기에 리터럴로 적지 않는다).** 다섯 검사는 `git log --diff-filter=A -- <하네스>` 로 특정한 커밋의 blob 을 유도 원본으로 읽어 같은 창 자기승인을 막는다. 그 커밋 자체는 이 브랜치가 만들었고 이 저장소에는 CI 도 보호 ref 도 없어 이력 재작성으로 앵커를 다시 쓸 수 있다 — 변경 창 밖 앵커가 없다. 없는 앵커를 있는 척 검사하지 않는다(INV4). 인수처: 없음 — 외부 앵커(보호 ref·CI)가 생기는 시점까지 구조적으로 해소 불가이며 그것이 판정이다 · id=60m5-anchor |
| 2026-09-02 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m6.plan.md | **`BASE` 가 허용 밖 경로를 건드린 커밋을 지나 전진할 수 있고 네 단언이 그 전진을 통과시킨다 (Implement-Codex 라운드 1 · gpt-5.6-sol).** `BASE` 유일화 등식 `BASE == WINDOW_START^` 에서 `WINDOW_START` 는 *그 커밋부터 `HEAD` 까지 전 커밋이 허용 경로만 건드리는 가장 이른 커밋* 이므로 **움직이는 접미 경계**다. 허용 목록 밖 경로를 건드린 커밋 X 가 창 안에 생기면 가장 이른 깨끗한 접미가 X 뒤로 밀리고, 그때 하네스의 `BASE` 리터럴을 새 `WINDOW_START^` 로 올리면 네 단언이 전건 통과하면서 X 와 그 앞의 이 창 커밋들이 검사 구간에서 통째로 빠진다 — `#6`·`#12`·`#13` 이 전진한 기준선 위에서 초록이 된다. 권고(receipt `base_sha` 를 판정 축으로 결박)는 계획서 §GROUND 가 이미 판정해 기각한 경로다 — 그 값은 봉인 시점 `HEAD` 라 흡수마다의 재봉인이 앵커를 창 안으로 옮긴다. 값싼 절반은 이 창이 닫는다: F-29 가 경계를 미는 원인을 *면제 목록 확대* 와 *허용 밖 커밋* 둘로 적고 `#13` 이 `BASE..HEAD` 커밋 목록을 경로와 함께 출력해 전진이 diff 와 게이트 출력 양쪽에 남는다. 무거운 절반(외부 불변 앵커)은 이 저장소에 CI 도 보호 ref 도 없어 구조적으로 해소 불가이며, 앞 창들이 같은 축으로 올린 앵커 이월과 같은 부류다. 인수처: 외부 앵커(보호 ref·CI)가 생기는 시점 · id=60m6-base-can-advance-past-violation |
| 2026-09-02 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m6.plan.md | **앞 창 receipt 가 게이트 하네스의 blob 을 묶지 않아 승인된 판본과 편집본 사이에 감사 연결이 없다 (m6 실측 · F-30 의 이월분).** `mccp-plan-codex` receipt 는 `plan_hash` 와 `base_sha`·`head_sha` 를 싣지만 그 계획서가 승인한 하네스 파일의 blob id 를 싣지 않는다. 그래서 마일스톤 4·5 의 승인된 하네스와 이 창이 Task 11 로 낸 편집본 사이에 기계로 따라갈 수 있는 연결이 없고, 앞 창 receipt 는 하네스가 바뀐 뒤에도 초록인 채다. **이 창은 값싼 절반을 닫았다** — 두 파일의 `BASE` blob id 와 clean 필터를 태운 편집 후 정본 blob id 를 판본 쌍으로 F-30 에 기록하고 검사 `#10` 이 `git rev-parse` · `git hash-object --path` 산출과 축자 대조한다. 남는 절반은 receipt 스키마에 **게이트 blob 축**을 신설해 supersession 자체를 증거로 만드는 것이며 mccp 본체 층위라 이 저장소의 창이 열 수 없다. 인수처: mccp receipt 스키마를 여는 상류 이슈 · id=60m6-gate-blob-not-bound-by-receipt |
| 2026-09-02 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m6.plan.md | **앞 창 하네스가 뒤 행 동결을 놓으면서 그 축의 정본이 비었다 (m6 실측 · F-27 의 이월분).** Task 11 이 `m4`·`m5` 의 `prd` 동결 대상을 표의 물리 행 위치로 자기 행과 앞 행에 한정했다. 그 수술은 후속 창의 정당한 전이에 앞 창이 구조적으로 붉어지던 자리를 닫았지만, 대신 *앞 창이 자기 뒤 행을 몰래 건드렸는가* 를 그 하네스가 더 이상 답하지 않는다. 이 창은 행 **정체성** 세 축(`#` 셀 물리 순서 접두 무변동 · 중복 `#` 셀 거부 · 앞 행 `Milestone`·`Outcome` 축자 무변동)으로 되받았으나 셋 다 Status 를 결박하지 않으므로 뒤 행 Status 의 정본은 각 창 자신의 하네스뿐이다. 구조적 답은 **창 종료 커밋을 끝 앵커로 잡아 창 구간만 판정**하는 것이고 선례가 `.claude/plans/insuniverse-docs-60-history-deprecated-m1.gates.mjs` `check6` 에 있으나, 앞 창 하네스 전건 개조와 그 창들의 기준선 재정의를 요구하며 후자는 앞 창 receipt 에 결박돼 이 창이 할 수 없다. 인수처: 앞 창 하네스의 창 구간 판정을 여는 창 · id=60m6-window-end-anchor-absent |
| 2026-09-02 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m6.plan.md | **`verify.sh --update` 가 저장소 전체에서 불가하다 — 온보딩 커버리지 게이트가 문서 PRD 5종을 요구하는데 4종만 남았다 (m6 실측).** `verify.sh` 는 `ls .claude/prds | sed -nE 's/^insuniverse-docs-([2-6]0-[a-z-]+)\.prd\.md$/\1/p'` 로 하류 문서 PRD 를 유도하고 그 계수가 정확히 5가 아니면 `문서 PRD 를 5종 추출하지 못했다` 로 rc 1 을 낸다. 40축 PRD 가 완료되어 `archived/` 로 옮겨진 뒤(이 창보다 앞선 커밋) 실제 계수는 **4**다 — 20 · 30 · 50 · 60. 70축은 정규식 `[2-6]0` 밖이라 애초에 세어지지 않는다. 그래서 `--update` 도 `--check` 도 그 지점에서 떨어지고, golden 재동결의 정식 경로가 **`BASE` 시점부터** 막혀 있다. 이 창은 `--update` 가 그 키에 쓰는 것과 같은 알고리즘으로 `fixtask.findings_headings` 한 키를 재유도해 갱신했고 검사 `#12` 가 변동 키 집합과 `index.*` 3키 불변을 양방향으로 문다. 해소는 두 갈래다 — 정규식을 archived 를 아는 형태로 고치거나, 계수 5를 `.claude/prds/**` 실측에서 유도하는 것. 둘 다 `verify.sh` 상시 층 개정이라 이 PRD 의 위임 밖이다(UI13). 인수처: `00-protocol` — `verify.sh` 소유 창 · id=60m6-verify-update-blocked-by-prd-count |
| 2026-09-02 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m6.plan.md | **`/mccp:prp-implement` Phase 5 리포트 경로가 계획서 §게이트 산출물 면제 표에 없다 (m6 실측).** 그 표는 계획서 · `plan-codex` receipt · `implement-codex` receipt · notes 네 경로만 싣는데, Phase 5 는 `.claude/PRPs/reports/<계획서명>-report.md` 를 추가로 쓰라고 지시하고 이 저장소는 그 디렉터리를 **추적**한다(실측 93건). 허용 경로가 §Files to Change ∪ §면제 의 합집합이므로 그 파일이 생기는 순간 `#6`·`#12`·`#13` 이 함께 붉어진다. §NOT Building 이 *면제를 계획서 밖에서 넓히지 않는다* 로 못 박았으므로 이 창은 면제를 늘리지 않고 리포트 본문을 면제 경로인 notes 파일 안으로 넣었다 — 산출물은 남고 게이트는 초록이다. 구조적 해소는 계획 저작 시점에 면제 표가 Phase 5 산출물을 함께 싣는 것이며, 그 규약은 이 저장소의 plan-kit 층위다. 인수처: `.claude/templates/plan-kit/` 을 여는 창 · id=60m6-report-artifact-outside-exemption |
| 2026-09-02 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m6.plan.md | **`#13` 의 붉음 기준선 앵커만 변경 창 안에 있다 (m6 리뷰 실측 · F-31).** 이 창은 `#6`·`#8`·`#9`·`#11`·`#12` 의 기준선을 창 밖 `BASE` 로 옮겼으나 `#13` 의 `CHAIN_BASELINE` 만 하네스 자신의 생성 커밋 blob 에서 읽는다. 하네스가 이 창에서 신설됐고 창이 커밋 하나이므로 그 커밋이 `HEAD` 이고 커밋 blob 이 워킹트리와 같은 바이트다 — 주석이 막겠다는 *같은 창에서 기준선과 산출을 함께 넓히기* 가 그대로 가능하다. 보호가 서려면 하네스 신설과 기준선 편집이 다른 커밋이어야 한다. 값싼 절반은 이 창이 닫는다: 앵커가 `HEAD` 와 같을 때 `#13` 이 그 동치를 출력에 이름으로 싣는다. 무거운 절반(창 밖 불변 앵커)은 F-29 와 같은 사유로 이 저장소에 CI·보호 ref 가 없어 구조적으로 열려 있다. 인수처: 외부 앵커가 생기는 시점 · id=60m6-chain-baseline-anchored-inside-window |
| 2026-09-02 | HIGH | .claude/plans/insuniverse-docs-30-contracts-limits-m8.plan.md | **게이트 결박 술어가 무관한 실재 검사를 축복한다 (Implement-Codex R1 F2).** 원장 `gate` 결박은 그 하네스가 읽는 문서 집합에 그 행의 `doc` 이 들고 그 검사 설명에 `kind` 축이 들면 통과인데, 그것은 *그 검사가 그 행을 실제로 읽는다* 를 증명하지 않는다. `#8` 은 `gate: null` 행만 표기를 요구하므로 무관한 실재 검사 하나가 주장 하나를 사전검토에서 지운다. 이 계획서 `#7` 기대와 Acceptance 가 이미 사각지대로 공시했고 완전 해소는 검사별 커버리지 증거 — 검사에서 문서 집합으로, 다시 행 id 로 가는 사상 — 를 요구한다. 인수처: 마일스톤 종료 창 |
| 2026-09-02 | HIGH | .claude/plans/insuniverse-docs-30-contracts-limits-m8.plan.md | **저장소 공용 게이트가 red 이고 이 PRD 가 고칠 수 없다 (관측 2).** `verify.sh --check` 가 rc=1 이며 원인은 `docs/_meta/verify/verify.sh` 1902~1904행 의 *문서 PRD 5종* 단언이다 — 정규식이 `[2-6]0` 이라 70축을 세지 않고 40축 PRD 는 archived 로 옮겨져 재열거값이 4다. PRD §Success Metrics 의 *트리 정합* 행이 결박한 명령이므로 그 지표는 마일스톤 8 에서 **미충족**이다. 수정 대상 경로가 `docs/_meta/verify/**` 이고 `docs/_meta/ownership.md` 184행 이 그 슬롯을 `20-foundation-access` 앞으로 상태 `진행` 으로 열어 둬 이 PRD 는 새 위임 행을 세우지 못한다. 인수처: 그 경로의 소유 PRD |
| 2026-09-02 | HIGH | .claude/plans/insuniverse-docs-30-contracts-limits-m8.plan.md | **공용 검증기의 조기 실패가 뒤 네 게이트를 통째로 가린다 (관측 14).** `verify.sh` 3052행 이 `run_onboarding_gate` 뒤에 단락 연산자가 붙어 rc 가 0 이 아니면 즉시 return 1 이라 3055·3058·3066·3070행 의 index·ownership·lint-coverage·fixtask 네 게이트가 아예 돌지 않는다. 그중 `run_ownership_gate` 는 이 PRD 가 직접 건드리는 축이라 그 축의 회귀를 저장소 게이트로 확인할 수 없다. 계획서는 `verify.sh --check` 로부터 어떤 저장소 전역 회귀 보증도 주장하지 않으며 `check0` 의 `#0b` 가 침묵 구간을 이름으로 낸다. **판단 요청**: 소유자의 수정을 마일스톤 선행 의존으로 걸지 말지는 사용자 몫이다 — 걸면 종료 조건이 이 PRD 가 통제하지 못하는 조건이 된다 |
| 2026-09-02 | MEDIUM | .claude/plans/insuniverse-docs-30-contracts-limits-m8.plan.md | **프론트매터 `last_verified` 가 한 값인데 문서는 세 저장소를 인용한다 (관측 7).** 9문서 전건의 `last_verified` 가 server 동결 pin 접두 하나인데 `04-state-transitions.md` 와 `03-rate-limits-and-batch.md` 는 site·admin 파일을 본문에서 인용한다. `.claude/templates/doc-kit/policy-doc.template.md` 18행 이 그 필드를 단수로 적고 앞 창 검사들은 *그 값이 동결 head 의 접두인가* 만 본다 — 표본이 범위를 넘는 자리이며 문서가 틀린 것이 아니라 **필드가 그 문서를 담지 못한다**. `doc-kit` 과 `template-config.yaml` 은 이 PRD 소유가 아니다. 원장에 `미검증` 으로 표기했다. 인수처: doc-kit 소유 PRD |
| 2026-09-02 | MEDIUM | .claude/plans/insuniverse-docs-30-contracts-limits-m8.plan.md | **회부 관측을 적을 자기 소유 findings 파일을 열 수 없다 (관측 9).** PRD §회부 는 기록 자리를 `docs/_meta/findings/30-contracts-limits.md` 로 지정하는데 그 파일이 없고, 열면 `golden.txt` 101행 의 `findings.files` 와 `fixtask.findings_headings` 두 키가 움직여 `verify.sh --update` 가 필요하다. 그 명령의 경로가 `docs/_meta/verify/**` 이고 그 슬롯이 형제 PRD 앞으로 `진행` 이다. 앞 일곱 창의 봉인 검사도 *findings 미개설* 을 조건으로 단다. 회부 자체는 `ownership.md` 323행 의 인계 표에 살아 있고 빠진 것은 **관측 사실의 본문 기록**이다 |
| 2026-09-02 | MEDIUM | .claude/plans/insuniverse-docs-30-contracts-limits-m8.plan.md | **온보딩 문항 Q14 의 문면이 낡았다 (관측 11).** 그 문항은 *env 게이트 11종* 의 운영 활성 여부를 묻는데 `known_gates` 정본은 15종이다 (2026-08-05 version 3 승격 · PRD §B1). 틀린 것은 문항 쪽이고 문서는 15종 전건을 실으며 미확인 사유도 명시한다. `docs/_meta/onboarding-questions.yaml` 은 `00-protocol` 소유이고 D3 위임은 `src:` 다섯 자리 한정이며 레코드 전문이 `onboarding.approved_sha256` 로 봉인돼 있어 문면 수정이 사용자 승인 재봉인을 동반한다. 원장에 `사실과다름` 으로 표기했다 — 표기는 이 PRD 것이고 수정은 아니다 |
| 2026-09-02 | HIGH | .claude/plans/insuniverse-docs-30-contracts-limits-m8.plan.md | **정본 후보 축 1637행 중 278행이 9문서에 안 닿는다 (관측 13).** `policy-candidates.code.jsonl` 을 읽기 전용으로 재열거하면 이 PRD 축(contract·data·value)이 1637행이고 경로 입도로 덮음 1359 · 미덮음 278(contract 255 · value 23)이다. 그 덮음의 1265 가 `insuniverse-server/drizzle/schema.ts` 한 경로에서 나오므로 그 경로 밖은 덮음 94 미덮음 278 이다. `check13` 이 그 계수를 매 실행 공시하고 **0 으로 접지 않는다**. 판단 요청: 미덮음이 정책적 의미가 없어 안 실린 것인지, 아니면 문서가 놓친 것인지는 유지보수자 몫이다 |
| 2026-09-02 | MEDIUM | .claude/plans/insuniverse-docs-30-contracts-limits-m8.plan.md | **동결 pin 에 맞춘 인덱스 재생성 없이는 행 단위 후보 결속이 불가능하다 (관측 13).** `policy-candidates.code.jsonl` meta 의 server sha 는 `c7597fc7` 인데 이 PRD 동결 pin 은 `4d798f55` 다. 행 번호로 대조하면 두 기준선의 차이를 결함으로 오독하므로 `check13` 의 입도는 경로이며 그 사실을 고정 문구로 낸다. 행 단위 결속은 인덱스 축 PRD 소유의 재생성을 요구한다. 인수처: 인덱스 축 PRD |
| 2026-09-02 | HIGH | .claude/plans/insuniverse-docs-30-contracts-limits-m8.plan.md | **유지보수자 라운드 원장 체이닝이 아직 없다.** 마일스톤 종료 조건은 *리뷰 불일치가 2라운드 연속 0건* 이고 측정자가 유지보수자다. 이 창은 `round: 0` 사전검토만 냈고 `check8` 의 `#8b` 는 원장의 `round` 전건이 0 임만 증명한다 — **뒤에 올 두 판정이 서로 다른 라운드인지는 그 검사의 사정거리 밖이다**. 설계는 `prior_ledger_sha256` · 후보 집합 digest · 순차 종료 게이트 셋이며 옳지만, 사람이 쓰지 않은 원장을 검사가 요구하는 상태가 되므로 이 창이 만들지 않았다. 인수처: 마일스톤 종료 창 · **인수: 마일스톤 9** — 스키마(`meta` 의 `prior_ledger`·`prior_ledger_sha256`·`candidate_set_digest`·`round`·`maintainer_provenance`)와 검증기(`insuniverse-docs-30-contracts-limits-m9.gates.mjs` 의 `verify-chain`)와 첫 실사용(그 창의 판정 원장이 앞 원장을 가리키는 `round: 0` 체인 앵커)까지 냈다. 마일스톤 8 이 미룬 이유인 *사람이 쓰지 않은 원장을 검사가 요구하는 상태* 는 검증기를 원장 실재와 분리해 피했다 — 부재는 통과이고 계수로 공시한다. **라운드 자체는 사람 몫으로 남는다** · 원장 `carry-462` |
| 2026-09-02 | MEDIUM | .claude/plans/insuniverse-docs-30-contracts-limits-m8.plan.md | **m1 하네스가 실패 행에 provenance 를 내지 않아 부류 C 를 술어로 유도할 수 없다.** `check0` 의 `#0a` 는 A·B·B′·D 를 술어로 유도하는데 C 는 일곱 개의 검사 이름이다 — m1 은 실패 행에 `label` 과 `want/got` 만 싣고 그 붉음이 단일 리비전 기준선에서 왔다는 사실을 기계 판독 가능한 형태로 내지 않는다. 그래서 `#0a` 는 실패 행 전문을 도입 커밋 blob 과 문자열 대조하고 *C는 허용목록이며 유도가 아니다* 를 고정 문구로 낸다. 완전 유도는 m1 에 provenance 출력 신설을 요구하며 그것은 종료된 창의 자산이다 |
| 2026-09-02 | HIGH | .claude/plans/insuniverse-docs-30-contracts-limits-m8.plan.md | **온보딩 3문항의 화면 표시 축이 이 9문서로 답해지지 않는다 (관측 11).** Q30·Q32·Q37 은 *site 와 admin 이 그 코드를 각각 어떻게 표시하는가* · *남은 대기 시간이 표시되는가* · *정산 뒤 취소의 분기* 를 함께 묻는데 그 축은 `50-domain` 배타 소유다. 값·단위·응답 코드까지는 이 PRD 문서가 담지만 표시 축은 담지 못한다. 원장 `onboarding` 행에 좌표 대신 **차단 사유**로 적었고 `check10` 이 좌표·차단·O/X 미기입 세 계수를 따로 낸다 — 차단은 통과가 아니다. 인수처: 화면 축 소유 PRD |
| 2026-09-01 | HIGH | .claude/plans/insuniverse-docs-20-foundation-access-m7.plan.md | **[부분 해소]** `#7a` 가 gate 값의 형태와 실재만 보고 그 검사가 그 행을 실제로 덮는지는 묻지 않던 축을 마일스톤 7 이 **부분만** 닫았다. m6 네 검사(`check5`·`check6`·`check9`·`check10`)가 판정한 원장 행 id 를 실행 중에 수집해 `covered` 부수 채널로 내고, M7 `#4` 가 원장 `gate` 매핑과 **양방향** 대조한다 — 736건(95.6%)이 실행 관측으로 실증됐다(실측). **닫지 않은 것은 나머지 34건이다.** 그 행들의 `gate` 하네스키는 방출자 집합 밖(`m1#check5` 3 · `m3#check9` 8 · `m4#check13` 12 · `m5#check17` 11)이고, 선행 하네스 넷에 방출 경로를 붙이려면 그 검사 본문을 유도부와 단언부로 쪼개야 하는데 그 편집이 m6 `#0a` 의 부류 토큰 단언 사정거리에 들어간다. 그래서 잔여를 숨기지 않고 m6 `#8` 의 **셋째 계수**(`커버리지 미실증 결박 34`)로 매 실행 드러낸다. 인수처: 선행 하네스 넷의 출력 계약을 여는 창 · id=20m6-gate-binding-is-not-coverage |
| 2026-09-01 | MEDIUM | .claude/plans/insuniverse-docs-20-foundation-access-m7.plan.md | **[해소]** 원장 meta 레코드가 어느 검사와도 대조되지 않던 축을 마일스톤 7 이 닫았다. m6 `#2` 가 커밋된 첫 줄 meta 를 `metaRecord(재추출)` 와 **키 집합 양방향 + 전 필드 값**으로 비교하고, M7 `#3` 이 `extract` 출력의 meta 와 원장 meta 를 독립으로 다시 문다. 쌍·부류·종의 수는 전부 재산출 유도값이고 리터럴이 아니다 — 종전 계획 문면의 `docs[] 9쌍` 은 실측 8이었고 리터럴을 따랐으면 올바른 원장을 거부했다. 인수처: 없음 — 닫혔다 · id=20m6-ledger-meta-record-unverified |
| 2026-09-01 | MEDIUM | .claude/plans/insuniverse-docs-20-foundation-access-m7.plan.md | **[해소]** `resolveCitation` 이 행 범위의 위쪽 경계만 보던 축을 마일스톤 7 이 닫았다. `1 <= lo <= hi <= 행수` 를 전부 요구하고 거부 사유를 `underflow`·`inverted`·`overflow` 셋으로 갈라 이름으로 내며, `#5`·`#6` 출력이 세 계수를 따로 싣는다. `parseAnchor` 의 행 번호도 같은 하한을 받는다. production 판정기를 그대로 부르는 `citeprobe` 프로브가 세 사유의 발동 자리를 양성 1 · 음성 2 로 문다(M7 `#2a`). 인수처: 없음 — 닫혔다 · id=20m6-citation-range-lower-bound-unchecked |
| 2026-09-01 | HIGH | .claude/plans/insuniverse-docs-20-foundation-access-m7.plan.md | **사용자 결정 필요 — `docs/_meta/ownership.md` 자기 위임 행이 누락돼 있다.** 그 파일을 쓴 형제 셋(`13`·`30`·`60`)은 전부 §개정 위임 표에 자기 행을 갖는데 `20` 앞으로는 없다. `git log -L 184,184:docs/_meta/ownership.md` 가 그 행을 고친 커밋 셋을 내고 전부 이 PRD 의 마일스톤 커밋이다(`00b99f3` M5 · `9a7a7e7` M4 · `17b296c` M3) — 즉 쓰기는 있었고 위임 행만 없다. **신설의 값을 실측했다.** 상태 3건만 옮기면 m6 `check0` 이 rc 0 (기대 12건 == 실측 12건 · 새 붉음 0건)이지만, 여기에 자기 위임 행을 더하면 rc 1 이고 새 붉음이 **5건**이다 — `m1#check6` · `m2#check11` · `m3#check12` · `m4#check16` · `m5#check20`. 다섯 창이 전부 *위임받은 PRD 가 20 인 행은 3개* 를 리터럴로 물기 때문이다(첫 문면 `check6 FAIL: delegation rows=4`). 선택지는 둘이다 — (가) 행을 신설하고 다섯 하네스의 행 수 리터럴을 함께 유도로 바꾼다(편집 6자리 · 앞 창 하네스 5개 수술) · (나) 신설하지 않고 드리프트를 문서로 남긴다(현행 · 형제 셋과 형식이 어긋난 채로 유지). 마일스톤 7 은 값을 매긴 채 (나)를 유지하고 판정을 사용자에게 올린다. 인수처: 사용자 결정 후 그 결정을 집행하는 창 · id=20m7-ownership-self-row-missing |
| 2026-09-01 | MEDIUM | .claude/plans/insuniverse-docs-20-foundation-access-m7.plan.md | **선행 하네스 넷에 커버리지 방출 경로가 없다.** `m1#check5`·`m3#check9`·`m4#check13`·`m5#check17` 이 결박한 34건은 실행 관측으로 실증되지 않는다. 네 검사 본문을 유도부와 단언부로 쪼개고 `covered` 서브커맨드를 붙이면 결박 770건 전건이 실증되지만, 그 편집이 m6 `#0a` 의 부류 토큰 단언 사정거리에 들어가 선행 붉음 귀속이 통째로 움직인다. `20m6-gate-binding-is-not-coverage` 의 나머지 절반이며 두 행은 같은 창에서 함께 닫는다. 인수처: 선행 하네스 넷의 출력 계약을 여는 창 · id=20m7-coverage-emitters-prior-harnesses |
| 2026-09-01 | MEDIUM | .claude/plans/insuniverse-docs-20-foundation-access-m7.plan.md | **`.gitattributes` 에 `.claude/milestone-closures/** text eol=lf` 가 없다.** 마일스톤 7 은 검사 측만 고쳤다 — closure 해시를 raw 바이트에서 EOL 정규화 내용으로 바꿔 40축 셋과 20축의 스탬프가 어느 체크아웃에서도 맞는다(실측 · 이 워킹트리의 closure 20건 중 16건이 CRLF). 원천에서 막는 경로는 `.gitattributes` 에 그 경로를 `text eol=lf` 로 박는 것이지만 그 파일의 소유는 `00-protocol`(archived)이고 이 PRD 앞으로 위임 행이 없다. 값은 이미 커밋본 바이트의 해시이므로 검사 정정만으로 관측된 붉음은 닫혔고, 남는 것은 **다음에 같은 형태를 새로 쓰는 창**이 다시 raw 해시를 고를 위험이다. 인수처: `.gitattributes` 위임을 받는 창 · id=20m7-gitattributes-eol-ownership |
| 2026-09-01 | LOW | .claude/plans/insuniverse-docs-20-foundation-access-m7.plan.md | **우산 지표의 리뷰 carrier 문면 개정이 우산 PRD 소유자의 판정을 기다린다.** 마일스톤 6 이 같은 이유로 이월했고 마일스톤 7 도 같은 자리에 선다 — 이 PRD 는 하류이고 우산 지표 문면을 고칠 소유가 없다. 인수처: 우산 PRD 소유자 · id=20m7-umbrella-review-carrier |
| 2026-09-01 | MEDIUM | .claude/plans/insuniverse-docs-20-foundation-access-m7.plan.md | **아카이브된 40축 하네스 m1·m2·m3 의 doc-kit import 가 끊겨 있다.** 형제 축의 `R100` 리네임(`5ab63da` · PR #53)이 7건을 `.claude/PRPs/plans/archived/` 로 옮기자 상대 지정자 `../templates/doc-kit/lint-docs.mjs` 가 `.claude/PRPs/plans/templates/...` 로 풀려 존재하지 않게 됐다 — 여섯이 첫 검사 전에 `ERR_MODULE_NOT_FOUND` 로 죽는다(실측). 마일스톤 7 은 실제로 돌려야 하는 **셋(m4·m5·m6)만** 고쳤다. 나머지 셋은 이 창의 어느 검사도 부르지 않으므로 고쳐도 증거가 없다. **이 잔여가 40축 원래 검사의 rc 0 을 이 창의 도달 범위 밖으로 만든다** — 세 디스패처가 `check1`~`check15` 전건에 `check0` 을 선행시키고 그 `check0` 이 `PRIOR_GATES` 로 m1·m2·m3 를 부르기 때문이다. 그래서 M7 `#6` 은 closure **전용 프로브** rc 0 만 주장한다. 인수처: 40축 archived 하네스를 다시 돌리는 창 · id=20m7-archived-harness-import-broken — FIXED-M8 이 창이 상대 지정자 한 토큰을 수복했고, 게이트 #2 가 아카이브 40축 일곱 전건을 자식 프로세스 --help 로 물어 rc 0 · 사용법 출력 보유 · ERR_MODULE_NOT_FOUND 0건을 요구한다. 검사 본문은 한 줄도 안 건드렸고 CR 바이트 수를 편집 전후로 대조해 EOL 무변동을 확인했다 |
| 2026-09-01 | MEDIUM | .claude/plans/insuniverse-docs-20-foundation-access-m7.plan.md | **`70-viewer` 가 온보딩 owner 로 승격돼 있지 않다.** `docs/_meta/verify/verify.sh` 의 문서 PRD 정의는 십의 자리 규칙(`[2-6]0`)이고 `70` 은 그 밖이라 집합에 안 들어간다. 마일스톤 7 은 계수 리터럴만 재열거로 바꾸고 규칙은 **의미 정의**로 그대로 뒀다 — 배제가 리터럴이 아니라 규칙에서 나오게 하는 것이 이 창의 범위였다. 승격하려면 그 PRD 의 `onboarding-questions` 언급 3건이 전부 `## Success Metrics` 절 **밖**(474행 Risks 표 · 551행 · 596행 · 실측)이라 종료 조건 문면과 온보딩 소유 계약을 함께 개정해야 하고 둘 다 이 창의 소유 밖이다. 인수처: `70-viewer` PRD 소유자 · id=20m7-onboarding-owner-70-viewer |
| 2026-09-01 | MEDIUM | .claude/plans/insuniverse-docs-20-foundation-access-m7.plan.md | **`.claude/prds/` 재열거 정정이 여는 다른 소비자를 전수 조사하지 않았다.** 마일스톤 7 은 `verify.sh` 의 복구 자리 등록부 세 곳(생성 열거자 · 검사 열거자 · `oq_downstream_refs` 경로 해석기)만 고쳤고 M7 `#6c`·`#6d` 도 그 자리만 문다. 같은 축의 리터럴(활성 `.claude/prds/` 만 보는 열거자 · 문서 PRD 계수 상수)이 저장소의 다른 스크립트나 하네스에 더 있는지는 확인하지 않았다. 그 사실을 `#6c` 출력이 한 줄로 싣는다. 인수처: 저장소 전역 재열거 축을 여는 창 · id=20m7-prd-reenumeration-other-consumers — FIXED-M8 이 창이 전수 census 로 닫았다. 게이트 #3 이 추적 스크립트를 훑어 .claude/prds 참조를 열거자 · 해석기 · 파일 상수 · 디렉터리 상수 · 주석 다섯으로 전건 분류하고(미분류 1건이라도 남으면 이름 있는 실패), 경로 합성 자리를 못 보는 분류기가 오탐을 내는 픽스처를 입력으로 받는다. 동결 대조는 두 층이다 — 이 PRD 소유 파일은 모집단·부류 서명 양방향이 차단 조건이고, 소유 밖 파일(동결 96자리 중 84자리)은 드리프트를 이름으로 싣되 차단하지 않는다. 소유 밖까지 양방향으로 묶으면 형제 창의 정상 작업이, 특히 자기 열거자를 보관 인지로 **고치는** 작업이 이 창의 게이트를 붉힌다. 보관 미인지는 래칫으로 남겨 증가만 막는다. 남은 것은 소유 밖 보관 디렉터리 미인지 자리이고 새 행으로 분리했다 |
| 2026-09-01 | MEDIUM | .claude/plans/insuniverse-docs-20-foundation-access-m7.plan.md | **[감지 한계]** 권한 선행 체크포인트가 위조를 못 막는다. `authz-issue` 가 쓰기 **전** 시점(`verify.sh` 가 아직 기준선과 바이트 동일 · 슬롯이 아직 `진행` · 사유가 이미 등록부 유도값)을 write-once 로 봉인하고 `#11`·`#6e` 가 그것을 검증·결박한다. 그러나 그 아티팩트는 워킹트리 JSON 이고 그 안의 값이 전부 재구성 가능하므로, `verify.sh` 원복 → 체크포인트 삭제 → 재발급 → 재적용 경로는 **최종 값이 정상 경로와 같아 구분되지 않는다**. 잡히는 위조는 수기 조작(등록부 지문 불일치 · 기준선 blob sha 불일치)뿐이다. 예방층은 쓰기 전 훅이고 `docs/_meta/ownership.md` 198 행이 마일스톤 2 의 같은 자리를 두고 그 층을 이 위임 밖으로 이미 판정했다. 서명·append-only·별도 커밋 조상 검증은 채택하지 않았다 — 마지막 안은 `#0` 의 기준선 SHA 대조를 통째로 깬다. 인수처: 쓰기 전 훅 층을 여는 창 · id=20m7-authz-checkpoint-not-tamper-evident |
| 2026-09-01 | LOW | .claude/plans/insuniverse-docs-20-foundation-access-m7.plan.md | **[부분 해소]** 가변 집합의 파일 **안**이 hunk 범위로 안 묶인다. M7 `#0f` 가 `post` 변경 파일 **집합**을 §Files to Change 의 `CREATE`∪`UPDATE` 재열거와 양방향으로 결박하고 원소마다 값/범위 단언을 매핑하지만, 파일 안의 변경 범위를 등록부로 무는 것은 `verify.sh`(`#9b`)와 `ownership.md`(`#9`) 둘뿐이다. 하네스(`m5`·`m6`·40축 셋)와 원장은 `#8`·`#0a`·`#3`·`#4`·`#5`·`#6` 의 **값 단언**으로만 묶인다. `verify.sh` 처럼 복구 자리 등록부를 두려면 Task 2·3·4·8 이 고치는 자리를 전수로 등록해야 하고 그 편집 자체가 이 창의 범위를 넘으며, 등록부가 Task 본문 개정과 함께 가지 않으면 그 게이트가 필수 편집을 거부한다(같은 부류가 이 계획서에서 세 번 발생). 인수처: 하네스 편집 범위를 등록부로 무는 창 · id=20m7-mutable-set-hunk-range-unbound |
| 2026-09-02 | MEDIUM | .claude/plans/insuniverse-docs-20-foundation-access-m7.plan.md | **위임 사유 셀의 두 문장이 구분자 없이 붙어 있다 (구현 후 코드 리뷰 · MEDIUM 1).** `reasonExtension()` 이 " 마일스톤 7 몫은 …" 로 시작해 앞 문장 `… 동시 쓰기가 아니다` 와 마침표 없이 이어진다 — `docs/_meta/ownership.md` 184행 셀에서 마일스톤 2~5 몫과 7 몫의 경계가 사람 눈으로 안 갈린다. 사유 셀이 권한의 경계이므로 그 경계가 문면에서 흐려지는 것 자체가 결함이다. **이 창에서는 못 고친다** — 그 문자열이 체크포인트의 `reason_sha256` 에 결박돼 있고(`#9c` · `#6e` · `#11a`), 재발급은 `authz-issue` 가 거부한다(`verify.sh` 가 이미 기준선과 다르다). 고치려면 `verify.sh` 원복 → 체크포인트 삭제 → 사유 정정 → 재발급 → 재적용 순서인데, 그 경로는 `20m7-authz-checkpoint-not-tamper-evident` 가 이름으로 든 **구분 불가 경로와 같은 자리**라 이 창에서 밟지 않는다. 인수처: 사유를 개정하며 체크포인트를 정상 순서로 재발급하는 창 · id=20m7-delegation-reason-run-on |
| 2026-09-03 | HIGH | .claude/plans/insuniverse-docs-30-contracts-limits-m9.plan.md | **정본 후보 미덮음 278행 중 196행이 미판정으로 남는다 (m9 실측).** 마일스톤 9 는 §User Intent UI5 로 **표본까지**만 판정했다 — 상위 다섯 경로 82행(모집단의 29.5%)을 원장 `sample` 부류로 판정했고 나머지는 손대지 않았다. 표본 판정 어휘는 `정책성 없음`·`문서가 놓침`·`판정 불가` 셋이고 이 창의 결과는 정책성 없음 4 · 판정 불가 1 이다. 전수 판정은 동결 pin 에 맞춘 인덱스 재생성을 요구하고 그 경로는 인덱스 축 PRD 소유다. 인수처: 미덮음 전수 판정을 여는 창 · id=30m9-uncovered-population-remainder |
| 2026-09-03 | HIGH | .claude/plans/insuniverse-docs-30-contracts-limits-m9.plan.md | **게이트 결박의 행 id 결속이 여전히 없다 — 열린 이월의 계승 (m9 실측 · 입도 축약 실측 동봉).** 마일스톤 9 의 검사 `#7` 은 결박된 검사를 **실제로 실행해** 그 행의 `doc`+`subject` 가 표준출력에 등장하는지 보지만, 그 입도는 행 id 가 아니다. 실측: 결박 행 958개가 `doc`+`subject` 조합 328개로 접히고 둘 이상이 든 군이 149개, 최대 군이 70개다 — 한 검사의 평범한 출력 한 줄이 최대 70행을 축복할 수 있다. 행 id 결속은 앞 하네스들이 행 id 를 출력하도록 고쳐야 가능하고 그것은 종료된 창의 자산이다. 마일스톤 9 는 이 사각지대의 **크기만 재고** 닫지 않았으며 그 사실이 원장 `carry-454` 에도 `open` 으로 서 있다. 인수처: 앞 창 하네스에 행 id 출력을 신설하는 창 · id=30m9-gate-binding-row-id |
| 2026-09-03 | HIGH | .claude/plans/insuniverse-docs-30-contracts-limits-m9.plan.md | **유지보수자 라운드 두 번이 이 창 밖이다 (§User Intent UI3).** 마일스톤 9 는 체이닝 스키마·검증기·첫 앵커 원장까지 냈고 라운드를 0회 냈다. 순차 종료 술어는 *`round>=1` 이고 `maintainer_provenance` 를 가진 원장 둘이 연속이고 그 둘의 `candidate_set_digest` 가 같고 양쪽 `mark` 에 `사실과다름`·`빠짐` 이 0건* 이며, 현재 그 분모는 0 이다 (앵커는 분자에도 분모에도 들지 않는다). 검사 `#6` 이 앵커 수와 라운드 수를 **따로** 내어 이 부재를 매 실행 공시한다 — 부재는 FAIL 이 아니다. 측정자가 사람이므로 이 저장소가 기계로 만들 수 없는 잔여다. 인수처: 유지보수자 · id=30m9-maintainer-rounds-outstanding |
| 2026-09-02 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m10.plan.md | **§종료 절차의 attempt 상태 기계를 짓지 않는다 (마일스톤 10 계획 창 판정).** Plan-Codex R42~R48 이 종료 절차에 `attempt id`(`<seq>-<HEAD sha8>`) · 8상태 전이(`open`/`aborted`/`closure-issued`/`validating`/`succeeded`/`rollback-pending`/`rolled-back`/`rollback-failed`) · 전이별 커밋 · notes blob 의 first-parent prefix 단조 검증 · `validated_commit` 유도 · 2패스 `check8` 을 쌓았고 이 창이 흡수했다가 철회했다. 사유는 비용 대비 식별력이다 — 유지보수자가 판정 도착 시 **한 번** 도는 수동 절차이고, 그 기계가 막으려던 두 실패(검증 전 종료 선언 · 되돌릴 수 없는 중간 상태)는 `#8` 다섯 분기의 경첩이 **레코드가 아니라 closure provenance** 라는 사실과 7단계 스냅숏 되돌림이 이미 진다. 되살리려면 그 두 실패가 실제로 관측된 뒤에 한다 인수처: 이 축을 다시 여는 창(현재 후속 창 없음) · id=50m10-closure-attempt-log-not-built |
| 2026-09-02 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m10.plan.md | **tracked mtime 시각 축을 짓지 않는다 (마일스톤 10 계획 창 판정).** Plan-Codex R50~R53 이 디스패처의 검증 전·후 stat 스냅숏 대조(`checkall.tracked-mtime`)와 그것을 떠받치는 `check11.registry-last` · `selfprobe.late-write-restore` · `selfprobe.registry-order-violation` · `selfprobe.always-na` 를 쌓았다. 겨냥한 부류는 *후반 검사가 tracked 입력을 썼다가 원래 바이트로 복구하는 적대적 구현* 인데, 같은 문단이 `fs.utimes` 로 mtime 까지 되돌리면 이 검출을 피한다고 `(미검증)` 으로 적고 있었다 — 겨냥한 부류를 닫지 못하는 검사이므로 철회한다. 정직한 실패 양태(미커밋 입력 상태로 통과시키기)는 `check8.worktree-clean` 이 `git status --porcelain` 유도로 이미 문다 인수처: 이 축을 다시 여는 창(현재 후속 창 없음) · id=50m10-mtime-forensics-not-built |
| 2026-09-02 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m10.plan.md | **프로브의 운영 호출 계수를 짓지 않는다 (마일스톤 10 계획 창 판정).** Plan-Codex R54 F1 · R55 F0 이 *각 `selfprobe` 프로브가 운영 판정 함수를 실제로 부르는가* 를 운영 함수 안의 카운터로 세어 `check11.operational-calls` 로 내게 했다. 그 문단 자신이 카운터를 운영 경로 밖에서 올리는 구현은 이 검출도 피한다고 `(미검증)` 으로 적었다 — 자기 하네스를 적대적으로 구현한 저자를 겨냥한 층을 한 칸 더 내려도 같은 자백이 반복될 뿐이다. *프로브는 id 를 내기 전에 운영 함수를 그대로 부른다* 는 **규범으로 남기고** 그 준수를 `(미검증)` 으로 명시한다 인수처: 이 축을 다시 여는 창(현재 후속 창 없음) · id=50m10-probe-call-count-not-built |
| 2026-09-02 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m10.plan.md | **`/mccp:milestone-close` 비변이 선행검사를 짓지 않는다 (마일스톤 10 계획 창 판정).** Plan-Codex R39 F4 · R40 F1 · R41 F0 이 종료 절차 2단계에 *명령 본문이 이 세션 해석 플러그인 경로에 실재하는가* 와 *이 축 직전 마일스톤 closure 선례가 실재하는가* 를 넣게 했다. 앞엣것은 mccp 플러그인의 설치 상태를 이 저장소 게이트가 판정하는 자리라 INV6·B1(로컬 계층은 mccp 대체가 아니다)에 걸리고, 뒤엣것은 선례 실재가 이번 호출의 성공을 함의하지 않아 식별력이 없다. 막으려던 실패(5단계가 못 돌아 `closure 없는 complete` 에 갇힘)는 §종료 절차 7단계 되돌림 경로가 이미 진다 인수처: 이 축을 다시 여는 창(현재 후속 창 없음) · id=50m10-milestone-close-preflight-not-built |
| 2026-09-02 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m10.plan.md | **실행 파일 allowlist 를 게이트로 두지 않는다 (마일스톤 10 계획 창 판정).** Plan-Codex R38 F0 · R56 F2 가 하네스의 자기 spawn 호출 집합을 열거해 `node`·`git`·`bash` 밖 호출 0 과 PATH `timeout` 호출 0 을 `selfprobe.exec-allowlist` 로 내게 했다. 생산자가 자기 호출 집합을 자기가 열거해 초록을 내는 자기 선언이고, 이 저장소가 이미 *wire 필드는 자기를 검증 못 한다* 로 판정한 형태다. PATH 의 `timeout` 을 쓰지 않고 상한을 `spawnSync` 옵션으로 건다는 것은 **Task 1 의 작성 규약**으로 남기고 그 준수를 `(미검증)` 으로 명시한다 인수처: 이 축을 다시 여는 창(현재 후속 창 없음) · id=50m10-exec-allowlist-gate-not-built |
| 2026-09-02 | HIGH | .claude/plans/insuniverse-docs-50-domain-m10.plan.md | **스냅숏 소비 표식의 커밋 시점에 안전한 자리가 없다 (마일스톤 10 봉인 라운드 Plan-Codex R62 F0 · conf 0.98 · 미흡수 이월).** §종료 절차 5단계는 6단계 성공 시 스냅숏 행을 `소비` 로 바꾸고 커밋하라고 하는데, 6단계는 마지막 단독 `check8` 직후 종료를 선언한다. **검증 전에** 소비를 기록하면 그 사이 중단에서 분기 (5) 가 *미소비 0건* 으로 정지해 복구가 막히고, **검증 뒤에** 기록하면 그 최종 커밋 자체는 종료 정의의 네 관측(분기 (4) · `^#11 ok` · `^checkall ok` · `^selfprobe ok` · 단독 `check8`)을 한 번도 거치지 않는다. 리뷰어 처방은 소비 기록을 별도 단계로 분리하고 그 커밋 상태에서 분기 (4)·소비 상태·청결을 마지막으로 재검증하는 것인데, **그 방향은 이 창이 철회한 attempt 상태 기계와 같다**(`id=50m10-closure-attempt-log-not-built`) — 흡수하려면 그 철회 판정을 다시 열어야 하므로 이 창이 판정하지 않는다. 소비 기록 도중 중단된 상태의 재개 규칙과 경계별 실패 주입도 같이 미정이다 인수처: 이 축을 다시 여는 창(현재 후속 창 없음) · id=50m10-snapshot-consume-commit-boundary |
| 2026-09-02 | HIGH | .claude/plans/insuniverse-docs-50-domain-m10.plan.md | **`Q21` 절 키 골든이 값이 아니라 출력행 id 하나만 동결한다 (마일스톤 10 봉인 라운드 Plan-Codex R62 F1 · conf 0.99 · 미흡수 이월).** 계획서는 `Q21` 의 절 키 집합이 계획 단계 골든에서 오고 요소별로 양방향 대조된다고 적지만(검사 `#6`), 골든 파일이 담는 것은 `check6.q21-clause-keys` 라는 **출력행 id 하나**뿐이고 `#11` 의 대조는 id 집합 대조라 절 키 payload 를 보지 않는다. 구현이 절 하나를 지우고 같은 id 를 출력하면 그대로 통과하고, 그러면 `Q21` 이 불완전한 답으로 `성립` 처리되어 지표 §단독 온보딩 성립 의 축 판정까지 오염된다 — *골든에 동결* 주장이 실제 기계보다 넓었다(UI11). 처방은 절 키를 값으로 동결하거나 `Q21` 원문에서 결정적으로 유도하고 `#6` 이 기대 키와 실제 키 payload 를 양방향 대조하는 것이다 인수처: 이 축을 다시 여는 창(현재 후속 창 없음) · id=50m10-q21-clause-keys-golden-is-id-only |
| 2026-09-02 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m10.plan.md | **철회 기록 문단이 골든 총수를 리터럴로 다시 고정한다 (마일스톤 10 봉인 라운드 Plan-Codex R62 F2 · conf 1.0 · 미흡수 이월).** Acceptance 는 필수 출력 총수가 계획서 어디에도 리터럴로 없을 것을 요구하는데(`--help` 가 골든 행수에서 유도 · UI6 · INV4), §Codex Adversarial Review 의 철회 기록 문단이 이전·현재 총수와 제거 개수를 직접 적는다. `lint-plan.mjs` 는 이 자리를 rc 0 으로 통과시켜 자동 방어가 없으므로, 그 Acceptance 는 구현 시 실패하거나 검사되지 않은 채 거짓으로 충족된다. **리뷰어 자신이 봉인 본문을 고치지 말고 이월하라고 처방했다** — 후속 소유 창이 숫자 문면을 지우고 골든 diff 의 기계 산출만 참조하게 한다 인수처: 이 축을 다시 여는 창(현재 후속 창 없음) · id=50m10-withdrawal-note-hardcodes-golden-total |
| 2026-09-03 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m10.plan.md | **회차 2 의 원천 오라클이 자기선언 캐리어를 덮지 않는다 (마일스톤 10 실측).** `docs/20-site/00-ia.md` 의 회차 1 원장 중 `limit` 부류 행은 *이탈 전수는 미검증* 같은 **한계 서술**이고 코드가 그 문장을 만들지 않는다 — 동결 트리에서 라우트·화면을 열거하는 `원천 → 주장` 재구성이 그 행의 참을 판정할 수 없다. 그래서 이 창은 그 행들을 재유도 **대상**에서 빼되 분모에서는 빼지 않고 사유와 이 id 를 단 **명시 이월** disposition 을 지웠다. 그 캐리어에 대해서는 지표 §리뷰 불일치 수렴 을 닫지 않는다. 인수처: 사람이 그 한계 서술을 다시 읽는 창 또는 이탈 전수 오라클을 세우는 창 · row-key manifest: limit:0-134 · id=50m10-round2-selfdeclared-limit-rows |
| 2026-09-03 | HIGH | .claude/plans/insuniverse-docs-50-domain-m10.plan.md | **`docs/20-site/00-ia.md` 가 동결 라우터의 화면 라우트 12종을 담지 않는다 (마일스톤 10 회차 2 실측).** 동결 `insuniverse-site` `767d1e44` 의 `front/src/App.tsx` 에서 `<Route>` 중첩을 접어 라우트를 열거하고 레이아웃 래퍼·캐치올을 뺀 화면 97종을 얻었는데, 문서의 화면 목록 85종이 그중 12종을 담지 않는다(`/analysis/:oddId` · `/analysis/b2c/:bodId` · `/analysis/b2c/auth/:bodId` · `/analysis/b2c/sub/:subParam` · `/analysis/loss/:id` · `/analysis/sub/:subParam` · `/analysis/sub/sub/:subParam` · `/invoices/list/:ivhId` · `/loss/:id` · `/loss/edit/:id` · `/mypage/edu/:type` · `/mypage/subscription/change/agreement/:formType`). 반대 방향 차집합은 0 이라 **문서가 틀리게 적은 것은 없고 빠뜨린 것만 있다** — 회차 1 이 `주장 → 원천` 이라 구조적으로 못 보던 자리다. 이 창은 흡수하지 않고 이월한다: 12종을 채우려면 화면마다 `anchors`·`exits`·`limitations`·`evidence` 를 새로 저작해야 하고 그것은 각론 재저작이며, 그 변경이 마일스톤 9 하네스의 붉음 집합을 계획서 관측 6 의 지정 넷 밖으로 넓혀 이 창의 `#9` 가 죽는다. 인수처: `docs/20-site/00-ia.md` 를 다시 여는 창 · id=50m10-round2-ia-doc-missed-screen-routes |
| 2026-09-03 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m10.plan.md | **server 온보딩 `Q20` 미성립 — 마일스톤 10 재판정에서도 유지 (실측).** 요청 진입부터 수집 개시까지의 모듈 관여 순서를 잇는 서술이 server 각론 8종 어디에도 없다. 완료 이후 팬아웃은 `ANALYSIS_COMPLETION_FANOUT` 이 답하므로 질문의 뒤 절만 성립한다. 이 창은 판정을 반입해 좌표를 현재 바이트에서 다시 해석했고 결론이 그대로다 — 사유가 문서 결손이 아니라 **서술 부재**라 이 창의 한도 참조로는 닫히지 않는다. 앞 판정의 이월 행은 `id=50m8-q20-entry-order` 다. 인수처: server 각론에 모듈 관여 순서를 세우는 창 · id=50m10-onboarding-unmet-server |
| 2026-09-03 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m10.plan.md | **site 온보딩 `Q29`·`Q36` 미성립 — 마일스톤 10 재판정에서도 유지 (실측).** `Q29` 는 site 각론에 진료분석 슬롯 축 자체가 없어 접수와 결과 사이의 서버 상태를 그 흐름이 판정하지 않고, `Q36` 은 인증을 끝내지 않고 화면을 닫았을 때 서버에 남는 상태를 `unknown_reason` 으로 둔다. 둘 다 답이 server 축에 있어 **지표 판정 규칙상 정의로 미성립**이다(다른 서비스 각론을 봐야 답이 나오면 FAIL) — 이 창이 그 정의를 바꾸지 않는다. 앞 판정의 이월 행은 `id=50m9-site-onboarding-unmet` 다. 인수처: 지표 §단독 온보딩 성립 의 판정 규칙을 여는 창 또는 site 흐름 문서를 다시 여는 창 · id=50m10-onboarding-unmet-site |
| 2026-09-03 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m10.plan.md | **admin 온보딩 7건 미성립 — 마일스톤 10 재판정에서도 유지 (실측).** `Q46`·`Q49`·`Q50`·`Q51`·`Q53`·`Q54`·`Q55` 전건이 마일스톤 9 판정을 반입한 재확인에서 사유까지 그대로다. 남는 사유는 재처리 경로 부재·감사 로그 부재·동시성 락 부재 같은 **제품 결손**이고 문서로 닫히지 않는다 — 각각 `id=50m3-reprocess-endpoint-absent` · `id=50m3-audit-log-absent` · `id=50m3-concurrency-lock-absent` 가 그 자리다. 앞 판정의 이월 행은 `id=50m9-admin-onboarding-unmet` 다. 인수처: 각 축의 계약을 여는 창들 · id=50m10-onboarding-unmet-admin |
| 2026-09-03 | HIGH | .claude/plans/insuniverse-docs-50-domain-m10.plan.md | **`verify.sh --check` 상류 회귀가 이 창에서도 미해소다 (마일스톤 10 실측).** `#1` 이 앵커 `4e76e5f8` 에서 같은 술어를 재유도해 상속으로 인정했다 — 활성 문서 PRD 가 앵커와 HEAD 양쪽에서 4종이고 그 스크립트의 온보딩 게이트는 5종을 요구한다. `docs/_meta/verify/**` 는 인덱스 축 배타 소유라 이 창이 고치지 않으며, 선언이 낡아 앵커에서 참이 되면 `#1` 이 `지정이 낡았다` 로 죽는다. 같은 뿌리의 앞 창 행은 `id=50m9-verify-doc-prd-count-broken-by-archive` 다. 인수처: `docs/_meta/verify/**` 개정 위임을 받은 창 · id=50m10-verify-upstream-regression-unresolved |
| 2026-09-03 | HIGH | .claude/plans/insuniverse-docs-50-domain-m10.plan.md | **그 fail-fast 가 만드는 미실행 구간을 이 창이 덮지 않는다 (마일스톤 10 실측).** `verify.sh` 는 `set -euo pipefail` 아래 불변식 위반마다 고유 토큰을 내고 즉시 `exit 1` 한다 — 이미 붉은 스크립트는 앵커에서도 HEAD 에서도 **같은 첫 실패에서 멈추고 그 뒤 검사는 아예 실행되지 않는다**. 그러므로 *상속 실패 재현 일치* 만으로 초록을 내는 것은 그 미실행 구간의 신규 회귀를 구조적으로 못 보는 것이고, `#1` 은 그 사각지대를 필수 출력행 `check1.verify-blind-span` 으로 이름 내되 덮었다고 주장하지 않는다. 임시 worktree 에서 그 조건만 중화하는 수는 소유 밖 스크립트의 재현 의미를 바꾸므로 안 쓴다. 인수처: `docs/_meta/verify/**` 개정 위임을 받은 창 · id=50m10-verify-fail-fast-blind-span |
| 2026-09-03 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m10.plan.md | **`check-all` 의 `verify.sh` 실행이 3중첩이다 (마일스톤 10 실측).** 호출 자리는 이 창 `#1` · `#9` → 마일스톤 9 `#1` · `#9` → 마일스톤 9 의 앞 창 회귀 검사 → 마일스톤 8 `#1` 셋이고 마일스톤 7 등록부도 중복 순회된다. 앞 창은 자기 창의 두 자리를 `id=50m9-verify-run-twice-in-check-all` 로 이월했고 이 창은 그 사유를 위 호출 그래프로 갱신해 승계한다. 입력 digest 기반 캐시는 그 스크립트의 재현 정직성을 깎고 중복 제거는 봉인된 앞 창 하네스 수정이라 UI14 에 걸려 **둘 다 이 창에서 만들지 않는다** — 처방 둘을 이름으로 남긴다. `#9` 가 종단간 벽시계를 실측해 출력하고 notes 가 그 기준선을 동결한다. 인수처: 하네스 실행 비용 규약을 정하는 창 · id=50m10-check-all-verify-cost-nested |
| 2026-09-03 | HIGH | .claude/plans/insuniverse-docs-50-domain-m10.plan.md | **사람 몫 두 축의 판정이 이 창에도 도래하지 않았다 (마일스톤 10 실측).** `#8` 이 앵커 blob 의 PRD 지표 표 `측정자` 열에서 `단독 온보딩 성립` · `리뷰 불일치 수렴` 둘을 유도하고 긍정 활성 레코드 0/2 를 관측한다. 이 창은 그 축의 **입력**만 바꿨다 — 회차 2 가 섰고(`#4`) `Q21` 이 뒤집혔다(`#6`). 판정 레코드(`kind:"maintainer-verdict"`)는 저자가 쓰면 측정자를 겸하게 되므로 쓰지 않았고, 그 레코드가 앉을 자리와 재생 결박 3값·축별 결박을 무는 조건부 게이트만 만들었다. 절차는 계획서 §종료 절차 가 진다. 인수처: 유지보수자 · id=50m10-human-axes-verdict-pending |
| 2026-09-03 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m10.plan.md | **신원 검증 기계가 이 저장소에 없다 (마일스톤 10 실측).** 원장과 정본 표가 모두 저자 통제 아래 있으므로 저자가 표·긍정 레코드·provenance 파일을 함께 만들면 digest 결박은 전부 만족된다. 결박이 막는 것은 *옛 판정 위에서 닫기* 이지 *판정 주체* 가 아니며, `#8` 이 그 사실을 필수 출력행 `check8.identity-unverified-disclaimer` 로 매 실행 내고 `#11` 이 그 행의 실재를 문다 — 초록이 신원 검증으로 읽히지 않게 하는 것이 이 창이 할 수 있는 최대치다. 보호 브랜치 승인과 서명 attestation 은 이 저장소에 기계가 없고 도입이 INV1(신규 의존 0)에 걸려 채택하지 않았다. 마일스톤 9 가 같은 처방을 같은 사유로 받지 않았고 그 판정은 봉인돼 있다. 인수처: 저장소 신원·승인 기계를 도입하는 창 · id=50m10-identity-verification-absent |
| 2026-09-03 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m10.plan.md | **판정 이력의 고정은 `/mccp:milestone-close` 소관이다 (마일스톤 10 판정).** 래칫은 상태 강등을 막지만 판정 행 자체의 **내용 변경 이력**까지 고정하지는 않는다 — `#8` 의 경첩은 closure provenance 실재와 sha 일치이고, 전체 원장과 정본 notes 의 해시를 별도 provenance 에 고정하는 기전은 그 명령이 PRD 에 sha256 을 스탬프하는 형태로 이미 갖고 있다. 이 창이 대신 만들면 소유가 갈리고 같은 사실에 두 정본이 생긴다. 인수처: `/mccp:milestone-close` 소관 · 이 축을 다시 여는 창은 그 스탬프를 소비만 한다 · id=50m10-verdict-history-pinning-is-milestone-close |
| 2026-09-03 | HIGH | .claude/plans/insuniverse-docs-50-domain-m10.plan.md | **한도 총론 참조가 각론 20종 중 한 종만 덮는다 (마일스톤 10 실측).** `#5` 가 `docs/04-limits/**` 에서 `limits:` 정책을 유도하고 각 정책의 `anchors` 모듈 경로와 마일스톤 8 모듈 배정 원장을 교차해 적용 집합을 가른다. 이 창이 연 `docs/10-server/03-subscription-order.md` 에 대한 적용 집합은 `limits:bulk-write-chunking` 하나였고 그것을 참조형으로 실었다 — `Q21` 이 무는 자리가 거기이기 때문이다. **나머지 각론 19종의 참조 부재는 그대로 남는다**: 예를 들어 `money` 모듈을 앵커로 갖는 세 정책은 `docs/10-server/04-settlement-money.md` 가, `treat` 계열은 `docs/10-server/02-treat.md` 가 져야 하며 site·admin 저장소만 앵커로 갖는 정책 셋은 마일스톤 8 모듈 배정 원장의 사정거리 밖이라 배정 자체가 없다. 앞 창 행 `id=50m9-limits-policies-unreferenced` 를 이 창이 소진하지 않은 이유가 이것이다. 인수처: server·site·admin 각론 나머지에 한도 참조를 다는 창 · id=50m10-limits-reference-covers-one-doc |
| 2026-09-03 | HIGH | .claude/plans/insuniverse-docs-50-domain-m10.plan.md | **온보딩 미성립 10건 중 4건이 문서 저작만으로 닫히고 사유 3건이 어긋난다 (창 종료 뒤 실측).** 사람 몫 축 판정을 위해 미성립 전건을 서브모듈 소스와 대조했고, 각 판정에 적대적 반증을 한 겹 더 걸었다. 문서 저작만으로 성립으로 뒤집을 수 있는 것은 `Q20` `Q29` `Q46` `Q50` `Q54` 다섯이다. `Q20` 은 모듈 관여 순서가 `insuniverse-server/apps/api/src/modules/treat/treat.service.ts` 에 전건 있고 이벤트 핸들러가 순차 보장이라 순서 불확정이 없다. `Q29` 는 `treat-dispatcher.service.ts` 가 대기열 응답을 내고 `insuniverse-site/front/src/pages/alimTalk/QueuePage.tsx` 가 대기 위치를 표시하므로 답이 site 자기 좌표에 있다 — 원장의 *site 각론에 슬롯 축 자체가 없다* 는 서지 않는다. `Q46` 은 재분석 경로가 `order-detail` 모듈에 있는데 원장이 `treat` 와 `analyze` 만 뒤져 놓쳤다. `Q54` 는 잠금 부재가 `drizzle/schema.ts` 컬럼 정의로 실증된다. 사유가 어긋난 것은 `Q29` `Q46` `Q51` 셋이고 `Q51` 은 결론이 유지되며 사유만 부정확하다 — 감사 필드 `astConfirmedBy` 가 대리점 정산 테이블에 실재하나 관리자 콘솔이 다루는 회원 정산 테이블에는 없고 확정 취소 시 null 로 리셋돼 취소 주체가 안 남는다. `Q50` 은 재측정에서 닫히는 쪽으로 열렸다 — 일괄 정산 부분 실패가 `AgencySettlementBulkResult` 와 `useSettlementConfirmModal.ts` 94-110행 · `formatBulkResult.ts` 18-21행에 구현돼 건별로 표시되므로 원장의 *부분 실패의 표시 지점을 확정하지 못했다* 가 서지 않는다. 사유가 어긋난 것은 `Q29` `Q46` `Q50` `Q51` 넷이 된다. 못 닫는 것은 `Q36` `Q49` `Q51` `Q53` `Q55` 다. 이 창은 §NOT Building 이 온보딩 미성립 해소를 배제했으므로 저작하지 않는다 — 그 배제의 사유였던 *제품 결손이고 문서로 닫히지 않는다* 가 넷에 대해 서지 않는다는 것이 이 행의 내용이다. 앞 판정의 이월 행은 `id=50m10-onboarding-unmet-server` 와 `id=50m10-onboarding-unmet-site` 와 `id=50m10-onboarding-unmet-admin` 이다. 인수처: 이 축의 사람 몫 판정을 여는 창 · id=50m10-onboarding-unmet-reasons-restated |
| 2026-09-03 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m10.plan.md | **PRD 8행이 3행을 선례로 부르는데 3행 Outcome 에 그 패턴이 없다 (창 종료 뒤 실측).** §Delivery Milestones 8행 Outcome 이 *이 축에서 complete 는 Outcome 증명이 아니라 산출 인도 + 잔여 이월이며 3행이 그 선례다* 라고 적었다. 3행 Outcome 을 원문 대조하면 미달분을 이름으로 열거하지 않으며 이월 id 도 담지 않는다 — 8행이 세운 규약의 근거가 8행 자신뿐이다. 축 종료 판정에서 이 문장을 선례로 인용하면 회고적 정당화가 된다. 규약을 유지하려면 3행 Outcome 에 그 패턴이 실재함을 보이거나 8행 문면에서 3행 지목을 빼야 한다. 어느 쪽도 이 창의 배타 소유 밖 판단이라 여기서 하지 않는다. 인수처: 이 PRD 의 마일스톤 표를 여는 창 · id=50m10-row8-precedent-claim-unsupported |
| 2026-09-04 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m11.plan.md | **온보딩 미성립 2건이 지표 판정 규칙상 정의로 남는다 — `Q36`·`Q55` (마일스톤 11 실측).** 두 질문의 답이 소유 각론 밖에 있다. `Q36` 은 인증을 끝내지 않고 화면을 닫았을 때 서버에 남는 상태를 묻는데 그 답은 server 각론 소관이고 site 질문이 그것을 좌표로 쓰면 지표 판정 규칙이 FAIL 로 정한다. `Q55` 는 기준 데이터 수정이 사용자 노출값과 정산·통계에 각각 언제 반영되는지를 묻는데 그 반영 시점이 배치 축이고 감시·정산 주기 총론이 그 판정을 진다. **이 창은 지표 정의를 바꾸지 않는다** — 정의를 넓혀 성립으로 올리는 것은 측정 대상을 바꾸는 일이라 축 소유자 판단이 필요하다. 인수처: 온보딩 지표 정의를 여는 창 · id=50m11-onboarding-unmet-metric-definition |
| 2026-09-04 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m11.plan.md | **온보딩 미성립 3건이 제품 결손이라 문서 저작으로 닫히지 않는다 — `Q49`·`Q51`·`Q53` (마일스톤 11 실측).** `Q49` 는 환불 개입 시의 연락 경로를 묻는데 그 경로가 코드에 없다. `Q51` 은 정산 확정·취소의 주체 이력을 묻는데 기업 축은 최신 상태 한 벌만 남기고 확정 해제가 그 값을 되돌리며 회원 축 표에는 그 열 자체가 없다 — 사유는 이 창이 정정했으나 결론은 유지된다. `Q53` 은 정지의 분석·구독·결제 연쇄와 해제 시 원상 복구 범위를 묻는데 그 연쇄가 코드 정독으로 확정되지 않았다. 셋 다 서술로 메울 수 있는 자리가 아니라 **없는 기능을 적을 수 없다**는 부류다. 코드 수정은 이 축 범위 밖이다(INV1 인접 — 서브모듈 소스는 이 저장소가 고치지 않는다). 인수처: 각 결손을 제품 축에서 여는 창 · id=50m11-onboarding-unmet-product-gap |
| 2026-09-03 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m7.plan.md | **형제 세 PRD 가 findings 를 한 건도 쓰지 않아 회수 상한이 그 부재로 정해진다 (m7 실측 · F-32).** `30-contracts-limits` · `50-domain` · `70-viewer` 는 `docs/_meta/findings/<prd-id>.md` 파일 자체가 없고 세 원격 브랜치 `git ls-tree` 에서도 같다 — 미머지가 아니라 미작성이다. 그중 둘은 아직 열려 있다. 회수는 읽기 계약이고 쓰기는 형제 소관이라(UI2) 이 PRD 는 대신 쓰지 않는다. 게이트 `#9` 가 부재 집합을 이름으로 내고 공집합을 실패로 두지만, *그 셋이 끝날 때까지 폐기 축을 열어 둘 것인가* 는 판정 사항으로 남는다. 인수처는 이 PRD 마일스톤 8(리뷰 수렴) 또는 사용자 판정. id=60m7-unswept-siblings |
| 2026-09-03 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m7.plan.md | **표형 파일의 발견 81행은 채널 적중 0 으로만 관측됐고 개별 재판정은 안 했다 (m7 실측 · F-33).** `docs/_meta/findings/11-index-code.md` 는 발견을 `## ` 표제가 아니라 `## 1. 발견` 절의 표 81행으로 담는다. 이 창은 표형 파서를 붙여 그 81행을 **읽고** 두 채널 적중이 0 임을 냈다. 그 0 은 침묵의 0 이 아니지만, 채널 술어가 폐기 축 어휘와 이 PRD id 지목 둘뿐이라 *다른 표현으로 적힌 폐기 후보* 가 있으면 못 본다. 술어를 넓히는 것은 회수 집합을 부풀리는 반대 위험과 맞바꾸는 판정이라 이 창에서 하지 않았다. id=60m7-tableform-rows-unadjudicated |
| 2026-09-03 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m7.plan.md | **배제된 머지 본문 중 인덱스에서 복원되지 않는 24건의 후보 승격을 판정하지 않았다 (m7 실측 · F-36).** `is_merge && body_present` 30건 중 같은 저장소 인덱스의 다른 커밋 제목·본문에 포함되는 것은 6건뿐이다. 나머지 24건의 본문 텍스트는 `commit` 소스에서 복원되지 않는다. 이 창은 30건 전건이 핀 prod tip 또는 동결 stg head 의 조상임을 재유도해 `필터5도달` 을 fail 로 닫았으나, 미포함 24건 각각이 서술하는 정책이 별도로 폐기 축 후보인지는 6축을 돌리지 않았다. 배제 규칙 자체의 개정은 인덱스 생성기 소유 PRD(archived)의 몫이라 이 PRD 밖이다. id=60m7-mergebody-promotion-unjudged |
| 2026-09-03 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m7.plan.md | **`#14` 의 붉음 기준선 앵커만 변경 창 안에 있다 (m7 · 앞 창과 같은 구조).** 이 창은 `#8`·`#10`·`#12`·`#13`·`#14` 의 기준선을 창 밖 `BASE`(Task 0 의 `origin/main` 병합 커밋)로 옮겼으나 `CHAIN_BASELINE` 만 하네스 자신의 생성 커밋 blob 에서 읽는다. 하네스가 이 창에서 신설되므로 그 커밋은 창 안이고, 창이 커밋 하나면 커밋 blob 과 워킹트리가 같은 바이트다. 구조적 해소는 창 밖의 불변 앵커인데 이 저장소에는 CI 도 보호 ref 도 없다. `#14` 가 앵커와 `HEAD` 의 동치를 출력에 이름으로 싣는 것까지가 이 창이 닫는 값싼 절반이다. id=60m7-chain-baseline-anchor-in-window |
| 2026-09-03 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m7.plan.md | **회수 채널이 findings 파일에 한정돼 `ownership.md` §회부 인계로 들어온 폐기 판정 요청을 못 본다 (m7 실측).** 그 표에 `30-contracts-limits` 발신 · 이 PRD 수신의 R-1 행이 있고 회부 내용이 *"`docs/99-deprecated/**` 의 `client-analyze.controller.ts` 가 `dead-code-candidate` 인지 판정"* 이다. 수용 시점 셀은 *대상 PRD 착수 시점* 이라 열린 채다. 이 창의 스윕 우주는 `docs/_meta/findings/*.md` 이고 그 표는 우주 밖이라 A∪B 8건에 안 들어간다. 회수 채널을 회부 표까지 넓힐지, 아니면 그 R-1 을 별도 축으로 잡을지는 판정 사항이다. id=60m7-referral-channel-blind |
| 2026-09-03 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m7.plan.md | **발행 차단 이월 2건이 이 창에서도 해소되지 않는다 (m7).** `60m1-sha-unresolvable` (R-4 `sha` 가 형태만 검사되고 실재 커밋으로 해석되지 않는다)와 `60m1-adjudication-unproven` (`deprecated[]` 멤버십이 *판정 완료* 를 뜻하는데 `reason` 비어 있지 않음만 통과한다) 둘 다 열린 채다. 이 창의 재판정 결과가 **확정 폐기 0건**이라 `deprecated[]` 가 비고, 실 노드 0건에서는 판정 레코드 결속을 세울 수 없다 — 두 이월이 요구하는 증명 대상 자체가 없다. 따라서 `docs/99-deprecated/` 발행 조건은 그대로 닫혀 있고 이 창은 아무것도 발행하지 않았다(게이트 `#8`). id=60m7-publication-blockers-still-open |
| 2026-09-03 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m7.plan.md | **golden 재동결이 공용 검증기의 선재 결함으로 차단됐다 (m7 실측).** 이 창은 자기 findings 표제를 31 → 37 로 늘렸으므로 `fixtask.findings_headings` 가 움직여야 하는데, `bash docs/_meta/verify/verify.sh --update` 가 rc 1 로 죽어 기록을 남기지 못한다. 원인은 그 스크립트 1902~1904 행의 *문서 PRD 5종* 단언이다 — 열거 정규식이 `[2-6]0` 이라 `70-viewer` 를 안 세고 `40-runtime-vendor-legal` 은 archived 로 빠져 재열거값이 4다. `.claude/prds/` 파일 집합은 이 창의 `BASE` 와 동일하므로 원인은 창 밖이며, 같은 축이 이미 HIGH 로 열려 있다(공용 게이트 red · 인수처 `20-foundation-access` 앞 `docs/_meta/verify/**` 위임). 이 PRD 의 `docs/_meta/verify/**` 위임 사유는 `--update` 재동결 한정이라 스크립트 수정은 위임 밖이다(UI15). 게이트 `#13` 은 차단을 팔 B 로 기계 증명하고 golden 을 손대지 않았음을 함께 문다 — 상류가 정규식을 고치면 팔 A 로 자동 복귀한다. id=60m7-golden-refreeze-blocked |
| 2026-09-03 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m7.plan.md | **앞 창 하네스 `m5` 의 `prd` 가 §Open Questions 를 원소 수로 동결해 후속 창의 OQ 신설에 구조적으로 붉다 (m7 실측).** 이 창은 판정 사항 1건을 OQ 로 올렸고 그 즉시 `m5 prd` 가 *이 창이 OQ 원소를 바꿨다* 로 rc 1 이 됐다. OQ 신설은 후속 창의 소유이므로 앞 창이 동결할 자격이 없다 — `m6` 의 뒤 행 Status 동결과 같은 결함이고, 이 창은 §Files to Change 가 `m6` 하나라 `m6` 에만 수술했다. 그래서 `m5` 는 붉은 채로 남고 게이트 `#14` 가 그 붉음을 **둘째 인과 부류**(OQ 원소 신설 · 기준선 원소 축자·순서 보존을 PRD 에서 재유도해 증명)로 받는다. 구조적 해소는 `m5` `prd` 의 OQ 동결을 *기존 원소 보존 + 신설 허용* 으로 좁히는 것이며 그 편집을 §Files to Change 에 든 창이 해야 한다. id=60m7-m5-oq-count-freeze |
| 2026-09-03 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m7.plan.md | **동결한 형제 붉음 기준선이 트리만의 함수가 아니다 — 측정 환경에 달렸다 (m7 실측).** 앞 창 하네스들은 서브모듈을 `../../<repo>` 를 먼저 시도해 찾고 없을 때만 `./<repo>` 로 떨어진다. `git worktree add --detach` 한 사본에서 기준선을 재면 `../../` 가 없어 폴백이 걸리고 *다른 체크아웃의 로컬 ref 집합* 을 읽어 `m3 anchor` · `m5 residual` · `m6 sibling` 이 트리와 무관하게 붉게 잡힌다. 같은 트리를 네 환경에서 재어 세 가지 다른 집합이 나왔다. 이 창은 사본의 두 경로를 모두 live 대상으로 junction 해 값을 확정했고, 오염은 조용히 통과하지 않고 `#14` 에서 *편집하지 않은 하네스의 해소* 로 게이트를 세웠다(실측 2회). 구조적 해소는 붉음 기준선을 트리 밖 상태와 분리하는 것이며(로컬 ref 를 읽는 축을 하네스에서 이름 있는 관측으로 내리거나, 기준선을 환경과 함께 동결) 그 판단은 하네스 소유 창들의 몫이다. id=60m7-chain-baseline-env-sensitive |
| 2026-09-04 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m7.plan.md | **`#14` 의 계획서 술어와 구현이 갈리고 Acceptance 두 항이 실측에 반증된다 (m7 리뷰 실측).** 계획서 §Validation `# 검사 #14:` 는 *"신규 붉음 1건이면 실패다"* 로 적었으나 하네스는 신규 붉음을 **귀속으로 통과**시킨다 — 선언 토큰 보유 또는 `OQ 원소` 문면 + PRD 에서 기존 원소 축자·순서 보존 재유도, 두 부류다. 실행 결과는 `신규 3 전건 귀속 {m5:prd(OQ신설 9→10) m6:ledger(선언 6) m6:sibling(OQ신설 9→10)} · 해소 {}` 이고, 그래서 Acceptance 의 *"앞 창 8하네스 재실행의 신규 붉음이 0 이고, 해소는 m6:prd 한 건뿐"* 은 두 절이 다 거짓이다. 해소가 0 인 이유는 `m6` 의 `prd` 가 `CHAIN_BASELINE.m6` 에 애초에 없어서다 — `BASE` 시점에는 이 PRD 마일스톤 7 행이 pending 이라 그 검사가 초록이었고, 이 창이 고쳐도 *사라진 붉음* 으로 잡히지 않는다. 계획서는 `plan_hash` 결박이라 이 창에서 못 고친다. 다음 창이 술어를 *귀속 통과* 로 다시 쓰고 Acceptance 를 실측 형태로 바꿔야 한다. id=60m7-chain-predicate-diverges-from-plan |
| 2026-09-04 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m7.plan.md | **`#14` 고유 로직에 음성 프로브가 0건이고 해소 인과 필터는 한 번도 실행되지 않았다 (m7 리뷰 실측).** `MUTATIONS` id 14 는 `cmd` 가 `golden` 이라 두 검사가 공유하는 `baseAssert` 축만 겨눈다 — 사유는 주석이 밝힌다(`chain` 은 형제 8하네스를 인자 형태 전건으로 돌아 사본·실 트리 2회 실행이 완주 불가다). 그래서 `chain` 만의 로직 — 형제 재실행 · 기준선 양방향 대조 · **신규 붉음 귀속 필터** · 해소 인과 필터 — 은 변조 프로브 대상이 아니다. 계획서 `#15` 술어는 *"기능 서브커맨드 #1~#14 각각에 대해 사본을 변조해 실제로 돌린다"* 라고 적어 이 예외를 담지 않는다. 더구나 실행 결과가 `해소 {}` 라 인과 필터(행 동결 진단 정규식 · 자기 행보다 뒤인지의 순서 비교 · `BASE` 시점 사본 재실행)는 한 줄도 안 돌았다 — 지금의 초록은 그 구간에 대해 아무것도 말하지 않는다. 값싼 절반은 형제 1종만 도는 축소 모드를 두고 그 모드에 프로브를 붙이는 것이다. id=60m7-chain-logic-unprobed |
| 2026-09-04 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m7.plan.md | **계획서 `# 기대:` 4곳과 §Files to Change 1행이 실측과 어긋난 채 봉인됐다 (m7 리뷰 실측).** `#6` 은 *포함 23 · 미포함 7* 로 적었으나 실측은 **포함 6 · 미포함 24** 이고(F-36 이 그 정정을 실었다), `#11` 은 *앞행 유도 5* 인데 **7**, `#12` 는 *backlog 신설 4* 인데 **9**, `#13` 은 팔 A 문면인데 실제 발화는 **팔 B**(재동결 차단)다. 또 §Files to Change 의 golden 재동결 행은 이행되지 않았는데 mccp L1 은 `UPDATE` 행의 **존재만** 보므로 그 자리에 검사가 서지 않는다. `# 기대:` 는 CLAUDE.md §1 이 층위 3(명령 ≠ 게이트)의 직접 항체로 둔 자리라, 어긋난 채로 두면 no-op 하네스를 문면으로 가려낼 수 없다. 계획서는 `plan_hash` 결박이라 이 창에서 못 고친다 — 리포트 §Assessment 가 앞 셋을 밝힌 것이 지금의 정본이다. id=60m7-plan-expectation-lines-stale |
| 2026-09-04 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m7.plan.md | **계획서 §Risks·§Acceptance 의 게이트 번호 오기 4건과 내부 모순 1건 (m7 리뷰 실측).** §Risks 두 행이 형제 하네스 붉음 기준선 축을 `#13` 으로 적었으나 그 축은 `#14` 이고, 트리 파생 3키 불변을 `#12` 로 적었으나 그 축은 `#13` 이다. §Acceptance 는 *"BASE 단언 4종이 #10·#13·#14 에서 돈다"* 고 적었으나 `baseAssert(TAG)` 호출처는 `nopublish` · `golden` · `chain` 세 곳이다 — `#10` 은 `BASE` blob 만 읽고 네 단언을 안 돌리며, 실제 소비처인 `#8` 이 그 열거에서 빠졌다. 또 §Risks 한 행이 *"이 창은 앞 창 하네스를 안 고치므로 해소 0 을 요구한다"* 고 적는데 같은 계획서 Task 15 가 `m6` 를 고친다. 번호가 틀리면 주장과 검사의 대응이 사람 눈으로만 이어지고 층위 2 가 다시 열린다. id=60m7-plan-gate-number-typos |
| 2026-09-04 | LOW | .claude/plans/insuniverse-docs-60-history-deprecated-m7.plan.md | **앞 창 하네스를 고치는 창은 그 창 계획서의 `# 기대:` 문면을 함께 낡게 만든다 (m7 리뷰 실측).** `m6` 계획서 631 행은 `#8 ok … 타행 … 7 pending 8 pending · Outcome 무변동 · OQ 9원소 무변동` 을 기대로 적는데, 이 창이 동결 대상을 앞 행으로 좁히고 OQ 를 *기존 보존 + 신설 허용* 으로 바꿔 현재 출력은 `타행 1 complete … 5 complete · Outcome 무변동 · OQ 기존 9원소 보존 + 신설 1` 이다. 그 계획서도 `plan_hash` 결박이라 고칠 수 없고, 수술을 포기하는 것은 답이 아니다 — 앞 판이 뒤 행까지 동결한 것이 결함이었다. 구조적 해소는 계획서가 기대 문자열을 리터럴로 싣는 대신 하네스 출력에서 유도하도록 형식을 바꾸는 것이며 그 판단은 plan-kit 소유다. id=60m7-m6-plan-expectation-stale |
| 2026-09-04 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **창 범위 술어를 3-dot 으로 옮겨 병합 내성을 얻었다 (m8 산출 · 앞 창 이월 `60m7-base-literal-breaks-on-merge` 해소).** 앞 창은 `BASE..HEAD` 2-dot 리터럴을 창 범위로 썼고, `origin/main` 을 병합해 들인 순간 형제 축 산출물 74경로가 이 PRD 의 변경집합으로 계상돼 그 창의 `#14` 가 8하네스를 돌기도 전에 죽었다. 이 창의 게이트 `#0` 은 `git diff --name-only origin/main...HEAD` 3-dot 유래를 쓰고 2-dot 대비 초과분을 형제 델타로 **이름 열거**한다 — 두 유도를 함께 출력하므로 차이가 숨지 않는다. 실측: 3-dot 변경집합이 전건 허용 경로 안이고 초과 0. **남는 것**: 3-dot 은 병합 기점 이후 이쪽 변경만 보므로, 병합으로 들어온 형제 변경을 이 창이 *덮어쓴* 경우는 여전히 이 술어 밖이다. 그 축은 `#14` 형제 하네스 귀속이 진다. id=60m8-base-literal-resolved |
| 2026-09-04 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **§Success Metrics 의 *정본 3자 정합* 이 종료 판정 시점에 못 닫힌다 (m8 실측).** 트리 정본 두 다리(`.claude/meta/05-final-spec.md` §4 · `docs/00-index.md`)는 7경로를 내는데 실 파일은 5다 — `docs/99-deprecated/` 아래 두 문서가 없고 디렉터리 자체가 트리에 존재하지 않는다. 뿌리는 마일스톤 1 유래 발행 차단 이월 2건이 열린 채라는 사실이며(게이트 `#11` 이 그 열림을 M1 하네스 소스에서 유도해 문다), 확정 폐기가 0건이라 `deprecated[]` 가 비어 M1 하네스 `check10` 이 문서 자체를 거부한다. 인수처: revert 축이나 삭제 축에 **새 확정**이 생기는 창 — 그것은 인덱스 재유도 소관이라 이 PRD 밖이다. id=60m8-tripartite-tree-unclosed |
| 2026-09-04 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **§Success Metrics 의 *폐기 후보 판정율* 이 종료 판정 시점에 못 닫힌다 (m8 실측).** 판정 자체는 `2r`·`2b` 두 창이 완결했고 결과가 확정 0건이다. 그러나 그 지표의 판정 규칙은 *`dead-candidates.yaml` 전 항목이 `99-deprecated/` 에 판정 결과 + SHA 와 함께 존재* 를 요구하고, 그 디렉터리가 없으므로 *판정했다* 와 *지표를 충족했다* 가 갈린다. 앞 항목과 뿌리가 같다. **이 창은 지표 문면을 고치지 않는다** — 판정 규칙 개정은 승인 사항이고 계획서 §NOT Building 밖이다. 인수처: 같은 창(새 확정이 생기는 창)이거나, 지표 문면을 *판정 완결* 로 좁히는 승인. id=60m8-dead-candidate-rate-unclosed |
| 2026-09-04 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **`verify.sh` 의 문서 PRD owner 열거 정규식이 `70-viewer` 를 구조적으로 못 센다 (m8 실측 · 앞 창 축의 잔여).** 재열거 정규식이 `[2-6]0` 이라 `70-viewer` 는 범위 밖이다. 지금은 owner 집합 쪽에도 그 PRD 가 없어 양방향 대조가 5로 성립하고 `--check`·`--update` 가 통과한다 — 즉 **결함이 값에 안 드러나는 상태**다. `70-viewer` 가 온보딩 질문 owner 를 갖는 순간 재열거값과 owner 집합이 갈려 공용 검증기가 다시 붉어진다. 이 PRD 의 `docs/_meta/verify/**` 위임 사유는 `--update` 재동결 한정이라 스크립트 수정이 위임 밖이다(UI9). 인수처: `docs/_meta/verify/**` 위임을 든 창. id=60m8-verify-owner-regex-blind-to-70 |
| 2026-09-04 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **마일스톤 1 하네스 `check4` 가 회부 정본을 발신자 하나로 가정해 R-1 수용 뒤에도 붉다 (m8 실측).** 그 검사는 `13-relation-contract` PRD 의 회부 표(8행)를 정본으로 잡고 `ownership.md` §회부 인계의 행 수와 정확 일치를 요구한다. 그런데 그 절은 **다출처 장부**이고 `30-contracts-limits` 발신 1행이 아홉째로 앉아 있어 정본 8 · ownership 9 로 갈린다. 이 창은 그 하네스를 고치지 않는다 — 종료된 창의 동결 자산이고 계획서 §NOT Building 이 명시했다. 게이트 `#14` 가 이 붉음을 기준선으로 받아 회귀가 아니라 귀속으로 가른다. 구조적 해소는 `check4` 의 정본을 *발신별 정본 집합의 합* 으로 다시 쓰는 것이며 그 편집을 §Files to Change 에 든 창이 해야 한다. id=60m8-m1check4-single-sender-assumption |
| 2026-09-04 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **마일스톤 8 의 종료 조건인 라운드 2 가 이 창에 없다 (m8 · 설계상).** 종료 조건은 *유지보수자 표기가 2라운드 연속 0건* 이고 측정자가 사람이다. 이 창이 낸 것은 원장과 **라운드 1** 표기이며, 라운드 2 는 사용자 몫이라 PRD 마일스톤 표 8행이 `complete` 가 아니라 `in-progress` 로 끝난다(게이트 `#12` 가 `complete` 전이를 거부한다). 온보딩 Q26·Q27·Q28 의 *답변 가능 여부* 판정도 같은 이유로 이 창 밖이다 — 이 창은 좌표만 낸다. 인수처: 유지보수자 라운드 2. id=60m8-round2-is-human |
| 2026-09-04 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **`#14` 고유 로직에 음성 프로브가 0건이다 (m8 · 앞 창 `60m7-chain-logic-unprobed` 와 같은 구조).** `MUTATIONS` id 14 는 `cmd` 가 `scope` 라 두 검사가 공유하는 `baseAssert` 축만 겨눈다. 사유는 비용이다 — `chain` 은 형제 9하네스를 인자 형태 전건으로 돌고 프로브는 사본·실 트리 2회를 요구하므로 완주가 성립하지 않는다(실측: 단일 스윕이 수십 분). 그래서 `chain` 만의 로직 — 형제 재실행 · 기준선 blob 양방향 대조 · **해소 인과 필터** — 은 변조 프로브 대상이 아니고, 해소가 0건인 실행에서는 인과 필터가 한 줄도 안 돈다. 값싼 절반은 형제 1종만 도는 축소 모드를 두고 그 모드에 프로브를 붙이는 것이다. id=60m8-chain-logic-unprobed |
| 2026-09-04 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **앞 창 하네스 `m7` 의 `findings` 가 자기 창의 findings 표제 집합을 동결해 후속 창의 신설에 구조적으로 붉다 (m8 실측).** 그 검사는 자기 `BASE`(31표제) 대비 신설분을 자기 계획서 Task 11 의 `F-32 ~ F-37` 열거와 **정확 일치**로 요구한다. 이 창이 F-38·F-39 를 신설하는 순간 `현재만 [F-38 F-39]` 로 rc 1 이 된다. findings 신설은 후속 창의 소유 표면이고 앞 창이 동결할 자격이 없다 — `m6` 의 뒤 행 Status 동결 · `m5` 의 OQ 원소 수 동결과 같은 결함 부류다. 이 창은 그 하네스를 고치지 않는다(계획서 §NOT Building — 종료된 창의 동결 자산). 구조적 해소는 그 검사의 기대를 *신설분 ⊇ 자기 열거* 로 좁히는 것이며, 그 편집을 §Files to Change 에 든 창이 해야 한다. id=60m8-m7-findings-heading-freeze |
| 2026-09-04 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **게이트 `#14` 의 구현이 계획서 술어를 이탈한다 — 신규 붉음을 실패가 아니라 귀속으로 통과시킨다 (m8 실측 · 앞 창 `60m7-chain-predicate-diverges-from-plan` 과 같은 자리).** 계획서 §Validation `# 검사 #14` 와 Task 14 는 *"신규 붉음 1건이면 실패다"* 로 적었다. 그대로 집행하면 이 창은 산출을 낼 수 없다 — 바로 앞 항목의 동결 때문에 findings 를 한 건이라도 신설하면 반드시 신규 붉음이 생긴다. 그래서 구현은 **증명을 요구하는 귀속 팔**을 쓴다: 실패 문면이 이 창의 선언 토큰(신설 findings 표제 · 이 창 backlog 행이 선언한 id)을 하나 이상 들고, 문면이 드는 모든 `F-NN`·`id=` 토큰이 (선언 ∪ 기준선) 안이어야 한다. 선언 토큰이 0건이면 규칙 자체가 공집합으로 통과하므로 그 자리도 실패로 막았다. **이탈 사실은 `#14` 출력 첫 줄에 이름으로 실린다.** 계획서는 `plan_hash` 결박이라 이 창에서 못 고치고, Acceptance 의 *신규 붉음 0* 항목은 실측에 반증된다 — 실측 형태는 *신규 N 전건 귀속* 이다. 다음 창이 술어를 그 형태로 다시 써야 한다. id=60m8-chain-predicate-diverges-from-plan |
| 2026-09-04 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **라운드 1 표기의 근거 단위가 행이 아니라 절이다 (m8 · 설계상의 한계를 이름으로 남긴다).** 원장의 `mark=ok` 는 그 행이 속한 **절**을 재유도하는 게이트를 인용한다 — 예컨대 `랜딩 114건` 절의 행은 `m5#landings` 를 든다. 게이트 `#6` 이 무는 것은 그 이름이 실재 검사로 해석되는가이지 *그 검사가 이 행 하나의 값을 재유도하는가* 가 아니다. 절 단위 재유도가 행 단위 재유도를 함의하는 검사(전건 열거 + 양방향 대조)가 대부분이지만 전부는 아니며, 그 구분을 기계로 가르는 축이 이 창에 없다. 붉은 게이트 인용은 생성기가 `미검증` 으로 내려 자기 단언을 막는다. 인수처: 라운드 2 이후 표기 축을 다시 여는 창. id=60m8-ledger-marks-are-section-granular |
| 2026-09-04 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **게이트가 자기 환경으로 공용 검증기를 깼고, stderr 를 안 봐서 그것이 겨냥 축 실패로 접혔다 (m8 실측 · 이 창에서 해소).** 게이트 `#1` 의 초판은 `bash verify.sh --check` 를 spawn 하면서 `MSYS_NO_PATHCONV=1` 을 상속시켰다 — 그 변수는 이 하네스의 git·형제 하네스 spawn 에는 필요하지만, `verify.sh` 는 `$TMP` 아래 스테이징 사본을 만들고 그 경로를 node 에 넘기므로 변환이 꺼지면 `MODULE_NOT_FOUND` 로 죽는다. 실측: 켠 채 rc 1 · 57~139초 · `열거 필드다` 0건 / 끈 채 rc 0 · `check PASS` · 203~240초. **초판 진단은 rc 와 겨냥 축 계수만 찍어 이 실패를 *일시적 비결정성* 으로 오독하게 했고, 그 오독 위에 재시도 1회를 얹었다** — 거짓 전제 위의 완화책이라 원인을 찾은 뒤 걷어냈다. 해소는 둘이다: (a) 그 spawn 에서만 변수를 지운다 (b) 실패 진단에 stderr 마지막 4행을 싣는다 — (b) 가 없었으면 (a) 를 못 찾는다. **잔여**: 이 하네스의 다른 spawn 은 여전히 그 변수를 켜고, *어떤 자식이 그것을 견디는가* 를 기계로 가르는 축은 없다. 인수처: 하네스 소유 창. id=60m8-gate-env-broke-verifier |
| 2026-09-04 | MEDIUM | .claude/plans/insuniverse-docs-20-foundation-access-m8.plan.md | **세션 시작 open-findings 프로모터가 판정 이벤트를 안 본다.** 이 PRD 앞 창의 findings 원장은 finding_opened 46 · finding_adjudicated 46 이고 opened − adjudicated = 0 인데(실측), 세션 시작 컨텍스트는 같은 축에서 40건을 HIGH 로 다시 올린다. 프로모터가 개설 이벤트만 세고 판정 이벤트를 차감하지 않는 형태다. 그 코드는 mccp 플러그인 본체이고 UI6 이 수정을 금지하므로 이 창은 계수만 기록한다. 원장 자체가 gitignore 대상이라 게이트도 못 건다 — 재현은 두 이벤트를 세는 것뿐이다. 인수처: mccp 상류(플러그인 소유자) · id=20m8-open-findings-promoter-ignores-adjudication |
| 2026-09-04 | MEDIUM | .claude/plans/insuniverse-docs-20-foundation-access-m8.plan.md | **backlog 의 두 소비기가 서로의 절반에 눈멀어 있다.** docs/_meta/verify/fixtask-projection.mjs 의 parseBacklogRow 는 평문 행만 레코드로 만들고 mccp 쪽 소비기는 표 헤더 아래만 센다. 실측 — 이 PRD 소유 행은 **전건 표 행**이고 평문 행은 0건이라, 이 PRD 가 올린 이월은 fix-task 투영에 한 건도 안 잡힌다. 계수는 여기 리터럴로 안 적는다 — 이 창이 새 행을 올리면 그 순간 낡고, 낡은 계수를 무는 검사가 없다(INV4). 계수의 정본은 `#5` 출력이다. 투영기는 docs/_meta/verify/** 이고 그 경로의 20 앞 위임 슬롯은 앞 창이 완료로 닫았으므로 이 창의 소유 밖이다. 게이트 #5 가 평문 · 표 두 계수와 소유 행의 투영 가능 계수를 매 실행 드러내고 기준선과 대조하는 데서 멈춘다. 인수처: docs/_meta/verify/** 위임을 다시 여는 창 · id=20m8-backlog-projection-blind-to-table-rows |
| 2026-09-04 | LOW | .claude/plans/insuniverse-docs-20-foundation-access-m8.plan.md | **.claude/state/fix-task-applied.md 가 자기 receipt 보다 낡았고 그 사실에 게이트를 걸 수 없다.** fix-task 의 created_at 은 2026-09-01T00:40:43.386Z · verdict 는 codex_divergent · escalate 는 true 인데, 같은 결정 슬러그의 plan 게이트 receipt 는 2026-09-01T02:53:53.950Z 에 codex_verdict=converged 로 봉인됐다 — 2시간 13분 뒤 판정이 뒤집혔고 fix-task 는 그 뒤집힘을 모른다. .claude/state/ 는 gitignore 대상이라 워크트리 안에서만 유효하고 이력에 안 남으므로, 시각 대조를 무는 검사를 이 저장소의 어느 게이트에도 붙일 수 없다. 이 창은 대조를 구현 노트에 기록하고 소비는 사람이 한다. 인수처: 상태 디렉터리를 이력에 남기는 규약을 여는 창 · id=20m8-fixtask-state-not-gate-observable |
| 2026-09-04 | MEDIUM | .claude/plans/insuniverse-docs-20-foundation-access-m8.plan.md | **.claude/prds/ 열거 자리 셋이 보관 디렉터리를 못 본다.** 전수 census(게이트 #3) 실측 — 참조 45파일 96자리의 부류는 열거 6 · 해석 9 · 파일 상수 59 · 디렉터리 상수 14 · 주석 8 이고 미분류는 0 이다. 열거 6 중 셋이 활성 디렉터리만 훑는다: .claude/plans/insuniverse-docs-30-contracts-limits-m8.gates.mjs 의 두 자리(파일 전체가 미인지)와 docs/_meta/verify/verify.sh 의 한 자리(같은 파일의 다른 두 열거 자리는 인지). 실효가 있다 — 보관된 문서 PRD 6종이 배타 소유 경로 선언을 싣는데 verify.sh 의 그 자리에서 통째로 안 보이고, 30축 하네스의 문서 PRD 재유도는 verify.sh 가 포함하는 보관분을 빼서 두 술어가 이미 갈려 있다. 앞은 형제 PRD 의 창 국소 하네스라 소유 경로 밖이고 뒤는 docs/_meta/verify/** 위임이 닫혀 있어 이 창은 계량과 동결까지만 간다. 인수처: 각 자리의 소유 PRD · id=20m8-prds-enumerators-archived-blind |
| 2026-09-04 | MEDIUM | .claude/plans/insuniverse-docs-20-foundation-access-m8.plan.md | **`#7` 스윕 지문이 앞 창 하네스의 읽기 입력까지는 못 문다.** 구현 후 코드 리뷰가 지문을 손 목록에서 §Files to Change 재열거로 바꿔 **이 창이 고치는 것**은 전건 덮었다(수정 전 반사실: 40축 m4 를 변조해도 캐시 적중 · `소요 0초` 로 초록). 남는 사각은 이 창이 안 고치는데 앞 창 하네스가 **읽는** 파일이다 — m1~m7 은 `docs/**` · `docs/_meta/**` · 형제 축 산출을 읽고, 그것이 병합으로 들어오면 지문은 그대로라 캐시가 재생된다. 지문을 앞 창 하네스의 읽기 집합으로 닫으려면 일곱 하네스가 자기 입력을 열거하는 출력 계약이 필요하고 그 편집은 앞 창 소유이고, 앞 창이 남긴 커버리지 방출 이월과 같은 자리다(그 행의 id 는 여기 인용하지 않는다 — 산문의 형제 id 가 이 행의 id 집합에 섞여 `#4` 를 깬다. 실측으로 한 번 깼다). 이 창은 지문 구성을 `#7` 출력에 싣는 데서 멈춘다. 인수처: 선행 하네스의 출력 계약을 여는 창 · id=20m8-sweep-digest-blind-to-harness-reads |
| 2026-09-07 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **통합 경계 단언이 형제 진척에 붕괴했다 (m8 실측 · 이 창에서 해소).** 게이트 `#0`·`#14` 가 공유하는 `baseAssert` 의 단언 (c) 는 `origin/main` ⊆ `BASE` 한 방향이었다. 이 창이 열려 있는 동안 `origin/main` 이 `9527252` → `169773d` 로 전진하자(형제 `20-foundation-access` M8 · `70-viewer` M9) 두 검사가 겨냥 축을 보기도 전에 `origin/main 이 BASE 의 조상이 아니다` 로 죽었다. `BASE` 를 새 병합 커밋으로 옮기는 것은 해가 아니다 — `BASE` 는 **창 직전** 커밋이고 `#3`·`#8`·`#12`·`#13` 이 그 blob 을 *창 이전 상태* 로 읽으므로, 옮기면 그 넷이 자기 산출을 자기 기준선으로 보고 조용히 초록이 된다. 해소는 같은 의도를 붕괴하지 않는 형태로 다시 쓴 것이다 — (c1) `BASE` ⊆ `origin/main` (c2) `origin/main` ⊆ `HEAD`, 합쳐 `BASE ≤ main ≤ HEAD` 이며 원래 한 방향보다 강하다. 이월 `60m7-base-literal-breaks-on-merge` 와 같은 결함 부류(절대 앵커를 술어로 쓴 자리)다. id=60m8-integration-assert-decays-on-sibling-progress |
| 2026-09-07 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **`#6` 의 `ok` 가 게이트 이름의 *존재* 만 보고 그 주장에 결박하지 못했다 (Codex Implement R2 F2 · 이 창에서 해소).** 옛 술어는 인용이 실재 하네스·검사로 해석되는가만 물어, 무관하지만 유효한 게이트로 바꿔치기해도 779행이 통과했다. 해소는 인용을 그 주장의 **문서**에 결박한 것이다 — 인용된 하네스 소스가 그 `doc` 경로를 이름으로 열어야 한다. 실측 커버리지 행렬이 문서당 하네스 하나라(m3→03-divergence · m4→01-timeline · m5→02-epics · m6→00-origin·04-ops-intent) 변별력이 있고, 현재 779/779 가 결박된다. 음성 프로브 `id=6b` 를 새로 달아 *해석은 성공하고 문서 결박만 실패* 하는 변조에 rc 1 을 요구한다(반사실 실행 확인). **잔여**: 이 결박도 *그 검사가 이 행 하나를 재유도하는가* 는 증명하지 못한다 — 표기의 근거 단위가 절이라는 사실은 `60m8-ledger-marks-are-section-granular` 가 진다. id=60m8-ok-citation-not-bound-to-claim |
| 2026-09-07 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **`#14` 의 귀속 팔이 실패의 *종류* 를 안 봐서 실제 회귀를 흡수할 수 있었다 (Codex Implement R2 F1 · 이 창에서 해소).** 옛 규칙은 신규 붉음의 진단이 이 창의 선언 토큰을 하나라도 들면 실패 종류와 무관하게 귀속으로 통과시켰다 — 새 `F-38` 의 **내용** 오류를 보고하는 진단도 그 토큰을 들고 있으므로 흡수됐다. 이 창이 든 사유는 오직 하나(*앞 창이 후속 창 소유 표면인 findings 표제 집합을 동결했다*)이므로 그 축의 문면만 연다 — 서명은 실측이다(`m7 findings` 의 `신설 표제가 계획서 열거와 다르다`). 아울러 **측정 전제 실패를 판정으로 접지 않는** 팔을 더했다: 동결 트리 판독 실패·프로세스 미실행은 이 창의 회귀가 아니라 *판정이 성립하지 않은 것* 이며 이름을 달리 하되 여전히 fail-closed 다. **잔여**: 전제 실패 서명이 실측한 두 문면(동결 트리 · 프로세스)에 한정돼, 다른 형태의 환경 실패는 여전히 `귀속 축 밖` 으로 이름 붙는다(실측: `m3:anchor` 의 로컬 ref 부재). id=60m8-chain-attribution-ignored-failure-kind |
| 2026-09-07 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **`#14` 의 해소 인과 필터가 일반 파일 이름을 근거로 받았다 (Codex Implement R2 F3 · 이 창에서 해소).** 옛 `CAUSE` 정규식은 `findings`·`golden` 이라는 맨 파일 이름을 포함했고, 그 둘은 진단 어디에나 나오므로 *검사 대상 제거나 기대값 약화로 만든 해소* 도 BASE 복원 시 그 단어를 든 실패가 돌아오면 verify 축으로 통과했다. 서명을 이 창이 실제로 고치는 축(공용 검증기의 발견 열거 파손 · golden 재동결)의 문면으로 좁혔다. **잔여**: 이 실행에서 해소 집합이 비어 필터가 한 줄도 안 돌았다 — 좁힌 술어는 아직 실행으로 확인되지 않았고, 그 사실을 `60m8-chain-logic-unprobed` 가 이미 진다. id=60m8-chain-cause-matched-bare-filenames |
| 2026-09-07 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **앞 창 하네스 `m2b` 의 `repoPath` 가 워크트리보다 메인 체크아웃을 먼저 고른다 (m8 실측 · 미해소).** 그 함수는 후보를 `../../<repo>` → `./<repo>` 순으로 보고 `git -C <cand> rev-parse --git-dir` 이 rc 0 이면 채택한다. 그런데 메인 체크아웃의 서브모듈 마운트 지점은 **비어 있어도 상위 저장소 안** 이라 그 명령이 rc 0(상위 `.git`)을 내므로, 워크트리에서 실행해도 판독 대상이 메인 체크아웃이 된다. 실측: admin 이 메인에서 미초기화인 동안 `m2b axes` 가 `동결 트리 판독 실패 (fb001e1d) — fatal: not a tree object` 로 붉었고, 같은 SHA 를 워크트리 서브모듈에서 읽으면 정상이었다. 이 창은 그 하네스를 안 고친다(§NOT Building — 종료된 창의 동결 자산). 구조적 해소는 후보 채택 조건을 *그 경로가 서브모듈 워크트리인가* 로 좁히는 것이며 그 편집을 §Files to Change 에 든 창이 해야 한다. 인수처: `m2b` 소유 창. id=60m8-m2b-repopath-prefers-main-checkout |
| 2026-09-07 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **공용 검증기의 golden 이 재현 조건(`env.git_version`)을 동결해 다른 기계에서 구조적으로 붉다 (m8 실측 · 미해소).** `verify.sh` 1127~1134 행이 `env.git_version` 과 `exclude_inputs.*` 를 *값을 만든 조건* 으로 의도적으로 동결한다(옵트아웃 플래그 없음). 이 창의 golden 은 `git version 2.55.0.windows.3` 에서 동결됐고, 재진입 세션의 기계는 네이티브 Linux `git version 2.43.0` 이라 `--check` 가 그 한 키만으로 rc 1 이다 — 나머지 전 키가 일치한다(실측 diff 1행). 여기서 `--update` 로 초록을 만들면 동결한 기계가 붉어지므로 **재동결하지 않았다.** 같은 뿌리로 게이트 `#1` 이 붉고 `#15` 가 그 양성 프로브에서, `#16` 이 완주 계수에서 연쇄로 붉다(실측: 완주 13/16 · 결손 [1 14 15]). 이 붉음은 이 창 산출물의 결함이 아니라 검증기가 *"이 환경은 golden 을 동결한 환경이 아니다"* 를 정확히 보고하는 것이다. 인수처: `docs/_meta/verify/**` 위임을 든 창 — 재현 조건 행을 기계 지문과 내용 지문으로 가르거나, 동결 기계를 규약으로 고정해야 한다. id=60m8-golden-freezes-machine-fingerprint |
| 2026-09-07 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **형제 하네스가 요구하는 서브모듈 로컬 ref 가 재현 조건인데 어느 게이트도 그것을 전제로 안 문다 (m8 실측 · 미해소).** `m3 anchor` 가 `insuniverse-server 로컬 prod ref 상태가 git 재유도와 다르다 — 문서 이동 · git 부재` 로 붉다. 실측: 이 기계의 server 서브모듈에는 `refs/heads/stg` 만 있고 `prod` 로컬 ref 가 없다(메인 체크아웃도 같다). 기준선을 채취한 기계에는 있었다는 뜻이며, 그 전제는 어느 하네스의 출력에도 이름으로 안 실린다 — 그래서 `#14` 가 이것을 *환경* 이 아니라 `귀속 축 밖 신규 붉음` 으로 이름 붙인다. 이 창은 서브모듈 3종을 동결 SHA 로 초기화해 admin 축은 복구했으나 로컬 ref 는 만들지 않았다(없는 ref 를 만드는 것은 관측이 아니라 조작이다). 인수처: 재현 조건을 출력 계약에 싣는 창. **2026-09-08 실행 확인 + 사실 추가** — 게이트가 재는 저장소가 워크트리가 아니다. `m3.gates.mjs` `repoPath` 가 후보를 `[../../<repo>, ./<repo>]` 순으로 잡아 첫 후보가 먼저 맞는데, 워크트리에서 그 경로는 **메인 체크아웃**이다(실측: `git -C ../../insuniverse-server rev-parse --git-dir` = `/home/madsc/work/insuniverse-temp/.git/modules/insuniverse-server`). 그래서 워크트리 서브모듈에 `refs/heads/prod` 를 만들어도 판정이 안 바뀐다 — 프로브로 server@5c14fd70 · site@a79528c2 를 워크트리에 만든 뒤에도 `#1 FAIL: insuniverse-server 로컬 prod ref 상태가 git 재유도와 다르다 — 문서 이동 · git 부재` 가 그대로였다(ref 는 프로브 후 삭제). 메인 체크아웃 3종에도 로컬 `prod` 가 없다(`refs/heads/stg` 만). 인수처가 재현 조건을 출력 계약에 실을 때 **어느 트리를 재는지**도 함께 이름으로 실어야 한다. id=60m8-sibling-harness-needs-local-refs |
| 2026-09-07 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **`#13` 의 *신설 행* 유도가 `BASE` blob 2-dot 이라 병합으로 들어온 형제 행을 자기 신설로 계상한다 (m8 실측 · 미해소).** `#0` 은 창 범위를 `origin/main...HEAD` 3-dot 으로 옮겨 이 계열을 이미 닫았는데(`60m8-base-literal-resolved`), `#13` 은 여전히 `BASE` blob 대비로 신설을 센다. 실측: 이 세션이 `origin/main` 을 들인 뒤 신설이 31행으로 나왔고 그중 `70m6-*`·`70m9-*`·`20m7-*`·`20m8-*`·`verify-prd-count-stale-after-40-archive` 는 형제 창 소유다. **거짓 통과는 아니다** — 그 검사가 무는 것은 형식과 id 중복이고 출력이 id 를 전건 이름으로 열거해 혼입이 보인다. 그래도 *신설* 이라는 이름이 소유를 함의하므로 다음 창이 3-dot 유래로 옮겨야 한다. 인수처: 이 하네스를 §Files to Change 에 든 창. id=60m8-backlog-newrows-counted-2dot |
| 2026-09-07 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **`#6` 문서 결박의 근거가 주석으로 우회됐다 (Codex Implement R3 F1, confidence 1.0 · 이 창에서 해소, 잔여 있음).** 초판 `gateDocCoverage` 는 하네스 소스 전문에 `src.includes(doc)` 를 걸어, 무관한 하네스에 `// docs/90-history/00-origin.md` 한 줄만 심으면 결박이 열렸다 — 779/779 라는 계수가 *실제 읽기* 의 증거가 아니었다. 해소는 블록·행 주석을 걷어낸 **코드 본문**에서만 세는 것이다. 반사실 실행 확인: 주석 심은 사본 rc 1 · 안 심은 사본 rc 1 · 무변조 rc 0, 그리고 주석 제거 뒤에도 결박이 779/779 로 유지된다(커버리지가 실제 코드 리터럴이었다). 음성 프로브 `id=6c` 를 새로 달아 그 우회에 rc 1 을 요구한다. **잔여**: 이것도 *실행되는 읽기* 의 증명이 아니라 **어휘적 존재**의 증명이다 — 코드에 리터럴이 있으나 그 경로를 안 읽는 하네스는 여전히 커버리지를 얻는다. 구조적 해소는 하네스가 자기 입력 집합을 출력 계약으로 방출하는 것이며 그 편집은 앞 창 소유다(`20m8-sweep-digest-blind-to-harness-reads` 와 같은 자리). id=60m8-doc-coverage-is-lexical-not-executed |
| 2026-09-07 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **`#14` 표제 동결 귀속이 *표제 유실* 까지 흡수했다 (Codex Implement R3 F2 · 이 창에서 해소).** 축 서명(`신설 표제가 계획서 열거와 다르다`)만 통과시키고 토큰을 뭉쳐 세면, 진단이 `현재만 [F-38] 계획서만 [F-37]` 일 때 F-38 은 declared · F-37 은 prior 라 `mine` 이 서고 `alien` 이 비어 귀속으로 통과했다 — 후속 창의 표제 *추가* 를 허용하려던 예외가 앞 창 표제의 *유실* 을 숨겼다. 해소는 문면의 두 변을 갈라 읽는 것이다: `계획서만` 이 비어야 하고, `현재만` 이 전건 이 창의 선언이어야 하며, 양변 공집합도 거부한다(규칙이 공집합으로 통과하지 않게). 실측 3문면 검증 — 추가만 → 귀속 · 유실 동반 → 거부 · 공집합 → 거부. **잔여**: 이 팔은 음성 프로브가 없다 — `chain` 이 형제 9하네스를 도는 비용 때문이며 그 사실은 `60m8-chain-logic-unprobed` 가 이미 진다. id=60m8-chain-freeze-arm-absorbed-heading-loss |
| 2026-09-07 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **`#6` 문서 결박의 주석 제거기가 문자열 안의 `/`+`*` 를 블록주석 여는 자리로 읽어 코드 본문을 먹었다 (코드 리뷰 H1 · 이 창에서 해소).** 초판은 소스 전문에 `\/\*[\s\S]*?\*\/` 를 걸어 **문자열 리터럴 안의 여는 자리**까지 주석으로 읽었다. 실측 — m2c:558(`${DEP_DIR}/**`) 146행 · m3:976·m4:1309(`` `refs/replace/*` ``) 131행·173행 · m7:275·m8:252(`endsWith("/**")`) 22행·33행 · m8:1396 78행의 **실제 코드**가 다음 `*` + `/` 까지 통째로 지워졌다. 방향은 fail-closed 라(삭제는 커버리지를 줄이기만 한다) 거짓 통과는 없었고 779/779 도 유지됐지만 그것이 **우연**이었다 — 어느 하네스의 유일한 문서 리터럴이 먹힌 구간으로 들면 `#6` 이 *인용 게이트가 이 주장의 문서를 안 연다* 라는 **틀린 사유**로 붉는다. 검사가 보는 것이 자기가 말한 *코드 본문* 이 아니었다(층위 6). 해소는 문자열·템플릿·정규식 리터럴을 건너뛰고 주석만 걷는 스캐너다. 반사실 실행 확인 — 교체 전후 커버리지 행렬이 10하네스 전건 동일(m3 1 · m4 1 · m5 1 · m6 2 · 나머지 0) · 결박 779/779 유지 · 문자열 리터럴 6자리 전건 보존 · 프로브 `6b`·`6c` rc 1 유지 · **스캐너를 무력화한 사본에서 `6c` 가 rc 0 으로 뒤집힌다**(그 팔을 실제로 문다는 역방향 확인). **잔여**: 결박이 *어휘적 존재*의 증명이라는 상한은 그대로이며 `60m8-doc-coverage-is-lexical-not-executed` 가 이미 진다. id=60m8-doc-coverage-stripper-ate-code-body |
| 2026-09-07 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **`#14` 표제 동결 팔이 진단 문면의 첫 쌍만 읽었다 (코드 리뷰 M1 · 이 창에서 해소).** R3 F2 흡수는 `현재만`/`계획서만` 두 변을 갈라 읽게 했으나 `exec` 라 **첫 쌍만** 보고, 두 변 사이를 `[\s\S]*?` 로 열어 뒀다. `diag` 값은 마지막 6행을 `" / "` 로 이어 붙인 창이라(하네스 941행) 동결 진단이 둘 실리면 둘째 쌍의 `계획서만 [F-37]`(표제 유실)이 검사되지 않고 통과한다 — R3 F2 가 닫은 구멍이 같은 자리로 되돌아온다. 해소는 `matchAll` 로 **모든 쌍**을 검사하고, 사이를 공백으로 좁히고, 읽은 쌍 수가 양변 각각의 등장 수와 같은지까지 무는 것이다(짝이 안 맞으면 읽히지 않은 변이 있다). 반사실 실행 확인 — 파일에서 떼어 온 실제 코드를 6문면에 태워 추가만 → 귀속 · 유실 동반 → 거부 · 공집합 → 거부 · 선언 밖 → 거부 · **두 쌍 중 둘째에 유실 → 거부** · 짝 안 맞음 → 거부. 같은 6문면을 초판 술어에 태우면 뒤 두 건이 **귀속으로 통과**한다. **잔여**: 이 팔은 여전히 음성 프로브가 없다(`chain` 이 형제 9하네스를 도는 비용) — `60m8-chain-logic-unprobed` 가 이미 진다. id=60m8-freeze-arm-read-only-first-pair |
| 2026-09-07 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **`#14` 해소 인과 서명이 맨 `verify.sh` 를 남기고 좁힌 가지를 죽은 채 뒀다 (코드 리뷰 M2 · 이 창에서 해소).** R2 F3 흡수는 맨 파일 이름 `findings`·`golden` 을 걷었으나 같은 부류인 `verify\.sh` 를 남겼다 — 실측으로 형제 9하네스 중 **7개**의 문면에 등장하고(m1 만 14자리) 그중 다수가 인자 부재·파서 파손 같은 축 밖 실패다. 게다가 `golden 재동결` 뒤에 맨 `재동결` 을 둬 앞 가지가 판정을 바꾸지 못하는 **죽은 가지**였고, `골든 재동결` 이라는 문면은 어느 형제 메시지에도 없다(실제 문면은 `재동결이 안 돌았다`·`재동결 차단`). `움직인 키` 는 m8 자신의 문면이라 형제 출력에 나올 수 없었다. 해소는 남는 대안을 전건 **형제 출력의 실측 문면**으로 바꾸고 출처를 코드에 함께 적은 것이다 — `열거 필드다`(verify.sh:2551 · 이 세션 `#1` 실측에서 실제로 인용된다) · `check PASS`(verify.sh:3124) · `fixtask.findings_headings`(m2:760) · `재동결이 안 돌았다`·`재동결(이)? 차단`(m7:1667·1689·1692·1697). 좁힘의 실패 방향은 닫혀 있다 — 서명 밖 해소는 `사유 밖 해소` 로 die 한다. **잔여**: 이 팔은 이 실행에서도 `resolved` 가 비어 한 줄도 안 돌았다 — `60m8-chain-logic-unprobed` 가 이미 진다. id=60m8-chain-cause-kept-bare-verify-sh |
| 2026-09-07 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **implement receipt 가 3라운드·findings 5건을 1라운드·0건으로 적었다 (코드 리뷰 M3 · 이 창에서 해소).** `insuniverse-docs-60-history-deprecated-m8-r2` receipt 는 `resolution.rounds=1 · findings=[] · accepted=[]` 인데 구현 노트와 보고서는 **3라운드 · findings 5건 전건 ACCEPT_NOW · 확인 라운드 없음**을 적는다. 스키마 한계가 아니다 — 같은 디렉터리에 `00-protocol-m4`(rounds 11 · findings 7 · accepted 17) · `30-contracts-limits-m6`(rounds 2 · findings 10 · accepted 10) 선례가 있다. `/mccp:code-review` Phase 2.5.1 이 cross-gate dedupe 로 읽는 필드가 바로 그 넷이라, 원장이 증거보다 얇으면 다음 게이트가 이미 판정된 자리를 다시 판다. 해소는 `--findings-file`·`--resolution-file` 로 라운드·findings·accepted·open_questions 를 실측대로 다시 봉인한 것이다. `converged=true` 와 `codex_verdict=divergent` 의 병립은 **바꾸지 않았다** — 이 저장소의 확립된 용법이며(위 두 선례) *루프는 종료했으나 판정은 열려 있다* 를 뜻한다. id=60m8-implement-receipt-underrecorded-rounds |
| 2026-09-07 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **`#14` 귀속 팔이 진단 6행 창 *어디든* 동결 서명이 있으면 귀속으로 통과한다 (santa-loop R1 · Reviewer A · 미해소).** `diag` 는 실패 출력의 마지막 6행을 이어 붙인 창이고 `FREEZE_SIG` 를 그 창 **전체**에 건다. 리뷰어가 파일에서 그대로 떼어낸 귀속 팔(`CHECKS.chain` 의 `FREEZE_SIG`/`ENV_SIG` 분기)을 합성 문면에 태워 실행한 결과 `git: not a tree object / #12 FAIL: 신설 표제가 계획서 열거와 다르다 — 현재만 [F-38 F-39] 계획서만 []` 가 **귀속 통과**했고, 순서를 뒤집어도·무관 회귀(`#9 FAIL: 실제 회귀다`)를 동반해도 통과했다. 그 자리의 코드 주석(`diag` 6행 창을 설명하며 *'둘 다 fail-closed 라 판정은 안 바뀌고 이름만 틀린다'* 로 끝나는 문단)은 그렇게 적었으나 동결 팔은 **통과** 팔이므로 판정이 거부→귀속으로 뒤집힌다. 처방은 서명을 창 전체가 아니라 **실패를 낸 마지막 줄**(또는 `#N FAIL:` 접두 줄)에만 거는 것이다. 이 창에서 안 고친 이유: 겨냥 팔이 `#14 chain` 이고 `#0` 이 붉은 동안 실행 자체가 불가라 흡수의 반사실 검증을 못 세운다 — 검증 없는 흡수는 다음 라운드의 지적이 된다(CLAUDE.md §4). 인수처: `#0` 이 초록으로 돌아오는 창 · id=60m8-freeze-sig-window-too-wide |
| 2026-09-07 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **`frozenBaseline` 이 기준선 blob 판독 실패·0건에서 die 없이 워킹트리 파일로 내려간다 (santa-loop R1 · Reviewer A·B 양 레인 · 미해소).** `git log --diff-filter=A --format=%H -- <미추적 경로>` 는 rc 0 · 빈 출력이고(실행해 확인), 그 경우 `frozenBaseline` 의 추가 커밋 조회 분기가 `src` 를 null 로 두고 이어지는 `read(BASEFILE)` 가 워킹트리를 읽는다. 출력에는 `기준선 출처 워킹트리(미커밋)` 라벨만 남고 rc 는 0 이며 **아무 검사도 그 라벨을 읽지 않는다**. 결과: 기준선을 인덱스에서 떼거나 이름을 바꿔 다시 만든 상태에서 `#14` 가 *자기 창에서 쓴 기준선* 으로 자기 산출을 재는데 게이트가 초록이다. 계획서 §Validation `# 검사 #14` 술어(`Task 0 커밋 blob 에서 읽는다(워킹트리 상수 금지)`)를 검사하는 코드가 그 자리에 없다 — 산문이 검사보다 강한 자리다(층위 2). 처방은 강등을 die 로 바꾸고 필요하면 명시 플래그로만 여는 것. 이 창에서 안 고친 이유는 위 행과 같다(`#14` 실행 불가). 인수처: `#0` 이 초록으로 돌아오는 창 · id=60m8-frozen-baseline-worktree-fallback |
| 2026-09-07 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **게이트 증거의 유효기간이 이동 참조(`origin/main`)에 결박돼 형제 진척만으로 `#0`·`#11`·`#15`·`#16` 이 겨냥 축 전에 죽는다 (santa-loop R1 · Reviewer A · 미해소).** `baseAssert` 의 (c2) 는 `origin/main ⊆ HEAD` 를 원격 추적 ref 의 **현재값**으로 묻는다. 그 값이 움직이면 이 창 산출물이 한 바이트도 안 바뀌어도 네 검사가 붉어지고, `#15 selfprobe` 는 첫 양성(`#0`)에서 죽어 음성 프로브 17건이 **한 건도 안 돈다**. 코드 279행 주석은 반대로(형제 진척에 안 무너진다) 적혀 있다. **2026-09-07 실측 — 이 붉음의 직접 원인은 형제가 아니라 santa 루프 세션 자신의 `git fetch` 다**: reflog `origin/main@{0}: fetch -q origin: fast-forward` 가 `169773d`(이 창이 3585b96 으로 머지한 tip) → `5308715` 로 옮겼다. 즉 결함은 실재하고 발화 조건이 형제 활동보다 넓다 — 같은 저장소의 어떤 fetch 든 창의 게이트 증거를 무효화한다. 처방 후보: (c2) 를 이동 ref 가 아니라 **이 창이 실제로 머지한 커밋**(`BASE^2`)에 걸기. 이 창에서 안 고친 이유: `baseAssert` 는 `#0`·`#11`·`#14`·`#15`·`#16` 이 공유하는 전제라 변경의 반사실이 그 다섯을 다 통과해야 하는데 지금 그 실행이 불가다. 인수처: 다음 창 · id=60m8-base-assert-bound-to-moving-ref |
| 2026-09-07 | LOW | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **`#6` 에 *인용된 검사가 지금 통과하는가* 를 보는 코드가 없어 PRD 8행 Outcome 의 '붉은 검사 인용은 게이트가 거부한다' 가 검사보다 강하다 (santa-loop R1 · Reviewer A · 미해소).** `#6` 은 `mark=ok` 에 대해 (1) gate 비어있지 않음 (2) `<하네스>#<검사>` 형태 (3) 실재 검사로 해석 (4) 그 하네스가 이 주장의 문서를 어휘로 보유 — 넷만 본다(이 창에서 (4)의 대상이 원장 자기신고에서 **재추출** 로 옮겨졌고 SELF 백도어가 닫혔다). 붉음 대조는 여전히 없다. 리포트 §측정 환경이 `m3:anchor` 가 이 기계에서 rc 1 임을 적었고 원장에는 `m3#anchor` 를 근거로 든 `ok` 가 12행 있다. 강등 규칙은 저장소 밖 생성기(`emit-m8-ledger.mjs`)에 있어 재현 불가다. 처방 둘 중 하나: 붉음 대조를 `#6` 안으로 들이거나, PRD 문면을 실제 구현 범위(인용 없음·해석 불가·문서 미결박)로 정정한다. 후자는 PRD 편집이라 이 창의 `#12` 동결과 충돌한다. 인수처: 다음 창 · id=60m8-ok-citation-redness-unchecked |
| 2026-09-07 | LOW | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **`#7` 반사실 팔은 프로브가 없고 이번 실행에서 돌지도 않으며, 사본 실행의 rc 만 보고 진단 토큰을 안 본다 (santa-loop R1 · Reviewer A · 미해소).** 원장에 `사실과다름`·`빠짐` 이 0건이라 `CHECKS.absorb` 의 `flagged` 루프(반사실 팔 `runIn(box, SELF, ["extract"])` 를 포함)가 한 번도 실행되지 않는다. `MUTATIONS` id 7 은 `미검증` 행을 `빠짐` 으로 바꿔 `findings 발견으로 실재하지 않는다` 팔에서 **먼저 죽으므로** 반사실 팔에 닿지 않는다 — 계획서 `# 검사 #7` 의 `# 음성:` 이 적은 변조와 겨냥 팔이 다르다. 그 팔이 실제로 돌 때 `runIn(box, SELF, ["extract"])` 의 rc 가 0 이 아니기만 하면 뒤집힘으로 세므로, 사본 준비 실패로 죽은 실행도 흡수 증거로 계상된다. 이월 `60m8-chain-logic-unprobed` 는 `#14` 의 두 팔만 이름으로 적었고 이 팔은 그 목록에서 빠져 있었다 — 이 행이 그것을 잇는다. 인수처: 라운드 2 에서 지적이 처음 생기는 창 · id=60m8-absorb-counterfactual-arm-unprobed |
| 2026-09-07 | LOW | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **자기 파일을 가리키는 절대 행번호는 편집마다 썩는다 — 근거 앵커 규약이 없다 (santa-loop R1 · Reviewer A · 부분 해소).** santa-loop R0 이 `m8.gates.mjs` 에 ~139행을 끼워 넣자 같은 커밋이 올린 이월 3행(`60m8-freeze-sig-window-too-wide` · `60m8-frozen-baseline-worktree-fallback` · `60m8-absorb-counterfactual-arm-unprobed`)의 행번호 근거가 전부 다른 코드를 가리키게 됐다 — 인수처가 그 이월을 집으면 **틀린 자리를 수술한다**. R1 에서 그 세 행의 행번호를 **함수명 + 토큰** 앵커로 바꿔 해소했다. 남는 것은 규약의 부재다: 이 저장소에는 근거 앵커를 행번호로 적지 말라는 규칙도, 적힌 행번호가 그 토큰을 담는지 검사하는 코드도 없다. 같은 부류의 stale 이 이 창 밖에도 있다 — 코드 주석 두 자리가 `diag` 6행 창을 `941행`으로 가리키는데 실제는 `runSiblings` 안이고, H1 서술의 `m8:1396` 은 HEAD 에서 빈 줄이다(둘 다 앞 라운드 산출이라 이 행이 이름만 남긴다). 처방: 근거는 함수명+토큰으로 적고, 행번호를 남긴다면 그 행이 그 토큰을 담는지 보는 검사를 붙인다 · id=60m8-line-anchors-rot-on-edit |
| 2026-09-07 | LOW | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **리포트(`.claude/PRPs/reports/insuniverse-docs-60-history-deprecated-m8-report.md`) §게이트 실측 표가 커밋된 트리와 어긋난다 (santa-loop R1 · Reviewer A · 미해소).** 리포트는 `#0 ok`·`#11 ok`·`신설 34행` 으로 적었으나 재실행 실측은 `#0 FAIL`·`#11 FAIL`·`신설 38행` 이다. `#0`·`#11` 은 위 `60m8-base-assert-bound-to-moving-ref` 의 발화이고, `신설 34행` 은 코드 리뷰 이월 4행(리포트 §Files Changed 가 `+14` 로 적은 그 4행)을 더하기 전 값이라 같은 문서 안에서도 어긋난다. 다음 창이 이 표를 기준선으로 삼으면 *무엇이 회귀이고 무엇이 이동 참조인가* 를 리포트만으로 가를 수 없다. 리포트는 창 산출 기록이라 사후 정정보다 이 이월이 정본이다 · id=60m8-report-gate-table-stale |
| 2026-09-07 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **`#15` 음성 프로브 id 0 의 판정 토큰이 주입 변조에 결박돼 있지 않다 (santa-loop R1 · Reviewer A · 미해소).** `MUTATIONS` id 0 은 `docs/00-index.md` 를 변조하고 사본에서 `scope` 가 rc 1 + `창 범위 밖` 을 내면 통과로 적는다. 그런데 그 문면은 `baseAssert` 가 허용 집합 밖 경로 **무엇에든** 내는 단일 die 이고, 사본 구성기는 복사 대상 위에 없는 디렉터리를 junction 으로 걸다 실패하면 그 가지를 조용히 비운다 — 그러면 그 아래 추적 파일이 전부 삭제 상태로 `git status` 에 떠 `dirty` 가 허용 밖 경로로 채워지고, `docs/00-index.md` 를 한 바이트도 안 고쳐도 같은 rc·같은 토큰이 나온다. POSIX 에서 junction 인자는 일반 symlink 로 떨어지므로 가설이 아니라 기본 동작에 가깝다. `#15` 는 진단이 그 변조 경로를 이름으로 드는지 안 본다. 귀결: manifest 에 `id 0 · 음성 rc 1 · 토큰 실재` 가 기록되고 `#16` 이 증거로 받지만 *`#0` 이 허용 밖 변조를 잡는가* 는 한 번도 증명되지 않는다(층위 8 — 검사 자신의 사각지대). 처방: 진단이 변조 경로를 이름으로 들 것을 함께 요구한다. **이 창에서 안 고친 이유** — 겨냥 팔이 `#15 selfprobe` 인데 `#0` 이 붉어(`60m8-base-assert-bound-to-moving-ref`) 첫 양성에서 죽으므로 흡수의 반사실을 세울 수 없다. 인수처: `#0` 이 초록으로 돌아오는 창 · id=60m8-probe0-token-not-bound-to-mutation |
| 2026-09-07 | LOW | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **`#11` 의 양성 프로브가 환경변수로 꺼지면 라벨만 남기고 초록으로 내려가며 그 라벨을 읽는 검사가 없다 (santa-loop R1 · Reviewer A · 미해소).** `M8_NOPUBLISH_PROBE=0` 이 바깥 셸에 있으면 사본 프로브가 통째로 생략되고 출력은 `양성 프로브 미실행` 로 끝나며 rc 0 이다. `#16` 은 `#N ok` 계수와 `#15` manifest 만 보고 이 라벨을 안 읽으므로 완주 계상이 성립한다 — 즉 *이 검사가 발행을 실제로 잡는가* 의 증거가 없는 상태가 초록이다. 이 값은 하네스 자신이 사본 실행에 넣는 변수라 래퍼나 셸 이력을 통해 바깥으로 새기 쉽다. 같은 파일이 `#16` 에서는 *증거 부재를 통과로 읽지 않는다* 를 명문화하고 있어 규약이 파일 안에서 서로 반대다(층위 8). 처방: env 옵트아웃을 없애거나 `#15` manifest 에 `nopublish_probe` 항목을 실어 `#16` 이 그 부재를 실패로 읽게 한다. **이 창에서 안 고친 이유** 는 위 행과 같다 · id=60m8-nopublish-probe-env-optout |
| 2026-09-07 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **어휘 스캐너의 `}` 뒤 슬래시 판정은 lookbehind 로 못 가르고, INV1 이 파서를 막는다 — 잔여를 구조로 덮었다 (santa-loop R2 · Reviewer B 반례 · Reviewer A 처방 · 부분 해소).** `const __probe = {} / 2; /* docs/90-history/00-origin.md */` 에서 `}` 는 `RE_LITERAL_START` 에 있어 그 슬래시가 정규식 여는 자리로 읽히고, 그 가짜 정규식이 뒤따르는 블록 주석의 여는 슬래시를 삼켜 **주석 본문이 코드로 남는다**. `}` 가 블록 끝인지 객체 리터럴 끝인지는 앞 문자 몇 개로 결정되지 않으므로 이 자리는 정식 파서 없이는 안 닫히고, **INV1(신규 의존 0)** 이 그것을 막는다. **이 창이 한 것은 실패의 *방향* 을 바꾼 것이다** — `gateDocCoverage` 가 어휘 행렬을 PRD `Delivery Milestones` 표에서 독립으로 유도한 지도와 대조해 불일치에 죽는다. 잉여(주석에서 커버리지를 얻음)와 결손(코드 본문을 먹음) **양방향** 을 반사실로 확인했다: 이 반례를 m3 에 심으면 `#6 FAIL: 커버리지 행렬의 두 독립 유도가 다르다 … 어휘[00-origin,03-divergence] PRD[03-divergence]` rc 1 · m3 의 문서 리터럴을 지우면 `어휘[-] PRD[03-divergence]` rc 1 · 무변조 rc 0. 즉 조용한 통과는 닫혔고 남은 것은 *오파싱 자체* 다. 남은 위험: 두 유도가 **같은 방향으로** 틀리는 경우(PRD 표와 하네스가 같은 오해를 공유)는 이 대조가 못 잡는다. 인수처: 파서 도입이 가능해지거나 하네스가 자기 입력 집합을 출력 계약으로 방출하는 창(`60m8-doc-coverage-is-lexical-not-executed`) · id=60m8-brace-slash-ambiguity-unclosable |
| 2026-09-07 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **santa 레인의 Reviewer A 서브에이전트 종류가 어디에도 기록되지 않는다 (santa-loop R3 기록 시 실측).** CLAUDE.md §4 는 *"Reviewer A 를 매 라운드 갈아 끼운다"* 를 규범으로 두는데 그 준수를 확인할 기록이 없다 — `.claude/state/santa-loop/<decision>.json` 의 `rounds[].reviewers[].envelope` 는 `id`·`model`(`opus`)만 싣고 서브에이전트 종류를 안 남기고, 원장의 `## 라운드 N 실측` 절은 손으로 쓰는 것이라 R2 에서 끊겼다. 그래서 R0~R2 는 이름이 남았고 **R3 은 남지 않았다.** 로테이션이 실제로 일어났는지가 이 저장소의 기록으로 판정 불가다 — 규범이 검사 없이 남은 자리(층위 2)이며, 해소하려면 santa 산출 스키마에 레인 에이전트를 싣게 해야 하는데 그 파일은 mccp 플러그인 소유라 B1 이 막는다. 상류 환류 대상이다(B5). id=60m8-santa-lane-agent-unrecorded |
| 2026-09-07 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **`#1` 과 `#3` 이 이 기계에서 상호 배타다 — golden 이 기계 지문을 동결한 결과 (m8 실측, 이월 `60m8-golden-freezes-machine-fingerprint` 의 실행 확인).** `golden.txt` 의 `env.git_version` 이 `git version 2.55.0.windows.3` 로 동결돼 있고 이 기계는 `2.43.0` 이라 `#1` 이 붉다. `verify.sh --update` 로 재동결하면 `#1` 이 rc 0 이 되지만 `#3` 이 `FAIL: 움직인 키 2 [env.git_version fixtask.findings_headings]` 로 뒤집힌다 — `#3` 은 BASE 대비 움직인 키가 정확히 `fixtask.findings_headings` 하나일 것을 요구한다. 둘 다 초록인 상태가 이 기계에 존재하지 않으며, 그래서 `#15` 가 양성 프로브 `#1` 에서 죽고 `#16` 완주가 성립하지 않는다. 해소는 `env.git_version` 을 golden 에서 빼는 것이고 그 편집은 이 PRD 의 `docs/_meta/verify/**` 위임(`--update` 재동결 한정) 밖이다. **2026-09-08 실행 확인** — 이 상호 배타가 주장이 아니라 실측이다. `verify.sh --update` 를 돌리면 워킹트리 변경이 `docs/_meta/verify/golden.txt` 1건이고 `#1 ok  verify.sh --check rc 0 · 마지막 줄 'check PASS' · stdout 135행` 인데 같은 상태에서 `#3 FAIL: 움직인 키 2 [env.git_version fixtask.findings_headings]` 다. `git checkout -- docs/_meta/verify/golden.txt` 로 되돌리면 정확히 뒤집혀 `#1 FAIL` · `#3 ok  움직인 키 1 [fixtask.findings_headings]` 다. 두 검사가 동시에 초록인 상태가 이 기계에 없다는 것이 두 방향 실행으로 확인됐다. id=60m8-verifier-and-golden-mutually-exclusive |
| 2026-09-07 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **해소 선언 술어는 여전히 어휘 술어다 (santa-loop R4 흡수의 천장).** R4 가 `미해소` 우회를 닫았지만(간격의 부정 표지 `미·못·안` 배제 + `해소` 뒤 8자의 부정 어미 배제) 이것은 자연어의 부정을 전부 덮지 못한다 — 예: *"해소로 보였으나 아니었다"* 처럼 부정이 8자 밖에 오면 통과한다. 구조적 해소는 해소 선언을 산문이 아니라 **필드**로 받는 것(이월 표에 `resolves=<id>` 열 신설)이고 그 편집은 이 저장소 이월 표 형식 소관이라 이 창 밖이다. 음성 프로브 `13n` 이 지금 닫힌 자리만 지킨다. id=60m8-resolve-predicate-is-lexical |
| 2026-09-07 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **`#15` 는 이 기계에서 못 도는데 그 프로브 26건은 별도 구동으로만 확인됐다 (santa-loop R4).** `#15` 는 양성 프로브로 `#1` 을 먼저 돌리고 `#1` 은 `60m8-verifier-and-golden-mutually-exclusive` 로 붉다. R4 가 신설한 9프로브(`0m`·`12t`·`12s`·`6r`·`6f`·`6k`·`13n`·`13s`·`13d`)와 기존 17건은 하네스 소스를 `export` 로 감싼 **저장소 밖 구동기**로 돌려 25/26 이 rc 1 + 토큰 일치임을 확인했다. 남은 1건은 `#1` 프로브이며 사본에서 `verify.sh` stdout 이 0행이라 겨냥 축(`열거 필드다`)에 안 닿는다 — `#1` 붉음과 **같은 뿌리**이고 별도 결함이 아니다. 이 구동기는 이력에 없으므로 **다음 창은 `#15` 를 직접 돌려 이 관측을 재현해야 한다.** id=60m8-selfprobe-verified-out-of-band |
| 2026-09-07 | LOW | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **`#11` 의 내부 양성 프로브가 rc 만 보고 진단 토큰을 안 본다 (santa-loop R4, Reviewer A, severity LOW).** `sandbox` 는 junction 실패를 조용히 삼켜 그 가지를 비워 두므로, 사본 구성이 실패해 겨냥 축(발행) 전에 `read()` 로 죽은 실행도 `양성 프로브 rc1` 로 계상된다. 같은 축을 토큰까지 무는 `MUTATIONS` id 11 은 `#15` 소관이고 `#15` 는 위 행의 이유로 이 기계에서 안 돈다. 해소는 `#11` 내부 프로브도 `#15` 처럼 토큰을 요구하게 하는 것이며 이 창은 R4 blocking 흡수를 우선해 안 넣었다. id=60m8-nopublish-inner-probe-rc-only |
| 2026-09-07 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **종료된 마일스톤 `2r` 이 형제 하네스 스윕 밖이고 그 하네스 파일이 아예 없다 (santa-loop R4, Reviewer A, severity CRITICAL 의 잔여).** PRD `2r` 행은 `complete` 이고 `m2r.plan.md` §Validation 이 `m2r.gates.mjs` 를 부르지만 그 파일이 저장소에 없다. 반대로 `m2c`(PRD 행 없는 두 번째 계획서)는 하네스가 있어 스윕된다. R4 가 `assertSiblingSet` 으로 이 어긋남을 **선언 대조로 승격**해 `#12` 출력이 매 실행 `초과 [m2c] · 결손 [m2r]` 을 싣게 했다 — 침묵은 닫혔다. 그러나 어긋남 자체는 남는다: `SIBLINGS` 에 `m2r` 을 넣으려면 `baseline.txt`(Task 0 동결)를 창 안에서 다시 얼려야 하고 그것이 `frozenBaseline` 이 막는 행위다. 인수처는 다음 창의 Task 0 이다. id=60m8-unswept-siblings |
| 2026-09-07 | HIGH | .claude/plans/insuniverse-docs-50-domain-m12.plan.md | **`Q20` 정정 — 분석 결과 **계산** 로직의 소재 모듈이 server 각론 어디에도 없다.** 기록은 `성립`, 마일스톤 12 재판정은 `미성립`(블라인드 미성립 · 반증 2/2 합의). 뒤집은 창 `m11`. `docs/10-server/02-treat.md 132` 는 *"모은 자료를 해석해 내놓는 결과 축은 01-analysis.md 가 진다"* 로 위임하는데 `docs/10-server/01-analysis.md` 는 *"각 축이 담는 값의 산출 규칙은 이 문서가 판정하지 않는다"* 로 배제한다 — 요청 진입~수집(02)과 결과 조회(01)는 서고 그 사이 계산 절이 어느 문서에도 없다. 이 창은 판정만 정정하고 각론을 다시 쓰지 않는다(§NOT Building). 인수처: `docs/10-server/01-analysis.md`·`02-treat.md` 재저작 창 · id=50m12-q20-analysis-compute-locus-undocumented |
| 2026-09-07 | HIGH | .claude/plans/insuniverse-docs-50-domain-m12.plan.md | **`Q21` 정정 — 정산 생성 조건이 03↔04 상호 위임으로 비어 있다.** 기록은 `성립`, 마일스톤 12 재판정은 `미성립`(반증 2/2). 뒤집은 창 `m10`. `docs/10-server/03-subscription-order.md` 는 정산 정의를 `04-settlement-money.md` 로 위임하고 04 는 자기 역할을 *"규칙이 자료에 걸리는 자리만 내는 것"* 으로 선언해 정산이 **언제 생기는지**와 주문 상태↔정산 상태 관계가 어느 쪽에도 없다. 둘째 절(정산·머니 도메인의 총론 한도 규칙)도 04 에 앵커가 0건이다. 인수처: `docs/10-server/03-subscription-order.md`·`04-settlement-money.md` 재저작 창 · id=50m12-q21-settlement-linkage-mutual-deferral |
| 2026-09-07 | HIGH | .claude/plans/insuniverse-docs-50-domain-m12.plan.md | **`Q35` 정정 — 구독 결제 성공 시 잔여 한도·영수증 두 절이 각론·총론 어디에도 없다.** 기록은 `성립`, 마일스톤 12 재판정은 `미성립`(반증 2/2, 다만 한 렌즈는 절 분해 과다를 지적하며 결론은 유지). 뒤집힌 시점은 `m9` 이래. `docs/04-limits/01-amounts-and-quotas.md` 는 금액·수량 절대 상한만 다루고 구독 상품별 이용 한도 변화를 다루지 않으며, `docs/10-server/04-settlement-money.md` 의 `INVOICE_ASSEMBLY` 는 청구서 조립까지만 기술해 결제 성공 시점의 영수증 생성이 비어 있다. 인수처: `docs/10-server/03-subscription-order.md`·`04-settlement-money.md` 재저작 창 · id=50m12-q35-quota-receipt-clauses-absent |
| 2026-09-07 | HIGH | .claude/plans/insuniverse-docs-50-domain-m12.plan.md | **`Q50` 정정 — 엑셀 내보내기 행 단위 실패 표시를 문서가 스스로 미판정으로 적었다.** 기록은 `성립`, 마일스톤 12 재판정은 `미성립`(반증 2/2). 뒤집은 창 `m11`. 근거는 문서 자신의 문면이다 — `docs/30-admin/01-admin-console.md:331` *"이 축은 쓰기가 아니라 행 단위 실패 표시를 이 창에서도 확정하지 못했다"* · 같은 파일 `299-300` 이 같은 문장을 반복한다. 정산 축은 건별 사유·수동 재선택으로 답이 서지만 질문의 다른 갈래(엑셀)가 비어 미성립이다. 인수처: `docs/30-admin/01-admin-console.md` 재저작 창 · id=50m12-q50-excel-export-row-failure-undetermined |
| 2026-09-07 | HIGH | .claude/plans/insuniverse-docs-50-domain-m12.plan.md | **`Q54` 정정 — 동시 쓰기 충돌의 사용자 통지 여부를 문서가 스스로 미판정으로 적었다.** 기록은 `성립`, 마일스톤 12 재판정은 `미성립`(반증 2/2). 뒤집은 창 `m11`. `docs/30-admin/01-admin-console.md:425` *"충돌 통지 여부는 이 문서가 판정하지 않았다"* · 같은 파일 `109` 가 limitations 에 같은 선언을 둔다. 세 절 중 (1) 동시 처리 시 일어나는 일 · (2) 덮음 여부는 답하고 (3) 통지 여부만 비어 있다. 총론(`docs/04-limits/03-rate-limits-and-batch.md` 등)에도 없다. 인수처: `docs/30-admin/01-admin-console.md` 재저작 창 · id=50m12-q54-concurrent-write-notification-undetermined |
| 2026-09-07 | HIGH | .claude/plans/insuniverse-docs-50-domain-m12.plan.md | **`단독 온보딩 성립` 축이 미성립으로 확정됐고 지표는 이 창에서 닫히지 않는다.** 독립 재판정 실측 — 23건 중 성립 13 · 미성립 10(`Q20` `Q21` `Q35` `Q36` `Q49` `Q50` `Q51` `Q53` `Q54` `Q55`). Target 100% 대비 실측 56.5%. 이 창은 `kind:"maintainer-verdict"` 레코드로 그 값을 기록하고 §Delivery Milestones 9·10·11행을 8행 선례(산출 인도 + 잔여 이월)로 전이시킬 뿐, 미달 10건을 닫지 않는다. 앞 창 이월 `id=50m10-onboarding-unmet-admin` 계열과 별개로 **판정이 섰다는 사실**을 이 행이 진다. 인수처: server·admin 각론 재저작 창 · id=50m12-onboarding-axis-unmet |
| 2026-09-07 | HIGH | .claude/plans/insuniverse-docs-50-domain-m12.plan.md | **`리뷰 불일치 수렴` 축이 미성립으로 확정됐고 지표는 이 창에서 닫히지 않는다.** 독립 재판정 실측 — 회차 1 = 48건 · 회차 2 = 12건이며 Target 은 2라운드 연속 0건이다. 두 회차는 방향이 갈려(`주장 → 원천` vs `원천 → 주장`) 연속성 자체가 성립하지 않는다는 것이 판정 사유다. 회차 2 의 12건은 `docs/20-site/00-ia.md` 가 담지 못한 화면 라우트이며 앞 창이 `id=50m10-round2-ia-doc-missed-screen-routes` 로 이미 이월했다 — 이 행은 그 중복이 아니라 **축 판정이 미성립으로 섰다는 사실**을 진다. 인수처: `docs/20-site/**` 재저작 창 + 리뷰 회차 3 소유 창 · id=50m12-review-convergence-axis-unmet |
| 2026-09-07 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m12.plan.md | **`#6` 의 종료 주장 술어는 부정어를 끼운 실질 종료 주장을 통과시킨다 (Codex 구현 라운드 권고 7, 미흡수).** 검사는 문단 단위로 *주어 어휘(축·지표·온보딩·수렴·Target) × 달성 어휘(성립했·달성·충족·닫혔) × 부정 부재* 를 본다. 그래서 같은 문단에 `아니` `없` `못` `미달` 중 하나만 있으면 그 문단은 판정 대상에서 빠진다 — *"닫히지 않은 것은 없다"* 류의 회피 문면이 구조적으로 통과한다. 문자열 목록이 아니라 술어인 것은 개선이지만 의미 판정의 대체는 아니며, 이 창은 그 사각지대를 닫지 않고 이름으로 드러낸다(층위 8). 인수처: plan-kit `.claude/templates/plan-kit/**` 소유 축 또는 후속 축 종료 창 · id=50m12-check6-closure-claim-predicate-blindspot |
| 2026-09-07 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m12.plan.md | **12행 자신의 전이 주체가 이 창 밖이다.** 이 창은 9·10·11행을 `complete` 로 뒤집고 자기 행(12)을 `in-progress` 로 세우지만 자기 행을 닫지 않는다 — `#7` 이 12행 `in-progress` 를 **요구**하므로 이 창 안에서 12행을 `complete` 로 만들면 그 검사가 붉어진다. 앞 창들이 같은 구조로 다음 창에 전이를 넘겼고(m10 §종료 절차가 도달 불가가 된 것이 그 대가다) 이 창도 같은 자리에 선다. 다음 창이 서지 않으면 12행은 영구 `in-progress` 다. 인수처: 50-domain PRD 의 다음 창 또는 `/mccp:archive-complete` 시점 · id=50m12-row12-self-transition-unowned — **RESOLVED 2026-09-07**: `/mccp:milestone-close` 가 인수처로 서서 12행을 `complete` 로 전이했다. 근거 `.claude/milestone-closures/12-axis-close-transition.md` · PRD §Milestone Closure Provenance `12-axis-close-transition` 행(`sha256:ec480ef5…`). 예고대로 `m12` 하네스 `check7` 이 붉어졌고 `check11` 이 연쇄로 따라왔다 — 실측 2건/11종이며 지정 붉음이라 고치지 않는다. 그 지정의 정본은 M12 원장이 아니라 그 closure 문서다(원장에 행을 더하면 `check3`·`check4`·`check5` 의 앵커 대조가 함께 붉어진다) |
| 2026-09-07 | HIGH | .claude/plans/insuniverse-docs-50-domain-m12.plan.md | **`Q34` 재판정이 원천과 모순된다 — 봉인이라 못 고친다.** 판정은 *"모든 단계가 실패를 흡수하고 뒤 단계를 계속 실행한다"* 로 성립을 승인했으나, 동결 `4d798f55` 의 `treat.event-handler.ts:454` 가 예외를 던져 458행 사용량 반영 · 464행 성공 알림 · 472행 완료 상태 갱신이 **실행되지 않는다**. 2중 리뷰 A(codex)가 동결 코드 조각에 실패를 주입해 메모리 실행: `THROWN:ANALYSIS_FAILED` · `success-tail-ran false`. `verdict.jsonl` 은 `check3` 이 앵커 blob 과 바이트 대조하므로 이 창에서 못 고친다 — M12 가 앞 창 과대평가 5건을 처리한 것과 같이 다음 창 `kind:"correction"` 행으로만 선다. 재현 `git --git-dir=<repo>/.git/modules/insuniverse-server show 4d798f55:apps/api/src/modules/treat/treat.event-handler.ts | sed -n '415,476p'` · id=50m12-q34-verdict-wrong — M13-RESOLVED 2026-09-08: 원장 `insuniverse-docs-50-domain-m13.ledger.jsonl` 의 `kind:"correction"` 행으로 섰다. 동결 좌표(`insuniverse-server` 핀 `4d798f55` · `apps/api/src/modules/treat/treat.event-handler.ts` 454·458·464·472행)를 게이트 `#4` 가 매 실행 실재 확인한다. **봉인된 `verdict.jsonl` 은 고치지 않았다**(UI7). `#4` 는 좌표 실재까지만 문고 "원천이 판정과 모순" 이라는 주장 자체는 기계 밖이라는 사실을 `check4.claim-is-coordinate-only` 가 매 실행 낸다 |
| 2026-09-07 | HIGH | .claude/plans/insuniverse-docs-50-domain-m12.plan.md | **`Q46` 을 2중 리뷰가 정반대 방향으로 갈랐다 — 이 종결이 판정하지 않는다.** 기록은 `성립`(반증 1/1 로 갈려 "2/2 합의만 채택" 규칙으로 유지). A(codex): 미성립 근거 *"사용자 통지 없음"* 이 거짓이다 — `treat.service.ts:895` 가 회원 알림을 만들고 실패 경로에도 867행 회원 알림이 있다. B(fable): `성립` 이 틀렸다 — `docs/30-admin/05-treat-monitoring.md:187` 이 스스로 *"이 경로가 답하지 않는다"* 고 적었고 그것은 `Q50`·`Q54` 를 미성립으로 뒤집은 기준과 같은 구조다. **둘 다 기록이 틀렸다고 하는데 방향이 반대이므로 갈린 사실 자체를 기록하고 이월한다.** 성립 계수는 13/23(기록) 또는 12/23(B) 이며 어느 쪽도 Target 100% 미달이라 축 판정 `미성립` 은 불변이다 · id=50m12-q46-dual-review-split — M13-RESOLVED 2026-09-08: 원장의 `kind:"split"` 행으로 섰고 **한쪽을 고르지 않았다**. A(codex)·B(fable) 두 판정을 근거·좌표와 함께 보존하고 `resolved:false` 로 둔다. 게이트 `#5` 가 그 두 필드를 요구하므로 갈림을 한쪽으로 접으면 `#5 FAIL: 갈림이 한쪽으로 접혔다` 로 붉는다. 축 판정에 대한 효과는 불변이다 — 성립 계수가 13/23 이든 12/23 이든 Target 100% 미달이라 `미성립` 이 유지된다 |
| 2026-09-07 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m12.plan.md | **`verdict.jsonl` 산문 층 결함 6건 — `check3` 이 묻지 않는 자리다.** (a) `Q20` 이 소재와 계산 방법을 혼동한다(질문 원문은 모듈·순서를 묻고 `02-treat.md:246` 이 소재를 `treat.event-handler.ts:424` 로 명시); (b) `Q41` 푸시 분기의 연결 근거 미확인; (c) `Q35` 반증 2 문면이 *"1차 판정을 무너뜨릴 수 있다"* 인데 `refuters_backing_blind:2` 로 집계; (d) `axis-summary` 의 *"감소 없음(48→12)"* 은 산술 자기모순 — 감소는 있고 연속 0 이 아닐 뿐; (e) 렌즈 1 `round1_findings:-1` vs 렌즈 2 `48`; (f) `Q36`·`Q41` 은 `refuters:1` 이라 *"반증 2렌즈"* 가 갈린 8건 중 2건에 성립하지 않는다. 전부 최종 축 판정(미성립)에 영향 없으나 봉인이라 못 고친다 · id=50m12-verdict-prose-defects — M13-RESOLVED 2026-09-08: 하위 결함 6건을 **이름 있는 라벨**로 분해해 골든 `carry-sub` 분모에 세웠고, 게이트 `#6` 이 이 행의 라벨 인용 집합과 그 분모를 차집합 0 양방향으로 문다. carry 단위로만 물면 하위 하나만 처리해도 초록이던 자리다. [carry-sub: q20-locus-vs-method q41-push-branch-unlinked q35-refuter-tally-mismatch axis-summary-arithmetic lens1-round1-findings-negative q36-q41-single-refuter] 대응은 (a)=q20-locus-vs-method · (b)=q41-push-branch-unlinked · (c)=q35-refuter-tally-mismatch · (d)=axis-summary-arithmetic · (e)=lens1-round1-findings-negative · (f)=q36-q41-single-refuter 다. 전부 봉인된 `verdict.jsonl` 산문 층이라 고치지 않으며 최종 축 판정에 영향이 없다. **라벨 대조까지다** — 하위 결함의 내용이 실제로 해소됐는지는 기계 밖이고 `check6.subdenominator-is-label-proxy` 가 그 사실을 매 실행 낸다 |
| 2026-09-07 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m9.gates.mjs | **`m9` `check5` 붉음 200건이 어느 원장에도 귀속되지 않는다.** 현재 바이트에서 `node .claude/plans/insuniverse-docs-50-domain-m9.gates.mjs check5` 가 `#5 FAIL: 원장 표기와 재유도가 갈린 행 200건` rc 1 이다. M12 `check10` 은 지정 대상 4건(`m9/check16` `m10/check8` `m11/check1` `m11/check10`)만 돌리므로 — 그 검사가 출력에서 `(미검증)` 으로 스스로 이름을 낸 사각지대 — 이 붉음은 지정 집합 밖이다. 원인이 전이 귀속인지 서브모듈 미초기화인지 2중 리뷰가 확정하지 못했다 · id=50m12-m9check5-unattributed — M13-RESOLVED 2026-09-08: **원인을 확정했고 2중 리뷰가 든 두 가설은 둘 다 반증됐다.** 커밋 단위 이분법(detached worktree 에서 각 커밋을 체크아웃해 같은 서브커맨드 실행) 실측: `85a0115`(M9 자신) 초록 → `a6d09bc`(M10, `docs/10-server/03-subscription-order.md` +4줄) 붉음 29건 → `341f7d6`(M11, `docs/30-admin/01-admin-console.md` +51/-6) 붉음 200건. `check5` 의 `text@line` 축은 라운드 1 원장이 적은 (행번호, 문면) 쌍을 산출 문서의 그 행에서 다시 찾는데, **뒤 창이 그 문서 위쪽에 줄을 더하면 좌표가 밀린다**. 전이 귀속 가설은 시점이 안 맞고(두 붉음 다 M12 이전), 서브모듈 미초기화 가설은 축이 안 맞는다(`text@line` 은 서브모듈이 아니라 저장소 안 `docs/` 를 읽는다). 어휘 `downstream-doc-edit` 로 원장 `kind:"attribution"` 행에 섰고 **창 귀속이 아니다** — m13 은 원인이 아니며 고치지도 않는다. 게이트 `#7` 이 매 실행 m9 를 다시 돌려 이 귀속이 인용한 붉음과 대조한다 |
| 2026-09-07 | HIGH | .claude/plans/insuniverse-docs-50-domain-m13.plan.md | **M13 계획서가 L2 패널 3라운드에서 수렴하지 못했고 라운드 예산(cap 3)이 소진됐다 — `mccp-plan-codex` receipt 미발행.** 최종 판정 `divergent` · `halt_stage 5.2e` · 정본 `.claude/reviews/plan-review-insuniverse-docs-50-domain.md`. 세 라운드의 지적 **전건을 흡수**했고(원장 참조) 라운드마다 다른 층을 팠다 — R1 표본≠범위·분모 저작·항진 게이트, R2 덫 재생산·앵커 한 커밋 침식·저장소 관례와 충돌하는 게이트, R3 소유 경계·거울상 fail-open·정본 자기모순. **흡수했다는 사실이 승인이 아니다** — 마지막 흡수분은 어떤 패널도 보지 않았고 그 사각지대가 이 행의 내용이다. 인수처: 새 리뷰 주기(계획서 바이트가 바뀌었으므로 새 dispatch 는 `round_index 0`) 또는 사용자 판정 · id=50m13-plan-gate-unconverged — **SANTA-R0 정정 2026-09-08**: 이 행의 전제가 저장소와 모순된다. `.claude/receipts/mccp-plan-codex/insuniverse-docs-50-domain-m13.json` 이 **존재하며** `resolution.review_verdict:"converged"` · l1·l2 둘 다 converged · quorum 4/4 역할 통과 · `reviewed_plan_hash` 가 `plan_hash` 와 일치한다. `#1` 이 매 실행 그 receipt 로 앵커를 유도하고 체인을 검증한다(check1 rc 0). HEAD 의 `.claude/reviews/plan-review-insuniverse-docs-50-domain-m13.md` 도 converged 다. 이 행의 id 는 골든 `carry` 에 없어 `#6` 이 보지 않으므로 낡음을 기계가 영원히 못 잡는다 — 그래서 산문으로 정정한다. 판정자: santa-loop R0 blind lane(A, opus) 독립 재유도 |
| 2026-09-07 | MEDIUM | (mccp 본체 · 상류 #128) | **L2 패널 프롬프트에 CLAUDE.md §3 불변식이 주입되지 않는다.** 이 저장소 규약은 리뷰어 루브릭에 INV1~INV6 을 원문 주입하고 전제 부정형 지적을 `out_of_scope_observations` 로 분리하도록 지시하는데, `plan-review/cli.js emit-workflow-args` 가 생성하는 네 프롬프트는 그 절을 담지 않는다. 실측 대조: 같은 자료를 codex·fable 에 헌장(불변식 주입)으로 돌렸을 때 기각 0건 — 양측이 스스로 out-of-scope 를 분리했다. 패널 쪽은 그 장치가 없다. mccp 파일 미수정(B1)이라 이 저장소에서 고칠 수 없고 상류 이슈 [#128] 이 그 자리다 · id=50m13-panel-rubric-no-invariants |
| 2026-09-07 | HIGH | .claude/plans/insuniverse-docs-70-viewer-m10.plan.md | **다중 파일 독자 세션이 세대에 고정되지 않는다 — 후속 창을 위한 설계는 이미 서 있다 (m10 R4 · L3 Codex HIGH · Fable·Codex 독립 실측 확증).** 마일스톤 10 은 `live` 를 지나는 **경로 해석 한 번**을 원자화한다. 그러나 파일을 열 때마다 포인터가 새로 해석되므로 `live/index.html`(A세대)을 읽은 독자가 뒤이어 `live/search-index.js` 를 B세대에서 읽는다 — 산출 HTML 이 검색 인덱스를 별도 요청으로 싣기 때문이다(`docs/viewer/build-docs.mjs:1582`; `file://` 제약상 `fetch` 가 아니라 클래식 script src 여야 하는 근거가 `:66-71`). 두 모델이 각자 독립 probe 를 돌려 같은 표를 얻었다: 링크 교체 + 이전 세대 보존 = **혼합**, 세대 URL 고정 + 이전 세대 이동 = **ENOENT**, 세대 URL 고정 + 보존 = **A→A**. m10 은 주장을 좁히고 이 잔여를 검사 `#5` 의 `k>0`·`e>0` 으로 값 관측하는 쪽을 택했다(헌장이 세션 원자성을 약속한 적이 없다 — 이 파일 452행이 *"디렉터리를 여는 독자"* 이고 PRD 435행은 발행자 측만 단다). **후속 창의 설계는 열린 질문이 아니라 Codex 가 낸 안 E 다**: `build/live/` 를 일반 디렉터리로 두고 그 안의 `index.html` 을 `../.gen/<runId>/index.html` 로 보내는 **일반 파일 스텁**으로 교체하며(심볼릭 링크 능력이 아예 필요 없어 m10 의 강등 경로가 불필요해진다), **세대는 이동하지도 삭제하지도 않는다**(그래야 고정 독자의 ENOENT 가 사라진다). 세대 페이지에 `live` 자동 복귀 링크를 넣지 않고, 한번 노출한 세대는 롤백 뒤에도 보존한다. 대가는 디스크 단조 증가이며 안전한 자동 회수는 별도 축이다. 미실측으로 남은 것: Windows 에서 일반 파일 교체와 **열린 파일 상태**의 실패 동작(`junction=OK` 는 기존 대상 위 교체 가능을 증명하지 않는다) · 세대 하나의 디스크 크기. 인수처: 산출 배포와 진입점 계약을 정하는 창(PRD §Open Questions 의 산출물 커밋 판정과 같은 창) · id=70m10-reader-session-not-generation-pinned |
| 2026-09-07 | MEDIUM | .claude/plans/insuniverse-docs-70-viewer-m10.plan.md | **hybrid 리뷰의 L3 findings 가 이력에 안 남는다 — 교차 모델 지적이 워크트리와 함께 사라진다 (m10 R4 실측).** `plan-review/cli.js record` 가 쓰는 `.claude/reviews/plan-review-<slug>.md` 는 L3 축을 `verdict` 와 `reason` 두 값으로만 싣는다(`record.js#readL3` 이 그 둘만 읽는다). 실제 findings 는 `.claude/state/plan-review/l3-findings.json` 에만 있고 `.claude/state/` 는 gitignore 대상이다. 그래서 m10 R4 에서 L3 가 이 창의 **핵심 주장을 반증한 HIGH 한 건**을 냈는데 리뷰 기록에는 `L3 divergent` 한 단어만 남았다 — 실측 확인: 그 지적의 원문을 `.claude/reviews/` 어느 파일에서도 `grep` 으로 찾을 수 없다. L2 findings 는 표로 실리는데 L3 만 그렇지 않아, 정확히 *다른 모델이 봤기 때문에 값이 있는* 지적이 가장 잘 사라진다. 이 창은 그 원문을 계획서 §Codex Adversarial Review 에 손으로 옮겨 이력에 남겼으나 그것은 규약이 아니라 이번 판단이다. 해소는 `record.js` 가 L3 findings 를 L2 와 같은 표로 싣는 것이며 mccp 본체 소유다(B1 — 이 저장소는 플러그인 파일을 고치지 않는다). 인수처: mccp 상류 이슈로 환류 · id=70m10-l3-findings-not-recorded |
| 2026-09-07 | MEDIUM | .claude/plans/insuniverse-docs-70-viewer-m10.plan.md | **mccp L1 의 인용 검사가 `.` 접두 경로를 구조적으로 못 푼다 (m10 R4 실측 · 상류 환류 대상).** `l1-check.js` 의 `CITATION_RE = /([A-Za-z0-9_][A-Za-z0-9_./-]*\.[A-Za-z0-9]+):(\d+)(?:-\d+)?/g` 는 첫 문자를 `[A-Za-z0-9_]` 로 강제하므로 `.claude/plans/foo.md:452` 에서 **선행 점을 버리고** `claude/plans/foo.md` 를 캡처한다. 그 경로는 `CITATION_BASES` 어디에서도 안 풀려 `C6_UNRESOLVED_CITATION` 이 난다. 결과: 이 저장소에서 가장 흔한 인용 대상(`.claude/plans/*.gates.mjs` · `.claude/plans/codex-findings-backlog.md`)에 **행번호를 붙이면 항상 위반**이고, 붙이지 않으면 검사 대상이 아니다(`// Only path:line citations are checked`). 그래서 계획서들은 `` `.claude/…/x.gates.mjs` 597행 `` 처럼 행번호를 백틱 밖으로 빼는 우회를 써 왔고, 그 형식은 C6 가 한 건도 안 본다 — 우회가 곧 사각지대다. m10 R4 에서 이 축으로 위반 5건이 실제로 났고 같은 우회로 닫았다. 해소는 정규식 시작을 `[A-Za-z0-9_.]` 로 넓히는 한 글자이며 mccp 본체 소유다(B1). 인수처: mccp 상류 이슈로 환류 · id=mccp-l1-citation-drops-dot-prefix |
| 2026-09-07 | HIGH | .claude/plans/insuniverse-docs-70-viewer-m10.plan.md | **노출한 세대의 안전한 자동 회수에는 독자 수명 프로토콜이 필요하다 (m10 R5 · L3 Codex HIGH · R4 안 E 와 독립 중복).** 마일스톤 10 은 세대를 만들고 포인터를 원자 교체하되 **이전 세대를 회수하지 않는다**. 회수하면 단일 `open` 조차 안전하지 않기 때문이다: 경로 해석은 조각별이라 독자가 `live` 를 세대로 푼 뒤 아직 열지 않은 자식이 그 사이 회수되면 **같은 open 이 ENOENT 로 끝난다**. 이것은 여러 파일을 읽는 세션의 잔여가 아니라 m10 이 좁혀 세운 주장(*경로 해석 한 번은 언제나 한 세대*) 자체의 실패다. R4 에서 Codex 가 낸 안 E 의 핵심 조건이 이미 *세대를 이동하지도 삭제하지도 않는다* 였고 R5 에서 L3 가 같은 자리를 다시 쳤다(conf 0.95 · 경쟁 재현은 안 했다고 명시). m10 이 유예를 택한 근거는 대가의 비대칭이다 — 디스크는 나중에 정책으로 회수할 수 있지만 독자가 읽는 도중 받는 ENOENT 는 독자 쪽에서 되돌릴 수 없다. **남는 대가는 발행마다 디스크가 단조 증가한다는 것이고 이 창은 그것을 줄이지 않는다.** 안전한 회수는 진행 중 경로 해석이 끝났음을 보장하는 프로토콜(임대 · 세대별 독자 카운트 · 유예 뒤 재확인 중 하나)을 요구하며, 그 프로토콜 없이 N세대/T시간 임계값만 두면 임계값이 검사 없는 리터럴이 되어 INV4 와 충돌한다. 검사 `#5` 가 유예가 실제로 걸렸음을 `고정 독자 ENOENT == 0` 과 `노출 세대 전건 실재` 로 관측한다. 인수처: 세대 회수 정책을 독자 수명과 함께 세우는 창 · id=70m10-generation-reclamation-without-reader-lifetime |
| 2026-09-07 | MEDIUM | .claude/plans/insuniverse-docs-70-viewer-m10.plan.md | **`publish.mjs` 의 `BLIND_SPOTS` 등록부가 앞 창 하네스에 결박돼 갱신 불가다 (m10 R5 · test HIGH 실측).** 그 배열(`docs/viewer/publish.mjs:372`)은 *계획서 §NOT Building 과 이름 대조* 라는 계약을 지는데, 대조하는 쪽이 `.claude/plans/insuniverse-docs-70-viewer-m8.gates.mjs` 다: 52행이 배열을 import 하고 1571-1574행이 `const nbSet = new Set(nb.rows); const proseOnly = BLIND_SPOTS.filter((s) => !nbSet.has(s.notBuilding)); if (proseOnly.length) die(...)` 로 **전 행**을 m8 계획서(59행 `PLAN` 상수)의 §NOT Building 과 **정확 일치**로 문다. 그래서 이후 어느 창도 그 배열에 행을 더하거나 좁혀 쓸 수 없다 — 새 문자열은 m8 계획서에 없고 m8 계획서는 `plan_hash` 결박이라 못 고치므로 m8 `#14` 가 **그 창 때문에** 붉어지며, 선재 붉음이 아니라 신규라 차감 대상도 아니다. m10 은 R4 에서 그 갱신을 Task 에 실었다가 R5 지적으로 **철회**하고 배열의 바이트 무변동을 `#16` 이 요구하게 바꿨다. 구조적 해소는 대조의 방향을 뒤집는 것(등록부가 어느 계획서를 가리키는지 행마다 들고, 하네스는 자기 창 소유 행만 대조)이며 m8 하네스를 소유하거나 그 결박이 풀리는 창의 몫이다. 인수처: 앞 창 하네스의 등록부 대조를 행 소유별로 좁히는 창 · id=70m10-blind-spots-registry-cross-window-locked |
| 2026-09-07 | MEDIUM | .claude/plans/insuniverse-docs-70-viewer-m10.plan.md | **강등 환경의 비원자성이 rc 로는 안 보인다 (m10 구현 실측).** 심볼릭 링크를 세울 수 없는 호스트에서 `docs/viewer/publish.mjs` 의 교체는 실 디렉터리 사본으로 돌아가고 **읽기 측 원자성이 성립하지 않는다**. 그 사실은 `gate build` **완주 문면에** 이름으로 실리지만(구현 실측: `metrics` 는 발행 **전**에 생성기가 쓰므로 발행 모드를 담지 않으며, 담게 하는 것은 golden 키를 움직이는 산출이라 그 창의 범위 밖이었다 — UI9) **종료 코드는 0** 이므로, rc 만 검사하는 자동 호출자는 비원자 발행을 원자로 받는다. m10 은 이 축을 의도적으로 안 닫았다 — 닫으려면 원자 모드를 **요구하는** 게이트(예: `--require-atomic`)가 필요하고 그것은 발행 원시연산이 아니라 **호출 규약**의 변경이라 그 창의 재료가 아니었다. 검사 `#8` 이 강등 표본을 값으로 내고 `#16` 이 이 잔여를 실행마다 이름으로 낸다. 인수처: 발행 호출 규약을 정하는 창(원자성 요구 플래그와 그 기본값 판정) · id=70m10-degraded-mode-invisible-to-rc |
| 2026-09-07 | LOW | .claude/plans/insuniverse-docs-70-viewer-m10.plan.md | **`git check-ignore` 가 심볼릭 링크 너머를 판정하지 못해 계획서 GROUND 관측 1 의 한 행이 재현 불가다 (m10 구현 실측).** 그 표는 `docs/viewer/build/live/index.html` 을 `.gitignore:59:build/` 적중으로 적었으나, 그 측정은 `live` 가 아직 링크가 아니던 시점의 것이다. 링크가 선 뒤 같은 명령은 `fatal: pathspec … is beyond a symbolic link` 로 **거부**한다. **계약은 약해지지 않고 강해진다** — 같은 거부가 `git add -f` 에도 걸려(실측) 포인터 경유 경로는 `.gitignore` 가 덮어서가 아니라 구조적으로 추적 불가다. 검사 `#3` 은 좌표 적중을 실 디렉터리 엔트리에서만 재고 그 제외 구간을 출력에 이름으로 낸다. 남는 것은 *링크 경유 경로의 ignore 적중을 직접 관측할 방법이 없다* 는 사실이며, 그 성질은 `ls-files` 0건과 `status` 델타 0행이 대신 진다. 인수처: 이 잔여를 닫을 창은 없다 — 관측 불가가 git 의 성질이므로 기록으로 남긴다 · id=70m10-check-ignore-blind-beyond-symlink |
| 2026-09-08 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **마일스톤의 `complete` 전이가 그 마일스톤 창의 산출물이 될 수 없다 — 게이트가 창과 함께 동결되기 때문이다 (m8 실측).** `#12` 의 차단 팔은 `if (me.st === "complete") die(...)` 로 **무조건**이며 라운드 2 가 실제로 있었는지 보지 않는다. 그것을 푸는 편집 대상은 `m8.gates.mjs` 인데 그 하네스가 이 창과 함께 동결되므로, 라운드 2 를 사람이 끝내도 8행을 올릴 주체가 이 창에 없다. 반사실 실행 확인: 8행을 `complete` 로 올린 실 PRD 에서 `#12 FAIL: 8행 status=complete — 라운드 2 없이 완료로 올릴 수 없다` · 원복 후 `#12 ok`. 계획서 §NOT Building 이 같은 경계를 이미 선언하고 있어 이 창의 결함은 아니지만, **전이 주체가 어느 창인지가 어디에도 이름으로 없다**. 인수처: 라운드 2 창(M9)을 여는 PRD 개정 — 그 창의 하네스가 8행 전이를 판정한다. id=60m8-complete-transition-has-no-owner-window |
| 2026-09-08 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **이 창의 종료 문서를 쓰면 `#0` 이 붉어진다 — `.claude/milestone-closures/**` 가 허용 경로 밖이다 (m8 실측).** 프로브 확인: `.claude/milestone-closures/__probe.md` 를 두면 `#0 FAIL: 창 범위 밖 — [.claude/milestone-closures/__probe.md] (허용 13건)`. 커밋해도 창 범위가 `origin/main...HEAD` 3-dot ∪ 워킹트리라 같은 결과다. §게이트 산출물 면제는 `.claude/receipts/**` · `.claude/reviews/**` · `.claude/PRPs/notes/**` · `.claude/PRPs/reports/**` 4종을 들면서 같은 부류인 종료 문서만 빠뜨렸다. **정정** — 초판은 여기에 "형제 `m6` · `m7` 도 같은 누락이지만 2-dot 범위여서 드러나지 않았다" 고 적었고 그것이 틀렸다(2중 리뷰 층위 1 지적 · 재확인함). m6 · m7 은 2-dot 창 **안에서** 같은 붉음을 보고 각자의 종료 문서에 `### 이 문서 자신이 창 범위 게이트를 붉힌다` 절로 실었으며, m7 종료 문서 원문이 "면제를 늘리지 않았다 — M5 · M6 창이 같은 처리를 했다. 구조적 답은 계획 저작 시점에 면제 표가 closure doc 경로를 함께 싣는 것이며 `.claude/templates/plan-kit/` 층위다" 다. 즉 누락은 보였고 기록됐고 **의도적으로 안 넓혔다**. m6 계획서 §NOT Building 은 "게이트 산출물 면제를 계획서 밖에서 넓히지 않는다" 를 못박기까지 한다(m8 계획서엔 그 문구가 0건). 선례와의 패리티는 표를 **안 건드리는** 쪽이고 이 창도 같은 처리를 한다. 진짜 인수처는 `.claude/templates/plan-kit/`(현재 면제 표 언급 0건)와 다음 창 계획서 저작 시점이다. 같은 뿌리로 다음 창의 산출물도 전건 막힌다 — 프로브 확인: `m9.plan.md`+`m9.gates.mjs` 신설 · `docs/_meta/verify/verify.sh` 편집 · `m3.gates.mjs` 편집 3건 각각 `#0 FAIL: 창 범위 밖`. 인수처: 면제 표에 종료 문서 부류를 추가하는 계획서 개정, 또는 창을 main 에 병합해 3-dot 을 재설정한 뒤 다음 창에서 진행. — **RESOLVED 2026-09-08(사용자 판정 · `/mccp:pr` PR-Codex R1 HIGH 차단 후)**: 후자를 택했다. 종료 문서를 이 창에서 빼고(`git rm`) PRD §Milestone Closure Provenance 의 `Closure`·`sha256` 두 행을 이월 기록으로 개정했다. 면제 표는 끝까지 안 넓혔다 — 그것은 `m8.plan.md` hash 를 움직여 receipt 3건 앵커(`sha256:e786520f…`)를 깬다. 반사실 확인: 제거 전 `scope`·`nopublish` 각 rc 1, 제거 후 각 rc 0. 종료 문서 발행은 M9 가 3-dot 재설정 뒤 수행한다. id=60m8-closure-doc-outside-window-scope |
| 2026-09-08 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **santa receipt 의 `plan_hash` 가 이 계획서의 어느 커밋과도 일치하지 않는다 (m8 관측 · 판정 아님).** `.claude/receipts/mccp-santa-review/insuniverse-docs-60-history-deprecated-m8-r2.json` 의 `plan_hash` 와 `review_proof.reviewed_plan_hash` 가 `sha256:a90de62e…` 인데, `hash-markdown` 으로 유도한 `m8.plan.md` 는 그 receipt 의 `head_sha`(`9d1e74c`)를 포함해 `caf3036` · `a2c59bb` · `44621b5` 전 커밋에서 `sha256:e786520f…` 다. 같은 창의 `mccp-plan-codex/…-m8` · `mccp-implement-codex/…-m8` · `mccp-implement-codex/…-m8-r2` 3건은 전건 `e786520f…` 로 일치하므로 `plan_hash` 의 의미가 계획서 해시인 것은 맞다. `m8.gates.mjs` 의 전 커밋 해시(`0cde9c13` · `a426ba0d` · `6e999085` · `636e871a` · `1438d8d0` · `0439cbc3`)와 PRD(`c26f2e3c`)도 아니다. santa 가 무엇을 해싱하는지가 이 저장소에서 관측되지 않으므로 **결함으로 판정하지 않고 관측만 올린다** — 확인하려면 mccp santa-loop 의 해시 계약을 읽어야 하고 그것은 B1(플러그인 미수정)과 별개인 조회다. **같은 receipt 안에서 또 하나가 어긋난다** — `resolution.converged=true` · `resolution.rounds=1` · `findings` 0건인데, 같은 라운드의 리포트 `.claude/reviews/santa-review-…-m8-r2.md` 는 `rounds: 5 / cap 5` · `exit reason: cap_reached` · `entries: 25` 다(양쪽 실측). 봉인 커밋 `caf3036` 메시지도 5라운드 · 25항목을 적는다. receipt 만 읽는 소비자와 리포트만 읽는 소비자가 다른 결론에 이른다. id=60m8-santa-plan-hash-unmatched |
| 2026-09-08 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **`/mccp:milestone-close` 문서가 적는 "PR 진입 차단" 이 코드에 없다 (2중 리뷰 실측 · 플러그인 읽기만 · B1 준수).** 그 명령 문서는 "milestone-close 가 통과 못 하면 PR 진입은 closure-doc 부재 또는 manual revert 로 차단" 이라 적지만, mccp 1.33.6 `commands/pr.md` 전문에 `closure` 문자열이 **0건**이고 `scripts/lib/auto-chain.js` 도 0건이다. 리뷰어가 `validate mccp:pr --decision …-m8` 을 closure doc 없이 돌려 `ok:true` 를 받았다. 즉 종료 문서는 PR 의 **선행 조건이 아니다** — 창을 먼저 병합하고 종료 문서를 뒤에 내는 순서가 기계적으로 열려 있다. 실제로 이 창이 그 사실을 몰라 "종료 문서를 쓰려면 면제 표를 넓혀야 한다" 는 잘못된 강제를 세웠고, 2중 리뷰가 그 전제를 깼다. 함께 관측된 실행 조건: `/mccp:pr` 은 `--decision insuniverse-docs-60-history-deprecated-m8` 을 명시하지 않으면 슬러그가 `…-m8-r2` 로 폴백해 `plan-codex missing` 으로 막힌다. 인수처: 상류 `commands/milestone-close.md` 의 그 서술을 코드와 맞추거나(본체 이슈) 로컬 운용 규약이 그 서술을 인용하지 않게 한다. id=60m8-pr-does-not-require-closure-doc |
| 2026-09-08 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **자동 생성 원장 표기를 사람의 검토 라운드 1 로 계상할 위험 (PR-Codex R1, severity MEDIUM).** 리포트가 이 창에서 라운드 1 을 수행했다고 적어 사람에게 라운드 2 만 남기지만, 원장은 외부 생성기 산출물이고 `#6` 은 mark·게이트 인용만 검사할 뿐 **유지보수자가 실제로 검토했다는 증거를 보지 않는다**. 이대로면 이후 사람 검토 한 번으로 2라운드가 성립해 PRD UI2 의 "유지보수자 표기 2라운드 연속 0건" 과 충돌한다. 해소는 (a) 현재 표기를 *기계 사전검사* 로 구분해 사람 검토 2라운드를 온전히 남기거나, (b) 첫 사람 검토가 실재했다면 검토자·시점·대상 문서 digest·판정을 `#6` 이 읽는 자리에 결박하는 것. 이 창은 review-only 인 `/mccp:pr` 에서 관측만 하고 넘긴다. id=60m8-generator-round-counted-as-human-review |
| 2026-09-08 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **`#6` 의 문서 결박이 *하네스* 단위라 같은 하네스의 무관한 검사로 근거를 대체할 수 있다 (PR-Codex R2, confidence 0.99 · 반사실 실행으로 확인).** `round1` 은 `ok` 인용 `<하네스>#<검사>` 를 두 번만 문다 — `universe.get(하네스).has(검사)`(존재) 와 `coverage.get(하네스).has(doc)`(그 **하네스**가 이 문서를 여는가). 검사 이름은 존재 확인 외에 아무 데도 안 쓰인다. 따라서 한 문서를 여는 하네스 안의 **어떤 검사든** 그 문서의 어떤 주장이든 근거가 된다. 반사실 확인: 발산 문서(`03-divergence.md`)의 `ok` 269건이 실제로는 `m3#anchor`(12) · `m3#prodonly`(102) · `m3#stgonly`(155) 를 인용하는데, 전건을 무관한 `m3#prd` 로 바꿔 `round1` 을 돌리니 **rc 0 이고 출력이 바이트 동일**했다(결박 짝 줄까지 `m3→docs/90-history/03-divergence.md` 로 불변 — 짝이 하네스→문서라 변별력이 없다). 전제 4건 전부 실측: `prd` ∈ m3 서브커맨드 · `coverage(m3)` ∋ 발산 문서 · 동결 기준선의 m3 붉은 집합은 `{findings tally}` 라 `prd` 가 `redCited` 에 안 걸림 · `#5` 재추출 `doc` 대조는 `doc` 을 안 바꿨으므로 무관. 하네스 출력이 스스로 고지하는 `id=60m8-ledger-marks-are-section-granular`(절 단위 재유도 미증명)보다 **한 겹 위**의 구멍이다 — 그 이월은 "이 검사가 이 행 하나를 재유도하는가" 를 미룬 것이고, 이 건은 "인용된 것이 관련 검사이기는 한가" 가 안 물린다는 것이다. 해소는 인용을 검사 단위로 결박하는 것(서브커맨드↔절·주장 집합 대응표) + `m3#prd` 치환을 거부하는 음성 프로브 신설. 대응을 못 세우는 행은 `미검증` 으로 남긴다. 이 창은 `/mccp:pr` review-only 라 하네스를 못 고쳤고, 고치면 **창이 자기 판정 기준을 바꾸는** 것이라 인수처는 다음 창이다. id=60m8-ok-binding-is-harness-granular-not-check |
| 2026-09-08 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m8.plan.md | **UI3(문서만으로 Q26·Q27·Q28 에 답할 수 있어야 한다)가 미충족이고 `#9` 가 그것을 출력하면서 rc 0 이다 (PR-Codex R2, confidence 1.0 · 실측).** 원장 `record=onboarding` 3건이 절 6개를 분해해 **미성립 3 · 후보 3** 을 적는다 — Q26 두 절 전부(폐기 확정 0건 · `docs/99-deprecated/` 트리 부재 · 발행 차단 이월 2건이 열려 문서 도달 경로 없음) 와 Q28 첫 절(에픽 23건 중 등급 A·B 가 닿는 것이 5건, 나머지 18건은 등급 C 단독). `#9` 는 `rc=0` 으로 `미성립 3 · 후보 3 · 미검증 0` 을 찍고 `답변 판정=사람(미검증) — '성립' 어휘는 이 게이트에 없다` 로 고지한다. **어휘가 두 층에서 어긋난다** — 원장은 절을 `미성립`(성립하지 않음이 확정)으로 적는데 PRD·계획서 Acceptance 는 같은 것을 `미검증`(사람이 잴 것)으로 부른다. 전자는 판정이고 후자는 유보라 소비자가 다른 결론에 이른다. 이 창이 `in-progress` 로 끝나는 것 자체는 UI2 가 미리 선언했으므로 경계 위반은 아니지만, **UI3 의 미충족이 `미검증` 어휘 뒤에 가려진다**. 해소는 (a) 허용 문서에 판정 근거·한계를 연결해 미성립 3절을 후보로 올리거나 (b) UI3 범위 변경을 사용자 판정으로 받는 것. review-only 게이트에서 둘 다 불가. id=60m8-ui3-unmet-behind-unverified-vocabulary |
| 2026-09-08 | HIGH | .claude/plans/insuniverse-docs-50-domain-m13.gates.mjs | **창 범위 술어가 절대 앵커 2-dot 이라 `origin/main` 병합에 붉는다 (PR 단계 실측 · 형제 이월 `60m7-base-literal-breaks-on-merge` 와 같은 결함 부류).** `changedSinceAnchor` 가 `git diff --name-only <앵커> --` 로, `#17` 이 `git diff --no-ext-diff -U0 <앵커> --` 로 창을 유도한다. 둘 다 **병합으로 들어온 형제 델타를 이 창의 변경으로 계상한다** — 병합 후 `#10` 은 허용집합 밖 55건, `#17` 은 절대경로 8건으로 붉었고 그 55·8 건은 전부 `20-foundation-access` · `60-history-deprecated` · `70-viewer` 산출물이다. 반사실: 병합 전 커밋 `8229dce` 워크트리에서 `#10` 은 초록(변경 9건)이었다. 올바른 창은 `<앵커> 2-dot ∩ origin/main...HEAD` 이고 그 교집합은 정확히 병합 전과 같은 9경로다(실측). 형제 `60-history-deprecated` 는 같은 전환을 M8 Task 0 로 열었다 — M13 은 이미 종료(13행 `complete` · `*Status: complete`)라 이 창에서 고치지 않는다. 인수처: 50축을 다시 여는 창 또는 창 범위 술어를 형제 선례대로 3-dot 으로 옮기는 전용 과업 · id=50m13-anchor-window-breaks-on-merge — **SANTA-R0 정정 2026-09-08 (처방 반증)**: 이 행이 적은 처방 `<앵커> 2-dot ∩ origin/main...HEAD` 를 **그대로 쓰면 안 된다 — fail-open 이다.** 오른쪽 피연산자가 커밋 대 커밋이라 `changedSinceAnchor` 의 미추적 축(`gates.mjs:473`)과 워킹트리 축(`gates.mjs:471`)을 통째로 소거한다. 실증: 워킹트리에서만 수정된 `.claude/settings.json` 은 2-dot 창에 있고 `#10` 이 지금 붉게 잡는데 `git diff --name-only origin/main HEAD -- .claude/settings.json` 이 비어 교집합에서 탈락한다 — 진짜 범위 밖 편집이 초록으로 통과한다. 이 행이 인용한 형제 선례도 교집합이 아니라 **합집합**이다: `insuniverse-docs-60-history-deprecated-m8.gates.mjs:340` 이 `origin/main...HEAD(3-dot) ∪ 워킹트리`. 올바른 형태는 `origin/main...HEAD ∪ 워킹트리 ∪ 미추적`. 또 이 행의 반사실(`교집합은 정확히 병합 전과 같은 9경로`)은 **작성 시점 dd39327 에서는 참이었고 HEAD 에서는 거짓이다** — 지금 교집합은 11경로이고 그 중 1건이 허용집합 밖이다(신규 이월 `50m13-own-pr-receipt-outside-scope-allow` 참조). 따라서 이 처방을 적용해도 `#10` 은 초록이 되지 않는다. 판정자: santa-loop R0 A(opus, blind)·B(gpt-6, bundled) 합치 |
| 2026-09-08 | MEDIUM | .claude/plans/insuniverse-docs-50-domain-m13.gates.mjs | **종료된 마일스톤의 하네스는 그 뒤 통합 진척에 계속 붉어지며 그 사실을 스스로 공시하지 않는다 (PR 단계 실측).** `#10` 의 `check10.change-scope-derivation` 은 분모를 *"추적 diff ∪ 미추적 열거"* 로만 공시하고 **그 diff 가 병합 내성이 없다는 것**은 어느 출력 행에도 없다. 즉 붉음의 원인이 이 창의 결손인지 형제 진척인지 출력만 보고 못 가른다 — 층위 8(검사 자신의 사각지대를 출력에 드러낸다)의 미충족 자리다. `#10`·`#17` 이 창 유도를 두 갈래(2-dot·3-dot)로 함께 내고 초과분을 이름으로 찍으면 붉음의 귀속이 출력에서 갈린다 — 형제 `60-history-deprecated` `#0` 이 그 형태다. id=50m13-window-derivation-not-disclosed — **SANTA-R0 정정 2026-09-08**: (1) 이 행에 **인수처가 없었다** — 2026-09-08 M13 이월 중 유일하게 빠졌다. 인수처: 50축을 다시 여는 창(창 범위 술어 전용 과업과 같은 창). (2) 이 행이 처방한 형태(`#10`·`#17` 이 창 유도를 두 갈래로 함께 내고 초과분을 이름으로 찍는다)를 **새 출력 id 로 구현하면 안 된다** — `checkAll` 이 골든 밖 출력행에 die 하고(`gates.mjs:1231`), 골든에 id 를 더하려면 바이트가 움직여 `#13`(`gates.mjs:919`)과 `#1(g)`(`gates.mjs:447-455`)가 먼저 붉는다. 구현 가능한 유일한 형태는 **기존 `check10.change-scope-derivation` 행의 본문을 늘리는 것**이다(본문은 골든 결박 밖). 이 제약은 어느 문서에도 없었다. 판정자: santa-loop R0 A(opus, blind) |
| 2026-09-08 | HIGH | .claude/plans/insuniverse-docs-50-domain-m13.gates.mjs | **`#10` 의 증거 절단이 PR 단계 판정을 뒤집었다 — 절단 표시가 없다.** `die("#10 FAIL: 허용집합 밖 " + alien.length + "건 — " + alien.slice(0, 10).join(" "))`(`gates.mjs:793`)이 57건 중 **10건만** 찍고 `외 N건` 표시를 안 낸다. 비-형제 항목 2건이 정렬 순서상 **46번·50번** 자리라 출력에 구조적으로 안 나온다 — `.claude/receipts/mccp-pr-codex/insuniverse-docs-50-domain-m13.json` 과 `.claude/settings.json`, 더해 `40-runtime-vendor-legal` 아카이브 3건. 그래서 PR 단계 기록과 이월 `id=50m13-anchor-window-breaks-on-merge`이 출력에 보인 10건만 보고 *"전부 형제 산출물"* 이라 판정했고 붉음 전체를 병합 잡음으로 처분했다. **반증에 필요한 증거를 검사가 만들어 놓고 `.slice(0, 10)` 으로 버린다.** 출력이 자기 사각지대를 이름으로 낸다는 것이 이 하네스의 설계 계약인데, 공시되지 않은 증거 절단은 그 계약이 조용히 깨지는 유일한 자리다(층위 8). `#17` 도 `gates.mjs:1039` 에서 `slice(0,12)` 로 같은 형태다(현재 8건이라 절단은 아직 안 일어난다). 인수처: 50축을 다시 여는 창 — `.slice` 제거 또는 `외 N건` 마커 추가 · id=50m13-alien-list-truncation-undisclosed |
| 2026-09-08 | HIGH | .claude/plans/insuniverse-docs-50-domain-m13.required-outputs.golden | **마일스톤의 골든이 그 마일스톤 자신의 PR receipt 보다 먼저 봉인돼, `#10` 이 어떤 창 술어로도 초록이 될 수 없다 (패턴 결함).** `.claude/receipts/mccp-pr-codex/insuniverse-docs-50-domain-m13.json` 은 커밋 `637de43` 이 더했고 `decision_id` 가 `insuniverse-docs-50-domain-m13` 이다 — 형제 델타가 아니라 **이 창 자신의 산출물**이다. 그런데 골든 264행 `scope-allow` 는 `.claude/receipts/mccp-implement-codex/` 만 담는다(62행이 `.claude/receipts/` 를 의도적으로 좁혔다고 기록). 실측: 허용집합 18항목에 이 경로 매치 **0건**. 이 파일은 2-dot 창에도 `origin/main...HEAD` 에도 있어 **모든 후보 술어를 통과해 살아남는다**. 탈출로 셋이 전부 막혔다 — 골든을 넓히면 바이트가 움직여 `#13`·`#1(g)` 가 붉고(실측: 골든 sha256 `fa7ac39d…` == 앵커 blob), 재앵커링은 봉인된 판정을 사후 이동시키며, receipt 삭제는 게이트 자신의 감사 기록을 지운다. **일반화**: 골든은 앵커 커밋에 봉인되고 PR receipt 는 그 뒤에 생기므로, 이 패턴을 쓰는 어떤 창도 자기 PR 게이트가 돈 뒤에는 `#10` 을 초록으로 만들 수 없다. M13 국소 결함이 아니다. 인수처: plan-kit `.claude/templates/plan-kit/**` 소유 축 — `scope-allow` 에 자기 축 receipt 접두를 앵커 시점에 미리 담는 관례, 또는 `#10` 이 게이트 자신이 발행하는 receipt 를 정의역에서 제외하는 관례 · id=50m13-own-pr-receipt-outside-scope-allow |
| 2026-09-08 | HIGH | .claude/plans/insuniverse-docs-50-domain-m13.gates.mjs | **`#17` 이 읽기 실패한 미추적 파일을 조용히 건너뛰고 초록을 낸다 — 건너뛴 건수를 공시하지 않는다.** `try { body = read(f); } catch (_) { continue; }`(`gates.mjs:995`)가 `ls-files --others --exclude-standard` 가 낸 경로의 어떤 `readFileSync` 실패든 삼킨다 — 끊긴 심볼릭 링크 · EACCES · 동시 쓰기와 경합해 사라진 경로. 그 파일은 유출 스캔에 0행을 기여하고 `#17` 은 **선언한 입력 집합의 구성원이 검사되지 않았다는 사실을 어디에도 안 내고** 초록을 보고한다. `check17.untracked-lines-included` 는 `untracked.length` 와 `untrackedLines` 를 내지만 **건너뛴 수는 안 낸다**. 재현: 리뷰어 B 가 EACCES 인메모리 주입으로 무해한 추적 행 1건과 함께 `#17 ok` 를 재현했다. 이 하네스의 나머지는 공격적으로 fail-closed(검증기 부재·파싱 실패·미지 행 상태에 전부 die)라 이 삼킴이 유일한 이탈이다. 노트 §추적 축이 죽어 있던 자리가 기록한 것과 같은 실패 형태이며 그때 `--no-ext-diff` 로 닫은 잔여 경로다. 인수처: 50축을 다시 여는 창 — catch 에서 건수를 세어 출력 행에 내거나 die · id=50m13-check17-silent-skip-on-read-failure |
| 2026-09-08 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m9.plan.md | **L2·L3 findings 19건을 흡수했으나 그 흡수 자체는 리뷰되지 않았다 — 이 decision 의 라운드 예산이 소진됐다.** `mccp-plan-codex__insuniverse-docs-60-history-deprecated` 원장이 라운드 3건(index 0·1·2, 전건 `channel: panel`)을 기록했고 `MCCP_GATE_ROUND_CAP` 파서가 `[1..3]` 으로 하드 클램프한다(`review-single-pass.js:42-45` `MAX_ROUND_CAP = 3`, 범위 밖 값은 loud warn 후 기본값 1로 떨어진다) — 즉 이 슬러그에서 `emit-workflow-args` 는 이제 exit 12 이고 *cap 을 올려서 다시 돌리는* 경로가 없다. 라운드 2(index 2)는 `5.2e` 에서 `divergent`(L2 blocking 12 · L3 Codex `divergent`)로 정지했고 그 19건을 이 창이 흡수했으나, 흡수본(`sha256` 재계산 필요)에 대한 반증 라운드는 0회다. **차단 팔 자체는 흡수됐으므로 결함 목록이 아니라 *검증 부채* 다** — 인수처는 (a) 새 `/mccp:plan` 호출(인자가 다르면 decision 슬러그가 달라져 예산이 새로 열린다) 또는 (b) `/mccp:santa-loop` 로 같은 계획서를 이중 리뷰하는 것이다. 흡수 원문과 증거는 `.claude/reviews/plan-review-insuniverse-docs-60-history-deprecated.md`(19건 전문 · `halt_stage: 5.2e` · `wall_clock_ms`)에 있다. id=60m9-absorption-unreviewed |
| 2026-09-08 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m9.plan.md | **계획서의 차단 팔이 저작 시점에 한 번도 뒤집히지 않았다 (L2 test 관점 · MEDIUM).** `# 음성:` 15건 중 `(미실행)` 14 · `(실행 확인)` 1 이고 그 1건(`#1`)조차 문면이 *겨냥 축의 절반만* 관측했다고 적는다. 2건(`#12`·`#14`)은 앞 창 m8 하네스의 관측을 인용하며 `(미실행 — 이 하네스에 대해)` 로 그 사실을 이름 지었다. CLAUDE.md §1 은 `# 음성:` 을 *저자가 한 번 돌려본 관찰의 기록* 으로 정의하므로 이 상태는 그 정의를 충족하지 못한다. **뿌리는 순서다** — 하네스(`…-m9.gates.mjs`)가 아직 없어 저작 시점에 뒤집을 대상이 존재하지 않는다. 흡수 대신 §Acceptance 에 `(미검증)` 으로 싣고, 부채를 갚는 기계는 `#13`(15검사 각각 프로브 최소 1건 · rc 와 진단 토큰 동시 요구 · 프로브 집합↔등록부 양방향)이다. 구현 시점에 `#13` 이 15/15 를 못 내면 이 이월이 그대로 결함으로 승격된다. id=60m9-negatives-unexecuted-at-authoring |
| 2026-09-08 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m9.plan.md | L2 architect: 검사 #14(tally)의 구조가 인용한 Mirror 와 다르고, 이 계획서의 Validation 블록에서는 어느 쪽으로 구현해도 성립하지 않는다. Mirror 인 m8 `#16 tally` 는 셸이 `tee -a` 로 채운 `--out` 파일을 **읽는** 소비자다(m8.gates.mjs 13~14행: "완주 출력을 쓰는 것은 … · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated-m9.md · id=c32c87e6 |
| 2026-09-08 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m9.plan.md | L2 architect: `#1`·`#2` 의 유일한 반증력 있는 팔이 의지하는 "선언 델타 d" 가 이 계획서 어디에도 놓일 자리가 없다. Risks 399행이 "반증력이 남는 것은 `BASE golden + 선언 델타 d` 대조 한 팔뿐" 이라고 스스로 못 박는데, d 를 담을 산출물이 정의되지 않았다 — 원장 레코드 종은 5종(`meta`·`carr… · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated-m9.md · id=f7f0b3ba |
| 2026-09-08 | FAIL | .claude/plans/insuniverse-docs-60-history-deprecated-m9.plan.md | L2 architect: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated-m9.md · id=8fea543c |
| 2026-09-08 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m9.plan.md | L2 security: 검사 #5 의 proof executable allowlist 는 '임의 명령 실행 표면' 을 막지 못한다. `node` 를 allowlist 에 넣는 순간 `node -e <임의 코드>` 또는 `node /임의/경로.js` 가 통과하므로, 원장(PR 로 바뀌는 데이터 파일)의 한 줄로 게이트 실행자의 기계에서 임의 코드가 돈다. … · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated-m9.md · id=353527e8 |
| 2026-09-08 | FAIL | .claude/plans/insuniverse-docs-60-history-deprecated-m9.plan.md | L2 security: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated-m9.md · id=adb6a707 |
| 2026-09-08 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m9.plan.md | L2 test: Task 5 / 게이트 #6 의 핵심 주장("ok 인용을 하네스 단위에서 검사 단위로 승격")이 반증 불가능하다 — 비율의 분모 N 이 저자가 고르는 값이라 binding 행을 2건만 세워도 `ok > N/2`·`미검증 ≤ ⌈N/4⌉` 를 자명하게 통과한다. 같은 계획서가 Task 6 에서는 분모를 외부 기준(onboarding-quest… · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated-m9.md · id=9d7b5379 |
| 2026-09-08 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m9.plan.md | L2 test: 게이트 #5 의 대량 우회 방지가 4종 enum 중 한 종만 막는다 — `inherited` 과반만 금지하고 `rejected`·`owner-elsewhere` 에는 어떤 분포 제약도 없다. 48건(G11)을 전부 `rejected` 로 적고 backlog 밖 임의 파일 한 줄을 앵커로 달면 #5 가 초록이 된다. 즉 '이월이 실측으로 판… · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated-m9.md · id=f370dba7 |
| 2026-09-08 | FAIL | .claude/plans/insuniverse-docs-60-history-deprecated-m9.plan.md | L2 test: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated-m9.md · id=a4733133 |
| 2026-09-08 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m9.plan.md | L2 invariant: 명시된 롤백 절차가 이전 동작을 복원하지 못한다 — 절차가 golden 만 되돌리고 findings 편집은 그대로 두므로, 절차가 약속한 검증 기준("원래의 한 줄 실패")이 이 창의 변경집합에서는 구조적으로 거짓이다. 롤백을 고정하는 검사도 없다(주장뿐). · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated-m9.md · id=ac1ae836 |
| 2026-09-08 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m9.plan.md | L2 invariant: `#1` 의 유일한 비동어반복 팔(`BASE golden + 선언 델타 d == 현재 값`)에서 d 의 출처가 결박되지 않아, d 를 현재값−BASE값으로 유도하면 그 팔도 항등식이 된다 — 즉 계획서가 스스로 "반증력이 남는 유일한 팔"이라 부른 자리가 열려 있다. · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated-m9.md · id=56837893 |
| 2026-09-08 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m9.plan.md | L2 invariant: `#6` 의 상한이 "유도값"이라고 선언되지만 분모 N(binding 행 수)이 저자가 고르는 값이라 상한 전체가 자기 결정이다. `#5`(backlog 유도)·`#7`(onboarding 유도)와 달리 N 을 외부 기준에 결박하는 술어가 없다. · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated-m9.md · id=0f9d7f36 |
| 2026-09-08 | FAIL | .claude/plans/insuniverse-docs-60-history-deprecated-m9.plan.md | L2 invariant: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated-m9.md · id=0d086d75 |
| 2026-09-08 | HIGH | .claude/plans/insuniverse-docs-70-viewer-m10.plan.md | **계획서 `# 기대:` 가 선언한 단언 중 게이트가 실제로 안 무는 것이 있다 (m10 santa-loop R1 · 두 리뷰어 독립 지적).** `#6` 의 *fs.renameSync 를 감싼 자식 계측* · `#8` 의 *metrics 원자성 플래그 · 탐지 잔여 0건 · 두 모드의 읽기 뿌리 문자열 동일 · 미지 실패 전건이 강등으로 접힘 · 승격 구간에 띄운 독자의 포인터 부재 관측 수와 그 구간 밀리초* · `#12` 의 *단계적 실패 수집 오라클과 provenance, 알려진 반례 넷* 이 그 형태다. R1 에서 각 검사의 **핵심 축**(rename 실계측 · 강등 문면 실관측 · 결박 양방향)은 세웠으나, 선언 전건이 단언으로 서 있지는 않다. 계획서는 `plan_hash` 결박이라 문면을 못 줄이므로 **다음 창이 둘 중 하나를 한다** — 나머지 단언을 구현하거나, 새 계획서에서 그 선언을 게이트가 실제로 무는 것으로 다시 쓴다. 인수처: 70 뷰어 다음 창(발행 축 후속) · id=70m10-declared-assertions-exceed-gates |
| 2026-09-08 | HIGH | .claude/plans/insuniverse-docs-70-viewer-m10.plan.md | **`#2` 가 마커의 존재만 세고 그 안의 선언이 단언으로 서 있는지는 안 본다 (m10 santa-loop R1).** `#2` 는 계획서 `# 검사 #N` 마커 집합과 하네스 등록부를 양방향으로 대조하고 각 블록이 `# 기대:`·`# 음성:` 을 하나씩 갖는지 본다 — **내용은 안 본다.** 그래서 `# 기대:` 가 열거한 축 중 하나가 게이트에 없어도 `#2` 는 초록이고, 위 `70m10-declared-assertions-exceed-gates` 가 그 구멍으로 들어왔다. 이것이 층위 7(검사 자신에 대한 주장에 검사가 있는가)의 잔여다. 닫으려면 `# 기대:` 의 축을 기계가 읽을 수 있는 형태로 쪼개고 각 축에 대응 단언을 요구해야 하며, 그것은 계획서 저작 규약의 변경이라 이 창의 재료가 아니었다. 인수처: `.claude/templates/plan-kit/` 규약 개정 창 · id=70m10-check2-counts-markers-not-content |
| 2026-09-08 | MEDIUM | .claude/plans/insuniverse-docs-70-viewer-m10.plan.md | **`#6` 의 표본이 등록된 경계 13지점 중 4지점을 안 밟는다 (m10 santa-loop R1 실측).** `#6` 은 `BOUNDARIES` 전건에 주입을 시도하고 실제로 발화한 수를 값으로 내며 그 수에 하한(>0)을 둔다 — 그러나 `after-rename` 을 포함한 4지점은 이 표본의 경로에 없어 **복구 경로가 그만큼 미검**이다. `after-rename` 은 롤백 분기가 타는 유일한 구간이라 m8 `#9`·`#15` 가 `plantFlatOwned` 로 그 상태를 따로 만든다. `#6` 도 같은 픽스처를 쓰면 닫히지만, 지점별로 도달 가능한 전제가 달라 *전건 발화* 를 요구하려면 지점마다 전제를 선언해야 한다. 인수처: 70 뷰어 다음 창 · id=70m10-check6-sample-misses-four-boundaries |
| 2026-09-08 | MEDIUM | docs/viewer/gate.mjs | **게이트가 `publish()` 를 `try/catch` 없이 부른다 (m10 santa-loop R1).** 원시연산 밖 예외(교체 `rename` 의 `EPERM`·`EBUSY` 등)는 `PublishError` 가 아니므로 `publish()` 가 `fail` 을 안 거치고 그대로 던지고, `gate.mjs` 에 감싸개가 없어 **무명 스택 트레이스가 절대경로와 함께** 게이트 출력으로 나간다 — 그 출력은 `.claude/notes/` 로 커밋된다. R1 에서 `listFilesRecursive` 의 두 삼킴은 사유 있는 실패로 바꿨고 이월이 링크류를 거절하므로 알려진 도달 경로는 닫혔으나, **경계 자체는 그대로다**. `#11` 의 절대경로 스캔은 성공한 실행의 출력만 읽어 이 경로를 못 본다. 인수처: 70 뷰어 다음 창 · id=70m10-gate-lacks-native-failure-boundary |
| 2026-09-08 | MEDIUM | .claude/plans/insuniverse-docs-70-viewer-m10.plan.md | **`#13` 의 차감 조각 나누기가 `" · "` 어휘 관용에 선다 (m10 santa-loop R1).** R1 에서 차감 단위를 실패 줄에서 사유 조각으로 좁혀 *등록된 원인에 새 원인이 얹혀 통째로 면제되는* 형태는 닫았다. 남는 것은 **앞 창 검사가 다른 구분자로 원인을 붙이면 그 줄이 한 조각으로 읽힌다** 는 사실이다. 방향은 안전하다 — 그때 등록 밖 원인은 차감에 얹히는 것이 아니라 **줄 전체가 잔여로** 가서 이름으로 보고된다. 완전히 닫으려면 앞 창 검사들이 실패를 구조로(배열) 내야 하고 그것은 하네스 7종의 출력 계약 변경이라 이 창의 재료가 아니다. 인수처: 앞 창 하네스 출력 계약을 다루는 창 · id=70m10-subtraction-splits-on-separator-convention |
| 2026-09-08 | HIGH | .claude/plans/insuniverse-docs-70-viewer-m10.plan.md | **`#13` 의 사유 조각 나누기가 한 원인의 설명 꼬리를 다른 원인으로 오독한다 (m10 santa-loop R1 회귀 · 실측).** R1 에서 *등록된 원인에 새 원인이 얹혀 통째로 면제되는* 형태를 닫으려 차감 단위를 실패 줄에서 `" · "` 조각으로 좁혔는데, 앞 창 검사들은 **한 원인의 설명에도** 그 구분자를 쓴다 — m8 `#12` 는 `backlog 행 끝 id 중복 3종 — <ids> · id 로 키잉하는 소비기가 행을 잃는다` 를 한 원인으로 내는데 조각 나누기가 둘로 읽어, 등록되지 않은 둘째 조각 때문에 **선재 붉음이 차감되지 않고 잔여로 넘어간다**(실측: `check-all FAIL: #13 rc 1`, m8 `#12` · m9 `#11` 두 건). 방향은 안전하나(과잉 차감이 아니라 과잉 잔여) `#13` 이 붉어 완주를 막는다. 닫으려면 등록부가 **원인당 여러 조각**을 선언할 수 있어야 하고(`reasons: [...]`), 그것이 R1 수정의 자연스러운 다음 걸음이다. 인수처: 70 뷰어 다음 창 — 이 창이 만든 회귀이므로 선재로 차감하지 않는다 · **ABSORBED-M10 2026-09-14** — 등록부 항이 `tail` 로 설명 꼬리를 선언하고, 꼬리는 **바로 앞 조각이 그 항의 사유를 담을 때만** 되붙인다(커밋 12f25a0). 반사실: 실측 m8 `#12` 줄이 수정 전 `잔여 [id 로 키잉하는 소비기가 행을 잃는다]` → 수정 후 `차감`, 음성 두 건(꼬리 앞에 등록 밖 원인 · 꼬리 단독)은 수정 후에도 잔여. `check-all ok 16검사 전건 통과 · 1693s` · `#13` 관측 붉음 7건 == 차감 7건 + 잔여 0건 · id=70m10-fragment-split-misreads-explanatory-tail |
| 2026-09-08 | MEDIUM | .claude/plans/insuniverse-docs-70-viewer-m10.plan.md | **`#13` 안에서만 붉은 앞 창 검사 두 건이 있다 — 단독 실행은 초록이다 (m10 santa-loop R1 실측).** m6 `#7`(`실 산출이 프로브 중 변경됐다 — live (바이트 변동)`)과 m6 `#10`(`강제 실패 종료 후 잔존 1건`)은 각각 단독으로 돌리면 rc 0 인데 `#13` 의 순차 실행 안에서는 붉다. `#7` 은 세대 도입으로 **서빙 포인터의 링크 값이 발행마다 바뀌므로** 그 검사의 *실 산출 불변* 단언이 직전 `gate build` 재생성을 변경으로 읽는 것으로 보이고, `#10` 은 겹친 실행이 남긴 임시 트리를 잔존으로 센다. 즉 `#13` 의 잔여 판정이 **실행 순서에 민감**하다 — 그 자체가 관측의 결함이다: 같은 코드가 문맥에 따라 다른 판정을 낸다. 닫으려면 두 검사의 관측 대상을 발행마다 바뀌는 좌표에서 떼거나, `#13` 이 앞 창을 격리된 트리에서 돌려야 한다. **2026-09-14 재측 — 순서 민감은 재현되지 않았다.** 다른 실행이 겹치지 않은 `check-all` 1회(같은 순서 · 1693s)에서 `#13` 잔여 0건이었고, 단독 m6 `#7`·`#10` 도 각 2초에 초록이다. 대안 가설은 **동시 실행 겹침**이다(미검증 · 1회 표본): m6 `#10` 의 잔존 판정 `tmpMine()` 은 기계 전역 `os.tmpdir()`(`/tmp`)의 `m6-(probe|self)-*` 집합 차이고 `#7` 은 실 `docs/viewer/build` 스냅숏 차라, 같은 시각에 다른 세션·백그라운드가 m6 하네스나 `gate build` 를 돌리면 둘 다 붉어질 수 있다. 원래 관측은 santa R1 리뷰어와 백그라운드 실행이 겹친 세션에서 나왔다. 인수처: 70 뷰어 다음 창 — 겹침을 **재현해** 가설을 세우거나 기각하고, 세우면 m6 관측을 자기 실행이 만든 엔트리로 좁힌다 · id=70m10-check13-residual-is-order-sensitive |
| 2026-09-11 | HIGH | .claude/plans/ai-insight-report-m7.plan.md | **이 계획서는 L2 패널도 L3 Codex 도 받지 못했다 — 라운드 원장이 PRD 단위라 예산이 M1~M6 에서 소진됐다 (실측 2026-09-11).** `review-rounds/cli.js status --gate mccp-plan-codex --decision ai-insight-report` 가 `rounds_so_far=3` 이고 seal 이 `cap=1 pinned-by=single-pass` 다. `MCCP_GATE_ROUND_CAP=3` 이 설정돼 있으나 pin 된 cap 은 그 값을 읽지 않으며, pin 을 풀어도 3/3 이라 여전히 소진이다. 그래서 `emit-workflow-args` 가 exit 12 로 패널을 띄우지 않았다(예약은 `--actual 0` 으로 반환했고 에이전트 0개). 이 계획서가 받은 리뷰는 **Phase 2.5 fan-out 4 perspective 뿐**이며 그것은 read-only GROUND 보강이지 승인 채널이 아니다. 원장이 마일스톤이 아니라 PRD 를 키로 쓰는 것이 뿌리이고 그 키 산정은 mccp 본체(B1 — 이 저장소가 못 고친다) 소관이다. — **RETRACTED 2026-09-11 (같은 세션, 실측으로 정정).** 원인은 원장 키 산정이 아니라 **이 세션이 `derive-decision --args` 에 PRD 경로를 넘긴 것**이었다. `--args .claude/prds/ai-insight-report.prd.md` 는 `ai-insight-report`(M1 이 쓰고 3라운드를 소진한 슬러그)를 내고, `--args .claude/plans/ai-insight-report-m7.plan.md` 는 `ai-insight-report-m7`(원장 부재 = 라운드 0)을 낸다 — 둘 다 실행해 확인했다. 선례도 후자다: `.claude/receipts/mccp-plan-codex/` 에 `ai-insight-report-m2.json`·`ai-insight-report-m3.json` 이 각자 슬러그로 서 있다. 따라서 「PRD 단위라 2번째 마일스톤부터 예산 0」은 **거짓**이고, 이 계획서는 올바른 슬러그로 L2·L3 를 받는다. 이 행은 지우지 않고 남긴다 — 같은 오진을 다음 세션이 반복하지 않도록. 인수처: 없음(해소). id=m7-plan-unreviewed-round-budget-exhausted |
| 2026-09-11 | MEDIUM | .claude/plans/ai-insight-report-m7.plan.md | **`InsightReportView` 가 평면 인터페이스로 계속 커지는데 분해 정책이 없다 (fan-out architect MEDIUM).** `insuniverse-site/front/src/api/insightApi.ts:130-161` 에 이미 중첩 객체 리터럴 6개가 한 타입에 있고, 이 창이 `order`·`summary`·`coverage`·`direction`·`triggers` 를 더한다. M5 가 한 번 키웠고 M7 이 두 번째다. 하위 탭별 분해든 평면 유지든 **결정이 어디에도 없다**. 이 창은 절 소비를 넓히는 것이 목적이고 타입 구조 재편은 게이트 `#3` 이 겨냥하는 축이 아니라 이연한다. 인수처: 이 타입의 소비자가 ANS015 하나를 넘는 시점. id=m7-report-view-flat-interface-growth |
| 2026-09-11 | MEDIUM | .claude/plans/ai-insight-report-m7.plan.md | **손으로 유지하는 per-key 맵이 둘인데 통합 레지스트리가 없다 (fan-out architect MEDIUM).** `insuniverse-site/front/src/features/analysisDetailView/ui/ANS015/ANS015.insight.ts:56-90` 의 `SEAT_COLUMNS` 와 `:169-174` 의 `SUBTAB_OF_REPORT` 가 서버 `insight-contract.ts` 의 `ANGLE_SEATS`·`SUMMARY_TO_SUBTAB` 와 짝이지만 서로를 모른다. 서버 키 하나를 늘리면 네 자리를 손으로 맞춰야 하고 어긋나도 어느 검사도 안 본다. 이 창은 좌석 3종을 **기존 맵에 행으로** 더해 네 번째 소비자를 만들지 않지만 구조는 그대로다. 해소는 좌석 정의를 한 자리에서 유도하는 것이며 서버·프론트 경계를 넘으므로 별도 창이다. id=m7-per-key-maps-have-no-registry |
| 2026-09-11 | MEDIUM | .claude/plans/ai-insight-report-m7.plan.md | **응답측 필드 최소화 원칙이 문서화돼 있지 않다 — 요청측만 있다 (fan-out security MEDIUM).** `insuniverse-server/apps/api/src/modules/ddx/insight-payload.ts:12` 는 요청에 `person`·`external_ref` 를 넣지 않는 이유를 주석으로 못박는데, 응답(ddx→서버→클라이언트) 방향에는 대응 규약이 없다. 이 창이 `INTENTIONAL_SKIP` 에 `records` 를 사유와 함께 내려 **부분적으로** 답했고 게이트 `#3` 이 그 이탈을 잡지만, 그것은 이 마일스톤의 계약이지 저장소 규약이 아니다. 인수처: `CLAUDE.md` §3 불변식 또는 PRD Constraints 의 개정. id=m7-response-side-minimization-undocumented |
| 2026-09-11 | LOW | .claude/plans/ai-insight-report-m7.plan.md | **무적재 경로의 로깅 정책이 어디에도 명시돼 있지 않다 (fan-out security LOW).** PRD Constraints 1 이 「적재하지 않는다」를 정하지만 요청·응답이 로그로 남는지는 말하지 않는다. 조회 1회 = ddx 호출 1회이고 이 창이 응답 소비를 11절에서 14절로 넓히므로 in-flight 진료 인접 데이터가 커진다. 이 창은 로깅을 건드리지 않으므로 관측만 올린다. id=m7-stateless-path-logging-policy-absent |
| 2026-09-11 | LOW | .claude/plans/ai-insight-report-m7.plan.md | **`InsightReportUnobserved` 가 실형상으로 승격될 때의 버전 마커가 없다 (fan-out architect LOW).** `{count:number}` 를 읽는 소비자가 ANS015 밖에 생기면 승격이 조용한 파괴가 된다. 이 창은 그 4종을 **승격하지 않고** 그대로 두므로(NOT Building) 지금은 닿지 않는다. 재료가 생기는 창이 인수처다. id=m7-unobserved-promotion-has-no-version-marker |
| 2026-09-11 | MEDIUM | .claude/plans/ai-insight-report-m7.plan.md | **REJECTED(fan-out architect HIGH · `unmapped` 렌더링 경로) — 전제가 다르다.** 지적은 「M7 이 버려지던 angle 3종을 그리려면 `InsightUnmapped`(angle/count/reason)를 렌더링해야 하는데 그 타입에 `sayKo`·`whyKo`·evidence 가 없다」였다. 이 창은 `unmapped` 를 그리지 않는다 — 세 angle 을 `insuniverse-server/apps/api/src/modules/ddx/insight-contract.ts:17` 의 `ANGLE_SEATS` 로 **옮겨** 애초에 `unmapped` 로 떨어지지 않게 하고, 그러면 기존 `InsightSeatView` 경로로 온다. 같은 fan-out 의 explorer HIGH 가 그 삽입점(`insight-view.ts` 의 angle→seat 분기)을 독립적으로 지목했다. 게이트 `#4` 가 세 angle 의 좌석 배치를 검사한다. id=m7-unmapped-rendering-premise-rejected |
| 2026-09-11 | HIGH | .claude/plans/ai-insight-report-m7.plan.md | **게이트 `#12` 는 `HARNESS_CONTRACT` 상수만 계획서와 대조하고 판정을 내리는 `gate0`~`gate15` **함수 본문**은 어떤 검사·digest 에도 안 덮인다 (L2 R3 invariant HIGH).** 그런데 Files to Change 가 이 하네스를 구현 중 `UPDATE` 대상으로 허가하고, `#12` 는 「하네스만 느슨하게 고치는 길을 막는다」고 주장한다 — 그 주장은 **상수 축에서만** 참이다. 구현자가 `gate15` 의 `if (!entry)` 를 지워도 상등은 유지된다. 구조적 해소는 함수 본문 digest 를 계획서에 동결해 하네스 수정이 `plan_hash` 를 움직이게 하는 것이고, 그러면 게이트를 고칠 때마다 receipt 체인이 재봉인을 요구한다 — 그 비용이 이 창의 범위를 넘는다. **라운드 예산 3/3 소진으로 재검증 없이 이연한다.** id=m7-gate12-covers-constants-not-functions |
| 2026-09-11 | HIGH | .claude/plans/ai-insight-report-m7.plan.md | **`insight-view.spec.ts` 의 유출 오라클 `view-drops-person-name-and-identifiers` 가 좌석 1종(`수술 전 경고`)만 오염시킨다 (L2 R3 security HIGH).** 이 창이 좌석을 4종 → 7종으로 늘리면서 그 오라클의 적용 범위를 넓히라는 요구를 어느 Task·게이트에도 두지 않았다. `#6` 은 `toInsightReport` 만 실행하고 `insight-view.ts` 의 좌석 산출은 **아무 게이트도 실행하지 않는다**. 결과: ddx 가 신규 좌석 evidence 에 `person_name` 을 실어 보내고 구현이 그 경로에서 원본을 통째로 싣는 코드를 쓰면 `#5`(리터럴 정적·변수 우회 가능)를 빼고는 전부 초록이다. 인수처: `insight-view.spec.ts` 의 오염 표본을 7좌석으로 넓히는 Task, 또는 `#6` 과 같은 실행 축을 `toInsightView` 에도 세우는 게이트. id=m7-leak-oracle-covers-one-seat |
| 2026-09-11 | HIGH | .claude/plans/ai-insight-report-m7.plan.md | **Task 8 의 게이트가 그 Task 의 산출물을 여전히 못 본다 (L2 R3 architect·test HIGH).** 「시효 좌석 2종의 문장 + 5열 근거 표 + `emptyBlocks[].message` 렌더」를 `#14`·`#15` 가 본다고 적었으나, `#14` 의 `EXPECTED_OUTPUT_PATHS` 21개에 좌석(`seats[]`) 경로가 한 건도 없고 `#15` 는 `SEAT_COLUMNS` 열 구성의 **비어 있지 않음**까지만 본다 — 열이 레퍼런스가 정한 5열인지, 표가 그 블록에 실제로 실렸는지는 어느 쪽도 모른다. 저장소에 선례가 있다 — `ANS015.test.tsx` 의 `tableByHeaders` 가 헤더 구성을 단언한다. 인수처: Task 11 에 5열 헤더 단언을 더하고 그 검사 이름을 `#13` 의 기준선에 넣는 것. id=m7-task8-output-still-unmeasured |
| 2026-09-11 | MEDIUM | .claude/plans/ai-insight-report-m7.plan.md | **`#7` 의 «양 방향» 은 여전히 substring 존재 검사다 (L2 R3 invariant MEDIUM).** 음 방향은 각 라벨이 `not.toContain` 에 감싸였는지까지 보도록 고쳤지만, 양 방향은 「라벨이 본문에 있고 `not.toContain` 에 안 감싸였다」이므로 주석 한 줄(`// 설계 방향 은 아래에서 본다`)로 초록이다. 하네스 자신이 「파일 전문 substring 검사는 게이트가 아니다」를 적고 음 방향만 고친 셈이다. 구조적 해소는 vitest 를 JSON 리포터로 돌려 **개별 검사의 통과**를 읽는 것인데, 그것도 「그 검사가 무엇을 단언하는가」는 못 본다 — 텍스트로 단언 의미를 재는 축의 천장이다(층위 8). id=m7-gate7-positive-direction-is-substring |
| 2026-09-11 | MEDIUM | .claude/plans/ai-insight-report-m7.plan.md | **`SEAT_EVIDENCE` 의 신규 3종은 키 이름이 선언됐는지만 검사되고 그 키 집합이 동결본 `evidence_shapes` 와 일치하는지는 어느 게이트도 안 본다 (L2 R3 invariant MEDIUM).** 계획서 자신이 그 상수를 「어떤 ddx evidence 원본 필드를 화면으로 올릴지 정하는 자리」로 규정했으므로, 집합 불일치는 whitelist 가 실제 응답과 어긋난 채 서는 것이다. `#4` 는 `'cov.expired'` 문자열의 실재만 본다. 인수처: `#4` 가 각 좌석의 `keys` 배열을 동결본 형상과 상등 대조하도록 확장. id=m7-seat-evidence-keys-unchecked |
| 2026-09-11 | MEDIUM | .claude/plans/ai-insight-report-m7.plan.md | **`tip.crm` 좌석이 `kind:'aggregate'` 라 근거 표가 제공자 evidence 가 아니라 서버가 `sent` 에서 상병코드·기간으로 **재선별한 진료행**이 된다 (L2 R3 security MEDIUM).** 이것은 `records` 를 NOT Building 으로 내린 근거(「어느 좌석에도 걸리지 않은 진료까지 나간다」)와 같은 축의 노출인데 이 좌석에 대해서는 그 판단을 다시 하지 않았다. 또 집계행의 실질 필드(`item`·`reason_ko`·`badge_ko`)는 `InsightEvidenceRow` 가 담지 않아 조용히 버려진다. 인수처: 이 좌석의 근거 표를 `expandAggregate` 대신 절 축(`salesTip.sections[].scripts`)에서 그리는 설계 판정. id=m7-crm-aggregate-reselects-treatments |
| 2026-09-11 | MEDIUM | .claude/plans/ai-insight-report-m7.plan.md | **「고객 관리 추천 품목」의 소유자가 둘이다 (L2 R3 architect MEDIUM).** Task 7 은 그 블록을 `report.salesTip.sections` 순회(절 축)로 그린다고 하고, Task 2 는 같은 것을 `ANGLE_SEATS`→`tip.crm` 좌석(발견 축)으로도 세우며 `SEAT_COLUMNS` 열 구성까지 요구한다. 계획서가 어느 쪽이 정본인지 정하지 않아 같은 내용에 소유자가 둘 생기고, 그중 하나는 소비자 없이 계약만 늘린다. 인수처: 절 축을 정본으로 하고 좌석은 그 절의 `scripts` 를 채우는 것으로 좁히는 판정(또는 그 반대) — 어느 쪽이든 계획서에 한 줄이 필요하다. id=m7-crm-block-has-two-owners |
| 2026-09-11 | LOW | .claude/plans/ai-insight-report-m7.plan.md | **게이트 `#5` 의 `# 기대:` 마커가 대상 파일을 2종으로 적는데 코드는 3종을 본다 (L2 R3 security LOW).** `#12` 는 주석을 안 보므로 이 문서-코드 어긋남은 어떤 검사도 안 잡는다. Acceptance 는 3종을 주장하므로 실제 동작은 옳고 마커만 낡았다. id=m7-gate5-marker-says-two-files |
| 2026-09-11 | HIGH | .claude/plans/ai-insight-report-m7.plan.md | **마지막 흡수 2건이 L2 재검증을 받지 못한 채 봉인됐다 (사용자 판정 2026-09-11 · 라운드 예산 3/3 소진).** R3 지적 중 「구현이 확실히 실패할 사실 오류」로 판정한 둘을 흡수하면서 plan hash 가 `sha256:501ca649…` → `sha256:965094d1…` 로 움직였고, `decide` 가 DD13 bind 로 `unavailable` 을 냈다(「plan changed after L2 read it」). 흡수 내용은 (1) 좌석 키의 **다섯 번째 정본** — `insuniverse-site/front/src/features/analysisDetailView/ui/ANS015/ANS015.tsx:172` 의 `seatPoints(live, "<seat>")` 리터럴 호출 목록. 앞의 네 자리(`ANGLE_SEATS`·`SEAT_ORDER`·`SEAT_EVIDENCE`·`SEAT_COLUMNS`)를 다 채워도 여기 없으면 신규 좌석이 화면에 한 건도 서지 않는다. 게이트 `#15` 에 그 호출처 검사를 더했다. (2) `summary` 형상 모순 — Task 5 는 객체를 배열로 펴고 `detailKo` 로 옮기는데 Task 9 가 원본 `summary.병력분석.detail_ko` 객체 접근을 적고 있었다. **둘 다 계획서 텍스트와 게이트 수정이고 게이트 완화는 0건이다** — 그것이 사용자가 재검증 없이 진행을 택한 근거다(선택지 3안 「되돌리기」는 이 두 오류를 안고 구현에 들어가는 것이라 기각됐다). **receipt 는 `codex_verdict='divergent'` 로 봉인한다 — `converged` 로 위장하지 않는다**(전역 CLAUDE.md §mccp). 재검증 인수처: 구현 중 게이트 `#15` 가 그 두 자리를 실제로 붉히는지 확인하는 것, 그리고 다음 창의 R1. 패널 3라운드 전문은 `.claude/reviews/plan-review-ai-insight-report-m7.md`. id=m7-last-absorption-unreviewed |
| 2026-09-11 | MEDIUM | .claude/plans/ai-insight-report-m7.plan.md | **`FORBIDDEN_KEYS` 는 이름 기반이라 새로 노출하는 free-text 필드의 같은 부류 누출을 못 잡는다 (security-reviewer MEDIUM).** `caveat` 가 금지 목록에 있는 이유가 「제공자가 우리 저장소 표 이름을 산문에 적어 보낸다」인데, 이 창은 그와 같은 성격의 자유 문면을 여럿 새로 연다 — `order[].why` · `direction.*.note` · `summary[].noteKo` · `evidenceView[].label` · 집계 형상의 `reason_ko`·`badge_ko`. 이름 금지는 **이미 관측된 한 사례**만 막고, 다른 이름으로 같은 것이 오면 통과한다. 값 수준 검사(표 이름 패턴·경로 패턴 정규식 등)는 이 창의 게이트에 없다. fan-out security 가 MEDIUM 으로 먼저 제기했고 Acceptance 의 `(미검증)` 목록에도 없던 잔여였다 — 이번에 Acceptance 에 명시했다. 인수처: 값 패턴 검사를 `#6` 에 더하는 별도 창. id=m7-forbidden-keys-are-name-based |
| 2026-09-11 | LOW | .claude/plans/ai-insight-report-m7.plan.md | **`findingId` 가 새 노출 축이다 (security-reviewer LOW).** `evidenceView[].findingId` · `caution.groups[].diseases[].findingId` · `direction.*.findingIds` · `ask[].findingIds` 로 제공자의 내부 참조 id 가 클라이언트에 도달한다. 구조적으로는 `analysisId`·`externalRef` 금지가 겨냥하는 것과 같은 부류이나, 응답 하나 안에서만 유효한 참조이고 시스템 간 상관자가 아니라 위험이 낮다. 화면이 `evidenceView` 를 좌석에 잇는 열쇠라 제거하면 그 기능이 사라진다. 관측만 올린다. id=m7-finding-id-is-a-new-id-surface |
| 2026-09-14 | HIGH | .claude/plans/insuniverse-docs-50-domain-m13.required-outputs.golden | **PR-Codex(`insuniverse-docs-50-domain-m13-ship` R1, raw verdict `needs-attention`, confidence 0.99)가 `id=50m13-own-pr-receipt-outside-scope-allow` 결함을 독립 재확인했고, 이 창의 `-ship` 재앵커가 그 범위를 1건 넓혔다.** 골든 `scope-allow`(`required-outputs.golden:259-269`)의 receipt 접두는 `.claude/receipts/mccp-implement-codex/` 하나뿐인데, 앵커 뒤 이 창이 더한 `mccp-pr-codex/insuniverse-docs-50-domain-m13.json`(`637de43`) · `mccp-santa-review/insuniverse-docs-50-domain-m13.json`(`fba8b91`) · `mccp-plan-codex/insuniverse-docs-50-domain-m13-ship.json`(`902766d`) 가 전부 그 밖이다. `-ship` 재앵커는 이 결함을 고치지 않는다 — 하네스는 원 decision 에 앵커돼 있어 `#10` 은 최종 브랜치에서 여전히 초록이 될 수 없다. 골든을 넓히면 `#13`·`#1(g)` 가 먼저 붉으므로 해소는 이 창이 아니라 **후속 검증 계약**(원 동결 증거와 지정 붉음은 보존하고, receipt 경로를 허용하는 새 골든·앵커로 최종 브랜치 초록을 받는다)이다. PR 단계는 `MCCP_FORCE_PR_WITHOUT_CODEX_CONVERGENCE` 감사 override 로 진행하고 verdict 는 비승인 그대로 봉인한다(사용자 지시 2026-09-14). 인수처: 원 행과 같음 · id=50m13-own-pr-receipt-outside-scope-allow (재확인) |
| 2026-09-14 | MEDIUM | .claude/reviews/plan-review-insuniverse-docs-50-domain-m13.md | **이 리뷰 기록의 과거 blob 5개(누수 행 6건)에 로컬 홈 절대경로가 남은 채 push 됐다 — `/mccp:pr` 3.1 history-leak 게이트 HALT 를 사용자 결정으로 수용.** `history-leak-scan.js` 가 `origin/main..HEAD` 에서 `repo-root` 패턴 6건을 냈다: blob `067e133`(`1492798`·`760f777`) · `d1c4f1b`(`760f777`·`ecc177e`) · `3010ecf`(`dd3e60e`·`7256b91`) · `40e2434`(`1fe99b1`·`3c8212f`) · `0c24542`(`6005915`·`fba8b91`) — 괄호는 그 blob 을 더하고 지운 커밋. HEAD 파일은 0건(`fba8b91` 이 걷어냈다). 9/8 1차 `/mccp:pr` 도 같은 자리에서 멈췄다. 이력 재작성은 `1492798` 이후 커밋 SHA 를 전부 바꿔 추적 receipt 의 `head_sha`(`dd39327`·`902766d`·`33b08f2`) 결박을 끊으므로 택하지 않았다. 수용 근거: 저장소 PRIVATE · 내용은 사용자명 포함 경로뿐이고 시크릿 0 · `origin/main` 에 같은 경로가 이미 1건(`codex-findings-backlog.md`). **재발 방지 축**: 리뷰 원문을 `.claude/reviews/` 에 붙일 때 워크트리 절대경로를 저장소 상대경로로 치환하는 단계가 없다 — 리뷰어 출력이 `/home/...` 를 인용하면 그대로 커밋된다. 인수처: plan-kit 또는 리뷰 기록 저작 관례(`.claude/templates/plan-kit/**` 소유 축) · id=50m13-review-record-abs-path-in-history |
| 2026-09-14 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m9.plan.md | L2 architect: The plan says sibling-harness execution is isolated, but only one of its callers is isolated. Only `#5`'s `gates-sub` template runs in an isolated copy, checks that the harness is byte-… · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated-m9.md · id=aba64d37 |
| 2026-09-14 | FAIL | .claude/plans/insuniverse-docs-60-history-deprecated-m9.plan.md | L2 architect: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated-m9.md · id=ac05a97f |
| 2026-09-14 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m9.plan.md | L2 test: Gate #5 and #6 set minimum counts on outcomes (resolved >= ceil(N/10), ok >= ceil(N/10)) before anything has been measured. If honest adjudication finds fewer resolved ids or fewer bindable … · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated-m9.md · id=a731721f |
| 2026-09-14 | FAIL | .claude/plans/insuniverse-docs-60-history-deprecated-m9.plan.md | L2 test: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated-m9.md · id=256516d5 |
| 2026-09-14 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m9.plan.md | L2 architect: The Files to Change table and Task 2 disagree on what `golden.txt` owns. The table row says only `env.git_version` is re-frozen. Task 2 and gate `#2` say exactly two keys move, including `fixtask.find… · 근거 Plan line 96: "`env.git_version` 재동결(`--update` 산출) — 위임 3행". Plan line 119: "움직이는 키는 **둘**이다". Plan line 282: `#2 ok 움직인 키 2 [env.git_version fixtask.findings… · DEFER(비차단 · m9 R4 single-pass) — plan 은 receipt plan_hash sha256:0407ad28 로 봉인돼 이 라운드에서 흡수 불가, 다음 판 저작 시 반영 · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated-m9.md · id=f36c93ac |
| 2026-09-14 | LOW | .claude/plans/insuniverse-docs-60-history-deprecated-m9.plan.md | L2 security: The plan file includes an absolute home-directory path (username plus plugin cache version). The plan is committed through the gate-artifact exemption, so the path ends up in a durable artifact. This … · 근거 .claude/plans/insuniverse-docs-60-history-deprecated-m9.plan.md:593 `node /home/madsc/.claude/plugins/cache/mccp/mccp/1.33.6/scripts/lib/codex-invoke.js adversa… · DEFER(비차단 · m9 R4 single-pass) — plan 은 receipt plan_hash sha256:0407ad28 로 봉인돼 이 라운드에서 흡수 불가, 다음 판 저작 시 반영 · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated-m9.md · id=45a7b3a3 |
| 2026-09-14 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m9.plan.md | L2 test: The plan says the ledger 'golden' delta d is written before the value it predicts exists, so the BASE+d == current arm of #1 can be falsified. But Task 1 tells the author to measure the heading count … · 근거 plan.md:112 '편집 후 표제 수를 실측하고 그 증분을 원장 record: "golden" 행으로 선언한다' vs the same line 'd 는 그것이 예측하는 값이 존재하기 전에 적혀야 한다'. Task 1's Validate at plan.md:114 is the meas… · DEFER(비차단 · m9 R4 single-pass) — plan 은 receipt plan_hash sha256:0407ad28 로 봉인돼 이 라운드에서 흡수 불가, 다음 판 저작 시 반영 · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated-m9.md · id=0170dcab |
| 2026-09-14 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m9.plan.md | L2 test: #6 lets the harness author choose the costly threshold T, and T is never written down or checked anywhere. Setting T low makes any coordinate with a cost row qualify as costly, up to the ceil(N/2) cap… · 근거 plan.md:153 'T 는 하네스 상수이고 계획서에 값을 박지 않는다' and plan.md:363-365. #6 only prints T; no gate compares T against the measured cost distribution. · DEFER(비차단 · m9 R4 single-pass) — plan 은 receipt plan_hash sha256:0407ad28 로 봉인돼 이 라운드에서 흡수 불가, 다음 판 저작 시 반영 · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated-m9.md · id=b5a6691e |
| 2026-09-14 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m9.plan.md | L2 test: Almost every check's negative case is marked unexecuted, and the check meant to execute them (#13 selfprobe) has an unexecuted negative case too. Nothing proves the probe mechanism itself fails when i… · 근거 '# 음성: (미실행)' at plan.md:260, 283, 292, 308, 345, 370, 380, 393, 400, 411, 418, 436. #1 is only half observed (plan.md:274-275). #12 and #14 cite m8 observation… · DEFER(비차단 · m9 R4 single-pass) — plan 은 receipt plan_hash sha256:0407ad28 로 봉인돼 이 라운드에서 흡수 불가, 다음 판 저작 시 반영 · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated-m9.md · id=176811e8 |
| 2026-09-14 | LOW | .claude/plans/insuniverse-docs-60-history-deprecated-m9.plan.md | L2 test: Task 8 says the closure document carries the PRD stamp's measured values (verdict skipped, 12/4/2, environment attribution of the 4 unmet items). #9 only checks that the file exists, that its sha256 m… · 근거 plan.md:174 '12 · 미충족 4 · 미검증 2 … 그대로 싣고' vs the #9 predicate at plan.md:397-399, which has no count comparison. · DEFER(비차단 · m9 R4 single-pass) — plan 은 receipt plan_hash sha256:0407ad28 로 봉인돼 이 라운드에서 흡수 불가, 다음 판 저작 시 반영 · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated-m9.md · id=a8367d63 |
| 2026-09-14 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m9.plan.md | L2 invariant: The golden rollback procedure does not put the repo back where it was. Task 1 adds headings to the findings file, and the rollback only restores golden.txt. After that restore, fixtask.findings_headin… · 근거 plan:463 says `git checkout <BASE> -- docs/_meta/verify/golden.txt` restores both keys and verify.sh --check returns to its original one-line failure. plan:74 s… · DEFER(비차단 · m9 R4 single-pass) — plan 은 receipt plan_hash sha256:0407ad28 로 봉인돼 이 라운드에서 흡수 불가, 다음 판 저작 시 반영 · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated-m9.md · id=0dd2e7ba |
| 2026-09-14 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m9.plan.md | L2 invariant: The #1 check that compares BASE value + declared delta d against the current value adds no real refutation power. Task 1 measures the heading count after the edit and then writes d, so d is just the n… · 근거 plan:112: 'measure the heading count after the edit and declare that increment in the ledger `record: "golden"` row'. plan:462: 'the only check that keeps refut… · DEFER(비차단 · m9 R4 single-pass) — plan 은 receipt plan_hash sha256:0407ad28 로 봉인돼 이 라운드에서 흡수 불가, 다음 판 저작 시 반영 · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated-m9.md · id=21c561b3 |
| 2026-09-14 | LOW | .claude/plans/insuniverse-docs-60-history-deprecated-m9.plan.md | L2 invariant: The #4 baseline anchor is still inside the window, so the author writes the sibling-harness red baseline that #4 accepts. The plan says openly that it inherits this limit and does not claim it is fixe… · 근거 plan:43 says the anchor is inside the window, so in a one-commit window the blob and the working tree are the same bytes, and the limit is inherited as carry it… · DEFER(비차단 · m9 R4 single-pass) — plan 은 receipt plan_hash sha256:0407ad28 로 봉인돼 이 라운드에서 흡수 불가, 다음 판 저작 시 반영 · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated-m9.md · id=70eb5cc3 |
| 2026-09-14 | NOTE | .claude/plans/insuniverse-docs-60-history-deprecated-m9b.plan.md | **m9b 마지막 L2 리뷰(2026-09-08 · plan sha256:128ddff0 · 4관점 전부 fail · L3 divergent · 5.2e 정지)의 미해소 15건을 흡수·재리뷰 없이 이연한다.** 이연 사유: 라운드 원장 `mccp-plan-codex__insuniverse-docs-60-history-deprecated-m9b` 가 panel 3라운드(index 0·1·2, 2026-09-08)로 `MCCP_GATE_ROUND_CAP=3` 상한에 닿아 enforce 봉인에서는 L2·L3 가 발화하지 않는다. 사용자 결정(2026-09-14)으로 backlog 기록 후 `divergent` receipt 를 봉인한다. 아래 15행의 file:line 은 2026-09-14 에 재대조했다 — 계획서 해시 불변, `m8.gates.mjs` 는 `9d1e74c`(2026-09-07) 이후 무변경 · 원문 .claude/reviews/plan-review-insuniverse-docs-60-history-deprecated-m9b.md |
| 2026-09-14 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m9b.plan.md | L2 architect: **`#4` 재측정 부분집합 `S` 를 "형제 소스가 `P` 를 리터럴로 참조" 로 유도하면 선언 귀속 축 R7(`m8#prd`)이 `S` 밖으로 떨어진다.** m8 하네스는 PRD 경로를 템플릿으로 조립한다 · 근거 `m8.gates.mjs:39` `SELFID` · `:46` ``PRD = `${PRDDIR}/insuniverse-docs-${SELFID}.prd.md` `` — 완성 경로 리터럴 0건(`grep -c` 실측) · `:51` `GOLDEN` 만 리터럴이라 R6 만 `S` 에 든다 · 계획서 m9b:110 (b)·(d) · m9b:276 · DEFER(round-cap 3/3 · 사용자 결정) · id=b7c41bd83fd8 |
| 2026-09-14 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m9b.plan.md | L2 architect: **Task 1 의 findings 편집이 `m8#2 findings` 좌표도 건드리는데 귀속 축은 둘(`m8#golden`·`m8#prd`)로만 열거됐다** — 새 표제가 6항목 spec 을 어기면 선언되지 않은 셋째 붉음 · 근거 `m8.gates.mjs:1561-1564` `CHECKS.findings` → `findingsSpec`·`parseFindings` · `:47-48` `FINDINGS` · m9b:421 · DEFER(round-cap 3/3 · 사용자 결정) · id=32b4ec2e8a70 |
| 2026-09-14 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m9b.plan.md | L2 architect: **`sweep` 레코드의 `err`·`err_sha256` 추가가 §Acceptance 로 전파되지 않았다** · 근거 m9b:276 술어는 `out`·`err` 둘 다 · m9b:441 Acceptance 는 `out` 만 · m9b:689 흡수표 · DEFER(round-cap 3/3 · 사용자 결정) · id=da976b45df74 |
| 2026-09-14 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m9b.plan.md | L2 security: **`#5` 앵커 후보에 이 창의 계획서 자신이 들어 자기서명이 다시 열린다** — Task 0 이 계획서·receipt·review 를 merge 전에 커밋하므로 `BASE` 에 `…-m9b.plan.md` 가 있고, 제외 규칙은 §Files to Change 의 CREATE·UPDATE 만 뺀다 · 근거 m9b:110 (먼저 커밋) · m9b:280 (`git grep … BASE -- .claude` 에서 CREATE·UPDATE 제외) · m9b:86 (계획서는 면제 표) · 본문 carry id 축자 99·110·151행 · DEFER(round-cap 3/3 · 사용자 결정) · id=25f5236a21f8 |
| 2026-09-14 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m9b.plan.md | L2 security: **`err` 채널의 기계 지문 유출이 §Acceptance 에서 빠졌다** — 진단은 stderr 로 가므로 Acceptance 만 충족한 구현이 `err` 에 절대경로·`$HOME` 을 싣고 커밋할 수 있다 · 근거 m9b:276 vs m9b:441 · `m3.gates.mjs` 106~108·123행(리뷰어 인용) · DEFER(round-cap 3/3 · 사용자 결정) · id=722d7d8af9e3 |
| 2026-09-14 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m9b.plan.md | L2 security: **유출 탐지기의 사용자명·호스트명 비교 대상 출처가 정의되지 않았다** — 리터럴로 박으면 하네스 자신이 지문을 커밋하고 INV4 와도 충돌한다 · 근거 m9b:110 정규화 (4) · m9b:312 `#13` 술어에 하네스 소스 지문 검사 없음 · DEFER(round-cap 3/3 · 사용자 결정) · id=176cda1d2d38 |
| 2026-09-14 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m9b.plan.md | L2 test: **`#4` 인과 대조 팔의 기대 토큰 `9행/status` 가 m8 의 실제 진단 문자열과 맞지 않아 R7 이 그 팔로는 통과할 수 없다** · 근거 m9b:276 · `m8.gates.mjs:1486` `die(… 선언되지 않은 형제 결손 — 실측 [...] 선언 [...])` 에 해당 토큰 0 · `:1478` `planCells` 유도가 Task 9 Plan 셀 변경 뒤 `[m2r m9b]` 가 되어 m9b:235 가 인용한 `[m2r m9]` 문면도 낡는다 · DEFER(round-cap 3/3 · 사용자 결정) · id=7ad59a73af7c |
| 2026-09-14 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m9b.plan.md | L2 test: **`#4` 부분집합 재측정이 `m8#prd` 를 `S` 에 담지 못해 `N \ S` 의 "`P` 미참조" 계수 단언이 거짓을 단언한다** (architect HIGH 와 같은 뿌리) · 근거 `m8.gates.mjs:46` 템플릿 조립 · `:51` 리터럴 대비 · m9b:110 · m9b:276 · DEFER(round-cap 3/3 · 사용자 결정) · id=dfdf8b5c9fba |
| 2026-09-14 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m9b.plan.md | L2 test: **Task 2 의 Validate 가 그 시점에 초록일 수 없다** — `#1` 커밋 위상 팔은 golden 커밋을 요구하는데 Task 2 에 `--update` 산출 커밋 지시가 없다 · 근거 m9b:264 "엄격한 조상" · m9b:124 Action · m9b:126 Validate · DEFER(round-cap 3/3 · 사용자 결정) · id=10fe41511bbb |
| 2026-09-14 | LOW | .claude/plans/insuniverse-docs-60-history-deprecated-m9b.plan.md | L2 test: **Task 13 의 Validate 가 Validation 블록 밖에서 정의되지 않는 `$OUT` 을 참조하고, 블록 안 호출은 읽는 파일에 자기 출력을 덧쓴다** · 근거 m9b:220 · m9b:323 `OUT="$(mktemp)"` · m9b:413 `tally --out "$OUT" \| tee -a "$OUT"` · DEFER(round-cap 3/3 · 사용자 결정) · id=d5a4866b71aa |
| 2026-09-14 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m9b.plan.md | L2 invariant: **skip predicate `S` 가 m8 `#0 scope` 를 구조적으로 빠뜨린다** — 허용 경로를 plan.md 파싱으로, 변경집합을 3-dot 으로 유도해 `P` 리터럴이 없으므로 closure·m9b 파일이 m8#scope 를 붉혀도 `N \ S` 로 재실행되지 않는다 · 근거 `m8.gates.mjs:42` `PLAN` · `:296` `allowedSets` · `:345` · `:362` `origin/main^{commit}` · m9b:110 (b)·(d) · DEFER(round-cap 3/3 · 사용자 결정) · id=a0a41444755a |
| 2026-09-14 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m9b.plan.md | L2 invariant: **기준선 sweep 이 창 시작 시점이 아니다** — 같은 Task 가 "merge 전에 이 창의 산출을 먼저 커밋" 과 "이 sweep 은 창 시작 시점의 기준선" 을 함께 적어, 창 자신이 만든 붉음이 기준선으로 세탁되고 R6·R7 결박이 발동하지 않는다 · 근거 m9b:110 두 문장 · DEFER(round-cap 3/3 · 사용자 결정) · id=4b8c52ab4035 |
| 2026-09-14 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m9b.plan.md | L2 invariant: **`#1` 커밋 위상 팔이 순서 위반을 막지 못한다** — 재동결 → findings 편집 → golden `--update` 한 번 더 순서면 위상 팔과 값 팔이 동시에 초록이다 · 근거 m9b:264 "위상은 사후 편집으로 못 바꾼다" · m9b:428 "값 축에는 반증력이 남지 않는다" · DEFER(round-cap 3/3 · 사용자 결정) · id=84fb0e023d23 |
| 2026-09-14 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m9b.plan.md | L2 invariant: **롤백 경로가 실행이 아니라 경로 집합 대조로만 고정된다** — "`verify.sh --check` 가 한 줄 실패로 돌아오는지" 는 산문 지시로 남는다 · 근거 m9b:268 · m9b:429 롤백 절차 · m9b:440 Acceptance · DEFER(round-cap 3/3 · 사용자 결정) · id=eafbbf632bbb |
| 2026-09-14 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m9b.plan.md | L2 invariant: **`#6` 에서 비율 하한을 지운 결과 전 좌표가 `unmapped` 여도 `ok + unmapped = N` 으로 공허하게 통과한다** — 토큰화기를 좁히면 결박 0건이 "누락 0" 계약을 만족한다 · 근거 m9b:284 · m9b:464 · DEFER(round-cap 3/3 · 사용자 결정) · id=9791fc7eb99f |
| 2026-09-14 | NOTE | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | **`m9b` → `m9c` 분기 · Codex 수렴.** 사유: 구현 Task 0 Phase B 에서 `BASE`(`dd42f88`) `verify.sh --check` 드리프트가 3키(`repo.insuniverse-server.actual_head` · `repo.insuniverse-site.actual_head` · `env.git_version`)로 관측돼 `m9b` `#2` 정확 집합 {2키} 가 성립 불가(plan_conflict) · `m9b` plan/implement receipt 는 커밋돼 E4 로 재봉인 거부 → 새 slug. 리뷰: 사용자 지시 cap 10 — 원장 밖 `codex-companion adversarial-review` 직접 8라운드(R1~R8 · 지적 16 흡수 · 1 이연 · 1 부분 기각) + 게이트 라운드 R9(`plan-codex-runner.js` · 원장 1/3) **approve · 지적 0**. receipt `mccp-plan-codex/insuniverse-docs-60-history-deprecated-m9c` `codex_verdict=converged` · `intent_gate_verdict=skipped(no_codex_findings)` · plan `sha256:a9520408` · `validate --command mccp:prp-implement` ok. 라운드 표·트리아지 원문은 계획서 §Codex Adversarial Review |
| 2026-09-14 | NOTE | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | 위 `m9b` 이연 15행(2026-09-14 · L2 architect/security/test/invariant)은 **`m9c` 계획서 술어로 흡수됐다** — D1(부분집합 `S` 삭제 · 전수 재실행) · D2a~D2e(창 이전 트리 기준선 · 서명 축자 비교 · 귀속 서명 인용) · D4(앵커 후보 `W0` 유도) · D5(golden 창 커밋 정확히 1) · D6(지문 대상 런타임 유도) · D7(`#6` 비공허) · D8(롤백 사본 실행) · Task 2 커밋 지시 · `#14` `$OUT`. 대응표는 계획서 §`m9c` 분기 절. 구현 뒤 게이트 관측으로 닫힌다 — 이 행은 해소 선언이 아니라 흡수 위치의 기록이다 |
| 2026-09-14 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | Codex R2 자가 · **집계 좌표(`check-all` · `chain` · `selfprobe`)의 첫 FAIL 행이 golden 재동결 뒤 전이적으로 바뀔 수 있다** — 근거: 원장 blob sweep 에서 m1·m2 `check-all` 은 verify ok 라벨 결손, m4·m5 `chain` 은 m2 붉음, m8 `selfprobe` 는 `#1 verifier` 붉음을 첫 FAIL 행으로 싣는다 · DEFER(정지 조건 선언) — 전이 귀속 축은 집계 좌표가 가린 실제 회귀까지 합법화하므로 세우지 않는다. 구현에서 해소 대신 다음 FAIL 행으로 넘어가면 `#4` rc 1 로 멈추고 그 문면으로 계획을 개정한다(계획서 §Risks) |
| 2026-09-14 | NOTE | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | Codex R2 F2 의 일부 기각 · *현재 `origin/main` 이 `HEAD` 의 조상인지 `#0` 이 따로 검사하라* · 근거: `origin/main` 은 창 밖에서 전진한다(`849e88e` → `6614f70` · 5커밋 · G17) — 요구하면 이 창 변경과 무관하게 붉어지는 moving target · REJECTED_BY_DESIGN — `#0` 은 `W0 ⊆ origin/main` 만 단언하고 최신 main 흡수는 PR 시점 merge(UI19)가 진다 |
| 2026-09-14 | **CRITICAL** | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | implement security-reviewer S5: **초안 `#5` 의 `resolveHeading()` 이 원장 문자열을 `validPath` 없이 `fs.existsSync`/`fs.readFileSync` 에 넘긴다** — 계획서 불변식 *"경로는 git object 읽기에만 · `fs.*` 금지(F5)"* 정면 위반 · 재현(2026-09-14 이 저장소): `anchor="../../../../../../etc/hostname#x"` → `resolve=/etc/hostname` `exists=true` throw 없음, 파일이 전량 메모리에 올라간 뒤 표제 불일치로 Reject 되며 *파일 부재* 와 *표제 부재* 의 Reject 문면이 같아 blind content oracle 이 된다 · 근거 `…-m9b.gates.mjs:1284`~`:1290` · `:1313` · 흡수 방향: 해석을 `blobAt(w0, path)` git object 판독으로 옮기고 `anchor`·`owner` 를 `validPath` 에 태운다 · **GATE-STOP(Phase 2.5.5) — 구현 미착수** · id=S5-resolveheading-unvalidated-fs-read |
| 2026-09-14 | **HIGH** | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | implement security-reviewer S6: **`owner-elsewhere` 결박이 해석 전 원문에 접두 정규식을 걸어 결정적으로 우회된다** · 재현: `owner=".claude/prds/../../CLAUDE.md#0. 경계 규약 …"` → 접두 정규식 통과 · `resolve=<워크트리>/CLAUDE.md` · `exists=true` · **표제 일치 true** → 행이 `owner-elsewhere` 로 통과. 표제 문자열이 같은 필드 안이라 확률적이 아니라 결정적이며 *"인수처가 다른 PRD 가 아니다"* 가 무력화된다 · 근거 `…-m9b.gates.mjs:1317` · 흡수 방향: 접두 정규식 대신 **검증·정규화된** 경로의 `split("/")` 세그먼트로 `[0]===".claude"` ∧ `[1]==="prds"` · **GATE-STOP** · id=S6-owner-prefix-regex-bypass |
| 2026-09-14 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | implement security-reviewer S7: **같은 호출점에서 디렉터리 경로가 `EISDIR` 를 던지고 그것이 `Reject` 가 아니라 재던져져 하네스 전체가 raw 스택으로 죽는다** · 재현: `anchor="docs#x"` → `exists=true` `readFileSync:EISDIR` · 근거 `…-m9b.gates.mjs:1290` · `:1337`~`:1338` · 흡수 방향: S5 의 git object 판독으로 자동 해소 + 판독 실패를 `Reject` 로 감싸 좌표 이름과 함께 die · id=S7-eisdir-uncaught |
| 2026-09-14 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | implement security-reviewer S8: **`TEMPLATES[row.proof_template]` 무가드 대괄호 조회로 `Object.prototype` 상속 멤버가 *템플릿 밖* 거부를 통과한다** — 계획서가 금지한 *집합 멤버십 정확 일치* 위반이 필드 술어가 아니라 템플릿 선택에 남았다 · 재현: `constructor`·`toString`·`valueOf`·`hasOwnProperty` 전건 `typeof function` · `!t` 거부 false (`gates-sub` 만 undefined 로 거부) · 이후 `t.keys=Object.keys` 가 선언 키 게이트를 통과하고 `Object.entries(t.keys)` 가 `[]` 라 필드 술어 루프가 0회 돈 뒤 `t.build` 부재 `TypeError` 로 죽는다 — spawn argv 도달 경로는 미발견이라 실행이 아니라 게이트 무결성/DoS 등급 · 근거 `…-m9b.gates.mjs:1222` · 흡수 방향: `hasOwnProperty.call` 또는 `Map`/`Object.create(null)` · id=S8-template-prototype-lookup |
| 2026-09-14 | **HIGH** | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | implement plan_conflict: **`#4` 귀속 축 R7 이 `m8#prd` 한 좌표·m8 문면 둘에만 묶여 있어 같은 원인에 반응하는 형제 문면 변종을 못 받는다** — R9·R10 이 Codex R2 F1·R2 자가로 각각 변종 열거를 얻었는데 R7 만 m8 단독으로 남았다 · 확정 1건: `m7#prd` 기준선 첫 FAIL 행 `#10 FAIL: 8 행 Status 가 이 창에서 바뀌었다 — in-progress (기대 pending)` 이 Task 9 의 8행 `complete` 전이로 `— complete (기대 pending)` 으로 축자 변한다(`m7.gates.mjs:1295` 보간이 결정적) · 후보 2건(확정 아님 · UI8): `m5#prd`(`이 창이 OQ 원소를 바꿨다` · Task 10) · `m6#sibling`(m5#prd 전이) · 미측정: `m2b`·`m2c`·`m3`·`m4` 의 행 동결 단언이 신규 붉음을 낼 수 있다 · 계획서는 *축 밖 1건이라도 `#4` rc 1* 이고 §Risks 가 이 경우를 정지 조건으로 선언했다 · 인수처: **계획 개정**(R7 에 형제 문면 변종 열거 · §재현 조건 + Task 0 D2d + `#4` ATTRIB). 축을 하네스에서 임의로 넓히는 것은 `m9c` 가 없애려는 바로 그 계획서 술어 이탈이다 · 전수 확정에는 Task 1·2·8·9 적용 후 sweep 1회 필요 · id=R7-axis-narrower-than-measured |
| 2026-09-14 | LOW | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | implement 자가 + security-reviewer: **계획서 `#5` 술어와 Codex R4 F1 트리아지가 인용한 *"패턴 앞 `--` → rc 128"* 을 git 2.43.0 에서 재현하지 못했다**(시도 argv 순서 전건 rc 0 또는 1) — 코드는 `-e <pattern>` 을 써서 그 모호성 부류를 비껴가므로 코드 결함은 아니고 계획서 산문의 미검증 숫자 1건이다(INV4 부류) · 근거 계획서 `#5` 술어 · §Codex Adversarial Review R4 F1 행 · id=rc128-unverified-number |
| 2026-09-14 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | implement 자가 ID11·ID12: **계획서가 이미 흡수한 Codex 지적 둘의 구현이 초안 하네스에 안 들어왔다** — (ID11) `#4`·`#6` 이 원장을 `ledgerRecords()` 로 **현재 파일**에서 읽는다(`…-m9b.gates.mjs:1111`·`:1456`), 계획서는 추가 커밋 `36637c9` blob + 바이트 접두를 요구(흡수된 R1 F1). 단 `meta.plan` 은 그 blob 에 `…-m9b.plan.md` 로 박혀 있어 `meta.plan === PLAN` 요구는 접두 계약과 충돌하므로 넣지 않는다 · (ID12) `#6 overlapping()`(`:1428`)이 **어휘 교집합만** 보고 `unmapped` 를 금지한다, 계획서는 결박 두 겹 동시 충족 절의 존재만 금지(흡수된 R5 F1) — 교집합만 보면 *어휘는 겹치나 계수가 맞는 절이 없는* 좌표가 `ok`·`unmapped` 둘 사이로 떨어져 정직한 원장이 실패한다 · 구현 시점에 닫는다(계획 개정 불필요) · id=ID11-ID12-draft-lags-absorbed-findings |
| 2026-09-14 | MEDIUM | .claude/PRPs/plans/archived/insuniverse-docs-50-domain-m13.gates.mjs | **50-domain 아카이브(`c66a8cf`)가 M1~M13 하네스의 입력 경로 상수를 끊었다 — 아카이브 경로에서 하네스를 돌려도 기록된 검사를 재현하지 못한다 (PR-Codex `insuniverse-docs-50-domain-m13-archive` R1, raw verdict `needs-attention`, confidence 0.99).** `gates.mjs:41-51` 의 `SELF`·`PLAN`·`GOLDEN`·`LEDGER`·`PRD` 가 옛 `.claude/plans/`·`.claude/prds/` 경로를 가리키고, `getGolden()` 이 옛 GOLDEN 을 무조건 읽으며, 중첩 호출하는 M12·M9 하네스도 지운 경로를 겨냥한다. 13개 하네스 전부 옛 경로 참조가 남았다(파일당 4~20곳). 선례 아카이브 20-foundation-access(하네스 8개)·30-contracts-limits(2개)도 같은 상태로 머지됐다. 재현이 필요하면 아카이브 전 커밋 `a722433` 을 체크아웃해 원 경로로 돌린다 — 이 절차 자체는 실행 검증하지 않았다 `(미검증)`. 같은 R1 은 pr-phase 잠금 해제 응답이 `lock_exit_ok=false`(mutations 0)라 ship receipt 를 봉인하지 못했고, 사용자 결정 2026-09-14 로 R2·override 없이 게이트를 우회해 PR 을 냈다. 인수처: 아카이브 하네스 재실행이 필요해지는 창 · id=50-archive-harness-paths-stale |
| 2026-09-14 | MEDIUM | .claude/plans/insuniverse-docs-70-viewer-m10.gates.mjs | **`#1` 의 mccp 산출물 면제가 `/mccp:milestone-close` 의 closure 문서를 안 덮는다 (M10 종결 실측).** `isWorkflowArtifact` 가 면제하는 것은 `.claude/plans/` · `.claude/notes/` · `.claude/state/` · `.claude/reviews/` · `.claude/PRPs/reports/` 의 **슬러그 접두 파일**과 `.claude/receipts/<gate>/<file>` 뿐이고, `.claude/milestone-closures/70-viewer-10.md` 는 어느 쪽도 아니다 — 그 파일 이름은 계획서 슬러그(`insuniverse-docs-70-viewer-m10`)가 아니라 **마일스톤 id**(`70-viewer-10`)로 선다. §Files to Change 에도 없고, 그 표는 `mccp-plan-codex` receipt 의 `plan_hash` 앵커라 사후에 행을 더하면 같은 검사가 해시 불일치로 붉는다. 그래서 **종결 행위 자체가 이 검사를 붉게 만든다** — 실측 `#1 FAIL: §Files to Change 밖 변경 1건 — .claude/milestone-closures/70-viewer-10.md` (종결 전 HEAD 17ae6f9 에서는 `#1` 초록 · check-all 16/16). 방향은 안전하다: 못 보는 것이 아니라 이름으로 낸다. 인수처: 70 뷰어 다음 창 — 면제 항을 **마일스톤 id 로 키잉해** `.claude/milestone-closures/` 를 더하거나, 그 창의 §Files to Change 가 closure 좌표를 선언한다 · id=70m10-check1-exemption-misses-closure-doc |
| 2026-09-14 | MEDIUM | docs/viewer/publish.mjs | **첫 원자 발행 뒤에는 뿌리의 비소유 보조 파일 갱신이 서빙에 안 들어간다 (M10 PR-Codex R1 · conf 0.97 · 코드 확인 · 재현 미실행).** 이월 출처가 `docs/viewer/publish.mjs` 1775-1779행에서 `prevGenId ? c.gen(prevGenId) : before.mode === MODE_DEGRADED ? c.live : c.out` 이라, 이전 세대가 한 번이라도 서면 뿌리(`c.out`)는 다시 읽히지 않는다. 그래서 `anchor-freshness --out X/anchor-freshness.json` → `build-docs --out X` → 그 JSON 재생성 → 재빌드 순서에서 두 명령이 모두 rc 0 인 채 `X/live` 가 첫 JSON 을 계속 서빙하고, 뿌리에 새로 둔 보조 파일도 세대에 안 들어간다. `build-docs.mjs` 2471행의 `OWNED_TOP` 이 freshness 를 소유에서 빼기 때문이다. **게이트 경로는 해당하지 않는다** — `docs/viewer/gate.mjs` 960행이 `[...genOwned, CANON_FRESHNESS]` 를 소유로 넘기고 1033행이 그 파일을 스테이징에 넣어 세대 산출로 만든다. 영향은 정본 밖 `--out` 을 쓰는 맨몸 생성기 호출이다. §NOT Building 의 *이월 복사 비용* 항은 비용만 다루고 검사 `#9` 는 이름 충돌·종류 규약만 본다 — 신선도 축은 어느 쪽도 안 문다. `/mccp:pr` 은 review-only 라 이 PR 에서 고치지 않았다. 해소: 매 발행에서 비소유 입력의 권위 출처를 정하고 봉인 전 스테이징에 반영, 두 발행 사이 보조 파일 갱신 1건·추가 1건 회귀 검사. 인수처: 70 뷰어 다음 창(발행 축 후속) · id=70m10-carry-source-ignores-root-aux-updates |
| 2026-09-14 | HIGH | docs/viewer/publish.mjs | **이월 출처 디렉터리 자체가 링크류인지 검사하지 않는다 — 세대 안의 엔트리는 거절하면서 세대 뿌리는 안 본다 (M10 PR security-reviewer · conf 0.65 · 코드 확인 · 재현 미실행).** 이월은 엔트리마다 `docs/viewer/publish.mjs` 1799행의 `lstatSync` 로 링크·하드링크를 거절하고 그 근거를 주석 (ii) 가 *"불변이어야 할 세대가 자기 밖의 가변 바이트를 서빙한다"* 로 적는다. 그러나 그 `lstat` 은 경로의 **마지막 성분만** 본다. 출처 자체(1775-1779행 `carrySrc = c.gen(prevGenId)`)는 `topEntries` 의 `readdirSync` 와 `cpSync` 가 링크를 따라 들어가므로 같은 성질이 한 단계 위에서 그대로 성립하고, `prevGenId` 는 1714행에서 `readPointer` 의 링크 **값**(`.gen/<id>`)으로만 서며 그 표적의 종류를 안 묻는다. 같은 계정의 다른 프로세스가 `<out>/.gen/<A>` 를 임의 디렉터리로의 링크로 바꾸면 다음 발행이 그 내용을 새 세대로 복사한다. **한계 — 새로운 것은 내용 주입이 아니다**: 그 프로세스는 `.gen/<A>` 안에 직접 써도 같은 내용을 이월시킬 수 있다. 새로운 것은 **불변 세대 계약의 파괴**다. `live` 가 링크된 세대를 가리키는 동안 표적 바이트가 발행 없이 바뀌며, 그것이 정확히 엔트리 거절이 막으려던 성질이다. 해소: `carrySrc` 를 쓰기 전에 `lstat` 으로 일반 디렉터리임을 확인한다. 인수처: 70 뷰어 다음 창(발행 축 후속) · id=70m10-carry-source-root-not-lstat-checked |
| 2026-09-14 | MEDIUM | docs/viewer/publish.mjs | **크래시 복구의 완주 대조도 세대 뿌리가 링크류인지 안 묻는다 (M10 PR security-reviewer · conf 0.45 · 코드 확인 · 재현 미실행).** `docs/viewer/publish.mjs` 1250행의 `path.join(gen, …)` → `statSync` 는 링크를 따라가고, 그 대조가 통과하면 1287행이 `swapPointer` 로 그 좌표를 `live` 로 승격한다. 저널의 `runId` 를 읽을 수 있는 같은 계정 프로세스가 아직 봉인 전인 `<out>/.gen/<runId>` 자리에 기대 바이트 수와 같은 파일들을 담은 디렉터리로의 링크를 심으면 복구가 그것을 완주된 세대로 승격시킬 수 있다. 바이트 수가 내용의 증거가 아니라는 것은 1246-1247행이 이미 적는다. 발동 조건이 크래시 타이밍이라 앞 행보다 좁다. 해소는 앞 행과 같다. 인수처: 같은 창 · id=70m10-recovery-gen-root-not-lstat-checked |
| 2026-09-14 | MEDIUM | docs/viewer/gate.mjs | **junction 호스트에서 완주 문면이 절대경로를 커밋되는 산출에 싣는다 (M10 PR security-reviewer · conf 0.7 · 코드 확인 · Windows 재현 미실행).** `docs/viewer/gate.mjs` 1061행이 `서빙 포인터 → ${res.pointer.raw}` 를 찍는데 `raw` 는 링크 값이고, `docs/viewer/publish.mjs` 636행이 junction 종류에서는 **최종 자리 기준 절대 표적**을 저장한다(`dir` 종류는 상대값 그대로). 그래서 심볼릭 링크가 안 서고 junction 으로 떨어지는 호스트에서는 그 줄에 사용자 홈을 포함한 절대경로가 실리고, 게이트 출력은 `.claude/notes/` 로 커밋되는 관례라 이력에 영구히 남는다. 이 축의 기존 방어인 `#11` 의 절대경로 스캔은 **리눅스에서 이 자리를 못 본다** — `dir` 이 서서 값이 상대라 볼 것이 없다. 해소: 문면에 싣기 전에 `raw` 를 발행 뿌리 기준 상대로 접고, 못 접으면 링크 종류만 낸다. 인수처: 70 뷰어 다음 창 · id=70m10-pointer-raw-absolute-on-junction |
| 2026-09-14 | MEDIUM | .claude/plans/insuniverse-docs-70-viewer-m10.plan.md | **`/mccp:pr` 3.1 history-leak 게이트의 `scan-error` 5건을 사용자 결정으로 수용하고 push 했다 — 경로 패턴 leak 은 0건이다.** `history-leak-scan.js --base origin/main --repo-root <절대경로> --json` 이 `origin/main..HEAD`(36커밋 · blob 142개)에서 낸 것은 `insuniverse-server` · `insuniverse-site` gitlink 의 `scan-error` 뿐이다. 그 gitlink 를 범위에 들인 것은 이 창의 병합 3건(`c46dc3e` · `c5d5216` · `b866e23`)이고, 스캐너가 gitlink 가 가리키는 서브모듈 커밋을 부모 저장소에서 읽으려다 실패하는 알려진 형태다. PR tip 의 포인터 3종은 main 과 바이트 동일이라 PR diff 에 gitlink 변경이 없다. CLI 에 allowlist 인자가 없어 통과시킬 방법이 없고, 이력 재작성은 추적 receipt 의 `head_sha` 결박을 끊는다. 선례 `517d7c7`. 해소: 스캐너가 mode 160000 엔트리를 건너뛰는 것이며 mccp 본체 소유다(B1). 인수처: mccp 상류 이슈로 환류(B5) · id=70m10-history-leak-gitlink-scan-error-accepted |
| 2026-09-14 | HIGH | .claude/plans/insuniverse-docs-70-viewer-m10.plan.md | **M10 PR 은 ship receipt 없이 나갔다 — plan·implement receipt 가 stale 이고 DD13 이 재봉인을 막는다 (사용자 결정).** `receipt/cli.js validate --command mccp:pr --decision insuniverse-docs-70-viewer-m10 --plan <m10 계획서>` 가 stale 2건으로 exit 2 다: plan-codex `plan_hash` `sha256:c07ab530…`(리뷰된 본문) · implement-codex `sha256:9b2e8a0a…`(`d15fce9` 판본) → 현재 `sha256:2d7f9813…`. 원인은 리뷰 **뒤**의 계획서 편집 두 건이다 — `d15fce9` 가 §Codex Implementation Review 에 `### Security Reviewer` 14행을 주입했고 `deb0fa9` 가 같은 절의 호출 경로 한 줄에서 홈 경로를 접었다. §Tasks·§Validation·§Files to Change 는 바이트 무변동이다. `-ship` 재앵커(선례 `7e018cb` · `902766d`)는 이번에 막힌다: plan-codex receipt 가 `review_source=multi-agent` 증명을 싣고 있어 `receipt/write.js` 의 DD13(`reviewed_plan_hash !== planHash` → `REVIEW_STAMP_INVALID`)이 재봉인을 거부하고, 그 주석이 인정하는 복구는 L2 재실행뿐이다. 종결 문서 회차 5 의 `ok:true` 는 `--plan` 없는 호출이라 staleness 검사를 건너뛴 값이다. PR-Codex R1(원장 1/3)과 security-reviewer 는 실제로 돌렸고 판정은 위 4행으로 이연했으나 `mccp-pr-codex` receipt 는 봉인하지 않았고 override 도 쓰지 않았다. **재발 방지 축**: 리뷰 기록 절을 계획서 안에 주입하는 관례가 곧 plan_hash 를 움직인다. 검사 `#1` 은 이미 `## Codex Implementation Review` 앞까지 잘라 해시하는데 mccp 는 파일 전체를 해시한다. 인수처: 70 뷰어 다음 창이 새 슬러그로 체인을 연다 · 규약 축은 `.claude/templates/plan-kit/` · id=70m10-shipped-without-ship-receipt |
| 2026-09-14 | HIGH | .claude/plans/ops-doc-reconcile-m1.plan.md | **golden `--update` 전 차이 행 분류를 어떤 게이트도 확인하지 않는다 (L2 test·invariant HIGH, 2관점 합의).** Task 3 은 "(b) 가 1건이라도 있으면 update 하지 않고 멈춘다" 로 동결 위험을 막는다고 적었지만 Validation `#1` 은 `--update` 로 막 재생성한 golden 에 `--check` 를 돌려 구조적으로 초록이다(`ops/_meta/verify-ops.sh:721` 부근 — update 는 golden 대조를 건너뛴다). Acceptance 의 `#1` 항목에 (미검증) 표기도 없다. 판정: 수용 — 개정판에서 update 전 report 와 golden 차이를 notes 에 보존하고, 차이 행 전건이 자식 산출물 경로 규칙으로 설명되는지를 기계로 무는 검사를 `#1` 앞에 둔다. 원문 .claude/reviews/plan-review-ops-doc-reconcile-m1.md · 인수처: ops-doc-reconcile M1 계획 개정판 · id=odr-m1-golden-update-ungated |
| 2026-09-14 | HIGH | .claude/plans/ops-doc-reconcile-m1.plan.md | **`#8` PII 스캔이 직렬화 JSON 을 그대로 훑고 40~64자 16진을 출처 무관하게 가려 우회된다 (L3 Codex HIGH).** 재현(2026-09-14, 이 계획서의 pii.mjs 원문): `{"t":"\u0030\u0031\u0030-1234-5678"}` → hits=0, 16진 40자 로컬파트 이메일 → hex_masked=1 hits=0, 대조군 평문 전화 → hits=1. 현 추적 jsonl 8파일에는 `\u` 이스케이프 0 · 16진+@ 0 이라 오늘 값은 안 바뀐다. 판정: 수용 — 개정판에서 JSONL 을 파싱해 문자열 leaf 만 스캔하고, 가림은 스키마가 digest 로 선언한 필드와 `ops/reconcile/reconcile.mjs:405` `piiScan` 의 probe 색인 규칙으로만 한다. 음성 사례 2종을 실측으로 기록. 원문 .claude/reviews/plan-review-ops-doc-reconcile-m1.md · id=odr-m1-pii-scan-bypass |
| 2026-09-14 | HIGH | .claude/plans/ops-doc-reconcile-m1.plan.md | **사람 확인 `#9` 가 관측층 자유 텍스트의 인명을 덮지 않는데 계획서가 덮는다고 적었다 (L3 Codex HIGH).** `#8` 은 이메일·전화·주민번호 3종만, `#9` 는 코드 축 divergent 행과 media 만 본다. 층 1 셀에 든 실명은 자동 적중도 사람 판정도 없이 통과하고 "PII 반입 0" 이 측정값으로 기록될 수 있다. Fan-out 반영 표의 "security HIGH → `#8` + `#9`" 행이 과장이다. 판정: 수용 — 개정판에서 지표 명을 "패턴 3종 적중 0 · 인명 (미검증)" 으로 쪼개 목표 충족으로 보고하지 못하게 하거나, 사용자와 인명 육안 검토 범위를 정한다(층 1 42,436행 전수는 비현실적). 원문 .claude/reviews/plan-review-ops-doc-reconcile-m1.md · id=odr-m1-human-review-scope |
| 2026-09-14 | MEDIUM | .claude/plans/ops-doc-reconcile-m1.plan.md | **측정표 아래 지표·가설 판정 문장을 게이트가 안 본다 (L2 test MEDIUM).** `#11` 은 marker 사이 `metric.*` 행만 대조하므로 목표 미달 값 옆에 "충족" 을 적어도 통과하고 Task 7 이 그 문장을 인용한다. 판정: 수용 — 개정판에서 판정도 블록이 PRD Success Metrics 목표와 비교해 `verdict.*` 행으로 산출하고 `#11` 대조 대상에 넣는다. 원문 .claude/reviews/plan-review-ops-doc-reconcile-m1.md · id=odr-m1-verdict-prose-ungated |
| 2026-09-14 | MEDIUM | .claude/plans/ops-doc-reconcile-m1.plan.md | **`#6` 이 `row_sha` 구성을 손으로 복제한다 (L2 architect MEDIUM).** D4 가 사본 금지를 근거로 PII 패턴을 원문 추출하면서 대상 쪽 해시는 `ops/db/normalize-db.mjs:469` 구성을 사본으로 다시 쓴다. 리뷰어 인용 `ops/reconcile/reconcile.mjs:1729` 부근의 `resealDb` 가 같은 일을 한다. 실패 방향은 요란하다(`OPS_RC_TARGET_SHA_DRIFT` 로 붉음). 판정: 이연 — 개정판에서 import 가능 여부를 확인해 쓰고, CLI 모듈이라 import 가 부작용을 내면 사본을 유지하되 D4 문면을 정정한다. 원문 .claude/reviews/plan-review-ops-doc-reconcile-m1.md · id=odr-m1-rowsha-copy |
| 2026-09-14 | LOW | .claude/plans/ops-doc-reconcile-m1.plan.md | **`#6` 은 `git archive HEAD` 사본을 보는데 HEAD==워킹트리를 그 앞에서 증명하지 않는다 (L2 invariant LOW).** Risks 가 인용한 `#13` 은 `#6` 뒤에 돌고 BASE 대비 워킹트리를 본다. 판정: 수용 — 개정판에서 `#6` 앞에 `git diff --quiet HEAD -- ops/reconcile ops/statements ops/db docs/_meta` 를 둔다. 원문 .claude/reviews/plan-review-ops-doc-reconcile-m1.md · id=odr-m1-archive-head-drift |
| 2026-09-14 | LOW | .claude/plans/ops-doc-reconcile-m1.plan.md | **`# 음성:` 다수가 `(구현 시 실측)` 예측이다 (L2 test LOW).** `#2` `#4` `#5` `#7` `#13` 이 해당. `#9` · `#11` 은 계획 단계에서 합성 입력으로 양성 rc 0 · 음성 rc 1 을 이미 실측했으나 계획서에 반영되지 않았다(동결 뒤라). 판정: 이연 — 개정판에서 실측으로 바꾼다. 원문 .claude/reviews/plan-review-ops-doc-reconcile-m1.md · id=odr-m1-negatives-predicted |
| 2026-09-14 | LOW | .claude/plans/ops-doc-reconcile-m1.plan.md | **`#0` 실패 메시지가 원본 절대경로를 싣고, 계획이 그 출력을 notes 에 붙이게 한다 (L2 security LOW).** 성공 경로는 경로를 안 낸다. 판정: 수용 — 개정판에서 실패 메시지를 `set/unset` 여부로만 적는다. 이 저장소는 리뷰 기록 절대경로 유출을 이미 한 번 겪었다(id=50m13-review-record-abs-path-in-history). 원문 .claude/reviews/plan-review-ops-doc-reconcile-m1.md · id=odr-m1-abs-path-in-fail |
| 2026-09-14 | LOW | .claude/plans/ops-doc-reconcile-m1.plan.md | **`#8` 이 추출한 패턴 배열을 `eval` 한다 (L2 security LOW).** 판정: 기각 — 대상은 추적·리뷰되는 `ops/reconcile/reconcile.mjs:351` 이고 새 신뢰 경계가 아니다. 단일 정본을 쓰기 위한 D4 결정이며 리뷰어도 노출 경로를 못 만들었다. 원문 .claude/reviews/plan-review-ops-doc-reconcile-m1.md · id=odr-m1-eval-patterns |
| 2026-09-14 | LOW | .claude/plans/ops-doc-reconcile-m1.plan.md | **측정표가 블록 자신과만 대조된다 (L2 architect LOW).** 판정: 기각 — `#11` 은 기록 충실성(표 == 실측)만 묻는 검사다. 외부 기준은 우산 PRD Success Metrics 목표이며, 그 비교는 위 id=odr-m1-verdict-prose-ungated 개정으로 들어온다. 원문 .claude/reviews/plan-review-ops-doc-reconcile-m1.md · id=odr-m1-metrics-self-ref |
| 2026-09-15 | NOTE | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | **게이트 라운드 cap 도달(3/3) · receipt 없음 — cap 도달, 반영분 미재검증.** `MCCP_PLAN_REVIEW=hybrid` 라운드 3(plan `sha256:199205b3` · 커밋 `5181a79`): L1 0건 · L2 architect fail · security pass · test fail · invariant fail(정족수 1/4 < 3) · L3 `invoked:false`. `decide` → `review_verdict=divergent` · `review_source=multi-agent` · `forwardCodexVerdict=false` · `review_proof=null` · halt 5.2e. 전역 규칙상 multi-agent source 는 정상 receipt 불가이고 `--review-mode` 를 뺀 `--codex-verdict divergent` 단독 write 는 가드 우회라 쓰지 않았다(사용자 divergent receipt 요청과 충돌 — 보고함). 기존 untracked receipt `mccp-plan-codex/insuniverse-docs-60-history-deprecated-m9c.json` 은 옛 plan `sha256:a9520408`(converged)이라 개정본에 stale · `validate --command mccp:prp-implement` exit 2. 리뷰 기록 `.claude/reviews/plan-review-insuniverse-docs-60-history-deprecated-m9c.md` · id=m9c-plan-cap-reached-no-receipt |
| 2026-09-15 | NOTE | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | 라운드 3 L3 Codex **호출 실패** — `l3.json` `invoked:false` · `classification=exit-nonzero blocking=true exit=1` · 기동 후 약 4초 종료 · `l3-call.err` 0바이트라 원시 stderr 미포착 · `codex-cli 0.154.0` 로그인 상태(`codex login status`). 원인 미확정. L2 정족수가 먼저 실패해 판정 source 는 L3 성패와 무관하게 multi-agent 였으므로 재시도하지 않았다(`plan-review/cli.js l3` 는 라운드 원장 밖) · id=m9c-r3-l3-exit-nonzero |
| 2026-09-15 | **HIGH** | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | L2 architect R3: **§재현 조건 R6 행이 축 밖 붉음을 여전히 `계획서 술어 이탈` 출력으로 보낸다** — Task 0 은 그 성공 경로를 지웠다고 적었다 · 근거 계획서 R6 행(`축 밖은 \`계획서 술어 이탈\` 로 출력`) vs Task 0 D2d 뒤 문단(`R6·R7·R9·R10 밖은 성공 출력에 싣지 않는다 … 나머지 성공 경로는 지운다`) · 실측 재현(2026-09-15 grep) · 정본 표를 따라 구현하면 Codex R1 F2 의 통과 경로가 되살아나 `#14` 가 그 ok 를 완주로 센다 · DEFER(round-cap 3/3) — 다음 개정에서 R6 행 처리 열을 rc 1 로 교정 · id=R3-a1-r6-offaxis-still-outputs |
| 2026-09-15 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | L2 architect R3: **R6 도 형제 문면 변종을 열거하지 않는다** — 수용 문면이 `m8.gates.mjs` 1585행 `움직인 키` 하나인데 m8 자신이 2492행에 *"`움직인 키` 는 m8 자신의 문면이라 형제 출력에 나올 수 없다"* 고 적었다(실측 재현) · R7·R9·R10 이 같은 결함으로 변종 열거를 얻었고 R6 이 네 번째 사례 · DEFER(round-cap 3/3) · id=R3-a2-r6-variants-unenumerated |
| 2026-09-15 | **HIGH** | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | L2 test R3: **초안 하네스의 축 밖 성공 경로를 지우는 소유 Task 가 없다** — 계획서는 경로 삭제를 선언하지만 Task 0 의 잔여를 *rename 과 #0 완주* 로만 적고 초안을 그대로 rename 한다 · 근거 `…-m9b.gates.mjs:898` `return g ? { ...g, plan: false } : null;` · `:1135` 성공 줄 `계획서 술어 이탈 귀속 ${offPlan.length}`(실측 재현) · over-permissive 방향이 살아 있고 그것을 붉힐 Validate 가 없다 · 앞 이월 ID11·ID12 와 같은 부류(*초안이 흡수된 술어를 안 따른다*)지만 이번에는 계획서가 소유 Task 를 명시하지 않은 점이 결함 · DEFER(round-cap 3/3) · id=R3-t1-offaxis-path-unowned |
| 2026-09-15 | **HIGH** | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | L2 test R3: **R9·R10 정의가 초안 하네스에 없다** — 초안은 R9 를 `m7` 형식 하나(`신설 표제가 계획서 열거와 다르다`)로만, R10 을 m8 문면 `FAIL: 창 범위 밖 — [` 와 `ps.every((p) => ctx.P.includes(p))`(계획서가 *영영 성립하지 않는다* 고 적은 규칙)로만 잡는다 · 근거 `…-m9b.gates.mjs:873`~`:886`(실측 재현) · Task 13 전에는 어떤 Validate 도 하네스를 계획서에 맞추도록 강제하지 않는다 · DEFER(round-cap 3/3) · id=R3-t2-r9-r10-draft-mismatch |
| 2026-09-15 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | L2 test R3: **음성 기록 15건 중 14건이 미실행인데 사유가 *"하네스가 아직 없다"* 로 거짓이다** — 초안 2015행(CHECKS 312 · selfprobe 1908 · 디스패치 2001)이 실재한다 · 근거 계획서 §Risks *차단 팔이 아직 한 번도 뒤집혀 본 적이 없다* 행 · §Validation `# 음성: (미실행` 14건(grep 계수) · CLAUDE.md §1 *음성 케이스 … 실행해 확인한 출력* · DEFER(round-cap 3/3) · id=R3-t3-negatives-unexecuted-with-false-reason |
| 2026-09-15 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | L2 test R3: **Task 0 Validate 가 `scope` 만 돌아 Task 0 이 설계한 `#4` 비교기·파서 결함이 Task 13 에 가서야 드러나고 Task 로 귀속되지 않는다** — 근거 계획서 Task 0 Validate · `…-m9b.gates.mjs:482`·`:901` 픽스처가 selfprobe(#13)에만 있다 · **라운드 2 흡수(L2 test R2 MEDIUM: Task 0 의 `#4` 는 편집 전이라 공허 초록)와 정면 긴장** — 한쪽은 `#4` 를 Task 0 에서 빼라, 다른 쪽은 Task 0 이 비교기를 시험하라. 해소 방향 후보: Task 0 에 `#4` 를 넣지 않고 비교기·파서 순수 함수 픽스처만 Task 0 Validate 로 결박 · DEFER(round-cap 3/3 · 트레이드오프) · id=R3-t4-task0-comparator-untested |
| 2026-09-15 | **HIGH** | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | L2 invariant R3: **PRD 8행 종료 조건이 충족되지 않은 채 `complete` 로 올리고, 그것을 막는 유일한 게이트(`m8#prd` 2072행)의 die 를 R7 귀속으로 합법화한다 — 차단이 귀속이 됐다** · 근거 PRD 8행 *"라운드 2 는 이 창에 없다 — 종료 조건이 유지보수자 표기 2라운드 연속 0건 이고 측정자가 사람이라 이 행은 complete 가 아니라 in-progress 로 끝난다"*(실측 재현) · `m8.gates.mjs:2072` · 계획서 Task 9(8행 `complete`) · §재현 조건 R7 (가) · `#10` 은 8행 `complete`·타행 무변동·커밋 순서만 본다 · **범위 판단이라 사용자 판정 필요** — 계획서 Summary 는 8행 전이를 이 창의 인수 대상으로 적었지만 PRD 는 사람 측정 라운드 2 를 종료 조건으로 박았다 · DEFER(round-cap 3/3 · 사용자 결정) · id=R3-i1-row8-exit-condition-bypassed |
| 2026-09-15 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | L2 invariant R3: **`#10` 의 *종료 문서 커밋이 8행 전이보다 앞선다* 는 유지보수자 검토 라운드 없이도 참이 되는 skip 조건이다** — §Acceptance 에 라운드 2 기록·유지보수자 표기를 대조하는 행 0건 · 위 R3-i1 과 같은 뿌리 · DEFER(round-cap 3/3 · 사용자 결정) · id=R3-i2-closure-order-not-exit-proof |
| 2026-09-15 | LOW | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | L2 invariant R3: **G21 의 `actual_head` 출처 행 인용이 855 인데 실제는 853 이고 `\|\| true` 폴백(서브모듈 부재 시 빈 값)을 적지 않았다** — 근거 `docs/_meta/verify/verify.sh:853`(앞 세션 notes 실측 `grep -n 'git -C "\$ROOT/'` 1건) · 영향은 인용 오류 한정 — `#2` 가 새 값을 `BASE` gitlink 와 대조하므로 빈 값은 붉다 · DEFER(round-cap 3/3) · id=R3-i3-g21-line-cite |
| 2026-09-15 | LOW | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | 라운드 2 이연분(계획서 §`m9c` 게이트 라운드 2 흡수 표에 처리 기록) — (1) L2 security R2 LOW ×2: **golden 에 기계 지문이 동결되고 지문 탐지기가 golden 을 안 본다** — `env.git_version` 은 `verify.sh` 재현 조건 키라 설계상 기계값(G5)이고 탐지기를 golden 에 걸면 재동결이 불가능해진다 · DEFER — 구조적 처리는 §Open Questions 신설 원소 · 이월 `60m8-golden-freezes-machine-fingerprint` (2) L3 Codex R2 medium: **초안 `#11` 이 BASE 접두를 집행하지 않는다** — `…-m9b.gates.mjs:1749`~`:1756` · 계획서 술어(`#11` 접두 단언 · 음성 (b))는 라운드 2 에 섰다 · 구현으로 닫는다(템플릿 조회 건은 위 S8 행) · id=R2-deferred-fingerprint-and-11-prefix |
| 2026-09-15 | NOTE | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | **사용자 결정 2건(2026-09-15).** (1) `R3-i1-row8-exit-condition-bypassed` — **승인**: PRD 8행 `complete` 전이를 이 창에서 진행한다. 유지보수자 표기 2라운드 연속 0건 조건을 이 창이 측정하지 않는다는 사실은 그대로이며 사용자 판정으로 닫는다. (2) 게이트 cap 도달·receipt 없음 상태에서 **`mccp-plan-codex` receipt 없이 구현 진행**. divergent receipt 는 쓰지 않았다 — `review_source=multi-agent` 이고 L2 비수렴인 divergent receipt 는 `schema.js:535` 가 `meta.review_single_pass_bypassed_verdict=true` 를 요구해 일어나지 않은 single-pass 우회를 봉인하게 되고, 판정 출처는 L2 정족수에서 정해지므로 HIGH 1건 승인으로 바뀌지 않는다. 나머지 R3 HIGH 3건(`R3-a1` · `R3-t1` · `R3-t2`)은 구현 창에서 계획서 Task 0 D2d 뒤 문단(축 밖 rc 1)과 §재현 조건 R9·R10 을 정본으로 따른다 · id=m9c-user-decisions-2026-09-15 |
| 2026-09-15 | NOTE | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | 위 `m9c-r3-l3-exit-nonzero` 행의 **원인 정정** — *원인 미확정* 이 아니라 **Codex 사용 한도**다(`You've hit your usage limit … try again at Sep 21st, 2026 9:21 AM`). 같은 날 다른 세션이 `codex-companion.mjs adversarial-review --wait` 를 직접 불러 확인했고, `codex-invoke.js` 는 그 문면을 `companion exited with status 1` 로 삼킨다. 2026-09-21 09:21 까지 plan L3 · Implement-Codex · PR-Codex · santa Reviewer B 가 전부 같은 한도에 걸린다 · id=m9c-r3-l3-cause-usage-limit |
| 2026-09-15 | NOTE | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | **Implement-Codex R2 (원장 2/3).** `codex-invoke` `classification=ok`(계정 교체로 한도 해소) · `needs-attention` → `divergent`. F1 HIGH(R7 이 사람 리뷰 없이 8행 complete 수용) = REJECTED_BY_DESIGN — 사용자 승인 `m9c-user-decisions-2026-09-15` 와 같은 축, 단 종료 문서 미완 절·PRD `8` 스탬프에 면제 기록이 구현 의무. F2 MEDIUM(carry 필수 프로브가 경로형 resolved 행 존재에 숨어 기댐 · `…-m9b.gates.mjs:1817`~`:1822` · `:285` 실측 재현) = ACCEPT_NOW — 전용 픽스처 carry 행으로 프로브 분리. 판정표 원문은 notes §Codex Implementation Review — R2 · id=m9c-impl-r2-codex |
| 2026-09-15 | **CRITICAL** | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | implement security-reviewer R2 S9: **`#2` 롤백 실연이 실제 gitdir 포인터 사본에서 `git checkout <BASE> -- …` 를 돌려 실제 저장소 index 에 되돌림을 staged 한다** — 공격 없이 매 정상 실행마다 발생, 개발자 staged 편집을 조용히 덮는다 · 근거 `…-m9b.gates.mjs:258`(사본 `.git` = `gitdir: <실제>`) · 계획서 `#2` 술어·§Risks 롤백 절차 · 재현(2026-09-15 scratchpad 격리 저장소): 포인터 사본 checkout 뒤 원본 `MM golden.txt`(index OLD) · 대조 `git clone --shared --no-checkout` 사본은 원본 무변동 · ID3 합성 gitdir 은 서브모듈만 다뤄 못 막는다 · 흡수 방향: 롤백 사본을 독립 clone 으로, 포인터 사본에서 index 변경 git 명령 0건 · **GATE-STOP(Phase 2.5.5 R2)** · id=S9-rollback-copy-writes-real-index |
| 2026-09-15 | **HIGH** | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | implement security-reviewer R2 S10: **S5~S7 수정안의 `blobAt(W0, path)`(= `git show rev:path`)가 디렉터리에 tree 목록을 rc 0 으로 돌려줘 `## …` 이름의 빈 파일로 `rejected`·`owner-elsewhere` 앵커를 위조할 수 있다** — notes S7 행의 *"디렉터리는 blob 이 아니다 → 자동 해소"* 는 거짓 · 근거 `…-m9b.gates.mjs:104`~`:111`(빈 출력만 거부) · 재현: `git show HEAD:d` rc 0 · `tree HEAD:d` / `## Fabricated Heading` 출력 · `git cat-file -t` = tree · `git cat-file blob HEAD:d` rc 128 · 흡수 방향: 앵커 해석을 `git cat-file blob <W0>:<path>` 로 · **GATE-STOP** · id=S10-blobat-tree-listing-anchor-forgery |
| 2026-09-15 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | implement security-reviewer R2 S11: 앵커 해석 실패를 좌표 이름 Reject 로 만들겠다는 수정안이 `blobAt`→`die`(`process.exit`) 재사용으로는 성립하지 않는다 — `CHECKS.carry` 의 `try/catch (Reject)`(`…-m9b.gates.mjs:1335`~`:1341`)가 못 잡는다 · `blobAt`→`die` 는 인용 확인, `die` 의 `process.exit` 는 리뷰어 인용(`:66`~`:69`) · fail-closed 는 유지, 진단 문면 결함 · 흡수: 죽지 않는 판독 변형 · id=S11-blobat-die-bypasses-reject |
| 2026-09-15 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | implement security-reviewer R2 S12·S13: **sweep 지문 탐지가 절대경로를 8개 이름 허용목록(`…-m9b.gates.mjs:420`)으로만 잡고 `TMP_RE`(`:401`)는 한 세그먼트만 지운다** — 재현: `/srv/…` · `/workspace/…` · `/builds/…` 전부 미탐, `<tmpdir>/m9bgate-abc/sub/probe-9.md` → `<TMP>/sub/probe-9.md` · CI·컨테이너 경로와 겹치면 조용한 유출(이 저장소 `cwd` 유출 재봉인 선례와 같은 부류) · 흡수: 루트 상대 치환 뒤 임의 절대경로 catch-all · 토큰 끝까지 치환 · id=S12-S13-fingerprint-abs-path-allowlist |
| 2026-09-15 | LOW | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | implement security-reviewer R2 S14 + 정보: 사용자명·호스트명 비교가 길이≥3·대소문자 일치(`…-m9b.gates.mjs:394` · 리뷰어 인용 · 미재현) · 계획서 D6 *하네스 소스·원장 자신에도 탐지기* 호출점이 초안에 없다(`leaks()` 는 `:458` · `:1110`·`:1114` 에서만) · 구현에서 대소문자 무시 + 소스·원장 전 필드 연결 · id=S14-fingerprint-words-and-selfscan |
| 2026-09-15 | NOTE | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | **사용자 결정(2026-09-15): 구현 게이트 R2 GATE-STOP 뒤 조건부 Phase 3 진입.** S9~S14 흡수 방향을 구현 시점 결정 ID13~ID16 으로, Codex R2 F1 면제 기록 의무를 ID17 로 확정(notes). 조건: 구현된 `…-m9c.gates.mjs` 에 대한 security-reviewer 재검토를 **그 파일 커밋 전** 에 받고 CRITICAL/HIGH 면 커밋하지 않는다. 구현 게이트 원장 2/3 · 라운드 3 미사용 · id=m9c-user-decision-conditional-phase3 |
| 2026-09-15 | MEDIUM | insuniverse-site front/src/features/analysisDetailView/ui/ANS015/ANS015Panels.tsx | **제공자 각주가 절의 존재에 매여 있어, 절이 안 서면 각주가 침묵한다 (site `505bef7c` PR-Codex R1 F1 · 코드 확인 · 가상 입력 재현, 실호출 미관측).** `ANS015Panels.tsx:539-542` 가 `standsOnItsOwn` 으로 절을 먼저 거르고, `notes` 를 **거른 뒤 목록**에서만 모은다. 이 커밋이 `standsOnItsOwn` 의 재료를 `flagKo !== null || badgeKo !== null`(변경 전 `origin/stg:381-391`)에서 `seatCount > 0`(변경 후 `:505-512`)으로 바꿨으므로, 라벨과 `footnoteKo` 만 있고 발견·`direction`·`triggers` 가 0 인 절은 이제 절과 각주가 함께 사라진다. 변경 전에는 `flagKo` 때문에 절이 서서 각주도 섰다. 라벨 제거는 2026-09-15 사용자 지시의 직접 귀결이고 주석 `:500-503` 이 그 결정을 기록하지만, **각주 소실은 그 주석이 말하지 않는 부수효과**다. 실측 반증 폭: 실호출의 `crm_item` 은 `tip.crm` 발견 1건을 가져 절이 서고(주석 `:501-502`), 동결본 `.claude/plans/ai-insight-report-m5.report-fixture.json` 의 절은 `sales` 1건이며 `footnoteKo` 가 없다 — 그래서 관측된 어떤 입력에서도 아직 발동하지 않는다. 해소: 본문 표시 여부와 각주 수집을 분리해 `notes` 를 필터 **전** `given` 에서 모은다(1행). `/mccp:pr` 은 review-only 라 이 PR 에서 고치지 않았다. 인수처: ai-insight M8 또는 후속 수정 창 · id=m7-footnote-dies-with-its-section |
| 2026-09-15 | LOW | insuniverse-site front/src/features/analysisDetailView/ui/ANS015/ANS015.insight.ts | **동일 이름 제공자 블록이 중복되면 배지를 과다 집계한다 (site `505bef7c` PR-Codex R1 F2 · 함수 실행 재현 · 운영 발생 미관측).** `ANS015.insight.ts:269-271` 의 `(tab.blocks ?? []).find((b) => b.name === d.block)` 이 이름이 같은 첫 블록만 집어 `d.n - given.n` 을 차감한다. 제공자가 `count` 에 두 블록을 모두 셌는데 차감은 한 건분만 일어나므로 배지가 부풀고, 첫 항목 선택이라 입력 **순서에도 의존**한다. Codex 재현: 보상 탭 `count=2` · 이름이 「숨은 보험 내용」인 `counted:true, n:1` 블록 2개 · 시효 좌석 2개 → 배지 `3`(기대 `2`). 실측 반증 폭: 동결본 `ai-insight-report-m5.report-fixture.json` 의 `subTabs[].blocks` 는 이름 중복 0건이다. 추가 배지 테스트 `ANS015.test.tsx:276-309` 는 중복 입력을 검사하지 않는다. 해소: 블록 이름을 키로 `n` 을 합산한 뒤 차감하고, 중복 입력 1건을 테스트에 세운다. 인수처: ai-insight M8 또는 후속 수정 창 · id=m7-badge-overcounts-duplicate-blocks |
| 2026-09-15 | LOW | insuniverse-site front/src/features/analysisDetailView/ui/ANS015/ANS015.insight.ts | **동일 키 절이 중복되면 배지와 실제 렌더 수가 어긋난다 (site `505bef7c` PR-Codex R1 F3 · 렌더 재현 · 운영 발생 미관측).** `ANS015.insight.ts:255-261` 의 `sectionStands` 가 `sections.some((x) => x.key === key)` 로 **절 존재만** 확인해 좌석을 한 번 세는 반면, `ANS015Panels.tsx:549-564` 는 `sections.map` 으로 절마다 같은 좌석을 다시 렌더한다. Codex 재현: `sales` 절 2개 · `tip.sales` 좌석 1개 · 제공자 탭 `count=0` → 배지 `1` · 발견 카드 `2`(근거 ID 동일). 중복 렌더 자체는 변경 전에도 있었고 이 커밋이 낸 것은 배지 쪽 불일치다. 실측 반증 폭: 동결본 절은 `sales` 1건이고 키 중복 0건. 실호출에서 관측된 것은 **다른** 키(`direction`)의 절이 하나 더 오는 형태였지(주석 `ANS015Panels.tsx:536-537`) 같은 키 중복이 아니다. `key={s.key}` 가 React 키로도 쓰이므로 중복 키는 별도 경고를 낳는다. 해소: 절을 키로 정규화한 결과를 렌더와 배지 계산이 공유한다. 인수처: ai-insight M8 또는 후속 수정 창 · id=m7-badge-vs-render-on-duplicate-sections |
| 2026-09-15 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | **물려받은 golden 드리프트 — `repo.insuniverse-server.actual_head`.** `origin/main` 이 `#76`(`6e63946` · 2026-09-11 서브모듈 stg bump)을 golden 재동결 없이 받아 `BASE` gitlink 와 golden 값이 갈렸다. 이 창은 자기 트리에서만 재동결하고(Task 2 · `#2` 유도 집합 `D`) main 은 붉은 채로 둔다. 판정 = **owner-elsewhere** — 포인터 소유는 `ai-insight-report` PRD(`#76`)이고 재동결 규약은 `00-protocol` 이다 · id=60m9c-inherited-drift-insuniverse-server
| 2026-09-15 | HIGH | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | **물려받은 golden 드리프트 — `repo.insuniverse-site.actual_head`.** 출처·구조는 위 행과 같다(`6e63946`). 판정 = **owner-elsewhere** — `insuniverse-site` 포인터 소유 PRD 앞으로 회부하고 이 창은 `BASE` gitlink 값으로만 재동결한다 · id=60m9c-inherited-drift-insuniverse-site
| 2026-09-15 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | implement security-reviewer R3 S15: **`#13 selfprobe` 가 워킹트리 폴백 금지 프로브에서 실제 추적 파일 `…-m9b.baseline.txt` 를 직접 변조하고 동기 원복·exit 훅에 기댄다** — SIGKILL/OOM 시 추적 파일 잔여 · 검사 정확성·index 는 무해 · 근거 `…-m9c.gates.mjs:2242`~`:2250`(리뷰어 인용) · DEFER(plan_conflict 정지) — 격리 저장소 프로브로 이전 · id=S15-selfprobe-real-basefile-mutation |
| 2026-09-15 | LOW | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | implement security-reviewer R3 S16·S17: 하네스 소스 자기 스캔만 절대경로 catch-all 을 끈다(`:474`~`:476` · `:1338` · 의도적 교환) · sweep argv 가 PR 로 바뀌는 형제 계획서 §Validation 에서 온다(`shell:false` · argv 한정) · 기록 · id=S16-S17-selfscan-abs-and-plan-argv |
| 2026-09-15 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | implement 자가: **`#13` 프로브 `6` 이 첫 `ok` binding 행을 고정 절 `docs/_meta/ownership.md#회부 인계` 로 바꾸는데 그 행이 이미 그 절을 인용하면 무변조다** — 실측 `m1#check-all` 이 그 절을 인용해 `#13 FAIL: 프로브 변조가 내용을 바꾸지 않았다` · 원장 결함 아님 · 근거 `…-m9c.gates.mjs:2148`~`:2155` · 흡수 방향: 대체 절로 `bindOk` 가 서지 않는 `ok` 행을 고른다(원장 행 순서 조작 금지) · DEFER(plan_conflict 정지) · id=probe6-binding-target-collides |
| 2026-09-15 | NOTE | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | **m9c 재진입 흡수 3건 (반사실 확인).** `probe6-binding-target-collides` ABSORBED — 기준선 초록·대체 절 비결박 `ok` 행 선택 · 수정 전 무변조 die → 수정 후 rc1+토큰 · `S15-selfprobe-real-basefile-mutation` ABSORBED — 격리 저장소 + 호출 동안 cwd 이동 · 회귀 사본에서 검출 · 실행 전후 BASEFILE sha256 동일 · 신규 **프로브 `13` 이 커버리지 기준(`cmd`)이 아니라 id 만 바꿔 사본이 15/15 rc 0** ABSORBED — `cmd` 변경으로 rc1+`프로브 없는 검사 — #7` · 결과 `#13` ok 23/23 · `#14` 13/14 결손 [4] · `#4` 축 밖 19 는 계획 개정 판정 대기 · id=m9c-reentry-probe-absorptions |
| 2026-09-15 | NOTE | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | **m9c 재진입 2 — `#4` 축 밖 19 사유 수용 · plan receipt intent-gate override.** 사용자 사유 *"구현을 먼저 진행하고 추가 수정하는 방향으로 진행 (ops-reconcile 때문에 어쩌피 수정 포인트가 있을 예정)"* · `mccp-plan-codex` `codex_verdict=divergent` · `intent_gate_force_override=true` (plan_hash `199205b3`) · 15검사 13 ok · `#4` 축 밖 19 좌표 집합 정지 기록과 동일(main 만 `1046134`) · `#14` 13/14 결손 [4] · 해소는 notes §정지 — plan_conflict §다음 진입점 개정 대상 · 근거 `.claude/PRPs/notes/insuniverse-docs-60-history-deprecated-m9c.md` §재진입 2 · id=m9c-reentry2-reason-accepted |
| 2026-09-15 | HIGH | .claude/plans/ops-doc-reconcile-intake-m1.plan.md | **라운드 상한 3/3 도달 — receipt 없음 (L2 R2 3/4 pass 인데 test HIGH 2건이 정족수를 막았다 · L3 Codex converged findings 0).** `decide` → `verdict=divergent source=multi-agent forwardCodexVerdict=false`. 전역 규칙상 multi-agent 출처는 정상 receipt 를 쓸 수 없어 `MCCP_SKIP_INTENT_GATE` 등으로 우회하지 않았다. 계획서는 R2 판(`sha256:d33f14cc…`, 커밋 `f583883`)으로 동결돼 있고 아래 R2 지적은 **반영되지 않았다**. 원문 .claude/reviews/plan-review-ops-doc-reconcile-intake-m1.md · id=odr-intake-m1-round-cap-no-receipt |
| 2026-09-15 | HIGH | .claude/plans/ops-doc-reconcile-intake-m1.plan.md | **게이트가 층 2 하네스를 한 번도 안 돌린다 (L2 R2 test HIGH).** 계획은 `check-statements.mjs` 의 리더 둘(`readCells` · `censusCells`)과 export 를 바꾸는데 `.gates.sh` 에 `ops/statements/_harness/m0.sh` 호출이 0건이다. 그 하네스는 체커 한 파일만 fixture 트리에 복사하므로(`ops/statements/_harness/m0.sh:302`) fixture 에 `ops/intake/` 가 없을 때 리더가 죽는 회귀는 거기서만 보인다. 판정: 수용 — 개정판 `#3` 에 `bash ops/statements/_harness/m0.sh` 초록을 더한다. 이연 사유: 라운드 소진 · 계획 동결. id=odr-intake-m1-l2-harness-not-run |
| 2026-09-15 | HIGH | .claude/plans/ops-doc-reconcile-intake-m1.plan.md | **D19 의 두 디렉터리 문서 id 충돌 거부를 반증할 음성 사례가 없다 (L2 R2 test HIGH).** `ops/statements/_harness/m0.sh:509-511` 의 셀 행 불일치 음성은 `cell-doc-mismatch` · `cell-ref-row-col-mismatch` · `cell-duplicate-ref` 3종뿐이고 `#5` 는 초록 경로만 본다. 가드가 빠져도 한쪽이 조용히 가려진 채 전 게이트 초록이다. 판정: 수용 — 개정판 Task 6 에 교차 디렉터리 중복 id 음성 case 를 더하고 위 하네스 실행으로 문다. id=odr-intake-m1-cross-dir-dup-negative-absent |
| 2026-09-15 | MEDIUM | .claude/plans/ops-doc-reconcile-intake-m1.plan.md | **가림 양성 대조가 구현 중인 코드의 자기신고 문자열이다 (L2 R2 test MEDIUM).** `.claude/plans/ops-doc-reconcile-intake-m1.gates.sh:204` 는 `--selftest` 출력의 `mask_probe ok` 존재만 본다 — 아무것도 안 가리고 그 줄만 찍어도 통과한다. 판정: 수용 — 개정판에서 게이트가 합성 입력(전각 전화번호 · 이름 열)을 export 된 가림 함수에 직접 넣고 출력을 대조한다. id=odr-intake-m1-mask-probe-self-report |
| 2026-09-15 | MEDIUM | .claude/plans/ops-doc-reconcile-intake-m1.plan.md | **`extract-cells.mjs` 가림 훅은 양성 대조가 없고, 가림 함수·가명 매핑의 소유자가 둘이다 (L2 R2 test·architect MEDIUM 합의).** 훅은 `.gates.sh:123` 의 커밋본 바이트 대조와 `:124` 의 가림 규칙 없는 `--selftest` 로만 지나가 훅이 안 돌아도 재생성본이 같으면 초록이다. 또 `extract-intake.mjs` 와 `extract-cells.mjs` 가 같은 저장소 밖 매핑 파일에 순서 가명을 따로 쓰면 같은 사람이 두 가명을 받거나 다른 두 사람이 `person-a1` 을 받는다. 판정: 수용 — 가림 함수와 매핑 쓰기를 한 모듈에 두고 두 관측기가 호출하게 하며, 게이트가 그 함수를 합성 입력으로 직접 대조한다. id=odr-intake-m1-mask-hook-two-owners |
| 2026-09-15 | MEDIUM | .claude/plans/ops-doc-reconcile-intake-m1.plan.md | **`#8` 의 「전건 빈 출력 아님」 판정이 늘 참일 수 있다 (L2 R2 invariant MEDIUM · 미검증).** 리뷰어 주장: tesseract 4.x/5.x 는 글자가 없어도 `.txt` 에 페이지 구분자(form feed)를 써서 `.gates.sh` `#8` 의 `[ -s "$W/ocr/$i.txt" ]` 가 항상 참이 된다. 이 호스트에 tesseract 가 없어 확인하지 못했다. 판정: 이연 — 설치 뒤 빈 이미지 1장으로 실측하고, 참이면 공백 제거 후 길이로 판정하도록 개정한다. id=odr-intake-m1-ocr-empty-formfeed |
| 2026-09-15 | LOW | .claude/plans/ops-doc-reconcile-intake-m1.plan.md | **G27 이 체커 단독 복사 하네스를 하나만 적었다 (L2 R2 architect LOW).** `ops/reconcile/_harness/m0.sh:173` · `:239` · `ops/reconcile/_harness/m1.sh:187` · `ops/reconcile/_harness/m5.sh:480` 도 `check-statements.mjs` 를 단독 복사한다. D17(체커에 import 를 더하지 않는다)의 결론을 강화하는 사실이다. 판정: 수용 — 개정판 G27 문면 정정. id=odr-intake-m1-g27-undercounts-harnesses |
| 2026-09-15 | LOW | .claude/plans/ops-doc-reconcile-intake-m1.plan.md | **`censusCells` 는 중복 문서 id 를 안 문다 (L2 R2 architect LOW).** `ops/statements/check-statements.mjs:1325` 가 파일 목록을 그대로 `docs` 로 돌려준다. `--check` 에서는 `readCells` 가 먼저 막지만 `--census` 단독 재도출(Task 8)에서는 이중 계수가 조용히 난다. 판정: 수용 — 두 리더가 공유하는 파일 목록 수집에서 충돌을 거부한다. id=odr-intake-m1-census-dup-id |
| 2026-09-15 | LOW | .claude/plans/ops-doc-reconcile-intake-m1.plan.md | **자유 텍스트 실명 · 이미지 안 이름·얼굴·서명 · `pii_names` 사람 목록 의존 (L2 R2 security LOW 2건).** 판정: 기각 — 새 결함이 아니라 계획서 Risks 와 Acceptance `(미검증)` 에 이미 명시한 수용 잔여이고, 리뷰어도 신규 누출 경로를 만들지 못했다. id=odr-intake-m1-accepted-pii-residue |
| 2026-09-15 | HIGH | .claude/plans/ops-doc-reconcile-intake-m1.plan.md | **사용자 결정으로 `divergent` receipt 를 봉인했다 — 위 id=odr-intake-m1-round-cap-no-receipt 의 후속.** 지시: 「divergent로 receipt를 작성해줘. 지적사항은 implement에서 고칠게」. L2 divergent · L3 converged 를 proof 에 그대로 적으면 `receipt/schema.js` 가 그 모양을 single-pass 완화 형태로 판별해 일어나지 않은 우회 표지를 요구하므로, review triple 없이 `MCCP_SKIP_INTENT_GATE` 감사 사유와 `--codex-verdict divergent` 로 썼다. 봉인값: `codex_verdict=divergent` · `intent_gate_verdict=incomplete` · `intent_gate_force_override=true` · plan_hash `sha256:d33f14cc…`. `validate --command mccp:prp-implement` ok. 이 파일 위 R2 지적 8건(HIGH 2 · MEDIUM 4 · LOW 2, 기각 1 제외)은 **구현 단계에서 고친다** — 인수처 `/mccp:prp-implement .claude/plans/ops-doc-reconcile-intake-m1.plan.md`. 계획서 본문은 receipt 해시 때문에 고치지 않고 편차는 notes 에 적는다. id=odr-intake-m1-divergent-receipt-by-user |
| 2026-09-16 | HIGH | .claude/plans/ops-doc-reconcile-intake-m1.plan.md | **`/mccp:pr` PR-Codex 라운드 상한 3/3 도달 — receipt 없음 · PR 미발행.** `review-rounds status --gate mccp-pr-codex --decision ops-doc-reconcile-intake-m1` → `rounds_so_far:3` `cap:3` `mode:enforce`. 세 라운드 전부 `codex_verdict=needs-attention`(approving 아님)이라 finalize ship 게이트(exit 12)에 걸렸고, CLAUDE.md 한시 규칙대로 `/mccp:pr` 은 cap 도달을 `divergent` 로 매핑하지 않고 HALT 했다 — receipt 를 쓰지 않았고 `MCCP_FORCE_PR_WITHOUT_CODEX_CONVERGENCE` 도 걸지 않았다. R1·R2·R3 지적은 전건 흡수했으나 **R3 흡수분은 Codex 재검증을 못 받았다**(예산 소진). 재검증 경로: `MCCP_GATE_ROUND_CAP` 상향 또는 새 축 브랜치에서 새 slug 로 재발주. 인수처: ops-doc-reconcile 우산 PR 을 여는 다음 창 · id=odr-umbrella-pr-round-cap-no-receipt |
| 2026-09-16 | MEDIUM | ops/intake/extract-intake.mjs | **가명 이름공간이 보존 시트명과 부딪친다 (PR-Codex R3 · conf 1 · 재현) — 흡수했으나 Codex 재검증 없음.** 원본에 실제로 `sheet-1` 이라는 시트가 있으면 생성 가명 `sheet-1` 과 겹쳐 서로 다른 두 원본 시트가 하나로 접힌다(재현: `alice@example.com!A1` + `sheet-1!A2`). 좌표가 안 겹쳐 앵커 **수** 대조는 통과한다. 흡수: 보존 시트명 사전 예약 + 시트 일대일 대조 가드 추가(`extract-intake.mjs` `maskDoc`). 반사실 2방향 실측 — 예약 제거 시 `가림이 시트를 접었다 — 입력 5 → 출력 4` 로 red, 일대일 가드까지 제거하면 `mask_probe ok` 로 조용히 통과(R3 의 「selftest 가 결함을 안고도 통과한다」 재현). 잔여: 이 흡수를 Codex 가 못 봤다 · id=odr-intake-sheet-alias-namespace |
| 2026-09-16 | MEDIUM | .claude/plans/ops-doc-reconcile-intake-m1.gates.sh | **`#3` 의 `cells --selftest` 한 줄만 `OPS_SOURCES_ROOT` 를 안 넘겨 원래 붉다 — 내 변경과 무관한 선행 결함.** `gates.sh:124` 는 `node ops/cells/extract-cells.mjs --selftest` 로 부르는데 같은 파일 `:121~123` 은 전부 `OPS_SOURCES_ROOT="$SRC"` 를 붙인다. 실측: env 를 주면 같은 명령이 `selftest_fixtures 20 · selftest ok` rc 0, 안 주면 `OPS_INV_SELFTEST_NO_SOURCE` rc 1. 판정 하네스는 `gates-supp.sh` 라 마일스톤 종결에는 영향이 없었다. 인수처: intake 축을 다시 여는 창 · id=odr-intake-gate3-missing-sources-env |
| 2026-09-16 | LOW | .claude/plans/ops-doc-reconcile-intake-m1.gates-supp.sh | **`#S1` scope_outside 가 origin/main 머지로 넓어졌다 — baseline 과 동일하므로 퇴행이 아니다.** 머지 `662081b` 뒤 `changed=261 outside=233`, 범위 밖으로 지목된 것은 전부 `.claude/PRPs/plans/archived/drug-diag-api-*`(main 이 들여온 다른 축 아카이브)다. 내 수정 전/후 카운터가 글자까지 같음을 실측으로 대조했다(`repro_regressed=0` · `golden_outside=0` · `intake_axis=1` 동일). `#S1` 은 마일스톤 창을 BASE 로 잡는데 우산 브랜치가 main 을 들이면 그 창이 남의 축을 문다. 인수처: 우산 PR 창의 scope 술어 · id=odr-s1-scope-widened-by-main-merge |
| 2026-09-16 | LOW | (mccp) scripts/lib/pr-phase-helpers/codex-runner.js | **`lock_exit_ok=false` · `mutations 0` 이 3라운드 중 2회 재발 — 리뷰 중 도구 호출이 없는데도 났다.** R1 과 R3 에서 발생, R2 는 `true`. 앞선 관측([[mccp-pr-decision-slug-fallback]] 재발 1~3)은 「리뷰 도중 guard 가 거부한 도구 호출」과 동시 발생을 인과 후보로 적었는데, 이번 R1·R3 은 배경 실행 중 어떤 도구도 부르지 않았다 — 그 가설이 약해졌다. 잠금은 두 번 다 이미 해제돼 있었다(`pr-phase-lock.js read` → `active:false`). 상류 환류 후보(B5) · id=mccp-pr-lock-exit-false-without-tool-calls |
| 2026-09-16 | HIGH | .claude/plans/ops-doc-reconcile-intake-m1.plan.md | **사용자 결정으로 receipt 없이 우산 PR 을 낸다 — 위 id=odr-umbrella-pr-round-cap-no-receipt 의 후속.** 지시: 「backlog에 기록하고 pr 진행」(2026-09-16). CLAUDE.md 한시 규칙의 HALT 상태에서 사용자가 진행을 택했다. **receipt 를 쓰지 않는다** — 마지막 Codex 판정(R3 `needs-attention`)은 `ddbae0d` 를 봤고 그 지적의 흡수는 `e5e52f0` 라, 그 판정으로 receipt 를 봉인하면 보지 않은 트리를 인증하는 것이 된다. `MCCP_FORCE_PR_WITHOUT_CODEX_CONVERGENCE` 도 걸지 않는다(그 경로 역시 receipt 를 쓴다). 대신 PR 본문 「게이트 상태」 절에 3라운드 판정·흡수·미재검증분·history-leak scan-error 를 공시한다 — 선례 #80 · #81 · #85 · #86 과 같은 형태다. 인수처: 이 PR 의 리뷰어 · id=odr-umbrella-pr-shipped-without-receipt |
| 2026-09-16 | MEDIUM | .claude/PRPs/plans/archived/ai-insight-report-m7.gates.mjs · .claude/PRPs/plans/archived/insuniverse-docs-60-history-deprecated-m9c.gates.mjs | **60-history-deprecated·ai-insight-report 아카이브가 옮긴 하네스의 입력 경로 상수와 `ROOT` 계산을 끊었다 — 아카이브 자리에서 기록된 검사를 재현하지 못한다 (PR-Codex advisory R1, raw verdict `needs-attention`, thread `01a0a86f-30e6-7ac1-908c-14361dfdb802`).** 실측 반사실: `ai-insight-report-m7.gates.mjs --only 2` 가 원래 자리 `.claude/plans/` 에서는 `#2 PASS — 동결본 정합`, 아카이브 자리에서는 `#2 FAIL — 동결본 부재: .claude/plans/ai-insight-report-m7.contract.json`. 두 갈래다. 1) 입력 경로 상수가 옛 `.claude/plans/`·`.claude/prds/` 를 가리킨다. 2) `ai-insight-report-m1·m2·m3·m5·m6·m7.gates.mjs` 여섯이 `const ROOT = path.resolve(HERE, "..", "..")` 로 루트를 잡는데, `.claude/plans/` 에서는 저장소 루트지만 `.claude/PRPs/plans/archived/` 에서는 `.claude/PRPs` 가 된다. **`ROOT` 만 고쳐도 관측 가능한 이득이 없다** — 경로 상수가 여전히 지운 자리를 가리켜 `#2` 는 그대로 붉다(실측). 일괄 치환도 안 된다: 참조 대상 일부(`.claude/plans/fixtures/**` · `ai-insight-report-m2.response-fixture.json` · `m5.report-fixture.json`)는 런타임 픽스처라 **안 옮겨졌다**. 선례 아카이브 20-foundation-access·30-contracts-limits·50-domain·70-viewer 도 같은 상태로 머지됐다(`id=50-archive-harness-paths-stale`). 이 창에서는 **모듈 로드 불가만** 고쳤다(아래 별건, M8 `id=20m7-archived-harness-import-broken` 선례와 같은 자리). 재현이 필요하면 아카이브 전 커밋 `4ef7abe` 에서 돌린다 `(미검증)`. 인수처: 아카이브 하네스 재실행이 필요해지는 창 · id=60-archive-harness-paths-stale |
| 2026-09-16 | HIGH | .claude/plans/samsung-account-intake-m1.plan.md | **4판 수정 4자리가 어떤 리뷰어에게도 읽히지 않았다 (R3 미발화).** 라운드 원장 `mccp-plan-codex__samsung-account-intake` 가 2/1 이고 캡을 1 로 pin 한 축은 단일패스가 아니라 `MCCP_CODEX_DISABLED=1`(Codex 사용 한도 19:39 까지) 이라 `emit-workflow-args` 가 exit 12 다. R2 이후 들어간 자가 1패스 흡수 4건 — (1) `#1` 이 `N failed` 부재를 판독 실패로 읽어 착수 전 붉음이 사라진 날 통과 불가, (2) R2 security H1 의 뿌리가 감시 목록이 아니라 **기준선 이전 구간**이라 `merge-base` 대비 신규 파일 축을 신설(관측 28 반사실: 빈 xlsx 스테이징 시 rc 1), (3) 미복원 4종이 `#10` 반사실 밖이라 `COUNTERFACTUAL.mustFail` 을 3→6 으로, (4) PRD 자신이 §Files to Change 밖이라 종결 시 `complete` 전이 커밋이 `#8` 에 걸림 — 전부 저자 판정이며 패널 반증을 받지 않았다. 인수처: 이 계획서를 다시 게이트에 넣는 창(Codex 한도 해제 후 `-m1` 슬러그 원장 0/1 이면 1라운드가 열린다) · id=samsung-m1-r3-unreviewed |
| 2026-09-16 | MEDIUM | .claude/plans/samsung-account-intake-m1.plan.md | **만료값의 실제 반환을 어느 게이트도 보지 않는다 (R1 L3 F2 DEFERRED 의 계승).** `getAgencySubscribe` 가 `sub_disable_completed_at` 을 정말로 실어 돌려주는지는 jest 로 볼 수 없다 — `jest.config.js` 의 `^drizzle/.*$` 매핑이 저장소 질의를 한 줄도 실행시키지 않는다. `#6`(tsc 타입) · `#7`(select 객체 리터럴 + SQL 별칭 집합) 두 겹이 대신 서고 계획서 §Acceptance 가 그 자리를 `(미검증)` 으로 공시한다. 라이브 대조는 격리 MySQL 이 필요하다. 인수처: 마일스톤 5 · id=samsung-m1-live-expiry-unverified |
| 2026-09-16 | MEDIUM | .claude/plans/samsung-account-intake-m1.plan.md | **기준선 파일의 수치 변조를 게이트가 막지 않는다 (R2 security M 의 잔여 — 표면만 제거).** 3판이 작업트리 스냅샷(경로·상태·해시)을 기준선에서 걷어내 *해시 면제로 범위 검사를 끄는* 공격면은 소멸했으나, `baseline.json` 의 `failing_suites`·`tests_failed`·`scope_suites` 자체를 늘려 적으면 `#2`·`#5` 가 그만큼 무뎌진다. 로컬 파일이라 서명이나 외부 봉인 없이는 못 막고, 그 축은 이 창의 결함과 무관하다. 계획서 §NOT Building 이 이름으로 공시하고 `#11` 이 실행마다 그 이름을 낸다 — 기준선 변경은 PR diff 에 그대로 드러난다. 인수처: 외부 앵커(보호 ref·CI)가 생기는 창 · id=samsung-m1-baseline-tamper |
| 2026-09-16 | LOW | .claude/plans/samsung-account-intake-m1.plan.md | **`M1_PRD_EXPECT=complete` 로 PRD 되돌림 가드를 끌 수 있다 (R2 invariant L — REJECTED).** 기각 사유: `complete` 는 마일스톤 종결 시점의 정당한 기대값이고, *종결이 실제로 일어났는가* 의 판정은 `#8` 이 아니라 milestone-close 게이트 소관이다. 허용값은 2종으로 닫혀 있고(`pending` 은 rc 1 로 실측) 덮어쓰면 stderr 에 `[warn]` 이 남는다. 재론하려면 종결 판정을 이 게이트로 끌어와야 하는데 그것은 범위 확대다 · id=samsung-m1-prd-expect-override |
| 2026-09-16 | MEDIUM | .claude/plans/samsung-account-intake-m1.plan.md | **게이트 receipt 파일 자신이 §Files to Change 밖이다 (receipt 봉인 뒤 발견 — 계획서는 `plan_hash` 결박이라 이 창에서 못 고친다).** `.claude/receipts/mccp-plan-codex/samsung-account-intake.json` 이 이 봉인으로 새로 생겼다. `#8` 은 부모의 미추적 파일을 보지 않으므로 지금은 조용하지만, 이 저장소에는 receipt 를 커밋하는 선례가 있다(`7cdc046` chore(evidence)). 커밋하는 순간 `#8 FAIL: 표 밖 변경` 이 난다. 구현 창의 대처는 두 가지 — receipt 를 커밋하지 않거나, `M1_PRD_EXPECT` 같은 우회가 아니라 새 슬러그 계획서에서 표에 행을 세우는 것이다 · id=samsung-m1-receipt-path-out-of-table |
| 2026-09-16 | MEDIUM | .claude/plans/samsung-account-intake-m1.plan.md | seat **상한** 판정이 저장소 전역에 0건 — `assertSeatLowerBound`·`reconcileSubscribeUploadTransitions` 둘 다 `after < seat` 하한만 본다. 구독 되살리기(`restoreSubscribe`)가 계약 정원을 넘길 수 있다. M1 은 호출자가 0이라 도달 불가고 기존 subscribe/upload 되살리기 경로도 같은 구멍을 갖는다 — 되살리기를 관리자 UI 에 붙이는 마일스톤 착수 전에 해소. 출처: implement-codex security-reviewer Q4 (2026-09-16) — REJECTED 2026-09-18(사용자 판정, M5 notes §사람에게 넘기는 것 3 의 회신): **상한 규칙은 없다 — 하한만 있다.** 덧붙여 사용자가 하한 동작을 확인해 줬다 — 「하한이 있지만 최고 관리자가 시도할 때는 하한이라고 노티를 알리고 강제로 진행할 수 있어」. 그것이 현행 `assertSeatLowerBound` 그대로다(corp 는 `SEAT_BELOW_CONTRACT` 즉시 차단 · 내부 관리자는 `SEAT_BELOW_CONTRACT_WARN` + `{current, after, seat}` 반환 후 `force=true` 재요청으로 강행, M5 라이브에서 실측). 이 축은 닫는다 · id=samsung-m1-seat-upper-bound |
| 2026-09-16 | MEDIUM | .claude/plans/samsung-account-intake-m1.plan.md | **`getAgencySubscribe().subscribe.subId` 가 `sql<number>` 로 선언됐지만 leftJoin 이라 null 이 온다 — 두 번째 소비처가 그 null 을 무가드로 넘긴다 (구현 후 코드 리뷰 · LOW 7 의 파생).** 선언을 `sql<number | null>` 로 정직하게 고치자 `fc-agency.service.ts(1533,9): error TS2322` 가 떴다 — `processUnsubscription` 이 `fc.subscribe.subId` 를 `unsubscribe({ subId: number })` 로 그대로 넘긴다. 선행 `unsubscribeValidate` 는 `memIsResigned` 와 `subState === '해지'` 만 보고 subId null 은 안 본다 — 구독 이력이 없는 회원은 검증을 통과해 `where sub_id = null` 0행 UPDATE 를 돌리고 성공으로 보고된다. M1 이 `resign` 의 `useAt=0` 경로에서 없앤 것과 **같은 결함 유형**이다. 이 창에서 안 고친 이유: (1) 그 엔드포인트는 §Files to Change 의 의도 밖이고 이 창의 spec·게이트 어디도 안 본다, (2) 고치려면 `handleFailedUnsubscriptions` 가 `results` 와 `FCList` 를 **인덱스로** 짝지으므로 필터한 배열을 양쪽에 함께 넘기는 수술이 필요하다. 대신 선언은 되돌리고 `resign` 안에서만 지역 주석으로 좁혀 null 가드를 살렸다(양쪽에 사유 주석). 인수처: 기업FC 구독해지 경로를 여는 창 — RESOLVED 2026-09-18(사용자 지시 「의도대로 동작하지 않는 기능을 수정」, 커밋 참조 아래): 뿌리인 선언을 `getAgencySubscribe` 에서 `sql<number \| null>` 로 정정하고 두 번째 소비처 `processUnsubscription` 에 null 가드를 넣었다. 우려했던 `handleFailedUnsubscriptions` 인덱스 수술은 **필요 없었다** — 배열을 필터하지 않고 worker 안에서 reject 하면 `settleInBatches` 가 그 자리를 rejected 로 남겨 인덱스가 보존된다. worker 를 `async` 로 둔 것이 조건이다(동기 throw 는 `.map()` 단계에서 배치 전체를 터뜨린다). 반사실 2종: 가드를 뺀 사본에서 `fc-agency.service.ts(1544,9) error TS2322` · 수정 전 코드에서 신규 it 이 `resolved instead of rejected` 로 붉음. 회귀: jest 10스위트 88건 초록 · 서버 tsc 에러 19건(기준선과 동일, fc·agency 범위 0건) · 프런트는 `.then(() => true as const)` 로 본문을 안 읽어 무영향 · 실패는 기존 `alert(message)` 분기로 운영자에게 뜬다. **로컬 리뷰 2종 수용으로 보강(커밋 `de74fef2`)** — (1) subId null 판정을 `unsubscribeValidate` 로 올려 기존 두 검사와 실패 의미를 「쓰기 0건」으로 통일했다. 쓰기 중간 판정은 부분 반영 + 재시도 불가라는 새 막다른 길을 열었다(리뷰가 잡은 HIGH). (2) 형제 `handleFailedSubscriptions` 의 reason 추출을 복사해 실패 사유를 운영자에게 전달한다. (3) 시블링 `getAgencyFcForSubscribe` 의 같은 거짓 선언도 정정하고 `isNotExpired` 가 좁히게 했다 — 프로퍼티 접근으로는 좁힘이 안 걸려(실측 TS2322 2건) 지역 const 로 뽑았다. 리뷰어의 「맨 앞에 두면 통과한다」 예측은 실측으로 반박됐다(그 리뷰어는 셸이 없었다). (4) `ResignSkipReason` 을 export 해 소비처의 `Record<string,string>` 붕괴를 막았다. (5) **선언 되돌림을 잡는 검사가 0이었다** — 선언만 되돌려도 tsc 에러 0건이고 런타임 가드는 TS2367 을 내지 않는다(실측). spec 에 타입 대입 한 줄을 세워 TS2322 로 떨어지게 했다 · id=samsung-m1-subid-nullable-lie |
| 2026-09-16 | HIGH | .claude/plans/samsung-account-intake-m2.plan.md | **M2 계획서가 리뷰를 한 번도 받지 못했다 — 예산이 착수 전부터 0 이다.** 라운드 원장은 **PRD 슬러그 단위**(`mccp-plan-codex__samsung-account-intake`)라 M1 계획서가 쓴 2라운드가 그대로 남아 있고, cap 은 `single-pass+codex-disabled` 로 1 에 pin 돼 있다. 그래서 `emit-workflow-args` 가 첫 호출부터 exit 12 이고 L2 패널은 발화조차 못 한다(`halt_stage=5.2c-emit`, 예약 4 → `--actual 0` 반환). 앞선 `samsung-m1-r3-unreviewed` 는 *흡수분* 미재검증이지만 이 건은 **계획서 전건 미검증**이라 성질이 다르다 — L1(기계)만 `converged` 이고 저자 자가 1패스(CLAUDE.md §2) 외에 아무 판정도 없다. `MCCP_GATE_ROUND_CAP` 은 pinned cap 에서 읽히지 않으므로 올려도 무효다. 인수처: `-m2` 슬러그(계획서 경로)로 재진입해 원장 0/1 에서 1라운드를 열거나, `MCCP_REVIEW_SINGLE_PASS` 를 해제해 cap 을 복원하는 창 · id=samsung-m2-plan-unreviewed |
| 2026-09-16 | MEDIUM | .claude/plans/samsung-account-intake-m2.plan.md | **리뷰 기록 파일이 PRD 슬러그라 마일스톤마다 앞 판정을 덮어쓴다 (이 창에서 실측).** `plan-review/cli.js record` 가 `.claude/reviews/plan-review-<decision-slug>.md` 에 쓰는데 그 슬러그가 PRD 유도값이라, M2 의 halt 기록(1,280바이트)이 M1 의 L2·L3 판정 기록(15,586바이트)을 통째로 덮었다. 이 창은 `git checkout` 으로 복원하고 M2 기록을 `.claude/notes/samsung-account-intake-m2.md` 로 옮겼다 — 이력(`d818f0d`)에 커밋돼 있었기에 가능했던 복구이며, **커밋 전에 두 번 돌면 앞 기록은 사라진다.** 세션 시작 시 주입되는 open-findings 도 이 파일을 가리키므로 덮이는 순간 그 참조가 빈 문서를 가리킨다. mccp 본체 축이라 이 저장소에서 고치지 않는다(B1) — 대처는 게이트 실행 전 커밋 또는 마일스톤별 슬러그 사용이다. 인수처: 상류 보고 또는 `-mN` 슬러그 운용 규약화 · id=samsung-m2-review-record-overwritten |
| 2026-09-16 | HIGH | .claude/plans/samsung-account-intake-m2.plan.md | **`#3`(서버 tsc 회귀)이 tsc 가 판정을 내지 못한 상태에서도 초록이다 — 구현 창에서 실행해 확인.** §Validation 배선이 `( cd "$S" && npx tsc … ) || true` 다음에 `TR=$?` 라 `TR` 은 항상 0 이고, `gates.mjs tsc-regress` 안의 "rc≠0 인데 진단 0건이면 죽은 것" 가드에 도달할 수가 없다. 존재하지 않는 tsconfig 를 주고 돌리니 기준선 4건 대비 `#3 ok  서버 tsc 에러 파일 0건 전건 baseline 안 · fc·auth 0건` 이 나왔다. `#3` 의 `# 기대:` 주석이 겨냥한 층위 3 을 그 검사 자신이 못 잡는다. 같은 유형으로 `#1`·`#6` 의 `( … ); AR=$?` 는 `set -e` 가 `AR` 대입 전에 스크립트를 죽여 rc 팔이 역시 도달 불가다(다만 조용히 통과하지는 않는다). 이 창에서 못 고친 이유: 계획서 §Validation 은 `plan_hash` 결박이라 고치면 봉인된 plan-codex receipt 가 stale 이 되고 `/mccp:pr` 이 막힌다. 인수처: M3 계획서가 게이트 본문을 상속할 때 `rc=$?` 를 `|| true` 앞으로 옮기고(`cmd; rc=$?` 를 `set +e` 구간에), `#1`·`#6` 은 `if ! ( … ); then rc=1; fi` 형태로 · id=samsung-m2-gate-rc-swallowed |
| 2026-09-16 | MEDIUM | .claude/plans/samsung-account-intake-m2.plan.md | **게이트 11건 전건 초록인 채로 "화면이 확인하지 않고 확인했다고 말하는" 상태를 통과시켰다 — 라이브에서만 드러났다.** `SamsungIntakePage` 초판이 `session` 을 묻지 않고 무조건 "전용 진입이 확인되었습니다" 를 그렸다. 403 인 계정이 URL 을 직접 치면 그 문장이 그대로 떴다. `#9` 는 경로 배선만, `#6` 은 타입만 보므로 둘 다 눈을 감는다. 이 창에서 고쳤다(3상태 렌더). 남는 축: **프런트에 회귀망이 0 이라 이 수정이 되돌아가도 아무 게이트도 안 짖는다** — admin 서브모듈 test 인프라 0(관측 9, UI8 이 도입을 막는다). 인수처: M3 이 업로드 표면을 이 화면에 매달 때 프런트 검증 수단을 함께 결정하는 창 · id=samsung-m2-page-claimed-unverified |
| 2026-09-16 | LOW | .claude/plans/samsung-account-intake-m2.plan.md | **security-reviewer M1 의 전제가 실측으로 반박됐다 — 관리자 프런트 라우터는 하나가 아니라 셋이다.** 리뷰어는 "`page.routes.tsx` 가 세 역할을 같은 `RoleBasedLayout`→`AdminLayout` 으로 태우므로 `HIDDEN_INTERNAL_PATHS` 우회가 역할 무관" 이라고 MEDIUM 을 냈다. `app/router/index.ts` 는 `router`·`salesRouter`·`corpRouter` 를 따로 만들고 `App.tsx` 가 `type` 으로 고른다 — `/samsung-intake` 는 관리자 트리에만 있어 corp 는 react-router 404, sales 는 로그인 화면으로 떨어진다(브라우저 실측). `AdminLayout` 공유는 맞다. 흡수(`ADMIN_HEADER_ONLY_PATHS`)는 유지했다: 차단의 진짜 근거가 판정 자리에서 안 보이기 때문이며 주석은 실측대로 정정했다. 기록 목적 — 같은 전제가 다음 창에서 반복되지 않도록 · id=samsung-m2-admin-router-is-three |
| 2026-09-16 | HIGH | .claude/plans/samsung-account-intake-m2.plan.md | **`#6`(프런트 타입 축)이 아무것도 안 본다 — 프런트의 유일한 기계 검사가 실효 0 이다 (구현 창에서 반사실로 확인).** `insuniverse-admin/tsconfig.json` 은 `{"files": [], "references": [{"path":"./tsconfig.node.json"}]}` 뿐이라 `tsc --noEmit -p tsconfig.json` 이 참조 프로젝트를 빌드하지 않고 빈 `files` 만 본다. `src/pages/SamsungIntake/__probe__.ts` 에 `export const BROKEN: number = "not a number"` 를 넣고 돌리니 **0.2초 rc=0 출력 0행**. `#6 ok … 에러 0건(기준선 0건)` 의 0건은 초록이 아니라 빈 집합이다. 계획서 관측 6("착수 전 전건 초록")이 그 0행을 초록으로 읽은 오독이고, §Acceptance 의 "프런트 tsc 가 실제로 돌았고" 는 실질이 없다. 관측 9 가 프런트 기계 검사를 이것 하나로 특정했으므로 프런트 축 전체가 꺼진 셈이다 — 남는 것은 `#9`(정적 배선)와 `vite build`(번들 해석)뿐. `npm run build` 의 `tsc` 도 같은 config 라 함께 헛돈다. 이 창의 코드는 참조 프로젝트로 직접 돌려 7파일 0건을 확인했다(저장소 전체 162파일 633행이 기존 붉음). 선행 메모리 `admin-front-live-bringup` 이 이 사실을 2026-09-15 에 이미 적어 뒀는데 계획 창이 참조하지 못했다. 인수처: M3 계획서가 프런트 타입 축을 `tsconfig.node.json` 상속 임시 config(`composite:false`)로 갈고, 기준선을 "에러 집합" 으로 동결한 뒤 집합 diff 로 회귀를 본다 · id=samsung-m2-gate6-vacuous |
| 2026-09-16 | MEDIUM | .claude/plans/samsung-account-intake-m2.plan.md | **`resign` 의 `skipped` 를 호출처 3곳이 전건 버려서, 되살리기가 한 건도 반영되지 않아도 운영자는 성공만 본다 (로컬 code-review 수용분 · M2 범위 밖이라 이월).** `fc-agency.service.ts:889` 가 `{ useAt, applied, skipped }` 를 돌려주지만 `agency-fc-admin.controller.ts:459`(`await … ; return;`) · `fc-agency.service.ts:1132`·`1135`(계정 일괄 업로드) 셋 다 값을 받지 않는다. `restoreSubscribe` 가 꺼져 있으면 `useAt=1` 전건이 `reason:'not-requested'` 로 떨어지는데 응답은 200 이고 본문이 비어 있다 — 일괄 업로드로 FC 를 되살린 운영자는 `mem_is_resigned=0` 만 되고 구독은 해지인 채라는 사실을 화면에서 받을 수 없다. **회귀는 아니다**: 종전 코드는 같은 자리에서 `unsubscribe(isUnsubscribed:1)` 로 구독을 해지했으므로 결과 상태가 더 나빴다. 수정을 이 창에서 못 하는 이유는 대상 3파일이 M1 계획서 표에만 있고 M2 표에 없어 `#7` 이 막기 때문이다 — 실측: `fc-agency.service.ts` 에 1바이트만 더해도 `#7 FAIL: 표 밖 변경 1`. 인수처: 마일스톤 5(인테이크 확정 경로)가 `skipped` 의 첫 소비처다 — PARTIALLY-RESOLVED 2026-09-18(같은 창): 셋 중 **컨트롤러 한 자리만** 닫았다 — `agency-fc-admin.controller.ts` 의 `resign` 이 `{useAt, applied, skipped}` 를 응답 본문으로 돌려준다. 클라이언트가 보낸 없는 회원번호(`not-found`)가 빈 본문 200 으로 사라지던 자리다. 남은 두 자리(`fc-agency.service.ts` 계정 일괄 업로드)는 **판정으로 닫는다 — 고치지 않는다**: 그 `memId` 는 직전 `memberByLoginId` 조회에서 나오므로 `not-found` 가 구조적으로 안 나고, `useAt=1` 은 M1 opt-in 봉인상 전건 `not-requested` 라 버려도 잃는 정보가 0 이다(그 봉인 자체는 M1 게이트 `#10` 이 지킨다). 사유를 코드 주석으로 남겼다. **RESOLVED 2026-09-18(로컬 code-review 수용)**: 위 `PARTIALLY-RESOLVED` 기록은 「컨트롤러가 본문을 돌려주니 클라이언트가 받는다」로 읽히지만 **틀렸다** — 이 엔드포인트의 유일한 HTTP 클라이언트 `insuniverse-admin/src/api/agencyFcApi.ts` 의 `resignAgencyFc` 가 `.then(() => true as const)` 로 본문을 버렸고, 네 화면(`Corp`·`Admin` × 목록·상세)이 2xx 면 무조건 "완료되었습니다" 를 띄웠다. 지금 프런트가 본문을 받아 `resignSkipNotice` 가 미반영 회원번호와 사유를 알린다. 사용/중지 자체는 된 사유(`not-requested`·`no-subscription`)는 알리지 않는다 — 서버 `assertResignApplied` 의 allowed 와 같은 규정이라 정상 사용처리를 실패로 오인하지 않는다. 실측(임시 사본 + esbuild, 임포트 4줄만 스텁): 단정 9건 전건 통과 — `notice(true)=null` · `notice(useAt=1 전건 not-requested)=null` · 부분/전건 미반영 문장 2종 · `isAgencyFcSuccess` 4종. admin `tsc --noEmit` rc=0 · id=samsung-m1-resign-skipped-discarded |
| 2026-09-16 | LOW | .claude/plans/samsung-account-intake-m2.plan.md | **`resign` 의 `skipped` 순서가 `dto.ids` 순서와 어긋난다 (로컬 code-review 수용분 · M2 범위 밖이라 이월).** `fc-agency.service.ts:877-880` 이 `not-found` 를 루프가 끝난 **뒤** 에 append 하므로, 조회된 회원의 사유와 미조회 id 가 뒤섞이지 않고 뒤쪽에 몰린다. 게다가 앞 구간의 순서는 `getAgencySubscribe` 의 leftJoin 결과 순서라 저장소 주석(`agency-fc.repository.ts:533`)이 스스로 "순서를 보장하지 않는다"고 적은 그 순서다. 소비처가 표를 그리면 입력 행 순서와 어긋난다. 고치는 값싼 방법은 `FCList` 가 아니라 `new Set(dto.ids)` 를 돌며 memId→row Map 을 조회하는 것이고, 그러면 루프 뒤 `seen` 보정 블록(4행)이 통째로 사라진다. 이 창에서 못 하는 이유는 위 `samsung-m1-resign-skipped-discarded` 와 같다(`#7` 표 밖). 인수처: 마일스톤 5 가 `skipped` 를 소비할 때 함께 — REJECTED 2026-09-18(같은 창): 전제가 사라졌다. 유일한 소비처인 M5 인테이크 확정은 `resign({ids:[memId]})` **단건**으로 부르고(`samsung-intake.service.ts` 두 자리) 결과를 행 단위 `assertResignApplied` 로 즉시 판정한다 — 배열 순서를 읽는 소비처가 0곳이라 `not-found` 가 뒤에 몰려도 관측 가능한 차이가 없다. 표를 그리는 소비처가 생기면 재론한다 · id=samsung-m1-resign-skipped-order |
| 2026-09-17 | MEDIUM | .claude/plans/samsung-account-intake-m3.plan.md | **서버 요청 로그가 JSON 본문을 평문 그대로 싣는다 — 로그인 비밀번호도 같은 경로를 탈 것으로 보인다 (M3 계획 창 부수 관측 · 범위 밖).** `apps/api/src/pino.ts` 의 req 직렬화가 `req.body = req.raw.body` 이고 redact 설정이 없다. pino-http 는 요청 시작 시 `log.child({[reqKey]: req})` 로 직렬화하므로(`node_modules/pino-http/logger.js:145`) 인터셉터 단계의 multipart 필드는 안 실리지만, `main.ts` 가 전역으로 먼저 거는 `bodyParser.json` 의 결과는 실린다. Nest 테스트 앱(`LoggerModule` + `pinoHttpOptions` + main.ts 와 같은 `bodyParser.json`)에서 JSON 본문의 `filePassword` 가 로그 행에 그대로 나왔다. **실제 로그인 경로(`POST /admin/auth/signin` 등)는 돌리지 않았다** — 이 행의 "로그인 비밀번호" 부분은 추론이다. M3 는 파일 암호를 multipart 로만 받아 피해 가고 로그 설정은 건드리지 않는다(전역 변경이라 다른 경로의 로그 계약이 함께 바뀐다). 인수처: 서버 로그 정책을 여는 창 — `redact` 경로 추가와 로그인 경로 실측 · id=server-request-log-json-body-plaintext |
| 2026-09-17 | MEDIUM | .claude/plans/samsung-account-intake-m3.plan.md | **(`server-request-log-json-body-plaintext` 후속 — 위 행의 "redact 설정이 없다 · 로그 설정은 건드리지 않는다" 는 M3 구현으로 일부 낡았다.)** M3 계획 fan-out F4 흡수로 `pino.ts` 에 `redact: ['request.body.filePassword']` **한 경로만** 들어갔다. `samsung-intake-parse.spec.ts` 의 `log:` it 3건이 그 경로가 가려지고 다른 필드는 실린다는 것을 실제 `pinoHttpOptions` 로 보고, redact 를 뺀 사본에서 JSON it 이 붉음을 구현 창에서 확인했다. **남은 것은 그대로다** — 다른 필드 이름의 JSON 본문(로그인 비밀번호 추정 포함)은 평문으로 실리고, 실제 로그인 경로는 여전히 미실측이다. 인수처 불변 · id=server-request-log-json-body-plaintext |
| 2026-09-17 | MEDIUM | .claude/plans/samsung-account-intake-m3.plan.md | **서버 요청 로그가 `cookie` 헤더를 통째로 싣는다 — 관리자 세션 JWT(`_aaT`)가 로그 행마다 평문으로 남는다 (M3 구현 창 라이브 부수 관측 · 범위 밖).** 격리 기동(부팅된 Nest · `pinoHttpOptions` 그대로)에서 `POST /admin/samsung-intake/parse` 요청 로그의 `request.headers.cookie` 에 서명된 `_aaT` 값이 그대로 나왔다. `pino.ts` 의 req 직렬화는 `res.headers` 만 지우고 req 헤더는 건드리지 않는다. 로그를 읽을 수 있는 사람은 만료 전까지 그 관리자로 행세할 수 있다. 운영 로그 수집처·보존 기간은 확인하지 않았다. `filePassword` redact 와 같은 한 줄(`request.headers.cookie`)로 막히지만 전역 로그 계약 변경이라 M3 에 넣지 않았다. 인수처: 서버 로그 정책을 여는 창 — `server-request-log-json-body-plaintext` 와 같은 축 · id=server-request-log-cookie-header |
| 2026-09-18 | MEDIUM | .claude/plans/samsung-account-intake-m5.plan.md | **동결 게이트가 브랜치 끝에서 돌지 않는다 — 병합 후 회귀망이 0 이다 (브랜치 전체 로컬 code-review 2026-09-18 실측).** M5 §Validation 을 지금 그대로 실행하면 `#1 FAIL: 서버 HEAD 가 e411a84b877c276f736244bafece382ffa42f6eb 이 아니다` 로 rc=1 이다 — `SRV_BASE`/`ADM_BASE` 가 M5 **착수 전** 서브모듈 포인터로 고정돼 있고 구현이 그 위에 쌓였기 때문이다. M1~M4 게이트도 같은 성질이다. 설계상 그런 것(기준선 동결)이지만 결과는 **PR 을 받는 쪽이 "게이트 11/11 초록" 을 재현할 수 없다**는 것이고, 병합 뒤 누가 이 코드를 되돌려도 짖는 검사가 없다(프런트는 backlog `samsung-m2-gate6-vacuous` 로 애초에 0). 지금 재현 가능한 것은 게이트가 아니라 spec 뿐이다 — `npx jest --testPathPattern 'samsung-intake\|fc-agency-resign-subscribe'` 7스위트 81건, 서버 `tsc` 창 안 0건(전체 19건은 기존 spec). notes m5 §구현 완주 기록이 **재기준한 기준선 사본**(`srv=4deea121 · adm=f19710ca · base=54e39f9`)으로 완주를 기록했다 — 탈출구는 있으나 원본 `baseline.json` 은 착수 시점 값이라 저장소에 커밋된 블록 그대로는 여전히 돌지 않는다. 대처 후보 둘: (1) PR 본문에 "게이트는 착수 시점 포인터에 동결 — 재현 불가" 를 공시하고 spec/tsc 를 재현 수단으로 지정, (2) 후속 PRD 가 포인터 비의존 회귀 게이트(spec 이름·단정 계수 축만)를 따로 세운다. 인수처: `samsung-account-intake-hardening` PRD 또는 이 브랜치의 PR 창 · id=samsung-m5-frozen-gates-unrunnable |
| 2026-09-18 | MEDIUM | .claude/plans/samsung-account-intake-m5.plan.md | **대량 확정 1건이 로드밸런서 유휴 한도를 넘는다 — 운용 규칙이 없으면 실패 행 회수 경로(UI5)를 잃는다 (notes m5 §라이브 실측의 운용 귀결).** 실측 **7,786행 삭제 확정 204.3초**(26ms/행 · 응답 870KB). 계획서 관측 14 의 `requestTimeout` 30분 안이지만 로드밸런서 유휴 한도는 통상 60초다. 끊겨도 서버는 끝까지 반영하고 요약 알림이 남으며 같은 파일로 다시 미리보기하면 반영분이 변경 없음으로 빠지므로(DD4) **데이터 손상은 아니다** — 잃는 것은 화면의 결과 표와 실패분 엑셀, 즉 UI5 회수 경로다. §NOT Building 이 "비동기 처리 · 진행률 표시"(UI10)와 "대량 확정 소요의 게이트화 · 배포 제한시간 조정" 을 범위 밖으로 공시했고 notes 가 "후속 PRD 의 비동기 처리 판단 재료" 로 남겼다 — 이 행은 **그 사이 기간의 운용 규칙**이 비어 있다는 지적이다. 대처 후보: 회차당 행 수 상한을 운영 절차로 정하거나(예: 1,000행 = 약 26초), 실제 배포 앞단의 유휴 한도를 먼저 잰다. 인수처: 운영 투입 전 절차 합의 · 비동기 처리는 후속 PRD · id=samsung-m5-bulk-confirm-lb-idle |
| 2026-09-18 | MEDIUM | insuniverse-server/apps/api/src/modules/subscribe/subscribe/subscribe.repository.ts | **구독 갱신의 진짜 싱크가 영향 행수를 보지 않는다 — 이번 창은 그 싱크에 닿는 두 호출처만 막았다.** `update(tx, type, dto)` 가 `.where(eq(tnSubscribe.subId, dto.subId))` 로 UPDATE 를 돌리고 결과를 읽지 않는다. 그래서 대상 행이 0건이어도 예외가 없다. `subscribe.service.ts` 의 `prompt` 는 `dto.subId!` 로 비단언까지 한다. 여기 한 줄(`rowsAffected === 0` 이면 throw)이 이 결함 계열 전체의 뿌리 수정이지만 **모든 구독 경로의 실패 의미가 함께 바뀐다** — 이번 창이 합의한 「침묵 실패 2건」 밖이다. 출처: 로컬 code-review out_of_scope O1(2026-09-18) · id=subscribe-update-ignores-affected-rows |
| 2026-09-18 | LOW | insuniverse-server/apps/api/src/modules/fc/agency/agency-fc.repository.ts | **`buildSubscribeStateQuery` 의 `tc_common` 조인이 INNER 라 「구독 이력 없음」 판정이 거짓일 수 있다 (추측 — DB 미확인).** `MAX(sub_id)` 로 고른 최신 구독 행의 `sub_state` cmn_id 가 `tc_common` 에 없으면 그 회원은 하위 구독으로 폴백하지 않고 서브쿼리에서 통째로 사라져 `subId = null` 로 읽힌다. `SUB001~003` 이 `tc_common` 에 전건 있으면 도달 불가다. **확인 방법**: 운영 DB 에서 `tn_subscribe.sub_state` distinct 와 `tc_common.cmn_id` 를 대조한다(SELECT 만). 도달하더라도 이번 수정 덕에 조용한 0행 UPDATE 대신 시끄러운 400 이므로 방향은 옳다. **PARTIALLY-RESOLVED 2026-09-18(로컬 code-review 수용)**: DB 확인은 그대로 남았으나 **메시지가 사유를 하나로 단정하던 것**은 고쳤다 — `구독 이력 없는 고객이 존재` → `구독 이력이 없거나 구독상태를 읽을 수 없는 고객이 존재`(`unsubscribeValidate`), `구독 이력 없음` → `구독 이력이 없거나 구독상태를 읽을 수 없음`(`processUnsubscription`). 확인 SQL 을 그 자리 주석에 박았다. 남은 것은 실제 DB 대조 하나다 · id=subscribe-state-inner-join-fallback |
| 2026-09-18 | MEDIUM | insuniverse-server/apps/api/src/modules/fc/agency/fc-agency.service.ts | **`processIndividualSubscription` 이 leftJoin 결과에 비단언 8개를 연달아 쓴다 — `product` 가 null 인 경로가 실재한다.** `agency!.agcCorporateCode!` · `product!.prdId!` 등이 한 블록에 몰려 있고, `subscribeValidate` 를 건너뛰는 경로(`requestType == 회원등록엑셀`)에서는 `product` 가 null 인 채 `product!.prdId!` 에 닿아 TypeError 가 난다. 이번 창이 고친 subId 축과는 다른 칸이고 **기존 결함**이다. 이 파일의 지배적 관용구가 `!` 로 null 을 지우는 것이라 한 칸만 고치면 나머지 7개와 어긋난다. 출처: 로컬 code-review out_of_scope O1(type-design, 2026-09-18) · id=individual-subscription-nonnull-assertions |
| 2026-09-18 | LOW | insuniverse-server/apps/api/src/modules/fc/agency/fc-agency.service.ts | **`memIsResigned` 가 nullable `tinyint` 인데 두 검증이 진위값으로 읽어 NULL 을 「미탈퇴」로 본다.** `drizzle/schema.ts` 의 그 칸에 `.notNull()` 이 없고 `subscribeValidate`·`unsubscribeValidate` 가 `FCList.some((fc) => fc.member.memIsResigned)` 형태로 본다. 실제 데이터에 NULL 이 있는지는 **미확인**이다 — 있으면 탈퇴 회원이 검증을 통과한다. 기존 경로이고 이번 창 밖이다. 출처: 로컬 code-review out_of_scope O3(type-design, 2026-09-18) · id=mem-is-resigned-nullable-read-as-boolean |
| 2026-09-18 | MEDIUM | insuniverse-server | **서버 CI 는 spec 을 타입체크하지 않고 테스트도 돌리지 않는다 — `.spec.ts` 에 둔 타입 단정은 CI 에서 초록으로 지나간다 (로컬 code-review 2026-09-18 실측).** `.github/workflows/api.yml` 의 유일한 검증은 Dockerfile 안 `nest build` 이고(워크플로 주석이 "타입체크 포함" 이라 적는다) 그것은 `apps/api/tsconfig.app.json` 을 쓴다 — `exclude: ["node_modules", "dist", "test", "**/*spec.ts"]`. 워크플로에 jest 스텝은 없다. 게다가 `jest.config.js` 의 ts-jest 는 `isolatedModules: true`(transpile-only)라 `npm test` 도 타입을 안 본다 — 실측: `sql<number | null>` → `sql<number>` 되돌림에서 spec 의 `_subIdMustStayNullable` 대입이 **jest 11/11 초록**인 채 지나갔다. 이번 창은 그 가드 한 개를 `agency-fc.repository.ts`(src)로 옮겨 닫았고(되돌림 시 `nest build` 경로에서 TS2322 확인), **남은 것은 배선이다**: 다른 spec 의 타입 단정도 같은 사각지대에 있고, 루트 `tsconfig.json` 기준 spec 에러 19건(4파일)이 기준선으로 붉어 CI 에 `tsc -p tsconfig.json` 을 그냥 붙일 수 없다. 인수처: 서버 CI 를 여는 창 · id=server-ci-typecheck-excludes-spec |
| 2026-09-21 | MEDIUM | .claude/plans/samsung-account-intake-colmap.plan.md | **가림 반사실 `#5` 가 DD4 세 사유(a 필드 · b 열 이름 별칭 · c 값 모양)를 따로 판별하지 못한다 (계획 게이트 L2 test, 계획서 receipt 봉인 뒤 이월).** 사본이 `const hidden = …;` 전체를 `false` 로 바꾸므로, 한 사유를 떨어뜨린 구현도 가림 it 의 fixture 열이 다른 사유로 가려지면 `#4`·`#5` 가 초록이다. **구현 창 흡수 지시**: layout spec 의 가림 it 을 사유별 열 셋(비밀번호로 고른 열 · 열 이름이 비밀번호 별칭인 열 · 열 이름 없이 값만 비밀번호 모양인 열)으로 나누고 각 열의 `hiddenReason` 을 단정한다. 계획서는 `plan_hash` 결박이라 고치지 않는다 — 근거 `.claude/reviews/plan-review-samsung-account-intake-colmap.md` test 행 |
| 2026-09-21 | MEDIUM | .claude/plans/samsung-account-intake-colmap.plan.md | **`layout` 필드가 있기만 하면 서버가 헤더 의심(E0822 의 헤더 축)을 끈다 — 사람이 확인했다는 증거가 아니라 클라이언트 주장이다 (계획 게이트 L2 invariant).** DD5 의 의도된 교환이다(인가가 아니라 실수 방지 필드 — M5 DD10 과 같은 성격). 시트 이름 의도 대조는 남는다. **판정: 수용(DD5)** — 다만 화면이 정본이 아닌 파일에 확정 전 배치를 보내지 않는다는 것은 `#6` 이 보지 않는다. 구현 창에서 `IntakeUploadForm` 이 `confirmedLayout` 이 있을 때만 preview 로 넘어가는 배선을 정적 계약에 한 줄 더할지 판단한다 — 근거 같은 기록 invariant 행 |
| 2026-09-21 | MEDIUM | .claude/plans/samsung-account-intake-rowfix.plan.md | **계획서 Risks 1행의 "수정이 달라도 M5 괴리 판정이 `changed` 로 막는다" 는 비밀번호·연락처 수정에서 거짓이다 (계획 게이트 L2 test·invariant 두 렌즈 일치).** `planConfirm` 의 `unchanged` 는 로그인아이디·판정만 본다(`insuniverse-server/apps/api/src/modules/fc/agency/samsung-intake-confirm.ts#L109`) — 확정이 미리보기와 다른 비밀번호·연락처를 보내도 판정이 같으면(`create`) 그대로 반영된다. 지금은 화면 잠금(`editsPending`·`editorOpen`, `#6` 정적 검사)만 막는다. **구현 창 흡수 지시**: 선택 튜플에 그 행 수정의 요약(예: 고친 칸 이름 + 값의 해시 — 평문 비밀번호를 싣지 않는 형태)을 한 칸 더해 서버 `planConfirm` 이 수정이 다르면 `changed` 로 가르게 하고, confirm 에 미리보기와 다른 `rowEdits` 를 보내는 endpoint it 을 더한다. 계획서는 `plan_hash` 결박이라 고치지 않는다 — 근거 `.claude/reviews/plan-review-samsung-account-intake-rowfix.md` test·invariant 행 |
| 2026-09-21 | MEDIUM | .claude/plans/samsung-account-intake-rowfix.plan.md | **`#1` 이 기준선 파일의 존재만으로 재동결을 건너뛰어, colmap 커밋 전에 뜬 낡은 기준선이 `#2`·`#3`·`#7` 을 넓힌다 (계획 게이트 L2 invariant).** colmap 게이트도 같은 모양이다. **구현 창 흡수 지시**: rowfix Task 1 에서 기준선을 뜨기 전에 colmap 서브모듈 커밋이 `srv_base`·`adm_base` 의 조상인지 확인하고(`git merge-base --is-ancestor`), 그 결과를 notes 에 남긴다. 게이트 스크립트는 계획 창 산출물이라 구현 창이 고칠 수 있다(§Files to Change `UPDATE`) — 근거 같은 기록 invariant 행 |


## m9c carry 판정

이 창(Task 4)이 앞 창 `m8` 이월 48건을 판정한 원장 `record: "carry"` 의 되적기다. 정본은 원장이고 이 절은 사람이 읽는 사본이다 — `#5` 가 양방향으로 문다.

- `60m8-absorb-counterfactual-arm-unprobed` → **inherited** — 반사실 팔 미실행은 저작 시점 음성 프로브 미실행 축과 같은 자리다
- `60m8-backlog-newrows-counted-2dot` → **inherited** — 신설 행 유도 기준점이 창 안 앵커라는 같은 축 — m8 하네스는 UI20 로 동결이라 이 창이 못 고친다
- `60m8-base-assert-bound-to-moving-ref` → **inherited** — BASE·origin/main 이동 참조에 증거 유효기간이 묶이는 같은 축. 이 창에서 재발화했다 — m8#scope·#chain·#nopublish·#selfprobe
- `60m8-base-literal-resolved` → **rejected** — 앞 창이 3-dot 으로 이미 해소 선언한 행이다. 이 창에 판정 대상이 없고 근거 좌표는 앞 창 계획서 밖에 없다
- `60m8-brace-slash-ambiguity-unclosable` → **rejected** — INV1(신규 의존 0)이 파서 도입을 막는다 — 구조로 덮은 잔여이고 이 창의 위임 밖이다
- `60m8-chain-attribution-ignored-failure-kind` → **rejected** — 앞 창이 자기 안에서 해소한 행이다. 앵커 후보가 0건이라 resolved 요건(창 밖 W0 좌표)을 세울 수 없다
- `60m8-chain-cause-kept-bare-verify-sh` → **resolved** — 앞 창이 CAUSE 서명을 좁혀 해소했고 그 산출 계획서가 HEAD 에 실재한다
- `60m8-chain-cause-matched-bare-filenames` → **rejected** — 앞 창이 해소한 행 — 앵커 후보 0건이라 resolved 요건 밖
- `60m8-chain-freeze-arm-absorbed-heading-loss` → **rejected** — 앞 창이 해소한 행 — 앵커 후보 0건이라 resolved 요건 밖
- `60m8-chain-logic-unprobed` → **inherited** — backlog 행 자신이 같은 구조로 선언한 앞 창 행이다
- `60m8-chain-predicate-diverges-from-plan` → **inherited** — backlog 행 자신이 같은 자리로 선언한 앞 창 행이다
- `60m8-closure-doc-outside-window-scope` → **rejected** — 이 창 Task 8 이 면제 경로로 닫는다. 근거가 이 창 안(#0 면제 행·#9)이라 resolved 앵커 요건 밖이다
- `60m8-complete-transition-has-no-owner-window` → **rejected** — 이 창 Task 9 가 전이 주체가 된다. 근거가 이 창 안(#10)이라 resolved 앵커 요건 밖이다
- `60m8-dead-candidate-rate-unclosed` → **inherited** — 99-deprecated 발행 차단 이월 2건이 뿌리다 — 그 열림 행이 인수처다
- `60m8-doc-coverage-is-lexical-not-executed` → **resolved** — 앞 창이 코드 본문 전용 계수로 해소했고 그 함수가 HEAD 하네스에 실재한다
- `60m8-doc-coverage-stripper-ate-code-body` → **resolved** — 앞 창이 주석 제거기를 고쳐 해소했고 그 산출 계획서가 HEAD 에 실재한다
- `60m8-freeze-arm-read-only-first-pair` → **resolved** — 앞 창이 matchAll 전수 판독으로 해소했고 그 산출 계획서가 HEAD 에 실재한다
- `60m8-freeze-sig-window-too-wide` → **inherited** — 귀속 팔 자체에 음성 프로브가 없는 같은 축 — m8 하네스는 UI20 동결이다
- `60m8-frozen-baseline-worktree-fallback` → **inherited** — 기준선 판독이 커밋 blob 이 아니라 워킹트리로 내려가는 같은 축. 이 창 #4 는 자기 판독에서 이 팔을 막지만(워킹트리 폴백 금지) m8 하네스는 못 고친다
- `60m8-gate-env-broke-verifier` → **resolved** — 게이트가 spawn env 를 리터럴 3키로 좁힌 뒤 verify.sh --check 가 check PASS 로 돌아온다 — 이 proof 자체가 그 실행이다
- `60m8-generator-round-counted-as-human-review` → **inherited** — 기계 산출을 사람 판정으로 계상하는 같은 축. 이 창은 원장 meta 표기로 갈랐고 그 검사는 #8 이 진다
- `60m8-golden-freezes-machine-fingerprint` → **owner-elsewhere** — verify.sh 의 재현 조건 동결 설계는 00-protocol 소유다 — 이 창은 회부만 하고 §Open Questions 로 연다
- `60m8-implement-receipt-underrecorded-rounds` → **resolved** — 앞 창이 라운드·findings 계수를 고쳐 해소했고 그 산출 계획서가 HEAD 에 실재한다
- `60m8-integration-assert-decays-on-sibling-progress` → **resolved** — 앞 창이 3-dot 창 범위로 해소했고 그 산출 계획서가 HEAD 에 실재한다
- `60m8-ledger-marks-are-section-granular` → **inherited** — 행 단위 판정이 절 단위로 뭉개지는 같은 축이다
- `60m8-line-anchors-rot-on-edit` → **inherited** — 앵커 규약 부재의 같은 축 — 행번호 근거는 편집마다 썩는다
- `60m8-m1check4-single-sender-assumption` → **owner-elsewhere** — 회부 정본 표는 13-relation-contract PRD 소유다
- `60m8-m2b-repopath-prefers-main-checkout` → **rejected** — 앞 창 하네스 자산이라 UI20 밖이다. 이 창은 §재현 조건 R4 로 선언만 한다
- `60m8-m7-findings-heading-freeze` → **rejected** — 앞 창 하네스 자산이라 UI20 밖이다. 이 창은 §재현 조건 R9 귀속 축으로 가른다
- `60m8-nopublish-inner-probe-rc-only` → **inherited** — 프로브가 rc 만 보고 진단 토큰을 안 보는 같은 축이다
- `60m8-nopublish-probe-env-optout` → **inherited** — 프로브가 환경변수로 꺼져도 초록인 같은 축. 이 창 #12 는 자기 프로브에서 이 팔을 막는다
- `60m8-ok-binding-is-harness-granular-not-check` → **rejected** — 이 창 Task 5 가 인수해 검사 단위로 승격했다. 근거가 이 창 안(#6)이라 resolved 앵커 요건 밖이다
- `60m8-ok-citation-not-bound-to-claim` → **rejected** — 앞 창이 해소한 행 — 앵커 후보 0건이라 resolved 요건 밖
- `60m8-ok-citation-redness-unchecked` → **inherited** — 인용 대상의 현재 붉음을 안 보는 같은 축이다
- `60m8-pr-does-not-require-closure-doc` → **rejected** — mccp 본체 결함이고 B1 이 플러그인 수정을 금지한다 — 이 저장소에 판정 주체가 없다
- `60m8-probe0-token-not-bound-to-mutation` → **inherited** — 프로브 토큰이 변조에 결박되지 않은 같은 축이다
- `60m8-report-gate-table-stale` → **inherited** — 산출 기록이 재실행 실측과 어긋나는 같은 축이다
- `60m8-resolve-predicate-is-lexical` → **inherited** — 해소 술어의 천장은 이 창에서 어휘 → 선택 → 의미로 밀려났을 뿐 남아 있다 — §Open Questions 신설 원소와 같은 자리다
- `60m8-round2-is-human` → **inherited** — 사람 측정 라운드의 증거가 기계로 안 서는 같은 축. 8행 전이는 2026-09-15 사용자 판정으로 진행하고 미측정 사실은 종료 문서·PRD 스탬프에 면제로 적는다
- `60m8-santa-lane-agent-unrecorded` → **inherited** — 리뷰 레인의 실제 구성이 기록으로 안 남는 같은 축이다
- `60m8-santa-plan-hash-unmatched` → **inherited** — receipt 가 가리키는 blob 과 실산출이 안 묶이는 같은 축이다
- `60m8-selfprobe-verified-out-of-band` → **inherited** — 프로브가 저장소 밖 구동으로만 확인된 같은 축이다
- `60m8-sibling-harness-needs-local-refs` → **inherited** — 형제 하네스 기준선 붉음의 전제가 출력에 안 실리는 같은 축. 이 창은 §재현 조건 R3 로 선언하고 #3 이 부재를 3/3 으로 잰다
- `60m8-tripartite-tree-unclosed` → **owner-elsewhere** — 3자 정합의 트리 정본(05-final-spec §4)은 00-protocol 소유다 — 지표 문면 개정은 그 앞으로 회부한다
- `60m8-ui3-unmet-behind-unverified-vocabulary` → **inherited** — UI3 미충족의 뿌리는 발행 차단 이월 2건이다. 이 창 Task 6 은 어휘층만 갈랐고 범위 축은 §Open Questions 로 연다
- `60m8-unswept-siblings` → **inherited** — backlog 행 자신이 잔여로 선언한 앞 창 행이다
- `60m8-verifier-and-golden-mutually-exclusive` → **resolved** — 이 창 Task 2 재동결 뒤 verify.sh --check 가 check PASS 다 — 이 proof 자체가 그 실행이고 #1·#2 가 함께 초록이다
- `60m8-verify-owner-regex-blind-to-70` → **owner-elsewhere** — verify.sh 의 owner 열거 정규식은 00-protocol 소유다
| 2026-09-15 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | implement security-reviewer R3 S15: **`#13 selfprobe` 가 워킹트리 폴백 금지 프로브에서 실제 추적 파일 `…-m9b.baseline.txt` 를 직접 변조하고 동기 원복·exit 훅에 기댄다** — SIGKILL/OOM 시 추적 파일 잔여 · 검사 정확성·index 는 무해 · 근거 `…-m9c.gates.mjs:2242`~`:2250`(리뷰어 인용) · DEFER(plan_conflict 정지) — 격리 저장소 프로브로 이전 · id=S15-selfprobe-real-basefile-mutation |
| 2026-09-15 | LOW | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | implement security-reviewer R3 S16·S17: 하네스 소스 자기 스캔만 절대경로 catch-all 을 끈다(`:474`~`:476` · `:1338` · 의도적 교환) · sweep argv 가 PR 로 바뀌는 형제 계획서 §Validation 에서 온다(`shell:false` · argv 한정) · 기록 · id=S16-S17-selfscan-abs-and-plan-argv |
| 2026-09-15 | MEDIUM | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | implement 자가: **`#13` 프로브 `6` 이 첫 `ok` binding 행을 고정 절 `docs/_meta/ownership.md#회부 인계` 로 바꾸는데 그 행이 이미 그 절을 인용하면 무변조다** — 실측 `m1#check-all` 이 그 절을 인용해 `#13 FAIL: 프로브 변조가 내용을 바꾸지 않았다` · 원장 결함 아님 · 근거 `…-m9c.gates.mjs:2148`~`:2155` · 흡수 방향: 대체 절로 `bindOk` 가 서지 않는 `ok` 행을 고른다(원장 행 순서 조작 금지) · DEFER(plan_conflict 정지) · id=probe6-binding-target-collides |
| 2026-09-15 | NOTE | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | **m9c 재진입 흡수 3건 (반사실 확인).** `probe6-binding-target-collides` ABSORBED — 기준선 초록·대체 절 비결박 `ok` 행 선택 · 수정 전 무변조 die → 수정 후 rc1+토큰 · `S15-selfprobe-real-basefile-mutation` ABSORBED — 격리 저장소 + 호출 동안 cwd 이동 · 회귀 사본에서 검출 · 실행 전후 BASEFILE sha256 동일 · 신규 **프로브 `13` 이 커버리지 기준(`cmd`)이 아니라 id 만 바꿔 사본이 15/15 rc 0** ABSORBED — `cmd` 변경으로 rc1+`프로브 없는 검사 — #7` · 결과 `#13` ok 23/23 · `#14` 13/14 결손 [4] · `#4` 축 밖 19 는 계획 개정 판정 대기 · id=m9c-reentry-probe-absorptions |
| 2026-09-15 | NOTE | .claude/plans/insuniverse-docs-60-history-deprecated-m9c.plan.md | **m9c 재진입 2 — `#4` 축 밖 19 사유 수용 · plan receipt intent-gate override.** 사용자 사유 *"구현을 먼저 진행하고 추가 수정하는 방향으로 진행 (ops-reconcile 때문에 어쩌피 수정 포인트가 있을 예정)"* · `mccp-plan-codex` `codex_verdict=divergent` · `intent_gate_force_override=true` (plan_hash `199205b3`) · 15검사 13 ok · `#4` 축 밖 19 좌표 집합 정지 기록과 동일(main 만 `1046134`) · `#14` 13/14 결손 [4] · 해소는 notes §정지 — plan_conflict §다음 진입점 개정 대상 · 근거 `.claude/PRPs/notes/insuniverse-docs-60-history-deprecated-m9c.md` §재진입 2 · id=m9c-reentry2-reason-accepted |
| 2026-09-14 | HIGH | .claude/plans/ops-doc-reconcile-m1.plan.md | **golden `--update` 전 차이 행 분류를 어떤 게이트도 확인하지 않는다 (L2 test·invariant HIGH, 2관점 합의).** Task 3 은 "(b) 가 1건이라도 있으면 update 하지 않고 멈춘다" 로 동결 위험을 막는다고 적었지만 Validation `#1` 은 `--update` 로 막 재생성한 golden 에 `--check` 를 돌려 구조적으로 초록이다(`ops/_meta/verify-ops.sh:721` 부근 — update 는 golden 대조를 건너뛴다). Acceptance 의 `#1` 항목에 (미검증) 표기도 없다. 판정: 수용 — 개정판에서 update 전 report 와 golden 차이를 notes 에 보존하고, 차이 행 전건이 자식 산출물 경로 규칙으로 설명되는지를 기계로 무는 검사를 `#1` 앞에 둔다. 원문 .claude/reviews/plan-review-ops-doc-reconcile-m1.md · 인수처: ops-doc-reconcile M1 계획 개정판 · id=odr-m1-golden-update-ungated |
| 2026-09-14 | HIGH | .claude/plans/ops-doc-reconcile-m1.plan.md | **`#8` PII 스캔이 직렬화 JSON 을 그대로 훑고 40~64자 16진을 출처 무관하게 가려 우회된다 (L3 Codex HIGH).** 재현(2026-09-14, 이 계획서의 pii.mjs 원문): `{"t":"\u0030\u0031\u0030-1234-5678"}` → hits=0, 16진 40자 로컬파트 이메일 → hex_masked=1 hits=0, 대조군 평문 전화 → hits=1. 현 추적 jsonl 8파일에는 `\u` 이스케이프 0 · 16진+@ 0 이라 오늘 값은 안 바뀐다. 판정: 수용 — 개정판에서 JSONL 을 파싱해 문자열 leaf 만 스캔하고, 가림은 스키마가 digest 로 선언한 필드와 `ops/reconcile/reconcile.mjs:405` `piiScan` 의 probe 색인 규칙으로만 한다. 음성 사례 2종을 실측으로 기록. 원문 .claude/reviews/plan-review-ops-doc-reconcile-m1.md · id=odr-m1-pii-scan-bypass |
| 2026-09-14 | HIGH | .claude/plans/ops-doc-reconcile-m1.plan.md | **사람 확인 `#9` 가 관측층 자유 텍스트의 인명을 덮지 않는데 계획서가 덮는다고 적었다 (L3 Codex HIGH).** `#8` 은 이메일·전화·주민번호 3종만, `#9` 는 코드 축 divergent 행과 media 만 본다. 층 1 셀에 든 실명은 자동 적중도 사람 판정도 없이 통과하고 "PII 반입 0" 이 측정값으로 기록될 수 있다. Fan-out 반영 표의 "security HIGH → `#8` + `#9`" 행이 과장이다. 판정: 수용 — 개정판에서 지표 명을 "패턴 3종 적중 0 · 인명 (미검증)" 으로 쪼개 목표 충족으로 보고하지 못하게 하거나, 사용자와 인명 육안 검토 범위를 정한다(층 1 42,436행 전수는 비현실적). 원문 .claude/reviews/plan-review-ops-doc-reconcile-m1.md · id=odr-m1-human-review-scope |
| 2026-09-14 | MEDIUM | .claude/plans/ops-doc-reconcile-m1.plan.md | **측정표 아래 지표·가설 판정 문장을 게이트가 안 본다 (L2 test MEDIUM).** `#11` 은 marker 사이 `metric.*` 행만 대조하므로 목표 미달 값 옆에 "충족" 을 적어도 통과하고 Task 7 이 그 문장을 인용한다. 판정: 수용 — 개정판에서 판정도 블록이 PRD Success Metrics 목표와 비교해 `verdict.*` 행으로 산출하고 `#11` 대조 대상에 넣는다. 원문 .claude/reviews/plan-review-ops-doc-reconcile-m1.md · id=odr-m1-verdict-prose-ungated |
| 2026-09-14 | MEDIUM | .claude/plans/ops-doc-reconcile-m1.plan.md | **`#6` 이 `row_sha` 구성을 손으로 복제한다 (L2 architect MEDIUM).** D4 가 사본 금지를 근거로 PII 패턴을 원문 추출하면서 대상 쪽 해시는 `ops/db/normalize-db.mjs:469` 구성을 사본으로 다시 쓴다. 리뷰어 인용 `ops/reconcile/reconcile.mjs:1729` 부근의 `resealDb` 가 같은 일을 한다. 실패 방향은 요란하다(`OPS_RC_TARGET_SHA_DRIFT` 로 붉음). 판정: 이연 — 개정판에서 import 가능 여부를 확인해 쓰고, CLI 모듈이라 import 가 부작용을 내면 사본을 유지하되 D4 문면을 정정한다. 원문 .claude/reviews/plan-review-ops-doc-reconcile-m1.md · id=odr-m1-rowsha-copy |
| 2026-09-14 | LOW | .claude/plans/ops-doc-reconcile-m1.plan.md | **`#6` 은 `git archive HEAD` 사본을 보는데 HEAD==워킹트리를 그 앞에서 증명하지 않는다 (L2 invariant LOW).** Risks 가 인용한 `#13` 은 `#6` 뒤에 돌고 BASE 대비 워킹트리를 본다. 판정: 수용 — 개정판에서 `#6` 앞에 `git diff --quiet HEAD -- ops/reconcile ops/statements ops/db docs/_meta` 를 둔다. 원문 .claude/reviews/plan-review-ops-doc-reconcile-m1.md · id=odr-m1-archive-head-drift |
| 2026-09-14 | LOW | .claude/plans/ops-doc-reconcile-m1.plan.md | **`# 음성:` 다수가 `(구현 시 실측)` 예측이다 (L2 test LOW).** `#2` `#4` `#5` `#7` `#13` 이 해당. `#9` · `#11` 은 계획 단계에서 합성 입력으로 양성 rc 0 · 음성 rc 1 을 이미 실측했으나 계획서에 반영되지 않았다(동결 뒤라). 판정: 이연 — 개정판에서 실측으로 바꾼다. 원문 .claude/reviews/plan-review-ops-doc-reconcile-m1.md · id=odr-m1-negatives-predicted |
| 2026-09-14 | LOW | .claude/plans/ops-doc-reconcile-m1.plan.md | **`#0` 실패 메시지가 원본 절대경로를 싣고, 계획이 그 출력을 notes 에 붙이게 한다 (L2 security LOW).** 성공 경로는 경로를 안 낸다. 판정: 수용 — 개정판에서 실패 메시지를 `set/unset` 여부로만 적는다. 이 저장소는 리뷰 기록 절대경로 유출을 이미 한 번 겪었다(id=50m13-review-record-abs-path-in-history). 원문 .claude/reviews/plan-review-ops-doc-reconcile-m1.md · id=odr-m1-abs-path-in-fail |
| 2026-09-14 | LOW | .claude/plans/ops-doc-reconcile-m1.plan.md | **`#8` 이 추출한 패턴 배열을 `eval` 한다 (L2 security LOW).** 판정: 기각 — 대상은 추적·리뷰되는 `ops/reconcile/reconcile.mjs:351` 이고 새 신뢰 경계가 아니다. 단일 정본을 쓰기 위한 D4 결정이며 리뷰어도 노출 경로를 못 만들었다. 원문 .claude/reviews/plan-review-ops-doc-reconcile-m1.md · id=odr-m1-eval-patterns |
| 2026-09-14 | LOW | .claude/plans/ops-doc-reconcile-m1.plan.md | **측정표가 블록 자신과만 대조된다 (L2 architect LOW).** 판정: 기각 — `#11` 은 기록 충실성(표 == 실측)만 묻는 검사다. 외부 기준은 우산 PRD Success Metrics 목표이며, 그 비교는 위 id=odr-m1-verdict-prose-ungated 개정으로 들어온다. 원문 .claude/reviews/plan-review-ops-doc-reconcile-m1.md · id=odr-m1-metrics-self-ref |
| 2026-09-15 | HIGH | .claude/plans/ops-doc-reconcile-intake-m1.plan.md | **라운드 상한 3/3 도달 — receipt 없음 (L2 R2 3/4 pass 인데 test HIGH 2건이 정족수를 막았다 · L3 Codex converged findings 0).** `decide` → `verdict=divergent source=multi-agent forwardCodexVerdict=false`. 전역 규칙상 multi-agent 출처는 정상 receipt 를 쓸 수 없어 `MCCP_SKIP_INTENT_GATE` 등으로 우회하지 않았다. 계획서는 R2 판(`sha256:d33f14cc…`, 커밋 `f583883`)으로 동결돼 있고 아래 R2 지적은 **반영되지 않았다**. 원문 .claude/reviews/plan-review-ops-doc-reconcile-intake-m1.md · id=odr-intake-m1-round-cap-no-receipt |
| 2026-09-15 | HIGH | .claude/plans/ops-doc-reconcile-intake-m1.plan.md | **게이트가 층 2 하네스를 한 번도 안 돌린다 (L2 R2 test HIGH).** 계획은 `check-statements.mjs` 의 리더 둘(`readCells` · `censusCells`)과 export 를 바꾸는데 `.gates.sh` 에 `ops/statements/_harness/m0.sh` 호출이 0건이다. 그 하네스는 체커 한 파일만 fixture 트리에 복사하므로(`ops/statements/_harness/m0.sh:302`) fixture 에 `ops/intake/` 가 없을 때 리더가 죽는 회귀는 거기서만 보인다. 판정: 수용 — 개정판 `#3` 에 `bash ops/statements/_harness/m0.sh` 초록을 더한다. 이연 사유: 라운드 소진 · 계획 동결. id=odr-intake-m1-l2-harness-not-run |
| 2026-09-15 | HIGH | .claude/plans/ops-doc-reconcile-intake-m1.plan.md | **D19 의 두 디렉터리 문서 id 충돌 거부를 반증할 음성 사례가 없다 (L2 R2 test HIGH).** `ops/statements/_harness/m0.sh:509-511` 의 셀 행 불일치 음성은 `cell-doc-mismatch` · `cell-ref-row-col-mismatch` · `cell-duplicate-ref` 3종뿐이고 `#5` 는 초록 경로만 본다. 가드가 빠져도 한쪽이 조용히 가려진 채 전 게이트 초록이다. 판정: 수용 — 개정판 Task 6 에 교차 디렉터리 중복 id 음성 case 를 더하고 위 하네스 실행으로 문다. id=odr-intake-m1-cross-dir-dup-negative-absent |
| 2026-09-15 | MEDIUM | .claude/plans/ops-doc-reconcile-intake-m1.plan.md | **가림 양성 대조가 구현 중인 코드의 자기신고 문자열이다 (L2 R2 test MEDIUM).** `.claude/plans/ops-doc-reconcile-intake-m1.gates.sh:204` 는 `--selftest` 출력의 `mask_probe ok` 존재만 본다 — 아무것도 안 가리고 그 줄만 찍어도 통과한다. 판정: 수용 — 개정판에서 게이트가 합성 입력(전각 전화번호 · 이름 열)을 export 된 가림 함수에 직접 넣고 출력을 대조한다. id=odr-intake-m1-mask-probe-self-report |
| 2026-09-15 | MEDIUM | .claude/plans/ops-doc-reconcile-intake-m1.plan.md | **`extract-cells.mjs` 가림 훅은 양성 대조가 없고, 가림 함수·가명 매핑의 소유자가 둘이다 (L2 R2 test·architect MEDIUM 합의).** 훅은 `.gates.sh:123` 의 커밋본 바이트 대조와 `:124` 의 가림 규칙 없는 `--selftest` 로만 지나가 훅이 안 돌아도 재생성본이 같으면 초록이다. 또 `extract-intake.mjs` 와 `extract-cells.mjs` 가 같은 저장소 밖 매핑 파일에 순서 가명을 따로 쓰면 같은 사람이 두 가명을 받거나 다른 두 사람이 `person-a1` 을 받는다. 판정: 수용 — 가림 함수와 매핑 쓰기를 한 모듈에 두고 두 관측기가 호출하게 하며, 게이트가 그 함수를 합성 입력으로 직접 대조한다. id=odr-intake-m1-mask-hook-two-owners |
| 2026-09-15 | MEDIUM | .claude/plans/ops-doc-reconcile-intake-m1.plan.md | **`#8` 의 「전건 빈 출력 아님」 판정이 늘 참일 수 있다 (L2 R2 invariant MEDIUM · 미검증).** 리뷰어 주장: tesseract 4.x/5.x 는 글자가 없어도 `.txt` 에 페이지 구분자(form feed)를 써서 `.gates.sh` `#8` 의 `[ -s "$W/ocr/$i.txt" ]` 가 항상 참이 된다. 이 호스트에 tesseract 가 없어 확인하지 못했다. 판정: 이연 — 설치 뒤 빈 이미지 1장으로 실측하고, 참이면 공백 제거 후 길이로 판정하도록 개정한다. id=odr-intake-m1-ocr-empty-formfeed |
| 2026-09-15 | LOW | .claude/plans/ops-doc-reconcile-intake-m1.plan.md | **G27 이 체커 단독 복사 하네스를 하나만 적었다 (L2 R2 architect LOW).** `ops/reconcile/_harness/m0.sh:173` · `:239` · `ops/reconcile/_harness/m1.sh:187` · `ops/reconcile/_harness/m5.sh:480` 도 `check-statements.mjs` 를 단독 복사한다. D17(체커에 import 를 더하지 않는다)의 결론을 강화하는 사실이다. 판정: 수용 — 개정판 G27 문면 정정. id=odr-intake-m1-g27-undercounts-harnesses |
| 2026-09-15 | LOW | .claude/plans/ops-doc-reconcile-intake-m1.plan.md | **`censusCells` 는 중복 문서 id 를 안 문다 (L2 R2 architect LOW).** `ops/statements/check-statements.mjs:1325` 가 파일 목록을 그대로 `docs` 로 돌려준다. `--check` 에서는 `readCells` 가 먼저 막지만 `--census` 단독 재도출(Task 8)에서는 이중 계수가 조용히 난다. 판정: 수용 — 두 리더가 공유하는 파일 목록 수집에서 충돌을 거부한다. id=odr-intake-m1-census-dup-id |
| 2026-09-15 | LOW | .claude/plans/ops-doc-reconcile-intake-m1.plan.md | **자유 텍스트 실명 · 이미지 안 이름·얼굴·서명 · `pii_names` 사람 목록 의존 (L2 R2 security LOW 2건).** 판정: 기각 — 새 결함이 아니라 계획서 Risks 와 Acceptance `(미검증)` 에 이미 명시한 수용 잔여이고, 리뷰어도 신규 누출 경로를 만들지 못했다. id=odr-intake-m1-accepted-pii-residue |
| 2026-09-15 | HIGH | .claude/plans/ops-doc-reconcile-intake-m1.plan.md | **사용자 결정으로 `divergent` receipt 를 봉인했다 — 위 id=odr-intake-m1-round-cap-no-receipt 의 후속.** 지시: 「divergent로 receipt를 작성해줘. 지적사항은 implement에서 고칠게」. L2 divergent · L3 converged 를 proof 에 그대로 적으면 `receipt/schema.js` 가 그 모양을 single-pass 완화 형태로 판별해 일어나지 않은 우회 표지를 요구하므로, review triple 없이 `MCCP_SKIP_INTENT_GATE` 감사 사유와 `--codex-verdict divergent` 로 썼다. 봉인값: `codex_verdict=divergent` · `intent_gate_verdict=incomplete` · `intent_gate_force_override=true` · plan_hash `sha256:d33f14cc…`. `validate --command mccp:prp-implement` ok. 이 파일 위 R2 지적 8건(HIGH 2 · MEDIUM 4 · LOW 2, 기각 1 제외)은 **구현 단계에서 고친다** — 인수처 `/mccp:prp-implement .claude/plans/ops-doc-reconcile-intake-m1.plan.md`. 계획서 본문은 receipt 해시 때문에 고치지 않고 편차는 notes 에 적는다. id=odr-intake-m1-divergent-receipt-by-user |
| 2026-09-16 | HIGH | .claude/plans/ops-doc-reconcile-intake-m1.plan.md | **`/mccp:pr` PR-Codex 라운드 상한 3/3 도달 — receipt 없음 · PR 미발행.** `review-rounds status --gate mccp-pr-codex --decision ops-doc-reconcile-intake-m1` → `rounds_so_far:3` `cap:3` `mode:enforce`. 세 라운드 전부 `codex_verdict=needs-attention`(approving 아님)이라 finalize ship 게이트(exit 12)에 걸렸고, CLAUDE.md 한시 규칙대로 `/mccp:pr` 은 cap 도달을 `divergent` 로 매핑하지 않고 HALT 했다 — receipt 를 쓰지 않았고 `MCCP_FORCE_PR_WITHOUT_CODEX_CONVERGENCE` 도 걸지 않았다. R1·R2·R3 지적은 전건 흡수했으나 **R3 흡수분은 Codex 재검증을 못 받았다**(예산 소진). 재검증 경로: `MCCP_GATE_ROUND_CAP` 상향 또는 새 축 브랜치에서 새 slug 로 재발주. 인수처: ops-doc-reconcile 우산 PR 을 여는 다음 창 · id=odr-umbrella-pr-round-cap-no-receipt |
| 2026-09-16 | MEDIUM | ops/intake/extract-intake.mjs | **가명 이름공간이 보존 시트명과 부딪친다 (PR-Codex R3 · conf 1 · 재현) — 흡수했으나 Codex 재검증 없음.** 원본에 실제로 `sheet-1` 이라는 시트가 있으면 생성 가명 `sheet-1` 과 겹쳐 서로 다른 두 원본 시트가 하나로 접힌다(재현: `alice@example.com!A1` + `sheet-1!A2`). 좌표가 안 겹쳐 앵커 **수** 대조는 통과한다. 흡수: 보존 시트명 사전 예약 + 시트 일대일 대조 가드 추가(`extract-intake.mjs` `maskDoc`). 반사실 2방향 실측 — 예약 제거 시 `가림이 시트를 접었다 — 입력 5 → 출력 4` 로 red, 일대일 가드까지 제거하면 `mask_probe ok` 로 조용히 통과(R3 의 「selftest 가 결함을 안고도 통과한다」 재현). 잔여: 이 흡수를 Codex 가 못 봤다 · id=odr-intake-sheet-alias-namespace |
| 2026-09-16 | MEDIUM | .claude/plans/ops-doc-reconcile-intake-m1.gates.sh | **`#3` 의 `cells --selftest` 한 줄만 `OPS_SOURCES_ROOT` 를 안 넘겨 원래 붉다 — 내 변경과 무관한 선행 결함.** `gates.sh:124` 는 `node ops/cells/extract-cells.mjs --selftest` 로 부르는데 같은 파일 `:121~123` 은 전부 `OPS_SOURCES_ROOT="$SRC"` 를 붙인다. 실측: env 를 주면 같은 명령이 `selftest_fixtures 20 · selftest ok` rc 0, 안 주면 `OPS_INV_SELFTEST_NO_SOURCE` rc 1. 판정 하네스는 `gates-supp.sh` 라 마일스톤 종결에는 영향이 없었다. 인수처: intake 축을 다시 여는 창 · id=odr-intake-gate3-missing-sources-env |
| 2026-09-16 | LOW | .claude/plans/ops-doc-reconcile-intake-m1.gates-supp.sh | **`#S1` scope_outside 가 origin/main 머지로 넓어졌다 — baseline 과 동일하므로 퇴행이 아니다.** 머지 `662081b` 뒤 `changed=261 outside=233`, 범위 밖으로 지목된 것은 전부 `.claude/PRPs/plans/archived/drug-diag-api-*`(main 이 들여온 다른 축 아카이브)다. 내 수정 전/후 카운터가 글자까지 같음을 실측으로 대조했다(`repro_regressed=0` · `golden_outside=0` · `intake_axis=1` 동일). `#S1` 은 마일스톤 창을 BASE 로 잡는데 우산 브랜치가 main 을 들이면 그 창이 남의 축을 문다. 인수처: 우산 PR 창의 scope 술어 · id=odr-s1-scope-widened-by-main-merge |
| 2026-09-16 | LOW | (mccp) scripts/lib/pr-phase-helpers/codex-runner.js | **`lock_exit_ok=false` · `mutations 0` 이 3라운드 중 2회 재발 — 리뷰 중 도구 호출이 없는데도 났다.** R1 과 R3 에서 발생, R2 는 `true`. 앞선 관측([[mccp-pr-decision-slug-fallback]] 재발 1~3)은 「리뷰 도중 guard 가 거부한 도구 호출」과 동시 발생을 인과 후보로 적었는데, 이번 R1·R3 은 배경 실행 중 어떤 도구도 부르지 않았다 — 그 가설이 약해졌다. 잠금은 두 번 다 이미 해제돼 있었다(`pr-phase-lock.js read` → `active:false`). 상류 환류 후보(B5) · id=mccp-pr-lock-exit-false-without-tool-calls |
| 2026-09-16 | HIGH | .claude/plans/ops-doc-reconcile-intake-m1.plan.md | **사용자 결정으로 receipt 없이 우산 PR 을 낸다 — 위 id=odr-umbrella-pr-round-cap-no-receipt 의 후속.** 지시: 「backlog에 기록하고 pr 진행」(2026-09-16). CLAUDE.md 한시 규칙의 HALT 상태에서 사용자가 진행을 택했다. **receipt 를 쓰지 않는다** — 마지막 Codex 판정(R3 `needs-attention`)은 `ddbae0d` 를 봤고 그 지적의 흡수는 `e5e52f0` 라, 그 판정으로 receipt 를 봉인하면 보지 않은 트리를 인증하는 것이 된다. `MCCP_FORCE_PR_WITHOUT_CODEX_CONVERGENCE` 도 걸지 않는다(그 경로 역시 receipt 를 쓴다). 대신 PR 본문 「게이트 상태」 절에 3라운드 판정·흡수·미재검증분·history-leak scan-error 를 공시한다 — 선례 #80 · #81 · #85 · #86 과 같은 형태다. 인수처: 이 PR 의 리뷰어 · id=odr-umbrella-pr-shipped-without-receipt |
| 2026-09-16 | HIGH | .claude/plans/ops-doc-reconcile-intake-m2.plan.md | **`/mccp:plan` L2 패널 라운드 상한 3/3 도달 — receipt 없음.** `emit-workflow-args` → `BLOCK: round cap reached (3/3 for mccp-plan-codex__ops-doc-reconcile-intake)`, cap 이 이미 최대(3)다. `decision.json` 은 `review_verdict=divergent` · `review_source=multi-agent` · `review_proof=null` · `forwardCodexVerdict=false` — L2 quorum(3/4) 미달이라 정상 receipt 를 쓸 수 없고, CLAUDE.md 한시 규칙의 "receipt 없음" 분기다. `--review-mode` 를 빼고 `--codex-verdict divergent` 만 넣는 가드 우회는 하지 않았다. R0 11건 · R1 14건은 전건 흡수했고 R2 8건이 미해소다. 재검증 경로: 새 결정 슬러그(계획서 경로로 재진입)에서 새 예산으로 R0 부터. 인수처: M2 착수 창 · id=odr-intake-m2-plan-round-cap-no-receipt |
| 2026-09-16 | HIGH | .claude/plans/ops-doc-reconcile-intake-m2.plan.md | **`PROBE_DIGEST_PATHS` 에 `row_sha` 를 넣는 것이 PII 제외 우회를 다시 연다 (R2 security·invariant·test 3렌즈 합의).** `ops/reconcile/reconcile.mjs:415` 의 `isDigestField` 는 경로+`SHA_RE` 형태만 보고 색인 멤버십을 안 본다(`:428` 의 `resolvedShas.has` 가드는 원장 축 전용). `row_sha` 의 유일한 진위 검사 `:978` 은 원장 record 루프 안이라 `rec.target` 이 가리키는 행에만 돌고, probe 217행 중 인용 74행은 `dep_targets` 경로(`:1026`)로 닿는데 그 경로는 `dt.rec.row_sha` 를 **읽지 않는다**. 따라서 인용 밖 행에 `row_sha: "sha256:<주민번호를 품은 64헥사>"` 를 적으면 `--check` 가 조용히 제외한다 — `:369` 가 "헥사 문자집합은 주민번호 무구분자 형태를 완전히 포함한다" 며 닫은 바로 그 경로다. **부분 흡수함(미재검증)**: Task 2 에 probe 전행 `row_sha` 재계산과 `probe_row_sha_unverified` 방출을 추가하고 게이트 `#3` 이 0 을 물게 했다. Codex·패널 어느 쪽도 이 흡수를 못 봤다. 인수처: M2 착수 창 · id=odr-intake-m2-rowsha-pii-anchor |
| 2026-09-16 | HIGH | .claude/plans/ops-doc-reconcile-intake-m2.gates.sh | **게이트 `#1` 의 `probe_sha` 리터럴 스캔이 `ops/` 로 좁아 세 번째 소비자를 못 본다 (R2 architect).** `.claude/plans/ops-doc-reconcile-m1.gates.sh:234-235` 가 `db-probe.jsonl` 의 `probe_sha` 로 PII digest 면제 집합을 만든다 — 키가 사라지면 그 Set 이 `undefined` 만 담아 면제가 통째로 꺼진다. 게이트는 `git ls-files 'ops/*'` 라 도달 불가라, G18 의 "소비자 열거" 완전성 주장이 거짓이었다(프로젝트 CLAUDE.md §1 "완전성 주장은 그것을 검사하는 코드 없이 쓰지 않는다"). **부분 흡수함(미재검증)**: 스캔 대상을 `.claude/plans/*.gates.sh` 까지 넓혔다. 인수처: M2 착수 창 · id=odr-intake-m2-probesha-consumer-scope |
| 2026-09-16 | MEDIUM | ops/reconcile/_harness/golden | **probe 를 대상 색인에 올리면 손작성 golden 트리에 그 파일이 없어 `target_index_missing` 이 0→1 이 된다 (R2 architect).** `ops/reconcile/_harness/m0.sh:386` 이 `want_line … "target_index_missing 0"` 로 리터럴 0 을 못박고, golden 트리(`m0.sh:356` "손으로 적은 비공허 트리")에 `ops/reconcile/db-probe.jsonl` 이 없다. 고치려면 면제 밖 경로를 열어야 해 게이트 `#0` 과 충돌한다. **부분 흡수함(미재검증)**: 면제 목록과 Files to Change 에 `_harness/golden/ops/reconcile/db-probe.jsonl` 과 `m0.sh` 를 추가했다. 인수처: M2 착수 창 · id=odr-intake-m2-golden-tree-probe-missing |
| 2026-09-16 | MEDIUM | .claude/plans/ops-doc-reconcile-intake-m2.gates.sh | **게이트 `#9` 의 자격 대입 패턴이 따옴표 붙은 값을 구조적으로 못 문다 (R2 security).** 값 첫 글자 클래스가 `"` 와 `'` 를 제외해 `"DB_HOST": "prod-mysql-01.internal"` 은 0건이다. 이 마일스톤이 손대는 산출물 대부분(probe.lock · db-probe.jsonl · reconcile.jsonl)이 JSON 이라 그것이 자연 표기다. 사설 도메인 호스트는 IPv4 패턴에도 안 걸린다. **부분 흡수함(미재검증)**: 값 클래스에서 따옴표 제외를 없앴다. 남는 사각은 사설 도메인 호스트명 — 열거 없이는 패턴으로 못 잡는다. 인수처: M2 착수 창 · id=odr-intake-m2-secret-re-quoted-value |
| 2026-09-16 | MEDIUM | .claude/plans/ops-doc-reconcile-intake-m2.gates.sh | **`cnt()` 래퍼가 "0건"과 "grep 실패"를 구분 못 해 fail-open 한다 (R2 invariant).** `cnt() { grep -c "$@" || true; }` 는 grep 이 에러로 죽으면 빈 문자열을 내고 호출부 `$(( ))` 가 그것을 0 으로 접는다. 게이트 `#1`·`#9` 둘 다 이 경로이고, `#9` 는 자격 스캔이라 파일 하나가 조용히 0 으로 접히면 게이트가 아무것도 안 막는다. 선례: `ops/reconcile/reconcile.mjs:700` 이 NUL 로 grep 이 바이너리 취급한 실측을 기록한다. **이연** — 고치려면 `grep` 종료코드 2(에러)와 1(0건)을 가르는 래퍼가 필요하고, 그 변경은 게이트 전역이라 재검증 없이 넣지 않는다. 인수처: M2 착수 창 · id=odr-intake-m2-cnt-wrapper-failopen |
| 2026-09-16 | MEDIUM | .claude/plans/ops-doc-reconcile-intake-m2.plan.md | **계획 본문이 게이트가 한다고 적은 단언이 게이트에 없다 — `pii_excluded ≥ 1` (R2 test).** Risks 절이 "게이트 `#3` 이 `pii_excluded ≥ 1` 을 계수로 문다" 라고 적었으나 R1 흡수에서 그 단언을 `pii_probe_scanned` 대조로 **교체**했고 본문만 옛 서술로 남았다(층위 2). **흡수함(미재검증)**: 본문을 실제 단언과 맞췄다. 인수처: M2 착수 창 · id=odr-intake-m2-plan-gate-claim-drift |
| 2026-09-16 | LOW | .claude/plans/ops-doc-reconcile-intake-m2.gates.sh | **게이트 `#9` 는 자기가 유발하는 notes 내용을 원리상 못 본다 (R2 security).** notes 의 "게이트 완주 출력" 은 `#9` 가 돈 뒤에 쓰이는데 `[ -f "$f" ] || continue` 가 부재 파일을 조용히 건너뛰고 `scanned_files ≥ 1` 은 PRD·PLAN 만으로 충족된다. **이연** — 완주 출력을 게이트 안에서 검사하려면 게이트가 자기 출력을 다시 읽어야 하고 그 재귀는 이 창에서 설계하지 않는다. 인수처: M2 착수 창 · id=odr-intake-m2-notes-scanned-after-gate |
| 2026-09-16 | LOW | .claude/plans/ops-doc-reconcile-intake-m2.gates.sh | **게이트 `#1` 의 `probe_sha_literals 0` 과 findings 산문 기록 요구가 서로 당긴다 (R2 test).** Task 9 는 `ops/findings/ops-30-reconcile.md` 에 키 이름 변경 사실을 기록하라고 하는데, 그 산문이 옛 키 이름을 쓰면 `#1` 이 붉어진다. **이연** — 기록 방식(코드 인용 대신 서술)으로 피할 수 있고, 게이트를 느슨하게 하는 방향으로는 안 고친다. 인수처: M2 착수 창 · id=odr-intake-m2-literal-scan-vs-findings-prose |
| 2026-09-16 | HIGH | .claude/plans/ops-doc-reconcile-m1.gates.sh | **봉인된 M1 게이트의 PII digest 면제 집합이 M2 의 키 변경으로 조용히 꺼진다 — M2 범위 밖으로 확정(사용자 결정 2026-09-16).** 그 파일은 `db-probe.jsonl` 의 `probe_sha` 로 면제 집합을 만드는데, M2 Task 1 이 그 키를 `row_sha`·`provenance.sha` 로 가른다. 키가 사라지면 Set 이 `undefined` 만 담아 면제가 통째로 꺼진다. 고치는 길이 둘 다 막혔다 — 파일만 고치면 `.claude/plans/ops-doc-reconcile-m1.plan.md` 의 자기 핀(`564732ce…`)이 붉어지고, M1 계획서까지 고치면 `plan_hash` 가 움직여 M1 의 receipt 가 본문에 결박되지 않는다(M1 은 PRD 에서 `complete`). 그래서 M2 는 **안 고치고 드러낸다** — 게이트 `#1` 의 제외 집합에 이름으로 싣고 `probe_sha_literals_excluded` 가 매 실행 잔여를 출력한다(착수 실측 1건). 인수처: M1 게이트를 다시 돌려야 하는 창 · id=odr-intake-m2-m1gate-exemption-goes-dark |
| 2026-09-16 | MEDIUM | .claude/plans/ops-doc-reconcile-intake-m2.gates.sh | **`cnt()` fail-open 이연을 닫았다 — 넓힌 스캔이 바이너리에 닿자 실제로 발화했다.** 앞선 같은 id 의 이연 사유는 "고치려면 게이트 전역이라 재검증 없이 넣지 않는다" 였다. R3 흡수로 검사 `#1` 스캔을 `ops/` 전건으로 넓히자 `ops/media/**` 16파일에서 `grep -c` 가 rc 1 에 **0 조차 찍지 않아**(실측: `grep -c -F probe_sha < ops/media/s1-healthy-master/image1.jpg` → rc 1 · stdout 빈 문자열) 옛 래퍼가 빈 값을 냈고 `$(( ))` 가 0 으로 접어 거짓 히트 17줄이 나왔다. **흡수함(반사실 검증)** — `cnt()` 를 rc 0·1 만 계수로 받고 rc 2 이상은 되돌리는 형태로 바꾸고 `istext()` 로 바이너리를 건너뛰며 `*_binary_skipped` 로 계수를 드러냈다. 반사실: 잘못된 정규식(`-E '['`, grep rc 2)에서 옛 래퍼 0 으로 접힘 · 새 래퍼 rc 2 전달 · 정상 0건→`0` · 정상 17건→`17` 회귀 동일. id=odr-intake-m2-cnt-wrapper-failopen |
| 2026-09-16 | HIGH | .claude/plans/ops-doc-reconcile-intake-m2.plan.md | **`/mccp:plan` hybrid 라운드 2/3 판정: `divergent` · 출처 `multi-agent` · receipt 없음.** L1 `converged` · L2 정족수 **1/4**(필요 3, architect 만 pass) · L3 Codex `invoked:true · divergent` → `decide` exit 12, `review_proof=null` · `forwardCodexVerdict=false`. 리뷰가 본 해시는 `sha256:91e8a4ee…` 다. 지적 14건(HIGH 4: env 파일 탐지 우회 · G21 두 파일 무검사 · Task 10 갱신/삭제 미구분 · 핀 분리로 완주 시점 무결박)은 전건 실측 확인 후 흡수했다. 기록은 `.claude/reviews/plan-review-ops-doc-reconcile-intake-m2.md`. 라운드 잔량 **1회**. 인수처: M2 착수 창 · id=odr-intake-m2-r4-divergent-no-receipt |
| 2026-09-16 | MEDIUM | .claude/plans/ops-doc-reconcile-intake-m2.plan.md | **라운드 2/3 이후 원장 밖 교차 모델 4라운드로 21건을 더 흡수했고 본문 해시가 `sha256:e4fa34cc…` 로 이동했다.** GLM R5 `pass`(MED1·LOW3) → R6 `pass`(MED2·LOW1) → R7 `pass`(MED4) → R8 `pass`(LOW2). 원장 밖 Codex L3 는 1회 발화(`divergent`·3건)하고 이후 사용 한도(해제 19:39)로 막혔다. **따라서 현재 본문은 유료 라운드의 판정을 한 번도 받지 않았다** — `divergent` 는 `91e8a4ee…` 에 대한 판정이고 그 뒤 21건이 반영됐다. 인수처: 마지막 라운드 · id=odr-intake-m2-body-moved-after-verdict |
| 2026-09-16 | MEDIUM | .claude/plans/ops-doc-reconcile-intake-m2.gates.sh | **흡수가 새 결함을 낳은 사례 7건 — 전부 다음 리뷰어나 자가 재검에서 잡혔다.** (1) 다중 파일 패치에서 `gates.sh` 앵커가 `hits=0` 으로 끊겨 계획서·원장만 전진(2회 — 게이트 `#6` 음성 기록은 3라운드 뒤 GLM 이 재발견), (2) 자기적중 3회(흡수 서술이 `#9` 를 붉힘), (3) `.claude/` 전체 스캔이 `secret_hits 236`/163파일, (4) PII 정규식이 sha256 예시 안 숫자열 오탐, (5) `m0_stale_index_pin 0` 이 **여전히 참인 회귀 검사의 삭제를 강제**(방향 역전), (6) `probe_mutated` 를 살아있는 파일과 대조해 synthetic fixture 를 죽임, (7) L1 인용 경로 누락으로 `C6_UNRESOLVED_CITATION`. 판정 원장 `.claude/state/santa-ledger.md` 98행에 층위 열과 함께 있다. 인수처: 흡수 절차 자체 · id=odr-intake-m2-absorption-induced-defects |
| 2026-09-16 | LOW | .claude/plans/ops-doc-reconcile-intake-m2.gates.sh | **R8 잔여 2건 — 이연.** (a) 게이트 `#11` 의 golden 형상 검사가 `{"id":"x","row_sha":"y"}` 스텁을 통과시킨다. 다만 `reconcile.mjs:577` 의 적재 규칙과 문면이 정확히 일치하고 스텁도 실제로 적재되므로 **잘못 초록이 서는 단언은 없다** — 콘텐츠 충실도만 무검사인 품질 마진이다. (b) 게이트 `#0` 의 `git status --porcelain | sed 's/^...//'` 이 rename 항목(`R old -> new`)을 경로로 못 읽는다. 실패 방향이 **닫힌 쪽**(거짓 양성)이고 이 계획은 rename 을 두지 않는다. 둘 다 GLM 이 스스로 비차단으로 분류했다. 인수처: M2 착수 창 · id=odr-intake-m2-r8-residual-low |
| 2026-09-16 | HIGH | .claude/plans/ops-doc-reconcile-intake-m2.gates.sh | **untracked 디렉터리가 자격 스캔을 통째로 우회한다 (R9 L3-Codex HIGH · 미해소).** `git status --porcelain` 은 새 디렉터리를 파일별로 펴지 않고 `?? .claude/probe-run/` 한 줄로 보고한다. 검사 `#9` 의 목록 구성은 그 디렉터리 경로를 그대로 남기고 루프의 `[ -f "$f" ] || continue` 가 **계수·경고 없이** 건너뛴다 — 그 안의 `credentials.json` 에 든 자격 대입은 한 번도 스캔되지 않는다. 저장소 전역 env 이름 검사도 `credentials.json` 을 형태로 못 잡는다. **실측 2026-09-16**: `.claude/__probe_run_test/credentials.json` 을 만들자 porcelain 이 `?? .claude/__probe_run_test/` 를 냈고 정규화 후 `[ -f ]` 가 거짓, env 정규식도 미적중. 처방(Codex): untracked 를 `git ls-files --others --exclude-standard -z` 로 **파일 단위 열거**하고 NUL 구분으로 합치며, 새 디렉터리 안의 자격 JSON 으로 반사실을 돌린다. 인수처: M2 착수 창 — 구현 전 이 자리를 먼저 닫는다 · id=odr-intake-m2-untracked-dir-scan-bypass |
| 2026-09-16 | HIGH | .claude/plans/ops-doc-reconcile-intake-m2.gates.sh | **검사 `#9` 의 PII 주민번호 패턴이 무구분자 형태를 못 잡는다 (R9 L3-Codex HIGH · 미해소).** 내가 넣은 `[0-9]{6}-[1-4][0-9]{6}` 은 하이픈을 **필수**로 요구한다. **실측 2026-09-16**: `9001011234567` → 0건 · `900101-1234567` → 1건. 반면 저장소의 기존 스캐너 `ops/reconcile/reconcile.mjs:354` 는 `(^|[^0-9])\d{6}[-. ]?[1-4]\d{6}([^0-9]|$)` 로 구분자를 **선택적**으로 보고 NFKC 정규화까지 태운다 — 즉 내 패턴이 정본보다 약하고, findings·notes 는 그 정본 스캐너의 사정거리 밖이라 무구분자 식별번호가 `pii_shape_hits 0` 로 통과한다. 처방(Codex): 기존 스캐너의 정규화 형태에 맞추고 digest 제외는 따로 처리하며, 단독 식별번호가 걸리고 digest 예시는 안 걸리는 것을 양방향으로 확인한다. 인수처: M2 착수 창 — 구현 전 이 자리를 먼저 닫는다 · id=odr-intake-m2-pii-rrn-separator-required |
| 2026-09-16 | MEDIUM | .claude/plans/ops-doc-reconcile-intake-m2.plan.md | **R9 L2 패널 잔여 12건 — 판정 `pass`(4/4) 이므로 차단은 아니나 라운드 예산 소진으로 재검증 경로가 없다.** `piiScan` 의 digest 제외가 색인 멤버십을 안 본다(architect·security MED 중복 — `ops/reconcile/reconcile.mjs:415` 가 경로+형태만 보고 `resolvedShas` 는 `:428` 자유텍스트 분기 전용) · `row_sha` 재계산의 **배치 순서**가 계획에 안 박혔다(architect MED — `:730` 루프 = `piiScan` 앞이어야 하는데 `buildTargets` 는 `:795` 로 `settle()` 뒤다) · `.claude/reviews/**` 제외가 커밋되는 산출물을 연다(security MED — 기존 리뷰 3건에 `/home/madsc` 실재) · 저장소 밖 이름의 자격 파일(security LOW) · D5 「새 토큰 없음」을 **크기**로만 검사(test MED) · Task 10 반사실이 실행 검증 없음(test MED) · findings 절 표기가 Mirror(`## F-INTAKE-NN`)와 게이트(`^## M2 `)로 갈린다(test LOW) · `#2` 공허 통과 하한 부재(test LOW) · `target_rows_dropped` 기대값이 db 축에서만 유도되는데 계수는 전 축 합산(invariant MED) · 투영 버전 리터럴 `2` 대 `CURRENT_PROJECTION_VERSION`(invariant LOW) · 롤백 경로 부재(invariant LOW). **흡수하지 않은 이유**: 지금 고치면 본문이 판정본 `sha256:92c2186f…` 와 갈려 receipt 결박이 깨진다. 인수처: M2 착수 창 · id=odr-intake-m2-r9-panel-residual-12 |
| 2026-09-17 | LOW | ops/reconcile/db-probe.mjs | **접속 실패 진단문이 서버 오류문을 그대로 싣는다 — 사용자명이 stderr 로 나갈 수 있다 (M2 implement security-reviewer S3).** `id=odr-intake-m2-probe-connect-error-echo`. 성공 경로는 쓰기 전에 자격 문자열을 검사하지만(`OPS_PROBE_SECRET_LEAK`), `OPS_PROBE_CONNECT_FAILED` 경로는 서버 오류 패킷 문면을 가리지 않는다. stderr 는 커밋되지 않으므로 이번 창은 **실패 출력을 notes·findings 에 붙이지 않는 운용**으로 막는다. 코드 가림(자격 문자열 치환)은 다음 ops-30 창이 인수한다. |
| 2026-09-17 | HIGH | .claude/plans/ops-doc-reconcile-intake-m3.plan.md | **계획 게이트가 교차 모델 검증 없이 `divergent` receipt 로 봉인됐다 — 사용자 지시 「backlog에 기록하고 divergent로 receipt를 작성해줘」(2026-09-17).** R1(hybrid, 원장 1/3): L1 `converged` · L2 4렌즈 전건 `pass`(정족수 3/4 · HIGH 0) · **L3 Codex 미발화** — `classification=exit-nonzero`, companion 직접 호출이 `You've hit your usage limit … try again at 7:37 PM` 을 냈다. `decide` 는 `review_verdict=unavailable` · `review_source=multi-agent` · `review_proof=null` · `forwardCodexVerdict=false` 로 exit 12 HALT 했고 그 라운드 receipt 는 없다. 그 뒤 사용자 지시로 `MCCP_PLAN_REVIEW=codex` 전환 · glm(Z.AI glm-5.3) 원장 밖 2라운드(G1 `approve` MED1·LOW4 · G2 `approve` LOW2, 전건 흡수)를 돌았으나 **Codex 는 이 계획서를 한 번도 보지 않았다.** receipt 는 CLAUDE.md 한시 규칙의 codex 모드 분기대로 `codex_verdict=divergent` 로 쓴다(`converged` 로 위장하지 않는다). 인수처: 구현 창 · `/mccp:pr` 의 PR-Codex(dedupe 닫힘) · id=odr-intake-m3-plan-divergent-no-codex |
| 2026-09-17 | MEDIUM | .claude/plans/ops-doc-reconcile-intake-m3.plan.md | **본문이 유료 라운드 판정본 뒤로 움직였다.** R1 이 본 해시는 `sha256:05d53efd…` 이고, 그 뒤 R1 L2 지적 9건(`c4142d9`) · glm G1 5건(`480b67c`) · G2 2건(`513f0c6`)을 흡수해 본문이 세 번 이동했다. 즉 현재 본문은 mccp 원장 라운드의 판정을 받지 않았다 — 원장 밖 glm 라운드만 봤다. 잔량 2라운드는 남아 있다. 인수처: 구현 착수 전 재검증을 택할 창 · id=odr-intake-m3-body-moved-after-verdict |
| 2026-09-17 | MEDIUM | .claude/plans/ops-doc-reconcile-intake-m3.gates.sh | **비-PDF 관측 결과는 독립 재계산이 없다 — 착수 실측 356행.** 게이트 `#3` 의 판독기는 pdf 축만 `pdftotext` 로 다시 재고(텍스트층 유무), docx·pptx·hwpx·xlsx·이미지의 드라이런 결과(`not-sampled`/`observe-empty`/`observe-fail:*`)는 허용 사유 집합 안인지만 본다. `observe_outcome_unverified` 로 그 행 수를 매 실행 드러내되 값의 옳음은 무검사다. 닫으려면 형식별 독립 판독기가 필요하고 그것은 신규 의존(INV1) 없이는 파서 사본이 된다. 인수처: 전건 판독 범위를 정하는 창 · id=odr-intake-m3-nonpdf-outcome-unverified |
| 2026-09-17 | MEDIUM | .claude/plans/ops-doc-reconcile-intake-m3.gates.sh | **관측 도구 자체의 결함이 파일 사유로 흡수된다 (R1 invariant LOW).** D5 는 도구 핀 불일치(`OPS_INV_INTAKE_TOOL`)만 계수 전체를 멈추고, 그 밖의 기계 결함(`OPS_INV_INTERNAL` · 토큰 없는 죽음 · 시간 초과)은 `observe-fail:*`·`observe-timeout` 으로 그 파일의 사유가 된다. 게이트 `#4` 는 `machinery_suspect_rows` 로 합을 찍되 판정하지 않는다 — 실데이터에서 그 값이 몇인지 착수 시점에 모르므로 0 을 단언하면 통과 불능 위험이 있어 공시로 남겼다. 인수처: 게시 실행 뒤 그 값이 0 이 아니면 그 자리 · id=odr-intake-m3-machinery-vs-source-failure |
| 2026-09-17 | LOW | .claude/plans/ops-doc-reconcile-intake-m3.plan.md | **Acceptance 미검증 3건 — 사람·호스트 축이라 게이트 사정거리 밖.** (a) 가명 매핑 토큰 밖의 실명 파일명 부재는 738건 이름을 사람이 판정하지 않았으므로 미검증이다(계수 산출이 경로를 안 싣는 것으로 대신한다). (b) PII sha 목록 도출 스크립트·토큰이 스크래치·터미널에 남지 않았음은 규범이고 검사가 없다. (c) 임시 전개물(`ops-census-*`, 약 3GiB)의 강제 종료 시 잔존은 코드가 못 막고 실행 뒤 수동 확인으로 둔다. 인수처: 구현 창의 notes · id=odr-intake-m3-unverified-human-axes |
| 2026-09-17 | LOW | .claude/plans/ops-doc-reconcile-intake-m3.gates.sh | **두 주장은 대리 검사다 (glm G2).** 게이트 `#1` 의 「드라이런이 게시와 같은 관측 함수를 탄다」 는 관측 형식 6종의 **행수 일치**로 대리 확인하고 같은 함수 호출 자체는 diff 리뷰 몫이다. 게이트 `#4` 의 `census_check ok` 는 「재도출이 게시본과 바이트 같다」 의 **도구 자기신고**이고 게이트는 바이트 대조를 직접 하지 않는다 — 내용 정합은 `#3` 의 독립 판독기가 묶는다. 둘 다 주장을 검사 범위로 좁혀 적었다. 인수처: 구현 diff 리뷰 · id=odr-intake-m3-proxy-assertions |
| 2026-09-18 | HIGH | .claude/plans/ops-doc-reconcile-intake-m3.plan.md | **구현 게이트도 교차 모델 Codex 없이 넘어갔다 — Codex 사용 한도(해제 14:47), 사용자 결정으로 glm 대체 + advisory.** `id=odr-intake-m3-implement-unavailable-no-codex`. implement 원장 `-m3` 은 0/3 이라 캡이 아니라 **외부 가용성**이고, 그래서 receipt 는 `round-cap-reached`(→`divergent`)가 아니라 `codex_verdict=unavailable`(advisory, 비승인)이다. 대신 glm(Z.AI `glm-5.3`) 읽기 전용 라운드가 구현 시점 결정 11건을 쳤고(`approve` · MED 1 · LOW 2, 전건 흡수), `mccp:security-reviewer` 가 HIGH 3 · MED 3 을 냈다(HIGH 전건 흡수). **Codex 는 이 구현 결정을 한 번도 보지 않았다.** 인수처: `/mccp:pr` 의 PR-Codex(dedupe 닫힘 — `unavailable` 은 `converged` 가 아니다) |
| 2026-09-18 | MEDIUM | ops/intake/census.mjs | **zip 폭탄 방어가 사전 차단이 아니라 사후 탐지다 (implement security-reviewer S2).** `id=odr-intake-m3-zipbomb-post-hoc-only`. `unzip -Zt` 의 선언 해제 합계는 아카이브 작성자가 쓴 값이라 조작 가능하고, DEFLATE 스트림은 그 값에 종속되지 않는다. 흡수분은 **전개 직후** 실바이트 합을 같은 상한과 대조해 초과분을 즉시 지우는 것이고, 이것은 피해를 0 으로 만들지 않는다 — 바이트는 이미 쓰인 뒤이며 피해가 아카이브 하나분으로 한정될 뿐이다. 사전 차단은 `unzip -p` 스트리밍이나 전개 중 디스크 증분 감시가 필요하고 D3(시스템 `unzip` 전개)에서 멀어진다. 인수처: 전건 판독 창이 전개 경로를 다시 열 때 |
| 2026-09-18 | MEDIUM | ops/intake/census.mjs | **관측 자식의 시간 상한이 손자를 못 죽인다 (implement security-reviewer S5).** `id=odr-intake-m3-observe-grandchild-orphan`. `spawnSync(node …, {timeout})` 의 SIGTERM 은 중간 `node` 에만 가고, 그 안에서 동기 호출된 `pdftotext`(`ops/intake/extract-intake.mjs` `observePdf`) · `tesseract`(`observeImage`) 는 고아로 남는다. 고칠 자리는 관측기 본체이고 그것은 게시 산출 바이트에 닿아(층 1 `--check` 재관측) 이 마일스톤 범위 밖이다. 이번 창은 Task 4 가 임시 전개물 잔존과 같은 급으로 **잔존 프로세스**를 확인해 notes 에 적는 운용으로 막는다. 인수처: 관측기를 여는 다음 창 |
| 2026-09-18 | MEDIUM | .claude/plans/ops-doc-reconcile-intake-m3.plan.md | **D9 의 「`unzip` 에도 넘기지 않는다」가 비-PII zip 안에 든 PII 파일에는 거짓이다 (implement security-reviewer S4).** `id=odr-intake-m3-pii-inside-clean-zip`. 내용 해시 판정은 바이트가 있어야 서므로, PII 파일이 정상 zip 안에 중첩돼 있으면 그 zip 을 전개할 때 함께 `mkdtemp` 아래에 쓰인다. 그 뒤 `pii-listed` 분류와 관측기 미호출은 맞게 되지만 문구는 이 경로에서 참이 아니다. 게이트 `#3` 판독기도 zip **자신의 이름**만 걸러 내려가 같은 한계를 공유한다(도구와 정의를 맞추려고 의도한 것). 실데이터는 PII 7건 전건이 깊이 0(G7)이라 발동하지 않고, 남는 창은 0700 `mkdtemp` · 저장소 밖 · `finally` 삭제다. **계획 D9 문구는 못 고친다** — 계획서를 고치면 `plan_hash` 가 어긋나 plan-codex receipt 가 stale 이 되고 `/mccp:pr` 이 막힌다. 인수처: 다음 수령분에 중첩 PII 가 실제로 오는 창 |
| 2026-09-18 | MEDIUM | ops/cells/extract-cells.mjs | **엔트리 catch 가 fs 오류 메시지를 그대로 실어 경로·파일명이 stderr 에 샌다 (code-review H1 의 형제).** `id=ops-cells-entry-catch-leaks-path`. `main().catch((err) => invFail('OPS_INV_INTERNAL', String(err.message)…))` 는 `census.mjs`·`extract-intake.mjs` 에서 실명 노출로 확인돼 `err.code` 로 고쳤고(실측 재현), 셀 추출기에 같은 코드가 남아 있다. 이 창에서 안 고친 이유는 하나뿐이다 — ops-10 소유이고 이 PRD M3 면제 목록(`ops/_meta/golden.txt` 1건) 밖이라 게이트 `#0` 범위 검사가 문다. 수정 자체는 한 줄이다. 인수처: ops-10 을 여는 다음 창 |
| 2026-09-18 | MEDIUM | .claude/plans/ops-doc-reconcile-intake-m3.plan.md | **계획서 §Validation 의 gates.sh sha256 핀이 리뷰 흡수로 무효가 됐다.** `id=odr-intake-m3-gates-pin-stale-after-review`. 핀은 `c23a1fe27ba27e316f97f33dcbd819651a3e0b71b263adb5dedd56a6ded7896a` 인데 code-review H2 흡수로 게이트 `#2` 사례 목록(`unreadable` 추가)과 `#6` 형상 규칙(`unreadable` 사유 · sha256 null 허용 2종)을 코드와 같은 자로 맞추면서 `f359db082c56451edb17959e73538f3c1888d896963d127b92b66da885720851` 이 됐다. **핀을 갱신할 수 없다** — 계획서를 고치면 `plan_hash` 가 바뀌어 plan-codex · implement-codex receipt 두 장이 stale 이 되고 `/mccp:pr` 이 막힌다(선례: mccp-plan-edit-after-implement-dead-end). 그래서 이 창은 핀 검사를 건너뛰고 게이트 본문을 직접 실행했고, 그 실행 결과를 notes 에 싣는다. 대안(게이트를 안 고침)은 새 사유 `unreadable` 에 검사가 없는 상태를 남기므로 더 나쁘다 — CLAUDE.md §1 「주장 ≠ 검사」. 인수처: M3 를 다시 여는 창이 `-m3r` slug 로 재봉인할 때 |
| 2026-09-22 | MEDIUM | .claude/plans/ops-doc-reconcile-intake-m3.plan.md | **gates.sh 핀 2차 표류 — 같은 원인, 같은 인수처.** `id=odr-intake-m3-gates-pin-stale-after-review` 의 연장이다. 2026-09-22 code-review 흡수로 게이트 `#2` 사례 목록에 `unreadable-searchless-dir` · `archive-restrictive-dir` · `archive-restrictive-dir-swept` 3건을 더하면서 gates.sh sha256 이 `f359db082c56451edb17959e73538f3c1888d896963d127b92b66da885720851` → `660737d000cbb6edade56b754f5574405961bea8cdc887c8e09ccc2da2bcb964` 로 움직였다. 계획서 핀은 여전히 `c23a1fe2…` 다. 핀 갱신 불가 이유·대안 판정은 앞 행과 동일하고, 이 창도 핀 검사를 건너뛰고 본문을 직접 실행해 rc 0 을 확인했다(notes §구현 후 code-review 2차). 인수처: M3 를 다시 여는 창이 `-m3r` slug 로 재봉인할 때 |
| 2026-09-22 | HIGH | .claude/plans/ops-doc-reconcile-intake-m4.plan.md | **Q52 첫 원자 요건이 열람 이력과 수정 이력을 한 칸에 묶는다 (plan 게이트 R3 L3 Codex HIGH).** `id=odr-intake-m4-q52-view-edit-merged`. 근거: `.claude/plans/ops-doc-reconcile-intake-m4.gates.sh` 검사 `#1` 의 REQS 리터럴 Q52 행 `"열람 · 수정 이력이 남는지"` · 계획서 §원자 요건 목록 Q52 행. 수정 이력만 답한 인용으로 그 칸이 차면 열람 이력이 미답인 채 `full` 이 된다. 같은 부류로 저자가 찾은 자리: Q37 첫 요건 `"환불 · 취소 시 주문 상태 변화"`(두 트리거). 미흡수 사유: 원장 `ops-doc-reconcile-intake-m4` 3/3 상한 도달 — 지금 계획서를 고치면 어떤 리뷰도 그 반영분을 보지 못하고, 계획서 해시가 바뀌어 이 자리에서 쓸 receipt 의 결박도 깨진다. 조치안: Q52 를 「열람 이력이 남는지 · 수정 이력이 남는지」 로, Q37 을 환불 · 취소로 갈라 REQS · 표를 함께 고치고 「한 조작만 답한 인용 → partial」 음성을 더한다. 인수처: 사용자 결정(receipt 경로) 뒤 계획서 흡수 또는 `-m4r` 재봉인 |
| 2026-09-22 | MEDIUM | .claude/plans/ops-doc-reconcile-intake-m4.plan.md | **게이트 `#4` 재채점이 `conflict: true` 칸에서 인용 id 실재 검사를 건너뛴다 (R3 L3 Codex MEDIUM, Codex 가 실제 블록으로 재현).** `id=odr-intake-m4-conflict-skips-cited-check`. 근거: gates.sh 검사 `#4` 의 `return !s.conflict && s.stmts.filter(stated).length >= 1;` — 단락 평가로 `stated()` 가 안 불려 `CITED_ABSENT` 가 안 뜬다. D7 은 인용 id 부재에 멈추라고 하므로 게이트가 도구보다 느슨하다. 미흡수 사유: 위와 같은 상한. 조치안: 칸마다 `s.stmts.forEach(stated)` 로 실재를 먼저 세고 그 뒤 채점, `conflict: true` + 없는 id 음성 추가. 인수처: 위와 같음 |
| 2026-09-22 | MEDIUM | .claude/plans/ops-doc-reconcile-intake-m4.plan.md | **D7 「review.lock 입력 검사는 자식을 띄우기 전에」 를 게이트 `#2` 도구 밖 음성이 가르지 못한다 (R3 L2 test MEDIUM).** `id=odr-intake-m4-d7-order-unchecked`. 근거: gates.sh 검사 `#2` 의 도구 밖 음성은 rc 1 과 첫 토큰 `OPS_INV_METRICS_INPUT` 만 보고 `timeout 300` 을 둔다 — 자식을 다 돌린 뒤 검사해도 같은 rc · 토큰이다. 기록된 음성 「토큰이 달라야 한다」 는 근거가 없다. 미흡수 사유: 상한. 조치안: 도구 밖 음성에 소요 시간 상한(예: 20초)을 걸거나 자식 기동 흔적(mkdtemp 부재)을 본다. 인수처: 위와 같음 |
| 2026-09-22 | LOW | .claude/plans/ops-doc-reconcile-intake-m4.plan.md | **범주 값 enum 을 게이트가 검증하지 않는다 (R3 L2 test LOW).** `id=odr-intake-m4-category-enum-unchecked`. 근거: gates.sh 검사 `#4` 의 `if (c.codex !== c.fable \|\| !(c.codex in cnt) \|\| !stated(c.id)) continue;` — `Reason` 같은 오타가 `none` 처럼 조용히 빠진다. 응답 칸은 형을 엄격히 보는데 범주는 id 집합만 본다. 조치안: 값이 `reason`·`intent`·`exception`·`none` 밖이면 위반. 인수처: 위와 같음 |
| 2026-09-22 | LOW | .claude/plans/ops-doc-reconcile-intake-m4.plan.md | **원자 요건 표의 ` · ` 구분자가 요건 안에도 쓰여 Q26 · Q49 가 표에서 개수와 어긋나 보인다 (R3 architect · test · invariant LOW).** `id=odr-intake-m4-reqs-table-separator`. 근거: 계획서 §원자 요건 목록 Q26 · Q49 행. 게이트 리터럴은 배열이라 일관하고 판정에는 영향이 없다 — 사람이 표를 읽을 때 오독한다. 조치안: 표 구분자를 ` ‖ ` 등 요건 안에 안 쓰는 기호로 바꾸거나 Q26 · Q49 를 한 요건 한 문장으로 다듬는다. 인수처: 위와 같음 |
| 2026-09-22 | LOW | .claude/plans/ops-doc-reconcile-intake-m4.plan.md | **게이트 `#5` 가 `expected_unmeasured 2` 를 단언하지 않는다 (R3 L2 invariant LOW).** `id=odr-intake-m4-expected-unmeasured-not-asserted`. 근거: gates.sh 검사 `#5` 는 값을 찍기만 하고 종료 판정에 넣지 않는다. 지금은 게이트가 env 를 강제해(표본 트리 export · 번들 필수 · 가명 매핑 필수 · `OPS_DB_CSV_ROOT` 해제) 도달 불가다. 조치안: `expectedUnmeasured === 2` 를 판정에 넣는다. 인수처: 위와 같음 |
| 2026-09-22 | MEDIUM | .claude/plans/ops-doc-reconcile-intake-m4.plan.md | **R3 미해소 6건(`odr-intake-m4-*`)을 상한 뒤 계획서에 흡수했다 — 반영분은 어떤 리뷰도 보지 않았다.** `id=odr-intake-m4-r3-absorbed-unreviewed`. 사용자 결정(2026-09-22, 「R3 지적 흡수 후 감사 우회 봉인」). 흡수: Q52 열람 · 수정 분리 · Q37 환불 · 취소 × 네 상태 분리(68 → 73요건) · 게이트 `#4` 인용 실재를 충돌 표시 전에 센다 · `CATEGORY_ENUM` · `#5` `expected_unmeasured === 2` · `#2` 자식 다섯 센티널 스텁 · 요건 표 구분자 ` ‖ `. 흡수마다 게이트 블록 양성 · 음성을 실행으로 확인했다(gates.sh 각 `# 음성:`). R3 가 본 본문 해시는 `sha256:43fb93dd…444c43` 이고 봉인 본문은 그와 다르므로 receipt 에 review 삼중(proof)을 싣지 않았다 — `codex_verdict=divergent` · `MCCP_SKIP_INTENT_GATE` 감사 우회. cross-gate dedupe 는 닫혀 PR 때 PR-Codex 가 돈다. 인수처: 구현 창의 implement-codex 게이트 · PR-Codex |
| 2026-09-22 | CRITICAL | .claude/plans/ops-doc-reconcile-intake-m4.plan.md | **`pii-name-token` 지표가 가명 매핑의 `pii_names` 만 보고 `names`(관측기가 문서에서 뽑은 실명) 축을 안 본다 (implement security-reviewer S1).** `id=odr-intake-m4-name-token-names-axis`. 근거: 계획 D11 「가명 매핑 `pii_names` 토큰 포함 여부」 · gates.sh 검사 `#4` 의 `pm.pii_names` · 검사 `#9` 의 `.pii_names` · 오라클 python 의 `pm.get('pii_names')` — `.names` 를 읽는 줄이 게이트에 0 이다. 착수 실측: `names` 키 5건 · `pii_names` 8건 · 교집합 0. 합집합 적중은 관측층 11파일 · statements · reconcile 원장 · findings · 2차 리뷰 프롬프트 전건에서 0 이라 노출은 없고 정의가 좁다. 미흡수 사유: 도구만 합집합으로 세면 게이트 `#4` 재계수(`tokens`)와 갈려 붉어지고, D11 · 게이트를 고치면 계획서 해시가 바뀌어 plan-codex receipt 가 stale 이 된다(선례 mccp-plan-edit-after-implement-dead-end). M4 는 합집합 계수를 notes · findings 에 보충으로 싣고, 2차 리뷰 발송 스크립트는 합집합으로 막는다(사용자 결정 2026-09-22 「흡수 후 진행」). 조치안: D11 토큰 = `pii_names` ∪ 전 문서 `names` 키, 게이트 `#4` · `#9` · 오라클이 같은 합집합을 읽는다. 인수처: M5 계획 또는 `-m4r` 재봉인 |
| 2026-09-22 | MEDIUM | .claude/plans/ops-doc-reconcile-intake-m4.plan.md | **게이트 `#3` 이 본문 그대로는 통과할 수 없어 구현 창에서 한 자리를 고쳤고, 계획서의 gates.sh sha256 핀이 무효가 됐다.** `id=odr-intake-m4-gate3-pseudonym-map`. 근거: 검사 `#3` 의 임시 worktree 재게시는 도구 · review.lock · golden · node_modules 링크만 옮기고, gitignore 된 가명 매핑(tools.lock `pseudonym_map`)은 `git worktree add` 로 안 딸려 온다 — 도구가 매핑을 저장소 상대로 읽으므로 재게시에서만 `pii-name-token` 이 `unmeasured` 로 갈려 `REGEN_DRIFT` 가 확정이다(Implement-Codex R1 HIGH, 수정 전 반사실은 notes). 조치: 재게시 직전에 매핑을 같은 상대경로로 `install -m 600` 복사(7줄, 사용자 결정 2026-09-22 「본문 한 줄 수정」). 핀은 `df4efd8378b67c0d08b6a346e620a6c6acd80c272dccf26f83c32482c1e60a47` → `72384406d8f5933fa74b9cb0801db49f9470c6a8e6c77193c68226c87ffb0480`. **핀을 갱신할 수 없다** — 계획서를 고치면 `plan_hash` 가 바뀌어 plan-codex · implement-codex receipt 가 stale 이 된다(선례 mccp-plan-edit-after-implement-dead-end · `odr-intake-m3-gates-pin-stale-after-review`). 그래서 이 창은 핀 검사를 건너뛰고 게이트 본문을 직접 실행한다. 인수처: M4 를 다시 여는 창이 `-m4r` 로 재봉인할 때 |
| 2026-09-22 | MEDIUM | .claude/plans/ops-doc-reconcile-intake-m4.plan.md | **로컬 code-review 흡수가 계획 D5 · D7 과 게이트 본문을 바꿨다 — 계획서 문구와 gates.sh 핀은 못 고친다.** `id=odr-intake-m4-local-review-plan-drift`. 사용자 결정(2026-09-22, 「모두 수용」). 근거: (1) D5 `reason-intent-exception` 목표에 kind 셋 정수 조건을 더했다 — kind 계수 자식(`--census`)이 죽어도 범주만으로 pass 가 서던 자리(L1). 도구 SPEC 과 게이트 `#5` pred 를 같은 자로 맞췄다. (2) D7 멈춤 중 인용 id 부재 · 원천 밖 분모를 **신선한 리뷰**로 좁히고, 신선도에 질문 원천 sha(`source.sha256`)를 더했다(L2 · L3) — 낡은 리뷰는 `review-stale` 로 기록한다. 구현 창 「이탈 결정」(낡은 리뷰에서도 인용 실재 검사, Codex R1 next_steps)을 뒤집는다. (3) 게이트 머리 `export TMPDIR="$W"` — 부재 사본이 신호 종료에 남던 자리(M1). 반사실은 notes 「로컬 코드 리뷰」. gates.sh 핀은 `72384406…` → `838104b442f3084dd1f4647d6052e2816645a0f01c027dc36045118cd3ad1c3a`. 계획서를 고치면 `plan_hash` 가 바뀌어 receipt 가 stale 이 된다(선례 mccp-plan-edit-after-implement-dead-end). 조치안: D5 표 해당 행 목표 · D7 멈춤 목록 · 검사 `#2` 설명 · 핀을 이 동작에 맞춘다. 인수처: M4 를 다시 여는 창이 `-m4r` 로 재봉인할 때 또는 M5 계획 |
| 2026-09-22 | MEDIUM | .claude/plans/ops-doc-reconcile-intake-m5.plan.md | **스테이징 복사 도중 SIGINT · SIGTERM 으로 끊기면 확인 전 원본이 고정 스테이징 자리에 남는다 (plan 게이트 R3 L3 Codex MEDIUM · 라운드 상한 3/3 도달로 미흡수).** `id=odr-intake-m5-stage-signal-cleanup`. 근거: 계획 D6 「복사가 끝나기 전에 멈추면 자리를 지운다 — 복사 중에는 자리를 기존 종료 훅 `LIVE_TEMPS` 에 올려 둔다」 가 기대는 정리는 `ops/intake/census.mjs:163` 의 `process.on('exit', sweepTemps)` 하나이고 신호 처리기가 없다(`grep -n "SIGINT\|process.on(" ops/intake/census.mjs` → 163 · 689 두 줄 모두 `exit`). Codex 가 읽기 전용 자식 프로세스 탐침으로 SIGINT · SIGTERM 에서 콜백이 안 도는 것을 확인했다. 남는 파일은 검사 `#4` `stage_dir_present` 가 게이트 실행 때 잡고(조용히 통과하지 않는다) 재시도는 「자리가 이미 있으면 거부」 로 막힌다 — 누출 경로가 아니라 정리 누락이다. 이연 사유: 상한 뒤 계획서 수정은 사용자 결정 사항이다. 구현 창 인수 후보: `--stage` 에 SIGINT · SIGTERM 처리기(자리 삭제 뒤 재송출) · 자식 프로세스 중단 자기시험 · SIGKILL 은 잔여 한계로 공시 |
| 2026-09-22 | LOW | .claude/plans/ops-doc-reconcile-intake-m5.plan.md | **검사 `#9` 의 호스트 경로 패턴이 `/home/` · `/tmp/` · `C:\Users` 만 본다 (R3 L2 security LOW).** `id=odr-intake-m5-host-path-pattern`. 근거: `.claude/plans/ops-doc-reconcile-intake-m5.gates.sh:923` `HOST = /\/home\/|\/tmp\/|[A-Za-z]:[\\/]Users/`. 이 호스트의 번들 · 스테이징 자리는 `/home` 아래라 현재 입력에서 새는 경로는 없다(리뷰어 판정 — 잔여 한계). 이연: 다른 호스트로 옮길 때 `/root/` · `/mnt/` · `/Users/` · `/var/` 를 더한다 |
| 2026-09-22 | LOW | .claude/plans/ops-doc-reconcile-intake-m5.plan.md | **2차 리뷰 발송 전 PII 사전 점검과 외부 실행 자체는 기계가 증명하지 못한다 (R3 L2 security LOW).** `id=odr-intake-m5-review2-execution-unproven`. 근거: 검사 `#7` 의 nonce 는 저자가 쓰는 값이다(계획 D10). 계획 Acceptance 가 이미 (미검증)으로 공시한다 — 커밋되는 프롬프트 · 답 둘은 검사 `#9` 가 PII · 가명 토큰 · 호스트 경로로 훑는다. 기각(공시로 충분): 외부 실행 증명은 서명 없이 불가능하다 |
| 2026-09-22 | LOW | .claude/plans/ops-doc-reconcile-intake-m5.plan.md | **검사 `#3` 은 후보 파일에서 빠진 풀 파일(더 높은 점수인데 누락)을 못 잡는다 (R3 L2 test LOW).** `id=odr-intake-m5-candidate-omission`. 근거: `.claude/plans/ops-doc-reconcile-intake-m5.gates.sh:396` 이하 배정 재계산이 도구가 낸 행만 쓴다. R1 에서 층위 8 사각으로 공시했고 두 번째 관측기는 INV1 과 부딪친다(계획 NOT Building). 기각: 이미 공시한 한계 |
| 2026-09-22 | LOW | .claude/plans/ops-doc-reconcile-intake-m5.plan.md | **등재 검사의 사람 확인 해시는 저자가 쓰는 값이라 실제 육안 확인을 증명하지 못한다 (R3 L2 invariant LOW).** `id=odr-intake-m5-human-review-unproven`. 근거: `.claude/plans/ops-doc-reconcile-intake-m5.gates.sh:540` `s.sensitive_reviewed_sha256 === s.sha256`. M1 이래 lock 의 같은 한계(머리말 「사람이 육안 확인한 그 바이트의 해시」)이고 계획 Acceptance 가 이미지 속 이름을 (미검증)으로 둔다. 기각: 기계로 닫을 수 없는 사람 행위다 |
| 2026-09-22 | LOW | .claude/plans/ops-doc-reconcile-intake-m5.plan.md | **`intake2/` 접두 예약이 관례일 뿐 구조 보장이 아니다 (R3 L2 architect LOW · [out_of_scope]).** `id=odr-intake-m5-intake2-convention`. 근거: 계획 D2 「`intake2/` 는 M5 전용 접두다」. R1 에서 문장으로 흡수했고 리뷰어가 스스로 범위 밖으로 분류했다. 기각 |
| 2026-09-22 | MEDIUM | .claude/plans/ops-doc-reconcile-intake-m5.plan.md | **census 전개 자리도 SIGINT · SIGTERM 에 남는다 — `odr-intake-m5-stage-signal-cleanup` 의 범위를 스테이징에서 전개물까지 넓힌다 (Implement-Codex R1 F1 MEDIUM).** `id=odr-intake-m5-census-signal-temps`. 근거: `ops/intake/census.mjs` 의 `process.on('exit', sweepTemps)` 는 기본 신호 종료에서 돌지 않는다 — 착수본 주석은 SIGKILL 만 적어 과소 진술이었다(구현 창에서 바로잡음). 번들 전개물은 원본 파일(확인 전 자료)이고 `$TMPDIR/ops-census-*` 아래 0700 이다. 게이트는 `export TMPDIR="$W"` · `trap cleanup EXIT` 로 소유하므로 게이트 실행에서는 남지 않는다. 이 창은 새 모드를 같은 감독(사설 TMPDIR + 셸 trap) 아래에서만 돌린다. 코드 안 처리기를 두지 않은 이유: 계수기는 `spawnSync` 로 전부 동기라 처리기가 동기 작업 뒤에야 돌고, 같은 신호를 받은 관측 자식이 `observe-fail` 행으로 기록돼 계수가 거짓이 된다. 조치안: 새 모드를 감독 프로세스(사설 임시 루트 소유 · 자식 종료 후 회수)로 감싸고 중단 탐침으로 전개 · 스테이징 자리 부재를 단언 |
| 2026-09-22 | MEDIUM | .claude/plans/ops-doc-reconcile-intake-m5.plan.md | **게이트 인라인 node 의 잡지 않은 `JSON.parse` 가 입력 발췌를 stderr 에 싣는다 (Implement-Codex R1 F2 MEDIUM).** `id=odr-intake-m5-gate-json-parse-echo`. 근거: Node 22.23.2 실측 `JSON.parse('{"pii_names":["SECRETMARK",}')` → `Unexpected token '}', ..."CRETMARK",}" is not valid JSON`. 대상은 `.claude/plans/ops-doc-reconcile-intake-m5.gates.sh` 의 `#7` 리뷰어 답 판독 · `#9` 가명 매핑 판독 등 인라인 프로그램 전건. 게이트 본문은 계획서 sha256 핀이라 고치면 `plan_hash` 가 바뀐다(선례 mccp-plan-edit-after-implement-dead-end) — 이연. 완화: 게이트 입력은 전부 기계가 쓴 JSON 이고, 이 창의 새 스크립트는 경계에서 잡아 토큰만 낸다. 완주 출력을 notes 에 붙이면 게이트 `#9` 가 notes 를 다시 문다. 조치안: 다음 게이트 판부터 인라인 프로그램마다 `try/catch` 로 고정 토큰만 내고 합성 표지 든 깨진 JSON 음성을 둔다 |
| 2026-09-23 | HIGH | .claude/plans/ops-doc-reconcile-intake-m6.plan.md | **계획 게이트 라운드 상한 3/3 도달 — receipt 없음.** `id=odr-intake-m6-round-cap-no-receipt`. L2 패널이 R1 4/4 fail(HIGH 11) · R2 4/4 fail(HIGH 4) · R3 4/4 fail(HIGH 4). 판정 `divergent` · 출처 `multi-agent` 로 `review_proof` 가 null 이라 정상 receipt 를 쓸 수 없다(CLAUDE.md mccp 한시 규칙 — `--review-mode` 를 빼고 `--codex-verdict divergent` 만 넣는 우회는 금지). R3 흡수 5건은 **어떤 리뷰도 보지 않았다.** 리뷰 기록 `.claude/reviews/plan-review-ops-doc-reconcile-intake-m6.md` · 판정 원장 `.claude/state/santa-ledger.md`(워크트리 전용, 이력 밖). |
| 2026-09-23 | HIGH | ops/intake/extract-intake.mjs | **한글 부분문자열 경계는 이 창에서 못 고친다 — `크론` ⊂ `크론병` 축.** `id=odr-intake-m6-hangul-boundary-unfixable`. 실측 2026-09-23: 전 축 경계 규칙이 산문 표본 5건의 `reqs_hit` 합을 62 → 17 로 떨어뜨린다(잔존 27%). `i9-claim-audit.docx` 는 6 → 0 인데 그 문서는 Q28 에서 두 리뷰어가 칸을 채운 유일한 문서다. 원인은 `normKey`(`extract-intake.mjs:533`)가 공백을 전부 지워 한글 낱말이 서로 붙는 것이고, 형태소 경계는 분석기가 필요해 INV1 이 막는다. 라틴 전용은 같은 표본에서 62 → 62(잔존 100%). 결과적으로 Q15(스케줄러·주입값)는 진단 기준표에서 계속 1순위다. |
| 2026-09-23 | MEDIUM | .claude/plans/ops-doc-reconcile-intake-m6.gates.sh | **게이트 `#2` 의 잔존율 임계가 두 규칙의 합산에 걸려 인과를 못 가른다 (R3 architect MEDIUM · 미해소).** `id=odr-intake-m6-retention-attribution`. `SUM_N` 은 경계+창이 모두 반영된 합이고 `#3` 은 같은 합의 부분집합(i12)이 내려갈 것을 요구한다. 창 효과의 몫이 측정돼 있지 않아 잔존율이 95% 아래면 「한글 축까지 떨어뜨렸다」로 오귀속한다. 흡수하려면 두 규칙을 따로 끌 수 있는 매개가 필요하고 그것은 생산 코드에 시험용 토글을 넣는 일이다 — 이연. |
| 2026-09-23 | MEDIUM | ops/intake/metrics.mjs | **게이트 `#8` 의 토큰 화이트리스트가 `metrics.mjs:917` 의 엔트리 catch 를 안 본다 (R2 security MEDIUM · 기각 후 회부).** `id=odr-intake-m6-gate8-token-whitelist`. 그 자리는 이미 `err.code` 규약을 지켜 유출이 아니지만(`Halt` 한정으로만 `err.message`), 게이트가 그 준수를 검사하지는 않는다. 토큰이 보간값이라 `grep` 이 못 문다. 열거 의존이 파일 축에서 토큰 축으로 옮겨간 것뿐이다. |
| 2026-09-23 | LOW | .claude/plans/ops-doc-reconcile-intake-m6.gates.sh | **`OPS_SOURCES_ROOT` · `OPS_INTAKE_BUNDLE_ROOT` 가 출력에 안 찍힌다 (R2 security LOW · 미해소).** `id=odr-intake-m6-env-provenance`. `M6_BASE_REF` 는 `#0` 의 `note` 에 남지만 나머지 둘은 안 남아, 어떤 표본을 봤는지 게이트 출력만으로 재구성할 수 없다. |
| 2026-09-23 | HIGH | .claude/plans/ops-doc-reconcile-intake-m6.plan.md | **상한 3/3 에서 divergent receipt 를 봉인했다 — 위 `odr-intake-m6-round-cap-no-receipt` 의 「receipt 없음」 을 철회한다.** `id=odr-intake-m6-cap-sealed-divergent`. 사용자 지시 2026-09-23. 봉인 형식: `--review-mode multi-agent --review-verdict divergent --review-source multi-agent --review-proof-file <손작성>`, `--codex-verdict` 는 **싣지 않았다** — R3 에서 L3 Codex 는 `not fired` 였고(L2 정족수가 먼저 깨짐) Codex 판정을 주장하면 거짓이다. 위조 없이 통과한 근거: `schema.js:533` 의 single-pass 표식 강제 판별자는 `review_source` 가 아니라 `review_proof.layers.l2` 이므로 **proof 에서 `layers` 키를 생략**하면 표식이 요구되지도 허용되지도 않는다(2026-09-22 product-cost 창 선례). 층위 사실(l1 converged · l2 divergent 4/4 fail · l3 not fired)은 proof 의 `note` 와 `dispatch_evidence`(리뷰 기록 · l2.json)로 남겼다. `review_proof.reviewed_plan_hash` 는 **참값을 넣었다** — 057c9ff 가 `gates.sh` 만 고쳐 `plan.md` 는 R2 커밋 이후 불변이고, R3 패널이 읽은 본문과 봉인 본문이 바이트로 같다(`sha256:5b67ebf3…`, DD13 통과). 봉인 결과 실측: `intent_gate_verdict=skipped` · `intent_skip_proof=codex_not_invoked` · `intent_gate_force_override=false` — `write.js` 가 패널 출처를 「Codex 미발화」의 기계적 증거로 읽어 스스로 스탬프했고 감사 우회는 필요하지 않았다. `resolveEffectiveVerdict` → `{verdict:divergent, axis:review}` · `isConvergedVerdict=false` · `isDivergentVerdict=true` · `dedupe.codexConverged=false`·`crossModelConverged=false` → `/mccp:pr` 에서 PR-Codex 발화. `resolution.converged=true` 는 write.js 기본값(writer finalized)이며 review 축이 이를 이긴다. **미재검증**: R3 흡수 6건(게이트 `#6` Q15 차단 단언 제거 → `note` 공시만 · 게이트 `#9` PII 토큰 단위 → 줄 단위 전환)은 `gates.sh` 에만 있어 `plan_hash`·`design_doc_hash` 어느 쪽도 결박하지 않으며 어떤 패널도 보지 않았다. 인수처: M6 구현 창 — `#6`·`#9` 를 게이트 완주로 먼저 증명한다. |
| 2026-09-23 | HIGH | (mccp 본체) | **`/mccp:plan` 5.2z 의 round-cap 산문이 런너에 구현돼 있지 않다 — codex 모드 재진입으로는 상한에서 receipt 가 나오지 않는다 (2026-09-23 실측).** `id=mccp-plan-codex-roundcap-prose-runner-mismatch`. 명령 본문은 `round-cap-reached` 를 「Recording the divergence and proceeding」 으로 적고 `CODEX_VERDICT="divergent"` 매핑을 싣되, 그 블록 자신이 "retained only to document the mapping the runner applies" 라고 선언한다. 런너에 그 분기가 없다. 실측 3단: 1) `codex-invoke.js:458` 의 상한 봉투는 `{ok:true, stdout:"", classification:"round-cap-reached"}` 로 `result` 키가 없다. 2) `codex-review-payload.parseReviewPayload(그 봉투)` → `null`, `deriveGateVerdict` → `unavailable`(`divergent` 아님) — 직접 실행 확인. 3) `plan-codex-runner.js:436-441` 이 payload null 을 `finish(EX_BLOCKED, verdict:'incomplete')` 로 닫고 `finish` 는 `:741` 에서 marker 만 쓴다(주석: "a blocked run has no receipt to seal"). 결과: 상한 도달 뒤 codex 모드로 바꿔도 `[MCCP-INTENT-GATE-STOP] incomplete` 로 재차 막히고, CLAUDE.md mccp 한시 규칙의 「codex 모드는 `codex_verdict='divergent'` 로 쓴다」 는 **자동 경로가 아니라 수동 write 를 뜻한다.** 인수처: 상류 환류(CLAUDE.md §0 B5) — mccp 이슈에 실측으로 제기한다. |
| 2026-09-23 | HIGH | .claude/plans/ops-doc-reconcile-intake-m6.gates.sh | **게이트 `#3`·`#4`·`#9` 가 한 번도 성공할 수 없는 상태로 커밋돼 있었다 — M6 구현 창에서 실측으로 드러나 흡수했다.** `id=odr-intake-m6-gate-entry-guard-unrunnable`. `node --input-type=module -e '…' "$XI" …` 형태는 모듈 경로를 `process.argv[1]` 로 만들고, `extract-intake.mjs` 와 `check-statements.mjs` 의 `IS_ENTRY`(실경로 비교)가 참이 되어 모듈이 라이브러리가 아니라 CLI 로 돌다 `OPS_INV_USAGE` 로 죽는다. 실행 확인 2026-09-23: `#3 MAXNORM=[OPS_INV_USAGE 모르는 인자 (…/i9-claim-audit.docx)]` · `#4 CF=[OPS_INV_USAGE 모르는 인자 (512)]` · `#9 PII=[usage: check-statements.mjs {…}]`. 세 블록 모두 `2>/dev/null` · `|| true` · `|| echo "? ? 실행실패"` 로 실패를 삼켜 「실행실패」한 토큰으로만 남았고, `#3` 은 빈 `MAXNORM` 탓에 `[ : integer expression expected` 가 사유를 가렸다. **호출 형태만** 고쳤다(경로를 환경변수로) — 단언은 한 줄도 바꾸지 않았다. 파일을 텍스트로만 읽는 `node -e` 자리(`#2`·`#5`·`#6`·`#7`)는 모듈을 실행하지 않아 해당 없다. 교훈: 계획 게이트의 「음성 케이스 실행 확인」 주석이 이 세 블록에 달려 있었는데도 양성 경로가 도는지는 아무도 안 봤다. |
| 2026-09-23 | HIGH | .claude/plans/ops-doc-reconcile-intake-m6.gates.sh | **게이트 `#0` 이 구현 창 안에서 구조적으로 공허하다 — 같은 창에서 흡수했다.** `id=odr-intake-m6-gate0-vacuous-in-window`. 구판은 `git diff BASE..HEAD` 라 커밋된 범위만 봤는데 `/mccp:prp-implement` Phase 4 VALIDATE 는 커밋 **전**에 돌아 그 diff 가 비어 있고 `outside=0` 이 무조건 나왔다. 「면제 목록 밖 `ops/` 변경 0건」 이라는 Acceptance 항목이 창 안에서는 증명되지 않았다는 뜻이다. 작업본(`git diff BASE -- ops/`)과 미추적 파일의 합집합으로 넓혔다. |
| 2026-09-23 | MEDIUM | ops/intake/extract-intake.mjs | **`SCORE_WINDOW` 가 원칙이 아니라 게이트 `#2` 의 합산 임계에 눌려 2400 이 됐다 — 위 `odr-intake-m6-retention-attribution` 의 실측 비용이 확정됐다.** `id=odr-intake-m6-window-pinned-by-conflated-gate`. 실측 2026-09-23(표본 8건 × 21문항, 기준선 합 107): 라틴 경계만 106(99%) · 창만 `W`=400 이면 100(93%) · 두 규칙 `W`=400 이면 99(**92%, `#2` 불통과**) · 두 규칙 `W`=2400 이면 103(96%). 원칙이 주는 하한은 정상 문서 최장 행 322 이고 상한은 창이 발화를 멈추는 3,400 이므로 원칙만으로는 400 이 옳다 — 그 값이 접힌 문서의 오탐을 16 → 9 로 지운다(2400 은 16 → 13). 즉 **더 옳은 값을 게이트가 막는다**. 흡수하려면 `scoreRows` 에 기본값 있는 창 매개를 두고(선례 `census.mjs` `rankAndAllocate(scored, questions, capQ = CAP_PER_Q, capT = CAP_TOTAL)`) 게이트 `#2` 가 자식 프로세스가 아니라 라이브러리로 불러 경계 축을 따로 재야 한다. 이 창의 범위 밖 — 이연. |
| 2026-09-23 | LOW | ops/intake/extract-intake.mjs | **라틴 낱말 경계의 문자류에 비ASCII 글자가 없다.** `id=odr-intake-m6-boundary-nonascii`. `WORD_RE` 는 `[0-9a-z_]` 뿐이라 키릴 · 악센트 라틴 · 한글에 붙은 라틴 항목은 여전히 적중이다. 넓히면 한글이 비ASCII라 D3 가 범위 밖으로 선언한 한글 축이 되살아나므로 의도적으로 뺐다. 따르는 사각 둘: 1) 비ASCII 인접 오탐이 남는다, 2) 문서 문구를 만질 수 있는 사람이 항목 옆에 낱말 문자 하나를 끼워 진짜 적중을 죽일 수 있다(이 파이프라인이 사람이 실제로 열 문서를 고르므로 선별 회피 각도다 — M6 보안 리뷰 F10). 한글 축과 함께 풀어야 하는 문제다. |
| 2026-09-23 | MEDIUM | .claude/plans/ops-doc-reconcile-intake-m6.plan.md | **`odr-intake-m6-cap-sealed-divergent` 의 「미재검증」 인수처를 이행했다.** `id=odr-intake-m6-r3-absorptions-verified`. 상한 3/3 봉인 당시 R3 흡수 6건(게이트 `#6` 의 Q15 차단 단언 제거 → `note` 공시만 · 게이트 `#9` 의 PII 판정을 토큰 단위 → 줄 단위)이 `gates.sh` 에만 있어 `plan_hash` 가 결박하지 않고 어떤 패널도 보지 않은 채 남아 있었다. M6 구현 창에서 게이트를 실번들로 완주해 둘 다 실행으로 증명했다 — `#6` 은 `q15_rank1` 을 공시만 하고 차단하지 않으며(한글 축이라 D3/D9 범위 밖), `#9` 의 줄 단위 판정은 M6 절에서 적중 0 · 해시 제외 0 으로 돌았다. 다만 `#9` 는 여전히 **이름을 증명하지 않는다**(패턴만 문다) — 그 한계는 findings M6 절에 명시로 남겼다. |
| 2026-09-23 | MEDIUM | ops/intake/census.mjs | **`scored_high_unanswered` 는 정본이 아니라 하한이다 — 로컬 리뷰 HIGH-1 흡수 뒤 남는 설계 타협.** `id=odr-intake-m6-gap-high-weaker-predicate`. 도구의 「채웠다」는 `review.lock` 만 보고 진술 인용 유무로 판정하는데, 정본 `metrics.mjs` `judgeAnswer` 는 그 진술 중 하나가 `confidence='stated'` 일 것을 더 요구한다(`statements.jsonl`). 약한 정의가 교집합을 넓혀 「교집합 0」을 더 어렵게 만들므로 게시값 ≤ 정본값이다. 초판 주석은 두 정의가 **같다**고 적었고 그것이 거짓이었다 — 주장을 하한으로 바꾸고 게이트 `#7` 이 두 축을 다 내어 방향을 실측으로 물게 했다(음성 2종 실행 확인: 약한 축을 뒤집으면 `약=4 정본=3` exit 1, 넷째 입력 부재면 exit 1). **정본 자체로 올리지 않은 이유**: 이 계수의 입력을 `review.lock` 하나로 묶어 두기 위해서다. 올리려면 `census.mjs` 가 `statements.jsonl` 을 들여야 하고, 인용 id 가 부재일 때의 fail-closed 분기 · 음성 · 드리프트 면이 함께 생긴다. 2026-09-23 표본에서 두 값은 3 으로 같다 — 충돌 없고 비지 않은 칸 7개가 전부 `stated` 를 인용한다. 말뭉치에 `inferred` 17건이 있으므로 갈리는 날이 오면 게이트가 먼저 운다. 이연. |
| 2026-09-23 | LOW | ops/intake/metrics.mjs · ops/intake/extract-intake.mjs | **엔트리 catch 가림 형태가 두 자리만 `err.token` 을 안 탄다 (로컬 리뷰 MEDIUM-2 잔여).** `id=odr-intake-m6-entry-catch-token-inconsistent`. M6 이 닫은 6곳은 `code` → `token` → `name` 순의 닫힌 집합을 싣는데, `metrics.mjs:922` 와 `extract-intake.mjs:806` 은 여전히 `code` → `'internal'` 뿐이라 저장소가 의도적으로 던지는 `Halt`·`OpsFail` 류의 토큰이 `internal` 로 접힌다. 유출은 아니고 분류력만 잃는다. `metrics.mjs` 는 이 창의 게이트 `#0` 면제 목록 **밖**이라 여기서 못 고친다 — 범위 게이트를 깨지 않으려면 별도 창이 필요하다. 이연. |
| 2026-09-23 | MEDIUM | ops/**/*.mjs (안쪽 catch 31곳) | **안쪽 catch 의 `message` 가 그대로 남아 있다 — M6 Acceptance 가 약속한 등재를 이행한다.** `id=odr-intake-m6-inner-catch-message`. M6 은 **엔트리** catch 6곳만 `err.code || err.token || err.name` 으로 닫았고(계획 NOT Building 「안쪽 catch 의 `err.message` — 엔트리 catch 6곳만 닫는다. 나머지는 backlog 로 남긴다」), findings `R-INTAKE-M6-3` 도 같은 문장을 적었다. 그런데 **등재가 실제로 없었다** — 2026-09-23 검토에서 grep 으로 확인했고 계획 Acceptance 의 해당 항목이 `(미검증)`·사람 확인으로 접혀 있어 거짓인 채였다. 실측 자리 31곳(주석 줄·node_modules 제외, `err`·`e`·`error` 세 이름 전부): ops/cells/check-cells.mjs:169 ops/cells/check-cells.mjs:703 ops/cells/check-cells.mjs:755 ops/cells/extract-cells.mjs:1037 ops/cells/extract-cells.mjs:240 ops/cells/extract-cells.mjs:2472 ops/cells/extract-cells.mjs:2478 ops/cells/extract-cells.mjs:2483 ops/cells/extract-cells.mjs:2490 ops/cells/extract-cells.mjs:2553 ops/cells/extract-cells.mjs:2563 ops/cells/extract-cells.mjs:2646 ops/cells/extract-cells.mjs:2677 ops/cells/extract-cells.mjs:2759 ops/cells/extract-cells.mjs:2761 ops/cells/extract-cells.mjs:2797 ops/cells/extract-cells.mjs:2824 ops/cells/extract-cells.mjs:2945 ops/cells/spike-m0-style-axis.mjs:1710 ops/cells/spike-m0-style-axis.mjs:245 ops/cells/spike-m0-style-axis.mjs:582 ops/db/lib/selftest.mjs:182 ops/db/lib/selftest.mjs:197 ops/db/lib/selftest.mjs:206 ops/db/normalize-db.mjs:128 ops/db/normalize-db.mjs:173 ops/db/normalize-db.mjs:199 ops/intake/metrics.mjs:921 ops/reconcile/db-probe.mjs:287 ops/reconcile/db-probe.mjs:302 ops/reconcile/db-probe.mjs:456. 표면 상한은 V8 이 `JSON.parse` 오류에 싣는 **입력 발췌 약 10자**이고(실측 `Unexpected token '홍', "홍길동_진료…" is not valid JSON`), 입력이 `{` 로 시작하면 위치만 나온다. fs 오류는 절대경로를 통째로 싣는다. 고치는 창은 각 파일의 소유 PRD 다 — M6 면제 범위 밖이라 이 창에서 못 연다. 인수처: ops-10 · ops-30 · ops-40 을 여는 다음 창 |
| 2026-09-28 | MEDIUM | .claude/plans/ops-doc-reconcile-intake-m5.gates.sh | **키워드 사전 형상의 정본 검사(M5 게이트 `#1`)가 런타임 바닥보다 느슨해졌다 — `\|` 를 모른다 (로컬 code-review MEDIUM-1 흡수분의 이연).** `id=odr-intake-m6-kw-shape-gate-runtime-split`. 2026-09-28 로컬 리뷰에서 `parseKeywords` 에 `!p.includes('\|')` 를 넣었다 — `normKey`(`ops/intake/extract-intake.mjs:540`)가 라틴 낱말 사이 공백 자리에 넣는 구분자를 항목이 담으면 `a\|b` 가 본문 `a b`·`A \| B` 와 적중해 공백 규칙을 우회한다(실측 `R(['a b'],[['a\|b']])=1`, selftest `boundary` 8번째 팔). 그런데 같은 파일 주석이 「사전 형상의 정본 검사는 게이트 `#1`」 이라 선언하는 그 게이트 (`.claude/plans/ops-doc-reconcile-intake-m5.gates.sh:191` 의 `norm` 사본 — `NFKC · lowercase · \s+ 제거`)는 `\|` 를 모른다. 실행 대조 2026-09-28: 같은 입력 `a\|b` 에 게이트 판정 `term_shape_bad 0`(통과) · 런타임 `parseKeywords` → null (`OPS_INV_USAGE keywords 형상이 계약 밖이다`). 방향은 fail-closed 라 손상은 없고, 지금은 같은 게이트의 동결 리터럴(`literal_mismatch 0`)이 사전 편집 자체를 막아 노출이 닫혀 있다 — 현 사전 367항목에 `\|` 는 0건. **사전을 다시 여는 창이 그 리터럴을 재동결하는 순간 열린다**: 정본 게이트는 초록인데 파이프라인이 못 도는 사전이 통과한다. M5 게이트를 지금 고치지 않는 이유: 닫힌 마일스톤의 게이트 본문을 바꾸면 그 안에 기록된 음성·양성 실행 확인 주석(2026-09-22)이 무효가 된다. 조치안: 게이트가 `norm` 사본을 갖지 말고 `parseKeywords` 를 import 한다 — 정의가 하나로 줄어 이 축이 다시 갈릴 자리가 없어진다. `parseKeywords` 는 이미 `export` 이고, 같은 게이트가 `check-statements.mjs` 의 `piiHit` 를 동적 import 하는 선례가 그 배선을 이미 갖고 있다. 인수처: 키워드 사전을 다시 여는 마일스톤(M7 이후) |
| 2026-09-28 | HIGH | ops/intake/census.mjs | **전개 실패 분기만 즉시 회수를 건너뛴다 — 형제 두 실패 경로는 회수한다 (PR-Codex R1 HIGH, confidence 0.98).** `id=odr-intake-m6-expand-fail-no-discard`. `expand()` 의 세 실패 경로 중 `extractArchive` 실패(`:303`)만 `discard(sub)` 없이 `return 'archive-unreadable'` 한다. 형제인 `treeBytes` 실패와 예산 초과는 둘 다 `discard(sub)` 를 부른다 — 비대칭이 코드에 그대로 보인다. 부분 전개물이 `ctx.tmpdirs` 로만 등록돼 **build 종료 시점까지** 남고 `inflatedTotal` 에는 들지 않으므로, 실패한 zip 여러 개가 누적 상한(`maxTotalInflated`)을 우회하고 뒤따르는 정상 파일을 디스크 부족으로 떨어뜨릴 수 있다. 이 축은 이미 같은 계열 사고를 냈다 — 2026-09-23 게이트 동시 실행으로 `/tmp/ops-census-*` 가 96GiB 디스크를 100% 로 채웠다(M6 notes). 조치안: 그 분기에도 `discard(sub)` 를 넣고, 회수 실패 시 `LIVE_TEMPS` 추적을 유지해 종료 시 재시도가 성립하게 한다. 반사실은 전개 실패를 강제한 zip 2개 연속 처리로 잡는다(수정 전 잔존 · 수정 후 0). 이 창은 `/mccp:pr` 이라 review-only 이고, 고치는 창은 M6 면제 범위 안(`ops/intake/census.mjs`)이라 같은 축에서 연다 |
| 2026-09-28 | HIGH | ops/intake/census.mjs | **선언 크기를 축소한 zip 은 여전히 전개 **뒤**에만 잡힌다 — 사전 거름 2축을 더해도 남는 사각 (PR-Codex R2 HIGH 의 이연분, confidence 0.99).** `id=odr-intake-m6-inflate-cap-post-write`. R2 흡수로 전개 **전** 방어가 둘 생겼다: 1) `inspectArchive` 에 `min(단일 상한, 남은 누적 예산)` 을 넘겨 선언값이 정직한 zip 이 누적 예산을 넘긴 상태로 먼저 전개되는 자리를 닫았고, 2) 쓰기 전 `statfsSync` 로 전개 자리 여유가 그 최대치보다 작으면 시작하지 않는다. 그래도 **선언값이 거짓인 zip**(실측 선례: 선언 1바이트 / 실제 4096바이트 / `unzip` rc 0 무경고 — 2026-09-18)은 종전대로 전개가 끝난 뒤 `treeBytes` 가 잡는다. 그 사이 임시 파일시스템이 채워지면 동시에 도는 다른 작업이 ENOSPC 로 떨어진다(실현 선례: 2026-09-23 게이트 동시 실행 96GiB 만재). 완전 방어는 **전개 중 출력 바이트 제한** — `unzip -qq -d` 일괄 전개를 스트리밍(`unzip -p` 엔트리별 + 바이트 카운팅)으로 바꿔야 하고, 그러면 도구 핀(`tools.lock`) · 관측 자식 호출 형상 · 심링크·권한 처리(`relaxTree`)가 함께 바뀐다. PRD UI3(「재설계하지 않는다 — 층 분리 · 앵커 결박 · stale 원장을 유지하고 입력만 넓힌다」)와 정면으로 충돌하므로 이 창에서 열지 않는다. 지금 남은 위험의 크기: 전개 자리 여유가 `cap`(≤4GiB) 이상일 때만 전개가 시작되므로 단일 아카이브의 초과분은 그 여유 안에서만 자라고, R1 수정으로 실패 시 즉시 회수된다. 인수처: 전개기를 여는 다음 마일스톤(M7 이후) 또는 quota 파일시스템 도입 |
| 2026-09-21 | HIGH | .claude/plans/ai-insight-payload.plan.md | **롤백 검사가 토글을 켤 수 없는 층에 있다 (plan-gate R3 L2 architect/1 · test/1 · invariant/1 — 세 렌즈 동일 지적).** R2 흡수(A3)로 토글 `DDX_INSIGHT_PAYLOAD_LEGACY` 를 서비스 층으로 옮겼는데(Task 6, `.claude/plans/ai-insight-payload.plan.md:131`) 그 검사 `legacy-flag-restores-m2-bytes` 는 매퍼 spec `insight-payload.spec.ts` 에 남겼다(Task 8 `.claude/plans/ai-insight-payload.plan.md:156` · 게이트 `#2` must-list · 게이트 `#9` `.claude/plans/ai-insight-payload.plan.md:338`). 순수 매퍼 spec 은 env 를 못 읽고 `getInsight` 를 돌리지 않으므로, 서비스가 플래그를 무시하거나 자동차보험을 계속 병합해도 초록이다. 이연 사유: 라운드 상한(3/3) 도달로 재검증 불가 — 흡수하면 어떤 리뷰어도 보지 않은 판본이 된다. 해소: 검사를 `analyze.service` 층 spec 으로 옮기고 env 를 켠 상태에서 `getInsight` 를 돌려 m2 바이트와 비교한다. 인수처: ai-insight-payload R4 판본(착수 전) · id=aip-r3-rollback-test-wrong-layer |
| 2026-09-21 | HIGH | .claude/plans/ai-insight-payload.plan.md | **자동차보험 병합을 끄는 주체가 없다 (plan-gate R3 L2 architect/2).** Task 1 이 `tt_treat_car_basic` 병합·정렬을 저장소 `findInsightTreatments(oddId)` 안에 두는데(`analyze.service.ts:1270` 은 인자 1개), Task 6 은 서비스 토글이 그 병합을 끈다고 쓴다(`.claude/plans/ai-insight-payload.plan.md:131`). 저장소 인자 추가·함수 분리·서비스 사후 필터 중 무엇인지 계획이 정하지 않았고, 사후 필터라면 거를 기준인 `insurance_type` 이 바로 토글이 버리는 필드다. 이연 사유: 상한 도달. 해소: 저장소에 `{ includeCarInsurance }` 인자를 명시하고 서비스가 토글로 넘긴다. 인수처: R4 판본 · id=aip-r3-car-merge-owner |
| 2026-09-21 | HIGH | .claude/plans/ai-insight-payload.plan.md | **모호한 조제행을 뺀 뒤 0건을 「병원」으로 확정한다 (plan-gate R3 L3 Codex C1).** Task 3 규칙 1이 둘 이상의 진료에 붙는 조제행을 양쪽에서 제외하고, 규칙 2가 남은 매칭 0건을 `병원` 으로 확정한다(`.claude/plans/ai-insight-payload.plan.md:88`). 같은 날 두 병원이 같은 약을 처방하고 약국에서 조제했으면 귀속 불명이 **병원 조제 사실**로 바뀌어 제공자에 오정보가 간다. 같은 Task 가 요구한 `dispensed-by-omitted-when-pharmacy-row-is-ambiguous` 검사의 키 생략 규약과도 모순이다. 이연 사유: 상한 도달. 해소: 모호 조제행이 하나라도 걸린 진료는 매칭 수와 무관하게 `dispensed_by` 키를 내지 않는다. 인수처: R4 판본 · id=aip-r3-ambiguous-becomes-hospital |
| 2026-09-21 | HIGH | .claude/plans/ai-insight-payload.plan.md | **조회 사이에 만료 삭제가 끼면 지워진 내역을 「진짜 없음」으로 보낸다 (plan-gate R3 L3 Codex C2).** Task 6 은 진료를 먼저 읽고 세부내역·처방을 별도 조회로 읽는다(`.claude/plans/ai-insight-payload.plan.md:131`). 그 사이 `treat.repository.ts:444-468` `deleteExpiredData` 트랜잭션이 커밋하면 메모리에는 진료가 남고 후속 조회는 비어 `[]` 가 된다. 삭제가 트랜잭션이어도 읽기 전체가 한 스냅샷이 아니다. 따라서 「만료는 항상 진료 0건으로 반환된다」 전제가 경계에서 무너진다. 이연 사유: 상한 도달. 해소: 읽기를 한 트랜잭션(REPEATABLE READ)으로 묶거나, 주문 경과일이 29일 이상이면 신규 축을 싣지 않는다. 인수처: R4 판본 · id=aip-r3-expiry-toctou |
| 2026-09-21 | HIGH | .claude/plans/ai-insight-payload.plan.md | **strict env 파싱의 위험 방향을 검사하지 않는다 (plan-gate R3 L2 test/2 · invariant/3).** Task 6 은 정확히 `'1'`/`'true'` 만 켜고 미설정·빈 값·`'false'`·`'0'`·오타는 전부 꺼짐이라 쓴다(`.claude/plans/ai-insight-payload.plan.md:131`). 필수 이름 11건 어디에도 파싱 방향 검사가 없어, 비어 있지 않은 값을 전부 켜짐으로 읽는 느슨한 파서도 모든 게이트를 통과한다. 이연 사유: 상한 도달. 해소: 파서를 함수로 떼고 7값 표(미설정·''·'0'·'false'·'FALSE'·'1'·'true')로 단언하는 검사를 필수 이름에 올린다. 인수처: R4 판본 · id=aip-r3-toggle-parse-untested |
| 2026-09-21 | MEDIUM | .claude/plans/ai-insight-payload.plan.md | **서비스 비0건 경로의 배선을 보는 검사가 없고, 라우트 spec 은 0건 경로에서 notices 호출을 기대한다 (plan-gate R3 L2 test/3).** `analyze-insight-route.spec.ts:151` 은 `treatments: []` 로 돌고 `:176-179` 가 `['findInsightTreatments:41','findInsightNotices:41']` 를 기대한다. 새 조립(Task 6)은 0건이면 notices 도 부르지 않으므로 그 단언이 깨지고, 조회 순서·`all`(allSettled 아님)·토글 시 생략을 보는 검사는 이름으로 걸려 있지 않다. 이연 사유: 상한 도달. 해소: 비0건 경로 서비스 spec 을 신설해 호출 순서·실패 전파·토글 생략을 단언하고, 라우트 spec 의 0건 기대를 새 순서로 고친다. 인수처: R4 판본 · id=aip-r3-service-wiring-untested |
| 2026-09-21 | MEDIUM | .claude/plans/ai-insight-payload.plan.md | **게이트 `#9` 의 「m2 외부 기준 결박」 은 착수 전부터 충족된다 (plan-gate R3 L2 invariant/2).** `.claude/plans/ai-insight-payload.plan.md:338` 는 매퍼 spec 에 m2 fixture 파일명이 있는지만 grep 하는데, 기존 `request-is-byte-stable` 이 이미 그 파일을 읽는다. 두 신규 검사가 m2 바이트와 비교하는지는 보지 못한다. 이연 사유: 상한 도달. 해소: 두 검사 본문 안에서 m2 를 읽는지를 검사 단위로 확인하거나, 두 검사의 기대값이 m2 expected 와 바이트 동일함을 게이트가 직접 재생한다. 인수처: R4 판본 · id=aip-r3-gate9-presatisfied |
| 2026-09-21 | MEDIUM | .claude/plans/ai-insight-payload.plan.md | **진단 서명이 같은 파일·같은 코드의 신규 오류를 숨기고, 앵커가 기준선 내용을 동결하지 않는다 (plan-gate R3 L3 Codex C3 · C4).** 게이트 `#1`(`.claude/plans/ai-insight-payload.plan.md:184`)의 서명이 `파일\|TS코드` 라 기존 TS2322 가 있는 파일에 다른 TS2322 를 더해도 신규 0건이다(Codex 가 함수를 직접 실행해 반례 확인). R2 INV2 흡수(줄 밀림 제거)가 과하게 접었다. 또 `anchor_commit` 이 HEAD 의 조상인지만 보고 `signatures` 는 워킹트리 JSON 을 신뢰해, 앵커를 둔 채 서명을 더하면 재동결 기록 없이 통과한다. 이연 사유: 상한 도달. 해소: 서명에 메시지 정규화 해시를 포함하고, 기준선에 `anchor_commit` 에서 산출한 서명 집합의 digest 를 함께 적어 게이트가 대조한다. 인수처: R4 판본 · id=aip-r3-tsc-signature-granularity |
| 2026-09-21 | MEDIUM | .claude/plans/ai-insight-payload.plan.md | **약국 제외와 요청·응답 수술 표기 일치가 소스 정규식·주석에만 걸려 있다 (plan-gate R3 L2 test/4 · architect/3).** 게이트 `#5`(`.claude/plans/ai-insight-payload.plan.md:280`)는 두 컬럼의 `notLike` 를 소스 텍스트로만 찾고, 자동차보험 표에 약국 행을 흘려 보는 저장소 검사가 없다. Task 4 의 「응답 축 `findInsightProcedures` 의 `min` 접기를 그대로 따른다」 는 함수 주석뿐이고 두 방향을 비교하는 검사가 없다. 이연 사유: 상한 도달. 해소: 저장소 spec 에 약국 행 주입 사례를 두 표 각각 추가하고, 수술 표기를 공용 헬퍼로 뽑아 두 조회가 같은 함수를 부르게 한다. 인수처: R4 판본 · id=aip-r3-regex-and-comment-contracts |
| 2026-09-21 | LOW | .claude/plans/ai-insight-payload.plan.md | **계획서 절대 경로와 `#3` 자유 문자열 키 목록의 사각지대 (plan-gate R3 L2 security/1 · security/2 — security 렌즈는 pass).** 계획서가 `/home/madsc/...` 절대 경로로 사용자명·디렉터리 구조를 싣는다(환자 데이터 아님). `#3` 은 고정 키 목록만 보아 `tests[].category`·`dispensed_by` 등 목록 밖 키의 실값은 통과한다 — Acceptance 는 어휘 쪽 `(미검증)` 만 공시했다. 이연 사유: LOW · 상한 도달. 해소: 경로를 저장소 상대·환경변수로 바꾸고, `#3` 을 문자열 값 전수 순회로 넓히거나 키 목록 밖 사각지대를 출력에 공시한다. 인수처: R4 판본 · id=aip-r3-abs-path-and-key-blindspot |
| 2026-09-21 | ABSORBED(R4 판본 · 미재검증) | .claude/plans/ai-insight-payload.plan.md | **위 `aip-r3-*` 10행(13건)을 R4 판본에 반영했다 — 2026-09-21 사용자 지시.** 라운드 상한 3/3 이후의 반영이라 어떤 리뷰어도 아직 보지 않았다. 롤백 검사는 서비스 층 spec 으로, 자동차보험 병합의 주인은 `findInsightTreatments(oddId, { extended })` 로, 모호 조제행은 키 부재로, 만료 경쟁은 `repeatable read` 한 스냅샷으로, 토글 파싱은 8값 표로, tsc 서명은 메시지 포함 다중집합 + 커밋된 기준선으로, 게이트 `#9` 는 it 블록 본문 검사로, `#3` 은 문자열 값 전수로 바꿨다. 반영 중 R3 판본의 회귀 1건(0건 뷰가 싣는 `notices` 를 0건에서 생략)을 함께 되돌렸다. 게이트 10종은 모사 상태에서 전건 통과·음성 37종 관찰. 재검증: 다음 세션 plan 게이트 · id=aip-r3-absorbed-r4 |
| 2026-09-21 | HIGH | .claude/plans/ai-insight-payload.plan.md | **자동차보험 세부내역을 읽지 않아 `[]`(진짜 없음)로 보낸다 (plan-gate R4 원장 밖 Codex F1 · 코드 확인).** Task 2 가 `tt_treat_car_basic` 을 병합하는데 Task 3 은 `tt_treat_detail` 만 읽는다. 수집기 `createCarTreat` 는 자동차보험 세부내역을 `tt_treat_car_detail` 에 따로 쓴다(`insuniverse-server/apps/api/src/modules/treat/treat.repository.ts:440` · 스키마 `insuniverse-server/drizzle/schema.ts:2229`). `analyze.repository.ts:484` 는 이미 그 표를 읽는다. 자동차보험에만 검사·처치가 있으면 실자료가 있는데 `[]` 로 가고, 같은 날·같은 기관에 건강보험 내역이 있으면 3키 결합이 다른 보험의 내역을 붙인다. 이연 사유: 라운드 상한(3/3) 뒤 원장 밖 1라운드이고, 2026-09-21 사용자 지시로 계획서에 흡수하지 않고 divergent 로 봉인했다. 해소: 같은 `tx` 에서 `tt_treat_car_detail` 도 읽고 결합 키에 보험 출처를 넣는다. 자동차보험 전용 내역과 같은 날·같은 기관 양 보험 내역을 가르는 저장소 spec 을 필수 이름에 올린다. 인수처: ai-insight-payload 구현 창 착수 전 · id=aip-r4-car-detail-unread |
| 2026-09-21 | HIGH | .claude/plans/ai-insight-payload.plan.md | **약품명이 빈 조제행은 후보에 안 걸려 매칭 0건이 「병원」으로 확정된다 (plan-gate R4 원장 밖 Codex F2 · 규칙 도출 반례, 운영 발생 미관측).** Task 4 규칙 4 의 「하나도 짝이 없으면 `병원`」 은 매칭 부재를 병원 조제의 증거로 쓴다. `trpDrugName` 은 nullable(`insuniverse-server/drizzle/schema.ts:2279`)이고 수집기가 약품명 부재를 `''` 로 저장한다(`insuniverse-server/apps/api/src/modules/treat/treat.repository.ts:117-119`). 같은 날 약국 `처방조제` 행의 약품명이 비면 조제 사실이 있어도 후보·모호성 검사를 지나쳐 병원으로 오판정된다. 이연 사유: 위와 같다. 해소: 매칭 부재만으로 `병원` 을 확정하지 않는다 — 명시적 병원 조제 근거가 없으면 키를 생략한다. 약품명 null·`''` 조제행과 미매칭 사례에서 `병원` 으로 강등되지 않는 저장소 spec 을 둔다. 인수처: 구현 창 착수 전 · id=aip-r4-empty-drugname-becomes-hospital |
| 2026-09-21 | MEDIUM | .claude/plans/ai-insight-payload.plan.md | **게이트 `#9` 가 다른 검사의 동명 지역 변수를 m2 참조로 인정한다 (plan-gate R4 원장 밖 Codex F3 · Codex 반례 실행 확인).** `#9` 는 `const X = …m2…` 선언을 파일 전역에서 모은 뒤 대상 it 블록에 변수명만 있으면 통과시켜 선언 스코프를 잃는다. 기존 `request-is-byte-stable` 에 m2 경로를 담은 지역 `fixturePath` 가 있다(`insuniverse-server/apps/api/src/modules/ddx/insight-payload.spec.ts:27-31`) — 신규 검사가 자기 `fixturePath` 를 다른 fixture 로 선언하고 자기 기대값과 비교해도 초록이다. `#2` 도 통과·단언 수만 보므로 R3 `aip-r3-gate9-presatisfied` 가 완전히 닫히지 않았다. 이연 사유: 위와 같다. 해소: 식별자 매칭을 대상 블록 **안** 선언으로 한정하거나(기존 `typescript` 의존의 AST — INV1 상 새 파서는 불가), 게이트가 산출과 m2 expected 를 직접 재생 비교한다. 동명 지역 변수 음성 사례를 기록한다. 인수처: 구현 창 착수 전 · id=aip-r4-gate9-scope-leak |
| 2026-09-22 | HIGH | .claude/plans/ai-insight-payload.plan.md | **응답 축이 보험 출처를 보지 않아 자동차보험 진료가 건강보험 수술·검사 문구를 물려받는다 (implement-gate R2 Codex C2 · conf 0.96 · 코드 확인).** 요청 축은 세부내역을 `(출처, 진료일, 기관)` 으로 갈랐는데 `insuniverse-server/apps/api/src/modules/ddx/insight-view.ts` 의 `procedureOf` 는 `(진료일, 기관, 상병코드)` 3키만 본다. 이 창이 자동차보험 행을 요청에 넣으면서, 같은 3키를 갖는 건강보험 진료의 `examination`·`operation` 문구가 자동차보험 행에 붙을 수 있다. 이연 사유: `insight-view.ts` 는 계획서 `## NOT Building`(UI9 — ddx 응답 처리 변경 제외)이 명시적으로 뺀 파일이라 이 창에서 고치면 범위 게이트가 어긋난다. stg 자동차보험 수집 0건이라 현재 실데이터 도달 불가이며 Acceptance 가 그 축을 `(미검증)` 으로 공시한다. 해소: 되맞춤·처치 조회에 보험 출처를 실어 보내거나, 매칭된 자동차보험 행에 건강보험 분석축 보강을 금지한다. 같은 (진료일·기관·상병)에 건강보험 수술 1건·자동차보험 1건을 두는 충돌 검사를 필수 이름에 올린다. 인수처: ai-insight-payload PR 전 또는 별건 · id=aip-impl-r2-car-evidence-crosstalk |
| 2026-09-22 | ABSORBED(구현 창 · 코드로) | .claude/plans/ai-insight-payload.plan.md | **`aip-r4-car-detail-unread` · `aip-r4-empty-drugname-becomes-hospital` 두 HIGH 를 계획서가 아니라 구현으로 흡수했다 (2026-09-21 사용자 지시 「구현 창 착수 전 흡수」).** 전자: 자동차보험 세부는 `tt_treat_car_detail` 에서 읽고 세부 열쇠에 보험 출처를 넣어 두 표가 섞이지 않는다(`readInsightCarDetails` · `insightDetailKey`). 후자: 약품명이 빈 `처방조제` 행이 있는 날은 그날 모든 처방 묶음이 `dispensed_by` 키를 내지 않는다(`resolveInsightDispensedBy` 의 `unnamedDates`) — 매칭 부재를 병원 조제의 증거로 쓰지 않는다. `aip-r4-gate9-scope-leak`(MEDIUM)은 계획서 게이트 본문이라 고치지 않고 남는다. 근거·반사실은 `.claude/notes/ai-insight-payload.md` |
| 2026-09-22 | HIGH | .claude/plans/samsung-account-intake-rowfix.plan.md | **공용 `getExceptionMessage` 가 비 HttpException 원문(`error.message`)을 그대로 돌려, mysql2 원오류가 클라이언트 응답까지 간다 (PR 게이트 security-reviewer, 실측 확인).** `fc-agency.service.ts:2761-2770` 의 `error instanceof Error ? error.message` 분기. 그 값이 `BadRequestException({message, failures})`(`:1635-1642` 최초구독 · `:1744-1751` 구독해지)에 실리고 `AllExceptionFilter` 가 HttpException 응답을 가공 없이 내보낸다(`all-exception.filter.ts`). 두 엔드포인트는 `@Roles('admin','corp')`(`agency-fc-admin.controller.ts:428,481`). 새는 것은 충돌한 아이디·연락처 값, 키·테이블 이름, 접속 오류의 내부 호스트 — drizzle 0.33 이라 `DrizzleQueryError` 가 없고 SQL 은 `.sql` 별도 속성이며 비밀번호는 insert 전 bcrypt 라 §0 비밀값 노출은 아니다. 귀속: stg 가 `failures` 두 자리를, 이 브랜치 `de74fef2` 가 구독해지 최상위 `message` 를 더했고 stg 병합 `a27e5cbd` 가 둘을 합쳤다. 인테이크 `rowFailureReason`(`samsung-intake.service.ts:878-895`)은 "비 HttpException 원문은 버린다" 인데 이 경로는 아래층이 HttpException 으로 감싸 그 규칙을 통과한다. 해소는 공용 함수 한 자리 — 원문은 서버 로그로, 응답에는 고정 문구. `/mccp:pr` 안에서는 수정 금지라 PR 직후 사이클로 이월 — **RESOLVED 2026-09-22: server `b0d8bc8a`(stg #77) · `cbf17534`(prod DRIFT #79) — HttpException 이 아니면 고정 문구를 돌리고 원오류는 서버 Logger 로. 호출처 8곳은 손대지 않고 공용 함수 한 자리로 닫았다. 테스트 `fc-agency-resign-subscribe.spec.ts` 「드라이버 오류는 원문을 응답에 싣지 않고」 — 수정을 걷어내면 그것만 붉고 HttpException 대조군은 초록(반사실 확인)** · id=samsung-pr-s1-raw-exception-text |
| 2026-09-22 | MEDIUM | .claude/plans/samsung-account-intake-rowfix.plan.md | **인테이크 업로드 3개 엔드포인트에 파일 크기 상한이 없다 (PR 게이트 security-reviewer).** `samsung-intake-admin.controller.ts:76,142,185` 의 `FileInterceptor('file')` 에 `limits.fileSize` 가 없고 multer 기본은 무제한, `main.ts` 의 bodyParser 10MB 는 multipart 에 안 걸린다. 파일 전체가 메모리에 올라 CFB·AES 복호화와 exceljs 압축 해제를 탄다. allowlist 관리자 한정이라 방어 심층의 부재 · PR 직후 사이클로 이월 — **RESOLVED 2026-09-22: 같은 커밋 — 세 핸들러가 `IntakeFileInterceptor`(10MB, main.ts JSON 상한과 같음) 하나를 쓴다. busboy 1.6 은 상한에 닿는 순간 잘라 받는 최대는 상한 − 1 바이트(실측). 테스트 두 겹(배선 메타데이터 · 탐침 413)이 각각 다른 회귀를 잡는다(반사실 확인)** · id=samsung-pr-s2-upload-size |
| 2026-09-22 | LOW | .claude/plans/samsung-account-intake-rowfix.plan.md | **`fc-agency.service.ts` 의 `console.log(... failedDetails)` 가 pino redact 를 우회한다 (PR 게이트 security-reviewer).** 최초구독·구독해지 실패 목록을 stdout 으로 바로 찍는다. 싣는 값이 s1 의 원문이라 s1 을 근원에서 고치면 함께 닫힌다 — **RESOLVED 2026-09-22: s1 로 닫혔다 — `failedDetails.reason` 이 고정 문구가 돼 stdout 에 원문이 안 실린다. `console.log` 자체는 stg 기존 관례라 남긴다** · id=samsung-pr-s3-console-log |
| 2026-09-22 | CRITICAL | .claude/plans/samsung-account-intake-rowfix.plan.md | **공용 `Modal.tsx` 에 대화상자 이름·포커스 가둠·초기 포커스·포커스 복귀가 없다 (PR 게이트 a11y-architect, WCAG 4.1.2·2.4.3).** `insuniverse-admin/src/shared/ui/Modal.tsx:55-72` — `role=dialog aria-modal` 에 `aria-labelledby` 없음, 제목 `h6` 에 id 없음, 스크롤 잠금 외 부수효과 없음. 인테이크 반영 확인·좌석 하한 두 모달이 되돌릴 수 없는 동작의 관문인데 키보드 포커스가 배경에 남는다. **기존 공용 컴포넌트이고 이 브랜치 커밋 0건** — 관리자 앱 전체 모달에 걸린 결함이라 이 PR 범위 밖. 사용자 지시(2026-09-22)로 디자인은 기능 완료 후 최종 검토에서 · id=samsung-pr-a1-modal-name-focus |
| 2026-09-22 | CRITICAL | .claude/plans/samsung-account-intake-rowfix.plan.md | **헤더 인테이크 진입 아이콘에 접근 가능한 이름이 없다 (PR 게이트 a11y-architect, WCAG 4.1.2·1.1.1).** `insuniverse-admin/src/features/authority/ui/SamsungIntakeEntry.tsx:36-54` — `<a role="button" title=…>` 에 `aria-label` 없음, 자식 `<i class="fas …">` 에 `aria-hidden` 없음. 이 브랜치 신규 파일 · 기존 `CorpMyPageEntry.tsx` 가 같은 모양이라 관례를 복사했다. 최종 디자인 검토로 이월 · id=samsung-pr-a3-entry-name |
| 2026-09-22 | HIGH | .claude/plans/samsung-account-intake-rowfix.plan.md | **`opacity` 로 흐린 글자가 AA 대비를 못 넘는다 (PR 게이트 a11y-architect, WCAG 1.4.3).** `samsung-intake.css:77-79` `.si-stage.is-waiting{opacity:.55}` — 제목 ≈3.60:1 · 부연 ≈2.11:1. `:877-880` `tr.is-locked{opacity:.6}` — ≈4.23:1 · ≈2.28:1. 둘 다 정보 텍스트라 비활성 컨트롤 면제가 안 맞는다. 계산값이고 렌더 실측 아님 · 최종 디자인 검토로 이월 · id=samsung-pr-a4-opacity-contrast |
| 2026-09-22 | HIGH | .claude/plans/samsung-account-intake-rowfix.plan.md | **단계 전환마다 포커스가 `<body>` 로 떨어진다 (PR 게이트 a11y-architect, WCAG 2.4.3).** 누른 버튼이 자기 부분 트리와 함께 언마운트된다 — `IntakeUploadForm.tsx:159-174` 다시 올리기·열 다시 맞추기, `SamsungIntakePage.tsx:69-77` 다시 시도, `IntakeConfirm.tsx:233-237` 반영 후 결과 교체. 행 편집기(`IntakeRowEditor.tsx:79-84` · `IntakePreview.tsx:884-893`)는 올바르게 하고 있어 그 모양을 따르면 된다. 화면 단축키 안내가 아니라 포커스 이동으로 · 최종 디자인 검토로 이월 · id=samsung-pr-a5-focus-lost |
| 2026-09-22 | MEDIUM | .claude/plans/samsung-account-intake-rowfix.plan.md | **상태 변화 몇 자리가 보조기술에 안 알려진다 (PR 게이트 a11y-architect, WCAG 4.1.3·1.3.1·2.4.11).** 첫 파일 읽기 대기(`IntakeUploadForm.tsx:271-283`, 같은 파일의 재읽기는 `IntakeColumnMap.tsx:240-242` 가 `role=status` 로 한다) · 반영 차단 사유(`IntakeConfirm.tsx:625-627`, 버튼이 disabled 라 탭으로 닿지도 않는다) · 고른 파일명(`:244-246`, LOW). 판정·결과 표의 행 번호가 `<td>`(`IntakePreview.tsx:400` · `IntakeConfirm.tsx:532`, 열 표는 `<th scope=row>`). 고정 반영 막대(`samsung-intake.css:572-576` sticky z-index 5)가 포커스된 행을 가릴 수 있다 — CSS 추론이고 렌더 실측 아님. 최종 디자인 검토로 이월 · id=samsung-pr-a6-status-and-structure |
| 2026-09-22 | HIGH | .claude/plans/ai-insight-payload.plan.md | **짝 지은 약국 조제행이 병원 약의 투약일수를 못 채운다 — 수집기가 빈 값을 0 으로 적는다 (PR-Codex R3 F1).** R2 흡수 `fillInsightDrugsFromPharmacy`(server `5ed5f133`, `analyze.repository.ts:447`)가 `drug.days === null` 일 때만 채우는데, 수집기 `treat.repository.ts:30` `toNum()` 이 빈 `resTotalDosingdays` 를 `0` 으로 저장한다(`:125`). 실데이터의 「병원 일수 없음」은 `0` 이라 채움이 안 돌고 `days: 0`·`prescription_days: 0` 이 나간다. 새 spec 은 `null` 로 써서 수집 표현을 놓쳤다. 같은 0 센티넬이 기존 `prescriptionDays`(`row.dosingDays >= 0`)에도 섞인다. 이연 사유: 라운드 상한(3/3) 도달 — 흡수하면 어떤 리뷰어도 보지 않은 판본이 된다. 해소: 병원 일수 `0` 을 「없음」으로 읽을지 정하고(수집 원본의 빈 값 ↔ 실제 0일 구분 가능 여부 실측 먼저), spec 을 수집 정규화와 같은 표현으로 쓴다. 인수처: ai-insight-payload 후속 · id=aip-pr-r3-zero-dosing-sentinel |
| 2026-09-22 | HIGH | .claude/plans/ai-insight-payload.plan.md | **되맞춤 튜플에 보험 출처가 없어 자동차보험 evidence 가 건강보험 순번을 잡을 수 있다 (PR-Codex R3 F2).** `REJOIN_TUPLE`(`insight-contract.ts:192`)은 `treated_on·disease_code·facility_name·kind·deductible_amt` 뿐이고, 순번은 첫 미사용 후보다(`insight-view.ts:334`). 자동차보험 행은 본인부담이 늘 비므로, 본인부담이 빈 건강보험 행과 나머지 넷이 같으면 두 행이 한 튜플을 공유하고 병합상 건강보험이 앞선다. 자동차보험 진료만 담긴 응답이 건강보험 순번을 받고, R2 가드(`insight-view.ts:342`)는 그 순번의 출처를 믿어 건강보험 문면을 붙인다. R2 spec 은 본인부담을 달리 둬 이 충돌을 안 탔다. 이연 사유: 라운드 상한(3/3) 도달. 해소: 응답이 `insurance_type` 을 돌려주면 후보를 그것으로 거르고, 출처가 끝까지 모호하면 순번과 문면을 비운다. 튜플이 같은 두 보험 행 + 자동차보험만 담긴 응답 반례를 둔다. 응답 처리라 UI9 밖 — 2026-09-22 예외 승인 범위의 연장인지 사용자 확인 필요. 인수처: ai-insight-payload 후속 · id=aip-pr-r3-rejoin-insurance-collision |
| 2026-09-22 | ABSORBED(PR 단계 · Codex 미재검증 · glm approve) | .claude/plans/ai-insight-payload.plan.md | **위 `aip-pr-r3-zero-dosing-sentinel` · `aip-pr-r3-rejoin-insurance-collision` 흡수.** server `d013e18a`(stg #82 · prod #59 `b23b5328`) — 병원 투약일수 `0` 을 빈 칸으로 읽고 채우는 쪽은 `0` 초과만 · 응답 `insurance_type` 으로 되맞춤 후보를 거르고 출처가 섞이면 순번·문면을 비운다. 반사실: 수정 전 소스 stg `180p/2f` · prod `168p/2f`(정확히 새 spec 2건) → 수정 후 182/182 · 170/170. **Codex 라운드 상한 뒤라 Codex 재검증은 없다** — 교차 모델 glm 리뷰 1회 approve(반례 추적, 회귀 없음). |
| 2026-09-22 | LOW | .claude/plans/ai-insight-payload.plan.md | **처방 묶음 `prescriptionDays` 최대값이 투약일수 `0`(수집기의 빈 값)을 값으로 센다 (glm 교차 리뷰 LOW).** `foldInsightPrescriptions`(server `d013e18a` `analyze.repository.ts:397` `row.dosingDays >= 0`)와 `foldInsightPharmacyOnlyDrugs`(`:594`)가 `0` 을 최대값 후보로 넣는다. 병원행 일수가 전부 `0` 이고 조제행 짝이 유일하지 않아 채움이 안 되는 묶음에서 `prescription_days: 0` 이 제공자에게 간다. 이연 사유: 라운드 상한 뒤 무검증 변경을 더 늘리지 않는다 · `0` 을 빈 칸으로 읽으면 기존 `prescriptionDays` 산출이 바뀐다. 해소: 두 자리를 `> 0` 으로 바꾸고 반례 spec. 인수처: ai-insight-payload 후속 · id=aip-pr-glm-prescription-days-zero |
| 2026-09-22 | HIGH | .claude/plans/samsung-account-intake-hardening-m1.plan.md | L2 invariant: The paste intent check (UI6/DD7) can be turned off by the user's column mapping. The password count is taken from rows that were already read through the user's layout. If the password … · 원문 .claude/reviews/plan-review-samsung-account-intake-hardening-m1.md · id=ad1629d0 |
| 2026-09-22 | FAIL | .claude/plans/samsung-account-intake-hardening-m1.plan.md | L2 invariant: reviewer returned verdict=fail · 원문 .claude/reviews/plan-review-samsung-account-intake-hardening-m1.md · id=85408dae |
| 2026-09-22 | ABSORBED(계획 창 · 미재검증 · receipt 없음) | .claude/plans/samsung-account-intake-hardening-m1.plan.md | **위 `ad1629d0`(L2 R1 invariant HIGH — 확정한 열 배치에서 비번 열을 "쓰지 않음" 으로 두면 붙여넣기 의도 대조 계수가 0 이 되어 대조가 꺼진다)와 그 `85408dae`(invariant fail) 를 계획서에 흡수했다.** 계수를 사람 입력과 무관하게 붙여 넣은 텍스트 자체에서 센다 — 판독기가 붙여넣기 시트를 입력 없이 `buildView([sheet])` 로 보고 가린 열의 `hiddenCount` 최댓값을 `pastePasswordRows` 로 낸다(계획서 DD7 · Task 2 항목 4 · Task 3 · intent it 2 (c)). **재검증 안 됨** — 캡 1(single-pass + codex-disabled pin)이 R1 로 소진됐고, 전역 한시 규칙상 `/mccp:plan` multi-agent 모드의 캡 도달 뒤에는 receipt 를 쓰지 않는다(사용자 결정 2026-09-22 「흡수 후 receipt 없이 멈춤」). 잔여 — 숫자만·영문만인 비밀번호가 비밀번호 낱말 없는 열 이름 아래에 있으면 계수에 안 잡힌다(colmap 가림과 같은 잔여). LOW 처리: test "`#5` 가 판별 부분집합만 본다" 기각(`.claude/plans/samsung-account-intake-hardening-m1.gates.mjs` 의 `counterfactual` 은 판별 it 만 요구하고 나머지 붉음은 안전 방향) · invariant "되돌림 주장 미고정" 기각(응답에 칸 하나가 더해질 뿐이고 xlsx 는 늘 false) · 원문 `.claude/reviews/plan-review-samsung-account-intake-hardening-m1.md` · id=samsung-h1m1-r1-absorbed |
2026-10-19 | HIGH | .claude/PRPs/plans/admin-rbac-m1.plan.md | 개발 우회를 컨트롤러 import 로 판정해 가드 내부 우회(AdminJwtAuthGuard 등)가 표에서 빠진다 (L3) — R3 미해소, 근거 plan:101 | cap 도달로 계획서 동결, 이연. 가드 추적 규칙은 재진입 때 흡수
2026-10-19 | HIGH | .claude/PRPs/plans/admin-rbac-m1.plan.md | AppModule 부팅 시 DB·Redis·스케줄러·외부 발송을 격리하는 계약이 없다 (L3) — R3 미해소, 근거 plan:110-114 | cap 도달로 이연. 부팅 격리 계약은 Task 4 재진입 때 정의
2026-10-19 | HIGH | .claude/PRPs/plans/admin-rbac-m1.plan.md | 개발 우회 칸이 helper import 기준이라 704행 전부 없음이 되고, #7 · #10 이 이를 잡지 못한다 (architect) — R3 미해소, 근거 plan Task 3 규칙 6 | cap 도달로 이연. 가드 기준 규칙으로 옮기는 수정은 재진입 때 흡수
2026-10-19 | LOW | .claude/PRPs/plans/admin-rbac-m1.plan.md | 덤프와 생성기가 @Roles 메서드 우선 규칙을 같은 방식으로 구현해 독립 대조가 아니다 (architect) — R3 미해소, 근거 plan Task 4 · roles.guard.ts:16-19 | cap 도달로 이연. 비차단(LOW)
2026-10-19 | MEDIUM | .claude/PRPs/plans/admin-rbac-m1.plan.md | #10 이 셸 env 그대로 AppModule 을 부팅해 운영 크론·외부 연결이 가능하다 (security) — R3 미해소, 근거 plan:263 · app.module.ts:93-120 | cap 도달로 이연. 덤프가 init 직후 끝나 영향은 제한적이라는 security 판정 유지
2026-10-19 | HIGH | .claude/PRPs/plans/admin-rbac-m1.plan.md | #10 음성이 유효 @Roles · 신원 종류를 건드리지 않아 R1 union 버그 재발을 못 잡는다 (test) — R3 미해소, 근거 plan:265-268 | cap 도달로 이연. 재진입 때 역할·신원 변이 음성을 먼저 정한다
2026-10-19 | MEDIUM | .claude/PRPs/plans/admin-rbac-m1.plan.md | #10 경로 집합 불일치 exit 1 분기에 음성이 없다 (test) — R3 미해소, 근거 plan:111,261,266,268 | cap 도달로 이연
2026-10-19 | MEDIUM | .claude/PRPs/plans/admin-rbac-m1.plan.md | #8 비고 검사가 '-' 충전값을 채워진 것으로 통과시킨다 (test) — R3 미해소, 근거 plan:103,246 | cap 도달로 이연. '-' 는 미기재로 센다
2026-10-19 | LOW | .claude/PRPs/plans/admin-rbac-m1.plan.md | 음성 실행을 구현 때로 미뤘고 인수 조건은 #5 · #10 만 명시한다 (test) — R3 미해소, 근거 plan:177-333 | cap 도달로 이연. 비차단(LOW)
2026-10-19 | LOW | .claude/PRPs/plans/admin-rbac-m1.plan.md | #12 가 rename 항목의 old -> new 중 old 만 접두 검사해, 허용 경로에서 범위 밖으로 옮긴 파일이 통과한다 (invariant, 최종 목록 밖) — R3 미해소, 근거 plan:286-287 | cap 도달로 이연. 비차단(LOW), 원장 보완으로 추가
2026-10-19 | LOW | .claude/PRPs/plans/admin-rbac-m1.plan.md | #12 가 .claude/reviews/ · .claude/state/ 를 접두로 통째 면제해 그 아래 어떤 파일이든 범위 게이트를 통과한다 (invariant, 최종 목록 밖) — R3 미해소, 근거 plan:287 | cap 도달로 이연. 비차단(LOW), 원장 보완으로 추가
2026-10-19 | LOW | .claude/PRPs/plans/admin-rbac-m1.plan.md | #10 대조 튜플이 (메서드, 경로, 역할, 신원) 뿐이라 guard-kind · 접근 계약 칸은 원천과 대조되지 않는다 (invariant, 최종 목록 밖) — R3 미해소, 근거 plan:111 · plan:329 | cap 도달로 이연. 계획서가 (미검증)으로 공시했다. 비차단(LOW), 원장 보완으로 추가
2026-10-19 | HIGH | .claude/PRPs/plans/admin-rbac-m1.plan.md | 개발 우회를 컨트롤러 import 로 판정해 가드 내부 우회가 표에서 빠진다 (L3) — R3 미해소, 근거 plan:101 | 기존 1465행 표지 보강 (같은 라운드, 행 자체는 그대로) → 다음 계획 반영 대상
2026-10-19 | HIGH | .claude/PRPs/plans/admin-rbac-m1.plan.md | AppModule 부팅 시 DB·Redis·스케줄러·외부 발송을 격리하는 계약이 없다 (L3) — R3 미해소, 근거 plan:110-114 | 기존 1466행 표지 보강 (같은 라운드, 행 자체는 그대로) → 다음 계획 반영 대상
2026-10-19 | HIGH | .claude/PRPs/plans/admin-rbac-m1.plan.md | 개발 우회 칸이 helper import 기준이라 704행 전부 없음이 되고, #7 · #10 이 이를 잡지 못한다 (architect) — R3 미해소, 근거 plan Task 3 규칙 6 | 기존 1467행 표지 보강 (같은 라운드, 행 자체는 그대로) → 다음 계획 반영 대상
2026-10-19 | HIGH | .claude/PRPs/plans/admin-rbac-m1.plan.md | #10 음성이 유효 @Roles · 신원 종류를 건드리지 않아 R1 union 버그 재발을 못 잡는다 (test) — R3 미해소, 근거 plan:265-268 | 기존 1470행 표지 보강 (같은 라운드, 행 자체는 그대로) → 다음 계획 반영 대상
2026-10-19 | CRITICAL | .claude/PRPs/plans/admin-rbac-m1.plan.md | 검사 #9 가 사무실 IP 라우트 5개 (가드 주석 처리, insuniverse-server allow-ip-admin.controller.ts:15) 를 외부 신원 표지로 고정해 판정표 정정과 어긋난다. 계획 개정으로 「외부 호출자 후보 · 소비처 미확인 (R19)」 로 바꿔야 한다 (code-review 라운드 1) | 표는 정정됐고 검사 #9 는 붉다. 사용자 결정 (정책 OQ4 와 함께) → 다음 계획 반영 대상
2026-10-19 | HIGH | insuniverse-server/apps/api/src/modules/push/push.controller.ts:155 | GET /admin/push/:pshId 가 회원 access 형상이면 pshId 소유 검사 없이 푸시 상세를 읽는다 (PushDetailReaderGuard 134-146, PushService.getPushDetail 378-385). IDOR 후보, 민감도 미확인 (code-review 라운드 1) | 표는 판정만 · IDOR 후보로 정정. 서버 코드 수정은 M1 밖 (코드 영향 0) → 보안 핫픽스 또는 다음 마일스톤 조사 대상
2026-10-19 | HIGH | .claude/meta/2026-10-19-admin-rbac-m1/route-guards.mjs | 도구 kindOf 가 AnalysisTargetGuard · PushDetailReaderGuard 를 optional 로 흡수한다. 도구는 digest 고정 (검사 #2) 이라 못 고침. 표와 route-compare 는 보정됨 (code-review 라운드 1) | 다음 계획에서 도구 digest 재고정 또는 가드 이름 명시 목록 검사를 게이트에 넣는다
2026-10-19 | HIGH | .claude/PRPs/plans/admin-rbac-m1.plan.md | 검사 #12 허용 집합이 구현 산출 3경로 (백로그 append · 구현 보고서 · implement receipt) 를 빼서 붉다 (code-review 라운드 1) | 사용자 결정. 허용 집합 개정 또는 산출 위치 이동 중 택일 → 다음 계획 반영 대상
2026-10-19 | MEDIUM | insuniverse-server/apps/api/src/modules/analyze/analyze.controller.ts:482 | B2C car-basic · car-detail 에 req.admin 을 세우는 가드가 없어 CarViewAdminGuard 가 전건 403 일 가능성 (정적, 런타임 미확인). 사이트 B2cStep4Page.tsx:97 호출 (code-review 라운드 1) | 표 비고에 표지. 런타임 확인 필요 → 다음 계획 반영 대상
2026-10-19 | MEDIUM | insuniverse-server/apps/api/src/modules/analyze/analyze.controller.ts:569 | B2C 생년월일 인증 (verify-birth) 은 6자리 단독 요소이고 시도 제한이 없다. 성공 시 b2c_auth 쿠키로 assertB2cAuth 판정 16행이 열린다 (code-review 라운드 2, security). 표 569행 비고에 표지 (M1 은 코드 영향 0) | 보안 핫픽스 항목 후보. 시도 제한 (bodId · IP 단위 카운터 또는 잠금) 과 ALB · WAF 의 기존 제한 확인 필요 → 다음 계획 반영 대상
2026-10-19 | LOW | .claude/meta/2026-10-19-admin-rbac-m1/route-guards.mjs | 동결본 파서가 @HTTP 줄 뒤에 주석 줄이 끼면 데코레이터 블록을 멈춘다. treat-provider-admin.controller.ts:121 의 SuperAdminGuard 를 놓쳤다 (라운드 2). 도구는 digest 고정이라 못 고침. 런타임 가드 대조가 잡고 annotations guardsAdd 로 보정 | 도구 개정 때 주석 줄 건너뛰기 · 가드 이름 명시 목록 검사를 게이트에 넣는다
2026-10-19 | MEDIUM | .claude/PRPs/plans/admin-rbac-m1.plan.md | 검사 #10 음성 분기 (`if node route-compare.mjs …; then exit 1; fi`, :266 · :268) 가 exit 0 만 거른다. 없는 표 (rc 1, ENOENT) 와 빈 표 (rc 2) 도 음성 「통과」 가 되어 탐지 로직 회귀가 녹색으로 남는다. 음성은 rc 1 과 stderr 「표에만 있음」 · 「런타임에만 있음」 을 함께 봐야 한다 (실측: 빈 표 rc 2 「빈 입력」, 없는 표 rc 1 ENOENT, 두 경우 모두 음성 통과) — code-review R3 미해소, 근거 .claude/PRPs/plans/admin-rbac-m1.plan.md:266 | 계획서 동결 (라운드 3 은 계획서 수정 금지). 노트 음성 기록은 stderr 실측으로 보강했다. 검사 본문 교체는 다음 계획 반영 대상 (MEDIUM 이라 표지 없음)
2026-10-19 | HIGH | .claude/PRPs/plans/admin-rbac-m1.plan.md | 범위 키 선언 공백 — 판정표 자동 칸 465행(관리자 전사·미선언 318 · 영업·기업 통과 미판정 104 · 열람 토큰 35 · 미판정 8)이 저자 선언이 아니다 (fable, M1 최종 리뷰 R2 미해소), 근거 .claude/meta/2026-10-19-admin-rbac-m1/route-contract-table.md · .claude/notes/admin-rbac-m1.md 「최종 리뷰」 | 최종 리뷰 루프 종료 시 미해소 → 다음 계획 반영 대상
2026-10-19 | HIGH | .claude/PRPs/plans/admin-rbac-m1.plan.md | 접근 계약 칸이 PRD M1 여섯 범주 대신 표 어휘를 쓴다 — README 「어휘 대응」 으로 부분 흡수, 계획 본문의 「무조건 공개 0」 주장 정정은 미반영 (fable, M1 최종 리뷰 R1 부분 흡수), 근거 .claude/notes/admin-rbac-m1.md 「최종 리뷰」 | 동결 계획 본문 대신 → 다음 계획 반영 대상
2026-10-19 | RESOLVED-IN | .claude/PRPs/plans/admin-rbac-m2.plan.md | 개발 우회를 컨트롤러 import 로 판정해 가드 내부 우회가 표에서 빠진다 (L3, 원 1465 · 표지 1477) | 계획 반영: Task 3 · 검사 #5 (신원 가드 파일 기준 재산정, 자리표시 제거). 구현 검사 통과 전에는 닫힌 것이 아니다
2026-10-19 | RESOLVED-IN | .claude/PRPs/plans/admin-rbac-m2.plan.md | 개발 우회 칸이 helper import 기준이라 704행 전부 없음이 되고 #7 · #10 이 못 잡는다 (architect, 원 1467 · 표지 1479) | 계획 반영: Task 3 · 검사 #5 (같은 재산정, 자리표시 571행 제거)
2026-10-19 | RESOLVED-IN | .claude/PRPs/plans/admin-rbac-m2.plan.md | AppModule 부팅 시 DB·Redis·스케줄러·외부 발송 격리 계약이 없다 (L3, 원 1466 · 표지 1478) | 계획 반영: Task 4 · 검사 #11 (격리 env 허용 목록은 M1 덤프에 이미 있어 확인, 스케줄러 cron 중지 단계 추가)
2026-10-19 | RESOLVED-IN | .claude/PRPs/plans/admin-rbac-m2.plan.md | 검사 #9 가 사무실 IP 라우트 5개를 외부 신원 표지로 고정해 정정된 판정표와 어긋난다 (code-review 라운드 1 CRITICAL, 표지 1481) | 계획 반영: Task 3 · 검사 #9 (정정 라벨을 레지스트리가 싣고 컨트롤러 가드 부재를 본다, 정책 OQ4)
2026-10-19 | RESOLVED-IN | .claude/PRPs/plans/admin-rbac-m2.plan.md | 도구 kindOf 가 AnalysisTargetGuard · PushDetailReaderGuard 를 optional 로 흡수한다 (code-review 라운드 1 HIGH, 표지 1483) | 계획 반영: Task 2 · 검사 #4 (생성기는 known-guards 명시 목록으로 종류를 주고 목록 밖 이름은 exit 1)
2026-10-19 | RESOLVED-IN | .claude/PRPs/plans/admin-rbac-m2.plan.md | 검사 #10 음성이 유효 @Roles · 신원 종류를 건드리지 않아 R1 union 버그 재발을 못 잡는다 (test, 원 1470 · 표지 1480) | 계획 반영: 검사 #10 (charge-requests/process 역할 칸 변이에서 대조기 rc 1)
2026-10-19 | RESOLVED-IN | .claude/PRPs/plans/admin-rbac-m2.plan.md | 검사 #10 음성 분기가 exit 0 만 걸러 rc 2 와 없는 표도 음성 통과가 된다 (test MEDIUM, 1488) | 계획 반영: 검사 #10 (빈 표 rc 2, 변이 표 rc 1 을 정확히 대조, M1 본문은 동결)
2026-10-19 | RESOLVED-IN | .claude/PRPs/plans/admin-rbac-m2.plan.md | 접근 계약 칸이 PRD 여섯 범주 대신 표 어휘를 쓴다 (fable M1 최종 리뷰 R1, 표지 1490) | 계획 반영: Task 3 · 검사 #3 (category-map.json 으로 여섯 범주 매핑), Task 10 에서 M1 노트에 정정 기록
2026-10-19 | MEDIUM | .claude/PRPs/plans/admin-rbac-m2.plan.md | 레지스트리 행을 만들 생성 경로가 없다. 생성기는 동결 M1 목록만 읽어 새 핸들러 행을 만들 수 없고, 손으로 고친 행은 검사 #2 의 cmp 와 충돌한다 (architect) — R3 미해소, 근거 plan:269-270 | cap 도달(3/3)로 이연, 계획 동결
2026-10-19 | LOW | .claude/PRPs/plans/admin-rbac-m2.plan.md | 격리 규칙이 spec(h) 와 route-runtime-dump.cjs 에 이중으로 있어 서로 어긋날 수 있고, 검사 #11 은 덤프 출력만 본다 (architect) — R3 미해소, 근거 plan:192 | cap 도달(3/3)로 이연, 계획 동결
2026-10-19 | LOW | .claude/PRPs/plans/admin-rbac-m2.plan.md | 검사 #14 가 리뷰 기록 · backlog 를 스캔하지 않고, 커밋 전에는 `git diff --cached` 한 줄만 덮는다 (security) — R3 미해소, 근거 plan:395,401-402 | cap 도달(3/3)로 이연, 계획 동결
2026-10-19 | MEDIUM | .claude/PRPs/plans/admin-rbac-m2.plan.md | 우선순위 규칙 2-7 의 카테고리 매핑을 검사하지 않는다. 검사 #3 은 집합 소속만, #4 는 규칙 1 만 본다 (test) — R3 미해소, 근거 plan:141-149,280-284 | cap 도달(3/3)로 이연, 계획 동결
2026-10-19 | MEDIUM | .claude/PRPs/plans/admin-rbac-m2.plan.md | 검사 #13 은 로컬 임시 Redis 로 돌고 CI 잡에는 서비스가 없어 로컬 녹색이 CI 결과를 보증하지 않는다 (test) — R3 미해소, 근거 insuniverse-server/.github/workflows/api.yml:55-70, plan:81,205 | cap 도달(3/3)로 이연, 계획 동결
2026-10-19 | LOW | .claude/PRPs/plans/admin-rbac-m2.plan.md | spec(h) 의 jest 드리즐 스텁과 ts-node 증거가 달라 실제 AppModule 과 어긋날 수 있다 (test) — R3 미해소, 근거 insuniverse-server/jest.config.js:9, plan:250 | cap 도달(3/3)로 이연, 계획 동결
2026-10-19 | LOW | .claude/PRPs/plans/admin-rbac-m2.plan.md | 검사 #8 의 첫 음성이 동어반복이다 (test) — R3 미해소, 근거 plan:339-340 | cap 도달(3/3)로 이연, 계획 동결
2026-10-19 | HIGH | .claude/PRPs/plans/admin-rbac-m2.plan.md | 검사 #6 이 이전 실행의 jest6.json 을 재사용해 stale 통과가 가능하다. jest 종료 코드를 `|| true` 로 버리고 결과 파일은 실행 전에 지우지 않는 임시 디렉터리에 남는다 (invariant, blocking) — R3 미해소, 근거 plan:237,317-318 | cap 도달(3/3)로 이연, 계획 동결. 재사용 차단은 다음 계획에서 고친다 → 다음 계획 반영 대상
2026-10-19 | MEDIUM | .claude/PRPs/plans/admin-rbac-m2.plan.md | 경계 검사가 경로에 `*` 가 든 핸들러를 모양만으로 일괄 제외해 신규 `*` 핸들러가 검사되지 않는다 (invariant) — R3 미해소, 근거 plan:133,173,192 | cap 도달(3/3)로 이연, 계획 동결
2026-10-19 | LOW | .claude/PRPs/plans/admin-rbac-m2.plan.md | 검사 #14 는 입력 파일이 없으면 grep 오류를 건너뛰어 입력 누락이 검사를 붉히지 않는다 (invariant) — R3 미해소, 근거 plan:401 | cap 도달(3/3)로 이연, 계획 동결
2026-10-19 | HIGH | .claude/PRPs/plans/admin-rbac-m2.plan.md | 와일드카드 일괄 제외가 미선언 핸들러를 CI 에서 숨긴다. 신규 `@Get('export/*')` 같은 핸들러는 레지스트리 선언 없이도 이 시험을 통과한다 (L3 codex) — R3 미해소, 근거 plan:192 | cap 도달(3/3)로 이연, 계획 동결. 동결 미들웨어 등록의 개수 대조를 CI 에 넣는다 → 다음 계획 반영 대상
2026-10-19 | MEDIUM | .claude/PRPs/plans/admin-rbac-m2.plan.md | AppModule 격리 테스트가 .env 재적재를 막지 않는다. configuration.ts · pino.ts 가 import 시 .env 를 읽어 지운 외부 연동 값을 되살릴 수 있다 (L3 codex) — R3 미해소, 근거 plan:192 | cap 도달(3/3)로 이연, 계획 동결
2026-10-19 | HIGH | .claude/PRPs/plans/admin-rbac-m2.plan.md | (구현 중 Codex R1, 구현 전 리뷰, 2026-10-19) 계획 규칙 7 이 「판정만」 행 22개를 「무조건 공개」로 만든다 (보안 계약 기록의 사실 오류) — 구현에서 「판정만 → 서비스 검증」 규칙을 더해 편차 D1 로 해소, 계획 본문은 동결 | → 다음 계획 반영 대상 (범주 규칙에 판정만 행을 명시)
2026-10-19 | MEDIUM | .claude/PRPs/plans/admin-rbac-m2.plan.md | (구현 중 Codex R1) 검사 #8 의 판정표 대조 loop 가 /swagger · /swagger-json 을 판정표에서 찾아 set -e 아래 붉다 (계획 335행) — 구현에서 문서 경로를 대조 loop 에서 빼 편차 D2 로 해소 | → 다음 계획 반영 대상 (문서 경로는 setupSwagger 원천으로 대조)
2026-10-19 | HIGH | .claude/PRPs/plans/admin-rbac-m2.plan.md | 계획 게이트 cap 도달 뒤 receipt 없이 구현에 들어갔다 — code-review R1 미해소, 근거 .claude/notes/admin-rbac-m2.md:24 · 57-59 | 전역 mccp 규칙은 receipt 없음이면 보고 후 정지다. 사용자 본인의 확인이 필요하고 코드로 풀 수 없다 → 다음 계획 반영 대상
2026-10-19 | HIGH | .claude/PRPs/plans/admin-rbac-m2.plan.md | 계획 Task 6(5) 의 예외 경로 6개에 GET /swagger-yaml 이 없어 비운영 부팅마다 거짓 위반이 나고 fail 전환 때 부팅이 막힌다. 코드는 메서드 포함 경로 7 + 접두 1 로 흡수했다 — code-review R1 부분 미해소 (계획 본문), 근거 insuniverse-server/apps/api/src/modules/auth/access-contract/access-contract.exceptions.ts:16 | 계획 본문은 동결이라 Task 6(5) 와 Acceptance 의 예외 목록을 고쳐야 한다 → 다음 계획 반영 대상
2026-10-19 | MEDIUM | .claude/PRPs/plans/admin-rbac-m2.plan.md | api.yml 의 --forceExit 를 AppModule 시험 한 단계로 좁혔으나 그 시험의 소켓 누수 원인은 미규명이다 — code-review R1 부분 미해소, 근거 insuniverse-server/.github/workflows/api.yml:74-77 | 계획 Task 9 의 목록 명령과 다르다 (편차 D11). 누수 원인 규명은 후속 과제다.
2026-10-19 | MEDIUM | .claude/PRPs/plans/admin-rbac-m2.plan.md | 계획 Task 3 표에 「판정만 → 서비스 검증」 규칙이 없다 (구현 편차 D1). 검사는 생성기의 매핑 검사 (검사 #16) 가 잡는다 — code-review R1 부분 미해소, 근거 .claude/meta/2026-10-19-admin-rbac-m2/category-map.json:10 | 계획 표 수정이 필요하다 (계획 본문 동결).
2026-10-19 | MEDIUM | .claude/PRPs/plans/admin-rbac-m2.plan.md | Validation 블록이 그대로는 재현되지 않는다 (편차 D2 · D3 · D5 · D6 · D7 · D11 · D13). 실행본은 .claude/meta/2026-10-19-admin-rbac-m2/validation-run.sh — code-review R1 부분 미해소, 근거 .claude/PRPs/plans/admin-rbac-m2.plan.md:224 | 계획 블록을 실행본에 맞춰 고쳐야 한다 (계획 본문 동결).
2026-10-19 | MEDIUM | .claude/PRPs/plans/admin-rbac-m2.plan.md | 서버 CI 의 부팅 단언 AppModule 시험이 stg 동결 레지스트리(704행)에 묶여 있어, prod 축 이식 시 prod 배포 단계가 막힌다 (prod 688행과 권한 영역이 다르다) — code-review R2 미해소, 근거 insuniverse-server/.github/workflows/api.yml:58-78 · insuniverse-server/apps/api/src/modules/auth/access-contract/access-contract.registry.ts:38 | 코드 분기 없이 노트 R2 편차 D21 에 이식 조건만 (미검증) 으로 적었다. 이식 전에 prod 동결본 레지스트리 또는 축별 단계 분기를 정해야 한다.
2026-10-19 | REJECTED | .claude/PRPs/plans/admin-rbac-m2.plan.md | 계획 게이트 cap 도달 뒤 receipt 없이 구현에 들어갔다 — code-review R1 미해소, 근거 .claude/notes/admin-rbac-m2.md:24 · 57-59 | 사용자 지시 확인으로 기각
2026-10-19 | RESOLVED-IN | .claude/PRPs/plans/admin-rbac-m3.plan.md | 검사 #6 이 이전 실행의 jest6.json 을 재사용해 stale 통과가 가능하다 (invariant, blocking, 원 1506) | 실행본 validation-run.sh 가 jest 실행 전에 결과 파일을 지운다 (rm -f 가 jest 호출보다 앞). 계획 본문은 동결이라 고치지 않았다. 순서는 M3 검사 #12 가 본다
2026-10-19 | RESOLVED-IN | .claude/PRPs/plans/admin-rbac-m3.plan.md | 계획 규칙 7 이 「판정만」 행 22개를 「무조건 공개」로 만든다 (보안 계약 기록의 사실 오류, 원 1511) | 구현 편차 D1 로 해소. 범주 규칙 「판정만 → 서비스 검증」은 M2 메타 README 표 56행에 있다. 계획 본문은 동결이다. M3 검사 #12 가 행의 존재를 본다
2026-10-19 | RESOLVED-IN | .claude/PRPs/plans/admin-rbac-m3.plan.md | 계획 Task 6(5) 의 예외 경로 6개에 GET /swagger-yaml 이 없다 (code-review R1 HIGH, 원 1514) | 코드 · 골든에는 이미 있다 (access-contract.exceptions.ts · exceptions.golden.txt). 계획 본문 정정은 M3 Task 9 에서 M2 노트에 적는다. M3 검사 #12 가 두 곳을 본다
2026-10-19 | MEDIUM | .claude/PRPs/plans/admin-rbac-m3.plan.md | 검사 #14 허용 목록에 admin-view-token.guard.spec.ts 와 auth/user/password-reset.spec.ts (회원 발급 클레임 시험, R1 에서 더함) 가 없고, 미추적 산출 .claude/PRPs/reports/admin-rbac-m3-report.md · .claude/receipts/mccp-implement-codex/admin-rbac-m3.json 이 허용 정규식 밖이라 검사 #14 가 rc 1 이다 — code-review R1 미해소, 근거 .claude/PRPs/plans/admin-rbac-m3.plan.md:415-423 · insuniverse-server/apps/api/src/modules/admin-view-token/admin-view-token.guard.spec.ts:34 · insuniverse-server/apps/api/src/modules/auth/user/password-reset.spec.ts (회원 발급 클레임 시험 블록) | 계획 Validation #14 의 허용 목록 개정이 필요하다. 계획 본문은 동결이라 이 라운드는 고치지 않았다 (노트 구현 편차 1 과 같은 사실).
2026-10-19 | MEDIUM | .claude/PRPs/plans/admin-rbac-m3.plan.md | 열람 v2 복원 신원이 검증 대상(서명 · scope · id)에 묶이지 않고, 같은 req.admin 에 쿠키 JWT 의 범위 키(agcId · corpScope · orgPath · memId)가 남는다. principalKind 가 view-token 이어도 범위 키는 쿠키 보유자의 것이다 — code-review R1 미해소(잠재), 근거 insuniverse-server/apps/api/src/modules/auth/principal/principal.ts:108-113 · insuniverse-server/apps/api/src/modules/auth/admin/admin-optional.guard.ts:61-71 | 현행 소비처 없음 · 악용 경로 미발견 · NOT Building 9 (R2 결정) 라 M3 에서 막지 않는다. M5 평가기 착수 전에 열람 복원에서 JWT 유래 범위 키를 지우거나 viewTokenPrincipal 에 scope · id 를 싣는 조건을 M5 계획에 건다 (미검증).
2026-10-19 | LOW | .claude/PRPs/plans/admin-rbac-m3.plan.md | 기준선 실패 4곳 (ddx insight-payload · insight-report-v2 · ddx-verdict.service suite, analyze-insight-route 의 getInsight 시험) 이 워크트리에 없는 .claude/plans/ai-insight-cr2-*.json 픽스처를 찾다 ENOENT 로 돌지 않는다 — code-review R1 미해소, 근거 .claude/meta/2026-10-19-admin-rbac-m3/jest-baseline.txt · insuniverse-server/apps/api/src/modules/ddx/insight-payload.spec.ts (재실행 ENOENT 확인) | 픽스처 복구 (워크트리에 사본을 두거나 경로를 주입) 는 M3 범위 밖이라 이연. 회귀 맹점은 메타 README 「기준선의 맹점」 절에 적었다.
2026-10-19 | MEDIUM | .claude/PRPs/plans/admin-rbac-m3.plan.md | 열람 principal 에 PRD Scope 가 정한 scope · 대상 id 가 없다. viewTokenPrincipal 은 claims 만 싣고 verify 가 서명된 scope · id 를 버린다 (PRD M3 범위 미달) — 최종 리뷰 R1 미해소, 근거 insuniverse-server/apps/api/src/modules/admin-view-token/admin-view-token.service.ts:83-95 · insuniverse-server/apps/api/src/modules/auth/principal/principal.ts:112 · .claude/prds/admin-rbac.prd.md:107 | 계획 Task 3 · 검사 #3 의 입구 형상 개정이 필요해 동결 계획 밖이다. 다음 계획에서 입구가 scope · id 를 싣게 바꾼다. PRD M3 행을 complete 로 올릴 때 이 미달과 M5 조건(열람 신원 혼합 행)을 함께 적는다
2026-10-19 | MEDIUM | .claude/PRPs/plans/admin-rbac-m3.plan.md | 검사 #9 판정식이 suite 단위 실패 (afterAll throw 등) 를 놓친다. status 가 failed 이고 testExecError 가 없으며 실패 assertion 이 0 이면 세지 않는다 (codex) — 최종 리뷰 R1 미해소, 근거 .claude/PRPs/plans/admin-rbac-m3.plan.md:350 (판정식) · 임시 spec (afterAll throw, 시험 1건 통과) 재현에서 계획 판정식 실패 목록 빈 값 | 계획 검사 본문이 동결이라 고치지 않았다. 수정 판정식 (실패 assertion 으로 설명되지 않는 status failed suite 를 센다) 을 최종 리뷰 R1 의 전체 jest 출력에 적용해 기준 밖 0 을 확인했다. 다음 계획의 검사 #9 판정식에 반영한다
2026-10-19 | NOT-REPRODUCED | .claude/PRPs/plans/admin-rbac-m4.plan.md | 와일드카드 일괄 제외가 미선언 핸들러를 CI 에서 숨긴다 (L3 codex, 원 1509) | M4 Task 11 판정 (a): 미선언 @All('*') 반례 시험이 처음부터 녹색이라 숨김이 이 픽스처에서 재현되지 않았다. 규칙은 고치지 않았다. 근거 .claude/notes/admin-rbac-m4.md 「M4 정정」 · 검사 #12 · access-contract.spec.ts 「M4 · 1509 반례」
2026-10-19 | HIGH | .claude/PRPs/plans/admin-rbac-m4.plan.md | Task 11 의 RULE_UNDECLARED 기대가 빈 레지스트리에서 RULE_UNKNOWN_PATH 로 나와 1509 재현 판정이 오판될 수 있음 — R3 미해소, 근거 .claude/PRPs/plans/admin-rbac-m4.plan.md Task 11 · insuniverse-server/apps/api/src/modules/auth/access-contract/access-contract.assert.ts:89-92 | cap 도달로 R3 에서 미반영 (계획 본문 동결) → 다음 계획 반영 대상
2026-10-19 | MEDIUM | .claude/PRPs/plans/admin-rbac-m4.plan.md | 1509 반례 픽스처가 기존 통과 시험과 같아 재현력이 없음 — R3 미해소, 근거 insuniverse-server/apps/api/src/modules/auth/access-contract/access-contract.spec.ts:365 · .claude/PRPs/plans/admin-rbac-m4.gates.sh:174 | cap 도달로 R3 에서 미반영 (계획 본문 동결) · 기록만 남김
2026-10-19 | MEDIUM | .claude/PRPs/plans/admin-rbac-m4.plan.md | 어댑터 SQL 과 실제 드라이버 오류 분류를 보는 시험이 없음 (검사 #8 은 종료코드만 봄) — R3 미해소, 근거 .claude/PRPs/plans/admin-rbac-m4.plan.md Task 5 · .claude/PRPs/plans/admin-rbac-m4.gates.sh:113 | cap 도달로 R3 에서 미반영 (계획 본문 동결) · 기록만 남김
2026-10-19 | MEDIUM | .claude/PRPs/plans/admin-rbac-m4.plan.md | 428행 총수를 독립 대조하지 않음 (검사 #3(b) 는 rbac.manage 행만 셈) — R3 미해소, 근거 .claude/PRPs/plans/admin-rbac-m4.gates.sh:58-60 | cap 도달로 R3 에서 미반영 (계획 본문 동결) · 기록만 남김
2026-10-19 | MEDIUM | .claude/PRPs/plans/admin-rbac-m4.plan.md | 1509 을 Task 11 실행 전 RESOLVED-IN 으로 적음 · 검사 #11 은 NOT-REPRODUCED 도 통과 · 1528/1509 표기 불일치 — R3 미해소, 근거 .claude/PRPs/plans/admin-rbac-m4.plan.md:86,88,201,268 | cap 도달로 R3 에서 미반영 (계획 본문 동결) · 기록만 남김
2026-10-19 | LOW | .claude/PRPs/plans/admin-rbac-m4.plan.md | 0036 되돌림 절차를 검사하는 게이트가 없음 — R3 미해소, 근거 .claude/PRPs/plans/admin-rbac-m4.plan.md:119,146 | cap 도달로 R3 에서 미반영 (계획 본문 동결) · 기록만 남김
2026-10-19 | MEDIUM | .claude/PRPs/plans/admin-rbac-m4.plan.md | principal 에서 admId · AdminIdentity 로의 매핑 주체가 정해지지 않음 (M5 접점) — R3 미해소, 근거 insuniverse-server/apps/api/src/modules/auth/principal/principal.ts:24 · 계획 Task 4·5 | cap 도달로 R3 에서 미반영 (계획 본문 동결) · 기록만 남김
2026-10-19 | LOW | .claude/PRPs/plans/admin-rbac-m4.plan.md | 생성 카탈로그를 서버 CI 가 재대조하지 않음 — R3 미해소, 근거 .claude/PRPs/plans/admin-rbac-m4.plan.md Risks 행 | cap 도달로 R3 에서 미반영 (계획 본문 동결) · 기록만 남김
2026-10-19 | LOW | .claude/PRPs/plans/admin-rbac-m4.plan.md | sentinel ath_id=0 과 athId 0 입력 거부, __version__ 행 삭제 제외가 명시되지 않음 — R3 미해소, 근거 .claude/PRPs/plans/admin-rbac-m4.plan.md Task 3 · Task 7 | cap 도달로 R3 에서 미반영 (계획 본문 동결) · 기록만 남김
2026-10-19 | HIGH | .claude/PRPs/plans/admin-rbac-m4.plan.md | 초기 적재 재실행 방지가 행 부재를 미초기화로 보아 전원 회수 뒤 재실행이 권한을 복원함 · 초기화 표지를 권한 행과 분리해야 함 (L3 codex) — R3 미해소, 근거 .claude/PRPs/plans/admin-rbac-m4.plan.md:166 | cap 도달로 R3 에서 미반영 (계획 본문 동결) → 다음 계획 반영 대상
2026-10-19 | HIGH | .claude/PRPs/plans/admin-rbac-m4.plan.md | SuperAdminGuard 전용 라우트 27행과 analysis.car.read 가 일반 코드로 카탈로그에 적재된다 (생성기가 M1 표의 범위 키 열을 보지 않는다) — code-review R1 미해소, 근거 .claude/meta/2026-10-19-admin-rbac-m4/build-catalog.mjs:28 · .claude/meta/2026-10-19-admin-rbac-m1/route-contract-table.md (범위 키 「(최고관리자 전용)」 27행) | 적재 집합 변경은 계획 동결 밖이다 (카탈로그 골든 · 검사 #2 · #3 · #10 · 계획 표 25행). 다음 계획에서 「(최고관리자 전용)」 행을 SUPER_ONLY 로 분류하고 CarViewAdminGuard 행은 적재 제외 또는 별도 결정을 받는다 → 다음 계획 반영 대상
2026-10-19 | MEDIUM | .claude/PRPs/plans/admin-rbac-m4.plan.md | build-catalog 스템이 파일 기본 이름이라 기업 정산 · 거래처 정산의 settlement-admin 이 한 코드로 합쳐지고, rbac 스템도 basename 일치라 다른 디렉터리의 admin.controller.ts 가 조용히 최고관리자 전용이 된다 — code-review R1 미해소, 근거 .claude/meta/2026-10-19-admin-rbac-m4/build-catalog.mjs:30 · catalog-golden.txt:92-93 | 스템 변경은 적재 코드 집합과 골든 · 검사 #2 · #3 · #10 을 바꾼다 (계획 동결). 다음 계획에서 스템에 모듈 디렉터리를 넣거나 같은 스템의 파일이 둘이면 생성을 실패시킨다
2026-10-19 | MEDIUM | .claude/PRPs/plans/admin-rbac-m4.plan.md | 권한 변경 감사 행이 AuditService 를 우회해 tn_admin_audit 에 직접 들어가고 requestId · ip · userAgent 가 없으며 PERMISSION_EDIT 이 닫힌 어휘 밖이다 (aud_changes 는 흡수로 코드 목록을 싣게 됐다) — code-review R1 부분 미해소, 근거 insuniverse-server/apps/api/src/modules/auth/permission/permission-admin.service.ts (tnAdminAudit 직접 insert) · insuniverse-server/apps/api/src/modules/audit/audit-security.ts:15 | 어휘 추가 · appendSecurity 전환은 감사 모듈 수정이라 계획 마커 봉인 (메모 「감사 어휘는 계획서 마커 표에 봉인」) 밖이다. M10 활성화 전에 닫는다
2026-10-19 | MEDIUM | .claude/PRPs/plans/admin-rbac-m4.plan.md | 쓰기 서비스의 행위자 판정이 super-only 코드가 있을 때만 돈다. 일반 코드 쓰기의 주체 정책이 정해지지 않았고 보호는 컨트롤러 가드 한 곳뿐이다 — code-review R1 미해소, 근거 insuniverse-server/apps/api/src/modules/auth/permission/permission-admin.service.ts:52-59 · 계획 Task 7(3) | 계획 문면과 같아 기각했다. 계약은 서비스 헤더 주석에 고정했다. 일반 코드 쓰기 주체는 PRD 와 M10 에서 정한다
2026-10-19 | MEDIUM | .claude/PRPs/plans/admin-rbac-m4.plan.md | 권한 쓰기가 선행 버전 조건 없이 역할의 전체 집합을 교체한다. 낡은 화면의 저장이 다른 관리자가 회수한 권한(고위험 포함)을 되살리고 감사에는 추가로만 남는다. 잠금 직렬화는 반영했고 expectedVersion 대조와 409 는 미반영 — code-review R2 미해소, 근거 insuniverse-server/apps/api/src/modules/auth/permission/permission-admin.controller.ts (setRole, 본문에 expectedVersion 없음) | 계획 Task 7 동결 밖의 API 계약 변경이라 이 라운드에서 넣지 않는다. M10 활성화 전에 닫는다
2026-10-19 | REJECTED | .claude/PRPs/plans/admin-rbac-m4.plan.md | 계획 게이트 cap 도달 뒤 receipt 없이 구현에 들어갔다 (validate rc 2 · missing mccp-plan-codex) — 커밋 전 점검, notes Receipt 절 | 사용자 지시 확인으로 기각
2026-10-19 | HIGH | .claude/PRPs/plans/admin-rbac-m4.plan.md | 1539 의 처방 「(최고관리자 전용) 행을 SUPER_ONLY 로 분류」는 혼합 코드 treat-provider-admin.write 를 나누지 못한다 (PATCH config/webhook 최고관리자 전용 1행, PATCH config/car · PATCH :key 일반 2행이 한 코드 · 골든 3행). 같은 적재 집합이 M11 가드 결합 (env 허용목록 ∪ analysis.car.read 행, additive) 으로 전 내부 관리자 역할에 차량 열람을 연다. M5 착수 조건 「첫 버전 적재 대조」에 27행 예외 목록을 명시해야 한다 — 최종 리뷰 R1 미해소, 근거 .claude/meta/2026-10-19-admin-rbac-m4/build-catalog.mjs:28 · .claude/meta/2026-10-19-admin-rbac-m4/catalog-golden.txt · .claude/notes/admin-rbac-run-policy.md:78 · .claude/meta/2026-10-19-admin-rbac-m1/route-contract-table.md 행 #693 · 행 #691 · 행 #694 | 1539 의 하위 사례 (혼합 코드 · M11 결합 · M5 예외 목록). 적재 집합 변경은 계획 동결 밖이다 → 다음 계획 반영 대상
2026-10-19 | MEDIUM | .claude/PRPs/plans/admin-rbac-m4.plan.md | PRD M4 Outcome 의 「메뉴 배분에서 만든 집합은 메뉴 표시 기준선으로만 적어 둔다」와 결정 I 의 「메뉴 ↔ 권한 매핑은 코드 상수 (M4 산출)」가 산출에 없다. 계획 NOT Building 은 tn_menu_auth_map 을 기준선 기록으로만 쓴다고 했지만 Acceptance (미검증) 에 항목이 없고 PRD 편차로도 적히지 않았다 — 최종 리뷰 R1 미해소, 근거 .claude/prds/admin-rbac.prd.md:146 · :263 · .claude/PRPs/plans/admin-rbac-m4.plan.md:278 (메타 · notes · 산출에 기준선 · 매핑 상수 0건) | 기준선 기록은 R7 DB 읽기가 필요해 (미검증) 이고, Acceptance 추가와 PRD 편차 표기는 계획 개정 몫이다 → 다음 계획 반영 대상
