---
task_id: task-2472+1
type: plan
scope: task
created: 2026-05-07
updated: 2026-05-07
status: completed
level: 3
priority: P1
---

# 계획서: task-2472+1 — taskctl reconcile 명령 신설 (state-orphaned 사후 정합화)

**task**: task-2472+1 (task-2472 layer 3 후속, layer 4)
**목표**: PR merge + .done valid + state file missing 상태(state_orphaned_after_valid_merge)를 silent corruption 없이 정합화하는 공식 명령 경로 신설
**근거**: task-2472 PR #40 정상 머지 + .done valid + `.tasks/state/task-2472.json` missing 상태로 끝나면서 본 hardening이 자기 자신의 ack를 차단하는 deadlock 발생 (회장 지시 2026-05-07)

---

## 목표

1. `taskctl reconcile` 신규 명령으로 4 evidence (PR state / origin/main ancestry / .done payload / .done sha256) 자동 검증 후 state 파일 재구성
2. `.g3-fail` 자동 분류 룰 (`false_alert_resolved_by_late_report` 케이스만 reconcile 허용)
3. classification enum 4종 분기 (state_orphaned_after_valid_merge 등)
4. state-recovery audit jsonl 14필드 schema 적용
5. dogfooding (drink-your-own-champagne layer 4): 본 task 머지 후 task-2472 자체에 reconcile 1차 적용

## 범위

### 포함
- `utils/state_repair.py` 신설 (reconcile 핵심 로직 + classification enum + audit jsonl writer)
- `utils/g3_fail_classifier.py` 신설 (자동 분류 룰)
- `scripts/taskctl.py`에 `reconcile` 서브커맨드 추가 (검증 루프 10단계 호출)
- regression test 9건:
  - `tests/regression/test_taskctl_reconcile.py` (7건 + dogfooding 1건)
  - `tests/regression/test_g3_fail_classification.py` (1건 multi-case)
- `utils/silent_corruption_guard.py` reconcile 친화 보강 (필요 시)
- task-2472 dogfooding 실행 (.tasks/state/task-2472.json 정상 생성 + `taskctl status` 검증)

### 제외
- task-2472 영역 marker 수정 (forbidden_paths)
- finish-task.sh / done-watcher.sh 수정
- admin override 경로

## 위임 계획

- **토르 (backend, sonnet)**: `utils/state_repair.py` + `utils/g3_fail_classifier.py` 신설 + `scripts/taskctl.py` reconcile 서브커맨드 추가
- **헤임달 (tester, sonnet)**: regression 9건 작성 + 실행 + dogfooding 실행 + `taskctl status task-2472` 검증
- **프레이야/미미르**: 시스템 + 코어 모듈 작업 — 호출 안 함

## 검증 기준

- 회귀 0: `python3 -m pytest tests/regression -v` (기존 테스트 0건 실패)
- 신규 9건 PASS: `python3 -m pytest tests/regression/test_taskctl_reconcile* tests/regression/test_g3_fail_classification* -v`
- dogfooding: `taskctl reconcile --task-id task-2472 ...` 후 `taskctl status task-2472` PASS, `.tasks/state/task-2472.json` 존재 + checksum 일치
- audit jsonl 14필드: `jq` 검증
- task-2472 marker 0줄 변경: `git diff memory/events/task-2472.*`

## 3 Step Why

**1st Why — 왜 이 설계가 필요한가?**
A: task-2472 hardening이 state file missing 상태에서 done/merge를 차단하면서, PR #40 정상 머지 + .done valid 상태를 사후 ack 못 하는 deadlock이 발생함. silent corruption 없이 이 케이스를 정합화하는 공식 경로 필요.

**2nd Why — 왜 reconcile 신규 명령이 최선인가?**
B: 대안:
- (a) `taskctl init <id>` 사용 → state는 CREATED로 시작 + transitions=[] → silent corruption. 본 hardening이 차단해야 하는 경로.
- (b) state JSON 수동 작성 → checksum/silent_corruption_guard 우회 = 본 hardening의 회피.
- (c) admin override → state는 ADMIN_OVERRIDE_USED terminal로 묶여 DONE 인식 못 함.
- (d) reconcile 신규 명령 → 4 evidence 객관 검증 + classification enum + audit jsonl 강제 → hardening 정신 보존하며 deadlock 해소.
→ (d)만이 hardening과 일관.

**3rd Why — 왜 (d)가 manual override보다 나은가?**
C: manual override는 사람 의지 신뢰 path. reconcile은 (1) PR state=MERGED, (2) origin/main ancestry, (3) .done payload schema, (4) sha256 audit 일치 — 4종 evidence를 강제 verify. classification enum으로 케이스 분기 + audit jsonl 14필드로 사후 추적. 동일 패턴 재발 시 자동 처리 가능. silent_corruption_guard와 동일 fail-closed 모델.

## 결론

위 A→B→C 일관. (d) reconcile 신규 명령 = layer 4 메타 검증 (본 task가 만든 도구로 자기 선행 task 결함 정합화).
