blackout: persist session_id across queued intent lifecycle (#375) #385
Reference in New Issue
Block a user
Delete Branch "feature/issue-375-queued-intent-session-id"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
QueuedOrderIntent에session_id필드를 추가해 큐잉 시점 세션 식별자를 저장하도록 변경했습니다._maybe_queue_order_intent()가session_id를 인자로 받아 intent 생성 시 함께 기록하도록 반영했습니다.trading_cycle/run_daily_session에서 이미 계산한runtime_session_id를 큐잉 경로로 전달하도록 연결했습니다.process_blackout_recovery_orders) 시intent.session_id를 우선 사용해 DB 로그의 session_id가 큐잉 시점과 일치하도록 보장했습니다.session_id가 유지되는지 검증했습니다.Scope Mapping
REQ-V3-001TASK-CODE-008TEST-ACC-015Validation
ruff check src/core/blackout_manager.py src/main.py tests/test_blackout_manager.py tests/test_main.pypytest -q tests/test_blackout_manager.pypytest -q tests/test_main.py -k "blackout_queue_overflow_keeps_latest_intent or blackout_queues_order_and_skips_submission or process_blackout_recovery_executes_valid_intents or process_blackout_recovery"python3 scripts/validate_governance_assets.py origin/feature/v3-session-policy-stream...HEADpython3 scripts/validate_ouroboros_docs.pyPR #385 코드 리뷰 — feature/issue-375-queued-intent-session-id
범위:
QueuedOrderIntent에session_id필드 추가 및 blackout 복구 경로에서 원래 session_id 보존✅ 통과 항목
1. 데이터 모델 변경
QueuedOrderIntent에session_id: str필드가 3번째 위치(market_code → exchange_code → session_id)에 추가됨.필수 필드(default 없음)로 선언되어 컴파일 타임에 미전달 감지 가능.
2. 호출 경로 완전성
_maybe_queue_order_intent()호출 4곳 모두session_id=runtime_session_id전달 확인:trading_cycle2061, 2109번 라인 (BUY/SELL 경로)run_daily_session3270, 3308번 라인 (BUY/SELL 경로)3. 복구 경로 session_id 보존
process_blackout_recovery_orders()에서 복구 시 intent에 저장된 session_id를 재사용하는 의도가 명확함.4. 테스트 커버리지
test_blackout_queue_stores_session_id:batch[0].session_id == "KRX_REG"검증test_blackout_recovery_logs_session_id: recovery DB에"NXT_AFTER"session_id 저장 검증5. overflow_drop_count 통합
이 PR이 동시에 #371 overflow 카운터(
_overflow_drop_count,overflow_drop_count프로퍼티)를 포함한 것은#384 머지 이후 충돌 없이 병합된 것으로 확인. 중복 기여 없음.
⚠️ 소견 (Non-blocking)
getattr 방어 접근 불필요
session_id는QueuedOrderIntent의 필수 dataclass 필드이므로, 필드 없이 인스턴스화 자체가 불가합니다.이
getattr폴백은 실제로 도달할 수 없는 브랜치입니다.PR #384에서도 동일한 패턴(
_coerce_nonnegative_int + getattr)을 소견으로 지적했으며,그때와 마찬가지로 직접 접근으로 단순화를 권장합니다:
단, 이 소견은 Non-blocking이며, 현재 구현도 정확히 동작합니다.
결론
LGTM — 핵심 기능(session_id 보존) 완전히 구현됨, 테스트 통과.
getattr 단순화는 후속 PR 또는 리팩터링 기회에 처리 가능.
추가 리뷰 — getattr 단순화 업데이트 확인
커밋:
4f21117 blackout: simplify recovery session_id binding to queued value✅ 소견 반영 확인
getattr폴백 제거 완료.session_id가 필수 dataclass 필드임을 코드가 명확히 반영.LGTM — 추가 소견 없음. 머지 준비 완료.