실 DB 점검 중 마이그레이션 009 부분 유니크 인덱스가 legacy 풀 데이터(같은 자산이 closed+재진입 holding 으로 portfolio_id 중복)에 적용 불가 → cutover· 데몬 부팅 모두 차단되는 결함 확인. 데이터 보존 cutover 를 폐기하고 DB wipe + 자산 중심 재초기화로 전환(사용자 결정). 빈 테이블에는 009 인덱스가 정상 생성되고 자산 중심에서 (instance_key, portfolio_id)는 설계상 유일. - trex_core/runtime/reset.py 신규(trex-core-reset): slot-core 7테이블 wipe + apply_migrations 재적용 → 자산 중심 스키마 착지 검증. dry-run 기본/--yes 적용, 파괴적·DB 전역. 보유 carry-over 없음(재초기화 후 reconcile_core_holdings 재편입). - runtime/cutover.py + trex-core-cutover console script + test_cutover_rehearsal.py 삭제. - pyproject: trex-core-reset 등록. - tests/runtime/test_reset.py 신규 5건(PG-gated): wipe+착지·dry-run 무변경·멱등· wipe 후 admission·테이블 커버리지. - change-req REQ-064 CHG-20260610-03(cutover→재초기화 재정의) + srs index 갱신. - baseline 4문서(data-model/runtime-flows/project-structure/interface-contract) + BAT-030 design/planning/index/implementation/verification 도구 서술 reset 으로 교체. 검증: ruff clean, 단위 367 passed, PG+RabbitMQ 통합 411 passed/1 skip(KIS sandbox). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
4.0 KiB
4.0 KiB
BAT-030 Planning
- Status: confirmed
- Batch: BAT-030
- Profile: standard
Included REQ
- REQ-064 (Migration, Approved): 풀→영구 자산 슬롯 cutover + 롤백.
- REQ-062 (Integration, Approved 잔여): 청산 수량 브로커 정본(M2(b), execution dispatch).
- REQ-056/057 (잔여): entry_count/trading_date 컬럼 drop, literal inactive + 별칭 제거.
- REQ-065 (Documentation): baseline 마감.
Delivery Plan (전환 순서 — 안전 우선)
- literal inactive 전면화:
state.pyIDLE/CLOSED 별칭 제거(또는 deprecate), 코드가inactive산출.execution.pyPENDING_SELL→INACTIVE·PENDING_BUY→INACTIVE. postgresql/cli/ops_checks 의 'idle'/'closed' → 'inactive'. CHECK 제약 마이그레이션(010: 'inactive' 허용 + 기존 idle/closed→inactive UPDATE). - M2(b) 집행 매도 수량 브로커 정본: dispatch 매도
int(slot.qty)→broker.get_balance()해당 symbol hldg_qty. 미러 stale 무관 정확. - 컬럼 drop:
entry_count·슬롯trading_date(또는 opened_at 재의미) drop 마이그레이션 + 모델/EXPECTED_SLOT_FIELDS/persistence 정합. (legacy preallocation 경로도 제거.) - cutover 마이그레이션(REQ-064): 기존 보유(holding, portfolio_id 보유) 행은 그대로 자산 슬롯; vestigial idle 풀 행(portfolio_id NULL) 정리; instance_key 태깅(009 default 'default'); UNIQUE 부분→전체 승격 검토.
- default 전환: 운영 인스턴스 TOML 에
max_active_slots설정(자산 중심 활성) — 운영자 배포 단계. - baseline 마감(REQ-065) + run-the-app 자산 중심 e2e(test DB).
Dependencies
- Internal: BAT-027/028/029(스키마·상태머신·reconcile·admission·divergence). 전 단계 green.
- External: 전략 모듈 slot_id 계약 전환(BAT-029 dual-accept 로 무중단; portfolio_id 매수 폐기 시 전략 전환 필요).
Design Gate
- Design Required Before Implementation: yes
- Reason: (a) 라이브 데이터 cutover — 보유 포지션 무손실·롤백·in-flight(pending) 처리·운영자 입회 절차를 설계에서 확정. (b) literal inactive 전환은 BAT-027 별칭의 역-cascade(코드+CHECK 마이그레이션+다수 테스트). (c) 집행 dispatch 매도 수량 변경은 라이브 주문 동작. (d) 컬럼 drop 은 비가역 — 순서·롤백 필수. → design.md 확정 후 구현 전 체크포인트.
Milestones
- M1 — literal inactive + CHECK 마이그레이션(010) + 별칭 제거 + 테스트
- M2 — 집행 매도 수량 브로커 정본
- M3 — entry_count/trading_date drop 마이그레이션 + 정합
- M4 — cutover 마이그레이션(REQ-064) + 리허설(test DB)
- M5 — baseline 마감 + run-the-app 자산 중심 e2e
Risks
- R-live (High): 라이브 cutover 로 보유 포지션 손실/집행 중단. 대응: 보유 행 보존(이미 portfolio_id 보유)·거래 세션 외 실행·롤백 스크립트·운영자 입회·리허설(test DB) 선행.
- R-irreversible (High): 컬럼 drop 비가역. 대응: drop 전 백업, 단계적(코드 미참조화 → drop), 롤백은 직전 리비전+컬럼 복원.
- R-cascade (Medium): literal inactive 역전환의 테스트/코드 cascade. 대응: BAT-027 별칭 지점 일괄 전환 + 회귀 green 게이트.
- R-exec (Medium): 집행 매도 qty 변경 회귀. 대응: 단위+리허설, 미러 fallback 없이 broker 권위.
Notes
- 실 cutover 는 운영자 실행(본 배치는 마이그레이션·코드·리허설 제공). confirm-release 전 cutover 리허설 + run-the-app evidence 필수.
- green 기준: 단위 전체 회귀(literal inactive·drop 무파손) + cutover 리허설(보유 보존·롤백) + 자산 중심 e2e.
갱신 (2026-06-10, CHG-20260610-03)
- M4 의 데이터 보존 cutover 도구(
trex-core-cutover)는 폐기되고 DB 재초기화 도구(trex-core-reset: slot-core wipe + 마이그레이션 재적용)로 대체. 마이그레이션 009 부분 유니크 인덱스가 legacy 풀 중복 데이터에 적용 불가한 결함이 직접 원인. 보유 carry-over 불요(재초기화 후 reconcile 재편입).