---
task_id: task-2471
type: plan
scope: task
created: 2026-05-07
updated: 2026-05-07
status: in-progress
---

# 계획서: task-2471 — 1차 hardening

**task**: task-2471
**목표**: taskctl/dispatch/merge/done 경로 silent corruption + manual recovery 의존성 제거 (회장 1차 hardening)
**승인**: 회장 2026-05-06 "1차 hardening — 자동 ack 데몬 미포함"
**근거**: memory/tasks/task-2471.md (회장 명시 8건 + 합격 10건)

---

## 목표

1. `.done` 발행 전 PR mergedAt / mergeCommit / origin/main ancestry 3 hardcoded check (fail-closed)
2. `RECOVERABLE_BLOCKED` state 도입 — `MERGING → FAILED terminal` 고정 문제 수정
3. dispatch.py `--task-id` 명시 옵션 + `+N` suffix 정확 인식 (`task-2469+1` → 그대로)
4. chairman manual recovery audit jsonl 신설 (`memory/orchestration-audit/chairman-manual-recovery.jsonl`)
5. pre_push_guard 4결함 수정 (numbered heading / inline comment / +N branch / fail-closed)
6. Gemini gate 보정 — image markdown `![high](...)` severity 탐지 + auto-trigger 보정
7. P0-6 SHA fetch race fix — `git fetch origin --no-tags +refs/heads/main:refs/remotes/origin/main` 강제 + 2회 교차 검증
8. regression tests 8건 (영구 차단)
9. drink-your-own-champagne: 본 task PR이 위 hardening 코드를 통해 자체 merge

## 범위

### 포함
- scripts/taskctl.py: state machine + done 3 hardcoded check
- scripts/lifecycle_guards.py: P0-6 SHA fetch race + state transition extension
- scripts/pre_push_guard.py: 4 결함 수정
- scripts/gemini_severity_parser.py: image markdown 탐지 추가
- dispatch/__init__.py: --task-id 자동 증분 차단 + +N suffix 보존
- utils/silent_corruption_guard.py (신규): 3 hardcoded check 모듈
- utils/task_id_parser.py (신규): +N 안전 parser
- memory/orchestration-audit/chairman-manual-recovery.jsonl (신규)
- tests/regression/, tests/state_machine/, tests/dispatch/, tests/lifecycle_guards/ regression 8건

### 제외 (회장 명시)
- 자동 ack 데몬 (별도 task)
- watchdog / cron / 백업 cron
- task-2468/2469/2470 산출물 변경
- admin override 적용

## 위임 계획

- **silent_corruption_guard 모듈 + taskctl done 통합**: **토르(백엔드)** — 핵심 fail-closed 로직
- **state machine RECOVERABLE_BLOCKED**: **토르(백엔드)** — taskctl ALLOWED_TRANSITIONS 확장
- **dispatch.py task ID + utils/task_id_parser**: **토르(백엔드)** — +N suffix 보존
- **pre_push_guard 4결함 + Gemini image severity**: **토르(백엔드)** — 한 묶음
- **P0-6 SHA fetch race**: **토르(백엔드)** — lifecycle_guards 보강
- **chairman audit jsonl appender**: **토르(백엔드)** — appender 함수 + schema
- **regression tests 8건**: **헤임달(테스터)** — 모든 기능에 대한 영구 차단 테스트
- **3문서 + 보고서**: **오딘(팀장)** — 통합

## 검증 기준

- `python3 -m pytest tests/regression/ tests/state_machine/ tests/dispatch/ tests/lifecycle_guards/ -v` → all PASS
- `grep -r "mergedAt" scripts/` → done hard gate 존재 확인
- `grep -r "RECOVERABLE_BLOCKED" scripts/taskctl.py` → state 추가 확인
- `python3 dispatch.py --help | grep "task-id"` → 옵션 노출 확인
- `gh pr view <task-2471 PR> --json state -q '.state'` → MERGED
- `ls memory/events/task-2471.done` → 존재 (silent corruption guard 통과 증명)
