dcy-007(core 자율 안전 매도) 전체 delivery. BAT-010 기반 인프라가 미커밋 상태였고 BAT-011 트리거 레이어와 공유 파일에서 섞여 있어 한 커밋으로 묶음. BAT-010 (REQ-034/035/036/041, release-candidate): - WatchdogStore(application/watchdog.py) + snapshot RPC 워치독 갱신 - Slot stop_loss_price/take_profit_price 필드 + 004_add_price_thresholds.sql - SlotService.sell() 자율 매도 내부 경로 + idempotency - SafetySellConfig env 5종 파싱 BAT-011 (REQ-037/038/039/040/042, release-candidate): - SafetySellService(application/safety_sell.py): forced_close 만기 / stop-loss· take-profit KIS polling / 장 마감 강제 청산 + trex-safety-sell 7번째 스레드 - BrokerPort.get_current_price + KIS inquire-price(TTTC8397R/VTTC8397R, stck_prpr) + paper stub - SlotService.update_thresholds() + intent RPC update_thresholds 액션 (부분 갱신/null 해제, 워치독 last_seen_at 리셋) - baseline 3문서 정합(interface-contract/runtime-flows/project-structure) 거버넌스: REQ-034~042 Implemented 동기화, BAT-010/011 release-candidate, dcy-007 discovery 포함. 검증: 신규 38 테스트 green, 단위 236 passed/23 skipped, 인프라 게이트(PG+RabbitMQ) 259 passed(마이그레이션 001~004 round-trip 포함), ruff clean. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
3.4 KiB
3.4 KiB
BAT-011: safety-sell 트리거 레이어 (forced_close·KIS polling·장 마감 청산 + update_thresholds RPC + baseline 정합)
- Status: release-candidate
- Profile: standard
- Source Discovery: dcy-007
- Included REQ: REQ-037, REQ-038, REQ-039, REQ-040, REQ-042
- Excluded REQ: REQ-034, REQ-035, REQ-036, REQ-041 (safety-sell 기반 인프라 — BAT-010에서 delivery 완료)
Summary
- dcy-007(core 자율 안전 매도)의 트리거 레이어를 delivery한다. BAT-010이 제공한 기반(WatchdogStore,
stop_loss_price/take_profit_price도메인 필드,SlotService.sell(), safety-sell env vars 5종 파싱) 위에 실제 자동 매도를 발동하는 백그라운드 루프와 임계값 갱신 RPC를 추가한다. 구성:forced_close_at만기 루프(REQ-037), stop-loss·take-profit KIS 현재가 polling + 트리거(REQ-038), 장 마감 강제 청산(REQ-039),update_thresholdsintent RPC 액션(REQ-040), 그리고 dcy-007 전체(REQ-034~041)의 baseline 문서 정합(REQ-042).
Scope
- In Scope:
- 신규
trex-safety-sell데몬 worker 스레드 — 기존 6 스레드에 1개 추가. forced_close_at 체크(REQ-037), stop-loss·take-profit 가격 체크(REQ-038), 장 마감 청산(REQ-039)을 통합 루프로 처리. - forced_close_at 만기 감지:
holding+ 워치독 만료 +forced_close_at <= now(KST)→SlotService.sell()(REQ-037) - KIS 현재가 polling 어댑터(
TTTC8397R실전 /VTTC8397R모의,stck_prpr파싱) + 손절/익절 조건 평가 + 쿼터 상한 경고 (REQ-038) - 장 마감 강제 청산:
TREX_MARKET_CLOSE_LIQUIDATION_TIME도래 시 워치독 무관 전체holding청산 + 거래일 1회 발동 가드 (REQ-039) update_thresholdsintent RPC 액션:stop_loss_price/take_profit_price/forced_close_at부분 갱신 + 워치독last_seen_at리셋 + holding-only (REQ-040)- baseline 3문서(
interface-contract.md,runtime-flows.md,project-structure.md) 정합 — dcy-007 REQ-034~041 반영 (REQ-042)
- 신규
- Out of Scope:
- BAT-010이 완료한 기반 인프라(REQ-034 WatchdogStore, REQ-035 도메인 필드/마이그레이션, REQ-036
SlotService.sell(), REQ-041 env 파싱) 재구현 — 본 batch는 호출/참조만 한다. - 가격 임계값 논리 유효성 검증(take_profit > stop_loss 등) — dcy-007/REQ-035 범위 밖.
- KIS 쿼터 초과 시 polling 간격 자동 조정의 동적 튜닝 정책 — 본 batch는 상한 산정 + 경고 로그까지(REQ-038 AC-8). 동적 조정은 후속 후보.
- BAT-010이 완료한 기반 인프라(REQ-034 WatchdogStore, REQ-035 도메인 필드/마이그레이션, REQ-036
Documents
- Planning: planning.md
- Design: design.md
- Implementation: implementation.md
- Verification: verification.md
Notes
- Source discovery는 단일(dcy-007). BAT-010과 같은 Discovery의 후속 batch이며, BAT-010 index의 "BAT-011 예정" 분할 계획과 정확히 일치한다(REQ-037/038/039/040/042).
- 본 batch는 BAT-010과 달리 외부 API(KIS 현재가 polling) 호출과 신규 daemon thread를 도입하므로 standard profile + design 선행이 필요하다(planning.md Design Gate 참조).
- BAT-010 verification의 잔여 R-2(실 PostgreSQL migration
004_add_price_thresholds.sqlround-trip 미검증)를 본 batch 환경에서 함께 검증한다(verification에 evidence 기록 예정). - REQ-042(문서 정합)는 REQ-037~040 구현 완료 후 verification 단계에서 최신 구현 상태를 반영해 수행한다(REQ-042 Notes).