# D-012: 포지션 소유권 및 자금/리스크 관심사 분리 (2026-03-12)

> Ante 설계 결정 기록.
> 인덱스: [README.md](README.md)

**결정**: 포지션은 Trade 모듈이 단일 소유자(Single Source of Truth). Treasury는 현금(예산)만 관리. 미실현 손익 기반 리스크 모니터링은 Rule Engine이 담당.

**배경**:
- Treasury(구 FundManager)와 Trade 모듈이 각각 독립적으로 `positions` 테이블과 인메모리 포지션을 관리하여 이중화 문제 발생
- 두 모듈의 포지션 스키마가 불일치 (quantity: REAL vs INTEGER, 필드 구성 상이)
- 동일 이벤트(OrderFilledEvent)를 양쪽에서 구독하여 데이터 불일치 위험

**결정 내용**:

| 관심사 | 담당 모듈 | 근거 |
|--------|----------|------|
| 포지션 (보유 수량, 평균가, 실현 손익) | **Trade 모듈** | 거래 기록의 파생물이므로 거래 기록과 한 곳에서 관리 |
| 예산 (할당, 예약, 가용 잔고) | **Treasury** | "자금팀" 역할 — 배분/예약/정산만 담당 |
| 리스크 (미실현 손실 한도, 노출 한도) | **Rule Engine** | 전략별로 다른 임계값 설정 가능 → AI 전략 자유도 극대화 |

**근거**:
- 포지션을 거래 기록/회계 관점으로 정의 — 체결의 누적 결과이므로 Trade 모듈이 자연스러운 소유자
- Treasury가 포지션+리스크까지 담당하면 역할이 비대해지고, 전략별 리스크 설정 유연성이 떨어짐
- 자금 제약(예산 한도)과 리스크 제약(평가손실 한도)을 분리해야 AI 전략에 최대 자유도 부여 가능
- Rule Engine의 전략별 룰로 공격적 전략에는 넓은 손실 허용, 보수적 전략에는 좁은 허용 설정 가능

**영향 범위**:
- `treasury.md` (구 `fund-manager.md`): Position 데이터클래스, positions 테이블, 포지션 관련 메서드 제거. BotFunds → BotBudget으로 단순화. 모듈명 FundManager → Treasury로 변경
- `trade.md`: 포지션 단일 소유자 명시, 다른 모듈의 포지션 조회 경로 정리
- `rule-engine.md`: TradeService 의존성 추가, UnrealizedLossLimitRule 추가

---
