---
task_id: task-2452
type: context
scope: task
created: 2026-05-05
updated: 2026-05-05
status: in-progress
---

# 맥락 노트: task-2452

**task**: task-2452

---

## 결정 근거

### 1. 신호등 끄는 단일 책임 = `finish-task.sh` 끝부분

- **회장 직접 진단 (2026-05-05)**: "오토 머지까지 다 되어야 작업이 정말 완성된 거고, 그 이후 finish-task.sh가 진행되니, finish-task.sh 마지막에 신호등이 꺼지는 로직이어야 정상."
- **현재 분리 상태**: `member-status.json`은 `finish-task.sh` Step 2.7에서 머지 직후, `bot-activity.json`은 `done-watcher.py` cron이 .done 감지 시 별도. → 다른 시점·다른 트리거로 mismatch.
- **대안 기각**:
  - (A) done-watcher가 두 source 모두 책임 → finish-task.sh가 정상 끝까지 돈 경우에도 외부 cron이 신호등 만짐. 책임 분산.
  - (B) finish-task.sh 중간 Step 2.7 유지 + bot-activity만 끝부분 → 두 source 시점이 또 다름 (Q3 위반).
  - (C) 채택: Step 2.7 로직 자체를 `.done` 생성 직전 마지막 Step으로 이동 + 동일 위치에 bot-activity 추가. 단일 트리거·단일 시점.
- **실패 시 의도**: finish-task.sh가 앞 단계에서 exit하면 신호등 끄는 로직 도달 안 함. 정상. 이 경우 done-watcher가 30분 후 fallback (Phase 3).

### 2. `auto_merge.py` 공식 폐기 (코드 삭제는 30일 유예)

- **회장 직접 진단 (2026-05-05)**: "실제 workflow 따라가보면 merge는 git을 통해 하는 걸로 되어있다."
- **raw 증거**: `logs/auto_merge.log` 24MB 최근 1000줄 227건 모두 `[BLOCKED] auto_merge.py merge 경로는 taskctl로만 호출 가능합니다.`
  - cron이 매분 돌리는데 머지 성공 흔적 0건. 24MB 누적은 BLOCKED 메시지뿐.
- **머지의 진짜 경로 3개** (auto_merge 거치지 않음):
  - A) `finish-task.sh` Step 2 → `worktree_manager.py finish --action auto` → 자체 머지
  - B) `taskctl.py merge` → `gh pr merge` 직접 호출 → server-side enforcement
  - C) GitHub merge_group → PR + Ruleset(active) + 7개 required checks → server-side 직렬 머지
- **30일 유예 사유**:
  - `tests/test_auto_merge.py`, `tests/test_auto_merge_ttl.py`, `tests/integration/test_graduated_auto_gate.py`, `tests/dev3/test_phase_beta_traffic_light.py`, `tests/dev7/test_tier_classifier.py` 등 의존 테스트 다수.
  - `scripts/lock_in_verify.py`가 `auto_merge.py::AutoMerger.execute_merge`를 First-line guard 대상으로 추적.
  - 즉시 삭제 시 회귀 위험. cron만 끊어 실행 0건 보장 + 헤더 마커로 운영자 인지.

### 3. `done-watcher.py`를 fallback only로 강등

- **변경 전**: `.done` 발견 즉시 `set_bot_idle()`. → finish-task.sh가 도는 중에도 cron이 30초마다 신호등을 만짐. Phase 2의 단일 책임 깨짐.
- **변경 후**: 30분 grace + `.merge-done` 마커 부재 조건일 때만 fallback idle.
  - 정상 흐름: finish-task.sh가 끝까지 돌면 30분 안에 신호등이 꺼져있음 → done-watcher 안 만짐.
  - 비정상 흐름: 봇 크래시·finish-task.sh 누락 → 30분 후 done-watcher가 강제 idle (`[FALLBACK-IDLE]` 로그).
- **30분 grace 산정**: finish-task.sh의 평균 실행 시간(QC + 머지 + 게이트) << 5분. 30분이면 모든 정상 흐름 마감 + 안전 마진.

### 4. `.done.escalated` 마커 생성자 미상

- auto_merge.py 코드 grep 결과: `.done.escalated` 파일 만드는 코드 **없음**.
  - `escalate()` 메서드: cokacdir 메시지만 보냄.
  - `_finalize_done_file()`: `log_result()` 호출만.
- task-2451의 0byte `.done.escalated` (5/5 13:56 생성) 출처 불명.
- **본 task에서는**: 추가 추적 권고만 V3 부록 B에 기록. 코드 수정으로 해결 시도 X (스코프 외).

### 5. 다단계 신호등 시점 v2 정의

- 기존 spec (2026-04-15)은 ".done → 유휴" 단일 단계 가정.
- 실제 마커는 5단계: `.done`, `.done.acked`, `.done.clear`, `.done.merging`, `.done.escalated`, `.done.rejected`.
- v2 정의 (본 task에서 채택):
  - **신호등 끄는 시점 단일 책임 = `finish-task.sh` 끝부분 (.done 생성 직전 마지막 Step)**.
  - 다단계 마커는 머지 라이프사이클 상태 표시일 뿐, 신호등 트리거 아님.
  - 비정상 흐름 fallback: `done-watcher.py`가 30분 grace 후 .merge-done 부재 시 idle.

## 참조 자료

- **task 지시서**: `memory/tasks/task-2452.md` (374줄, 회장 직접 raw 증거 포함)
- **신호등 분석 보고서**: `memory/specs/traffic-light-sync-analysis-2026-05-05.md` (318줄, 5개 결함 상세)
- **신호등 스펙**: `memory/specs/traffic-light-spec.md` (2026-04-15, 본 task에서 v2 갱신)
- **외부 조언자 문서**: `memory/specs/anu-system-spec-for-external-advisor.md` (V2, 본 task에서 V3)
- **시스템 스펙**: `memory/specs/anu-system-spec.md` (1.1.0 → 1.1.1)
- **시스템 changelog**: `memory/specs/anu-system-spec-changelog.md`
- **시스템 plan/checklist/context**: `memory/plans/anu-guide-system/{plan,context-notes,checklist}.md`
- **task-2440 보고서**: `memory/reports/task-2440.md` + `memory/reports/task-2440-enforce/`
- **task-2449 침투 9건**: `memory/reports/task-2449.md`
- **task-2451**: 본 task와 별개. `.done → .done.acked` rename은 회장이 별도 시점 처리.

## 주의사항

- **위임 후 중간 정정 100% 무효** (회장 격상, 2026-05-04). 본 task는 dispatch 시점에 모든 사실/요구가 task 파일 + 본 3문서에 들어있어야 함. 중간 cron/메모리/task.md 수정 무효.
- **본 task의 머지 자체도** 위 4 Phase 작업이 끝난 직후의 신호등 통합 로직으로 처리됨 (재귀적 검증 가치). 헤르메스 자기 task의 신호등이 정상 꺼지는지가 1차 검증.
- **Phase 1 cron 제거가 가장 위험**: 다른 곳에서 auto_merge를 import/호출하는 코드 grep 먼저 → 차단할 호출 없으면 cron 제거. 차단할 호출은 `systemd/auto-merge.service` (현재 not-found, inactive — 위험 0)와 테스트 파일들 (cron과 무관).
- **Goal Assertions Gate**: task 파일 §317-318에 `npm run build` 명시. 본 task는 시스템 작업이라 npm run build 실행 가능 위치 없음. finish-task.sh의 GOAL_GATE는 mode를 확인하여 처리.
- **PR 생성 → CI 7-step → merge_group → server-side Ruleset 통과 후에만** main에 들어감 (task-2440 enforcement). 본 task가 시스템 코드(워크스페이스)이므로 일반 worktree+PR 흐름이 아님 — `PROJECT_PATH=$WORKSPACE` git에서 직접 커밋.
- **task-2451은 본 task와 별개**: hook이 시키는 `.done → .done.acked` rename은 회장이 별도 시점 처리. 본 task에서 건드리지 않음.
- **systemd `auto-merge.service`**: 파일은 있으나 systemctl is-enabled = `not-found`. Phase 1 검증에서 이 사실 보고서에 명시. 추가 disable 작업 불필요.
