diff --git a/.stage-pilot/bootstrap/baseline.yaml b/.stage-pilot/bootstrap/baseline.yaml index 656a35f..8459096 100644 --- a/.stage-pilot/bootstrap/baseline.yaml +++ b/.stage-pilot/bootstrap/baseline.yaml @@ -69,11 +69,11 @@ interfaces: current_gaps: - 영속화 구현체(PostgreSQL)와 그에 딸린 SQL 스키마/마이그레이션은 이번 이관 범위 밖이며 향후 도입 예정. - CLI / 설정(config) 표면은 아직 없음(trex-orbit 의 trex slot CLI 는 이식하지 않음). - - 패키지 네임스페이스(app.domain.slot vs trex_core.domain.slot)는 첫 Discovery 에서 확정(plan.md OQ-1). + - 패키지 네임스페이스는 trex_core.domain.slot 으로 확정(dcy-001 OQ-1, 배포명 trex-core). structure: planned_top_level_areas: - - path: app/domain/slot/ + - path: trex_core/domain/slot/ responsibility: 슬롯 생명주기 순수 도메인(state/models/errors/repository protocol/service/in-memory repo) - path: tests/domain/slot/ responsibility: 슬롯 도메인 단위 테스트(상태머신/서비스) @@ -131,8 +131,7 @@ data_model: notes: known_unknowns: - - 패키지 네임스페이스 결정(app.domain.slot vs trex_core.domain.slot) — plan.md OQ-1 - - SLOT_ADVISORY_LOCK_ID 의 소속(순수 도메인 잔류 vs 영속화 계층 이동) — plan.md OQ-2 + - SLOT_ADVISORY_LOCK_ID 의 소속(순수 도메인 잔류 vs 영속화 계층 이동) - 영속화 backend 선택 및 SQL 스키마 재구성 시점 - trex-orbit 과의 향후 코드 수렴 여부(현재는 병행) 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 2bfddb8..eb581e0 100644 --- a/docs/discovery/dcy-001_20260603_slot-pure-domain-migration.md +++ b/docs/discovery/dcy-001_20260603_slot-pure-domain-migration.md @@ -18,7 +18,7 @@ - 관련 TODO/메모: 없음 (검토 초안 내용은 본 Discovery 본문과 부록 A 에 통합) - 해석: - bootstrap-baseline 초기화가 끝난 빈 베이스(trex-core)에서 시작하는 첫 real Discovery이며, 입력은 trex-orbit slot 도메인 코드 분석과 운영자 확정 결정(신규 베이스 + 순수 도메인만)이다. - - 이번 Discovery는 "코어 베이스 부트스트랩 + slot 순수 도메인 이식 + 단위테스트 green"의 범위와 성공 기준을 확정하고, 네임스페이스/컬럼 계약 박제 같은 미결 결정을 드러내는 것이 핵심이다. + - 이번 Discovery는 "코어 베이스 부트스트랩 + slot 순수 도메인 이식 + 단위테스트 green"의 범위와 성공 기준을 확정하고, 잔여 미결 결정(컬럼 계약 박제, OQ-2)을 드러내는 것이 핵심이다. 패키지 네임스페이스는 `trex_core.domain.slot` 으로 확정됨(OQ-1). # 2. 요구사항 판정 결과 이번 요청이 기존 요구사항과 비교해 신규인지, 유사한지, 중복인지 판단하고 그 근거를 남긴다. @@ -58,7 +58,7 @@ # 4. 이번에 정의할 변경 이번 Discovery에서 다루는 핵심 변경 항목을 목록으로 적는다. 기능, 구조, 규칙 변경을 함께 포함해도 된다. -- trex-core Python 프로젝트 부트스트랩: `pyproject.toml` + 패키지 레이아웃(`app/`, `app/domain/`) + pytest/ruff 설정. +- trex-core Python 프로젝트 부트스트랩: `pyproject.toml`(배포명 `trex-core`) + 패키지 레이아웃(`trex_core/`, `trex_core/domain/`) + pytest/ruff 설정. - slot 순수 도메인 이식: 6개 모듈 + `__init__.py` 복사, 공개 API 확정(`__init__` docstring 을 순수 도메인 기준으로 정리, 인프라 export 없음 확인). - 도메인 단위테스트 이식 및 green: `test_state.py`, `test_service.py`(InMemorySlotRepository 기반)을 trex-core 에서 통과. - baseline 문서 정합: 이식 후 `docs/project-structure.md`·`docs/runtime-flows.md` 의 planned 표기를 실제 구조와 일치하도록 갱신. @@ -67,7 +67,7 @@ 변경이 미칠 코드/문서/운영 범위를 명시해 REQ 정제와 batch planning에서 추정 누락을 줄인다. - 코드 영향: - - 신규 생성: `pyproject.toml`, `app/__init__.py`, `app/domain/__init__.py`, `app/domain/slot/*`(6 모듈 + `__init__`), `tests/domain/slot/*`. + - 신규 생성: `pyproject.toml`, `trex_core/__init__.py`, `trex_core/domain/__init__.py`, `trex_core/domain/slot/*`(6 모듈 + `__init__`), `tests/domain/slot/*`. - trex-orbit 코드: 무수정(병행). - 문서 영향: - `docs/project-structure.md`, `docs/runtime-flows.md` 의 planned→실제 갱신. @@ -81,7 +81,7 @@ ## 기능 요구사항 - FR-1: trex-core 를 설치/테스트 가능한 Python 패키지로 부트스트랩한다(`pyproject.toml` + 패키지 레이아웃 + pytest/ruff 설정). `pip install -e .[dev]` 후 `pytest` 가 실행 가능해야 한다. -- FR-2: slot 순수 도메인 6개 모듈(`state`/`models`/`errors`/`repository`/`service`/`in_memory_repository`)과 `__init__.py` 를 trex-core 에 이식하고, 공개 API(`SlotState`/`Slot`/`SlotCapacity`/`SlotTransitionRecord`/`SlotRepository`/`SlotService`/예외/`is_allowed_transition`/`SLOT_ADVISORY_LOCK_ID`/`ALLOWED_TRANSITIONS`)를 인프라 심볼 없이 노출한다. +- FR-2: slot 순수 도메인 6개 모듈(`state`/`models`/`errors`/`repository`/`service`/`in_memory_repository`)과 `__init__.py` 를 `trex_core.domain.slot` 네임스페이스(OQ-1 결정)로 이식하고, 모듈 간 import 경로를 `trex_core.domain.slot.*` 로 통일한다. 공개 API(`SlotState`/`Slot`/`SlotCapacity`/`SlotTransitionRecord`/`SlotRepository`/`SlotService`/예외/`is_allowed_transition`/`SLOT_ADVISORY_LOCK_ID`/`ALLOWED_TRANSITIONS`)를 인프라 심볼 없이 노출한다. - FR-3: 이식된 도메인 단위테스트(`tests/domain/slot/test_state.py`, `test_service.py`)가 trex-core 에서 통과한다. - FR-4: 이식 완료 후 `docs/project-structure.md` 와 `docs/runtime-flows.md` 의 planned 표기를 실제 코드 구조와 일치하도록 갱신한다. @@ -127,16 +127,16 @@ 답을 아직 모르는 항목을 적는다. 추정으로 덮지 말고 REQ 초안 작성 이전에 확인할 질문으로 남긴다. - OQ-1: 패키지 네임스페이스를 trex-orbit 과 동일한 `app.domain.slot` 으로 유지할지, trex-core 전용 `trex_core.domain.slot` 으로 출발할지. - - 상태: Open - - 처리 방안: 운영자가 신규 베이스 정체성(독립 패키지명) vs 향후 대조 용이성(파리티) 사이에서 결정. AskUser 로 확인 후 본문 FR-2/구조 표기에 반영. - - 종료 조건: 네임스페이스가 확정되어 `# 5` FR-2 와 baseline 구조 표기의 import 경로가 단일 값으로 고정되면 Answered. + - 상태: Answered (2026-06-03) + - 결정: `trex_core.domain.slot` 으로 출발(독립 베이스 네임스페이스). 근거: 재사용 코어 정체성·`app` top-level 패키지 충돌 회피·OQ-3(향후 수렴) 시 자연스러운 import 경로. 이식 시 import 라인 1회 기계적 치환 비용만 발생. + - 반영 위치: `# 4`(코드 영향 신규 생성 경로), `# 5` FR-1(레이아웃)·FR-2(import 경로 통일). baseline 구조 표기(`docs/project-structure.md`·`docs/runtime-flows.md` 등)의 `app/` planned 표기는 FR-4 갱신 시 `trex_core/` 로 정정한다. - OQ-2: `Slot` 컬럼 계약(본 문서 부록 A)을 영속화 미구현 상태에서 어떻게 드리프트 없이 박제할지(문서 고정 vs 계약 테스트 vs 스키마 placeholder). - 상태: Open - 처리 방안: NFR-3 의 구체 수단을 운영자 확인 후 결정. 최소안은 `docs/data-model.md` + 본 문서 부록 A 를 단일 계약 기준으로 선언하고 영속화 REQ 로 드리프트 테스트를 인계. - 종료 조건: 계약 박제 수단이 정해져 NFR-3 의 검증 방식으로 연결되면 Answered. - OQ-3: trex-orbit↔trex-core slot 도메인의 향후 수렴(역참조/단일화) 여부. - 상태: Deferred - - 처리 방안: 이번 반복 비범위. 영속화 재구성 이후 별도 Discovery 에서 다룬다. OQ-1 네임스페이스 결정이 이 질문의 선택지를 제약하므로 OQ-1 결과를 기록해 인계한다. + - 처리 방안: 이번 반복 비범위. 영속화 재구성 이후 별도 Discovery 에서 다룬다. OQ-1 결과(`trex_core.domain.slot`)를 인계 — 수렴 시 trex-orbit 이 `trex_core.domain.slot` 을 역참조하는 경로가 자연스럽다. - 종료 조건: 영속화 반복 종료 후 수렴 Discovery 가 생성되면 그 문서로 이관. ### 오픈 질문 처리 기준 @@ -172,7 +172,7 @@ REQ 초안 작성 단계로 넘기기 전에 무엇이 확정되어야 하는지 - [x] High 영향 리스크 우선순위 및 해소 책임자 지정 - 기준: High 등급 리스크 없음(R-1/R-2 Medium, R-3 Low) — 별도 책임자 지정 불요, 완화 방안 명시됨. - [ ] 모든 오픈 질문(OQ) `Open` 상태 없음 확인 - - 기준: OQ 목록에 `Open` 상태 항목이 0개이거나, 잔여 항목 전부 `Deferred` 처리 완료 (현재 OQ-1, OQ-2 가 Open) + - 기준: OQ 목록에 `Open` 상태 항목이 0개이거나, 잔여 항목 전부 `Deferred` 처리 완료 (OQ-1 Answered, OQ-3 Deferred. 현재 OQ-2 가 Open) - [ ] Freeze 확정 담당자(CONFIRMED_BY) 지정 - 기준: 운영자가 confirm-discovery 시점에 CONFIRMED_BY 를 지정한다. @@ -190,8 +190,8 @@ REQ 초안 작성 단계로 넘기기 전에 무엇이 확정되어야 하는지 사용자나 승인자가 결정해야 하는 항목만 모아 정리한다. 결정, 확인, 데이터 요청을 구분해서 적는다. ## DECIDE -- {{DECIDE_PACKAGE_NAMESPACE}} — `app.domain.slot`(파리티) vs `trex_core.domain.slot`(독립 베이스) (OQ-1) - {{DECIDE_COLUMN_CONTRACT_ANCHOR}} — `Slot` 컬럼 계약 박제 수단: 문서 고정 / 계약 테스트 / 스키마 placeholder 중 택 (OQ-2) +- ~~패키지 네임스페이스~~ → 결정됨: `trex_core.domain.slot` (OQ-1, 2026-06-03) ## CONFIRM - {{CONFIRM_SCOPE_BOUNDARY}} — 영속화·CLI·config·coordinator 연동을 이번 반복에서 제외하는 범위 경계 확정 @@ -212,7 +212,7 @@ REQ 초안 작성 인계 시점의 확정 플래그와 섹션 참조만 기록 ## Freeze 플래그 - Handoff Decision: 보류 -- Handoff Rationale: 초기 Discovery 초안 생성 완료. OQ-1(네임스페이스)·OQ-2(컬럼 계약 박제)가 Open 상태이며, confirm-discovery 에서 사용자 결정 후 REQ Drafting 으로 인계한다. +- Handoff Rationale: 초기 Discovery 초안 생성 완료. OQ-1(네임스페이스)은 `trex_core.domain.slot` 으로 Answered. OQ-2(컬럼 계약 박제)가 Open 상태이며, confirm-discovery 에서 OQ-2 결정 후 REQ Drafting 으로 인계한다. - Ready for REQ Drafting: false - Confirmed By: TBD - Confirmed At (KST): TBD diff --git a/docs/project-structure.md b/docs/project-structure.md index 008ea76..565eae8 100644 --- a/docs/project-structure.md +++ b/docs/project-structure.md @@ -57,7 +57,7 @@ ├── CLAUDE.md # SDLC governance instructions └── (planned) ├── pyproject.toml # 패키지 메타 + pytest/ruff 설정 - ├── app/ + ├── trex_core/ │ └── domain/ │ └── slot/ # 이식 대상 순수 도메인 └── tests/ @@ -68,7 +68,7 @@ ## Package / Module Responsibilities -- `app/domain/slot/` (planned) +- `trex_core/domain/slot/` (planned) - 슬롯 생명주기 순수 도메인. 6 상태 머신(`state.py`), 데이터 모델(`models.py`), 예외(`errors.py`), 저장소 계약(`repository.py` Protocol), 도메인 서비스(`service.py`), 테스트용 in-memory 구현(`in_memory_repository.py`). - 외부 의존 0 — stdlib 와 패키지 내부 참조만 사용. - `tests/domain/slot/` (planned) @@ -80,7 +80,7 @@ ## Dependency Rules -- 순수 도메인(`app/domain/slot/`)은 저장소 구현, 브로커, 네트워크, CLI 등 인프라에 직접 의존하지 않는다. +- 순수 도메인(`trex_core/domain/slot/`)은 저장소 구현, 브로커, 네트워크, CLI 등 인프라에 직접 의존하지 않는다. - 저장소 접근은 오직 `SlotRepository` Protocol 을 통해서만 이뤄지고 구현체는 주입된다. - 인프라(향후 PostgreSQL 구현, CLI, config)는 도메인을 의존할 수 있으나 그 역은 금지한다. @@ -93,8 +93,8 @@ - 영속화 구현체(PostgreSQL repository)와 SQL 스키마/마이그레이션은 이번 범위 밖 — 향후 도입. - CLI / 설정(config) 표면 없음(trex-orbit 의 `trex slot` CLI 미이식). -- 패키지 네임스페이스(`app.domain.slot` vs `trex_core.domain.slot`)는 첫 Discovery 에서 확정(plan.md OQ-1). -- `pyproject.toml` 및 `app/`, `tests/` 스캐폴딩은 이관 Batch 에서 생성 예정. +- 패키지 네임스페이스는 `trex_core.domain.slot` 으로 확정(dcy-001 OQ-1, 배포명 `trex-core`). +- `pyproject.toml` 및 `trex_core/`, `tests/` 스캐폴딩은 이관 Batch 에서 생성 예정. ## Update Triggers @@ -105,3 +105,4 @@ ## Change Log - 2026-06-03 :: bootstrap-baseline 으로 초기 구조 baseline 생성(mixed: trex-orbit 코드 관찰 + 이관 계획 선언). +- 2026-06-03 :: dcy-001 OQ-1 결정 반영 — planned 네임스페이스를 `app/` → `trex_core/` 로 정정(배포명 `trex-core`).