Files
trex-core/docs/batches/bat-054_20260628_daystart-credential-kis-inject/verification.md
T
genichinandClaude Sonnet 4.6 6b066e19cb feat(bat-054): 그날-시작 KIS 인증정보 양의 경로 주입 — KISBroker reinitialize (REQ-113 AC-2/AC-4, REQ-115 AC-1)
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
2026-06-28 19:51:48 +09:00

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-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 영향 없음)