# Phase 4: Layer 2↔3 통합 + 이벤트 흐름 정비

## 태스크 ID: task-910.1
## 한정위임: 설계 → 구현 → 테스트 → 보고까지 완료

---

## 배경

- Phase 1 ✅ (task-902.1): Layer 2 .done 감지 인프라 — notify-completion.py requests.post 교체, done-watcher.sh fallback
- Phase 2 ✅ (task-903.1): 보안 기반 — pipeline_validator, token_ledger, event_bus 구현
- Phase 3 ✅ (task-906.1): auto_orch.py 코어 — 5개 CLI + TeamLock + systemd

Phase 4는 Layer 2(알림)와 Layer 3(오케스트레이션)이 동일 .done 파일에 대해 충돌 없이 독립 동작하도록 통합하는 단계.

## 설계서 참조

- **통합 구현 계획서**: `memory/specs/automation-impl-plan.md` (Phase 4 섹션)
- **Phase 1 보고서**: `memory/reports/task-902.1.md`
- **Phase 3 보고서**: `memory/reports/task-906.1.md`

## 핵심 설계 — .done 이벤트 소비 분리

```
.done 파일 생성 (finish-task.sh)
  ↓
[Layer 2 - 알림 경로] notify-completion.py
  → .done.notified 마커 생성
  → Telegram 알림 발송 (보고서 요약 포함 — task-908.1에서 구현 중)
  → 체인 인식: chain_manager.py next 호출 (기존 체이닝)
  ※ .done 파일 자체를 소비(삭제/이동)하지 않음

[Layer 3 - 오케스트레이션 경로] event_bus.py
  → memory/events/*.done 스캔 → orchestrator/incoming/ 복사
  → 원자적 rename으로 단일 소비 보장
  → auto_orch.py가 파이프라인 트리거 평가
  ※ 원본 .done 파일은 보존 (Layer 2와 독립)
```

## 구현 범위

### 1. `orchestrator/event_bus.py` 수정 (~50 LOC 추가)

현재 event_bus.py는 Phase 2에서 기본 consume 로직만 구현됨.
추가 필요:
- `scan_done_events()`: `memory/events/*.done` 디렉토리 스캔
- `.done` 파일을 `orchestrator/incoming/<task_id>.done` 으로 복사 (원본 보존)
- 이미 `incoming/`에 있거나 `processed/`에 있는 파일은 건너뜀 (중복 방지)
- symlink 거부 (보안)

### 2. notify-completion.py 호환성 확인

- .done 원본을 삭제하지 않는지 확인 (현재도 미삭제이므로 변경 없을 것)
- 1팀(task-908.1)이 현재 수정 중이므로, **notify-completion.py는 읽기 전용으로만 확인**. 수정 필요 시 보고서에 명시.

### 3. 통합 테스트

- T1: 단일 팀 완료 → Layer 2 알림 + Layer 3 이벤트 소비 모두 독립 동작
- T2: 중복 알림 0건, 중복 파이프라인 시작 0건
- T3: 동시 완료 시나리오 (여러 .done 동시 생성)
- T4: 아누 수동 체이닝(chain_manager.py)과 auto_orch 자동 체이닝 공존 확인
- T5: .done → .done.clear rename 후 Layer 3가 재처리하지 않음

## 수정 대상 파일

- `orchestrator/event_bus.py` — scan_done_events 추가
- `orchestrator/tests/test_phase4.py` — 통합 테스트 신규

## 수정 금지 파일 (충돌 방지)

- `scripts/notify-completion.py` — 1팀 작업 중 (task-908.1). 읽기만 가능
- `scripts/activity-watcher.py` — 1팀 작업 중
- `orchestrator/auto_orch.py` — Phase 5에서 수정 예정
- `orchestrator/token_ledger.py` — Phase 5에서 수정 예정
- `dashboard/` — 8팀 작업 중

## 검증 기준

1. Layer 2 알림 + Layer 3 오케스트레이션이 동일 .done에 대해 독립 작동
2. 중복 알림 0건, 중복 파이프라인 시작 0건
3. symlink .done → 처리 거부
4. .done.clear 상태 파일 재처리 0건
5. pyright 0 에러, pytest 전건 통과, black+isort 준수