with one click
review-plan
// 새 계획서 재검토 + expand-todo + 커밋. /reflect 완료 후 자동 호출됨. Use when: 계획서 검토, review-plan, 계획 검토
// 새 계획서 재검토 + expand-todo + 커밋. /reflect 완료 후 자동 호출됨. Use when: 계획서 검토, review-plan, 계획 검토
[HINT] Download the complete skill directory including SKILL.md and all related files
| name | review-plan |
| description | 새 계획서 재검토 + expand-todo + 커밋. /reflect 완료 후 자동 호출됨. Use when: 계획서 검토, review-plan, 계획 검토 |
Regex and keyword detections are advisory evidence unless a helper contract explicitly marks them mutation-ready. Use common\tools\plan-advisory-detect.ps1 -PlanFile <plan> -Json for Phase IA, DB-Direct, Phase R, and environment-contamination candidates. Review conclusions and plan wording corrections remain AI-owned.
새로 생성된 계획서를 검증하고, Skill 도구로 /expand-todo를 호출해 체크리스트를 확장한 뒤 커밋합니다.
/reflect 완료 후 자동 호출되거나, 독립적으로 사용할 수 있습니다.
/reflect 완료 후 자동 호출 ("조사만" 모드 제외){plan경로}/2026-03-31_fix-xxx.md)실패 카테고리/종료코드/처리결과(plan/new|existing))/reflect에서 호출 시, reflect가 생성한 계획서 경로 목록이 자동 전달된다.
독립 호출 시: review-plan {경로} 형식으로 경로를 직접 지정한다.
사용자가 계획서 경로를 직접 지정했는데 1차 탐색 결과가 0건이면, 파일명 기반 wtools 자산 fallback을 적용한다.
-skill, _skill, skill-, -agent, _agent, agent-, commit-, commit_, expand-todo, merge-test, review-plan, auto-, plan-runner, dev-runner/(^|[-_\.])(skill|agent|commit|expand-todo|merge-test|review-plan|auto|plan-runner|dev-runner)([-_\.]|$)/iD:\work\project\service\wtools\.worktrees\plans\docs\plan\{filename} Glob를 시도한다.D:\work\project\service\wtools\.worktrees\plans\docs\archive\{filename} Glob를 시도한다.📁 wtools 자산 키워드 감지 → {경로}에서 발견 1줄을 남긴다.사용자가 "main의 기존 수정사항을 고려하지 말라"고 명시한 경우:
dirty/untracked 파일은 review-plan 중단 사유로 취급하지 않는다..git 보호 규칙과 파괴적 명령 금지 규칙은 그대로 유지한다.common/tools/docs-dirty-guard.ps1 -Mode Begin -RepoRoot <docs-commit-root>를 호출한다. PowerShell을 사용할 수 없는 shell surface는 common/tools/docs-dirty-guard.sh --mode begin --repo-root <docs-commit-root>를 사용한다./expand-todo 호출 전후로 수정한 입력 plan/TODO exact path를 touched set으로 유지한다./expand-todo 호출 직후 touched exact path set만 Commit에 전달한다. PowerShell canonical은 D:\work\project\tools\common\commit.ps1 -Files를 경유한다.End를 호출한다. touched whitelist dirty를 commit할 수 없거나 End가 새 unowned dirty/staged diff를 보고하면 hard-fail한다.대상 계획서가 여전히 필요한지 재판정한다.
판정 기준:
| 판정 | 조건 | 후속 동작 |
|---|---|---|
keep | 미해결 증거 + 구체 owner + active plan 미귀속 + 잔여 리스크 | 기존 흐름으로 진행 |
narrow | 일부 항목만 유효 | 유효 항목만 남기고 진행 |
attach_existing | 더 적합한 active plan 존재 | 기존 plan에 귀속 + 현재 plan 닫기 제안 |
obsolete | 이미 흡수됐거나 과잉 생성 | 확장 중단 + 사유 기록 |
obsolete 세분화: resolved-later(다른 구현에 흡수) / over-generated(불필요한 추상 finding)
/reflect 출처 plan 엄격 모드 (파일명에 _auto 포함 또는 > 출처: /reflect에서 자동 생성 헤더):
아래 4요건 모두 확인 후에만 keep:
결과 기록: 결과표 재검토 열에 판정값 기록.
대상 계획서 각각에 대해 아래 9가지를 검증한다.
A. side effect 체크:
B. 목표 ↔ 예상결과 일관성:
C. 기존 plan 중복 체크:
D. reflect 실패 메타데이터 계약 검증:
E. 로컬 drift 검토:
계획서 수정 이후의 로컬 수정사항은 현재 워킹트리의 staged/unstaged 변경만 대상으로 본다.기준커밋 이후 전체 diff, 최근 커밋 이력, unrelated main 변경은 로컬 drift 판정 범위에 포함하지 않는다.제목 키워드, 파일 경로, 핵심 심볼/모듈명을 seed로 삼아 겹치는 변경만 검토한다.영향 없음, 참조만, 보정 반영, 재검토 실패 중 하나로 기록한다.F. 연관 active plan 참조 검토:
제목 키워드, 파일 경로, 핵심 심볼/모듈명 3축으로 후보를 검색한다.초안, 검토대기, 검토완료, 구현중, 수정필요 같은 미완료 상태 문서를 뜻한다.선행관계, 범위 제외, 중복 회피 중 필요한 문구만 반영한다.0-hit와 탐색 seed를 결과표 또는 비고에 남긴다.G. archive 참조 검토:
제목 키워드, 파일 경로, 핵심 심볼/모듈명)로 검색한다.0-hit와 탐색 seed를 결과표 또는 비고에 남긴다.H. 환경 오염 / 임시 해법 감지:
계획서 텍스트에서 아래 감지 패턴 또는 키워드 seed를 발견하면 advisory evidence로 기록하고 검증을 수행한다. 키워드 단독으로 bullet 삽입, 차단, 계획서 보정을 하지 않는다.
| 패턴 | 예시 |
|---|---|
| 워크트리 아티팩트 기인 변경 | "worktree build 환경에서 $env/static/public export가 비어" |
| 엄격 → 유연 전환으로 에러 우회 | $env/static/public → $env/dynamic/public, 타입 강제 → any |
| fallback/placeholder 신규 추가 | ?? 'placeholder-anon-key', || 'https://placeholder.supabase.co' |
| 환경 의존성 역전 | 빌드타임 고정값 → 런타임 읽기 (값 검증 타이밍이 뒤로 밀림) |
| 임시 표시 | "임시", "workaround", "빌드 통과용", "TODO: 나중에 교체" |
키워드 seed: 임시, workaround, placeholder, 빌드 통과용, TODO: 나중에, $env/dynamic, ?? ', || '
advisory evidence가 있으면 아래 3단계를 검증한다:
판정:
해당 없음: advisory evidence 없음, 또는 검증 결과 환경오염/임시해법 위험이 아님⚠️ 경고: 환경 아티팩트 기인 변경이라는 검증 evidence가 있고, production/runtime 검증 TODO가 필요함 → 아래 bullet을 입력 계획서에 삽입할 수 있다:
## 기술적 고려사항 섹션이 있으면: 섹션 하단에 bullet 1개 추가## 기술적 고려사항 섹션이 없으면: ## 기술적 고려사항 섹션을 새로 생성하고 bullet 추가- 프로덕션 환경에서 동일 에러 재현 여부를 먼저 확인하고, placeholder/fallback이 런타임 동작을 바꾸지 않는지 검증한다.🚫 차단: 임시 해법이 프로덕션에 반영되는 구조라는 검증 evidence가 있음 → expand-todo 수행 전에 종료 (계획서 수정 없이는 확장 진행 불가)
I. T4/T5 실서버 계약 검사:
tests/**/*e2e*/tests/**/*integration* 파일 언급이 있으면 해당 테스트 파일을 Read한다.pytest.mark.e2e와 pytest.mark.http_live가 함께 있고, frontend readiness 또는 /merge-test readiness 전제가 있으며, page.route("**/*", ...) 전체 route mock만으로 화면을 구성하지 않아야 live로 분류한다.page.route("**/*") 전체 mock이 있고 pytest.mark.http_live가 없으면 mock_only로 분류하고, T3 재분류 요구 + live T4 follow-up TODO를 review 결과표에 기록한다. 일부 요청만 mock하는 page.route()도 T4 확정이 아니라 검토 필요로 남긴다.tests/**/*http*/tests/**/*api* 파일 언급이 있으면 해당 테스트 파일을 Read한다.pytest.mark.http_live와 requests.get("http://localhost:8001/..."), httpx.get("http://localhost:8001/..."), 또는 project live readiness helper 같은 localhost live 호출이 있어야 http_live로 분류한다.from fastapi.testclient import TestClient 단독 증거이면 testclient_only로 분류하고, T3 재분류 요구 + live T5 follow-up TODO를 review 결과표에 기록한다.T4/T5 계약 열 또는 비고 marker로 live, mock_only, http_live, testclient_only, absent 중 하나를 남긴다. mock_only/testclient_only면 expand-todo 전 deterministic 보정 또는 차단 여부를 명시한다.해당 없음인데 feature area live smoke가 없으면 "live smoke 없음" 경고를 남긴다. 기존 mock-only/TestClient-only 테스트는 삭제 대상으로 만들지 않고 T3 재분류 + live follow-up만 생성한다.재검토 실패 시:
계획서 헤더의 > worktree-owner: 필드 검증 시:
path1, path2, path3 형식. 첫 항목=primary, 나머지=attached1단계 재검토에서 in-place 보정(요약/배경/추가 bullet 등)을 LLM이 직접 작성한 경우, 그 글에 자기 의심 톤이 남아있는지 점검한다. expand-todo의 5.4단계와 동일 절차: ../expand-todo/references/hedging-cleanup.md.
발동 조건: review-plan이 wtools 외 프로젝트(monitor-page 등)에서 호출됐고, plan 본문에 fence 경로 수정 todo가 존재할 때.
wtools 자체에서 호출된 경우 이 단계를 스킵하고 결과표에 해당 없음 표시.
| 경로 패턴 | 설명 |
|---|---|
.claude/skills/** | Claude 스킬 원본 |
.agents/skills/** | 에이전트 스킬 원본 |
.claude/agents/** | Claude 에이전트 원본 |
.gemini/agents/** | Gemini managed interactive surface (원본 source 아님) |
.gemini/commands/** | Gemini 커맨드 원본 |
.agent/workflows/** | 에이전트 워크플로우 원본 |
- [ ], - [x]) 또는 파일 경로 헤더 라인```) 내부, 인용(>) 라인 — false positive 방지^\s*-\s*\[[ x]\].*\.(claude/skills|agents/skills|claude/agents|gemini/agents|gemini/commands|agent/workflows)/local mirror sync, monitor-page (.agents|.claude|.gemini), 직접 동기화, mirror stale 보정, 원본과 맞춤, manual sync, mirror sync merge exception, MERGE_HEAD + sync subject, mirror-only stagedgit pull --ff-only, /pull-sync ff-only 수신, remote fast-forward 수신, downstream read-back, GitHub Actions sync workflow옵션 1 — 이관 또는 옵션 3 — 차단만 허용한다.fence 경로 todo가 감지되면 사용자에게 아래 3가지 옵션을 제시한다.
옵션 1 — 이관:
.worktrees/plans/docs/plan/<date>_<원본-slug>_skill-mirror.md 신규 생성 (원본 plan cross-reference 포함)> 스킬 갱신은 wtools <plan-path>에서 처리 후 sync 대기 placeholder 삽입> 원본 plan: <project>/<plan-path>, > 출처: review-plan fence audit 이관, > 요약: (원본 fence todo 요약)<원본-date>_<원본-slug>_skill-mirror.md<오늘-date>_<주제>_skill-edit.md옵션 2 — receiver sync 검증:
git pull --ff-only 수신 검증 또는 downstream read-back plan만 허용한다.허용: remote fast-forward/read-back only 표시MERGE_HEAD + sync subject + mirror-only staged 같은 root local merge 예외 생성은 허용하지 않는다.옵션 3 — 차단:
🚫 차단: skill-edit fence 상태로 종료결과표 헤더에 fence audit 컬럼 추가:
| fence audit 값 | 의미 |
|---|---|
해당 없음 | wtools 자체 호출 또는 fence 경로 todo 없음 |
이관: <wtools-plan> | 이관 완료, 생성된 wtools plan 경로 |
허용: <사유> | 정당화 완료, 입력된 사유 |
🚫 차단 | 차단 상태로 종료 |
### 검토 근거 및 상세 내역 섹션에 fence audit 검출 내역(감지된 todo 라인 목록)과 처리 결과를 기록한다.
재검토 통과한 각 계획서에 대해 Skill 도구로 /expand-todo를 직접 호출한다.
expand-todo SKILL.md를 읽어 인라인으로 수행하지 않는다 — Skill 호출 실패 시 인라인 fallback 금지.
호출 규칙:
결과표 expand 칸 기록:
| 결과 | 기록 |
|---|---|
| 정상 완료 | ✅ {N}개 작업 |
| 이미 확장됨 | ✅ 변경 없음 (이미 확장됨) |
| 진행 중단/실패 | ❌ {사유} |
Phase R 자동 삽입, V1~V6 정합성 검증, 5-Phase 테스트 구조 등 모든 expand 규칙은 expand-todo SSOT가 적용한다. review-plan은 이 규칙들을 중복 기재하지 않는다.
expand-todo의 5.6단계가 expand 결과를 자체 커밋한다. review-plan의 추가 커밋은 잔여 변경(1단계 보정 bullet 등)이 있을 때만 수행한다.
/expand-todo 호출 후 git status --porcelain으로 잔여 변경 확인
{plan경로}/*.md, TODO.md
git add . / git add -A 사용 금지git diff --cached --name-only 결과가 이번 실행의 입력 plan/TODO 화이트리스트와 정확히 일치하는지 검증git diff --cached --name-status 또는 git status --porcelain에 D, R, RM, ??가 섞여 있거나 비화이트리스트 경로가 남아 있으면 즉시 중단
git reset HEAD -- <path>로 일부만 걷어내고 계속 진행하지 않는다.전체 unstage -> 원하는 파일만 다시 add 패턴으로 처음부터 다시 스테이징한다.docs: review — {계획서 제목 요약}commit.ps1 -Files 또는 commit.sh --files로 add+commit을 한 호출에 묶는다.## 계획서 재검토 결과
| # | 계획서 | 재검토 | 로컬변경 | 연관 active plan | archive 참조 | 환경오염 | expand | 실패메타데이터 | 비고 |
|---|--------|--------|----------|------------------|-------------|---------|--------|----------------|------|
| 1 | {파일명} | ✅ 통과 | {영향 없음/참조만/보정 반영} | {0-hit/중복 회피/선행관계} | {0-hit/참조 반영} | {해당 없음/⚠️ 경고: {패턴}/🚫 차단: {사유}} | ✅ {N}개 작업 | {카테고리/종료코드/처리결과} | — |
| 2 | {파일명} | ❌ 실패 | {재검토 실패/보정 반영} | {충돌/0-hit} | {참조만/0-hit} | {해당 없음/⚠️ 경고: {패턴}/🚫 차단: {사유}} | — | {있음/없음} | {사유} |
### 검토 근거 및 상세 내역
- **{파일명}**:
- **내용 정합성**: 목표와 예상 결과의 논리적 일관성 설명
- **로컬/연관 검토**: 발견된 로컬 drift, 연관 plan 중복/충돌 여부에 대한 구체적인 설명
- **안전성**: 환경 오염, 임시 해법, 사이드 이펙트 등 우려 사항 (없으면 없다고 명시)
- **결론**: 최종 통과/수정/반려 이유 요약
구현을 시작하려면 "다음" 또는 "구현해"라고 말씀해주세요.
.agents와 .claude는 엔진별 canonical surface다. review-plan/reflect 변경 시 동일 문구를 강제하지 말고, Codex(.agents)와 Claude(.claude) 각각에서 advisory 계약 invariant가 동등하게 유지되는지 확인한다..svelte-kit/ambient.d.ts 비어있음 (node_modules 없어서 svelte-kit sync 미실행)node_modules 없음 → $env/static/public 타입 미생성 에러wrangler.toml [vars]의 your-project.supabase.co 등)\), 절대경로, PowerShell 전용commit.ps1 또는 commit.sh)