# task-2673 — PR_WATCHER_TERMINAL_CALLBACK_FIX_IMPLEMENTATION (Track G)

- Level: Lv.3 (★ fix implementation + regression · live runtime 변경 0 · PR #149 코드와 혼합 0)
- 담당: **dev8 라** (★ 회장 verbatim · task-2670 RCA 작성자 ownership 연속)
- 단일소스: 본 task md + task-2670 RCA packet (★ /home/jay/workspace/.worktrees/task-2670-dev8 추정)
- chair_authorization_id: **`CHAIR-AUTH-PR-WATCHER-TERMINAL-CALLBACK-FIX-20260526-JJONGS-IMPLEMENT-001`** (★ 회장 verbatim 발급 완료)

## 배경

task-2670 RCA packet 완료 (★ AF8C4127 status=ok · 10.7분 · 00:35:08 KST). 회장 verbatim 인정: P0 #1/#2 5-enum CHAIR_REQUIRED 분기 부재 · P0 #3 ANU normal callback registrar 호출 부재 · P1 #4 LOOP_BOUNDARY elapsed-only 우선순위.

## 회장 verbatim 결정 (1:1)

- chair_authorization_id 발급 완료
- executor: dev8 라
- 범위: PR watcher terminal callback fix implementation only

## 수정 목표 6 (회장 verbatim)

1. **fresh unresolved 발생 시 HOLD_FOR_CHAIR 조기 전환** (★ poll #N unresolved 검출 즉시)
2. **terminal_state 5 enum evaluation 보강** (★ MERGE_READY / HOLD_FOR_CHAIR / GEMINI_EXTERNAL_TRIGGER_STALE / CI_FAILED_NON_REMEDIABLE / LOOP_BOUNDARY 분기 명확)
3. **ANU normal callback registrar 호출 보장** (★ terminal state 도달 시 cokacdir --cron 호출 필수)
4. **max_watch_minutes 도달 전 HOLD 조건 보강** (★ LOOP_BOUNDARY로 자연 종결 전 HOLD 우선)
5. **LOOP_BOUNDARY elapsed-only 우선순위 보정** (★ unresolved/fresh evidence 있으면 HOLD 우선)
6. **regression 추가** (★ poll #12 사고 재발 방지 + 5 enum 분기 + callback registrar)

## 허용 9

1. PR watcher 코드 수정 (★ cokacdir watcher.py 또는 신설 watcher 모듈)
2. tests/ regression 추가
3. memory/specs/system_ci_watch_handoff_policy_spec_260523.md 보강 (★ 5 enum + HOLD 조기 전환 doctrine)
4. memory/events/task-2673.* 작성
5. memory/reports/task-2673.md 작성
6. result / done marker
7. ANU normal callback 발사
8. pytest regression 실행
9. commit + push (★ 별도 PR 또는 task/task-2673-dev8 branch)

## 금지 8 (회장 verbatim)

1. PR #149 코드와 혼합 (★ utils/anu_codex_micro_refinement_loop.py · utils/codex_cc_decision_loop.py 변경 0)
2. PR #149 merge
3. auto-merge
4. Axis 1/2/3 runtime 변경
5. live settings.json 변경
6. hooks live 변경
7. dispatch.py 변경
8. HARNESS_ENFORCED 전체 선언

## 완료 상태

성공: **`PR_WATCHER_TERMINAL_CALLBACK_FIX_IMPLEMENTED`**

## 보고 필수 8

1. 수정된 파일 list (★ utils/** 또는 watcher 모듈 path)
2. 6 수정 목표 각각 구현 evidence
3. regression suite 추가 list
4. pytest PASS/FAIL count
5. file overlap 여부 (★ PR #149 코드 0 · task-2662~2672 0)
6. forbidden_action_count (target 0)
7. PR open 여부 (★ 별도 PR 권장)
8. recommended next action (★ PR review + merge 결정 별도 chair signature 강제)

## expected_files

- `utils/pr_watcher_terminal_state_classifier.py` (★ 신설 권장 · 또는 기존 watcher 보강)
- `tests/pr_watcher_terminal_state_classifier/test_*.py` (★ regression)
- `memory/specs/system_ci_watch_handoff_policy_spec_260523_v2.md` (★ 보강)
- `memory/events/task-2673.done`
- `memory/events/task-2673.pr-watcher-fix-implementation-result-260526.json`
- `memory/reports/task-2673.md`

## allowed_resources

```yaml
allowed_resources:
  paths:
    - "utils/pr_watcher_*.py"
    - "tests/pr_watcher_*/**"
    - "memory/specs/system_ci_watch_handoff_*.md"
    - "memory/events/task-2673.*"
    - "memory/reports/task-2673.md"
    - "memory/tasks/task-2673.md"
    - "INDEX.md"
  read_only_reference:
    - "/home/jay/workspace/.worktrees/task-2670-dev8/memory/specs/pr_watcher_terminal_callback_*.md (★ RCA packet)"
    - "/home/jay/workspace/.worktrees/task-2670-dev8/memory/events/task-2670.* (★ RCA result)"
    - "/home/jay/.cokacdir/workspace/29C74592/watcher.py (★ dev7 watcher 결함 코드 · read-only 참조)"
    - "memory/specs/system_ci_watch_handoff_policy_spec_260523.md (★ 기존 doctrine spec)"
  forbidden_paths:
    - "/home/jay/.claude/settings.json"
    - "/home/jay/.claude/hooks/**"
    - "/usr/local/bin/cokacdir"
    - ".github/**"
    - "hooks/**"
    - "dispatch.py"
    - "dispatch/**"
    - "scripts/finish-task.sh"
    - "utils/anu_codex_micro_refinement_loop.py (★ PR #149 코드)"
    - "utils/codex_cc_decision_loop.py (★ PR #149 코드)"
    - "tests/anu_codex_micro_refinement_loop/** (★ PR #149 코드)"
    - "schemas/**"
    - "memory/events/task-2662*"
    - "memory/events/task-2663*"
    - "memory/events/task-2664*"
    - "memory/events/task-2665*"
    - "memory/events/task-2666*"
    - "memory/events/task-2667*"
    - "memory/events/task-2668*"
    - "memory/events/task-2669*"
    - "memory/events/task-2671*"
    - "memory/events/task-2672*"
    - "**/.env*"
    - "**/credentials*"
  commands:
    - "python3 -m py_compile"
    - "python3 -m json.tool"
    - "python3 -m pytest"
    - "python3 -c"
    - "ls"
    - "cat"
    - "stat"
    - "git status"
    - "git log"
    - "git add"
    - "git commit"
    - "git push"
    - "git checkout"
    - "git worktree"
    - "sha256sum"
    - "wc"
    - "printf"
    - "grep"
    - "find"
    - "tail"
    - "head"
    - "cokacdir --cron"
    - "cokacdir --cron-history"
    - "cokacdir --currenttime"
    - "touch"
    - "mkdir"
    - "gh pr create"
  merge_policy: "fix_implementation_separate_pr_no_merge_chair_signature_required"
  ttl_hours: 48
```

## 종결

성공: **`PR_WATCHER_TERMINAL_CALLBACK_FIX_IMPLEMENTED`**

끝
