---
task_id: task-2449
type: checklist
scope: task
created: 2026-05-05
updated: 2026-05-05
status: implemented
---

# 체크리스트: task-2449 — taskctl MVP

**task**: task-2449

---

## Phase 1 — Core scripts (dev2)

- [x] A. `scripts/taskctl.py` — 11 상태 + 11 서브커맨드 + checksum 무결성
- [x] B. `scripts/taskctl.README.md` — 명령 목록 + 상태 다이어그램 + bypass 사용법
- [x] C. `scripts/git-hooks/pre-push` — main direct push 차단 + refspec 검사 + taskctl status 조회
- [x] D. `scripts/anu_confirm_bot/main.py` — gh pr merge 직접 호출 → taskctl merge 라우팅
- [x] E. `scripts/auto_merge.py` — TASKCTL_INVOKED 환경변수 가드 추가
- [x] F. `scripts/finish-task.sh` — N/A (현 코드베이스 직접 머지 호출 없음)
- [x] G. `scripts/auto_merge_controller.py` — N/A (현 코드베이스 부재)

## Phase 2 — CI / 테스트 (dev2)

- [x] A. `.github/workflows/guard.yml` — task-state-check + cancelled 차단 + guard.sh 재실행
- [x] B. `.github/workflows/ci.yml` — **미수정** (8 required checks 보호)
- [x] C. `tests/test_taskctl.py` — 13 테스트 (정상 3 + 차단 5 + bypass 1 + 구조 4)
- [x] D. `.tasks/state/.gitkeep` — 디렉토리 마커

## Phase 3 — 보고서 (dev2)

- [x] A. `memory/reports/task-2449.md` — SCQA + 합격 매트릭스 + 침투 테스트 로그
- [x] B. `memory/plans/tasks/task-2449/{plan,checklist,context-notes}.md` — 채움

## 검증

- [x] py_compile PASS (taskctl.py / auto_merge.py / anu_confirm_bot/main.py / test_taskctl.py)
- [x] taskctl --help → 11 서브커맨드 표시
- [x] pytest tests/test_taskctl.py → 13 PASS
- [x] git grep "gh pr merge" → taskctl/문서 외 0건 (test_blocked_no_direct_gh_pr_merge_in_codebase로 자동 검증)
- [x] state 파일 checksum tampering 시 reject (test_state_file_checksum_detects_tampering)
- [x] bypass evidence 정확 기록 (test_bypass_records_evidence_and_proceeds)
- [ ] 본 task PR ruleset 통과 후 회장 manual merge (G — 본 task 자체 머지 시점에 검증)
