BAT-035 (dcy-025): trex.snapshot.req → trex.slots.req 즉시 교체
- topology: SNAPSHOT_REQ_QUEUE 제거, SLOTS_REQ_QUEUE = "trex.slots.req" 추가
- portfolio.py: View/build_snapshot_envelope/SnapshotEnvelope/_asset_to_dict 제거;
slot_to_dict 시그니처 확장(snapshot_store/watchdog_store/pause_store/watchdog_timeout_sec)
— asset_quantity(hub)/cash_balance/cash_estimated/warned/watchdog{}/paused 병합 (REQ-074)
- messaging_handlers.py: make_snapshot_rpc_handler 제거, make_slots_rpc_handler 추가
— filter(all/inactive/pending/holding/error) + spy(bool) 처리; strategy 필드 제외 (REQ-073/074)
- daemon.py: _snapshot_rpc_loop → _slots_rpc_loop, make_slots_rpc_handler 연결
- cli.py: universe/slots → slots_queue + spy=True + server-side filter; buyable→inactive 매핑 (REQ-063)
- rabbitmq.py: snapshot_queue → slots_queue
- docs: interface-contract.md + runtime-flows.md slots.req 계약으로 업데이트 (REQ-075)
- REQ-028: Implemented → Deprecated (코드 삭제 완료)
- 테스트: test_snapshot_handler/selection/rpc_watchdog/messaging_snapshot_consumer 삭제;
test_slots_handler.py(신규, 13 cases), test_killswitch_masking_resume 재작성,
test_ledger_option_d._apply_cash_estimate → slots handler 경유, test_topology/cli_operator 갱신
BAT-036 (dcy-024): per-instance safety_sell_enabled 플래그
- config.py: DaemonInstanceConfig + DaemonConfig 에 safety_sell_enabled: bool = True 추가;
from_toml 파싱, from_config 전파
- daemon.py: start() workers 조건부 — safety_sell_enabled=false 시 trex-safety-sell 미기동 + WARNING
- tests: test_instance_config.py 에 safety_sell_enabled 파싱 3개 케이스 추가
REQ: 073/074/075/021/034/063/048/005 Approved → Implemented
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
22 KiB
0. 문서 상태
이 문서의 현재 상태와 식별 정보를 기록한다. 문서 추적과 승인 흐름에 필요한 최소 메타데이터를 적는다.
- 상태: confirmed
- 문서 ID: dcy-025_20260611_strategy-read-surface-slots-req
- 이슈명: 전략 read 표면 재설계 —
trex.snapshot.req→trex.slots.req+ 슬롯 상태 필터 + 슬롯 단일 행(assets[]/available_slots/watchdog[] 흡수·제거) - 작성 시각(KST): 2026-06-11 12:38 KST
- 마지막 갱신 시각(KST): 2026-06-11 14:05 KST (draft-req 완료: REQ-073/074/075 신규 + REQ-021/034/063 change-req(Approved 강등) + REQ-028 폐기 예정 forward-link)
- 대체됨: 없음
- 후속 Discovery 참조: 전략↔자산 할당 모델(portfolio-hub 주도 다중 전략 설정) — 미생성, 후속 예정(본 표면에 strategy 필드 additive 추가 시점)
- 생성된 REQ 참조: REQ-073(slots.req RPC 계약), REQ-074(슬롯 단일 행 스키마), REQ-075(baseline 정합). 변경 REQ: REQ-021/034/063(각 CHG-20260611-01, Implemented→Approved), REQ-028(CHG-20260611-01, keep-current — delivery 배치에서 Deprecated 전환)
1. 계획 상태 요약
현재 Discovery가 어떤 배경에서 작성되고 있는지, 연계 문서가 있는지, 지금 시점의 해석이 무엇인지 짧게 요약한다.
- 연계 문서 현황:
- 관련 점수 파일: 미생성
- 관련 TODO/메모: dcy-020(자산 중심 영구 슬롯·REQ-063 slots 단일 뷰 — 직접 토대), BAT-022(universe↔slots 이중 표면 분리 선례), dcy-005(스냅샷 universe read 기원), REQ-028(snapshot 메시지 계약), REQ-021(messaging 토폴로지).
- 해석:
- dcy-020 이 "슬롯=자산 1:1 영구 슬롯"으로 모델을 바꾸면서, 전략이 universe 를 받던 스냅샷 표면(
trex.snapshot.req, view=all/buyable/held +assets[]/slots[]/available_slots/watchdog[])이 과도하게 분리·중복된 상태가 됐다. 자산 중심 모델에선 슬롯 테이블 하나가 곧 universe 이므로assets[]·watchdog[]같은 병렬 배열을 슬롯 행에 흡수할 수 있다. - 본 Discovery 는 전략 read 표면을 **
trex.slots.req(슬롯 단일 테이블 + 상태 필터)**로 재설계한다 —assets[]/available_slots/watchdog[]제거, watchdog·자산 데이터(symbol/portfolio_id/cash_balance/asset_quantity)를 슬롯 행에 흡수,spy(워치독 무터치) 옵션,degraded/reason/message유지. BAT-022·dcy-020(REQ-063)가 향하던 통합의 종착점이다.
- dcy-020 이 "슬롯=자산 1:1 영구 슬롯"으로 모델을 바꾸면서, 전략이 universe 를 받던 스냅샷 표면(
2. 요구사항 판정 결과
이번 요청이 기존 요구사항과 비교해 신규인지, 유사한지, 중복인지 판단하고 그 근거를 남긴다.
- 판정: 신규
- 근거
- 큐 표면 교체(
trex.snapshot.req→trex.slots.req)·응답 구조 재설계(assets/available_slots/watchdog 제거 + 슬롯 행 흡수)는 REQ-028(snapshot 계약)·REQ-021(토폴로지)·REQ-063(slots 뷰)을 동시에 재정의하는 인터페이스 변경이라 단일 REQ 미세 조정으로 흡수되지 않는다. - dcy-020 이 자산 중심 모델을 confirmed·delivery(BAT-027~031)했으나 전략 read 표면의 통합은 별도 주제로 남겨졌다. 본 주기는 그 read 계약을 독립적으로 재설계한다.
- 큐 표면 교체(
3. 문제점의 요약
문제의 현재 상태, 기대 상태, 관련 이해관계자, 제약사항을 정리한다. Discovery의 핵심 맥락을 가장 먼저 이해할 수 있어야 한다.
- 현재 상태
- 요청 표면
trex.snapshot.req: payload{view: all|buyable|held, strategy_key?, trading_date?, actor?/touch_watchdog?}(messaging_handlers.pysnapshot 핸들러). view 는 파생 집합(Viewenum,portfolio.py:65): ALL=universe∪holding, BUYABLE=universe−occupied−masked, HELD=holding. - 응답 envelope(
build_snapshot_envelope):assets[](view 필터된 자산: symbol/asset_id/cash_balance/asset_quantity/active_strategy_id/strategy_params) +slots[](인스턴스 전체 슬롯 테이블, view 무관 — BAT-022) +available_slots(M−active capacity) +degraded/reason/message+watchdog[](별도 배열,_attach_watchdog). - 이중 표면·병렬 배열:
assets[](universe view)와slots[](슬롯 테이블)가 공존하고,watchdog[]는 슬롯과 조인해야 하는 별도 배열이다. 자산 중심 모델(슬롯=자산 1:1)에선assets[]가 사실상slots[]의 부분집합이라 중복이다. - 워치독 터치 시맨틱: 전략 폴링은 holding 슬롯 워치독을 갱신(생존 신호, REQ-034)하고, 운영자 조회는
actor="operator"/touch_watchdog=false로 억제(REQ-021 R-4) — 두 갈래가 ad-hoc 플래그로 표현됨. - strategy 필터:
strategy_key로 소유 자산 필터,assets[]에active_strategy_id/strategy_params노출. - legacy stub 경로(
{view, strategy_id, slots[], capacity{}})도 잔존(구버전·테스트 호환). - baseline(
docs/interface-contract.mdsnapshot 섹션)이 이 표면을 기술 — 재설계 시 갱신 대상.
- 요청 표면
- 기대 상태
- 전략이
trex.slots.req하나로 슬롯 테이블을 받는다. 응답 =slots[]+degraded/reason/message만. slots[]각 행이 슬롯 상태(slot_id/status/qty/avg_price/limit_price/forced_close_at…)와 자산 데이터(symbol/portfolio_id/cash_balance/asset_quantity)와 **워치독 상태(expired/last_seen)**를 함께 운반한다 — 병렬 배열·조인 제거.filter로 슬롯 상태별(all/inactive/holding/pending/paused…) 조회.spy=true면 워치독 무터치(생존 신호로 오인 안 함).assets[]·available_slots·watchdog[]제거. 매수 가능 목록 =filter=inactive결과, capacity 는 admission(capacity_full)이 게이트.
- 전략이
- 이해관계자
- 문서 작성자(AI agent) — Discovery/REQ/Batch 산출물
- 리뷰어/승인자 — read 계약·토폴로지 재설계 승인
- 전략 모듈(orb-v1 등) — 요청 큐·응답 구조 변경(외부 repo 소비 측)
- 운영 담당자 —
spy조회·슬롯 단일 뷰 관측
- 제약사항
- 큐 교체는 토폴로지(REQ-021/050 동적 큐명·per-instance)·전략 모듈 소비 측을 함께 바꿔야 한다 — cutover/과도기 필요.
- 슬롯 행에 브로커 정본(qty/avg)과 hub 정본(cash_balance/asset_quantity)이 공존하며 divergence(REQ-031/062) 가능 — 필드별 source 명시 필요.
- 단일 writer·워치독(REQ-034)·degraded 신호(REQ-028)의 의미를 새 표면에서 보존.
주요 사용자 시나리오
사용자 또는 운영자가 실제로 어떤 상황에서 이 변경을 필요로 하는지 대표 시나리오를 적는다.
- 전략이
trex.slots.req {filter: "inactive"}로 매수 가능(잔고 0·미보유) 슬롯만 받아 신호를 낸다 —assets[]없이slots[]한 배열로. - 전략이
{filter: "holding"}로 보유 슬롯의 수량·avg·워치독 상태를 한 행에서 본다(별도 watchdog[] 조인 불필요). - 운영자가
{filter: "all", spy: true}로 전 슬롯을 조회하되 워치독을 건드리지 않아 죽은 전략의 safety-sell 을 억제하지 않는다. - 전략이
{filter: "pending"}로 진행 중 주문 슬롯을 관측한다.
4. 이번에 정의할 변경
이번 Discovery에서 다루는 핵심 변경 항목을 목록으로 적는다. 기능, 구조, 규칙 변경을 함께 포함해도 된다.
- 요청 표면 교체:
trex.snapshot.req파이프라인 제거,trex.slots.req추가(토폴로지·핸들러·전략 소비 측 cutover, OQ-1). - 슬롯 상태 필터:
filter= status 단일 값{all, inactive, pending(buy∪sell), holding, error}(상호배타, OQ-2).inactive판정=슬롯 status(잔고 아님). overlay(paused/warned)는 행 플래그(직교 축), 서버측 overlay 필터는 후속. 파생 view(ALL/BUYABLE/HELD) 폐기. spy옵션:spy=true면 워치독 무터치(현actor=operator/touch_watchdog=false일반화). 기본 false(터치=생존 신호).- 슬롯 단일 행 흡수(OQ-3 (a)):
slots[]각 행에 자산 데이터(symbol/portfolio_id/cash_balance/asset_quantity) + 워치독(watchdog:{expired,last_seen}nested) + overlay(paused/warned) 포함. 수량은asset_quantity(hub 정본)+qty(미러) 둘 다 노출(REQ-062), 어긋나면warned. 현금은cash_balance+cash_estimated. 필드별 정본 라벨 명시. - 응답 정리:
assets[]·available_slots·watchdog[]제거,degraded/reason/message유지. - strategy 필드 제외(이번 범위):
strategy_id/strategy_key/strategy_params/active_strategy_id제외(OQ-4 — 인스턴스=전략 스코프 전제). - baseline(
docs/interface-contract.md/docs/runtime-flows.md) snapshot→slots 표면 갱신.
영향 범위
변경이 미칠 코드/문서/운영 범위를 명시해 REQ 정제와 batch planning에서 추정 누락을 줄인다.
- 코드 영향:
trex_core/adapters/messaging/topology.py등 —trex.snapshot.req→trex.slots.req큐명/바인딩(per-instance, REQ-021/050)trex_core/application/messaging_handlers.py— snapshot 핸들러 → slots 핸들러(filter/spy 파싱, 응답 구조),_attach_watchdog제거(슬롯 행 흡수), legacy stub 경로 정리trex_core/application/portfolio.py—Viewenum·build_snapshot_envelope(assets/available_slots/watchdog 제거, 슬롯 행에 자산·워치독 흡수),slot_to_dict확장trex_core/runtime/cli.py— 운영자slots/universe명령이 새 표면 사용(spy)- (전략 모듈 orb-v1 — 외부 repo 소비 측 cutover)
- 문서 영향:
docs/interface-contract.md(snapshot→slots 계약),docs/runtime-flows.md(read 표면)
- 운영 영향:
- 전략 모듈 동시 cutover 필요(큐 교체). 운영자 조회는
spy로 일원화.
- 전략 모듈 동시 cutover 필요(큐 교체). 운영자 조회는
5. 요구사항 목록
실제로 구현과 검증으로 이어질 요구사항을 기능/비기능으로 나누어 정리하고, 범위 경계를 명확히 적는다.
기능 요구사항
- FR-1:
trex.snapshot.req를 제거하고trex.slots.req(per-instance 큐명) RPC 를 추가한다 — 요청{filter?, spy?}, 응답{slots[], degraded, reason, message}. 즉시 교체(과도기 없음, OQ-1): 두 큐를 한 배포에 교체하고 전략 모듈을 lockstep 전환한다. - FR-2:
filter는 status 단일 값(상호배타){all, inactive, pending(=pending_buy∪pending_sell), holding, error}로 조회한다(OQ-2). 미지정 시all.inactive판정 키는 슬롯 status(hubasset_quantity아님 — 정합 정본은 상태머신). overlay(paused/warned)는 필터 값이 아니라 각 슬롯 행의 플래그로 노출하며(FR-3), 서버측 overlay 필터는 후속(MVP는 행 플래그 + client 필터). - FR-3:
slots[]각 행은 아래를 필드별 정본 라벨과 함께 운반한다(OQ-3 (a)):- 슬롯/코어 정본:
slot_id,status,portfolio_id,symbol,avg_price,limit_price,forced_close_at - 수량(REQ-062 정합, 둘 다 노출):
asset_quantity(hub 정본 — 전략 reasoning primary) +qty(슬롯 미러 — 코어 confirmed local). 정상 시 일치, 어긋나면warned=true. 라이브 브로커 잔고는 행에 미포함(청산/reconcile 시점 정본). - 현금:
cash_balance(hub 정본) +cash_estimated(bool, dcy-018 추정 현금 오버레이) - 워치독:
watchdog: {expired: bool, last_seen: ISO}(nested object) - overlay 플래그(직교 축, OQ-2):
paused,warned - 계약 문서(interface-contract)에 각 필드 정본 출처(hub/슬롯·코어/브로커/watchdog/overlay)를 명시한다.
- 슬롯/코어 정본:
- FR-4:
spy=true면 워치독을 갱신하지 않는다(생존 신호 미발생). 기본 false(holding 슬롯 워치독 터치, REQ-034 계승). - FR-5: 응답에서
assets[]·available_slots·watchdog[]를 제거하고degraded/reason/message는 유지한다. 매수 가능 목록은filter=inactive, capacity 는 admission(capacity_full) 게이트로 대체한다. - FR-6:
strategy_id/strategy_key/strategy_params/active_strategy_id는 본 표면에서 제외한다(OQ-4). - FR-7:
docs/interface-contract.md·docs/runtime-flows.md를 새 read 표면으로 갱신한다.
비기능 요구사항
성능, 운영성, 일관성, 자동화 안정성 등 기능 외 요구사항을 적는다.
- NFR-1: 워치독 일관성 — 전략 폴링(기본)은 생존 신호로 터치,
spy는 무터치(REQ-034 R-4 의미 보존). - NFR-2: 단일 표면 — 한 응답이 슬롯 테이블 하나로 자산·워치독을 모두 담아 소비자 조인이 불필요하다.
- NFR-3: cutover 안전 — 즉시 교체(과도기 없음, OQ-1)이므로 전략 모듈(orb-v1)을 같은 배포에 lockstep 전환한다. dcy-020 자산 중심 cutover(BAT-030)와 묶어 단일 전환점으로 관리한다.
범위 경계
이번 반복에서 반드시 포함할 범위와 명시적으로 제외할 범위를 구분한다.
- In Scope
trex.slots.req표면(요청 filter/spy, 응답 slots[]+degraded) + 슬롯 행 흡수(자산·워치독)assets[]/available_slots/watchdog[]제거,trex.snapshot.req폐기- interface-contract/runtime-flows 정합
- Out of Scope
- strategy_id/key/params/active(이번 제외 — 인스턴스=다중 전략이나 할당 모델 portfolio-hub 미정의, 후속 discovery. loose JSON 미채택, 추후 명시 필드 additive 추가)
- intent admission/capacity 정책 자체(dcy-020 — read 표면만 변경)
- 포지션 사이징·실행 정책(dcy-021/022 — 별개)
- 전략 모듈(orb-v1) 내부 구현(외부 repo, 소비 계약만 합의)
6. 리스크/가정 목록
불확실성과 전제 조건을 분리해서 적는다. 리스크는 영향과 완화 방안을, 가정은 현재 판단의 전제를 기록한다.
리스크
- R-1 (High): 즉시 교체(OQ-1, 과도기 없음)라 전략 모듈(외부 repo)이 같은 배포에 전환되지 않으면 전략이 스냅샷을 즉시 못 받는다.
- 완화 방안: 전략 모듈 lockstep cutover를 dcy-020 자산 중심 cutover(BAT-030, 이미 전략 계약 변경 동반)와 단일 전환점으로 묶어 조율. 배포 전 전략 모듈
trex.slots.req대응 준비 확인.
- 완화 방안: 전략 모듈 lockstep cutover를 dcy-020 자산 중심 cutover(BAT-030, 이미 전략 계약 변경 동반)와 단일 전환점으로 묶어 조율. 배포 전 전략 모듈
- R-2 (Medium): 슬롯 행에 브로커 정본(qty/avg)과 hub 정본(cash_balance/asset_quantity)이 공존해 divergence(REQ-031/062) 시 소비자가 어느 값을 믿을지 모호.
- 완화 방안: 필드별 정본 출처·라벨을 OQ-3 에서 확정하고 계약 문서에 명시.
- R-3 (Medium):
available_slots제거로 전략이 capacity 사전 확인 불가 → 거부(capacity_full) 후 재시도 부담.- 완화 방안: admission 게이트로 충분함을 합의(가정 A-3), 필요 시 별도 capacity 조회는 후속.
가정
아직 확정되지 않았지만 현재 문서 작성의 기반이 되는 전제를 적는다.
- A-1: dcy-020 자산 중심 영구 슬롯(슬롯=자산 1:1)이 구현 상태라
assets[]가slots[]에 흡수 가능하다. - A-2: (정정) 한 인스턴스 = 다중 전략이다. 전략↔자산 할당은 portfolio-hub 가 내려주는 미정의 설정으로 별도 후속 discovery 에서 정의한다. 따라서 이번 read 표면은 전략 정보를 받지 않고(전략-무관), 전략 모델 확정 시 strategy 필드를 additive(비파괴)로 추가한다.
- A-3: capacity 사전 확인 없이 admission(
capacity_full) 거부로 충분하다.
오픈 질문
답을 아직 모르는 항목을 적는다. 추정으로 덮지 말고 REQ 초안 작성 이전에 확인할 질문으로 남긴다.
- OQ-1: 큐 교체 방식 —
trex.slots.req신규 +trex.snapshot.req즉시 폐기 vs 한시적 dual-listen/dual-publish 과도기.- 상태: Answered (2026-06-11, 사용자 결정)
- 결정: 즉시 교체 —
trex.snapshot.req파이프라인 제거 +trex.slots.req추가를 같은 배포에. dual-listen/dual-publish 과도기 없음. 전략 모듈(orb-v1)은 lockstep cutover(동시 전환)로 조율하며, dcy-020 자산 중심 cutover(BAT-030, 이미 전략 계약 변경 동반)와 함께 묶는 것을 권장. 반영: FR-1, NFR-3, R-1.
- OQ-2:
filter분류·조합 — status + overlay 혼합/단일,inactive정의,pendingbuy/sell 합 여부.- 상태: Answered (2026-06-11, 사용자 결정)
- 결정:
filter= status 단일 값(상호배타){all, inactive, pending(=pending_buy∪pending_sell), holding, error}. status와 overlay는 직교 축 — overlay(paused/warned)는 필터 값이 아니라 각 슬롯 행의 플래그로 항상 노출, 서버측 overlay 필터는 후속(MVP는 행 플래그 + client 필터, "paused holding" 조합도 client에서).inactive판정 키는 슬롯 status(hubasset_quantity아님 — 상태머신 정본, 행에 asset_quantity 동반 노출). 임의 다중 status 조합 미지원(pending묶음이 흡수). 반영: FR-2/3, §4.
- OQ-3: 병합 슬롯 행 필드·정본 — 수량 정본/미러 노출, divergence 표기, 워치독 형태.
- 상태: Answered (2026-06-11, 사용자 결정 (a))
- 결정: (a) 둘 다 노출 —
asset_quantity(hub 정본, REQ-062)와qty(슬롯 미러)를 행에 함께, 어긋나면warned.cash_balance(hub)+cash_estimated(dcy-018). 워치독 = nested{expired,last_seen}. overlaypaused/warned플래그. 라이브 브로커 잔고는 행 미포함(청산/reconcile 시점 정본). interface-contract 에 필드별 정본 출처 라벨 명시. 반영: FR-3, §4.
- OQ-4: strategy 필드 제외의 전제·처리.
- 상태: Answered (2026-06-11, 사용자 결정)
- 결정: 인스턴스는 다중 전략이나 전략↔자산 할당 모델이 portfolio-hub 주도로 미정의 → 후속 discovery 로 연기. 이번 표면은 전략 정보(strategy_id/key/params/active)를 제외(받지 않음). loose JSON 필드는 미채택(undefined blob은 OQ-3 정본 라벨 원칙에 반하고, 나중에 명시 필드로 additive 추가가 비파괴). 한계: 미래 모델 전까지
trex.slots.req는 전략-무관(인스턴스 전체 슬롯, per-strategy 스코핑 없음). 반영: A-2, FR-6, §5 Out of Scope, 후속 Discovery 참조.
7. 초기 성공 기준
이 변경이 성공했다고 판단할 기준을 측정 가능하게 정의한다. 가능하면 데이터 출처까지 연결한다.
- S-1: 전략이
trex.slots.req {filter}로 슬롯 테이블을 받고, 응답에assets[]/available_slots/watchdog[]가 없으며slots[]+degraded/reason/message만 있다. - S-2:
slots[]각 행이 슬롯 상태 + 자산(symbol/portfolio_id/cash_balance/asset_quantity) + 워치독(expired/last_seen)을 함께 담아, 별도 배열 조인 없이 소비된다. - S-3:
spy=true조회는 워치독을 갱신하지 않고(생존 신호 미발생), 기본 조회는 holding 워치독을 터치한다.filter=inactive가 매수 가능 목록을 반환한다.
측정 방식 및 데이터 출처
각 성공 기준을 어떻게 측정할지와 어떤 데이터나 문서를 근거로 쓸지 적는다.
- S-1 측정 방식:
trex.slots.req응답 키 집합 단언(assets/available_slots/watchdog 부재) 단위/통합 / 데이터 출처: RPC 응답 payload - S-2 측정 방식: 슬롯 행 필드 단언(자산·워치독 포함) / 데이터 출처: slot_to_dict 확장 결과
- S-3 측정 방식: spy on/off 워치독 갱신 여부 + filter=inactive 결과 단언 / 데이터 출처: WatchdogStore, 슬롯 상태
8. REQ로 넘기기 전 확인 체크
REQ 초안 작성 단계로 넘기기 전에 무엇이 확정되어야 하는지 확인한다. 미완료 항목은 후속 결정이 필요함을 뜻한다.
- 범위(In Scope/Out of Scope) 확정
- 기준: 필터 분류(OQ-2)·strategy 제외 전제(OQ-4) 합의 완료
- 성공 지표의 측정 방식/데이터 출처 확정
- 기준: S-1~3 측정 시나리오·데이터 출처가 테스트 가능한 형태로 정의됨
- High 영향 리스크 우선순위 및 해소 책임자 지정
- 기준: R-1(큐 cutover)은 즉시교체(OQ-1) lockstep + dcy-020 cutover(BAT-030) 묶음으로 해소 방향 확정. 책임 = 구현 batch + 전략팀 조율.
- 모든 오픈 질문(OQ)
Open상태 없음 확인- 기준: OQ-1~4 전부 Answered (2026-06-11 사용자 결정)
- Freeze 확정 담당자(CONFIRMED_BY) 지정
- 기준: 승인자 Justin confirm-discovery 수행
9. 파일 처리 결과
이 Discovery 문서 생성/갱신 결과와 참조 문서를 기록한다. 이후 추적과 리뷰 시 근거로 사용한다.
- 처리 결과: 생성
- 생성 경로: docs/discovery/dcy-025_20260611_strategy-read-surface-slots-req.md
- 참조 문서:
- docs/discovery/dcy-020_20260610_asset-centric-slot-model.md (자산 중심 영구 슬롯·REQ-063 slots 단일 뷰 — 토대)
- docs/discovery/dcy-005_20260604_portfolio-hub-asset-snapshot-api.md (스냅샷 universe read 기원)
- docs/interface-contract.md(snapshot 계약), docs/runtime-flows.md (baseline — 갱신 대상)
- 코드: trex_core/application/portfolio.py(View/build_snapshot_envelope), messaging_handlers.py(snapshot 핸들러/_attach_watchdog)
10. 사용자 결정 필요 항목 요약
사용자나 승인자가 결정해야 하는 항목만 모아 정리한다. 결정, 확인, 데이터 요청을 구분해서 적는다.
DECIDE
- 없음 (OQ-1/2/3 Answered — §6 참조)
CONFIRM
- 없음 (OQ-4 Answered — 인스턴스=다중 전략, 할당 모델은 후속 discovery, 이번 표면 전략 정보 제외)
DATA
- 없음 (외부 데이터 의존 없음 — 내부 계약/토폴로지 + 전략 발신 합의)
11. Discovery Freeze
REQ 초안 작성 인계 시점의 확정 플래그와 섹션 참조만 기록한다. 내용 재작성 없이 원본 섹션을 링크로 대신한다.
섹션 참조
- 범위: # 5. 요구사항 목록 > 범위 경계
- 리스크/오픈 질문: # 6. 리스크/가정 목록
- 성공 기준: # 7. 초기 성공 기준
- 인계 전 확인: # 8. REQ로 넘기기 전 확인 체크
- 사용자 결정 필요: # 10. 사용자 결정 필요 항목 요약
Freeze 플래그
- Handoff Decision: 승인
- Handoff Rationale: OQ-1~4 전부 Answered(즉시교체·filter=status 단일·행 정본(a)·전략 정보 제외). C형 플레이스홀더 0, 저장소 사실 재확인 일치(trex.snapshot.req·View enum·_attach_watchdog 존재). REQ Drafting 인계 가능.
- Ready for REQ Drafting: true
- Confirmed By: Justin
- Confirmed At (KST): 2026-06-11 13:32 KST