config 게이트 이중 경로(max_active_slots 설정 시 자산 중심, 미설정 시 legacy pool). 운영 데몬은 cutover(BAT-δ) 전까지 pool 무중단. - repository: find_slot_by_portfolio·count_active(holding+pending_buy+pending_sell)· reconcile_universe(생성 멱등/soft-retire/tombstone, allow_retire 가드) — protocol+in_memory+PG (PG: ON CONFLICT (instance_key, portfolio_id) WHERE portfolio_id IS NOT NULL) - snapshot_scheduler: run_once swap 직후 _reconcile_slots(빈 universe skip, ≥50%↓ retire 보류) - intents: _admit_buy 모드 분기 + _admit_buy_asset_centric(활성화/already_active/ capacity_full/unknown_portfolio/over-cap, 인스턴스 lock) - daemon: instance_key·max_active_slots·reconcile_enabled·trading_date_fn 배선 - 신규 테스트: test_universe_reconcile(6), test_asset_centric_admission(6), PG reconcile(1) 검증: 단위 387 passed / 35 skipped, PG-gated 17 passed, ruff clean. legacy 무파손. REQ-058/059/060 은 Approved 유지(자산 중심 경로 도입 검증; default 전환·cutover 는 BAT-δ). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2.1 KiB
2.1 KiB
BAT-028 Implementation
- Status: completed
- Batch: BAT-028
구현 요약
- config 게이트 이중 경로(D1).
max_active_slots설정 시 자산 중심(reconcile + FCFS/M admission), 미설정 시 legacy pool. 운영 데몬은 cutover 전까지 pool 무중단.
변경 내역
M1 — REQ-060 config (max_active_slots)
runtime/config.py:DaemonInstanceConfig.max_active_slots/DaemonConfig.max_active_slots(Optional[int]) + from_toml(>0 검증) + from_config 전파.
M2 — REQ-058 universe reconcile
domain/slot/repository.py(protocol)·in_memory_repository.py·adapters/persistence/postgresql.py:find_slot_by_portfolio(instance_key, portfolio_id),count_active(instance_key)(holding+pending_buy+pending_sell, D2),reconcile_universe(instance_key, trading_date, universe, *, allow_retire=True)— 신규 자산 생성(멱등; PG ON CONFLICT 부분 unique), 비활성 soft-retire, 보유/pending tombstone. PG insert status='idle'(별칭).application/snapshot_scheduler.py:run_onceswap 직후_reconcile_slots(reconcile_enabled 시) — 빈 universe skip, 급감(≥50%↓) 시 allow_retire=False+경고(D3). instance_key/trading_date_fn 주입.
M3 — REQ-059 자산 중심 admission
application/intents.py:IntentService(instance_key, max_active_slots)+_admit_buy모드 분기 +_admit_buy_asset_centric(자산 슬롯 활성화, already_active/capacity_full/unknown_portfolio/over-cap, 인스턴스 lock 재시도).runtime/daemon.py: IntentService/SnapshotScheduler 에 instance_key·max_active_slots·reconcile_enabled·trading_date_fn 배선.datetimeimport 추가.
테스트
- 신규: tests/domain/slot/test_universe_reconcile.py(6), tests/application/test_asset_centric_admission.py(6), test_postgresql_repository.py::test_universe_reconcile_pg(PG).
- legacy 회귀: max_active_slots 미설정 시 기존 pool 경로 무파손.
검증 실행
- 단위 전체: 387 passed / 35 skipped / 1 deselected. ruff clean.
- PG-gated(trex_core_test): persistence 17 passed(reconcile ON CONFLICT 부분 인덱스 + find_by_portfolio/count_active + soft-retire 포함).