tooling: 감사 루프를 병렬 다패스에서 순차 1패스/턴으로 재설계

사용자 지침 — "시간이 걸려도 상관 없으니, 차라리 병렬 에이전트를 덜 써줘.
그냥 한 턴에 하나씩만 사용하고, 0 이 나올때 까지 턴 수를 늘리는게
나아보임. 토큰을 너무 많이 소비해서 다른 작업을 못 하고, 세션 한도에
닿더라고."

- quad-doc-auditor는 한 턴에 하나만 호출(병렬 금지) — 2026-08-16의
  "최소 2개, 변경이 많으면 3~4개" 지침을 대체. 커버리지는 병렬 폭이
  아니라 턴 수로 얻는다. 근거 실측: 전 코퍼스 한 패스가 서브에이전트
  토큰 21만/툴 호출 82회, 4개 병렬이면 한 번에 80만대.
- 프롬프트로 범위를 diff로 좁힐 것을 신설(바뀐 파일 + 그걸 인용하는 곳).
  전 코퍼스 스윕은 오래 안 돌렸을 때만. 라운드마다 각도를 바꿔 병렬로
  얻던 폭을 턴으로 대체.
- 종료 조건을 "무발견 2연속"에서 "무발견 1회"로 완화(2연속은 병렬 다패스
  전제였음). 비용 때문에 중간에 멈출 때도 몇 라운드에서 왜 멈췄는지
  반드시 보고.
- /code-review는 감사자를 대체하지 않는다를 실측과 함께 명문화 — 이번
  핸드오버에서 감사자 1패스(1건) 뒤 /code-review high가 10건을 더 잡았고
  전부 유효했다(보는 축이 다름). 사용자만 호출 가능하므로 큰 변경 커밋
  전엔 돌릴지 물어볼 것.

Co-authored-by: qwreey <me@qwreey.moe>
This commit is contained in:
qwreey-agent-selene 2026-08-18 19:45:36 +09:00
parent 8b57cfbb3c
commit d768e4cbc5
No known key found for this signature in database
4 changed files with 70 additions and 19 deletions

View file

@ -30,7 +30,7 @@
| `luau-test/` | **[2026-08-09 신설]** `base/` 확정 사항 중 "추론만으로 확정하고 실제 Luau로 부딪혀본 적 없는 것"(M0 스파이크 대상)을 `luau`/`luau-analyze`/`luau-lsp`/Roblox Studio로 사용자가 직접 돌려볼 독립 실행 스크립트 모음. **[2026-08-13 여섯 번째 세션, 첫 실측]** `luau`/`luau-analyze` 바이너리가 생겨 처음으로 실제 실행 — **런타임 12개 전원 통과**, 타입 쪽에서 `:Compute(fn)` lazy 핸들 계약이 Luau 추론과 충돌하는 게 드러남(당시 `question.md` 0-Y). **[2026-08-13 열세 번째 세션]** 그 0-Y가 해소되며 `review-required/`**비었음** — 계약은 유지 확정, 남은 건 Luau 자체 한계라 `base/typing-limits.md`가 담당. **`STATUS.md`가 상태의 소스**(pass / 사람 결정 필요 / 스파이크 깨짐 / 미실행 분류 — 사람이 먼저 볼 것만 위에), `luau-test/README.md`는 각 파일의 검증 의도·배경, 실행 결과 상세는 `audit/luau-test-first-run-2026-08-13.md` |
| `audit/` | **[2026-08-13 신설]** `luau-test/` 등 스파이크를 실제로 돌려본 뒤 "무엇이 확인됐고 무엇이 아직 안 됐는지"를 기록하는 곳 — 스크립트/계획 자체가 아니라 **실측 결과**만 다룸. base/luau-test와 달리 부분 확인(일부만 통과)도 있는 그대로 기록, 완전히 해소되면 관련 `base/`/`luau-test/README.md` 캐비엇을 지우고 이 문서는 근거로 남김. **개수는 폴더가 소스**(여기서 세지 않음): `luau-test-first-run-2026-08-13.md`(첫 실측 라운드 전체 — 런타임 12개 통과, 구 `question.md` 0-Y의 1차 근거. **단 이 문서의 "콜백이 raw 값을 받으면 완전 클린" 판정은 아래 `type-recursion-issue/`가 뒤집었음**), `gcconn-trick-verification.md`(사용자가 Studio에서 직접 돌린 gcconn 트릭 부분 확인 — `10`의 A 섹션 앞부분만. **[2026-08-14 다섯 번째 세션, 열한 번째 세션에 `canBound` 재도입 반영해 재갱신]** 실측된 사실 자체는 그대로 유효하고 `value` 단독 1-인자 재정정으로 오히려 더 중요해졌음 — 이중 바인딩 게이트(`canBound`)/emit 게이팅(`canExecute`)/재바인딩 허용/`value` 쪽 복사 gcconn 판정/Instance userdata 동일성/B/C가 미확인), **`type-recursion-issue/`**(**[2026-08-13 열세 번째 세션 신설]** 0-Y 재실측 전체 — `REPORT.md` + `spikes/`(개수는 폴더가 소스). 다른 audit 기록과 달리 **스크립트를 같이 둠**: 이 건의 근거가 "여러 formulation을 서로 대조한 것"이라 개별 파일을 직접 돌려야 판정이 재현되기 때문. 결론은 `base/typing-limits.md`로 승격됨), `fallback-xpcall-verification.md`(**[2026-08-14 신설]** `base/fallback-plan.md``Traceback` 메커니즘 전부 확인 — 클로저 업밸류 배선/중첩 스택 캡처/`err: any`/`error(msg)` 위치 접두 10개 검증 전부 통과. 스크립트 1개뿐이라 재현용으로 같이 둠: `fallback-xpcall-spike.luau`), **`type-recursive-issue-with-typeof/`**(**[2026-08-15 신설]** 사용자가 발견한 `typeof(named fn)` 간접참조가 0-Y(재귀 제네릭 반환 leak)를 실제로 우회하는지 실측 — `REPORT.md` + `spikes/`. 결론: 인라인 대신 이름 붙은 함수 + `typeof`로 선언하면 LHS 명시 없이도 다운스트림이 안전해짐(체이닝 50단·타입 변경·중첩 self 호출까지 확인), `typing-limits.md` §1 ③으로 승격. 부수적으로 `setmetatable` 확장 시도에서 quad와 무관한 Luau 0.733 솔버 버그(모순 진단 두 개 동시 발생) 발견, 채택 안 함. `luau-test/16`(type function으로 `Store<T>` 레코드 필드 합성) 복구도 이 조사 중 완료 — API 버전 드리프트였을 뿐 설계 문제 아니었음, `typing-limits.md` §5 승격), **`type-recursive-issue-try-callback/`**(**[2026-08-15 신설]** 콜백 파라미터 무주석 추론을 뚫을 방법이 정말 없는지 type function/메타테이블/오버로드/제네릭 디폴트 등 전방위로 재시도 — `REPORT.md` + `spikes/`(개수는 폴더가 소스 — 최초 라운드 + `/code-review high`가 이중 꺾쇠 명시적 제네릭 인스턴스화를 안 시도했음을 지적해 추가된 후속 조사 라운드로 구성). 결론: quad의 `state:Compute(fn)` 단일 호출 모양을 유지한 채로는 여전히 안 됨. 발견 셋 — (1) 근본 원인이 재귀 자기참조가 아니라 "제네릭 콜백 인자 전반에 컨텍스트 타입 전파가 안 됨"이라는 게 더 정확함(재귀 없는 최소 사례로도 재현), (2) `T`를 명시 중간 변수로 먼저 고정하거나 재사용 가능한 monomorphize 헬퍼를 거치면 실제로 추론이 살아나지만 둘 다 단일 콜론 호출을 2단계 체인으로 바꿔야만 해서 §0 대전제로 채택 안 함, (3) 이중 꺾쇠 명시 인스턴스화(`Compute<<T,U>>(fn)`)는 leaf 호출에선 sound하게 성립하지만(spurious 진단 원인도 규명 — read-only/read-write 가변성 불일치) 매 호출 T/U 전부 명시 필요 + 중첩 self 호출 여전히 실패라 순손해로 채택 안 함) |
| `tools/` | **[2026-08-13 신설, `session/2026-08-13-09-structure-and-guardrails.md`]** 코퍼스 기계 점검 — `doc-check.py`가 깨진 파일/절 참조, README 색인 누락, 날짜 없는 시한부 주장("아직 안 돌려봄" 등), 미반영 ⚠️ 배너를 한 번에 훑음. **[2026-08-16]** 절 참조는 WARN이 아니라 **ERROR** — 판정 규칙은 `conventions.md`의 "절 인용 규약"이 소스. **중대 변경 후 커밋 전에 돌릴 것**(`python3 .claude/tools/doc-check.py`) — 수동 감사에서 나온 발견의 대부분이 이 종류였고, 실제로 문서를 쪼개다 잘못 옮긴 참조를 이게 잡아냄. ERROR는 고치고 WARN은 판단 대상 |
| `agents/` | **[2026-08-16 신설]** 프로젝트 서브에이전트 정의(`.claude/agents/*.md`, Claude Code 표준 위치). 현재 `quad-doc-auditor.md` 하나 — `doc-check.py`가 못 잡는 의미론적 stale/모순(본문 문장이 뒤집힌 결정을 여전히 서술, 개수/목록 이중 소스 드리프트 등)을 신선한 맥락에서 찾는 읽기 전용 감사자. 중대 변경 커밋 전에 위임하는 게 기본 — **여러 개를 병렬로 돌리고 수정은 메인 세션이 일괄로 하는 루프**(패스 수는 여기 안 적음 — 소스는 conventions.md)이며 절차는 `.claude/conventions.md` "작업 방식" 절이 소스(**[2026-08-16]** 이 루프를 담던 `workflows/quad-handover-audit.js`는 토큰 과다·픽스 에이전트발 부정확 서술·사용자 질의 불가 때문에 폐기됨). `tools/`의 기계 점검과 짝을 이루는 의미론적 점검 계층 |
| `agents/` | **[2026-08-16 신설]** 프로젝트 서브에이전트 정의(`.claude/agents/*.md`, Claude Code 표준 위치). 현재 `quad-doc-auditor.md` 하나 — `doc-check.py`가 못 잡는 의미론적 stale/모순(본문 문장이 뒤집힌 결정을 여전히 서술, 개수/목록 이중 소스 드리프트 등)을 신선한 맥락에서 찾는 읽기 전용 감사자. 중대 변경 커밋 전에 위임하는 게 기본 — **[2026-08-18 재설계] 한 턴에 하나씩만 돌리고(병렬 금지) 발견이 0건인 라운드가 나올 때까지 턴을 늘리는 루프**, 수정은 메인 세션이 일괄로 함(라운드 수·범위 좁히기 규칙은 여기 안 적음 — 소스는 conventions.md)이며 절차는 `.claude/conventions.md` "작업 방식" 절이 소스(**[2026-08-16]** 이 루프를 담던 `workflows/quad-handover-audit.js`는 토큰 과다·픽스 에이전트발 부정확 서술·사용자 질의 불가 때문에 폐기됨). `tools/`의 기계 점검과 짝을 이루는 의미론적 점검 계층 |
| `agent-memory/` | **[2026-08-16 신설]** 서브에이전트가 라운드를 넘겨 유지하는 영속 메모리(`agent-memory/<에이전트 이름>/MEMORY.md`가 색인). 지금은 `quad-doc-auditor/` 하나 — 코퍼스 구조, 반복되는 실패 패턴 등을 기억해 감사 라운드마다 처음부터 파악하지 않게 함. **사람이 손으로 채우는 문서가 아니라 에이전트가 스스로 쓰는 것**이지만, `.gitignore` 대상이 아니라 커밋하면 코퍼스 일부가 되고 `doc-check.py` 검사 대상에도 들어감(감사 대상이기도 하다는 뜻 — 여기 적힌 주장도 stale해질 수 있음). **[2026-08-16 확정] 커밋해서 추적함**(사용자 결정). 사용자 논거: "실 기록이고 디펜던시도 아니고, 어차피 `SAFETY.md`에 따라 구현 시점에는 컨테이너에서 개발되며 다른 프라이빗 git에 올라가고 검토 후 머징되는거라, 문제되는 메모리 있으면(환경 노출 등) 사람이 감사처리 마지막으로 함. 결국 프로젝트 사이드 기록이고 같이 올려지는게 맞는게, 개발 환경이 다수라서 필요해보임" — 즉 **개발 환경이 여러 개라 메모리가 따라다녀야 하고**, 노출 위험은 머지 전 사람 검토가 최종 방어선. 커밋하는 쪽이 정해졌으니 여기 내용도 감사 대상이다(에이전트가 자기 메모리에 stale한 결론을 남기는 일이 실제로 있었음 — 2026-08-16에 폐기된 워크플로를 살아있는 것처럼 서술한 2건이 감사로 잡힘) |
| `session/` | **[2026-08-11 신설]** 세션별 상세 로그 원문(시행착오·정정 전 서술 포함, `quadnomicon` 개발로그 소재용) — 루트 `CLAUDE.md`가 3196줄까지 불어나 성능 저하를 유발해서 분리함. 파일명 `YYYY-MM-DD-NN-slug.md`, `.claude/session-summary.md`의 각 항목이 여기로 링크. 항상 읽을 필요 없음 — 결정의 논의 과정이 궁금할 때만 |
| `initreq/` | 프로젝트 착수 시 클론해둔 참고 레포(quad v1, fusion, vide, rbvm, tbox, code-docker) + PA님 실 코드(`artworks/`, 4차 라운드 교차검증 근거) + 원본 요청(`req.md`, `raw-userinput.md`) + `quad2-try`(이전에 시도했다 폐기한 v2 재작성 시도 — 리서치 완료, 결론은 `base/bind-system-plan.md`) — 읽기 전용 리서치 소스, 여기 내용을 옮기지 말고 항상 원본 그대로 유지 |

View file

@ -189,9 +189,10 @@ haiku, 일반 작업은 sonnet. 특히 소스코드를 많이 읽어야 하는
짜는 대신 고정 정의로 옮긴 것. **아주 큰 변경**(설계 반전 규모)엔 이걸로
대체하지 말고 `/code-review`(diff 기반)와 사용자의 직접 diff 검토를
병행할 것 — 이 서브에이전트는 diff가 아니라 코퍼스 전체의 정합성만 봄.
- **⭐ [2026-08-16 재설계] "핸드오버 준비하고 커밋해" 류 요청엔 되묻지 말고
아래 감사 루프를 돌릴 것.** 단일 `quad-doc-auditor` 패스는 비결정적이라
매번 다 잡는다는 보장이 없다는 게 사용자 지적 — 그래서 병렬 다회로 돌린다.
- **⭐ [2026-08-16 신설, 2026-08-18 재설계] "핸드오버 준비하고 커밋해" 류
요청엔 되묻지 말고 아래 감사 루프를 돌릴 것.** 단일 `quad-doc-auditor`
패스는 비결정적이라 매번 다 잡는다는 보장이 없다 — 그래서 **여러 번**
돌린다. 다만 **여러 개를 동시에 띄우지는 않는다**(아래 1번).
**처음엔 이걸 Workflow(`quad-handover-audit.js`)로 만들어 픽스까지
서브에이전트에 맡겼으나, 첫 실동에서 에이전트 67개·4.6M 토큰을 쓰고도
수렴하지 못해 2026-08-16에 폐기**(원문은 `archive/`가 아니라 git 히스토리와
@ -199,34 +200,61 @@ haiku, 일반 작업은 sonnet. 특히 소스코드를 많이 읽어야 하는
갈림, (2) 파일별로 픽스 에이전트를 쪼개니 **그 에이전트들이 또 부정확한
서술을 새로 만들어냄**, (3) 서브에이전트는 사용자에게 물을 수가 없어서
판단이 필요한 항목이 그냥 임의 처리됨. 지금 절차:
1. **`quad-doc-auditor`를 한 메시지에서 병렬 호출**(Agent 도구 직접 호출
— Workflow 안 씀). **최소 2개, 변경 사항이 많으면 그만큼 늘릴 것**
사용자 지침(2026-08-16): "최소 2에, 변경 사항이 많아진다면 batch 수가
늘어나는게 맞다고 봄". 감사자는 sonnet이라 패스당 비용이 낮고 역할이
"빠르게 전체를 훑는 것"이라, 커버리지를 넓히는 쪽이 이득인 구조다
(사실 검증은 상위 모델인 메인이 한다). 기준은 라이브 문서 몇 개가
바뀌었나 — 두어 개 고친 정도면 2개, 설계 반전이나 문서 분할처럼
코퍼스 전반을 건드린 변경이면 3~4개.
1. **`quad-doc-auditor`는 한 턴에 하나만 호출한다 — 병렬 금지**
(Agent 도구 직접 호출, Workflow 안 씀). **사용자 지침(2026-08-18):
"시간이 걸려도 상관 없으니, 차라리 병렬 에이전트를 덜 써줘. 그냥 한
턴에 하나씩만 사용하고, 0 이 나올때 까지 턴 수를 늘리는게 나아보임.
토큰을 너무 많이 소비해서 다른 작업을 못 하고, 세션 한도에 닿더라고."**
이건 2026-08-16의 "최소 2개 병렬, 변경이 많으면 3~4개로 늘림" 지침을
**대체한다** — 커버리지를 병렬 폭이 아니라 **턴 수**로 얻는다.
근거가 된 실측(2026-08-18): 전 코퍼스 감사 **한 패스가 서브에이전트
토큰 21만 / 툴 호출 82회**였고, 계획대로 4개를 병렬로 돌렸으면 한
번에 80만 토큰대였다 — 세션 한도를 그 자리에서 태워 정작 본 작업을
못 하게 된다.
**감사자 모델은 `sonnet` 유지 — haiku로 더 낮추지 말 것**(사용자
판단, 2026-08-16). 실제로 이 감사가 잡아온 것들(재역전된 배너, 자기
메모리의 stale 서술)은 문맥 추론이 꽤 들어간 발견이었다.
2. **두 리포트를 메인 세션이 합쳐서 검토하고, 수정도 메인이 일괄로 한다.**
2. **⭐ [2026-08-18 신설] 프롬프트로 감사 범위를 좁힐 것 — 기본은 diff
범위다.** 감사자 정의 자체는 "코퍼스 전체를 신선한 맥락에서 다시
읽는다"인데(라이브 문서 90개 이상, `base/`만 1만 줄 이상), 대부분의
핸드오버에서 실제로 위험한 건 **이번에 바뀐 파일과 그걸 인용하는
곳**이다. 그래서 프롬프트에 (a) 바뀐 파일 목록, (b) 이번에 뒤집힌
결정 목록, (c) "그 파일들을 인용하는 곳까지만 확장해서 보라"를 명시할
것. 전 코퍼스 스윕은 **오래 안 돌렸을 때 한 번씩**만.
라운드마다 각도를 바꾸면(예: 1라운드는 `base/` 정합성, 2라운드는
인덱스 레이어(README/ROADMAP/question/todos), 3라운드는
archive/luau-test/audit) 병렬로 폭을 넓히던 효과를 턴으로 얻을 수 있다.
3. **리포트는 메인 세션이 검토하고, 수정도 메인이 한다.**
픽스를 서브에이전트에 위임하지 말 것(위 (2)번 이유). 감사자는 읽기
전용이고 발견만 리포트한다.
3. **애매하면 임의로 정하지 말고 그 자리에서 사용자에게 보고할 것.**
4. **애매하면 임의로 정하지 말고 그 자리에서 사용자에게 보고할 것.**
메인 세션은 사용자에게 물을 수 있다는 게 서브에이전트 대비 유일한
강점이니 그걸 쓸 것(어떤 발견이 여기 해당하는지 판정 기준은
`.claude/agents/quad-doc-auditor.md`의 "출력 형식" 절이 소스 — 여기서
다시 나열하지 않음).
4. **새 발견이 없는 라운드가 연속 2번 나올 때까지 1~2를 반복**(보통
2~3라운드). **수렴 안 하면 조용히 멈추지 말고 사용자에게 보고할 것**
5. **새 발견이 0건인 라운드가 나올 때까지 1~3을 반복**(사용자 지침
2026-08-18의 "0 이 나올때 까지 턴 수를 늘리는게"). 옛 규칙이던 "무발견
**2연속**"은 병렬 다패스를 전제한 것이라 같이 완화됐다 — 대신 라운드마다
각도를 바꾸는 것(위 2번)이 그 역할을 대신한다.
**수렴 안 하면 조용히 멈추지 말고 사용자에게 보고할 것**
첫 실동이 실제로 6라운드를 소진하고도 수렴 못 했고(새 발견
28→15→16→7→11→6, 단조 감소가 아니었음), 그때 조용히 끊으면
"감사 통과"로 오독된다.
5. `python3 .claude/tools/doc-check.py`로 ERROR 0을 최종 확인한 뒤 평소
"감사 통과"로 오독된다. 비용 때문에 중간에 멈출 때도 마찬가지로
"몇 라운드에서 왜 멈췄는지"를 반드시 보고할 것.
6. `python3 .claude/tools/doc-check.py`로 ERROR 0을 최종 확인한 뒤 평소
커밋 절차(git status/diff 검토, 메시지 작성)로 넘어갈 것.
**`git commit`은 항상 메인 세션이 직접 함** — 커밋 전 diff 재검토는
대화형 맥락이 필요해서 위임하지 않는다.
- **⭐ [2026-08-18 실측] `/code-review`는 감사자를 대체하지 않는다 — 큰
변경에는 둘 다 필요하다.** 2026-08-18 핸드오버에서 감사자 1패스가 1건을
잡은 뒤 사용자가 `/code-review high`를 직접 돌리자 **10건이 더 나왔고
전부 유효**했다. 둘이 보는 축이 다르기 때문 — 감사자는 **코퍼스 전체의
의미론적 정합성**(A 문서의 결정과 B 문서의 서술이 어긋나는가), code-review는
**diff 자체의 결함**(이번에 새로 쓴 서술 안의 모순, 새 API가 기존 계약과
충돌하는가). 실제로 그 10건엔 "새로 확정한 `store:GetDynamic`이 Store의
lazy `__index`와 충돌해 그대로 구현하면 런타임 에러"처럼 감사자 각도에선
안 보이는 것이 있었다. **`/code-review`는 사용자만 호출할 수 있으므로**,
큰 변경을 커밋하기 전엔 그걸 돌릴지 사용자에게 물어볼 것.
- **문서가 쌓이면서 모순/중복/stale 마커가 생기기 쉬움 — 주기적으로 감사할
것.** 다만 위 체크리스트+`doc-check.py`+`quad-doc-auditor`가 자리잡으면
이 감사는 "기계도 서브에이전트도 못 보는 것"(설계 자체의 자기모순, 의사코드

View file

@ -1482,4 +1482,6 @@ blob과 바이트 단위로 동일, 메인이 `git rev-parse`로 독립 확인).
Store의 lazy `__index`와 충돌 / `PopOnly` 홀드 중 키가 사라지면 파괴도 반환도
안 됨)이 있어 새 열린 질문으로 올렸다. **감사 비용 메모**: 감사자 한 패스가
서브에이전트 토큰 21만이라(코퍼스 전체를 다시 읽는 정의라서) 계획했던 4패스를
중단했음 — 다음엔 diff가 건드린 파일로 범위를 좁혀 프롬프트할 것.
중단했음. **그래서 사용자 지침으로 감사 절차 자체를 바꿨다** — 병렬 금지(한
턴에 하나), 범위는 diff로 좁히고 라운드마다 각도를 바꿈, 종료 조건은 무발견
1회(옛 "2연속"은 병렬 전제라 완화). `conventions.md`의 감사 루프 절이 소스.

View file

@ -148,6 +148,27 @@ diff 자체의 결함):
전 "대기 중/잠정 표기" 잔여, `documentation-content-map.md``D` 스윕에서
누락.
## 절차 변경 — 감사 루프를 병렬에서 순차로 (사용자 지침)
이번 라운드의 토큰 소비를 보고 사용자가 감사 절차 자체를 바꿨다:
> "시간이 걸려도 상관 없으니, 차라리 병렬 에이전트를 덜 써줘. 그냥 한 턴에
> 하나씩만 사용하고, 0 이 나올때 까지 턴 수를 늘리는게 나아보임. 토큰을
> 너무 많이 소비해서 다른 작업을 못 하고, 세션 한도에 닿더라고."
`conventions.md`의 감사 루프 절을 그에 맞게 재작성했다 — (1) **병렬 금지,
한 턴에 하나**(2026-08-16의 "최소 2개 병렬" 지침을 대체), (2) **프롬프트로
범위를 diff로 좁힐 것**(전 코퍼스 스윕은 오래 안 돌렸을 때만), 라운드마다
각도를 바꿔 병렬로 얻던 폭을 턴으로 얻는다, (3) 종료 조건은 **무발견 1회**
(옛 "무발견 2연속"은 병렬 다패스 전제라 같이 완화), (4) 비용 때문에 중간에
멈출 때도 "몇 라운드에서 왜 멈췄는지" 반드시 보고.
같이 명문화한 것: **`/code-review`는 감사자를 대체하지 않는다** — 이번에
감사자 1패스(1건) 뒤 `/code-review high`가 10건을 더 잡았고 전부 유효했다.
보는 축이 달라서다(감사자=코퍼스 전체 정합성, code-review=diff 자체의 결함).
`/code-review`는 사용자만 호출할 수 있으므로, 큰 변경 커밋 전엔 돌릴지
물어보는 것을 관례로 넣었다.
## 도구/절차 메모
- `doc-check.py`: 처음 돌렸을 때 ERROR 6건 — 전부 **내가 절 제목을 바꾸는