From 431c1a7bd2d34166f8561e1599dc68e4b655769a Mon Sep 17 00:00:00 2001 From: Justin Ko Date: Wed, 3 Jun 2026 12:48:01 +0000 Subject: [PATCH] Inline slot column contract in dcy-001, drop temp/plan.md references Remove all references to the gitignored temp/plan.md draft and embed the Slot column contract it depended on as Appendix A, so the Discovery stays self-contained after temp/ is deleted. Co-Authored-By: Claude Opus 4.8 (1M context) --- ...001_20260603_slot-pure-domain-migration.md | 38 +++++++++++++++---- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/docs/discovery/dcy-001_20260603_slot-pure-domain-migration.md b/docs/discovery/dcy-001_20260603_slot-pure-domain-migration.md index 4e91885..2bfddb8 100644 --- a/docs/discovery/dcy-001_20260603_slot-pure-domain-migration.md +++ b/docs/discovery/dcy-001_20260603_slot-pure-domain-migration.md @@ -15,9 +15,9 @@ - 연계 문서 현황: - 관련 점수 파일: 미생성 - - 관련 TODO/메모: temp/plan.md (slot 순수 도메인 이관 계획서, gitignored 초안) + - 관련 TODO/메모: 없음 (검토 초안 내용은 본 Discovery 본문과 부록 A 에 통합) - 해석: - - bootstrap-baseline 초기화가 끝난 빈 베이스(trex-core)에서 시작하는 첫 real Discovery이며, 입력은 temp/plan.md 와 운영자 확정 결정(신규 베이스 + 순수 도메인만)이다. + - bootstrap-baseline 초기화가 끝난 빈 베이스(trex-core)에서 시작하는 첫 real Discovery이며, 입력은 trex-orbit slot 도메인 코드 분석과 운영자 확정 결정(신규 베이스 + 순수 도메인만)이다. - 이번 Discovery는 "코어 베이스 부트스트랩 + slot 순수 도메인 이식 + 단위테스트 green"의 범위와 성공 기준을 확정하고, 네임스페이스/컬럼 계약 박제 같은 미결 결정을 드러내는 것이 핵심이다. # 2. 요구사항 판정 결과 @@ -53,7 +53,7 @@ - 개발자가 trex-core 를 clone 한 뒤 `pip install -e .[dev]` 와 `pytest` 로 slot 도메인 테스트가 통과하는 깨끗한 베이스를 확보한다. - 후속 도메인 작성자가 slot 도메인을 trex-core 의 "표준 도메인 작성 패턴(storage-agnostic + Protocol 저장소 경계)" 참조로 삼는다. -- 다음 반복에서 영속화(PostgreSQL) 구현자가 이식된 `SlotRepository` Protocol 과 보존된 컬럼 계약(plan.md 부록 A)을 기준으로 저장소 구현을 붙인다. +- 다음 반복에서 영속화(PostgreSQL) 구현자가 이식된 `SlotRepository` Protocol 과 보존된 컬럼 계약(본 문서 부록 A)을 기준으로 저장소 구현을 붙인다. # 4. 이번에 정의할 변경 이번 Discovery에서 다루는 핵심 변경 항목을 목록으로 적는다. 기능, 구조, 규칙 변경을 함께 포함해도 된다. @@ -90,7 +90,7 @@ - NFR-1: 순수 도메인 경계 유지 — 이식된 도메인 코드는 stdlib 와 패키지 내부 참조 외 외부 의존(psycopg/네트워크/CLI/config)을 import 하지 않는다(정적 import 스윕으로 검증 가능). - NFR-2: 도메인 불변식 보존 — 6 상태/8 전이, advisory-lock 직렬화, append-only 전이 로그, closed→idle 재진입 +1, lock 보유 중 외부 I/O 금지가 이식 후에도 동일하게 성립한다. -- NFR-3: 컬럼 계약 보존 — `Slot` 데이터클래스 필드 계약(plan.md 부록 A)이 변형 없이 유지되어, 다음 반복의 영속화 구현이 동일 계약을 기준으로 삼을 수 있다. +- NFR-3: 컬럼 계약 보존 — `Slot` 데이터클래스 필드 계약(본 문서 부록 A)이 변형 없이 유지되어, 다음 반복의 영속화 구현이 동일 계약을 기준으로 삼을 수 있다. ## 범위 경계 이번 반복에서 반드시 포함할 범위와 명시적으로 제외할 범위를 구분한다. @@ -112,7 +112,7 @@ - R-1 (Medium): 영속화 부재로 trex-core 의 `SlotService` 는 in-memory repo 로만 구동되어, 단일 writer/advisory lock 의 실제 가치가 다음 반복(Postgres 재구성)까지 미실현된다. - 완화 방안: 이번 반복 목표를 "도메인 코어 시드 + 테스트 green"으로 한정하고, 영속화는 별도 후속 Discovery 로 명시 인계한다. - R-2 (Medium): DDL 을 함께 가져오지 않으므로 향후 영속화 구현 시 `Slot` 필드와 스키마가 어긋나는 컬럼 계약 드리프트 위험이 있다. - - 완화 방안: plan.md 부록 A 와 `docs/data-model.md` 를 계약 기준으로 고정(NFR-3)하고, 영속화 REQ 에서 드리프트 테스트를 동반하도록 인계한다. + - 완화 방안: 본 문서 부록 A 와 `docs/data-model.md` 를 계약 기준으로 고정(NFR-3)하고, 영속화 REQ 에서 드리프트 테스트를 동반하도록 인계한다. - R-3 (Low): slot 도메인이 trex-orbit·trex-core 두 곳에 병존(이중 진실)해 로직 변경 시 동기화 부담이 생긴다. - 완화 방안: 신규 베이스 결정의 의도된 비용으로 수용하고, 수렴 시점은 별도 Discovery(OQ 처리)로 추적한다. @@ -130,9 +130,9 @@ - 상태: Open - 처리 방안: 운영자가 신규 베이스 정체성(독립 패키지명) vs 향후 대조 용이성(파리티) 사이에서 결정. AskUser 로 확인 후 본문 FR-2/구조 표기에 반영. - 종료 조건: 네임스페이스가 확정되어 `# 5` FR-2 와 baseline 구조 표기의 import 경로가 단일 값으로 고정되면 Answered. -- OQ-2: `Slot` 컬럼 계약(plan.md 부록 A)을 영속화 미구현 상태에서 어떻게 드리프트 없이 박제할지(문서 고정 vs 계약 테스트 vs 스키마 placeholder). +- OQ-2: `Slot` 컬럼 계약(본 문서 부록 A)을 영속화 미구현 상태에서 어떻게 드리프트 없이 박제할지(문서 고정 vs 계약 테스트 vs 스키마 placeholder). - 상태: Open - - 처리 방안: NFR-3 의 구체 수단을 운영자 확인 후 결정. 최소안은 `docs/data-model.md` + 부록 A 를 단일 계약 기준으로 선언하고 영속화 REQ 로 드리프트 테스트를 인계. + - 처리 방안: NFR-3 의 구체 수단을 운영자 확인 후 결정. 최소안은 `docs/data-model.md` + 본 문서 부록 A 를 단일 계약 기준으로 선언하고 영속화 REQ 로 드리프트 테스트를 인계. - 종료 조건: 계약 박제 수단이 정해져 NFR-3 의 검증 방식으로 연결되면 Answered. - OQ-3: trex-orbit↔trex-core slot 도메인의 향후 수렴(역참조/단일화) 여부. - 상태: Deferred @@ -182,7 +182,6 @@ REQ 초안 작성 단계로 넘기기 전에 무엇이 확정되어야 하는지 - 처리 결과: 생성 - 생성 경로: docs/discovery/dcy-001_20260603_slot-pure-domain-migration.md - 참조 문서: - - temp/plan.md (slot 순수 도메인 이관 계획서) - docs/project-structure.md, docs/runtime-flows.md (구조/런타임 baseline — 본 Discovery 가 갱신 요구) - docs/interface-contract.md, docs/data-model.md (인터페이스/데이터 baseline — 컬럼 계약 기준) - stage-pilot/templates/project-structure.md, stage-pilot/templates/runtime-flows.md (baseline 갱신 시 논리 템플릿 참조) @@ -217,3 +216,26 @@ REQ 초안 작성 인계 시점의 확정 플래그와 섹션 참조만 기록 - Ready for REQ Drafting: false - Confirmed By: TBD - Confirmed At (KST): TBD + +# 부록 A. `Slot` 데이터클래스 ↔ `daily_slot` 컬럼 계약 (이식 보존 대상) +NFR-3 과 OQ-2 가 참조하는 컬럼 계약이다. 순수 도메인의 `Slot` 데이터클래스는 trex-orbit `daily_slot` 스키마 컬럼 계약을 암묵 전제하므로, trex-core 가 다음 반복에서 영속화 계층을 새로 구성할 때 이 계약을 반드시 만족시켜야 도메인이 정상 동작한다. (`docs/data-model.md` 와 동일 기준) + +| 필드 | 타입(도메인) | 원본 DDL 타입 | 비고 | +|---|---|---|---| +| `slot_id` | UUID | UUID PK | | +| `trading_date` | date | DATE NOT NULL | | +| `status` | SlotState | TEXT CHECK(6값) | idle/pending_buy/holding/pending_sell/closed/error | +| `symbol` | str? | TEXT | | +| `qty` | float? | NUMERIC(18,4) | | +| `avg_price` | float? | NUMERIC(18,4) | | +| `entry_price` | float? | NUMERIC(18,4) | 가격 잠금 | +| `allocated_capital` | float? | NUMERIC(18,2) | | +| `order_id` | str? | TEXT | 자유 주석 | +| `strategy_id` | str? | TEXT | 진입 전략 | +| `broker_order_id` | str? | TEXT | 브로커 식별자 | +| `portfolio_id` | str? | TEXT | | +| `sell_strategy_id` | str? | TEXT | 청산 전략 | +| `forced_close_at` | datetime? | TIMESTAMPTZ | 강제청산 마감선 | +| `created_at` / `updated_at` | datetime? | TIMESTAMPTZ | | + +부속 테이블 계약(영속화 재구성 시 함께 필요): `daily_symbol_entries`(재진입 카운터 — PK `(trading_date, symbol)`), `slot_transition_log`(append-only 감사 로그). 본 이관(순수 도메인)에서는 계약만 보존하고 DDL 은 가져오지 않는다.