# task-2469+1 — Phase D manual recovery 실행 (회장 승인 1회 한정)

- 작업 유형: **manual-recovery-only** (state transition + merge + done, 코드 변경 0)
- 작업 레벨: **Lv.4 critical**
- 위임팀: **dev2-team (오딘, opus)**
- Track: **dev_workspace**
- 우선순위: **★★★ blocking** — Phase A-D 완결 마지막 단계
- 일시: 2026-05-06
- 선행: task-2469 ESCALATED (state machine FAILED terminal) + 회장 manual recovery 승인
- 후행: task-2470 (자동 복구 룰 + pre_push_guard.py 결함 + regression test)

## ⚠️ 본 task의 본질 — 회장 승인 1회 한정 manual recovery

> "회장 권한으로 manual recovery 1회 승인한다.
> 이는 팀 우회가 아니라 회장 승인 하의 terminal state recovery다."

회장 승인 evidence: `memory/events/task-2469.chairman-recovery-approval.txt`

→ **state transition + merge + done. 코드/PR diff 0줄 변경.**

## 0. 배경 — task-2469 임패스

| 항목 | 결과 |
|------|------|
| PR #35 | OPEN, MERGEABLE, mergeStateStatus=CLEAN |
| CI required checks | 8/8 PASS ✅ |
| gemini-review-gate | PASS, high=0 |
| Gemini threads | 6/6 RESOLVED ✅ |
| pentest | 39/39 PASS ✅ |
| regression | 14/14 + 81 total PASS ✅ |
| audit | 228/228 blocked=true ✅ |
| scope-guard | 0 violation ✅ |
| **state machine** | **FAILED (terminal, forced=True)** ❌ |
| 팀 자체 retry | **0회** (§[금지#8] 준수) |

## 1. 작업 범위 (회장 명시 — 엄격)

### 허용 (정확히 4 step)
1. `.tasks/state/task-2469.json`에 manual recovery transition 1건 추가
   - `from: FAILED → to: HUMAN_APPROVED`
   - `reason: chairman_manual_recovery_after_review_threads_resolved`
   - evidence 필드 명시 (PR #35 CLEAN, CI 8/8, threads 6/6, pentest 39/39 등)
2. `taskctl merge task-2469` 재실행
3. merge 성공 후 `taskctl done task-2469` 발행
4. `task-2469+1.done` 별도 발행 (본 manual recovery task)

### 절대 금지 (회장 명시 7건)
- 추가 코드 수정 금지
- PR #35 diff 수정 금지
- admin override 사용 금지
- Gemini thread 임의 resolve 추가 금지
- .gitignore / .secrets 조작 금지
- task-2470 항목 혼합 금지
- 보고서만 DONE 처리 금지

## 2. 실행 절차 (회장 명시 6단계)

### Step 1 — PR #35 현재 상태 재확인
```bash
gh pr view 35 --repo Jeon-Jonghyuk/dev_workspace --json state,mergeable,mergeStateStatus,reviewDecision
gh pr checks 35 --repo Jeon-Jonghyuk/dev_workspace
# 기대: state=OPEN, mergeable=MERGEABLE, mergeStateStatus=CLEAN, 8/8 PASS
```

### Step 2 — manual recovery transition 추가
```bash
cd /home/jay/workspace
# state json에 transition append (정확한 형식은 기존 transition 구조 따름)
python3 -c "
import json
from pathlib import Path
from datetime import datetime, timezone
state_path = Path('.tasks/state/task-2469.json')
state = json.loads(state_path.read_text())
state['transitions'].append({
    'from': 'FAILED',
    'to': 'HUMAN_APPROVED',
    'ts': datetime.now(timezone.utc).isoformat(),
    'reason': 'chairman_manual_recovery_after_review_threads_resolved',
    'forced': False,
    'authorized_by': 'chairman',
    'evidence': {
        'pr_state': 'OPEN/MERGEABLE/CLEAN',
        'ci_checks': '8/8 PASS',
        'gemini_threads': '6/6 RESOLVED',
        'gemini_high': 0,
        'pentest': '39/39 PASS',
        'regression': '81 passed, 2 xfailed',
        'scope_violations': 0,
        'audit_blocked': '228/228',
        'inherited_diff': 0,
        'approval_evidence': 'memory/events/task-2469.chairman-recovery-approval.txt'
    }
})
state['current_state'] = 'HUMAN_APPROVED'
state_path.write_text(json.dumps(state, indent=2, ensure_ascii=False))
print('OK: transition appended')
"
```

### Step 3 — taskctl merge 재실행
```bash
python3 scripts/taskctl.py merge task-2469
# 기대: PR #35 머지 성공
```

### Step 4 — merge 검증 (회장 명시)
```bash
gh pr view 35 --repo Jeon-Jonghyuk/dev_workspace --json state,mergedAt,mergeCommit
git fetch origin
# merge commit이 origin/main history에 존재하는지 확인
git log origin/main --oneline | head -5
git rev-parse origin/main
# 5a77b554 ancestor 검증
git merge-base --is-ancestor 5a77b554 origin/main && echo "PASS"
```

### Step 5 — taskctl done 실행
```bash
python3 scripts/taskctl.py done task-2469
ls memory/events/task-2469.done  # 갱신됨
ls memory/events/task-2469.g3-fail 2>/dev/null && echo "FAIL"
ls memory/events/task-2469.done.escalated 2>/dev/null && echo "FAIL"
```

### Step 6 — task-2469+1 자체 done 발행
```bash
# 본 manual recovery task 종결
touch memory/events/task-2469+1.done
# 보고서 작성 (memory/reports/task-2469+1.md)
```

## 3. allowed_resources

```yaml
allowed_resources:
  paths:
    - ".tasks/state/task-2469.json"  # ★ transition 1건 추가만
    - "memory/tasks/task-2469+1*"
    - "memory/reports/task-2469+1*"
    - "memory/plans/tasks/task-2469+1/**"
    - "memory/events/task-2469+1*"
    - "memory/events/task-2469.done"  # 갱신만 (기존 stale 마커)
  forbidden_paths:
    - "scripts/**"
    - "tests/**"
    - "memory/specs/**"
    - "memory/orchestration-audit/admin-override.jsonl"
    - "memory/events/task-2469.chairman-recovery-approval.txt"  # read-only evidence
    - "memory/events/task-2469.escalate*"  # ESCALATED evidence read-only
    - "memory/events/task-2468*"  # 보존
    - "memory/events/task-2467*"
    - "PR #34 / #33 / #32 / #31 / #30 / #29"
    - ".env.keys"
    - ".secrets/**"
    - ".gitignore"
  forbidden_actions:
    - "추가 코드 수정 금지"
    - "PR #35 diff 수정 금지"
    - "admin override 사용 금지"
    - "Gemini thread 임의 resolve 추가 금지"
    - ".gitignore / .secrets 조작 금지"
    - "task-2470 항목 혼합 금지"
    - "보고서만 DONE 처리 금지"
    - "gh pr merge 직접 호출 금지 (taskctl 외)"
    - "git push --force 금지"
    - "git push origin main 직접 호출 금지"
  bot_authentication:
    - "BOT_GITHUB_TOKEN .env.keys 자동 로드"
    - "PR author = jeon-jonghyuk-taskctl-bot[bot]"
    - "merge actor = taskctl bot"
  merge_policy: "★ 회장 승인 manual recovery 1회 한정. state transition 후 taskctl merge"
  ttl_hours: 2
```

## 4. 합격 조건 (회장 명시)

전부 충족해야 합격:
1. ✅ PR #35 state=MERGED, mergedAt 기록, merge commit SHA 기록
2. ✅ merge commit이 origin/main history에 존재
3. ✅ origin/main HEAD 갱신 (f248eb26 → 새 merge commit)
4. ✅ 5a77b554가 origin/main ancestor
5. ✅ task-2469.done 존재 + 정상 (stale 22:09 마커가 새 merge 기반으로 갱신)
6. ✅ task-2469.g3-fail 부재
7. ✅ task-2469.done.escalated 부재
8. ✅ task-2469.escalate* 이전 evidence는 보존 (read-only)
9. ✅ audit jsonl 228/228 blocked=true 유지
10. ✅ task-2469+1.done 존재
11. ✅ 코드/PR diff 0줄 변경 (`git diff origin/main..PR #35 head` 변동 없음)
12. ✅ admin override 0건
13. ✅ chairman-recovery-approval.txt 보존

## 5. ESCALATED 조건

- 코드 수정 발생 → 즉시 ESCALATED
- PR #35 diff 변경 → ESCALATED
- admin override 사용 → ESCALATED
- merge 후에도 origin/main HEAD 미갱신 → silent corruption ESCALATED
- task-2469.done이 머지 전 발행 → silent corruption ESCALATED

## 6. goal_assertions

```bash
# merge 검증
gh pr view 35 --repo Jeon-Jonghyuk/dev_workspace --json state,mergedAt -q '.state'  # MERGED
gh pr view 35 --repo Jeon-Jonghyuk/dev_workspace --json mergedAt -q '.mergedAt'  # not null

# main 검증
git fetch origin
git merge-base --is-ancestor 5a77b554 origin/main && echo "PASS"
git log origin/main --oneline | head -3  # task-2469 merge commit 확인

# state 검증
python3 scripts/taskctl.py status task-2469  # state=DONE
python3 scripts/taskctl.py status task-2469+1  # state=DONE

# 마커 검증
ls memory/events/task-2469.done  # 존재 (갱신)
ls memory/events/task-2469+1.done  # 존재
ls memory/events/task-2469.g3-fail 2>/dev/null && echo "FAIL" || echo "PASS"
ls memory/events/task-2469.done.escalated 2>/dev/null && echo "FAIL" || echo "PASS"
ls memory/events/task-2469.chairman-recovery-approval.txt  # 보존

# 코드 무변경
git diff f248eb26..HEAD scripts tests  # 0 lines 기대
```

## 7. 보고서 필수 항목 (`memory/reports/task-2469+1.md`)

1. PR #35 머지 commit SHA
2. origin/main 갱신 후 HEAD
3. `git merge-base --is-ancestor 5a77b554 origin/main` 결과
4. state transition diff (FAILED → HUMAN_APPROVED)
5. taskctl merge / done 실행 로그
6. 코드/PR diff 0줄 증명
7. admin override 0건 증명
8. chairman-recovery-approval.txt 보존 검증
9. task-2470 후속 박제 항목 (시스템 결함 5건):
   - **state machine FAILED → HUMAN_APPROVED 자동 복구 룰** (review threads resolved + CI all PASS + Gemini High=0 + scope 0 + 30분 이내 → 자동 전이)
   - regression test 추가 (사후 resolve 시나리오)
   - chairman manual recovery audit 채널 (`memory/orchestration-audit/chairman-manual-recovery.jsonl`)
   - pre_push_guard.py 결함 4건 (numbered heading / inline comment / branch parsing / fail-closed graceful skip)
   - 추가 결함: image markdown _HIGH_INLINE_LABEL pattern, Gemini auto-review trigger

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

본 task = Phase A-D 완결의 마지막 운영 단계. task-2470 = 시스템 결함 영구 차단.

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

1. 수신 확인: dispatch 출력 확인
2. 빌드+배포: PR #35 merge + main HEAD 갱신 검증
3. 실 E2E: state transition → taskctl merge → done → main 반영
4. 구조 선행 파악: chairman-recovery-approval.txt + reports/task-2469.md + .escalated 마커 모두 read

## goal_assertions (auto-generated)
- `gh pr view 35 --json state,mergedAt`
- `git merge-base --is-ancestor 5a77b554 origin/main`
- `python3 scripts/taskctl.py status task-2469`
