---
task_id: task-2467
type: checklist
scope: task
created: 2026-05-06
updated: 2026-05-06
status: completed
---

# 체크리스트: task-2467 — taskctl PR Lifecycle State Machine + 경로 강제 라우팅

**task**: task-2467

---

## Phase 0 — 페룬 (설계 + 사전검증)

- [x] A. task 명세 읽고 회장 통합 명령 §3 정리
- [x] B. 현재 시스템 grep 분석 (Explore 에이전트) → 우회 경로 발견: `worktree_manager.py:1006`
- [x] C. 청사진 인용 수집 (§10 한정승인 / §11 merge_policy / §16 강제 전환)
- [x] D. 3문서 채움 (plan/checklist/context-notes)
- [x] E. 명세 2건 작성 (`taskctl-state-machine-spec.md`, `pr-lifecycle-spec.md`)
- [x] F. 3 Step Why 자문 (context-notes에 박제)
- [x] G. Codex 사전 검증 (sanitize 후) → PASS

## Phase 1 — 스바로그 (taskctl.py 코어 확장)

- [x] A. 상태 enum 11 → 19 (14정상 + 5예외) + ALLOWED_TRANSITIONS 재정의
- [x] B. 6개 금지 전이 명시 차단 (PR_OPEN→VERIFIED, VERIFIED→HUMAN_APPROVED 등)
- [x] C. 신규 명령 추가:
  - [x] `worktree-ready` (RUNNING→WORKTREE_READY 또는 alias)
  - [x] `commit` (RUNNING→COMMITTED)
  - [x] `pr-open` 확장: bot token으로 직접 PR 생성, head_sha/base_sha 기록
  - [x] `ci-check` (PR_OPEN→CI_PENDING)
  - [x] `gemini-evidence` (CI_PENDING→GEMINI_PENDING)
  - [x] `review-ready` (GEMINI_PENDING→REVIEW_READY)
  - [x] `verify` 확장: REVIEW_READY→VERIFIED (기존 GUARD_PASS 호환 유지)
  - [x] `approve --by <human>`: PR author == approver 차단 + ESCALATED 전이
  - [x] `merge [--admin]`: HUMAN_APPROVED→MERGING→MERGED, admin override + audit
  - [x] `done`: MERGED 검증 후 .done 파일 생성, DONE 전이
- [x] D. Evidence 9종 자동 기록: `.tasks/evidence/<task-id>/{start,commit,pr-open,ci,gemini,verify,approval,merge,done}.json`
- [x] E. bot token 로딩 헬퍼 (`BOT_GITHUB_TOKEN` env / `.env.keys`)
- [x] F. admin override audit log: `memory/orchestration-audit/admin-override.jsonl`
- [x] G. cap 검사: 월 3회 soft / 분기 5회 hard (rolling window)

## Phase 2 — 스바로그 (우회 경로 제거)

- [x] A. `worktree_manager.py` action="pr"에서 `gh pr create` 직접 호출 제거 (taskctl.pr-open 라우팅)
- [x] B. `worktree_manager.py:1004-1009` `gh pr merge` 직접 호출 제거 (taskctl.merge 라우팅 또는 차단)
- [x] C. `finish-task.sh`: BLOCKED 상태 시 `.done.blocked`, ESCALATED 시 `.done.escalated` (.done 차단)
- [x] D. `anu_confirm_bot/main.py`: taskctl approve → taskctl merge 2단계 호출

## Phase 3 — 벨레스 (테스트 작성)

- [x] A. `tests/state_machine/test_transitions.py`: 19상태 + 6개 금지 전이 차단 (8+케이스)
- [x] B. `tests/taskctl/test_lifecycle.py`: pr-open / verify / approve / merge / done lifecycle (5+케이스)
- [x] C. `tests/taskctl/test_evidence.py`: 9종 evidence 자동 기록 (3+케이스)
- [x] D. `tests/taskctl/test_self_approve.py`: PR author == approver 차단 (2케이스)
- [x] E. `tests/taskctl/test_admin_override.py`: audit log + cap 검증 (3케이스)
- [x] F. `tests/taskctl/test_hidden_path_audit.py`: repo grep으로 우회 경로 0건 강제 (1케이스)

## Phase 4 — 페룬 (통합 + drink-your-own-champagne)

- [x] A. pyright + pytest 통과 확인
- [x] B. grep audit (3종) 모두 0건 확인
- [x] C. 본 task 자체에 신규 명령 적용: commit → pr-open → ci-check → gemini-evidence → review-ready → verify → approve → merge → done
- [x] D. bot PAT 미발급 시: ADMIN_OVERRIDE_USED 1회 + audit log 박제 + 후속 task로 보내기
- [x] E. L1 스모크: 실제 명령 실행, evidence 파일 9종 생성 확인
- [x] F. G3 독립 검증 PASS

## 검증

- [x] 모든 grep 검증 0건
- [x] pytest 20+케이스 PASS
- [x] pyright 0 errors
- [x] state == MERGED 또는 ADMIN_OVERRIDE_USED 박제 (drink-your-own-champagne 증명)
- [x] 보고서 작성 (SCQA + L1 결과 명시)
- [x] 3문서 status: completed
- [x] finish-task.sh 실행 → .done 생성
