---
task_id: task-2374
type: checklist
scope: task
created: 2026-05-02
updated: 2026-05-02
status: completed
---

# 체크리스트: task-2374 — 옵션 D 시맨틱 재설계

**task**: task-2374

---

## Phase 0 — 사전 작업

- [x] 미팅 문서 확인 (memory/meetings/2026-05-02-done-semantics-redesign.md)
- [x] Codex G1 사전 검증 (1차) — critical 1건, high 2건 발견
- [x] 호환 shim 전략으로 설계 수정 (3문서 업데이트)
- [x] worktree 생성 (.worktrees/task-2374-dev7)

## Phase 1 — `finish-task.sh` 마커 분리 + state.json — 쿠쿨칸(BE)

- [x] A. `finish-task.sh`에 `state_init()` 함수 추가 — `.work-done` 마커 + `memory/state/{task_id}.json` atomic 생성
- [x] B. `.work-done` 생성 시 `.done` 호환 symlink 동시 생성 (기존 소비자 회귀 0)
- [x] C. state.json 스키마: `{task_id, phase, kind, merge_required, timestamp, project_path?, pr_url?}`
- [x] D. cancelled/QC FAIL 시 `.work-done` 미생성 (P0 핫픽스 fail-closed 동작 보존)
- [x] E. micro-commit `[task-2374] 쿠쿨칸: finish-task.sh .work-done + state.json`

## Phase 2 — `auto_merge.py` `.merged`/`.merge-failed` — 쿠쿨칸(BE)

- [x] A. `merge_pr()` 성공 후 `.merged` 마커 atomic 생성 (`os.rename` + flock)
- [x] B. state.json `phase: "merged"` + `merge_sha` 갱신
- [x] C. retry counter 5회 초과 시 `.merge-failed` + state.json `phase: "merge-failed"` + retry_count
- [x] D. audit log JSONL phase 전이 기록 (`memory/audit/auto-merge.log`은 read-only이므로 새 라인 append만 — 변경 금지 충돌 없음)
- [x] E. micro-commit `[task-2374] 쿠쿨칸: auto_merge.py .merged/.merge-failed`

## Phase 3 — `done-watcher.py` mergedAt 폴링 — 쿠쿨칸(BE)

- [x] A. `scan_work_done_files()` 신규 — `*.work-done` 스캔 (기존 `scan_done_files()` 보존)
- [x] B. `.work-done` 발견 시 GitHub `gh pr view --json mergedAt` 폴링 (60초 간격, 30분 max)
- [x] C. mergedAt != null 확인 시 atomic `.merged` 생성 + state.json 갱신 + `.done` symlink 갱신
- [x] D. 30분 초과 시 `.merge-failed` + state.json `phase: "merge-failed"`
- [x] E. meta task (state.json `merge_required: false`) 분기 — `.work-done` 즉시 `.merged` 동시 생성
- [x] F. micro-commit `[task-2374] 쿠쿨칸: done-watcher.py mergedAt 폴링`

## Phase 4 — `dispatch.py` task frontmatter 파서 — 쿠쿨칸(BE)

- [x] A. `parse_task_metadata()` 신규 — YAML frontmatter `kind`/`merge_required` 추출
- [x] B. legacy task (kind 미명시) → 기본값 `kind: code`, `merge_required: true`
- [x] C. dispatch 시 task.yaml schema validation (kind in {code, meta}, merge_required is bool)
- [x] D. dispatch 시 state.json 사전 생성 (phase: `dispatched`)
- [x] E. micro-commit `[task-2374] 쿠쿨칸: dispatch.py kind/merge_required 파서`

## Phase 5 — 회귀 테스트 + 스펙 문서 — 카마소츠(테스터)

- [x] A. `tests/dev7/test_done_semantics.py` 신규 — 12-cell (3 phase × 4 시나리오)
- [x] B. `tests/dev7/test_meta_task_validator.py` 신규 — kind/merge_required 파싱 검증
- [x] C. `memory/specs/done-semantics-state-schema.md` 신규 — state.json 스키마 문서
- [x] D. `memory/state/.gitkeep` 신규
- [x] E. `memory/specs/bot-capability-model.md` state.json 섹션 추가
- [x] F. micro-commit `[task-2374] 카마소츠: 회귀 테스트 + 스펙 문서`

## 검증

- [x] L1 스모크테스트: finish-task.sh 실행 → .work-done + .done symlink + state.json 생성 확인
- [x] L1: auto_merge dry-run → .merged atomic 생성 확인
- [x] L1: done-watcher 시뮬레이션 → mergedAt 폴링 → .merged 생성
- [x] pytest dev7/test_done_semantics.py PASS
- [x] pytest dev7/test_meta_task_validator.py PASS
- [x] 회귀 0: 기존 dev7 테스트 전체 PASS
- [x] Codex G1 사전 검증 재실행 PASS
- [x] G3 독립 검증 PASS
- [x] 보고서 생성 (memory/reports/task-2374.md)
