name: deep description: "다중 페르소나(Lazy / Paranoid)로 코드를 독립 분석하고 codex 교차 검증을 더해 결함을 다관점에서 적대적으로 찾아야 할 때 호출한다. 사용자가 '심층 리뷰', '철저하게 봐', '다관점', '두 관점', 'exhaustive', '한 번 더 확인', '결함이 있는지 다 보자' 같은 표현을 쓰거나, PR이나 디렉토리·파일 변경을 가장 깐깐하게 검토받고 싶을 때 트리거된다. 변경 규모와 무관하게 적대성·다관점이 필요한 모든 케이스에 적합하다." argument-hint: "/deep [PR 번호 | 파일·디렉토리 경로]"
Deep
언제 쓰나
코드를 다관점으로 깊이 검토해 결함을 빠짐없이 찾고 싶을 때. 두 페르소나(Lazy / Paranoid)가 완전히 독립된 컨텍스트에서 같은 코드를 분석하고, codex 교차 검증을 병렬로 더해 단일 모델 편향을 회피한다. 페르소나 동의는 비공식 합의가 아니라 병합 단계에서 정리한다.
절차
Step 1: 컨텍스트 수집
대상이 (a) review/pr이 전달한 PR 컨텍스트인지, (b) PR 번호인지, (c) 파일·디렉토리 경로인지 확인한다.
- PR 컨텍스트 (review/pr 위임): 인자에
{number, base, head, worktree_path, is_new_worktree, title, body}가 포함된 경우.worktree_path안에서git diff {base}...HEAD로 diff 추출. PR 컨텍스트는 산출물에 함께 반환해 라우터(review/SKILL.mdStep 3)가 게시·정리 분기를 결정할 수 있도록 보존한다. - PR 번호 (직접 호출): dirty working tree 점검 후
gh pr checkout {N}→ diff 추출. 직접 호출에서는 라우터 Step 3에 PR 컨텍스트가 없으므로 게시·정리 분기가 자동으로 건너뛰어진다. - 경로: explore 스킬을 호출해 대상 파일을 수집한다. 50개를 넘으면 자연어로 되읽어 범위를 확인한다.
diff가 비면 "변경사항 없음" 안내 후 종료. 수집 결과를 REVIEW_CONTENT로 둔다.
Step 2: 핵심 실행 — 2-Persona 병렬 분석 + codex 교차 검증 + 정책 audit
출처 구성은 변경 규모·위험에 비례시킨다 (AGENTS.md 5축 적정 공학). 사용자가 deep을 호출한 이상 2-Persona 다관점은 어떤 규모에서도 유지한다(deep의 존재 이유) — 비례 대상은 추가 출처(codex 교차 검증·정책 audit)와 pre-commitment의 깊이다. 작고 되돌리기 쉬운 저위험 변경은 추가 출처를 생략하거나 pre-commitment를 간결화하고, 크거나 사용자·돈·데이터에 닿는 변경에 codex·audit·pre-commitment 3건의 깊이를 집중한다. 비례 기준은 수치로 박지 않고 맥락에서 판정한다. 단 다관점 적대성과 발견된 위해에 대한 검증 강도는 변경이 작다는 이유로 낮추지 않는다(가드).
병렬 시작 강제 — 페르소나 분석과 codex 교차 검증을 (수행 시) 동시에 시작한다. 페르소나 결과를 기다린 뒤 codex를 호출하지 않는다. 병렬성이 무너지면 codex 독립성이 훼손된다.
분석은 위임이 더 적합하므로 delegate 스킬에 넘긴다.
- Lazy Engineer (실용 관점) — "이거 지금 고쳐야 함? 나중에 해도 됨?" 동작·테스트가 충분하면 수용. 기존 부채와의 일관성·blast radius·대안의 단순성을 우선 판단.
- Paranoid Engineer (엄격 관점) — "이거 진짜 괜찮음? 한번 더 확인해" 아키텍처 완결성·테스트 커버리지·보안(인젝션·인증/인가 우회·민감 데이터 노출)·에러 핸들링 완전성·엣지 케이스 누락을 우선 의심.
- codex 교차 검증 — verify 스킬의 adversarial-review sub-skill을 호출해 설계 선택·숨겨진 가정·대안 접근법에 도전한다.
- Policy Audit — audit 스킬을 호출해 대상 diff·파일이 적용 가능한 정책·절차를 지켰는지 별도 판정한다. audit 결과는 결함 탐색 페르소나에게 공유하지 않는다.
두 페르소나에는 공통 지시를 둔다.
- Pre-commitment: 코드를 읽기 전 "이 변경에서 문제가 있다면 어디일까"를 예측해 출력 상단에 기록한다 — 사전 예측이 확증 편향을 줄인다. 예측 건수는 변경 규모·위험에 비례시킨다 (AGENTS.md 5축 적정 공학) — 작고 단순한 변경은 1건으로 줄일 수 있고, 크거나 위해 표면이 넓은 변경에 3건 이상의 깊이를 집중한다. 단 0건은 금지다 — 사전 예측 없이 코드를 읽으면 확증 편향이 결함 탐색을 가린다.
- 적대적 검증: 주석·커밋 메시지·PR 설명을 증거로 신뢰하지 않는다. 코드만으로 동작을 독립 재구성한 뒤 주석과 대조한다. "안전하다"고 주장된 부분을 우선 의심한다.
- 발견은 결함·정상·중립 어느 쪽이든 보고. 같은 위치에 양쪽 페르소나 발견이 겹칠 수 있다.
위임은 delegate 스킬을 호출해 6-Section 프롬프트로 형식화한다. Step 3의 추가 비평 1회는 각 페르소나에게 자기 발견의 부연·확인·철회만 요청하는 동일 발견자 후속 질의이므로, subagent 스킬이 정의한 후속 질의 예외에 따라 동일 에이전트를 resume한다 — 따라서 페르소나는 재개 가능한 에이전트 타입으로 스폰한다. codex는 verify 스킬 호출로 한다.
Step 3: 결과 작성·보고 — 병합 + verdict
출처(Lazy · Paranoid · codex · Audit)의 발견을 병합한다. 규모 비례로 codex·audit을 생략했으면 수행한 출처만 병합하고, 생략 사유를 리포트에 한 줄 명시한다(2-Persona는 항상 포함).
- 합의 발견: 같은 위치·같은 결함 → 단일 항목으로 통합, 출처를 합집합으로 병기
[Lazy, Paranoid, Codex, Audit]. 단일 출처가 합의를 임의로 덮어쓰지 않는다. - 불일치 발견: 같은 위치인데 한 쪽은 결함·다른 쪽은 정상 → 양쪽 모두 보존하고 "unresolved" 태그. 양쪽 주장과 근거를 모두 리포트에 남긴다.
- 단일 출처 발견: 한 출처만 제기 → 그대로 보존, 출처 태그 단일.
병합 결과에 심각도 ≥ MAJOR가 있거나 unresolved가 남아 있으면 두 페르소나에 1회씩만 추가 비평을 요청해 confirmed / withdrawn / unresolved로 정리한다. 왕복은 금지 — 자율 토론으로 퇴화한다.
verdict는 다음 우선순위로 기계적으로 결정한다.
| 우선 | 조건 | verdict |
|---|---|---|
| 1 | unresolved가 MAJOR 이상으로 남음 | REQUEST_CHANGES (차단 해제 불가) |
| 2 | confirmed 발견 중 심각도 ≥ MINOR 존재 | REQUEST_CHANGES |
| 3 | 위 조건 모두 미충족 | APPROVE |
STYLE / nitpick은 코멘트로 남기되 verdict를 차단하지 않는다.
산출물은 두 개다.
report.html— write 스킬(human-docs)에 위임해 작성. 본문은 (대상 · Pre-commitment · 페르소나별 발견 · codex 발견 · audit 발견 · 병합 결과 · unresolved · 발견 목록 final · verdict) 순으로 구성하고, 출처 태그는 합집합 그대로 보존한다.comment-candidates.json— 사용자 확정 단계의 입력. 각 발견을 GitHub Review Comments API 호환 sidecar 후보 형식으로 직렬화. 필드:id,path,line,side(RIGHT기본),start_line(다중 라인 한정),start_side,severity(CRITICAL/MAJOR/MINOR/STYLE),sources(Lazy/Paranoid/Codex/Audit 합집합),body(발견 요약 + 근거 + 권고).
두 산출물의 경로와 PR 컨텍스트(있는 경우)를 호출자(라우터)에 반환한다. comment candidate 사용자 확정·comments.json 최종 저장·게시·worktree 정리는 라우터 Step 3 단일 소스에서 처리한다.
제약·실패 모드
절대 규칙
- 두 페르소나 분석과 codex 교차 검증을 병렬로 시작한다. 순차 실행 금지 — 왜: codex 독립성이 페르소나 결과에 오염되면 교차 검증의 의미가 사라진다.
- 각 페르소나는 독립된 컨텍스트에서 시작한다. 분석 전에 다른 페르소나 결과를 공유하지 않는다 — 왜: 사전 공유는 독립 분석을 비공식 합의로 퇴화시킨다.
- Pre-commitment를 출력 상단에 첨부하지 않은 페르소나 결과는 재요청한다. 건수는 변경 규모·위험에 비례시키되(소규모 1건까지 축소 가능, 큰 변경에 3건 이상 집중) 0건은 금지다 (AGENTS.md 5축 적정 공학) — 왜: 사전 예측이 빠지면 확증 편향이 결함 탐색을 가린다. 건수 비례는 깊이 조정이지 생략이 아니다.
- 추가 비평은 페르소나당 1회 발화로 한정한다. 후속 반박 라운드 금지 — 왜: 왕복은 자율 토론으로 퇴화해 병합 단계의 결정력을 없앤다.
- 라우터·메인은 병합 결과에서 발견을 임의로 drop·downgrade하지 않는다. 심각도 조정·발견 제거·LOW 강등은 페르소나의 명시적 withdrawn을 통해서만 한다 — 왜: 단일 권한자가 발견을 조작하면 다관점 분석의 결과가 무력화된다.
- MINOR 이상 확정 발견은 verdict를 차단한다. STYLE / nitpick은 코멘트만 — 왜: MINOR 이상은 실질적 코드 문제이며 해결 없이 APPROVE하면 결함이 누적된다.
- codex 호출이 실패해도 두 페르소나 결과만으로 진행한다. 실패 사유를 리포트에 명시한다 — 왜: 단일 호출 실패로 전체 리뷰를 중단시키면 합리적 진행이 막힌다.
- audit은 정책 준수 출처일 뿐 Lazy/Paranoid/codex를 대체하지 않는다 — 왜: 정책 검사는 결함 탐색·설계 도전과 다른 축이다.
- 게시·worktree 정리를 본 스킬에서 직접 수행하지 않는다. 라우터(
review/SKILL.mdStep 3) 단일 소스에 산출물과 PR 컨텍스트(있는 경우)를 반환한다 — 왜: 게시·정리 책임이 sub-skill과 라우터 두 곳에 분산되면 modal 분기·정리 누락이 발생한다. comment-candidates.json후보는 사용자 확정 단계의 입력이다. 본 스킬은 후보를 자동 채택하거나 가공하지 않는다 — 왜: 후보 자동 채택은 다관점 분석의 검토 입력 성격을 무너뜨린다.
결정 규칙
| 조건 | 행동 | 왜 |
|---|---|---|
| 두 페르소나가 동일 위치를 결함·정상으로 갈라짐 | unresolved 태그로 보존, 비평 1회로 정리 | 비공식 합의로 한쪽 의견을 덮으면 적대성이 무력화 |
| 발견이 STYLE만 잔존 | verdict APPROVE, 코멘트로만 남김 | STYLE 차단은 개발 속도만 저하 |
| codex 호출이 실패 | 페르소나 결과만으로 진행, 사유 명시 | 외부 호출 실패가 전체 차단으로 이어지면 안 됨 |
실패 모드
| 합리화 신호 | 현실 |
|---|---|
| "두 페르소나가 모두 동의했으니 합의된 결함이다" | 합의는 병합 단계에서 정리한다. 비공식 브로드캐스트로 동의를 선언하면 unresolved 처리가 사라진다. |
| "사소한 스타일이지만 지적해야 품질이 올라간다" | STYLE로 verdict를 차단하면 개발 속도만 저하. 코멘트로 남기되 차단하지 않는다. |
| "Pre-commitment는 형식이니 결과에 영향 없다" | 사전 예측 없이 코드를 읽으면 확증 편향이 결함 탐색을 가린다. 형식이 정신이다. |
| "병렬 시작이 부담이니 페르소나 끝나면 codex 부르자" | 순차 실행은 codex 독립성을 훼손한다. 병렬 호출은 시간이 아니라 독립성을 위한 설계다. |
| "내가 보기엔 MAJOR가 아니라 MINOR다, 강등하자" | 메인은 심각도를 조정할 수 없다. 페르소나의 명시적 withdrawn만 허용. 메인 강등은 절대 규칙 위반. |
| "unresolved지만 사실 문제 없다, APPROVE 가능" | unresolved가 MAJOR 이상이면 verdict는 REQUEST_CHANGES 고정. 차단 해제 불가. |
| "codex 호출이 실패했으니 deep 리뷰 자체를 중단하자" | 페르소나 결과만으로 진행하고 사유를 리포트에 명시. 단일 호출 실패가 전체 중단으로 번지면 안 된다. |
| "작은 변경이니 2-Persona도 하나로 줄이자" | 비례 대상은 추가 출처(codex·audit)와 pre-commitment 깊이다. 사용자가 deep을 호출한 이상 2-Persona 다관점은 가드로 유지한다. |
| "변경이 작으니 pre-commitment 0건으로 건너뛰자" | 건수는 규모에 비례하되 0건은 금지. 사전 예측 없이 읽으면 확증 편향이 결함을 가린다. |