Files
trex-core/docs/batches/bat-009_20260606_paper-broker-env-tuning/implementation.md
T
genichinandClaude Opus 4.8 2f57aad7b2 feat(config): expose paper broker tuning via env (REQ-010 AC-5, BAT-009)
Wire the existing PaperBroker scenario knobs (fill_after_polls /
qty_per_poll / reject_symbols) to daemon env so REQ-011 AC-2 e2e
scenarios (delayed / partial / reject) can be reproduced by a daemon
restart. Unset == prior PaperBroker() behaviour, byte-for-byte (no
regression).

- config.py: PaperBrokerConfig + from_env parsing (TREX_PAPER_*)
- daemon.py: _build_broker injects config.paper into PaperBroker
- .env.example: document the 3 paper tuning keys (paper-only, e2e)
- tests: paper broker defaults + env tuning parsing

SDLC: REQ-010 CHG-20260606-01 (AC-5 added) / -02 (Implemented);
BAT-009 batch-lite release-candidate; REL-001 feedback handoff records
pre-deployment e2e observations incl. event-publisher idle-drop and
paper correlation_id collision (GitHub #4, #5).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-06 16:49:51 +09:00

2.3 KiB

BAT-009 Implementation

  • Status: completed
  • Batch: BAT-009

Plan Summary

  • REQ-010 CHG-20260606-01 / AC-5: paper broker 튜닝 knob(REQ-011 AC-2 지연/부분/거부)을 데몬 env 로 노출. 미설정=기존 PaperBroker() 동작 byte-for-byte(회귀 없음).

Changed Files

  • trex_core/runtime/config.py: PaperBrokerConfig frozen dataclass(fill_after_polls:int=0, qty_per_poll:Optional[int]=None, reject_symbols:frozenset[str]=frozenset()). DaemonConfig.paper 필드(broker=='paper' 일 때만 참조). from_env() 에서 TREX_PAPER_FILL_AFTER_POLLS(int, 기본 0), TREX_PAPER_QTY_PER_POLL(빈 문자열→None), TREX_PAPER_REJECT_SYMBOLS(콤마 분리, 공백/빈 토큰 제거→frozenset) 파싱.
  • trex_core/runtime/daemon.py: _build_broker paper 분기를 PaperBroker(fill_after_polls=config.paper.fill_after_polls, qty_per_poll=config.paper.qty_per_poll, reject_symbols=set(config.paper.reject_symbols)) 로 교체.
  • .env.example: TREX_BROKER=paper 아래 paper 튜닝 키 3개 주석 문서화(미설정=즉시 전량 체결·거부 없음).
  • tests/runtime/test_config_dotenv.py: _KEYS 에 3개 키 추가, test_paper_broker_defaults(미설정=0/None/frozenset()), test_paper_broker_env_tuning(FILL_AFTER_POLLS=2, QTY_PER_POLL=4, REJECT_SYMBOLS="005930, 000660 ," → 2/4/{005930,000660}).

Execution Log

  1. PaperBrokerConfig dataclass + DaemonConfig.paper 필드 추가(기본값 = 기존 PaperBroker() 동작).
  2. from_env() env 파싱(빈 문자열/공백 토큰 정규화).
  3. _build_broker paper 분기 주입 + .env.example 문서화.
  4. 단위테스트 2개 추가, 좁은 테스트 → 전체 회귀 → ruff 순서로 검증.

Validation

  • pytest tests/runtime/test_config_dotenv.py: 6 passed(기존 4 + 신규 2).
  • 전체 pytest --deselect ...::test_sandbox_token_and_submit(네트워크 의존 KIS sandbox 제외): 167 passed, 23 skipped.
  • ruff check trex_core tests: All checks passed.
  • e2e(별도, verification.md 에 상세): 데몬 env 재기동으로 거부 롤백 idle→pending_buy→idle, 지연 체결 +3.7s, 부분 체결 qty 6 누적 +2.5s 재현.

Remaining Risks

  • 없음(저위험). broker=='paper' 일 때만 참조(kis 경로 무시), 미설정=기존 동작. 빈/공백 토큰 edge 는 단위테스트로 고정.