`trex-core slots` 가 snapshot RPC 의 universe `assets`(portfolio)를 슬롯 상태로 오인 표시하던 갭 정정. snapshot envelope 이 슬롯 상태를 운반하지 않아 발생 (10개 슬롯인데 universe 1개·status 없음 — BAT-007 HTTP 슬롯 read 제거 후 슬롯 상태 read 표면 부재가 근인). - REQ-028 (CHG-20260608-01): snapshot envelope 에 read-only per-slot `slots[]` additive 추가(AC-4). strategy `assets[]`(universe, no-price) 불변. - REQ-032 (CHG-20260608-03): `_cmd_slots` 가 envelope `slots[]`(실제 슬롯 상태) 표시 + `--status` 를 슬롯 status 기준 client-side 필터 + watchdog 결합. `universe` 는 `assets[]` 유지. `universe --json` 도 universe 데이터로 scope. - canonical `portfolio.slot_to_dict` 단일화 — BAT-007 stub / BAT-008 envelope 두 경로가 동일 슬롯 스키마(외부명 `entry_price` 유지, dcy-012 호환). - interface-contract 에 `slots[]` 계약 + `assets[]` vs `slots[]` 구분 반영. 검증: 단위 338 passed + ruff clean + 신규 코드 데몬으로 실 PostgreSQL/RabbitMQ 운영 재현 PASS(slots=10·status·DB 일치·universe 분리·비침습). REQ-028/032 Implemented, BAT-022 release-candidate. pytest 인프라 게이트는 Human Approval Memo 수용(운영 재현이 실 경로 커버). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
4.0 KiB
4.0 KiB
BAT-022 Planning
- Status: draft
- Batch: BAT-022
- Profile: standard
Included REQ
- REQ-028 (Interface, change-req CHG-20260608-01): snapshot envelope 에 read-only per-slot
slots[]추가(AC-4). strategyassets[]불변. - REQ-032 (Interface, change-req CHG-20260608-03):
trex-core slots가 universeassets[]대신 envelopeslots[](실제 슬롯 상태) 표시.universe는assets[]유지.
Delivery Plan
- REQ-028(서버 envelope):
trex_core/application/portfolio.pybuild_snapshot_envelope에slots[]산출 추가 —slot_repo.list_slots(day)로 per-slot 상태(slot_id/status/symbol/qty/limit_price/avg_price/portfolio_id) 매핑. 빈 배열은[].assets[]/meta/degraded 불변. (필요 시messaging_handlers.py핸들러 배선 확인.) - REQ-032(CLI):
trex_core/runtime/cli.py_cmd_slots가resp.get("slots", [])를 읽어 슬롯 상태(status 포함) 출력.--status all|held|holding|buyable를 슬롯 status 기준으로 필터. watchdog-owned 표시(기존)를slots[]항목과 결합(slot 의 portfolio_id ↔ watchdog expired 매칭)._cmd_universe는assets[]유지. - 문서: interface-contract 의 snapshot 응답에
slots[]필드 계약 추가(REQ-028 Impacted). runtime-flows 필요 시 보강. - 테스트: envelope
slots[]스키마(빈 배열·status enum) +slotsCLI 가 실제 슬롯 상태 표시(universe 와 구분) + 전체 회귀 + ruff + 인프라 게이트.
Dependencies
- Internal:
- dcy-005/BAT-008 snapshot envelope(REQ-028) — 확장 대상.
- dcy-016/BAT-020 운영자 CLI
slots(REQ-032) — 정정 대상(현재 universe 표시). - dcy-017/BAT-021 envelope
watchdog[]additive 동봉 — 동일 패턴 선례 + CLI 결합 표시. SlotRepository.list_slots/Slot 모델(status/limit_price/avg_price/portfolio_id) — slots[] 산출 소스.
- External:
- 없음.
Design Gate
- Design Required Before Implementation: yes
- Reason: (a) snapshot envelope 은 strict 계약(REQ-028 AC-1~3:
assets[]null 금지·가격 제외 등)이라slots[]를 additive top-level 필드로 두어 기존 strategy 계약을 비파괴해야 한다 — 필드 경계·스키마를 설계에서 고정. (b)slots[]항목 스키마(어떤 Slot 필드를 노출/제외할지 — 가격은limit_price/avg_price노출하되 strategyassets[]의 no-price 규칙과 혼동 없게) 확정. (c)slots[](슬롯 단위) ↔watchdog[](슬롯 단위) ↔assets[](portfolio 단위)의 키 관계(portfolio_id/slot_id)와 CLI 결합 표시 규칙 고정. (d)--status필터 의미를 universe view(all/buyable/held)가 아닌 슬롯 status(idle/holding/pending_*) 기준으로 재정의. → design.md 동일 턴 scaffold.
Milestones
- M1 — REQ-028 envelope
slots[]산출 + 스키마 테스트 green - M2 — REQ-032
slotsCLI 가 슬롯 상태 표시(+watchdog 결합), universe 와 구분 - M3 — interface-contract
slots[]계약 정합 - M4 — 전체 회귀 + ruff + 인프라 게이트
Risks
- R-1 (Medium):
slots[]추가가 strict envelope(REQ-028 AC-1~3)·기존 strategy 소비자를 깨뜨림. 대응: additive top-level 필드로만 추가,assets[]/meta 불변, 기존 envelope 테스트 green 유지. - R-2 (Medium):
--status필터 의미 변경(universe view → 슬롯 status)이 기존slots사용자 기대와 다름. 대응: design 에서 필터 매핑 명시, verification 에서 status별 케이스 검증. - R-3 (Low):
slots[]와assets[]혼동(둘 다 symbol/portfolio_id 포함). 대응: CLI 출력에 슬롯 status 컬럼을 1급으로 표시, 문서에서 universe vs slots 구분 명시.
Notes
- 1차 게이트: 전체 회귀 green(snapshot strategy 계약·슬롯 도메인 무회귀 — 노출 필드만 추가).
slots[]검증은 operator(touch_watchdog=false) 요청으로 비침습 확인(조회가 워치독 리셋 안 함, dcy-016).- 가격 노출:
slots[]는 운영자용이라limit_price/avg_price노출 OK(REQ-028 AC-3 의 no-price 는 strategyassets[]한정).