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

7.5 KiB

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라운드가 같은 사유로 다른 곳을 고쳤던 것), reconcilerawRemove를 부른다는 서술 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.retractFromif 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건), 진입점 문서의 본문 자기모순과 의사코드 로직 결함은 후자에서만 나왔음.