quad/.claude/session/2026-08-13-08-direct-verification-audit.md
qwreey 3ca2696208
docs(session): 8차 감사 세션 기록 — 직전 6라운드 감사의 순차 직접 재검증
CLAUDE.md 관례대로 세션 로그 신설 + 압축 요약 추가.

6라운드 재검증 결과 16건 추가 발견(9→2→3→2→0→0)으로 수렴 종료.
직전 세션이 "수렴"으로 끝낸 지점에서 나온 것이고, 그중 1건은 문서
정합성이 아니라 실제 의사코드 결함(retractFrom의 nil 가드).

감사 사각지대 둘을 다음 라운드용 일반 교훈으로 기록:
1. 정정 배너를 달면 그 배너가 부정하는 본문 문장까지 같은 커밋에서
   고쳤는지 확인 — 직전 감사가 CLAUDE.md 헤더에만 배너를 달고 본문
   bullet은 그대로 둔 게 이번 최대 발견의 원인
2. 영역 분할 병렬 감사는 "아무 영역에도 안 속한 파일"을 통째로 빠뜨림
   — HUMAN_TODO.md가 6라운드 동안 한 번도 안 열렸고 하필 사람에게 가장
   중요한 문서였음. 레포 루트 파일 목록으로 커버리지부터 체크할 것

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Y6hzeUi5QdLPEk69B6cXFa
2026-08-13 17:56:09 +09:00

110 lines
7.5 KiB
Markdown

# 2026-08-13 여덟 번째 세션 — 직전 6라운드 감사를 손으로 재검증(서브에이전트 없이)
## 배경
직전 일곱 번째 세션이 병렬 서브에이전트 5개씩 6라운드를 돌려 "수렴"으로
종료했음(`session/2026-08-13-07-corpus-audit-six-rounds.md`, 커밋
`9f9e83b`/`1aa01c6`/`b228efc`/`91fd7b8`/`6e097c9`/`8569e57`). 사용자 요청:
> "정확성을 검사하고, 네 손으로 지금 상태의 정확도를 확인해. (...)
> 뒤집혀 필요 없어진 내용은 적절히 archive 로 옮기고, stale 없게 문서를
> 모두 업데이트해도 좋아. **서브에이전트 없이 직접 검증하는게 좋을거야.
> 맥락을 순차적으로 처리해.** 서브에이전트를 쓰면 맥락이 깨지고 토큰이
> 많이드니까"
**"감사가 수렴했다는 주장 자체를 검증"**하는 메타 라운드. 방법도
지정됨 — 에이전트 위임 없이 메인 컨텍스트에서 순차 처리.
## 방법
에이전트 병렬 대신 **읽기 → grep 교차검증 → 손 트레이싱** 순서로 진행:
1. 세션 로그와 커밋 6개를 먼저 읽어 "무엇을 고쳤다고 주장하는지" 파악
2. 그 주장을 **실제 파일로 확인**(배너 4개, 포인터 분포, STATUS 분류 등)
3. grep으로 같은 클래스의 잔존 사례를 전수 스윕
4. 의사코드는 손으로 케이스를 대입해 트레이싱
라운드마다 발견 즉시 수정·커밋, 새 발견이 0이 될 때까지 반복(6라운드).
## 라운드별 발견
**1라운드 (`d3f8c4d`, 9건)** — 가장 중요한 발견은 **직전 감사가 헤더에
정정 배너만 붙이고 본문은 안 고친 패턴**. `CLAUDE.md` "지금 할 일" 1번
본문이 여전히 "스파이크 20개 중 19개를 안 돌려봄"(사실은 여섯 번째 세션에
런타임 12개 전원 통과), "`19`는 재작성 대기"(사실은 완료·통과), "설계는
더 이상 안 막힘"(실측이 0-Y를 염)이라고 서술 중이었음 — 항상 로드되는
진입점이라 파급이 가장 큼. 같은 stale이 `question.md` 2번,
`pre-implementation-audit.md`에도.
Slot 파괴→언마운트 전환 미반영도 6곳 추가 발견 — `slot-plan.md` 최상단
"상태" 줄의 `retract=폐기`(4라운드가 같은 사유로 *다른* 곳을 고쳤던 것),
`reconcile``rawRemove`를 부른다는 서술 3곳, `question.md` 확정
요약표, `README.md` slot 행(여섯 번째 세션 전환 전체가 색인에 없었음).
**archive 이전**: `archive/slot-discard-no-portal-reversed.md` 신설,
`slot-plan.md` 1982→1919줄.
**2라운드 (`09b22d0`, 2건)**`research/dispatch-redispatch-diff-plan.md`
6절(0-Z 확정 시 파일별 반영 목록)이 base 4개만 나열하는데, 같은 ⚠️ 배너를
`architecture.md`/`ROADMAP.md`가 빠져 있었음 — 목록대로만 옮기면 이 둘이
옛 모델로 남는 실제 핸드오버 갭. 특히 architecture.md는 모든 세션이 "먼저
읽으라"는 진입점.
전수 검증으로 문제 없음을 확인한 것: 문서 간 파일 참조 152개 링크(라이브
문서 깨진 링크 0건 — 깨진 건 전부 session/·initreq/·archive 히스토리 안),
luau-test README/STATUS ↔ 실제 파일명, Handler 계약 정의부, Relate API
arity, `Dispatch.process`/`retractFrom` 손 트레이싱(점유 마커 선행,
`#list` hole 없음, hint가 target 인덱스에만, `index>#list`일 때 no-op).
**3라운드 (`316ed6a`, 3건)****`HUMAN_TODO.md`가 6라운드 동안 한 번도
안 열렸던 게 드러남.** 헤더가 "설계 질문은 안 봐도 진행에 지장 없고"라고
단언하고 3번 항목도 "막고 있는 항목은 없음"으로 끝나는데, 0-Y/0-Z는 M0를
실제로 막고 있고 **둘 다 사용자가 직접 판단하겠다고 명시 이관한** 항목 —
즉 정확히 이 문서가 담아야 할 성격인데 빠져 있었음. 사람이 이 문서로
"지금 내가 뭘 해야 하나"를 판단하면 아무것도 안 해도 되는 것처럼 읽힘.
4번(0-Y/0-Z)·5번(Studio 전용 `10`의 남은 A-1/A-2/B/C) 신설.
"열린 질문 없음" 자기모순 2건도 — `tag-plan.md`는 이미 캐비엇을 달았는데
같은 처리가 `tween-plan.md`(`Animate`가 0-Y 직접 영향 대상)와
`bind-system-plan.md`("남은 건 순수 API 표면 이름뿐"인데 자기 문서의 계약
둘이 열려 있음)엔 없었음.
**4라운드 (`1221512`, 2건, 그중 1건은 실제 로직 결함)**
`Dispatch.retractFrom``if retractor then ... end` 가드로 감싸고 있어서
핸들러가 계약을 어기고 `nil`을 반환해도 조용히 넘어감. 그런데 문서 두
곳은 "생략하면 `attempt to call a nil value`로 크래시"라고 서술 — 그
가드 때문에 **크래시조차 안 나는 게 실제**였음. 더 나쁜 건 진짜 결과:
`list[index] = nil`로 배열에 구멍이 나 (a) `#list`가 Lua 명세상 미정의가
되어 순회 시작점이 어긋나고 (b) 그 자리가 비어 보여 `Dispatch.process`
점유 체크를 통과 → **소유권 충돌 감지가 조용히 꺼짐**(0-Z가 다루는 바로
그 안전망). 가드에 걸리는 유일한 경우가 계약 위반뿐이므로 프로젝트의
"즉시 error" 원칙대로 전환, 서술 두 곳도 실제 실패 모드로 정정.
`CLAUDE.md` "계획 문서 구조"에 `luau-test/`·`audit/`가 통째로 누락돼
있던 것도 추가(지금 스파이크 상태의 소스와 0-Y의 근거로 가는 길이
진입점 지도에 없었음).
**5~6라운드 (커밋 없음)** — TagHandler 의사코드를 4개 시나리오로 손
트레이싱(같은 객체 재발행 → 조기 반환이 holders를 정확히 유지, `A→B`
부분 겹침 → 실제 `RemoveTag`/`AddTag`가 변경된 이름에만, 여러 위치 겹침
→ 참조 카운트 정확, `A→nil` → 전부 제거) — **정확함**. 수치 주장 전수
대조(우선순위1/2/단순화후보 = 11/11/2, 실제 헤딩 수와 일치), 우선순위1
11개 전원 본문에 해소 표시 확인, 우선순위2/3의 열린 4건은 게이트가 아니라
문서 주장과 모순 없음. 이번 세션에 안 열었던 research 8개 문서 스캔 —
파괴/portal 언어 잔존은 전부 `[2026-08-13 정정]` 주석이 이미 달려 있음.
**새 발견 0건.**
## 종료 판단
발견 추이 **9 → 2 → 3 → 2 → 0 → 0**. 직전 세션이 "수렴"으로 종료한
지점에서 16건이 더 나왔다는 게 이번 라운드의 결론이고, 그중 **1건은
문서 정합성이 아니라 실제 의사코드 결함**(`retractFrom`의 nil 가드).
## 이번 라운드가 드러낸 두 가지 감사 사각지대 (다음에 재사용할 것)
1. **"헤더에 정정 배너만 붙이고 본문은 안 고치는" 패턴** — 직전 감사가
4라운드에서 `CLAUDE.md` 1번 헤더에 배너를 달았지만 그 아래 bullet은
그대로 뒀음. 배너를 다는 수정을 했으면 **그 배너가 부정하는 문장을
실제로 찾아 고쳤는지** 같은 커밋에서 확인할 것.
2. **에이전트에 영역을 나눠 맡기면 "아무 영역에도 안 속한 파일"이 통째로
빠짐** — `HUMAN_TODO.md`가 6라운드 동안 한 번도 안 열렸고, 하필 가장
사람에게 중요한 문서였음. 영역 분할 감사를 할 땐 **레포 루트 파일
목록을 먼저 뽑아 커버리지를 체크**할 것.
부수적으로, 이번 세션 자체가 "서브에이전트 병렬 감사 vs 순차 직접 검증"의
대조 실험이 됨 — 전자가 넓게 훑는 데는 강했지만(6라운드 39건), 진입점
문서의 본문 자기모순과 의사코드 로직 결함은 후자에서만 나왔음.