---
task_id: task-2451
type: plan
scope: task
created: 2026-05-05
updated: 2026-05-05
status: completed
---

# 계획서: task-2451 — taskctl 라우팅 검증 (9 케이스 실증)

**task**: task-2451
**목표**: "taskctl을 거치지 않고는 main을 절대 변경할 수 없다"는 회장 절대 기준이 실제로 enforced 되는지 9 케이스(정상 3 + 차단 5 + bypass 1) 실행 로그로 증명한다.
**승인**: 회장 (2026-05-05) "task.md 수정 금지. 봇은 본 payload만 실행."
**근거**: `/home/jay/workspace/memory/tasks/task-2451.md` (task.md 절대 원칙 박스)

---

## 목표

9 케이스 실증을 통해 taskctl 라우팅이 이론상 PASS / 실제 동작 PASS 모두 충족됨을 증명. 코드 변경 0건. 검증 로그(stdout/stderr/exit code/state JSON)만 산출.

### 측정 가능 합격 기준

| # | 조건 | 검증 지표 |
|---|---|---|
| A | taskctl CLI 9개 명령 정상 동작 | stdout 로그 캡처 |
| B | dummy PR 8+1 checks SUCCESS | gh pr view JSON |
| C | 차단 5 케이스 exit 1 + stderr | 매트릭스 로그 |
| D | bypass 케이스 evidence JSON 정확 | state JSON cat |
| E | scripts/ 변경 0건 | git diff --name-only |
| F | dummy PR 닫음 + state 정리 | gh pr view + ls |
| G | 본 task PR 봇 자체 머지 0건 | merge_policy=no_merge |

## 범위

### 포함
- Fix 1: taskctl CLI 직접 검증 (dummy task-id `task-test-routing-001` / `task-test-cancelled-001` / `task-test-no-guard`)
- Fix 2: dummy PR `task/task-test-2451-dummy` 생성 → CI 8+1 checks 검증 → close
- Fix 3: 차단 5 케이스 (CANCELLED merge / HUMAN_APPROVED 미달 / GUARD_PASS 미달 / main 직접 push / gh pr merge 직접 호출) 실증
- Fix 4: bypass 1 케이스 (TASKCTL_BYPASS=1) evidence JSON 검증
- Fix 5: 정리 (dummy PR close, state 파일 삭제) + 본 보고서 작성

### 제외 (다음 페이즈 이후)
- scripts/taskctl.py 수정 (forbidden — 검증만)
- .github/workflows/ 수정
- task-2449 머지 산출물 추가 변경

## 위임 계획

- Phase 1 (Fix 1+3+4 — taskctl CLI 검증): **토르(백엔드, sonnet)** — taskctl 직접 작성 후속, CLI 명령 시퀀스 + 차단/bypass 케이스 정확한 stdout/stderr/exit code 캡처가 핵심
- Phase 2 (Fix 2 — dummy PR 통합 검증): **헤임달(테스터, sonnet)** — gh pr create / gh run view / 8+1 checks 검증, 통합 테스트 책임 영역
- Phase 3 (Fix 5 — 정리 + 매트릭스 통합): **오딘(팀장)** — 9 케이스 매트릭스 보고서 작성 + dummy PR 닫기 + state 정리

## 검증 기준

- A: `python3 scripts/taskctl.py status task-test-routing-001` → "PR_OPEN" 또는 "HUMAN_APPROVED" 출력
- B: `gh pr view <pr> --json statusCheckRollup` → 8 required + taskctl-state-guard SUCCESS
- C: `python3 scripts/taskctl.py merge task-test-cancelled-001` → exit 1, stderr "CANCELLED"
- D: `cat .tasks/state/task-test-bypass.json | jq .bypass.used` → true
- E: `git diff --name-only main..HEAD` → memory/* + tests/test_taskctl_dummy_verification.txt 만 (scripts/ 변경 0)
- F: `gh pr view <pr> --json state` → CLOSED; `ls .tasks/state/task-test-*.json` → 빈 결과
- G: 본 task 보고서 PR — 회장 manual merge (봇 자체 머지 호출 0건)
