# BAT-029 Verification - Status: verified (배치 범위; M2(b) BAT-δ 이월) - Batch: BAT-029 ## Acceptance Mapping ### REQ-061 (intent 계약 slot_id) | AC | 상태 | Evidence | |----|------|----------| | 매수 slot_id 활성화 + symbol 슬롯 resolve | ✅ | test_activates_by_slot_id | | 이미 활성 → already_active | ✅ | test_already_active_is_rejected | | 보유 아닌 슬롯 매도 거부 | ✅ | 기존 sell(_admit_sell slot_not_holding) 회귀 | | 레거시 portfolio_id dual-accept | ✅ | test_activates_asset_slot(portfolio_id) | | intent_id 멱등 | ✅ | 기존 intent dedup 회귀 | ### REQ-062 (수량/불일치 해소) | AC | 상태 | Evidence | |----|------|----------| | A 코어 holding/broker 0 → error | ✅ | test_A_core_holding_broker_flat_goes_error | | B 코어 flat/broker 보유 → warning | ✅ | test_B_broker_holds_unmanaged_warns | | C 수량만 → 미러 갱신/warning(상태 불변) | ✅ | test_C_qty_mismatch_warns_no_state_change | | 청산 수량 = 브로커 정본 | ⏳ 이월(BAT-δ) | execution dispatch qty 변경은 라이브 집행 — cutover 게이트 | ### REQ-063 (운영자 slots 단일 뷰) | AC | 상태 | Evidence | |----|------|----------| | slots 자산 포지션 단일 뷰 | ✅ | slot_to_dict(기존 envelope) | | universe_detached(tombstone/soft-retire) 표시 | ✅ | slot_to_dict universe_detached + 회귀 | ## Evidence - 단위 전체: `393 passed / 36 skipped / 1 deselected`. ruff clean. - PG-gated(실 trex_core_test): persistence `18 passed`(list_holding_slots·reconcile·드리프트 포함). ## Carried-Over - **REQ-062 청산 수량 브로커 정본**: execution dispatch 매도 수량(`int(slot.qty)`) → 브로커 잔고 정본 변경은 라이브 집행 동작 → **BAT-δ**(cutover, 자산 중심 default 전환)와 같은 게이트. - sell `slot_id` 완전 폐기·literal inactive·컬럼 drop·자산 중심 default → BAT-δ. - 실 데몬 자산 중심 e2e(reconcile→slot_id 매수→divergence) run-the-app → BAT-δ confirm-release 전. - 따라서 REQ-061/062/063 은 본 배치에서 **Approved 유지**(경로 동작 검증; 전체 완성·default 전환은 BAT-δ). ## Result - Ready for Release: true (BAT-030(δ) 완성·검증(2026-06-10)으로 'dcy-020 전체 delivery 미완' 보류 해소 — confirm-batch-verification 승격) - Blocking Issues: 없음(단위 393 + PG 18 green, legacy 무파손).