# BAT-027 Verification - Status: verified (배치 범위 — 안 B 토대) - Batch: BAT-027 ## Acceptance Mapping ### REQ-056 (영구 슬롯 스키마, 안 B 부분) | AC | 상태 | Evidence | |----|------|----------| | instance_key·retired_at·`UNIQUE(instance_key, portfolio_id)` 존재 | ✅ | 마이그레이션 009 + test_migration_and_drift(PG) green | | `EXPECTED_SLOT_FIELDS` ↔ daily_slot 컬럼 일치(+instance_key/retired_at) | ✅ | test_contract + test_migration_and_drift(PG) | | 중복 (instance_key, portfolio_id) 거부 | ✅ | 부분 UNIQUE 인덱스(WHERE portfolio_id NOT NULL) | | `entry_count`/슬롯 `trading_date` 컬럼 **부재** | ⏳ 이월(BAT-δ) | 안 B로 유지 — cutover(REQ-064)에서 drop | ### REQ-057 (상태머신 재정의 + 인스턴스 lock) | AC | 상태 | Evidence | |----|------|----------| | 전이 집합 inactive 기준(closed→idle 제거) | ✅ | test_state(allowed/disallowed/size 12) | | 종료 시 inactive 복귀(idle/closed 별칭) | ✅(별칭) | test_state·test_service. 엄밀 literal `inactive` 산출 전면 전환은 BAT-δ | | 인스턴스별 락 비교차 | ✅ | test_state::test_slot_advisory_lock_id_is_instance_scoped | | 동일 슬롯 직렬화(단일 writer) | ✅ | test_service Advisory lock 직렬화 | | holding 로컬 정본 | ✅ | status 로컬(hub 미의존) — 수량 정본 분리는 REQ-062/BAT-γ | ## Evidence - 단위 전체: `375 passed / 35 skipped / 1 deselected`(KIS sandbox live-env 1건 deselect). - PG-gated(실 trex_core_test): `8 passed` — 마이그레이션 009 적용 + 드리프트 가드(instance_key/retired_at 포함) + lifecycle/closed→idle 거부/closed→pending_buy reallocation. - `ruff check trex_core tests` All passed. ## Carried-Over (REQ 완전 충족은 후속 배치) - REQ-056 `entry_count`/`trading_date` 컬럼 drop → **BAT-δ(cutover, REQ-064)**. - REQ-057 literal `inactive` 전면 산출(별칭 제거) → BAT-δ. - admission/capacity(REQ-059)·reconcile(REQ-058)·intent 자산 키(REQ-061)·수량/불일치(REQ-062)·운영자 뷰(REQ-063) → BAT-β/γ. - 따라서 **REQ-056/057 은 본 배치에서 Implemented 로 확정하지 않고 Approved 유지**(토대만 충족; 전체 AC 는 dcy-020 후속 배치 완료 시 confirm-req-implemented). ## Result - Ready for Release: true (BAT-030(δ) 완성·검증(2026-06-10)으로 'dcy-020 전체 delivery 미완' 보류 해소 — confirm-batch-verification 승격) - Blocking Issues: 없음(배치 범위 단위/PG green). 단, dcy-020 REQ 완전 충족은 BAT-β/γ/δ 필요.