BAT-053 스캐폴드에서 연기된 양의 경로 완성: - KISBroker.reinitialize(credential): app_key/app_secret/account_ref 교체 + L1 token 무효화 - SnapshotScheduler에 kis_reinit_callback 주입 지점 추가; 그날-시작 성공 시 callback 호출 - daemon.py에 _build_kis_reinit_callback() 헬퍼 + SnapshotScheduler 조립 수정 - 신규 테스트 12개 추가: 757 passed / 47 skipped (기존 745 대비 +12, 회귀 0) 안전 불변식 유지: - credential_fetch_enabled=False(기본) 경로 byte-for-byte 보존 - fail-closed 불변식 미파괴 (reinit 실패 시 entry_allowed 유지) - AMQP wire 계약 변경 없음 Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01VHtM5Ws1HKCKQ4JGi6GRb5
6.9 KiB
BAT-054: Verification
- Status: draft
- Batch: BAT-054
Acceptance Mapping
REQ-113 — KISConfig 소스 우선순위 (미충족 AC)
AC-2: Given TOML에 credential_fetch_enabled = true이고 portfolio-hub fetch가 유효한 BrokerCredentialPayload를 반환, When 데몬 기동(그날-시작), Then KISConfig.app_key, KISConfig.app_secret, KISConfig.account_ref가 fetch 결과로 구성된다.
- Evidence:
test_kis_reinit_callback_called_on_success— fetch 성공 시 callback이BrokerCredentialPayload(account_ref="stub-account", app_key="stub-app-key", app_secret="stub-app-secret")으로 호출됨 확인. PASSED. - Evidence:
test_kis_broker_reinitialize_updates_credentials—KISBroker.reinitialize(cred)호출 후broker._account_ref/app_key/app_secret이 cred 값으로 교체됨 + L1 token 무효화 확인. PASSED. - Evidence:
test_build_kis_reinit_callback_returns_callable_for_kis— broker=kis + fetch enabled 시 callback callable 반환 + 실제 broker.reinitialize 동작 확인. PASSED. - Note: 실 KISBroker를 KIS API에 연결한 통합 테스트는 portfolio-hub dcy-010 배포 후 가능. 현재 stub 기반으로 핵심 경로 검증.
AC-4: Given break-glass 활성화 상태, When 데몬 기동 로그 확인, Then break-glass 활성화 사실이 INFO로 기록된다.
- Evidence (보강):
test_break_glass_log_contains_break_glass_keyword—TREX_KIS_BROKER_BREAK_GLASS=true시 로그에 "break-glass" 키워드 포함 확인. PASSED. - Note: BAT-053에서 break-glass 경로는 구현되었으나 로그 content assert가 없었음. 이번 batch에서 추가.
REQ-113 AC-1, AC-3, AC-5, AC-6, AC-7: BAT-053 Implemented. 회귀 없음 (전체 스위트 757 passed, 회귀 0).
REQ-115 — 그날-시작 장중 무중단 (미충족 AC)
AC-1: Given 그날-시작 로드 성공(credential_fetch_enabled = true) 후 portfolio-hub를 내려(장중 장애 주입), When BuyIntent 또는 SellIntent를 처리, Then KIS 브로커 어댑터가 캐시된 인증정보로 주문을 처리하고 PortfolioHubUnavailableError로 인해 주문이 차단되지 않는다.
- Evidence:
test_kis_reinit_callback_called_on_success— 그날-시작에 callback(=broker.reinitialize)이 호출됨으로써 KISBroker가 fetched 인증정보로 업데이트됨. PASSED. - Evidence:
test_kis_broker_reinitialize_updates_credentials— reinitialize 후 broker가 새 인증정보 보유, 이후 KIS API 호출은 broker 자체 인증정보로 수행 (portfolio-hub 불필요). PASSED. - Evidence:
test_kis_reinit_callback_failure_does_not_flip_entry_allowed— reinit callback 실패 시에도 entry_allowed 유지 (기존 env 인증정보로 계속 운행). PASSED. - Note: 장중 portfolio-hub 다운 상태에서 실 KISBroker 주문 처리를 끝까지 검증하려면 통합 테스트 환경이 필요. 현재 stub 기반으로 핵심 속성(reinitialize 완료 후 broker가 portfolio-hub와 분리됨) 검증.
AC-3: Given 그날 로드 성공 후 portfolio-hub가 잠시 다운되었다가 복구, When 그날 중 재fetch 트리거 없음, Then 그날 인증정보는 재load 없이 최초 fetch 값 그대로 유지된다.
- Evidence:
test_kis_reinit_callback_cached_for_day_not_called_twice— 동일 날 두 번째 run_once에서 callback 재호출 없음(캐시 hit). PASSED. - Evidence:
test_successful_credential_cached_for_day(BAT-053) — fetch count = 1 유지. PASSED.
REQ-115 AC-2, AC-4, AC-5, AC-6: BAT-053 Implemented. 회귀 없음.
Evidence
Test Results
pytest tests/ -q
757 passed, 47 skipped in 1.59s
기존 베이스라인: 745 passed, 47 skipped (BAT-053 완료 시점) 이번 batch 신규 테스트: +12 (29 total in test_snapshot_scheduler.py) 회귀: 0
신규 테스트 목록 (12개)
| 테스트명 | 검증 AC | 결과 |
|---|---|---|
test_kis_reinit_callback_called_on_success |
REQ-113 AC-2, REQ-115 AC-1 | PASS |
test_kis_reinit_callback_not_called_when_fail_closed |
REQ-113 AC-2 | PASS |
test_kis_reinit_callback_not_called_when_disabled |
REQ-113 AC-1 회귀 | PASS |
test_kis_reinit_callback_failure_does_not_flip_entry_allowed |
설계 안전망 | PASS |
test_kis_reinit_callback_cached_for_day_not_called_twice |
REQ-115 AC-3 | PASS |
test_kis_reinit_callback_none_when_break_glass |
REQ-113 AC-3 + AC-2 | PASS |
test_break_glass_log_contains_break_glass_keyword |
REQ-113 AC-4 보강 | PASS |
test_kis_broker_reinitialize_updates_credentials |
REQ-115 AC-1, REQ-113 AC-2 | PASS |
test_kis_broker_reinitialize_preserves_base_url_and_flags |
REQ-115 AC-1 | PASS |
test_build_kis_reinit_callback_returns_none_for_paper |
REQ-113 AC-2 | PASS |
test_build_kis_reinit_callback_returns_none_when_disabled |
REQ-113 AC-1 | PASS |
test_build_kis_reinit_callback_returns_callable_for_kis |
REQ-113 AC-2, REQ-115 AC-1 | PASS |
fail-closed 불변식 회귀 확인
BAT-053 구현 테스트 17개 모두 PASS:
test_run_once_no_credential_fetch_when_disabled— opt-in off 회귀test_run_once_portfolio_hub_unavailable_sets_fail_closed— AC-1test_run_once_broker_null_sets_fail_closed— AC-2test_run_once_trading_disabled_sets_fail_closed— AC-3test_intent_service_buy_rejected_when_entry_not_allowed— AC-4test_intent_service_sell_passes_when_entry_not_allowed— AC-5- 기타 기존 12개 PASS
Result
- Ready for Release: false
- Blocking Issues:
- 없음 (코드/테스트 레벨 구현 및 검증 완료)
- Missing evidence (비차단):
- REQ-115 AC-1 통합 검증: 실 portfolio-hub + 실 KIS mock(openapivts) 환경에서 그날-시작 fetch → KISBroker reinitialize → 장중 주문 처리까지의 end-to-end 검증은 portfolio-hub dcy-010 배포 후 가능. 현재 stub 기반 단위 검증으로 충분하다고 판단하나, 팀장 확인 필요.
- REQ-113 AC-9 (break-glass 전용 경보): BAT-053 Notes에 기재된 "AC-9 전용 테스트 보강"은 REQ-113에 AC-9 항목이 없음을 확인 (AC는 1~7까지). BAT-053 Notes의 "AC-9"는 REQ-114 AC-9(그날 고정 상태)를 지칭하며, 이는
test_entry_allowed_fixed_for_day_no_refetch(PASS)로 커버됨. 별도 break-glass 경보 요구사항 없음 확인.
팀장 검수 요청 사항
- REQ-115 AC-1 stub 기반 검증으로
confirm-batch-verification진행 가능한지 판단 (portfolio-hub dcy-010 배포 전 단계에서의 기준) - REQ-113 Status 갱신 권한: 이번 batch 완료로 AC-2/AC-4 충족 → Status
Approved→Implemented갱신 여부
QC 체크리스트 (qc-reviewer용)
- BAT-054 신규 테스트 12개 독립 실행 PASS 확인
- fail-closed 불변식 미파괴 확인 (opt-in=False 경로에서 gateway 비활성,
entry_allowed_fn=None) - app_secret 평문 로그 미노출 확인 (기존 AC-7 테스트 PASS, reinitialize 로그 없음)
- domain 순수성 불변 확인 (
trex_core/domain/변경 없음) - AMQP wire 계약 변경 없음 확인 (trex-orb-v1/trex-tsl-v1 영향 없음)