# task-2550+1 checklist

## Phase A — Bootstrap (3단계)

- [x] 1. cokacdir 환경 확인 + dev5 git fetch
- [x] 2. `.worktrees/task-2550plus1-dev5` worktree 생성 (origin/main bf59e7d2 기준)
- [x] 3. PR #100 head 4067d8c4 baseline 4 file 추출 (`/tmp/pr100-baseline/`)

## Phase B — Implementation (4단계)

- [x] 4. Gemini 6 unresolved triage → `memory/events/task-2550+1.gemini_triage_decision.json`
- [x] 5. HIGH `_matches_task_id_strict` 두 단 게이트 구현
  - [x] regex 경계 ``(?:^|[^A-Za-z0-9+])task-{num}(?:$|[^A-Za-z0-9+])``
  - [x] `_extract_task_id_str(headRef) == task_id` 동등 비교
  - [x] check_safety_2_pr_merged 적용
- [x] 6. medium 4 fix
  - [x] MED-1: `hashlib.sha256(path)[:8]` 결정론 hash
  - [x] MED-2: lsof +D AND 게이트 (pgrep + lsof 두 단)
  - [x] MED-3: `is_safe_ignoring_apply` helper + post_merge_smoke_runner 적용
  - [x] MED-4: duplicate dedupe (MED-3 와 통합)
- [x] 7. boundary + concurrency test 추가
  - [x] task-25 vs task-2550
  - [x] task-2500 vs task-25
  - [x] task-250 vs task-2500
  - [x] task-2550 vs task-2550+1 (replacement chain 분리)
  - [x] PYTHONHASHSEED 결정론 sha256 회귀
  - [x] safety_5 lsof match / no match / unknown rc / short-circuit

## Phase C — Verification (5단계)

- [x] 8. pytest anu_v2 회귀 PASS (432 baseline + 31 신규 = 463)
- [x] 9. pyright 0 errors (4 changed files)
- [x] 10. effective diff == 11 expected_files
  - [x] code 2: worktree_cleanup.py / post_merge_smoke_runner.py
  - [x] tests 2: test_worktree_cleanup_2550plus1.py / test_post_merge_smoke_worktree_2550plus1.py
  - [x] events 3: dispatch-decision.json / replacement-lineage.json / gemini_triage_decision.json
  - [x] plans 3: plan.md / context-notes.md / checklist.md
  - [x] report 1: memory/reports/task-2550+1.md
- [ ] 11. forbidden path 0 (PR 생성 직전 최종 검증)
- [ ] 12. PR 생성 (BOT identity, base=main)

## Phase D — Finalize (6단계)

- [ ] 13. Gemini fresh review (capability auto-invocation 가능)
- [ ] 14. unresolved 0 어셀션
- [ ] 15. CI 11/11 SUCCESS
- [ ] 16. mergeStateStatus CLEAN
- [ ] 17. BOT squash merge
- [ ] 18. smoke/reconcile evidence + lifecycle markers + 보고서 + **PR #100 head 4067d8c4 unchanged 어셀션**

## 완료 기준 12건 (회장 §명시)

- [ ] 1. task-2550+1 PR merged
- [ ] 2. mergedBy = `app/jeon-jonghyuk-taskctl-bot`
- [x] 3. HIGH task_id 부분 일치 제거 (strict + boundary test PASS)
- [x] 4. medium 4 반영
- [x] 5. effective diff == corrected expected_files (11)
- [ ] 6. forbidden path 0 (PR 생성 후 최종 박제)
- [ ] 7. CI all SUCCESS
- [ ] 8. Gemini unresolved 0
- [ ] 9. smoke/reconcile evidence 존재
- [ ] 10. PR #100 original head 4067d8c4 unchanged
- [x] 11. operational defect STATE_FILE_MISSING 별도 follow-up 분리 명시
- [ ] 12. 신규 Critical 7 없음

## 금지 18 어셀션

- [x] PR #100 commit/push/merge/close/reopen 0
- [x] force/rebase/empty commit 0
- [ ] bot /gemini review 0 (PR 생성 후 박제)
- [ ] owner PAT live 0 (capability runner OWNER_GEMINI_TRIGGER_TOKEN 만)
- [ ] GH_TOKEN fallback 0
- [x] md/report 만 PASS 0 (모든 code change 회귀 PASS 검증 완료)
- [x] 다른 PR 혼입 0
- [x] 자동 task-2550+2 chain 발행 0
- [x] worktree 격리 (`.worktrees/task-2550plus1-dev5`)
- [ ] 회장 수동 /gemini review 0
- [x] .worktrees 실제 삭제 0 (dry-run only — apply=False default + 6대 safety)
- [x] long polling 0 (polling_policy 상수 강제)
