# task-1012.1 완료 보고서: 대시보드 자동화 탭 파이프라인 동적 ON/OFF 토글

## SCQA

**S**: 대시보드 자동화 탭(AutomationView)이 task-904.1에서 4개 섹션(활성 파이프라인, 히스토리, 토큰, 등록목록)으로 구현되어 있고, auto_orch.py(task-906.1)가 파이프라인 YAML 기반으로 동작한다.

**C**: 파이프라인의 활성/비활성 상태를 대시보드에서 직접 제어할 수 없어, YAML 파일을 수동으로 편집하거나 systemctl 명령어를 직접 실행해야 한다.

**Q**: 대시보드에서 파이프라인 개별 ON/OFF 및 시스템 전체 ON/OFF를 토글할 수 있는가?

**A**: 3개 백엔드 API(`toggle_pipeline_enabled`, `system_toggle`, `get_timer_status`)와 프론트엔드 토글 UI를 구현하여 대시보드에서 직접 제어 가능. pytest 20건 전체 통과, pyright 에러 0건, black/isort 준수.

## 생성/수정 파일 목록

- `/home/jay/workspace/dashboard/server.py` — DataLoader에 3개 메서드 추가 + load_automation_status 확장 + POST 핸들러 2개 추가
- `/home/jay/workspace/orchestrator/auto_orch.py` — `is_pipeline_enabled()` 함수 추가 + cmd_scan에서 enabled 체크 로직
- `/home/jay/workspace/dashboard/components/AutomationView.js` — 마스터 토글 + 개별 파이프라인 토글 UI + 피드백 토스트
- `/home/jay/workspace/dashboard/tests/test_automation_toggle.py` — 신규 테스트 11건 (backend API)
- `/home/jay/workspace/orchestrator/tests/test_enabled_field.py` — 신규 테스트 9건 (auto_orch enabled 필드)

## 구현 상세

### 백엔드 (server.py)
- `POST /api/automation/toggle` — `{ pipeline_id, enabled }` 수신, YAML enabled 필드 원자적 쓰기(tempfile → rename)
- `POST /api/automation/system-toggle` — `{ enabled }` 수신, `systemctl --user enable/disable --now auto-orch.timer` 실행
- `load_automation_status()` — `timer_active` 필드 추가, registered_pipelines에 enabled 기본값 true 설정
- `get_timer_status()` — `systemctl --user is-active auto-orch.timer` 상태 bool 반환

### 오케스트레이터 (auto_orch.py)
- `is_pipeline_enabled(pipeline: dict) -> bool` — enabled 필드 확인, 없으면 기본값 True (후방호환)
- `cmd_scan()` — 파이프라인 로드 후 `is_pipeline_enabled()` False이면 스킵
- `__all__`에 `is_pipeline_enabled` 추가

### 프론트엔드 (AutomationView.js)
- 상단 시스템 상태 배지: 녹색 펄스닷(가동 중) / 회색(미가동) + last_tick 표시
- 마스터 토글 스위치: 시스템 전체 ON/OFF (로딩 스피너 포함)
- 섹션 4 등록된 파이프라인: 정적 배지 → 인터랙티브 토글 스위치로 교체
- 파이프라인 이름 하단에 description 표시
- trigger 필드가 object일 때 type 추출
- 피드백 토스트: 성공(녹색)/실패(빨간색), 3초 자동 소멸
- 미가동 화면에도 시스템 시작 버튼 추가

## 테스트 결과

- 신규 테스트: 20건 전체 PASSED (0.17s)
- 기존 test_automation_api.py: 19건 전체 PASSED (0.20s)
- 기존 test_server.py: 6건 전체 PASSED (0.22s)
- pyright: 0 errors, 0 warnings
- black/isort: 변경 없음 (이미 준수)

## 발견 이슈 및 해결

### 자체 해결 (3건)
1. **YAML 원자적 쓰기 필요** — tempfile.mkstemp + os.replace 패턴으로 중간 상태 방지 구현
2. **trigger 필드 타입 불일치** — YAML에서 trigger가 object(`{type: manual, description: ...}`)인데 프론트엔드에서 문자열로 가정 → typeof 분기 처리
3. **enabled 필드 후방호환** — 기존 YAML에 enabled 필드 없음 → 기본값 true로 처리 (auto_orch + server.py + 프론트엔드 모두)

### 범위 외 미해결 (1건)
1. **auto-orch.timer inactive** — 현재 systemd timer가 disabled 상태. 본 작업은 토글 UI 구현이 범위이며, 실제 활성화는 운영 판단 필요

## QC 자동 검증 결과

```json
{
  "task_id": "task-1012.1",
  "overall": "PASS",
  "checks": {
    "pyright_check": "PASS (0 errors, 0 warnings)",
    "style_check": "PASS (black OK, isort OK)",
    "test_runner": "PASS (6 passed)",
    "spec_compliance": "PASS",
    "data_integrity": "PASS"
  }
}
```
