Files
trex-core/docs/batches/bat-004_20260604_broker-execution-and-outbox/verification.md
T
genichinandClaude Opus 4.8 97d58318db Deliver BAT-004: broker execution + KIS adapter + durable handoff
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>
2026-06-04 17:46:17 +09:00

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
  • REQ-012 (KIS adapter):
    • AC1 토큰 발급/갱신 → KIS VTS 모의투자 _ensure_token 라이브 검증(HTTP 200, access_token). PASS (rate-limit 시 self-skip)
    • AC2 주문 접수 → 모의투자 submit_order 005930 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
  • 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
  • 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)
  • 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·연결 풀링은 후속 인계.