# task-2691+a — FINISH_TASK_LATENCY_PHASE_1_FRESH_RETRY (★ 회장 verbatim 2026-05-26 PR #153 close 후 fresh 재시도 발의)

- Level: Lv.3 (★ helper 모듈 3종 신규 + B축 task_mode 표준화 + tests / live infra 변경 0 · scripts/finish-task.sh 미수정)
- 담당: **dev6 페룬** (★ 회장 verbatim 2026-05-26 확정 · 대안 dev7 이참나)
- 제외: dev1 헤르메스 (★ task-2690 watcher) / dev2 오딘 (★ task-2688 done) / dev3 다그다 (★ task-2689 watcher) / dev4/dev5 (★ self-key 사고) / dev8 라 (★ PR #153 scope leak 사고)
- chair_authorization_id: **`CHAIR-AUTH-FINISH-TASK-LATENCY-PHASE-1-FRESH-RETRY-20260526-JJONGS-IMPLEMENT-002`** (★ 회장 verbatim 2026-05-26 발급 확정)
- 완료 상태: **`FINISH_TASK_LATENCY_PHASE_1_FRESH_RETRY_COMPLETED`** (★ 회장 verbatim 2026-05-26 확정)

## 배경

task-2691 (PR #153) 사고 회장 verbatim 결정 Option A 진행:
- PR #153 CLOSED (★ preserve · 2026-05-26 15:53:57 KST)
- 사고 8건 (scope leak 26 + overlap 2 + Phase 1 금지 위반 + DIRTY + CONFLICTING + callback NOT_REGISTERED + dogfood 실패)
- preserve marker: `memory/events/pr-153-closed-preserved-scope-leak-and-callback-failure-260526.json`

회장 verbatim 2026-05-26: "task-2691+a를 새로 발의하라. PR #153을 재사용하지 말고 fresh origin/main 기준 별도 worktree에서 시작한다."

## 회장 verbatim 범위 7 (★ 본 task-2691 과 동일)

1. `utils/finish_task_timing_logger.py` 신규 (★ 18 stage enum · JSONL append)
2. `utils/main_conflict_preflight.py` 신규 (★ 4-step + 3-decision)
3. `utils/task_mode_classifier.py` 신규 (★ 6 enum)
4. `read_only_watcher / diagnosis / callback_only / closeout_marker_only` 종료 profile
5. QC git_evidence + finish-task git gate 공통 task_mode classifier 사용 준비
6. task-2689 fixture (★ read-only watcher commit 0 PASS / commit 있음 FAIL)
7. task md 사후 수정 QC 통과 금지 fixture

## 회장 verbatim 금지 9 (★ PR #153 사고 박제)

1. `scripts/finish-task.sh` 수정 0 (★ Phase 2 위임)
2. `dispatch/__init__.py` 수정 0 (★ PR #151/#152 영역)
3. PR #152 파일과 overlap 0
4. PR #149 파일과 overlap 0
5. PR #151 파일과 overlap 0
6. `memory/plans/tasks/task-2568/2569` 계열 유입 0 (★ PR #153 scope leak 핵심)
7. cleanup scripts (cleanup-stale-tasks.sh / cleanup-workspace.py / file_cleanup.py / task_scope.py) 유입 0
8. git hooks (scripts/git-hooks/pre-push / scripts/pre_push_guard.py) 유입 0
9. expected_files 밖 수정 0 (★ scope-diff.txt 와 git diff 일치 검증 의무)

## 회장 verbatim 추가 preflight (★ PR #153 사고 박제)

1. **dispatch 전 main workspace dirty 상태 vs worktree dirty 상태 분리 확인 의무**
2. **main workspace dirty 파일을 새 worktree 로 끌고 오지 말 것** (★ PR #153 사고 root cause)
3. **expected_files 와 실제 diff 가 다르면 즉시 HOLD_FOR_CHAIR**
4. fresh origin/main `319170b9` 기준 별도 worktree 생성 (★ git worktree add -b task/task-2691+a-<bot>)
5. worktree 생성 직후 `git status --short` → 빈 결과 확인 의무

## 회장 verbatim callback 조건 강화 (★ NORMAL_CALLBACK_NOT_REGISTERED 재발 방지)

★ "normal callback 은 envelope 작성만으로 PASS 가 아니다."

**4-source 검증 의무**:
1. **cron 등록** (★ `cokacdir --cron --key c119085addb0f8b7 --session 53e89540-... --at <T>` 실제 호출 후 schedule_id 회수)
2. **schedule_history** 흔적 (★ `<schedule_id>.log` 생성 + status=ok)
3. **ANU key** (★ owner_key_verifier sha256 = ANU key 계산값 일치)
4. **chair-facing session id** (★ envelope 3 SID 53e89540 일치)

★ 4-source 1건이라도 부재 시 callback FAIL · finish-task.sh 종료 단계에서 fail-fast 의무

## allowed_resources

```yaml
allowed_resources:
  paths:
    - "utils/finish_task_timing_logger.py"
    - "utils/main_conflict_preflight.py"
    - "utils/task_mode_classifier.py"
    - "utils/qc_verify.py (★ task_mode import 만 minimal · PR #153 사고 보강: 라인 수 5 미만)"
    - "memory/logs/finish-task-timing.jsonl (★ schema · 초기 empty)"
    - "memory/logs/.gitkeep"
    - "tests/regression/task_mode_classifier/**"
    - "tests/regression/main_conflict_preflight/**"
    - "tests/regression/finish_task_timing_logger/**"
    - "memory/events/task-2691+a.*"
    - "memory/reports/task-2691+a.md"
    - "memory/tasks/task-2691+a.md"
    - "INDEX.md"
  forbidden_paths:
    - "/home/jay/.claude/**"
    - "/usr/local/bin/cokacdir"
    - ".github/**"
    - "**/.env*"
    - "**/credentials*"
    - "settings.json"
    - "hooks/**"
    - "dispatch.py"
    - "Axis/**"
    - "scripts/finish-task.sh (★ Phase 2 위임)"
    - "scripts/cleanup-stale-tasks.sh (★ PR #153 scope leak)"
    - "scripts/cleanup-workspace.py (★ PR #153 scope leak)"
    - "scripts/file_cleanup.py (★ PR #153 scope leak)"
    - "scripts/task_scope.py (★ PR #153 scope leak)"
    - "scripts/git-hooks/** (★ PR #153 scope leak)"
    - "scripts/pre_push_guard.py (★ PR #153 scope leak)"
    - "memory/plans/tasks/task-2568/** (★ PR #153 scope leak)"
    - "memory/plans/tasks/task-2569/** (★ PR #153 scope leak)"
    - "memory/reports/task-2568.md (★ PR #153 scope leak)"
    - "memory/reports/task-2569.md (★ PR #153 scope leak)"
    - "memory/reports/task-2569+1.md (★ PR #153 scope leak)"
    - "memory/specs/protection-list.json (★ PR #153 scope leak)"
    - "memory/specs/protection-list.md (★ PR #153 scope leak)"
    - "memory/task-timer.py (★ PR #153 scope leak)"
    - "memory/tasks/task-2569.md (★ PR #153 scope leak)"
    - "tests/regression/test_cleanup_workspace_protection_2569.py (★ PR #153)"
    - "tests/regression/test_dispatch_smoke_2569_plus_1.py (★ PR #153)"
    - "tests/regression/test_finish_task_stash_lifecycle_2569.py (★ PR #153)"
    - "tests/regression/test_scope_guard_lock_sha_2569.py (★ PR #153)"
    - "tests/regression/test_task_md_preservation_2569.py (★ PR #153)"
    - "dispatch/__init__.py (★ PR #151/152 영역 + PR #153 overlap)"
    - "dispatch/normal_fallback_callback_helper.py"
    - "dispatch/prompt.py"
    - "schemas/anu_normal_callback_envelope_v1.json"
    - "utils/callback_authority_4source_validator.py"
    - "utils/anu_callback_registrar.py"
    - "utils/callback_collector_helper_integration.py"
    - "utils/anu_codex_micro_refinement_loop.py"
    - "utils/pr_watcher_terminal_state_classifier.py"
  commands:
    - "git log / git diff / git show / git add / git commit / git push / git worktree / git fetch / git status"
    - "python3 -m pytest"
    - "python3 -c"
    - "python3 -m json.tool"
    - "gh pr view / gh api / gh pr create"
    - "ls / cat / wc / grep / find / tail / head / printf / sha256sum"
    - "cokacdir --cron / cokacdir --cron-list / cokacdir --currenttime / cokacdir --cron-history"
  merge_policy: "phase_1_fresh_retry_pr_create_no_merge_no_auto"
  ttl_hours: 12
```

## 완료 10 보고 필드 (★ PR #153 사고 박제 후 강화)

1. fresh worktree 생성 evidence (★ git worktree add + base sha 319170b9)
2. worktree 생성 직후 `git status --short` 빈 결과 evidence (★ main workspace dirty 끌어옴 0)
3. utils/finish_task_timing_logger.py + main_conflict_preflight.py + task_mode_classifier.py 신규 (★ 3 helper unit test)
4. utils/qc_verify.py minimal import (★ 라인 수 명시 · 5 미만)
5. tests/regression/task_mode_classifier/test_read_only_watcher_pass.py (★ task-2689 재현)
6. memory/logs/finish-task-timing.jsonl schema 정의
7. scope-diff.txt 와 실제 git diff 일치 evidence (★ ★ ★ 강화 검증)
8. forbidden paths 변경 0 evidence (★ 32 forbidden path 모두 0)
9. PR 생성 (★ changedFiles ≤ expected_files count)
10. ANU normal callback **4-source 검증** PASS (★ cron 등록 + schedule_history + ANU key + chair_facing_sid 모두)

## expected_files (~12)

- `utils/finish_task_timing_logger.py` 신규
- `utils/main_conflict_preflight.py` 신규
- `utils/task_mode_classifier.py` 신규
- `utils/qc_verify.py` (★ minimal · ≤5 lines)
- `memory/logs/finish-task-timing.jsonl` (★ schema · empty initial)
- `memory/logs/.gitkeep`
- `tests/regression/task_mode_classifier/__init__.py` + 3 test file
- `tests/regression/main_conflict_preflight/__init__.py` + 2 test file
- `tests/regression/finish_task_timing_logger/__init__.py` + 2 test file
- `memory/events/task-2691+a.finish-task-latency-phase-1-fresh-retry-result-260526.json`
- `memory/events/task-2691+a.done`
- `memory/reports/task-2691+a.md`

## ANU normal callback (★ 4-source 검증 강제)

- envelope: `memory/events/anu_callback/task-2691+a-normal-completion.json`
- owner key: ANU `c119085addb0f8b7` (★ self-key 금지)
- **★ cokacdir --cron --session `53e89540-5bed-4692-a726-ed857820758a` 강제 호출** (★ 단순 envelope 작성으로 끝나지 말 것)
- envelope ≤ 3900 bytes
- absolute fire timestamp: now+30s
- envelope 3 field: chair_facing_session_id / collector_session_id / delivery_session_id
- **4-source 검증 evidence 포함**: schedule_id / schedule_history snippet / owner_key_verifier / chair_facing_sid 4 모두 명기

## frozen anchors

- ANCHOR-1: "fresh origin/main 319170b9 기준 별도 worktree (★ PR #153 재사용 0)"
- ANCHOR-2: "main workspace dirty file 끌어오지 말 것 (★ PR #153 사고 root cause 박제)"
- ANCHOR-3: "scope-diff.txt 와 실제 git diff 일치 검증 의무"
- ANCHOR-4: "expected_files 밖 1 file 도 0 (★ 32 forbidden path)"
- ANCHOR-5: "callback 4-source 검증 (★ cron 등록 + schedule_history + ANU key + chair_facing_sid)"
- ANCHOR-6: "scripts/finish-task.sh 미수정 (★ Phase 2 위임)"

## 종결

성공: **`FINISH_TASK_LATENCY_PHASE_1_FRESH_RETRY_COMPLETED`**

★ 회장 verbatim 2026-05-26 dispatch 발사 승인 도착.

끝