# task-2691 — FINISH_TASK_LATENCY_REDUCTION_PHASE_1_HELPERS_AND_TASK_MODE (★ 회장 ANU 지시 2026-05-26 · A축 1차 + B축 전체 · Phase 1)

- Level: Lv.3 (★ helper 모듈 3종 신규 + B축 task_mode 표준화 + tests / live infra 변경 0 · scripts/finish-task.sh 미수정)
- 담당: **dev8 라** (★ ANU 추천 · task-2686+1 conflict resolve / scripts/finish-task.sh / dispatch / schemas context 보유)
- 제외: dev1 헤르메스 (★ task-2690 watcher) / dev2 오딘 (★ task-2688 done) / dev3 다그다 (★ task-2689 watcher) / dev4/dev5 (★ self-key 사고)
- chair_authorization_id: **`CHAIR-AUTH-FINISH-TASK-LATENCY-PHASE-1-20260526-JJONGS-IMPLEMENT-001`** (★ ANU 추천 표준 패턴 · 회장 ANU 지시 모드 추인 대기)
- 완료 상태: **`FINISH_TASK_LATENCY_REDUCTION_PHASE_1_HELPERS_TASK_MODE_IMPLEMENTED`**

## 배경

회장 ANU 지시 verbatim 2026-05-26: "finish-task 지연 개선은 2축으로 진행하라. A축: 실제 병목 계측/단축 / B축: 작업 유형별 종료 프로파일 분리. 1차로 timing 로그 + main preflight + task_mode 종료 프로파일 분리."

★ Phase 분리 (★ ANU 결정 · 회장 ANU 지시 모드):
- **Phase 1 (본 task-2691)**: helper 신규 모듈 + B축 전체 + scripts/finish-task.sh 미수정 (★ PR #152 conflict 회피)
- **Phase 2 (task-2691+1 · PR #152 머지 후)**: scripts/finish-task.sh hook 추가 + 실제 timing 기록 시작

## 회장 verbatim A축 (1차 Phase 1 scope)

### A1. timing helper 모듈 신규 (★ scripts 미수정)

- 신규: `utils/finish_task_timing_logger.py`
- 함수: `record_stage_elapsed(stage_name, elapsed_sec, task_id, team_id)` → `memory/logs/finish-task-timing.jsonl` append
- JSONL schema:
  ```json
  {"ts": "...", "task_id": "...", "team_id": "...", "stage": "...", "elapsed_sec": ...}
  ```
- 필수 구간 18개 (회장 verbatim · helper 가 enum 검증):
  - qc_verify / scope_guard / worktree_manager_finish / gh_pr_check / git_gate / impact_scanner / ci_preflight / bg_cleanup / g3_verifier / g4_gemini_gate / lv4_audit / codex_gate / unresolved_gate / goal_assertions / task_timer_end / token_tracker / notify_completion / extract_followup

### A2. main conflict preflight helper 신규 (★ scripts 미수정)

- 신규: `utils/main_conflict_preflight.py`
- 함수: `check_conflict_likelihood(worktree_path, expected_files) → (decision, evidence)` where decision ∈ {`SAFE`, `LIKELY_CONFLICT`, `ABORT_FETCH_RETRY`}
- 로직:
  1. `git fetch origin main --prune`
  2. `git diff origin/main --name-only` 와 expected_files 교집합
  3. 교집합 > 0 → `LIKELY_CONFLICT` (★ Option B conflict task 분리 권고)
- preflight 4-step 통합 (★ 회장 박제 강화 적용)

## 회장 verbatim B축 전체 (1차 Phase 1 scope)

### B1. task_mode 표준화 모듈 신규

- 신규: `utils/task_mode_classifier.py`
- enum 6: `code` / `docs_only` / `read_only_watcher` / `diagnosis` / `callback_only` / `closeout_marker_only`
- 함수: `classify_task_mode(task_md_path) → mode_enum`
- 분류 로직: task md 의 `Level` 라인 + frozen anchors + allowed_resources 분석

### B2~3. PASS evidence 분리

- `read_only_watcher` / `diagnosis` / `callback_only`: commit 0 / diff 0 / PR 0 → PASS evidence
- `code`: commit 0 → FAIL (★ 기존 유지)
- 분기 모듈에서 task_mode 분류기 import → 단일 source

### B4. QC git_evidence + finish-task git gate 동일 모듈 사용

- `utils/qc_verify.py` 에서 `task_mode_classifier.classify_task_mode()` 호출
- finish-task.sh 의 git gate 도 동일 모듈 호출 (★ Phase 2 hook · 본 Phase 1 은 helper 만)

### B5. task-2689 재현 fixture

- 신규: `tests/regression/task_mode_classifier/test_read_only_watcher_pass.py`
- read-only watcher + commit 0 = PASS / commit 있음 = FAIL 2 시나리오

### B6. 사후 task md 수정 패턴 금지

- 분류 모듈에 task md sha256 immutability 검증 추가
- task md 변경 detection 시 `TASK_MD_POST_DISPATCH_MUTATION_FORBIDDEN` 분류

## 회장 verbatim 금지 (★ Critical 7 제외 모두 ANU 권한 위임)

- scripts/finish-task.sh 변경 0 (★ PR #152 conflict 회피 · Phase 2 위임)
- dispatch/__init__.py 변경 0 (★ PR #151/#152 conflict 회피)
- dispatch/normal_fallback_callback_helper.py 변경 0
- dispatch/prompt.py 변경 0
- schemas/anu_normal_callback_envelope_v1.json 변경 0
- utils/callback_* 변경 0 (★ PR #151 영역)
- utils/anu_codex_micro_refinement_loop.py 변경 0 (★ PR #149)
- utils/pr_watcher_terminal_state_classifier.py 변경 0 (★ PR #150)
- PR merge / auto-merge / live settings.json / hooks live / dispatch.py 변경 / Axis runtime / HARNESS_ENFORCED / policy 승격 / BLOCK 확대 0

## 회장 verbatim A축 후속 (Phase 2+ · 별도 task)

- A1 scripts/finish-task.sh hook 추가 (★ Phase 2 = task-2691+1 · PR #152 머지 후)
- A2 finish 진입 전 preflight 호출 (★ Phase 2)
- A3 pytest 병렬화 unit/regression subset 만 (★ 별도 task)
- A4 L1 smoketest fail loop marker (★ 별도 task)
- A5 same_fail threshold 3 유지 + verifier 통계 분리 (★ 데이터 누적 후)
- A6 Gemini timeout 0 단계별 제한 (★ 별도 task)

## 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)"
    - "memory/logs/finish-task-timing.jsonl (★ 신규 데이터 path)"
    - "memory/logs/.gitkeep"
    - "tests/regression/task_mode_classifier/**"
    - "tests/regression/main_conflict_preflight/**"
    - "tests/regression/finish_task_timing_logger/**"
    - "memory/events/task-2691.*"
    - "memory/reports/task-2691.md"
    - "memory/tasks/task-2691.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 위임)"
    - "dispatch/__init__.py (★ PR #151/152 영역)"
    - "dispatch/normal_fallback_callback_helper.py (★ PR #151/152)"
    - "dispatch/prompt.py (★ PR #152)"
    - "schemas/anu_normal_callback_envelope_v1.json (★ PR #152)"
    - "utils/callback_authority_4source_validator.py (★ PR #151)"
    - "utils/anu_callback_registrar.py (★ PR #151)"
    - "utils/callback_collector_helper_integration.py (★ PR #151)"
    - "utils/anu_codex_micro_refinement_loop.py (★ PR #149)"
    - "utils/pr_watcher_terminal_state_classifier.py (★ PR #150 머지)"
  commands:
    - "git log / git diff / git show / git add / git commit / git push / git worktree / git fetch"
    - "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 --currenttime"
    - "cokacdir --cron-history"
  merge_policy: "phase_1_helpers_pr_create_no_merge_no_auto"
  ttl_hours: 12
```

## 완료 8 보고 필드

1. utils/finish_task_timing_logger.py 신규 + helper 6 unit test
2. utils/main_conflict_preflight.py 신규 + 4-step preflight 통합 + 회귀 fixture
3. utils/task_mode_classifier.py 신규 + 6 enum + classify fixture
4. utils/qc_verify.py task_mode import 통합 (★ minimal · 라인 수 명시)
5. tests/regression/task_mode_classifier/test_read_only_watcher_pass.py 신규 (★ task-2689 재현)
6. memory/logs/finish-task-timing.jsonl schema 정의
7. forbidden paths (★ scripts/finish-task.sh + dispatch/* + schemas) 변경 0 evidence
8. PR 생성 + chair-facing session dogfood (★ envelope 3 SID 일치)

## expected_files (~10)

- `utils/finish_task_timing_logger.py` 신규
- `utils/main_conflict_preflight.py` 신규
- `utils/task_mode_classifier.py` 신규
- `utils/qc_verify.py` (★ task_mode import minimal)
- `memory/logs/finish-task-timing.jsonl` (★ schema · empty initial)
- `memory/logs/.gitkeep`
- `tests/regression/task_mode_classifier/*.py` (★ 3 file)
- `tests/regression/main_conflict_preflight/*.py` (★ 2 file)
- `tests/regression/finish_task_timing_logger/*.py` (★ 2 file)
- `memory/events/task-2691.finish-task-latency-phase-1-result-260526.json`
- `memory/events/task-2691.done`
- `memory/reports/task-2691.md`

## ANU normal callback (★ self-key 금지 + session propagation 적용)

- envelope: `memory/events/anu_callback/task-2691-normal-completion.json`
- owner key: ANU `c119085addb0f8b7`
- ★ cokacdir --cron --session `53e89540-5bed-4692-a726-ed857820758a` 강제
- envelope ≤ 3900 bytes
- absolute fire timestamp: now+30s
- envelope 3 field: chair_facing_session_id / collector_session_id / delivery_session_id
- 회장 verbatim 강화: "Critical 7 없으면 chair 보고 없이 결과 envelope만 발송" → envelope 자체는 ANU 본 세션 inbound 도착 + Critical 7 발견 시에만 chair 보고

## frozen anchors

- ANCHOR-1: "Phase 1 = helpers + B축 + scripts/finish-task.sh 미수정 (★ PR #152 conflict 회피)"
- ANCHOR-2: "Phase 2 = scripts/finish-task.sh hook 추가 (★ task-2691+1 · PR #152 머지 후)"
- ANCHOR-3: "task_mode 6 enum 단일 source (★ utils/task_mode_classifier.py)"
- ANCHOR-4: "main_conflict_preflight = 회장 박제 강화 4-step (★ fetch + ls-remote + rev-parse + gh api)"
- ANCHOR-5: "Critical 7 없으면 chair 보고 없이 envelope only"
- ANCHOR-6: "PR #149 / PR #151 / PR #152 / PR #150 영역 변경 0"

## 종결

성공: **`FINISH_TASK_LATENCY_REDUCTION_PHASE_1_HELPERS_TASK_MODE_IMPLEMENTED`**

★ Critical 7 발견 시에만 chair 보고. 그 외 결과 envelope only.

끝