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>
2.3 KiB
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:
PaperBrokerConfigfrozen 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_brokerpaper 분기를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
PaperBrokerConfigdataclass +DaemonConfig.paper필드 추가(기본값 = 기존PaperBroker()동작).from_env()env 파싱(빈 문자열/공백 토큰 정규화)._build_brokerpaper 분기 주입 +.env.example문서화.- 단위테스트 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 는 단위테스트로 고정.