# 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-1 - `test_run_once_broker_null_sets_fail_closed` — AC-2 - `test_run_once_trading_disabled_sets_fail_closed` — AC-3 - `test_intent_service_buy_rejected_when_entry_not_allowed` — AC-4 - `test_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 경보 요구사항 없음 확인. ### 팀장 검수 요청 사항 1. REQ-115 AC-1 stub 기반 검증으로 `confirm-batch-verification` 진행 가능한지 판단 (portfolio-hub dcy-010 배포 전 단계에서의 기준) 2. 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 영향 없음)