Community코딩 & 개발github.com

dknchris/multimodel-review

현재 브랜치에서 다중 모델 리뷰 루프 실행: Codex 리뷰어(Terra 기본, Astra, Sol, Luna 선택)와 Claude 리뷰어(Opus 기본, Fable, Sonnet, Haiku 선택)가 참여하며, 이 세션이 유일한 수정자 역할을 수행합니다. 코드, 정리, 문서, 최종 단계를 거칩니다.

multimodel-review란 무엇인가요?

이 스킬은 Codex와 Claude 모델을 동시에 사용하여 코드 리뷰를 수행하는 다중 모델 리뷰 루프입니다. 사용자는 다양한 리뷰어(Codex: Terra, Astra, Sol, Luna / Claude: Opus, Fable, Sonnet, Haiku)와 각자의 노력 수준(low/medium/high/xhigh/max)을 선택할 수 있으며, 리뷰 길이(code:20-50, spare:2-6)도 설정 가능합니다. `/multimodel-review` 명령어로 시작되며, Code, Cleanup, Docs, Final 단계를 순차적으로 진행합니다. 각 리뷰어는 동일한 커밋을 독립적으로 리뷰하고, Fixer 역할을 하는 이 세션에서만 수정을 수행합니다. Claude Code, Cursor 등 다양한 플랫폼에서 사용할 수 있도록 설계되었으며, 모든 상태는 `~/.claude/multimodel-review/`에 저장됩니다.

지원 대상✓Claude Code✓Codex CLI~Cursor
npx skills add https://github.com/dknchris/multimodel-review/tree/HEAD

Installed? Explore more 코딩 & 개발 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

다중 모델 리뷰 (Codex + Claude)

독립적인 리뷰어들이 동일한 커밋에서 동일한 프롬프트를 읽습니다. 이 세션이 유일한 수정자입니다. 높은 노력(high effort)으로 Opus 5.5 세션에서 실행하세요.

옵션: $ARGUMENTS

설정

  • 라운드 상한: 코드 2050 (기본 20; 선택기의 Standard, Long, Max는 각각 20, 35, 50), 문서 2, 최종 2, 추가로 근거 라운드를 위한 여유 라운드 26 (기본 2). 하드 스탑: 기본적으로 이들의 합인 26. 각 단계는 첫 번째 깨끗한 라운드에서 종료되므로 상한은 최대치입니다. 이전 실행은 자체 상한과 제한을 유지합니다.
  • 리뷰어: 기본적으로 Terra (gpt-6.1-terra)와 Opus (Opus 5.5). 선택 사항: Fable (Fable 5.2), Astra (gpt-6-astra), Sol (gpt-6.1-sol), Sonnet (Sonnet 5.5), Haiku (Haiku 5.5) 및 Luna (gpt-6-luna). 이 변경 이전에 시작된 실행은 Opus 리뷰어를 claude라고 호출합니다.
  • 노력 수준은 실행당 각 리뷰어에 대해 설정됩니다: low, medium, high, xhigh 또는 max. 기본값: Codex max, Claude 모델 xhigh.
  • 기본 패널: terra:max:fast opus:xhigh code:20 spare:2.
  • Codex 빠른 모드(우선 순위 계층)는 실행당 각 Codex 리뷰어에 대해 설정됩니다. Claude 모델에는 절대 적용되지 않습니다.
  • 각 Codex 실행은 10분간 응답이 없거나 총 60분 후에 중지됩니다. 충돌 및 빈 응답은 1회 재실행됩니다. 형식 때문에 응답이 재실행되지 않습니다.

아래 도우미는 이러한 제한을 적용하고 모든 상태를 ~/.claude/multimodel-review/에 모든 저장소 외부에 유지합니다. 장기 실행은 압축되고 보고서를 메모리에서 재구성할 수 없기 때문입니다. 매번 전체 경로를 쓰고, 셸이 저장소 내부에 없으면 서브커맨드 앞에 --repo <path>를 추가하세요:

python3 ~/.claude/skills/multimodel-review/scripts/mmr.py status

아래에서 mmr <command>는 해당 전체 호출의 약어입니다.

시작 또는 재개

  1. mmr status를 실행합니다. 완료되지 않은 실행이 있으면, 표시된 내용과 나열된 리뷰어로 계속 진행합니다. "Old location"이라고 표시되면 모든 리뷰어가 완료된 후 mmr migrate를 한 번 실행한 다음 새 경로만 사용합니다.
  2. 다른 단계보다 먼저 옵션을 선택하여 소유자가 즉시 확인할 수 있도록 합니다:
    • 위의 옵션 줄이 pick(또는 picker)인 경우: 선택기를 표시합니다(다음 두 글머리 기호).
    • 그렇지 않으면, 비어 있든 아니든: mmr options "<options>"를 실행하고 선택기를 표시하지 않습니다. 비어 있으면 기본값인 terra:max:fast opus:xhigh code:20 spare:2를 의미합니다. 실패하면 소유자에게 한 줄 오류를 표시하고 중지합니다. 각 리뷰어는 name[:effort][:fast] 형식입니다: 노력 수준은 Codex의 경우 max, Claude 모델의 경우 xhigh가 기본이며, :fast가 제공되지 않으면 Codex 모델이 표준 속도로 실행됩니다. code:<20-50> 및 spare:<2-6>는 선택 사항입니다(기본값 20 및 2).
    • 선택기 (show_widget을 사용할 수 있는 경우): 모듈 ["interactive"]와 함께 read_me를 한 번 호출합니다. 그런 다음 mmr picker를 실행하고 Widget code: 줄 이후의 모든 내용을 변경하지 않고 widget_code로 전달하며, 제목은 multimodel_review_options입니다. 턴을 종료하고 기다립니다. 버튼이 "Start the review with ."을 보냅니다. 예를 들어 "terra:max:fast opus:xhigh code:20 spare:2"와 같은 형식입니다. mmr options "<options>"를 실행합니다. 소유자의 메시지가 선택기가 로드되지 않았다고 말하면 mmr picker --offline을 실행하고 대신 표시합니다.
    • 터미널의 선택기 (show_widget 없음): AskUserQuestion 호출 한 번으로 네 가지 질문: 리뷰어(다중 선택: Terra, Opus, Fable, Astra; Sol, Sonnet, Haiku 및 Luna는 Other을 통해), 빠른 모드의 Codex 모델(다중 선택: Terra, Astra, Sol, None; Luna는 Other을 통해), 노력 수준(Codex max 및 Claude xhigh, 모든 항목 high, 모든 항목 medium) 및 리뷰 길이(Standard code:20, Long code:35, Max code:50). 선택한 리뷰어가 아닌 빠른 선택은 무시합니다. 답변을 형식화된 형태로 작성하고 mmr options "<options>"를 실행합니다.
  3. Write 도구를 사용하여 스크래치패드 파일에 3-5줄의 의도를 작성합니다: 변경 사항이 수행해야 할 작업과 대상을 설명합니다. 요청, 이 대화, PR 텍스트, 커밋 또는 커밋되지 않은 diff에서 가져옵니다. 리뷰어는 "잘못된 동작"을 판단할 수 없습니다. 명확하지 않으면 버튼이 있는 질문 하나를 소유자에게 합니다.
  4. git status --short를 읽습니다. 무시되지 않은 모든 항목이 스냅샷에 커밋되므로, 이 변경과 관련 없는 항목(잘못된 폴더, 노트)을 골라내어 --leave-out <path>로 전달합니다. 구분할 수 없으면 버튼으로 질문합니다.
  5. mmr init --intent-file <file> --trailer "<attribution line>" --spec "<options>"를 실행합니다. 옵션은 mmr options가 출력한 Init: 줄에 정확히 일치해야 하며, 소유자가 하나를 지정한 경우에만 --base <base>를 추가하고 필요에 따라 --leave-out <path>를 추가합니다. 기본값은 원격의 기본 브랜치이며, 리뷰는 병합 베이스에서 시작됩니다. 이 스킬을 호출하는 것은 소유자가 init의 기능을 승인하는 것입니다:
    • 기본 브랜치 또는 분리된 HEAD에서 먼저 multimodel-review/<time>를 생성하므로 WIP 커밋이 기본 브랜치에 남지 않습니다.
    • 커밋되지 않은 작업은 하나의 WIP 스냅샷 커밋이 되어 모든 리뷰어가 동일한 커밋을 읽습니다. 푸시되지 않습니다.
    • 종료 코드 5는 일부 파일이 비밀처럼 보이거나, 20MB를 초과하거나, 포함된 저장소임을 의미합니다. 아직 변경된 것은 없습니다. 버튼으로 소유자에게 질문합니다: 제외(--leave-out) 또는 포함(--allow-flagged).
    • "Nothing to review"는 커밋도 커밋되지 않은 작업도 없음을 의미합니다. 소유자에게 리뷰할 커밋을 물은 다음 --base <commit>을 전달합니다.
  6. init이 브랜치를 생성했는지 스냅샷을 생성했는지 한 줄로 소유자에게 알립니다.

하나의 라운드

  1. mmr next --phase <code|docs|final|evidence>를 실행합니다. 프롬프트 파일을 빌드하고 해당 경로, 실행 설정 및 Claude 리뷰어당 하나의 Claude Agent 줄(모델, 노력 수준 및 답변 파일 포함)을 출력합니다. 종료 코드 3은 상한에 도달했음을 의미합니다: 완료(Done)로 이동합니다.
  2. mmr status가 나열하는 모든 리뷰어를 하나의 메시지에서 시작합니다:
    • 각 Codex 리뷰어(terra, astra, sol, luna): Bash와 run_in_background: mmr codex --reviewer <name>. 도우미는 Codex를 -s read-only, 앱, 플러그인 및 하위 에이전트는 끄고, 웹 검색은 켜고, 자체 로그 및 시간 제한으로 실행합니다. workspace-write 또는 --dangerously-bypass-approvals-and-sandbox, 동반 스크립트 또는 구조 하위 에이전트를 절대 사용하지 마십시오.
    • Codex 리뷰어당 하나의 Monitor: mmr monitor --reviewer <name>, timeout_ms: 1800000 사용. 60초마다 확인하고 PID 종료 여부로 "완료"를 결정하며, 출력 텍스트는 사용하지 않습니다.
    • 각 Claude 리뷰어(opus, fable, sonnet, haiku; 이전 실행에서는 claude): subagent_type: "multimodel-reviewer", 해당 Claude Agent 줄의 model 및 effort, 프롬프트 "Review round file: "와 함께 새 Agent를 생성합니다. 해당 에이전트에는 읽기 및 웹 도구가 있지만 셸 또는 편집 도구는 없습니다. 유형을 사용할 수 없으면 동일한 모델 및 노력 수준으로 Plan을 사용하고 Read, Grep 및 웹 검색만 사용하도록 지시합니다.
  3. Monitor 이벤트 처리:
    • FINISHED: 수행할 작업 없음.
    • FAILED: 5단계와 같이 재실행하고, 재실행도 실패하는 경우에만 한 줄로 소유자에게 알립니다.
    • QUIET: 높은 노력 수준은 몇 분 동안 조용히 생각할 수 있으므로 실패가 아닙니다. 조치를 취하지 않습니다. 도우미는 10분 동안 응답이 없으면 리뷰어를 중지합니다.
    • RE-ARM: 해당 모니터를 다시 시작합니다.
  4. Claude Agent가 반환되면, 최종 메시지를 변경하지 않고 1단계의 답변 파일에 Write한 다음 mmr claude-result --reviewer <name> --seconds <duration_ms / 1000>를 실행합니다.
  5. mmr barrier를 실행합니다. 통과할 때까지 아무것도 편집하지 마십시오. 결과가 비어 있거나 누락된 경우, 동일한 커밋에서 해당 리뷰어만 재실행합니다. 라운드는 다시 계산되지 않습니다. Claude 리뷰어의 경우 새 Agent를 생성하고 4단계를 반복합니다. 도우미는 세 번째 시도와 중단 또는 시간 초과 이후의 모든 재실행을 거부합니다: 그런 다음 mmr stop --reason "<why>"를 실행하고 완료(Done)로 이동합니다. 예외: 형식 규칙이 폐기되기 전의 실행은 실제 답변에 malformed를 표시할 수 있습니다. mmr reread --reviewer <who>를 실행합니다. 그러면 새 리뷰어 실행 없이 저장된 답변을 다시 읽습니다.
  6. 심사 (Fixer 규칙 참조)하고, Write 도구를 사용하여 라운드 폴더에 triage.tsv를 작성합니다.
  7. 수락된 발견 사항을 수정하고, 영향을 받는 테스트를 실행하고, 하나의 WIP 커밋을 만듭니다. 실패한 테스트는 라운드를 차단하므로 잘못된 수정이 다음 델타에 도달할 수 없습니다.
  8. mmr close --tests "<exact test command>"를 실행하거나, --tests "none: docs only"를 실행합니다. 수락된 항목이 없으면 --tests를 생략합니다. 출력된 Next: 줄을 따릅니다.

triage.tsv는 탭으로 구분되며, 병합된 발견 사항당 한 행이며, 모든 리뷰어가 "NO BLOCKING ISSUES."라고 답한 경우에만 생략할 수 있습니다:

reviewers	sev	loc	status	summary	note
terra,opus	P1	src/a.py:42	accepted	Retry drops the last item	src/a.py: Keep the last item on retry
terra	P1	src/b.py:9	rejected	Null token crashes	Token is non-null: src/auth.py:30 returns early
  • status는 accepted, rejected 또는 open입니다. open은 수정이 검토되지 않을 마지막 허용 라운드에만 해당됩니다.
  • note는 변경된 내용(accepted), 코드 인용 이유(rejected) 또는 남겨진 이유(open)입니다. 수락 및 거부 노트는 다음 프롬프트의 수정 목록 및 원장을 제공합니다.
  • 단계 외 발견 사항은 "Out of phase"로 거부합니다.
  • 리뷰어는 어떤 형식으로든 답변할 수 있으므로 각 답변을 직접 읽으십시오. 발견 사항 수는 최선의 추정치입니다. P0/P1/P2 태그가 없는 답변은 하나의 발견 사항으로 계산됩니다: 제기하는 내용에 대한 행을 추가하거나, 제기하는 내용이 없으면 하나의 rejected 행을 추가합니다.

WIP 커밋: 메시지 WIP multimodel-review round <N>을 파일에 작성하고 git commit -F로 전달하며, 세션의 귀속 줄도 포함합니다. 절대 푸시하지 마십시오.

단계

  1. 코드: 1-2라운드는 기본 대비 전체 diff를 검토합니다. 3라운드부터는 델타와 수정 목록만 검토합니다. 리뷰어는 컨텍스트를 위해 모든 파일을 열 수 있습니다. 델타 외부에서는 P0만 보고하며, 델타가 실패를 유발하는 경우는 예외입니다: 이 경우 발견 사항은 실제 심각도로 델타 라인에 고정됩니다.
  2. 정리(수정자 전용): 문서 단계 전에 실행되어 여기서 작성된 모든 텍스트가 P2 검토를 받도록 합니다.
    • 문서: 이 변경으로 인해 오래된 문서만 업데이트합니다. 확장하지 말고 축소합니다.
    • 테스트: 디버깅 또는 스캐폴딩 테스트와 제거된 코드에 대한 테스트만 삭제합니다. 회귀 테스트는 유지합니다.
    • 전체 테스트 스위트를 실행합니다. 실패하면 수정합니다. 작은 수정으로 해결할 수 없으면 중지하고 보고합니다.
    • 커밋한 다음 실행 폴더에 cleanup.md를 Write합니다: 각 삭제 항목과 이유, 정확한 테스트 명령 및 결과를 포함합니다. next --phase docs는 이것 없이 거부합니다.
  3. 문서: P2로 하나의 전체 diff 라운드를 수행하고 수정한 다음, 하나의 델타 라운드를 수행합니다. 그런 다음 단계가 종료됩니다. 남은 항목은 open으로 기록됩니다.
  4. 최종: 모든 리뷰어가 참여하는 하나의 전체 diff 라운드를 P0/P1만 수행합니다. 발견 사항이 수락되면 수정하고 하나의 델타 라운드를 실행합니다. 여전히 실패하면 open으로 표시합니다. 도우미가 실행을 중지합니다.

수렴

  • 라운드는 수정자가 해당 단계의 심각도에서 발견 사항을 수락하지 않을 때 깨끗합니다. 코드 인용 이유로 거부된 발견 사항은 차단하지 않습니다.
  • 단계는 첫 번째 깨끗한 라운드에서 수렴합니다.
  • 코드 수렴 후 새로운 증거(장치 또는 에뮬레이터 실행): 영향을 받는 코드 또는 텍스트를 한 번 업데이트하고, 커밋한 다음 mmr next --phase evidence --note "<what the run showed and what changed>"를 실행하고, P0/P1/P2에서 하나의 델타 라운드를 수행합니다. P0/P1이 수락된 경우에만 코드가 다시 열리며, close가 이를 알립니다.
  • 단계 상한 또는 하드 스탑에서: 중지하고 남은 항목을 보고합니다.

Fixer 규칙

  • 발견 사항을 제기한 모든 리뷰어를 유지하면서 병합 및 중복 제거하여 통계를 정확하게 유지합니다. 각 발견 사항을 코드에 대해 검증합니다. 확인할 수 없는 발견 사항은 한 줄 이유와 함께 거부합니다.
  • 발견 사항을 제기한 사람과 관계없이 코드만으로 판단합니다. 당신도 Claude 모델이므로 Claude 리뷰어의 발견 사항을 동일한 기준으로 판단합니다. 2명 이상의 리뷰어가 제기한 발견 사항 또는 모든 P0을 거부하려면 특정 코드 인용이 필요합니다. 보고서는 이를 소유자에 대한 이의 제기로 나열합니다.
  • 가장 작은 수정. 리팩터링이나 새 기능은 없습니다. 실제 P0/P1 버그에 대해서만 회귀 테스트를 추가합니다.
  • 산문을 적게 작성합니다: 새 문장을 추가하는 것보다 잘못된 문장을 삭제하거나 좁히는 것을 선호합니다. 새 주석은 최대 한 줄입니다. 리뷰 중에 새 문서 섹션을 추가하지 마십시오.
  • 후크가 경로를 거부하면 중지하고 소유자에게 보고합니다. 셸 복사 또는 다른 방법으로 우회하지 마십시오.
  • 셸 명령을 dcg-safe하게 유지합니다: Write 도구로 파일을 작성하고, 명령에 변수, 글로브 또는 변수 경로로의 리디렉션을 넣지 마십시오.

완료

수렴 시 및 모든 중지 시에 다음을 실행합니다.

  1. mmr archive를 실행하여 재실행을 포함한 모든 Codex 채팅을 보관합니다.
  2. mmr report를 실행합니다. 단계별 라운드, 리뷰어 테이블, 열린 항목, 이의 제기된 발견 사항, 테스트 명령 및 스쿼시 명령을 출력하고 report.md를 저장합니다.
  3. 소유자에게 짧게, 먼저 답변을 보고합니다: 단계별 라운드, 열린 항목, 정확한 검증 명령 및 결과.
  4. 리뷰어당 인라인으로 간단한 시각 자료를 표시합니다: 제기된 발견 사항, 수락됨, 거부됨, 고유, P0-P1 대 P2, 깨끗한 라운드, 라운드당 평균 시간. 한 줄로 승자를 지정합니다. 기본 규칙은 가장 많이 수락된 고유 P0/P1이며, 이를 무시하는 경우 명시해야 합니다. 자신의 모델도 판단하고 있기 때문입니다.
  5. WIP 커밋을 그대로 둡니다. 증거 라운드에는 델타 범위가 필요하기 때문입니다. 지금 스쿼시할지 여부를 버튼으로 묻고, 보고서의 스쿼시를 '예'인 경우에만 실행합니다.

이 스킬 변경

이 폴더는 공개 저장소 github.com/dknchris/multimodel-review입니다. 각 변경 사항을 커밋하고 소유자가 말할 때만 푸시합니다. 선택기의 코드는 assets/picker.js입니다: mmr picker는 최신 커밋이 푸시된 후에만 CDN에서 로드하고, 그때까지는 인라인으로 전송합니다(속도가 느림). 모든 변경 후 python3 tests/test_mmr.py를 실행하십시오.

관련 스킬