# Risk Guard & Approval Workflow

## 1. 목적

이 문서는 Phase 6 실행 시스템에서 필수적인 **리스크 가드**, **운영 제약**, **approval workflow**를 정의합니다.
전략 신호가 아무리 좋아도, 실행 시스템은 이 문서의 제약을 통과하지 못하면 주문을 제출하면 안 됩니다.

## 2. Risk Guard 계층

리스크 가드는 4개 계층으로 나눕니다.

### 2.1 계좌 레벨
- 계좌 총 자산
- buying power / cash / margin 상태
- 일중 실현/미실현 손익
- 일일 손실 한도 초과 여부
- 신규 주문 허용 상태

### 2.2 포트폴리오 레벨
- 동시 보유 종목 수
- 섹터 집중도
- 이벤트 유형 집중도
- 총 gross exposure
- 총 planned risk

### 2.3 종목 레벨
- 유동성 기준 유지 여부
- 최근 halt / LULD / 비정상 변동성
- 가격 제한(예: min price)
- 오늘 이미 포지션/주문이 있는 종목인지

### 2.4 운영 레벨
- broker health
- market data freshness
- parser snapshot freshness
- reconciliation lag
- alert backlog
- operator acknowledgement requirement

## 3. Pre-trade Checks

주문 제출 직전에는 최소 아래를 확인한다.

1. candidate snapshot이 최신 세션 기준으로 확정되었는가
2. market calendar가 현재 세션과 일치하는가
3. broker health가 healthy인가
4. market data freshness가 기준 이하인가
5. 동일 candidate/order plan으로 이미 제출된 주문이 없는가
6. buying power / cash가 충분한가
7. 전략/리스크 정책상 신규 진입 허용 상태인가
8. approval mode일 경우 승인 상태인가

모든 pre-trade check 결과는 로그가 아니라 **구조화된 risk_decision record**로 저장한다.

## 4. Risk Guard 결정 결과

결정 타입은 아래 셋 중 하나다.

- `allow`
- `deny`
- `defer`

### `defer`가 필요한 예시
- broker websocket reconnect 중
- market data freshness 임계치 초과
- approval 응답 대기 중
- sector limit이 장중 청산 결과에 따라 해제될 수 있음

## 5. 일일 손실/중단 규칙

v1 기본 예시:
- 일일 순손실이 계좌의 `X%` 초과 시 신규 진입 중단
- 연속 `N`회 실패 주문/체결 이상 시 신규 제출 중단
- reconciliation mismatch가 `M`건 이상이면 no-trade mode 전환
- 데이터 freshness가 `T`초 초과하면 신규 주문 중단

정확한 수치는 `live_config`에서 설정한다.

## 6. Approval Workflow

### 6.1 모드
- `approval_required`
- `approval_optional`
- `auto`

### 6.2 Approval Ticket 필드
- `approval_ticket_id`
- `candidate_id`
- `order_plan_id`
- `symbol`
- `side`
- `qty`
- `entry_window`
- `planned_stop`
- `planned_time_exit`
- `score_total`
- `score_summary`
- `risk_summary`
- `decision_deadline`
- `status`
- `operator_comment`

### 6.3 상태 전이

```text
created
-> pending_review
-> approved
-> rejected
-> expired
-> superseded
```

### 6.4 운영 규칙
- 승인 만료 시점이 지나면 자동 제출하지 않는다.
- operator가 수량/가격을 수정할 수 있는 범위를 제한한다.
- 전략 의미를 바꾸는 수정은 허용하지 않는다.
- 승인/거절/수정 사유는 필수 기록이다.

## 7. Kill Switch

Kill switch는 최소 3종을 지원한다.

### 7.1 soft halt
- 신규 주문만 중단
- 기존 포지션 관리는 계속

### 7.2 hard halt
- 신규 주문 중단
- 기존 미체결 주문 취소
- 기존 포지션은 별도 exit policy 유지

### 7.3 flatten all
- 신규 주문 중단
- 미체결 주문 취소
- 가능한 한 빠르게 모든 포지션 청산

## 8. No-trade / Degraded Mode

### no-trade mode
- signal 계산은 계속하지만 주문은 보내지 않는다.
- 이유 예: 브로커 장애, 구성 오류, 심각한 reconciliation mismatch.

### degraded mode
- 신규 진입은 제한적으로 허용
- overlay 비활성화, auto mode 비활성화, replace 사용 금지 등 축소 운영

## 9. Post-trade Risk Checks

장 종료 후 최소 아래를 검증한다.
- 브로커 포지션과 내부 포지션 일치 여부
- 미체결 주문 잔존 여부
- 계획된 stop/target/time-exit 상태 누락 여부
- trade blotter와 fill ledger 정합성
- operator manual action 기록 반영 여부
