# task-2494 보고서 (Phase 0 stuck/zombie detection hardening spec 문서화)

- 팀: dev6-team (페룬 팀장 + 스바로그 백엔드)
- 일시: 2026-05-08
- 작업 레벨: Lv.1 (문서화 / 스펙 보강 — 코드 변경 0)
- 검증 레벨: normal
- task 본질: task-2487 incident를 기준으로 stuck/zombie detection Phase 0 설계를 완성. 문서화/스펙 보강만 허용. 실제 detector 구현 금지.

---

## 1. SCQA 요약

### Situation
오딘(dev2-team) task-2487에서 PR #49/#50/#51 발행 후 1시간 동안 후속 lifecycle marker (merged / .done / .followup / .escalate / BLOCKED 보고 / timer 종료) 0건 발생. 봇 idle 지속, 회장 강제 stop. 아누 최초 진단은 '정상 머지 대기'로 오판하였고 회장 stop 후 stuck로 재분류함. 시스템 차원에서 STUCK_AFTER_PR_OPEN을 자동 분류할 수 있는 detection layer가 부재함이 노출됨.

### Complication
- 동일 시점 task-2485+1(헤르메스, dev1-team) 사례에서는 verifier 자체 결함(`browser_verify.py` `TASK_ID_PATTERN`이 `+` 미지원)으로 ESCALATE되었으나 본질은 PASS. ESSENCE_PASS / ESCALATED_VERIFIER_LIMITATION으로 별도 분류됨.
- 두 incident type을 혼동하면 자동화 분류 룰이 잘못 학습됨 → 회장 명시 (2026-05-08T04:10): incident type 별도 구분 필수.
- Phase 0 = 문서화/감사 범위로 유지. 즉시 production 통합 X. (회장 명시 §9.4 #5)

### Question
PR open 이후 stuck/zombie 상태를 안전하게 감지·자동 분류하기 위한 (1) detection condition, (2) auto handling policy, (3) forbidden actions, (4) evidence preservation, (5) redelegation, (6) critical chain isolation, (7) implementation candidates를 어떻게 명세할 것인가? 그리고 ESCALATED_VERIFIER_LIMITATION과의 detection signal을 어떻게 분리할 것인가?

### Answer
회장 명시 10개 섹션을 모두 만족하는 `memory/orchestration/task-2494-phase0-stuck-zombie-detection.md` (28,603 bytes / 39 sub-section)을 신규 작성하고, 기존 후보 spec(`memory/events/task-2494-candidate.stuck-detection-spec`)에 phase0 산출물 경로 등 6개 신규 키를 append-only로 보강, `memory/orchestration/phase_b_integration_items_260507.md` §9.4#5와 §9.6에 산출물 경로를 append-only로 추가함. 코드/테스트/PR/branch 변경 0건. 후속 detector 구현 task는 5가지 선행 조건 충족 + 회장 승인 후에만 발행 가능하며, 본 spec 자체는 어떠한 자동 dispatch도 트리거하지 않음.

---

## 2. 회장 명시 5항목 보고 (필수)

| 항목 | 값 |
|---|---|
| 보강한 문서 경로 | (1) `memory/orchestration/task-2494-phase0-stuck-zombie-detection.md` (신규, 28,603 bytes) <br> (2) `memory/events/task-2494-candidate.stuck-detection-spec` (보강, 신규 키 6건 append) <br> (3) `memory/orchestration/phase_b_integration_items_260507.md` (보강, §9.4#5/§9.6에 한 줄씩 append) |
| 추가한 detection condition 수 | **신규 7건** (기존 5건 → 총 12건). 신규: auto_merge_workflow_absent / gemini_review_actor_unresolved / merge_queue_not_used / branch_protection_thread_resolution_active / bot_last_activity_stale / dispatch_lock_not_released / regression_in_review_thread |
| 추가한 forbidden action 수 | **신규 8건** (기존 4건 → 총 12건). 신규: PR force merge 금지 / branch protection ruleset 우회 금지 / 봇 임의 review thread resolve 금지 / .escalate 없이 .followup만 생성 금지 / stuck 시 `task-timer end --reason done` 금지 / 다른 task의 marker 파일 수정 금지 / cross-team session 하이재킹 금지 / critical chain task 자동 stop 금지 |
| 구현 후보 위치 | (1) `scripts/stuck_detector.py` 신규 (done-watcher.py 패턴 차용, 1순위) <br> (2) `scripts/zombie-watcher.py` 신규 (zombie threshold 분리) <br> (3) `dispatch.py` 통합 (자동 분류기 §2.1 분기 확장) <br> (4) `task-timer.py end --reason stuck_after_pr_open` 옵션 추가 <br> (5) Dashboard 종료 분류 보드 §2.6에 STUCK_AFTER_PR_OPEN 섹션 추가 |
| 후속 구현 task 필요 여부 | **Yes**. 단, 발행 선행 조건 5건 모두 충족 + 회장 명시 승인 시에만: <br> ① task-2485+1 (PR #47) 머지 완료 — ✅ 이미 머지됨 <br> ② task-2487+1 (회귀 픽스) 완료 — ⏳ 미완료 <br> ③ PR #49/#50/#51 순차 머지 완료 — ⏳ 미완료 <br> ④ critical chain 안정화 — ⏳ 미완료 <br> ⑤ 회장 명시 승인 — ⏳ 미완료 |

---

## 3. 회장 명시 7 공통 완료 조건 자체 점검

| 조건 | 상태 | 근거 |
|---|---|---|
| 코드 변경 0건 | ✅ | `find . -name "*.py" -newermt "2026-05-08 08:00:00"` 결과: dev6 작업 파일 0건. (`.worktrees/task-2487+1-dev2/*` 변경은 병렬 dev2팀 작업이며 본 작업 외부) |
| 테스트 변경 0건 | ✅ | `find tests -newermt "2026-05-08 08:00:00"` 결과: 0건 |
| PR 변경 0건 | ✅ | `gh pr` 호출 일체 없음 |
| branch 변경 0건 | ✅ | git checkout/branch/push/rebase 없음 |
| 오딘 task-2487+1 비개입 | ✅ | `memory/events/task-2487+1*` 읽기/수정 0건. 본 spec 내 task-2487+1 텍스트 인용은 narrative reference이며 file access 아님. dev2 worktree 미접촉. |
| 산출물 문서 경로 제출 | ✅ | 위 §2 표 참조 |
| 후속 작업 제안은 가능하나 실행 금지 | ✅ | §10 Implementation Candidates에 후보만 기재, 실제 dispatch 트리거 0건. premature_dispatch_forbidden=true 명시. |

---

## 4. 회장 명시 17 공통 금지 (task-2495와 동일) 자체 점검

| 금지 항목 | 상태 |
|---|---|
| any_code_modification | ✅ 0건 |
| any_test_modification | ✅ 0건 |
| any_pr_modification | ✅ 0건 |
| any_branch_modification | ✅ 0건 |
| detector_implementation | ✅ 의사코드만 사용, 실제 실행 가능한 스크립트 0건 |
| update_branch_execution | ✅ 미수행 |
| force_push | ✅ 미수행 |
| rebase | ✅ 미수행 |
| admin_override | ✅ 미수행 |
| required_ci_bypass | ✅ 미수행 |
| manual_done_creation | ✅ 미수행 (finish-task.sh 단독 경로) |
| task_2487+1_interference | ✅ 미수행 (forbidden_paths 준수) |
| odin_session_interference | ✅ 미수행 |
| `.secrets/**` 수정 | ✅ 미수행 |
| `.github/workflows/**` 수정 | ✅ 미수행 |
| `**/*.py` `**/*.yml` `**/*.yaml` 수정 | ✅ 미수행 |
| `scripts/**` `tests/**` 수정 | ✅ 미수행 |

---

## 5. 산출물 구조 검증

### 5.1 메인 산출물 §1~§10 섹션 헤더 확인

```
1:# task-2494 Phase 0 — Stuck/Zombie Detection Hardening Spec
13:## §1 Incident Summary
53:## §2 Problem Definition
92:## §3 Absent Signals
113:## §4 Detection Conditions
161:## §5 Auto Handling Policy
238:## §6 Forbidden Actions
266:## §7 Evidence Preservation Policy
329:## §8 Redelegation Policy
383:## §9 Critical Chain Isolation Rule
436:## §10 Implementation Candidates
514:## 부록 A. 관련 문서 경로
525:## 부록 B. 본 task 준수 선언
```

→ 회장 명시 10개 섹션 모두 정상 작성 (39 sub-section).

### 5.2 후보 spec append-only 보강 (스키마)

기존 13개 키(L1~L57) 보존. 신규 6개 키(L58~L65) append:
- phase0_spec_path
- phase0_completed_at
- detection_conditions_added
- forbidden_actions_added
- incident_type_separation (STUCK_AFTER_PR_OPEN / ESCALATED_VERIFIER_LIMITATION 매핑)

### 5.3 phase_b_integration_items 보강 (append-only)

- L264: §9.4 #5 끝에 Phase 0 spec 산출물 경로 추가 (한 줄)
- L284: §9.6 표 아래에 Phase 0 spec 산출물 경로 추가 (한 줄)

기존 본문 변경 0.

---

## 6. 두 incident type 분리 (회장 명시 2026-05-08T04:10 준수)

| incident type | 트리거 사례 | 본 spec scope | 처리 문서 |
|---|---|---|---|
| STUCK_AFTER_PR_OPEN | task-2487 (오딘) — PR 발행 후 1시간 무반응, 회장 강제 stop | ✅ 본 task scope | `memory/orchestration/task-2494-phase0-stuck-zombie-detection.md` (본 산출물) |
| ESCALATED_VERIFIER_LIMITATION | task-2485+1 (헤르메스) — verifier 자체 결함, 본질 PASS | ❌ 본 task scope 외 | `memory/feedback/feedback_escalated_verifier_limitation_classification_260508.md` (별도) |

자동화 분류 룰 detection signal 분리:
- STUCK_AFTER_PR_OPEN: 봇 idle + lifecycle marker 부재 + PR open + CI 완료
- ESCALATED_VERIFIER_LIMITATION: PR 머지 완료 + 본질 합격 조건 100% PASS + verifier `.escalate` 마커 존재

---

## 7. 발견 이슈 및 해결

| 이슈 | 처리 |
|---|---|
| `task-timer.py status` 호출 시 `--task` 플래그가 잘못된 형식이라는 에러 발생 | 도움말 확인 후 `python3 memory/task-timer.py status task-2494` 형식으로 정정 호출 → 정상. 본 task 구현 외 이슈이므로 별도 보고서 없이 내부 해결. |
| 후보 spec JSON에 신규 키 추가 시 기존 키 손상 위험 | append-only 패턴 (마지막 `}` 직전에 콤마 + 새 키 추가)로 처리. 검증: Read로 1~66줄 전체 재확인, 기존 13개 키 모두 동일한 위치/값 보존 확인. |
| `phase_b_integration_items_260507.md`에 Phase 0 spec 경로 두 곳 추가 시 mid-file edit 안전성 | 회장 명시 9.4#5 끝부분과 9.6 표 직후 (lines 264 / 284)에 한 줄씩 append-only로 삽입. 기존 텍스트 변경 0. grep 검증 통과. |

미해결 이슈: 0건.

---

## 7.5. ★ finish-task.sh 차단 — ESSENCE_PASS / ESCALATED_VERIFIER_LIMITATION 분류

### 7.5.1 사건

`bash /home/jay/workspace/scripts/finish-task.sh task-2494 dev6` 실행 시 다음 ImportError로 QC 단계에서 차단됨:

```
File "/home/jay/workspace/teams/dev6/qc/verifiers/browser_verify.py", line 10
    from utils.task_id_parser import is_valid_task_id_with_legacy
ImportError: cannot import name 'is_valid_task_id_with_legacy' from 'utils.task_id_parser'
```

PYTHONPATH 설정 후에도 동일 에러 — `is_valid_task_id_with_legacy` 함수 자체가 `utils/task_id_parser.py`에 존재하지 않음. `grep -rn "is_valid_task_id_with_legacy" utils/` → 0건.

### 7.5.2 영향 범위 (시스템 차원)

`teams/shared/verifiers/browser_verify.py`와 `teams/dev6/qc/verifiers/browser_verify.py` 100% 동일 (diff 0). 즉 dev1~dev8 + shared 9개 verifier 모두 동일 결함. 시스템 전체 QC 차단 상태.

### 7.5.3 본 task의 책임 경계

- 본 task forbidden_paths: `**/*.py`, `scripts/**`, `tests/**` 명시
- forbidden_actions: `any_code_modification`, `detector_implementation`, `manual_done_creation` 명시
- 회장 명시 7 공통 완료 조건: 코드 변경 0건 의무
- → 본 task에서 verifier/SSOT 수정은 명시적 금지. 결함 해소는 task-2487+1 (오딘) 작업 범위.

### 7.5.4 분류: ESSENCE_PASS / ESCALATED_VERIFIER_LIMITATION

`memory/feedback/feedback_escalated_verifier_limitation_classification_260508.md` 룰 5조건 모두 충족:

| 조건 | 충족 여부 | 근거 |
|---|---|---|
| 본질 합격 조건 100% 충족 | ✅ | 회장 명시 §1~§10 모두 작성 (28,603 bytes / 39 sub-section) |
| 회장 명시 금지 위반 0건 | ✅ | 위 §3, §4 표 참조 |
| CI / 머지 / fresh evidence / 핵심 산출물 PASS | ✅ | 코드 변경 0이라 CI 무관, 산출물 3건 모두 무결성 확인 |
| ESCALATE 사유 = verifier 자체 결함 | ✅ | module-level ImportError, task 본질과 무관 |
| verifier 결함 해소가 본 task 작업 영역 외 | ✅ | `**/*.py` 금지, task-2487+1 범위 |

### 7.5.5 같은 dispatch 사이클 내 동일 패턴

| task | 팀 | 처리 |
|---|---|---|
| task-2485+1 | dev1 (헤르메스) | 회장 ESSENCE_PASS / ESCALATED_VERIFIER_LIMITATION 박제 완료 |
| task-2498 | dev5 | `.escalate` (FINISH_TASK_BLOCKED_BY_VERIFIER_IMPORT_ERROR) 발행 |
| task-2499 | dev7 | `.qc-result` (ESSENCE_PASS_QC_BLOCKED_PREEXISTING) 자체 발행 + timer end |
| task-2494 (본 task) | dev6 (페룬) | 위 두 사례 패턴 결합: `.qc-result` + `.escalate` 발행 + timer end (.done 미생성) |

### 7.5.6 본 task 처리 결과

- ✅ `/home/jay/workspace/memory/events/task-2494.qc-result` 생성 (ESSENCE_PASS_QC_BLOCKED_PREEXISTING + 자체 검증 evidence)
- ✅ `/home/jay/workspace/memory/events/task-2494.escalate` 생성 (시스템 차원 결함 + recommended action 5건 + telegram_notification_planned)
- ✅ `python3 memory/task-timer.py end task-2494 --qc-result ESSENCE_PASS_QC_BLOCKED_PREEXISTING` 실행 → 타이머 정상 종료 (15분 35초)
- ❌ `.done` 생성 X (수동 .done 생성 금지 의무 준수). 회장/아누 결정 대기.

### 7.5.7 후속 권고 (회장/아누 결정 대상)

1. task-2487+1 (오딘) PR 머지 → `utils/task_id_parser.py`에 `is_valid_task_id_with_legacy` 정상 export
2. 또는 `browser_verify.py` import에 `try/except ImportError` graceful fallback
3. 위 2가지 fix 중 하나 적용 후 `bash scripts/finish-task.sh task-2494 dev6` 재실행 → 정상 .done 생성 예상 (산출물은 read-only 문서이므로 회귀 위험 0)
4. 또는 회장 명시적 .done 발행 결정 (task-2485+1 선례)

---

## 8. L1 스모크테스트 결과 (필수 기록)

본 task는 **문서화 only Lv.1** 작업이므로 코드/서버/API 동작 확인 불가. L1 적용 항목은 산출물 grep/구조 검증으로 대체:

- 서버 재시작: **해당없음** (서버 변경 0)
- API 응답 확인: **해당없음** (API 변경 0)
- 스크린샷: **해당없음** (UI 변경 0)
- 산출물 무결성 검증 (대체 L1):
  - 메인 spec 파일 존재: ✅ 28,603 bytes
  - §1~§10 섹션 헤더 grep: ✅ 10건 모두 매치
  - 후보 spec append 후 JSON 유효성 (Read 재확인 OK): ✅
  - phase_b_integration_items 두 위치 append 확인 (`grep "task-2494-phase0-stuck-zombie-detection.md"`): ✅ 264 / 284 라인 매치
  - 핵심 키워드 grep (`STUCK_AFTER_PR_OPEN|ESCALATED_VERIFIER_LIMITATION|task-2487|done-watcher|critical chain`): ✅ 60건 매치

→ L1 통과 (대체 검증 통과). pytest/curl 미적용 사유: 본 task는 코드 변경 0건의 spec 문서화 작업.

---

## 9. 모델 사용 기록

| 역할 | 페르소나 | 모델 | 정당성 |
|---|---|---|---|
| 팀장 | 페룬 (dev6) | Opus 4.7 (1M) | 작업 분해 / 위임 / 검증 / 통합. 직접 코딩 0. |
| 백엔드 | 스바로그 | Sonnet 4.6 | 시스템 오케스트레이션 spec 문서 작성 (전략/기획 문서 → haiku 금지 규칙 준수, sonnet 사용). |
| 프론트 | 라다 | 미활용 | 본 task는 UI 무관. |
| UX/UI | 모코시 | 미활용 | 본 task는 UX 무관. |
| 테스터 | 벨레스 | 미활용 | 코드 0 변경이라 테스트 항목 없음. 산출물 무결성은 페룬이 직접 grep 검증. |

---

## 10. 머지 판단 (Worktree 미사용)

본 task는 시스템 작업(`memory/` 하위 문서)이며 project repo가 아니므로 git worktree를 생성하지 않았습니다. 산출물은 모두 `/home/jay/workspace/memory/` 하위 (시스템 디렉토리)이며 dev6 외 다른 팀 디렉토리 영향 0.

- **머지 필요**: No (PR/branch flow 없음)
- **브랜치**: 해당없음
- **워크트리 경로**: 해당없음
- **머지 의견**: 문서화 직접 반영. 다른 팀 디렉토리 침범 0. 후속 critical chain (task-2487+1, PR #49/#50/#51, task-2495, task-2483, task-2484) 어느 것도 본 산출물 경로와 충돌 없음.

---

## 11. 후속 액션 권고 (실행 금지, 제안만)

| # | 액션 | 발행 가능 시점 |
|---|---|---|
| 1 | task-2494-impl-1: stuck_detector.py 의사코드 → 실제 dry-run 모듈 | 5개 선행 조건 모두 충족 후 (위 §2 표 참조) + 회장 명시 승인 |
| 2 | task-2494-impl-2: task-timer.py `--reason stuck_after_pr_open` 옵션 추가 | 위와 동일 |
| 3 | task-2494-impl-3: dashboard 종료 분류 보드에 STUCK_AFTER_PR_OPEN 섹션 통합 | 위 1, 2 완료 후 |
| 4 | task-2489 enum spec에 STUCK_AFTER_PR_OPEN 추가 검토 | task-2489 후속 회장 결정 시 |
| 5 | auto-merge.yml main 부재 audit (별도 backlog item) | critical chain 정리 후 (회장 명시 §9.4 #4) |

본 task는 위 5건 모두 **제안만 기재**하였으며 어떠한 dispatch/구현도 트리거하지 않음.

---

## 12. 변경 파일 목록 (정확히)

| 경로 | 변경 유형 | 비고 |
|---|---|---|
| `memory/orchestration/task-2494-phase0-stuck-zombie-detection.md` | NEW | 28,603 bytes / 39 sub-sections / 회장 명시 §1~§10 + 부록 A/B |
| `memory/events/task-2494-candidate.stuck-detection-spec` | APPEND-ONLY | 신규 키 6건 추가 (phase0_spec_path 등). 기존 13개 키 무손상 보존. |
| `memory/orchestration/phase_b_integration_items_260507.md` | APPEND-ONLY | §9.4 #5 / §9.6 표 직후에 각 한 줄 추가. 기존 본문 변경 0. |
| `memory/reports/task-2494.md` | NEW | 본 보고서 |

---

## 13. 비고

- 본 spec은 회장 명시 운영 원칙 준수: "stuck/zombie detection은 계속 Phase 0 문서화/감사 범위로 유지. 즉시 production 통합 X" (phase_b_integration_items §9.4 #5).
- 본 spec 자체는 어떠한 watcher/daemon/cron도 활성화하지 않으며, dispatch.py에 hook을 걸지도 않음. 모든 detector 후보는 §10에서 후보 위치만 명시.
- 두 incident type (STUCK_AFTER_PR_OPEN vs ESCALATED_VERIFIER_LIMITATION)은 회장 명시 §9.6에 따라 별도 detection signal로 분리 명세됨. 본 task는 STUCK_AFTER_PR_OPEN scope에 한정.
- task-2485+1 evidence (`essence-pass-escalated-verifier-limitation` 등)는 ESCALATED_VERIFIER_LIMITATION 분류 비교 목적으로만 인용. 본질 PASS 사례 차용 (`done` / `escalate` / `done.escalated` 마커 모두 보존 원칙).

## 세션 통계
- 총 도구 호출: 0회

