Implement REQ-011~015 (dcy-003): the order-execution layer on top of the BAT-002 slot-core daemon, connecting intents to real orders. - application: BrokerPort (submit/poll_fill/cancel) + ExecutionService (claim -> submit -> poll -> transition -> rollback -> reconcile) - adapters/broker: PaperBroker (deterministic async double) and KISBroker (KIS Open API: token, order-cash, inquire-daily-ccld, cancel; VTS sandbox tr_ids; live account gated behind allow_live) - persistence: option-A execution queue (find_pending_for_dispatch FOR UPDATE SKIP LOCKED, mark_dispatched idempotency guard, clear_dispatch) - runtime: background execution loop in the daemon lifespan + startup reconcile; config selects paper|kis Verification (real KIS VTS 모의투자 + PostgreSQL): 92 passed, ruff clean, domain import sweep shows zero broker/web/db deps, buy->holding / sell->closed / reject->idle, idempotent dispatch (exactly one order), reconcile after crash creates no duplicate order, KIS sandbox token+submit round-trip, and a daemon E2E through the background loop. Align the four baseline docs. BAT-004 -> release-candidate; REQ-011~015 -> Implemented. KIS live-account go-live, partial-fill accrual, option-B outbox, connection pooling, and the safety floor remain deferred to follow-up Discoveries. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
4.0 KiB
4.0 KiB
BAT-004 Verification
- Status: confirmed
- Batch: BAT-004
Acceptance Mapping
- REQ-011 (BrokerPort + paper double):
- AC1 submit→poll 비동기(동기 단축 없음) →
test_submit_does_not_synchronously_fill. PASS - AC2 결정적 fill 시나리오(즉시/N틱/부분/거부) →
test_fills_after_configured_polls/test_immediate_fill/test_partial_then_full/test_reject. PASS - AC3 도메인 순수성 → import 스윕:
trex_core/domain/broker/fastapi/psycopg/httpx 의존 0. PASS
- AC1 submit→poll 비동기(동기 단축 없음) →
- REQ-012 (KIS adapter):
- AC1 토큰 발급/갱신 → KIS VTS 모의투자
_ensure_token라이브 검증(HTTP 200, access_token). PASS (rate-limit 시 self-skip) - AC2 주문 접수 → 모의투자
submit_order005930 limit buy, 구조화 응답(accepted/reason). PASS - AC3 체결 조회 →
poll_fill(inquire-daily-ccld) 구현; 모의투자 미체결 시 accepted 반환. PASS(구현) - AC4 모의/실계좌 게이팅 →
test_live_base_url_requires_allow_live(live URL allow_live=False → RuntimeError). PASS - AC5 오류 처리 → 네트워크/HTTP 오류 시 OrderAck(accepted=False, reason)·FillStatus(unknown), 슬롯 무오염. PASS
- AC1 토큰 발급/갱신 → KIS VTS 모의투자
- REQ-013 (execution loop):
- AC1 매수 claim·멱등 →
test_buy_dispatch_is_idempotent_no_double_order(broker 주문 정확히 1). PASS (NFR-2) - AC2 매수 체결→holding →
test_buy_lifecycle_to_holding(avg_price/qty). PASS - AC3 거부 롤백→idle →
test_buy_reject_rolls_back_to_idle. PASS - AC4 매도 체결→closed →
test_sell_lifecycle_to_closed_bumps_entry_count. PASS - AC5 단일 writer → 집행 루프도 SlotService(advisory lock)로만 전이(코드/도메인 순수성). PASS
- AC1 매수 claim·멱등 →
- REQ-014 (durability + reconciliation):
- AC1/AC2 송신후/전 크래시 →
test_reconcile_after_crash_completes_fill_without_redispatch(재폴링 fill, 신규 주문 0). PASS - AC3 체결 수렴 → 동 테스트 holding 수렴. PASS
- AC4 멱등 재틱 →
mark_dispatched조건부 UPDATE + find(broker_order_id IS NULL); idempotent 테스트. PASS (NFR-3)
- AC1/AC2 송신후/전 크래시 →
- REQ-015 (baseline 정합):
- AC1 runtime-flows 집행 루프/reconcile 흐름 추가. PASS
- AC2 project-structure broker/execution 레이어 반영. PASS
- AC3 interface-contract(BrokerPort)/data-model(broker_order_id 실행큐·멱등) 반영. PASS
Evidence
- Test:
pytest— 92 passed(PG + KIS sandbox 토큰 가용 시) / 91 passed + 1 skipped(KIS 토큰 rate-limit 시 sandbox self-skip) / 83 passed + 9 skipped(env 없음). ruff clean.- paper: submit/fill/partial/reject; execution: buy→holding, sell→closed, reject→idle, 멱등(주문 1), reconcile(신규 주문 0).
- KIS: 계정분해/모의 tr_id/라이브 게이팅 단위 + KIS VTS 모의투자 토큰+주문 라이브 round-trip 통과(이 세션 확인).
- Manual: 도메인 import 스윕 broker/web/db 의존 0. 데몬 E2E(PostgreSQL + 백그라운드 execution 루프): buy intent→loop→holding→sell intent→loop→closed→capacity 확인.
- Logs: implementation.md Validation 절 + 본 batch 작업 로그.
Baseline Sync Evidence (Architecture Impact = both)
- runtime-flows.md:
주문 집행 루프(dispatch/poll/reconcile) flow 추가. - project-structure.md: application(broker_port/execution)·adapters/broker(paper,kis)·runtime(execution 루프) 트리 반영.
- interface-contract.md / data-model.md: BrokerPort 경계 + broker_order_id 실행큐·멱등 의미 Change Log 반영.
Result
- Ready for Release: true
- Blocking Issues:
- 없음. paper 경로(REQ-011/013/014)는 완전 결정적 검증. KIS(REQ-012)는 모의투자 라이브 round-trip 통과(토큰 rate-limit 시 graceful self-skip — 비차단).
- 비차단 잔여: KIS 모의투자 체결은 시장 개장/잔고에 따라 비결정적(미체결 가능) — 완전 체결 lifecycle 은 paper 로 보장. 부분체결 누적·옵션 B outbox·실계좌 라이브 go-live·연결 풀링은 후속 인계.