{
  "pass": false,
  "risks": [
    {
      "severity": "critical",
      "description": "현재 `scripts/taskctl.py`는 설계의 14개 정상 상태 + 5개 예외 상태를 구현하지 않았고, 실제 상태 모델이 `GUARD_PASS → HUMAN_APPROVED → MERGED → DONE` 수준의 11상태 MVP에 머물러 있습니다. 특히 `cmd_merge()`가 `MERGED` 직후 즉시 `DONE`까지 전이하여, 설계가 요구한 `MERGED 확인 후 별도 done 처리`와 `merge commit/origin/main 검증 후 완료 인정`을 구조적으로 만족할 수 없습니다."
    },
    {
      "severity": "critical",
      "description": "PR lifecycle 단일 진입점 요구가 구현과 정면 충돌합니다. `cmd_pr_open()`은 bot token으로 PR을 생성하지 않고 단순히 `--pr` 번호를 상태에 기록할 뿐이며, `approve`는 `--by <human>`/PR author 조회/self-approve 차단/evidence 기록이 없습니다. 결과적으로 설계의 핵심 목표인 `bot authored PR + human approval only`가 현재 코드로는 보장되지 않습니다."
    },
    {
      "severity": "critical",
      "description": "우회 경로 100% 차단 요구가 충족되지 않습니다. `scripts/finish-task.sh`는 여전히 `worktree_manager.py finish ... --action auto`를 호출해 머지 흐름을 진행하고, 이후 taskctl 상태와 무관하게 `.merge-done` 및 `.done` 파일을 생성합니다. 설계상 금지된 `finish-task.sh 직접 merge/완료 인정` 경로가 남아 있어 state machine을 우회할 수 있습니다."
    },
    {
      "severity": "high",
      "description": "`scripts/worktree_manager.py`에는 아직 `gh pr merge` 직접 호출이 남아 있습니다. 설계는 `gh pr merge`를 `taskctl.py` 내부 유일 호출 지점으로 제한하지만, 현재 구현은 hidden path audit 합격 조건을 즉시 위반합니다. 설계 문서의 `영향받는 파일 없음` 표기도 실제 변경 필요 범위를 심각하게 축소해 리뷰/테스트 누락 위험을 키웁니다."
    },
    {
      "severity": "high",
      "description": "설계가 요구한 admin override는 `taskctl merge --admin` 기반의 회장 전용 감사 가능한 break-glass여야 하지만, 현재 구현은 누구나 사용할 수 있는 `TASKCTL_BYPASS=1` 환경변수 우회만 존재합니다. actor 제한, 월/분기 cap, audit log, bypassed_checks 기록이 없어 거버넌스 통제가 사실상 무력화됩니다."
    },
    {
      "severity": "medium",
      "description": "테스트 세트가 새 설계를 방어하지 못합니다. `tests/test_taskctl.py`는 기존 MVP 상태 모델과 `merge --dry-run -> DONE` 동작을 전제로 작성되어 있고, 14+5 상태 전이, 9종 evidence 파일 생성, self-approve 차단, bot-authored PR, hidden path 제거를 검증하지 않습니다. 이 상태로는 대규모 리팩터 후에도 잘못된 구현이 쉽게 통과할 수 있습니다."
    }
  ],
  "suggestions": [
    "설계와 구현 사이의 간극이 너무 크므로, `taskctl.py`를 기존 MVP 보강이 아니라 새 상태 모델 기준으로 재설계하고 `MERGE`와 `DONE`를 반드시 분리하세요.",
    "`taskctl pr-open`을 실제 bot token 기반 PR 생성 명령으로 바꾸고, `pr_author/base_sha/head_sha/pr_number/created_by`를 state와 evidence 파일에 강제 기록하세요.",
    "`taskctl approve --by <human>`에서 PR author 조회, self-approve 차단, required checks/Gemini/verify/high severity 0 검증을 모두 수행한 뒤에만 `HUMAN_APPROVED`로 전이하세요.",
    "`TASKCTL_BYPASS`를 제거하고, 회장 전용 `merge --admin`만 남기며 actor 검증·usage cap·audit log를 구현하세요.",
    "`finish-task.sh`, `worktree_manager.py`, `anu_confirm_bot`에서 PR 생성/머지/완료 파일 생성을 직접 수행하는 코드를 제거하고 전부 `taskctl pr-open/verify/approve/merge/done` 호출로 라우팅하세요.",
    "테스트를 `tests/taskctl/`와 `tests/state_machine/`로 분리해 금지 전이 6종, evidence 9종, hidden path grep, self-approve, admin override cap, `MERGED 없이는 DONE 불가`를 명시적으로 검증하세요."
  ],
  "source": "codex_companion",
  "fallback_reason": null,
  "error": null,
  "target_dir": "/home/jay/workspace",
  "target_dir_source": "workspace_root_fallback",
  "task_id": "task-2467",
  "timestamp": "2026-05-05T20:17:55.815375+00:00"
}