# 보고서: task-2452 — 신호등 sync 정정 + auto_merge.py 공식 폐기

- **task**: task-2452
- **작업 레벨**: Lv.3 (시스템 머지/신호등 게이트 변경 + critical)
- **위임팀**: dev1팀 (헤르메스, opus 4.7 1M)
- **한정승인**: 회장 → 아누 → dev1팀 (4 Phase 일괄)
- **일시**: 2026-05-05

---

## SCQA 요약

**S**: 회장 직접 진단(2026-05-05) — `auto_merge.py`가 사실상 폐기 상태(`logs/auto_merge.log` 24MB / 227건 모두 `[BLOCKED]`)이고, 신호등 끄는 로직이 `member-status.json`(finish-task.sh Step 2.7)과 `bot-activity.json`(done-watcher.py cron)으로 분리되어 mismatch 발생.

**C**: 두 source 다른 시점·다른 트리거로 카운터 불일치 + escalated dead-lock + composite `team_id=""` 매핑 실패 + 다단계 마커 시점 미정의 등 결정적 결함 5개. dev3/4/5/6/7/8 봇 7개가 53시간째 stale processing.

**Q**: (Q1) 신호등 단일 책임 = `finish-task.sh` 끝부분, (Q2) `auto_merge.py` cron 매분 실행 제거 + DEPRECATED, (Q3) 두 source 동시·동일 시점 idle, (Q4) 4개 문서 일괄 정정 — 이 4가지를 모두 만족하는가?

**A**: 4 Phase 모두 완료. Phase 1(crontab 라인 제거 + 헤더 DEPRECATED + 24MB 로그 archive), Phase 2(finish-task.sh Step 2.99 신규 — member+bot 통합), Phase 3(done-watcher 30분 grace + `.merge-done` 부재 fallback only), Phase 4(외부 조언자 V3 / 신호등 분석 정정 / spec 1.1.1 / traffic-light v2 / anu-guide-system Phase 7 추가). 본 task의 finish-task.sh 자체가 1차 자가 검증.

---

## 1. 작업 내용

### Phase 1 — `auto_merge.py` 공식 폐기 (Lv.1)

| 작업 | 결과 |
|------|------|
| crontab 매분 라인 제거 | `crontab -l \| grep auto_merge` → 0건 |
| `scripts/auto_merge.py` 헤더 DEPRECATED 마커 | 첫 docstring에 30일 유예(2026-06-04 삭제) 안내 명시 |
| `logs/auto_merge.log` (24MB) → archive | `auto_merge.log.archive-2026-05-05` rename, 빈 로그 새로 생성 |
| `systemd/auto-merge.service` 상태 | `is-enabled` = `not-found`, `is-active` = `inactive` (영향 없음) |

### Phase 2 — `finish-task.sh` 끝부분 신호등 통합 (Lv.2)

- 기존 Step 2.7 (`팀원 전원 idle 복원`, `member-status.json`만) 제거 → 주석으로만 위치 표시 (line 682-683).
- 신규 **Step 2.99** (line 947, `.done` 생성 직전) 추가:
  - `member-status.json`: working/standby → idle (기존 동치)
  - `bot-activity.json`: 영향 받는 팀의 봇 status processing → idle (Phase 2 신규)
  - composite `team_id=""` fallback 체인: `task-timers.json[task_id].affected_teams` → `composite_teams` → `team`/`team_id` (`-team` suffix 정규화) → 마지막 `[WARN]` 경고
  - JSON 원자적 쓰기 (`tmp + os.replace`).

### Phase 3 — `done-watcher.py` fallback only로 강등 (Lv.2)

- 신규 상수 `TRAFFIC_LIGHT_FALLBACK_GRACE_SECONDS = 30 * 60` (line 40).
- `process_done_files()` 변경 (line 261-313): 30분 grace 미만 또는 `.merge-done` 마커 존재 시 신호등 안 건드림. 두 조건 모두 위반 시에만 `[FALLBACK-IDLE]` 로그 + `set_bot_idle()`.
- `extract_team_from_done_file()` 보강 (line 135-184): `team_id` 빈 문자열인 composite 작업에 대해 `team`(2차) → `composite_teams[0]`(3차) fallback. `-team` suffix 자동 정규화.

### Phase 4 — 4개 문서 일괄 정정 + 신호등 스펙 v2 (Lv.1)

| 문서 | 변경 |
|------|------|
| `memory/specs/anu-system-spec-for-external-advisor.md` | 헤더 V3 표시 + §0 V3 정정 요약 신규 + §3.9 DEPRECATED + cron 표 정정 + 흐름도 정정 + 부록 B 17번 (`.done.escalated` 마커 미상) + 메타데이터 V3 갱신 |
| `memory/specs/traffic-light-sync-analysis-2026-05-05.md` | 헤더 정정 박스 + §2.4 정정 (auto_merge가 마커 만든다는 추정 정정) + 결함 3 원인 정정 |
| `memory/specs/anu-system-spec.md` | 헤더 1.1.1 + §6.10 정정 (auto_merge classify_tier DEPRECATED + 머지 진짜 경로 3개) + 외부 조언자 V3 링크 |
| `memory/specs/anu-system-spec-changelog.md` | V1.1.1 항목 신규 (변경 사항 6개 요약) |
| `memory/specs/traffic-light-spec.md` | v2 헤더 + §0 v2 변경 요약 신규 (단일 책임 + 다단계 마커 시점 + 머지 3경로) + §2.4 정정 |
| `memory/plans/anu-guide-system/plan.md` | Phase 6 헤더 정정 + 검증 기준 정정 + Phase 7 신규 추가 (4 sub-phase) |
| `memory/plans/anu-guide-system/context-notes.md` | Phase 7 결정 근거 신규 (단일 책임 / auto_merge 폐기 / done-watcher 강등 사유) |
| `memory/plans/anu-guide-system/checklist.md` | Phase 6 미완 항목 [x] (1.1.1 bump, V3) + Phase 7 신규 추가 (7-1 ~ 7-4) |

---

## 2. 생성/수정 파일 목록

### 생성
- `logs/auto_merge.log.archive-2026-05-05` (24MB, 기존 24MB 로그 rename)

### 수정 (시스템 코드)
- `scripts/auto_merge.py` (헤더 DEPRECATED 마커, +18줄)
- `scripts/finish-task.sh` (Step 2.7 제거 → Step 2.99 신규, 약 +95줄)
- `scripts/done-watcher.py` (상수 신규 + extract_team 보강 + process_done_files fallback only, 약 +60줄)

### 수정 (문서)
- `memory/specs/anu-system-spec-for-external-advisor.md` (V2 → V3, 약 +100줄)
- `memory/specs/traffic-light-sync-analysis-2026-05-05.md` (정정 박스 + §2.4/결함3 정정, 약 +40줄)
- `memory/specs/anu-system-spec.md` (헤더 1.1.1 + §6.10 정정, 약 +30줄)
- `memory/specs/anu-system-spec-changelog.md` (V1.1.1 항목, +10줄)
- `memory/specs/traffic-light-spec.md` (v2 헤더 + §0 / §2.4, 약 +35줄)
- `memory/plans/anu-guide-system/plan.md` (Phase 6 헤더 정정 + Phase 7 신규, 약 +50줄)
- `memory/plans/anu-guide-system/context-notes.md` (Phase 7 결정 근거, 약 +20줄)
- `memory/plans/anu-guide-system/checklist.md` (Phase 6 [x] + Phase 7 추가, 약 +30줄)

### 시스템 변경 (코드 외)
- `crontab -e`: `* * * * * cd /home/jay/workspace && /usr/bin/python3 scripts/auto_merge.py …` 1줄 제거 (9줄 → 8줄).

### 3문서 (Lv.3+ 필수)
- `memory/plans/tasks/task-2452/plan.md`
- `memory/plans/tasks/task-2452/context-notes.md`
- `memory/plans/tasks/task-2452/checklist.md`

---

## 3. 테스트 결과

### 3.1 Phase 1 검증
```
$ crontab -l | grep auto_merge → (0건)
$ head -5 scripts/auto_merge.py
#!/usr/bin/env python3
"""
⚠️ DEPRECATED (2026-05-05, task-2452) — auto_merge.py는 사실상 폐기 상태입니다.

머지는 다음 3개 경로로만 처리됩니다:
$ ls -lh logs/auto_merge.log logs/auto_merge.log.archive-2026-05-05
-rw-rw-r-- 1 jay jay   0 May  5 14:27 logs/auto_merge.log
-rw-rw-r-- 1 jay jay 24M May  5 14:26 logs/auto_merge.log.archive-2026-05-05
$ python3 -m py_compile scripts/auto_merge.py → exit 0
```

### 3.2 Phase 2 검증
```
$ bash -n scripts/finish-task.sh → exit 0 (syntax valid)
$ grep -n "Step 2.99\|Phase 2" scripts/finish-task.sh
682:# 2.7. (이동됨) — 팀원 idle 복원은 Step 2.99 (.done 생성 직전)에서 두 신호등 source 통합 처리.
683:#                  task-2452 Phase 2: 신호등 단일 책임 = finish-task.sh 끝부분.
947:# 2.99. (task-2452 Phase 2) — 두 신호등 source 통합 idle 전환 (.done 생성 직전 단일 책임)
```

### 3.3 Phase 3 검증
```
$ python3 -m py_compile scripts/done-watcher.py → exit 0
$ grep -n "FALLBACK\|TRAFFIC_LIGHT" scripts/done-watcher.py
40:TRAFFIC_LIGHT_FALLBACK_GRACE_SECONDS = 30 * 60  # 30분
267:      (1) .done이 30분(TRAFFIC_LIGHT_FALLBACK_GRACE_SECONDS) 이상 살아있음
293:        if (now_ts - done_mtime) < TRAFFIC_LIGHT_FALLBACK_GRACE_SECONDS:
308:                    f"[FALLBACK-IDLE] {task_id}: finish-task.sh 누락 의심"
```

### 3.4 Phase 4 검증
```
$ grep -c "V3 정정\|task-2452" memory/specs/anu-system-spec-for-external-advisor.md → 16
$ grep -c "정정 2026-05-05 task-2452" memory/specs/traffic-light-sync-analysis-2026-05-05.md → 5
$ grep -c "1.1.1\|task-2452" memory/specs/anu-system-spec.md → 13
$ grep -c "v2\|task-2452" memory/specs/traffic-light-spec.md → 6
$ grep -c "Phase 7\|task-2452" memory/plans/anu-guide-system/plan.md → 21
```

### 3.5 시나리오 검증

- **5.1 정상 흐름**: 본 task 자체의 `finish-task.sh` 호출이 1차 자가 검증. 호출 후 `bot-activity.json[dev1]` status=idle, since=현재시각으로 갱신되면 PASS. (회장 검증 시점에서 raw 확인 가능 — 본 보고서 시각 이후 수 초 내).
- **5.2 escalated dead-lock 자동 해소**: 30분 대기 시나리오는 실시간 검증 불가. 코드 로직(line 287-313 + TRAFFIC_LIGHT_FALLBACK_GRACE_SECONDS=1800 + `.merge-done` 부재 조건)은 task 지시서 §3.1 (3.1)과 동치 확인.
- **5.3 auto_merge 폐기**: 위 §3.1에서 검증 완료.
- **5.4 stale processing 7개**: dev3/4/5/6/7/8/anu가 53시간째 processing. Phase 2/3 적용 후 다음 사이클 진행되면 자연 보정 예정. 즉시 보정은 별도 cleanup 스크립트로 진행 (스코프 외).

---

## 4. 발견 이슈 및 해결

### 자체 해결 (3건)

1. **`logs/auto_merge.log` 24MB 누적** — `auto_merge.log.archive-2026-05-05`로 archive + 빈 로그 새로 생성. cron 미실행이라 빈 채로 유지.
2. **systemd `auto-merge.service`** — 파일은 존재하나 `is-enabled = not-found`. systemctl로 enable 안 됨 → 추가 disable 작업 불필요. 보고서 명시.
3. **본 task의 git 브랜치** — 현재 `task/task-2451-dev2`. 본 task가 시스템 작업(project_id=system)이라 worktree 미생성. 변경 파일을 task-2452 메시지로 직접 커밋하여 GIT-GATE 통과.

### 범위 외 미해결 (3건, 별도 추적 권고)

1. **`.done.escalated` 마커 생성자 미상** — auto_merge.py 코드 grep 결과 마커 생성 0건. task-2451의 0byte `.done.escalated` (5/5 13:56) 출처 불명. 본 task 부록 B 17번 + traffic-light-sync-analysis 결함 3 정정에 기록. 별도 추적 task 권고.
2. **task-2451 `.done → .done.acked` rename** — 회장이 별도 시점에 처리 (task 지시서 §7 명시). 본 task에서 건드리지 않음.
3. **stale processing 7개 즉시 보정** — Phase 2/3 적용 후 자연 보정 예정. 즉시 필요 시 별도 cleanup 스크립트 dispatch.

---

## 5. 머지 판단

- **머지 필요**: No (시스템 작업, project_id=system)
- **브랜치**: 현재 `task/task-2451-dev2`. 본 task의 변경 파일(scripts/auto_merge.py, finish-task.sh, done-watcher.py, memory/specs/* 6개, memory/plans/anu-guide-system/* 3개, memory/plans/tasks/task-2452/* 3개)을 task-2452 commit message로 커밋.
- **워크트리 경로**: 미사용 (시스템 작업)
- **머지 의견**: 시스템 hot path(머지 게이트 + 신호등) 변경이라 main으로 통합 필수이지만, project_id=system이라 worktree+PR 흐름을 사용하지 않음. finish-task.sh의 PROJECT_PATH 미지정 시 머지 단계 자동 스킵 (line 430-432). 회장 시점에서 task-2451 PR 머지 시 task-2452 변경도 같이 main에 합류.

## 6. 모델 사용 기록

- **헤르메스 (팀장, 본 작업 전체)**: opus 4.7 (1M context). 시스템 hot path 코드 변경 + 광범위한 문서 정정으로 정확성·일관성 critical. Sonnet 위임 시 일관성 깨질 위험으로 직접 수행. task 지시서 §7 ("위임 후 중간 정정 100% 무효") 룰 적용.
- **팀원 위임 0건**: 본 task는 회장 한정승인 4 Phase 일괄을 헤르메스가 직접 수행. 광범위 문서 정정도 위임 시 일관성 깨질 위험 + 정확한 텍스트 치환 필요로 헤르메스 직접.

## 7. 셀프 QC 체크리스트 (8 항목)

- [x] (1) Phase 1: crontab 라인 제거 + DEPRECATED 마커 + 로그 archive 모두 완료
- [x] (2) Phase 2: Step 2.7 제거 + Step 2.99 신규 + composite fallback 처리
- [x] (3) Phase 3: 30분 grace + `.merge-done` 부재 조건 + extract_team fallback 보강
- [x] (4) Phase 4: 4개 문서 정정 + 1.1.1 bump + changelog + traffic-light v2
- [x] (5) syntax 검증: bash -n, py_compile 모두 PASS
- [x] (6) 3문서 작성 (plan/context-notes/checklist) Lv.3+ 필수
- [x] (7) anu-guide-system 3문서 갱신 (Phase 6 정정 + Phase 7 추가)
- [x] (8) 보고서 작성 (본 문서)

## 8. 비고

- 본 task는 회장 한정승인 critical 작업. 4 Phase 일괄 처리 완료.
- **재귀적 자가 검증**: 본 task의 finish-task.sh 호출 자체가 신호등 통합 로직 1차 검증. 호출 후 `bot-activity.json[dev1]` status가 정상 idle로 바뀌면 시나리오 5.1 PASS.
- **30일 유예** (auto_merge.py 코드 자체 삭제): 2026-06-04 예정. 그 전에 의존 테스트(tests/test_auto_merge.py 등) + lock_in_verify.py First-line guard 추적 정리 필요.
- **stale processing 7개**: 별도 cleanup 스크립트 dispatch 권고 (회장 결정 후).
- **`.done.escalated` 마커 생성자 추적**: 별도 task로 분리 권고.

---

## goal_assertions 처리

task 파일 §317-318의 `npm run build`는 본 task가 시스템 작업(project_id=system, npm 환경 없음)이라 적용 불가. finish-task.sh의 GOAL_GATE는 SKIP 또는 WARN으로 통과 예상.
