# Phase 2 운영 Runbook

## 1. 목적

이 문서는 운영자가 Phase 2 수집 파이프라인을 실행, 점검, 재시도, 복구할 때 따르는 절차를 정의합니다.

## 2. 일일 운영 루틴

### 장 전 / 오전

- SEC submissions poll 정상 동작 여부 확인
- 전일 FINRA 파일 수집 완료 여부 확인
- FRED 최신 observation lag 확인
- source freeze 설정이 의도치 않게 켜져 있지 않은지 확인

### 장 후

- Alpaca daily bars 적재 완료 여부 확인
- SEC 신규 filing 유입량 점검
- 실패 잡 및 quarantine 건수 확인
- 데이터 품질 검증 리포트 확인

## 3. 기본 확인 명령

예시 명령은 프로젝트 CLI 이름에 맞게 조정합니다.

```bash
python -m apps.ops.show_recent_runs --limit 20
python -m apps.ops.show_failed_runs --since 24h
python -m apps.ops.show_checkpoints
python -m apps.ops.show_quarantine --since 7d
```

## 4. 특정 source 수동 실행

### SEC poll

```bash
python -m apps.collector.sec_collector.main --mode poll --run-id MANUAL_SEC_POLL_001
```

### Alpaca daily backfill

```bash
python -m apps.collector.alpaca_collector.main \
  --mode backfill \
  --symbols AAPL,MSFT,NVDA \
  --start-date 2026-01-01 \
  --end-date 2026-01-31
```

### FRED sync

```bash
python -m apps.collector.fred_collector.main --mode poll
```

### FINRA fetch

```bash
python -m apps.collector.finra_collector.main --mode poll
```

## 5. 실패 시 대응 절차

### 5.1 단일 run 실패

1. `job_runs`에서 상태와 오류 유형 확인
2. raw 파일이 쓰였는지 확인
3. checkpoint가 잘못 전진했는지 확인
4. retriable 이면 동일 파라미터로 재시도
5. terminal 이면 source payload와 schema drift 여부 확인

### 5.2 같은 잡이 연속 실패

1. source freeze 여부 확인
2. 환경변수/자격정보/네트워크 상태 확인
3. 최근 코드 변경 사항 확인
4. 원문 payload 1건을 replay 하여 문제 재현
5. 필요 시 해당 job freeze 후 다른 source는 계속 진행

## 6. Quarantine 처리

### 확인 항목

- 어떤 source인가
- 어떤 object type인가
- 언제부터 발생했는가
- 동일 원인 반복인가

### 절차

1. quarantine raw와 sidecar 열람
2. schema violation 또는 필수 필드 누락 원인 파악
3. 파서/정규화 로직 수정 필요 여부 판단
4. 수정 후 replay 수행
5. 정상 결과 확인 시 quarantine 해제 또는 새 run으로 재처리

## 7. Checkpoint 복구

### 증상

- 이미 처리한 데이터를 계속 다시 가져옴
- 새 데이터가 안 들어옴
- 특정 source만 오래 lag 발생

### 절차

1. 현재 checkpoint 값 백업
2. 최근 성공 run 기준 정상 위치 확인
3. 필요한 경우 checkpoint reset 실행
4. 작은 범위 backfill로 검증
5. 문제 없으면 정상 poll 재개

주의:
- checkpoint reset은 운영자 수동 승인 후에만 수행
- reset 전 snapshot 기록 필수

## 8. Replay 절차

Replay는 raw를 다시 해석하거나 구조화할 때 사용합니다.

예:

```bash
python -m apps.collector.sec_collector.main \
  --mode replay \
  --raw-path data/raw/sec/2026-03-12/.../filing.txt
```

확인할 것:
- replay run_id가 따로 생성되었는가
- 외부 API 호출이 발생하지 않았는가
- structured row가 기대한 대로 갱신되었는가

## 9. 데이터 이상 탐지 시 판단 기준

### SEC

- 특정 대형 종목 filing이 비정상적으로 누락됨
- filing_date 또는 accession 누락
- 99.1 artifact가 갑자기 전부 사라짐

### Alpaca

- 전일 bars가 없거나 너무 적음
- OHLC 순서 이상
- volume이 0 또는 과도하게 작음

### FRED

- 최신 observation이 지나치게 오래 갱신되지 않음
- series metadata가 바뀜

### FINRA

- 파일 헤더 형식 변경
- symbol row 급감
- ratio 계산 불가 행 급증

## 10. 일시적 중단(Freeze/Drain)

### Freeze

신규 실행을 즉시 막습니다.

### Drain

현재 실행만 마무리하고 다음 스케줄부터 멈춥니다.

사용 예:
- source 응답 포맷 변화 의심
- 저장 계층 장애
- 코드 배포 직후 이상 발견

## 11. 운영자가 반드시 남겨야 하는 기록

- 문제 발생 시각
- 영향 받은 source/job
- 영향 범위(날짜/심볼/CIK)
- 임시 조치
- 영구 수정 필요 여부
- replay/backfill 수행 여부

## 12. 운영 종료 체크

- 실패 run이 남아 있지 않은가
- checkpoint lag가 허용 범위 내인가
- quarantine 신규 건이 있는가
- raw/staging/structured count가 대체로 합리적인가
- 다음 배치를 막는 freeze가 켜져 있지 않은가
