# task-2467+1 — taskctl PR Lifecycle State Machine 재시도 (PR open + main 머지까지)

- 작업 유형: **retry** (task-2467 ESCALATED 재시도, +1 포맷)
- 작업 레벨: **Lv.4 critical**
- 위임팀: **dev6-team (페룬, opus)**
- Track: **dev_workspace** (시스템 거버넌스)
- 우선순위: **★★★ blocking** — task-2466 / PR #29 / 모든 후속 PR 의존
- 일시: 2026-05-06

## 0. 배경 — task-2467 ESCALATED 종료

### 1차 결과 (task-2467, dev6 페룬, 40분 6초)

**✅ 구현 성공**:
- `taskctl.py` 1000 → 1840줄 확장
- 14 정상 + 5 예외 상태 모두 구현
- 신규 명령 8개 + 기존 확장 3개
- Evidence 9종 자동 박제
- pyright 0 errors

**⚠️ ESCALATED 사유**:
- `qc-result: WARN` (`scope_check: WARN`, `claude_md_check: WARN`)
- `g3-fail`: SCQA 패턴 부족 0개 (최소 2개 필요) — 보고서 형식
- `start-guard-fail`: cwd 검증 (재시도로 해결, 1회)
- **state: COMMITTED**, **pr: None** → PR 미생성 → main 반영 0
- `.done.escalated` 발행 — 새 룰("BLOCKED/ESCALATED 시 .done 금지") 자기 자신에게 정상 작동

### 2차 진행 이유 (회장 명시 A안)

회장 절대 룰:
1. "A안 반복 사용 금지" → admin override 두 번째는 위반 (task-2465 1회 한정)
2. "정정은 새 task로 재위임" → 새 task ID(+1)로 진행
3. "drink your own champagne" → 새 taskctl 흐름이 자기 자신을 머지해야 시스템 검증

→ task-2467 코드는 정확함. **본 task는 PR open + verify + approve + merge까지 진행**하여 **main에 반영**시킨다.

---

## 1. allowed_resources

```yaml
allowed_resources:
  paths:
    - "scripts/taskctl.py"                   # task-2467 코드 그대로 main에 반영 (수정 필요 시 surgical)
    - "scripts/finish-task.sh"               # task-2467 변경 그대로
    - "scripts/worktree_manager.py"          # task-2467 변경 그대로
    - "scripts/anu_confirm_bot.py"           # task-2467 변경 그대로
    - "scripts/guard.sh"                     # task-2467 변경 그대로
    - "scripts/qc_report_guard.py"           # task-2467 변경 그대로
    - "scripts/start_task_guard.py"          # cwd 검증 보강 (1차 fail 원인)
    - "scripts/g3_independent_verifier.py"   # SCQA 패턴 검증 호환
    - "tests/taskctl/**"                     # 회귀 테스트
    - "tests/state_machine/**"               # 상태 전이 테스트
    - "memory/tasks/task-2467+1*"
    - "memory/reports/task-2467+1*"
    - "memory/specs/taskctl-state-machine-spec*.md"
    - "memory/specs/pr-lifecycle-spec*.md"
  forbidden_paths:
    - "PR #29 / PR #30 / PR #31"  # 절대 변경 금지
    - "memory/events/task-2465*"
    - "memory/events/task-2466*"
    - "memory/events/task-2467.*"            # 1차 결과 read-only
    - "memory/orchestration-audit/task-2465*"
    - "memory/reports/task-2465.md"
    - "memory/reports/task-2467.md"          # 1차 보고서 보존
    - ".github/**"
    - "dispatch.py"
    - "memory/organization-structure.json"
    - "bot_settings.json"
  forbidden_actions:
    - "PR #29 / #30 / #31 어떤 변경도 금지"
    - "task-2465 / task-2466 / task-2467 1차 결과 임의 수정 금지"
    - "GEMINI_API_KEY 도입 절대 금지 (회장 명시)"
    - "admin override 사용 금지 (1차 머지는 A안 반복 = 회장 룰 위반)"
    - "gh pr merge 직접 호출 금지 (taskctl 내부 제외)"
    - "gh pr create 직접 호출 금지 (taskctl 내부 제외)"
    - "git push origin main 직접 호출 금지"
  commands:
    - "python3 scripts/taskctl.py <subcommand>"
    - "git / gh api / gh pr (taskctl 내부 + 테스트)"
    - "pytest / pyright"
    - "grep -rn"
  merge_policy: "★ 새 taskctl 흐름으로만 머지 (drink your own champagne 강제). admin override 절대 금지"
  ttl_hours: 8
```

## 2. ★ START 절차

```bash
cd /home/jay/workspace
test "$(git branch --show-current)" = "main" || exit 1

# task-2467 1차 worktree가 살아있는지 확인 (있으면 재사용 검토)
ls .worktrees/task-2467-dev6 2>/dev/null && echo "1차 worktree 존재" || echo "1차 worktree 없음"

# task-2467+1 새 worktree (1차 코드 위에 합산)
python3 scripts/start_task_guard.py --task task-2467+1 --bot dev6 --pre-init
git worktree add .worktrees/task-2467+1-dev6 -b task/task-2467+1-dev6 origin/main
cd .worktrees/task-2467+1-dev6

# task-2467 1차 코드 cherry-pick 또는 merge (페룬 판단)
# (1차 worktree에서 commit 가져오기 — 회장 절대 룰 "Surgical Changes" 준수)

python3 scripts/start_task_guard.py --task task-2467+1 --bot dev6
# 새 taskctl 흐름 자기 검증 (drink your own champagne)
python3 scripts/taskctl.py init task-2467+1
python3 scripts/taskctl.py worktree-ready task-2467+1   # 신규 명령 (task-2467에서 추가)
python3 scripts/taskctl.py run task-2467+1
```

## 3. 작업 항목

### 3.1 1차 코드 합산
- task-2467 페룬 worktree (`.worktrees/task-2467-dev6`)에서 1차 변경 가져오기
- cherry-pick 또는 squash merge (페룬 판단)
- `taskctl.py` 1840줄 / `finish-task.sh` / `worktree_manager.py` / `anu_confirm_bot.py` 등 **그대로 보존**
- surgical 수정만 (3.2 참조)

### 3.2 1차 ESCALATED 사유 surgical fix

**3.2.1 `start-guard-fail`** — cwd 검증 (1회 발생, 재시도로 해결됐던 사유)
- 원인: 첫 시도 cwd가 `/home/jay/workspace` (worktree 미사용)
- 본 task는 `.worktrees/task-2467+1-dev6`에서 시작 강제 (START 절차 준수)
- 코드 변경 0건 (절차 준수만)

**3.2.2 `scope_check: WARN`**
- task-2465 / task-2467 동일 패턴
- 1차 보고서에서 의도적 deletion / scope 외 파일 변경 사유 명시 안 됨
- **본 task는 followup.txt에 사유 명시 강제** (예: "스바로그가 추가한 새 모듈은 새 디렉토리이므로 scope 외 분류, 의도된 신설")

**3.2.3 `claude_md_check: WARN`**
- CLAUDE.md 인용/준수 자체 점검 누락
- **본 task 보고서에 CLAUDE.md 준수 항목 명시 강제**

**3.2.4 `g3-fail` SCQA 패턴 부족**
- g3_independent_verifier가 보고서에 SCQA 패턴 2개 이상 요구
- **본 task 보고서**에 SCQA 헤더 명확히 작성 (`## SCQA` + `### S`/`### C`/`### Q`/`### A` 4구조)

### 3.3 self-test (drink your own champagne)

본 task PR이 **새 taskctl 흐름으로만 머지** (1차 ESCALATED 시점에 못 한 것):

```bash
# 새 worktree에서:
python3 scripts/taskctl.py commit task-2467+1
python3 scripts/taskctl.py pr-open task-2467+1 --auto   # bot token으로 PR 생성 (1차 신규 명령)
python3 scripts/taskctl.py ci-check task-2467+1
python3 scripts/taskctl.py gemini-evidence task-2467+1
python3 scripts/taskctl.py review-ready task-2467+1
python3 scripts/taskctl.py verify task-2467+1
# verify PASS 시 → 회장에 approve 요청 (Telegram)
# 회장 approve 후:
python3 scripts/taskctl.py merge task-2467+1
python3 scripts/taskctl.py done task-2467+1
```

→ **admin override 사용 금지**. 새 taskctl 흐름이 정상 작동해야만 머지 성공 가능.

### 3.4 회귀 테스트 보강

- 본 task PR이 1차 worktree 코드의 회귀 테스트 + 추가 테스트 모두 PASS해야 함
- pyright 0 errors 유지

### 3.5 보고서 (★ SCQA 강제)

`memory/reports/task-2467+1.md`:
```markdown
---
task_id: task-2467+1
team: dev6-team
leader: 페룬
date: 2026-05-06
status: completed (또는 ESCALATED 그대로)
qc_verdict: PASS (또는 WARN — 정직)
verdict: PASS
type: code/refactor + spec
level: Lv.4 critical
merge_needed: true
---

# task-2467+1 — taskctl PR Lifecycle (재시도)

## SCQA

### S — Situation
[task-2467 1차 ESCALATED 배경 인용]

### C — Complication
[1차 PR 미생성 → main 반영 0 + drink your own champagne 룰 위반]

### Q — Question
[어떻게 새 taskctl 흐름으로 자기 자신을 머지할 것인가?]

### A — Answer
[1차 코드 + surgical fix + self-test 완수]

## QC Verdict

PASS  (또는 WARN — qc-result.json 일치)

## CLAUDE.md 준수 점검
- [x] 직접 코딩 금지 (페룬 팀장은 검토만, 스바로그가 코드 작성)
- [x] dispatch.py로 위임됨
- [x] 보고서 SCQA + 회장 인용
- [x] task-2467 1차 결과 read-only 보존

## 회장 절대 룰 충족
- [x] PR #29/#30/#31 변경 0건
- [x] GEMINI_API_KEY 도입 0건
- [x] admin override 사용 0건
- [x] gh pr create / gh pr merge 직접 호출 0건
- [x] 새 taskctl 흐름 자기 검증 통과 (drink your own champagne)

## 변경 파일
[1차 task-2467 변경분 + 본 task surgical fix]
```

---

## 4. 합격 기준

### 합격
1. 1차 task-2467 코드 그대로 main에 반영 (1840줄)
2. **PR 생성**: `taskctl pr-open --auto`로만 (bot token, gh pr create 직접 호출 0건)
3. **verify PASS**: guard.sh PASS + qc_report_guard PASS + Gemini evidence PASS
4. **approve**: 회장 직접 approve (PR author != approver — 본 PR의 author가 bot이어야 가능)
5. **merge**: `taskctl merge` 새 명령으로만. **admin override 0건**
6. **state: MERGED + DONE** (origin/main에 merge commit 확인)
7. SCQA 패턴 2개 이상 (g3 PASS)
8. scope_check / claude_md_check 모두 PASS (보고서에 사유 명시)
9. PR #29 / #30 / #31 변경 0건
10. pyright 0 errors / pytest 회귀 PASS

### 불합격
1. PR #29 / #30 / #31 변경 발견 시 즉시 FAIL
2. admin override 사용 시 즉시 FAIL (회장 룰 "A안 반복 금지")
3. gh pr create / gh pr merge 직접 호출 시 즉시 FAIL (taskctl 내부 제외)
4. PR author == approver 발견 시 즉시 FAIL (self-approve 차단)
5. 1차 코드 임의 변경 (surgical 외) 발견 시 즉시 FAIL
6. main 반영 안 되면 FAIL ("MERGED 없이 DONE 0건" 룰)

---

## 5. 위임 완결성 4대 규칙

1. **수신 확인**: dispatch.py 출력의 "위임 완료" + cron status=ok. 백업 cron **금지**
2. **빌드+배포**: 새 taskctl 흐름으로 자기 자신을 머지 (drink your own champagne)
3. **실 E2E**: 본 task PR이 실제 GitHub PR + 실제 Gemini App review + 회장 직접 approve + taskctl merge로 main 반영. 모든 단계 evidence 9종 박제
4. **구조 선행 파악**: 위임 전 다음 read 필수
   - 1차 worktree (`.worktrees/task-2467-dev6`) 변경 파일
   - 1차 보고서 `memory/reports/task-2467.md`
   - 1차 ESCALATED 사유 (`memory/events/task-2467.qc-result`, `task-2467.g3-fail`, `task-2467.completion.txt`)
   - 회장 박제 audit `memory/orchestration-audit/task-2465.jsonl` (admin override 금지 사례)

## 6. 주의사항

- **★ admin override 절대 금지** (회장 명시 "A안 반복 금지")
- **★ 1차 코드 임의 변경 금지** (surgical fix만)
- **★ task-2465 / task-2466 / task-2467 1차 결과 read-only**
- **★ PR author = bot 강제** (1차에서 만든 `pr-open --auto` 사용)
- **★ 위임 후 중간 정정 100% 무효**
- **★ 본 task PR도 task-2467+1 새 taskctl 흐름으로만 머지** — taskctl 우회 절대 금지

## 7. 시스템 청사진 연관

본 task = `system_bot_orchestration_blueprint_260506.md` 5층 자동화의 **첫 self-merge 케이스**.

- track: `dev_workspace` (시스템 거버넌스)
- 무거운 게이트: 3문서 + smoke + Gemini evidence + merge_queue
- limited_approval scope: phase_1 ~ phase_6
- excluded: production_deploy / security_change / credential_change / external_api_write / **gate_bypass** / **force_merge** ← 본 task 절대 위반 금지

## 8. 의존 task

- **선행**: task-2467 1차 (ESCALATED, worktree 잔존)
- **차단 task**:
  - task-2466 (위스퍼) 결과 처리 — 본 task 머지 후 진행
  - task-2468 (Phase C — Gate 통합) — 본 task 머지 후
  - task-2469 (Phase D — Penetration) — task-2468 후
  - PR #29 (task-2463) 머지 — 본 task 머지 전 절대 금지

## 9. goal_assertions

- `python3 scripts/taskctl.py status task-2467+1` → state == MERGED + DONE
- `gh pr view <task-2467+1 PR> --json mergedAt,mergeCommit -q '.mergedAt'` → 비어있지 않음
- `git log origin/main --oneline | head -3` → task-2467+1 merge commit 존재
- `cat memory/orchestration-audit/admin-override.jsonl` → 본 task 항목 0건 (admin 미사용 증명)
- `grep -rn "gh pr merge" --exclude-dir=.git --exclude-dir=tests` → `scripts/taskctl.py` 외 0건
- `pyright scripts/taskctl.py` → 0 errors

## goal_assertions (auto-generated)
- `python3 scripts/taskctl.py status task-2467+1`
- `cat memory/orchestration-audit/admin-override.jsonl`
- `grep -rn "gh pr merge" --exclude-dir=.git --exclude-dir=tests`
