From 346a580856f1d90a367330c83cded5f17bdd8a3c Mon Sep 17 00:00:00 2001 From: Justin Ko Date: Thu, 4 Jun 2026 10:56:08 +0900 Subject: [PATCH] Add dcy-002 Discovery (confirmed): slot-core daemon + HTTP intent API Second iteration scope: promote the slot pure-domain core to a long-lived daemon exposing a versioned HTTP API for buy/sell strategy daemons, backed by durable single-writer PostgreSQL persistence. All open questions resolved and operator-confirmed: - OQ-1 durability: synchronous commit + intent_id idempotency + durable intent_log seam; full async outbox deferred to the broker-execution Discovery. - OQ-2 framework: FastAPI + uvicorn. - OQ-3 endpoints: /v1 set (healthz, intents/buy, intents/sell, intents/{id}, slots, capacity); cancel/preallocate excluded. - OQ-4 schema: trex-core-owned migrations keyed to dcy-001 Appendix A (orbit-v2 DDL as reference), archive excluded, drift test realizes the DB-side check dcy-001 OQ-2 deferred. Scope defers broker execution, safety floor, and strategy daemons to a follow-up Discovery. Confirmed By Justin. Co-Authored-By: Claude Opus 4.8 (1M context) --- ...-002_20260603_slot-core-daemon-http-api.md | 238 ++++++++++++++++++ docs/discovery/index.md | 3 +- 2 files changed, 240 insertions(+), 1 deletion(-) create mode 100644 docs/discovery/dcy-002_20260603_slot-core-daemon-http-api.md diff --git a/docs/discovery/dcy-002_20260603_slot-core-daemon-http-api.md b/docs/discovery/dcy-002_20260603_slot-core-daemon-http-api.md new file mode 100644 index 0000000..e3febe8 --- /dev/null +++ b/docs/discovery/dcy-002_20260603_slot-core-daemon-http-api.md @@ -0,0 +1,238 @@ +# 0. 문서 상태 +이 문서의 현재 상태와 식별 정보를 기록한다. 문서 추적과 승인 흐름에 필요한 최소 메타데이터를 적는다. + +- 상태: confirmed +- 문서 ID: dcy-002_20260603_slot-core-daemon-http-api +- 이슈명: trex-core 슬롯 코어 데몬화 + HTTP intent API +- 작성 시각(KST): 2026-06-03 +- 마지막 갱신 시각(KST): 2026-06-03 +- 대체됨: 없음 +- 후속 Discovery 참조: 없음 +- 생성된 REQ 참조: 없음 + +# 1. 계획 상태 요약 +현재 Discovery가 어떤 배경에서 작성되고 있는지, 연계 문서가 있는지, 지금 시점의 해석이 무엇인지 짧게 요약한다. + +- 연계 문서 현황: + - 관련 점수 파일: 미생성 + - 관련 TODO/메모: trex-orbit `orbit-v2_plan.md`(3-데몬 분리 설계안 — 슬롯 코어/매수·매도 결정 producer/ intent 핸드오프 사전 설계) +- 해석: + - dcy-001/BAT-001 로 trex-core 에 slot 순수 도메인(in-memory, 라이브러리)이 시드됐다. 이번 Discovery 는 그 코어를 **장기 실행 데몬**으로 승격하고, 매수·매도 전략이 **HTTP API 엔드포인트**로 intent 를 제출/조회하는 경계를 정의한다. + - 운영자 결정: 전략↔코어 경계는 **네트워크 HTTP API**다(DB-only outbox 가 아니라 API 엔드포인트). 순수 도메인은 안쪽 코어로 유지하고 데몬·API·영속화를 바깥 레이어로 추가한다(onion). + +# 2. 요구사항 판정 결과 +이번 요청이 기존 요구사항과 비교해 신규인지, 유사한지, 중복인지 판단하고 그 근거를 남긴다. + +- 판정: 신규 +- 근거 + - dcy-001 은 "순수 도메인 이식(라이브러리)"이 문제 정의였고, 이번은 "데몬화 + API 경계 + 영속화"로 범위·구조가 다르다. + - dcy-001 이 명시적으로 Out of Scope 로 둔 영속화/CLI/런타임을 정면으로 다루므로 기존 Discovery 갱신이 아니라 후속 독립 주기가 맞다. + +# 3. 문제점의 요약 +문제의 현재 상태, 기대 상태, 관련 이해관계자, 제약사항을 정리한다. Discovery의 핵심 맥락을 가장 먼저 이해할 수 있어야 한다. + +- 현재 상태 + - trex-core 는 `trex_core/domain/slot/` 순수 도메인만 보유(상태탐색 결과: server/api/daemon/http/psycopg 참조 0, console_scripts 0). `SlotService` 는 in-memory repo 로만 구동되고 장기 실행 프로세스·외부 호출 경계가 없다. + - 영속화 구현체(PostgreSQL `SlotRepository`)·브로커·API·데몬 런타임이 모두 부재(dcy-001 에서 의도적으로 범위 밖이었음, dcy-001 R-1). + - 설계 참고자료(`orbit-v2_plan.md`)는 이미 슬롯 코어 단일 writer(불변식 A)·단일 브로커 세션(불변식 B)·buy/sell intent 핸드오프·safety floor 를 정리해 둔 상태다. +- 기대 상태 + - trex-core 가 데몬 프로세스로 떠서 slot 도메인을 **durable 단일 writer**로 소유한다. + - 매수·매도 전략 데몬이 HTTP API 로 intent 를 제출하고(매수/매도), holding 슬롯 스냅샷을 read-only 로 조회한다. + - 코어가 intent 를 심사(admission)해 슬롯 전이를 단독 수행한다(전략은 "제안", 코어가 "집행"). +- 이해관계자 + - 문서 작성자/구현자(AI agent) + - 리뷰어/승인자(운영자, genichin@gmail.com) + - 코어 API 소비자: 매수·매도 전략 데몬(별도 프로세스) +- 제약사항 + - 불변식 A — `daily_slot` 단일 writer 는 코어뿐. 전략은 슬롯을 직접 쓰지 않는다. + - 순수 도메인 경계 유지 — `trex_core.domain.slot` 은 웹 프레임워크/DB 드라이버에 의존하지 않는다(의존은 API·persistence 어댑터 레이어에만). + - dcy-001 부록 A 의 `Slot` 컬럼 계약을 영속화 구현이 만족해야 한다. + +## 주요 사용자 시나리오 +사용자 또는 운영자가 실제로 어떤 상황에서 이 변경을 필요로 하는지 대표 시나리오를 적는다. + +- 매수 전략 데몬이 신호 발생 시 `POST /v1/intents/buy`(symbol/qty/...)를 호출하면, 코어가 admission 통과 시 idle→pending_buy 로 전이하고 결과를 응답한다. +- 매도 전략 데몬이 `GET /v1/slots?status=holding` 로 보유 슬롯 스냅샷을 읽어 전략을 평가한 뒤 `POST /v1/intents/sell` 로 청산 intent 를 제출한다. +- 운영자가 `GET /v1/capacity`·`GET /v1/healthz` 로 코어 데몬의 슬롯 가용성과 생존을 모니터링한다. + +# 4. 이번에 정의할 변경 +이번 Discovery에서 다루는 핵심 변경 항목을 목록으로 적는다. 기능, 구조, 규칙 변경을 함께 포함해도 된다. + +- 데몬 런타임: trex-core 를 장기 실행 프로세스로 기동하는 엔트리포인트 + lifecycle(start/shutdown/healthz). +- HTTP API 경계: intent 제출(buy/sell) + holding 슬롯 read-only 스냅샷 + capacity/health 엔드포인트. +- 영속화: `SlotRepository` 의 PostgreSQL 구현(단일 writer, advisory lock 실제화) + 스키마/마이그레이션. in-memory 는 테스트용으로 잔존. +- 멱등 intent 처리(OQ-1 결정): `intent_id` 기반 dedup + 수락 시 **동기** 슬롯 전이 커밋(불변식 A 강제). 수락된 intent 는 같은 트랜잭션에서 `intent_log` 에 durable 기록(dedup 저장소 + audit + 향후 outbox 전구체). 완전 비동기 outbox 는 브로커 집행 Discovery 로 Deferred. +- baseline 갱신: `docs/project-structure.md`·`docs/runtime-flows.md`·`docs/interface-contract.md` 에 데몬/API/영속화 레이어 반영. + +## 영향 범위 +변경이 미칠 코드/문서/운영 범위를 명시해 REQ 정제와 batch planning에서 추정 누락을 줄인다. + +- 코드 영향: + - 신규 레이어: `trex_core/` 하위 API 어댑터(FastAPI+uvicorn, OQ-2 결정), persistence 어댑터(psycopg), 데몬 런타임/엔트리포인트. + - `pyproject.toml`: FastAPI+uvicorn + psycopg 의존성 및 console_scripts 추가. 도메인 패키지는 무의존 유지. +- 문서 영향: + - `docs/interface-contract.md` 에 HTTP API 계약 추가, `docs/runtime-flows.md` 에 데몬/요청 흐름 추가, `docs/data-model.md`/`docs/project-structure.md` 갱신. +- 운영 영향: + - 신규 운영물: 장기 실행 데몬 프로세스 + PostgreSQL 의존 + API 포트/헬스체크. 배포·모니터링 절차 신설. + +# 5. 요구사항 목록 +실제로 구현과 검증으로 이어질 요구사항을 기능/비기능으로 나누어 정리하고, 범위 경계를 명확히 적는다. + +## 기능 요구사항 +- FR-1: trex-core 를 데몬으로 기동하는 엔트리포인트와 lifecycle(기동/정상종료/`GET /v1/healthz`)을 제공한다. 거래일 슬롯 사전할당(preallocate)은 공개 엔드포인트가 아니라 데몬 lifecycle 내부(기동/스케줄) 책임으로 둔다(OQ-3 결정). +- FR-2: HTTP API 로 매수 intent(`POST /v1/intents/buy`)와 매도 intent(`POST /v1/intents/sell`)를 수락하고, 코어가 admission/검증 후 슬롯 전이(idle→pending_buy / holding→pending_sell)를 단독 수행한다. API 는 `/v1` 버전 프리픽스를 사용한다(OQ-3 결정). +- FR-3: HTTP API 로 holding 슬롯 스냅샷(`GET /v1/slots?status=holding`)과 capacity(`GET /v1/capacity`)를 read-only 로 제공한다. +- FR-4: intent 는 `intent_id` 멱등키로 dedup 하여 동일 intent 재전송이 슬롯을 중복 전이시키지 않는다. 수락 시 admission+슬롯 전이를 **동기**로 커밋해 호출자에게 admit/reject 를 응답하고(OQ-1 결정), 수락된 intent 를 `intent_log`(intent_id, payload, decision, ts) 에 같은 트랜잭션으로 durable 기록한다. `GET /v1/intents/{intent_id}` 로 결정을 재조회할 수 있어(응답 유실 시) 멱등 재시도를 지원한다. 완전 비동기 outbox 는 브로커 Discovery 로 Deferred. +- FR-5: `SlotRepository` 의 PostgreSQL 구현을 추가해 코어가 `daily_slot` 단일 writer 로 durable 하게 동작한다(advisory lock 실제화). 스키마는 **trex-core 소유의 신규 마이그레이션**으로 작성하되 dcy-001 부록 A 를 단일 기준으로 하고 orbit-v2 DDL 을 참조 구현으로만 쓴다(OQ-4 결정). 슬라이스 1 테이블: `daily_slot`(부록 A 16컬럼)·`daily_symbol_entries`·`slot_transition_log` + `intent_log`(OQ-1). `daily_slot_archive`/prune 는 범위 밖. `EXPECTED_SLOT_FIELDS` ↔ `daily_slot` 실제 컬럼(information_schema) 드리프트 테스트를 동반해 dcy-001 OQ-2 가 인계한 DB-side 검사를 실현한다. +- FR-6: `docs/interface-contract.md`·`docs/runtime-flows.md`·`docs/project-structure.md`·`docs/data-model.md` 를 데몬/API/영속화 레이어에 맞게 갱신한다. + +## 비기능 요구사항 +성능, 운영성, 일관성, 자동화 안정성 등 기능 외 요구사항을 적는다. + +- NFR-1: 도메인 순수성 유지 — `trex_core.domain.slot` 은 웹 프레임워크/psycopg 에 의존하지 않는다(의존은 API·persistence 어댑터 레이어에 격리; import 스윕으로 검증). +- NFR-2: 단일 writer 불변식 — `daily_slot`/`SlotService.transit_slot` 쓰기는 코어 경로에서만 일어난다(API 핸들러가 advisory lock 으로 직렬화). +- NFR-3: 멱등/내구성 — 수락된 intent 의 슬롯 전이는 at-least-once 재전송에도 1회만 반영된다(`intent_id` dedup via `intent_log`). "수락 == 커밋"이라 수락-후-미처리 유실 창이 없다. + +## 범위 경계 +이번 반복에서 반드시 포함할 범위와 명시적으로 제외할 범위를 구분한다. + +- In Scope + - 데몬 런타임 + HTTP API(intent 제출 + holding/capacity 조회 + health). + - PostgreSQL `SlotRepository` 영속화(단일 writer) + 멱등 intent 처리. + - baseline 문서 갱신. +- Out of Scope (후속 Discovery) + - 완전 비동기 durable outbox(intent 상태머신 + 소비 루프) — 브로커 집행 Discovery 에서 `intent_log` 를 승격(OQ-1 Deferred 부분). + - 브로커 단일 세션/실제 주문 집행(불변식 B, order execution). + - safety floor(forced_close/EOD/손절 backstop, liveness 게이팅) 및 sell_evaluation_log. + - 매수·매도 전략 데몬 자체 구현(코어의 소비자이며 별 repo/프로세스). + - 인증/인가 고도화, 멀티테넌시, 수평 확장. + +# 6. 리스크/가정 목록 +불확실성과 전제 조건을 분리해서 적는다. 리스크는 영향과 완화 방안을, 가정은 현재 판단의 전제를 기록한다. + +## 리스크 +- R-1 (High): 브로커 집행 없이 코어만 만들면 intent→슬롯 전이까지만 동작해 "거래"는 미완성. 부분 가치만 실현. + - 완화 방안: 이번 반복을 "durable 단일 writer 슬롯 코어 + API 경계"로 한정하고, 브로커/ safety floor 를 후속 Discovery 로 명시 인계(범위 경계에 박음). +- R-2 (Medium): HTTP 는 at-least-once 를 보장하지 않아 intent 중복/유실 가능. + - 완화 방안(OQ-1 결정): `intent_id` 멱등키(FR-4) + 수락 시 동기 커밋 + `intent_log` durable 기록. 브로커 집행이 들어오는 후속 Discovery 에서 `intent_log` 에 status+소비 루프를 얹어 outbox 로 점진 승격(API 계약 무변경). +- R-3 (Medium): 웹 프레임워크/psycopg 의존이 도메인 순수성을 오염시킬 위험. + - 완화 방안: 레이어 분리(domain/ application/ adapters) + import 스윕 가드(NFR-1, dcy-001 의 계약 테스트 패턴 확장). +- R-4 (Medium): orbit-v2 SQL 스키마와 trex-core `Slot` 컬럼 계약(부록 A) 불일치 위험. + - 완화 방안: 부록 A 를 기준으로 스키마 작성 + 드리프트 테스트(dcy-001 이 인계한 DB-side 검사 여기서 실현). + +## 가정 +아직 확정되지 않았지만 현재 문서 작성의 기반이 되는 전제를 적는다. + +- A-1: 매수·매도 전략은 별도 프로세스이며 코어 API 의 클라이언트다(코어는 전략 로직을 포함하지 않는다). +- A-2: 단일 코어 인스턴스가 `daily_slot` 단일 writer 다(슬라이스 1 은 수평 확장 비대상). +- A-3: 영속화는 PostgreSQL 을 사용하며 dcy-001 부록 A 컬럼 계약을 만족한다. + +## 오픈 질문 +답을 아직 모르는 항목을 적는다. 추정으로 덮지 말고 REQ 초안 작성 이전에 확인할 질문으로 남긴다. + +- OQ-1: intent 내구성 — 수락 시 동기 admission+커밋(슬라이스 1 기본) vs 내부 durable outbox 적재 후 비동기 소비. + - 상태: Answered (2026-06-03) + - 결정: **동기 커밋 + `intent_id` 멱등 + durable `intent_log` 이음매**. 수락 시 admission+슬롯 전이를 동기 커밋하고 admit/reject 를 즉시 응답, 수락 intent 를 같은 트랜잭션에서 `intent_log` 에 기록. 완전 비동기 outbox 는 가치(느린 브로커 집행 디커플링)가 실현되는 **브로커 집행 Discovery 로 Deferred** 하며, 그때 `intent_log` 에 status+소비 루프를 얹어 API 계약 변경 없이 승격한다. 근거: 이번 범위엔 intent 뒤 느린 다운스트림이 없어 outbox 이득 미실현 + 동기 응답이 매수 admit/reject UX 에 유리 + "수락==커밋"이 유실 창 제거. + - 반영 위치: `# 4`(멱등 처리 항목), `# 5` FR-4·NFR-3, `# 6` R-2 완화, `# 5` Out of Scope(완전 outbox Deferred). +- OQ-2: API 프레임워크/스택 — FastAPI+uvicorn(기본 권장) vs Flask vs stdlib http. Python >=3.12. + - 상태: Answered (2026-06-03) + - 결정: **FastAPI + uvicorn** 채택. 근거: 타입 기반 요청/응답 검증(pydantic), async, OpenAPI 자동 문서. Python >=3.12. + - 반영 위치: `# 4` 코드 영향(API 어댑터·pyproject 의존성). REQ 단계에서 부트스트랩(REQ-A 계열)에 의존성·버전 고정. +- OQ-3: 엔드포인트 1차 범위 — `/intents/buy`,`/intents/sell`,`/slots`,`/capacity`,`/healthz` 로 충분한지, admission 결과 조회/취소 엔드포인트가 필요한지. + - 상태: Answered (2026-06-03) + - 결정: 아래 6개로 1차 고정(`/v1` 버전 프리픽스). 모두 단일 코어 데몬이 노출. + - `GET /v1/healthz` — liveness/readiness. + - `POST /v1/intents/buy` — 매수 intent 수락, 동기 admit/reject 응답(+ slot_id). + - `POST /v1/intents/sell` — 매도 intent 수락, 동기 admit/reject 응답. + - `GET /v1/intents/{intent_id}` — 멱등 재조회/audit(POST 응답 유실 시 결정 재확인; FR-4 보강). + - `GET /v1/slots?status=holding` — holding 슬롯 스냅샷 read-only(status/trading_date 필터). + - `GET /v1/capacity` — idle/holding/pending + scarcity_ratio. + - 제외(슬라이스 1): intent 취소/admission 취소 엔드포인트(브로커·rollback 경로와 함께 후속), 슬롯 사전할당 엔드포인트(데몬 lifecycle 내부 처리, FR-1). + - 반영 위치: `# 5` FR-1/FR-2/FR-3/FR-4, `# 4` HTTP API 경계. interface-contract 초안은 REQ/Batch design 에서 고정. +- OQ-4: 영속화 스키마 출처 — orbit-v2 의 slot SQL 을 가져와 정합 vs 부록 A 기준으로 신규 작성. + - 상태: Answered (2026-06-03) + - 결정: **부록 A 를 단일 기준으로 trex-core 소유의 신규 마이그레이션을 작성**하고 orbit-v2 DDL 은 참조 구현으로만 사용. 슬라이스 1 테이블 = `daily_slot`·`daily_symbol_entries`·`slot_transition_log`·`intent_log`(archive/prune 제외). `EXPECTED_SLOT_FIELDS`↔information_schema 드리프트 테스트로 dcy-001 OQ-2 의 DB-side 검사 실현. 근거: 신규 베이스가 자기 스키마 lineage 를 소유(OQ-1 독립 결정과 일관) + 검증된 orbit DDL 재사용(재발명 회피). + - 반영 위치: `# 5` FR-5, `# 6` R-4 완화. + +### 오픈 질문 처리 기준 +- `Open`: 아직 답이 없고 다음 단계 진행에 영향이 있는 상태다. 문서에 유지한다. +- `Answered`: 답이 확정된 상태다. 관련 본문/요구사항에 반영한 뒤 오픈 질문 목록에서는 제거하거나 resolved 기록으로 이동한다. +- `Deferred`: 지금 단계에서 결정하지 않고 다음 단계 또는 후속 이슈로 넘기는 상태다. 넘길 대상과 이유를 반드시 적는다. +- `Dropped`: 더 이상 유효하지 않은 질문이다. 삭제 사유를 짧게 남기고 목록에서 제거한다. +- 처리 원칙 1: 질문만 남기지 말고 반드시 `상태`, `처리 방안`, `종료 조건`을 함께 적는다. +- 처리 원칙 2: 답이 나온 질문은 본문 반영 없이 단순 삭제하지 않는다. 반영 위치를 먼저 갱신한다. +- 처리 원칙 3: High 영향 질문은 `Deferred` 처리 후 처리 방안에 REQ 인계 추적 방식을 명시한다. + +# 7. 초기 성공 기준 +이 변경이 성공했다고 판단할 기준을 측정 가능하게 정의한다. 가능하면 데이터 출처까지 연결한다. + +- S-1: 코어 데몬을 기동하고 `GET /v1/healthz` 가 200 을 반환한다. +- S-2: `POST /v1/intents/buy` 호출 시 idle 슬롯이 pending_buy 로 전이되고, 동일 `intent_id` 재전송이 중복 전이를 만들지 않는다(멱등). +- S-3: `GET /v1/slots?status=holding` 가 holding 슬롯 스냅샷을 read-only 로 반환한다. +- S-4: PostgreSQL repo 로 코어를 구동했을 때 도메인 단위테스트/통합테스트가 통과하고, `daily_slot` 쓰기가 코어 경로로만 발생한다(단일 writer). +- S-5: 도메인 패키지 import 스윕에서 웹 프레임워크/psycopg 의존이 0 으로 유지된다(레이어 격리). + +## 측정 방식 및 데이터 출처 +각 성공 기준을 어떻게 측정할지와 어떤 데이터나 문서를 근거로 쓸지 적는다. + +- S-1 측정 방식: 데몬 기동 후 healthz 호출 / 데이터 출처: 통합테스트 또는 수동 curl 로그. +- S-2 측정 방식: API 통합테스트(정상 1회 + 중복 재전송) / 데이터 출처: 테스트 결과, 슬롯 상태·transition_log. +- S-3 측정 방식: holding 슬롯 조성 후 GET 응답 검증 / 데이터 출처: API 통합테스트. +- S-4 측정 방식: PostgreSQL 백엔드 통합테스트(가능 시) + 쓰기 경로 정적 검토 / 데이터 출처: 테스트 결과, 코드 리뷰. +- S-5 측정 방식: 정적 import 스윕 / 데이터 출처: `trex_core/domain/slot` import 목록. + +# 8. REQ로 넘기기 전 확인 체크 +REQ 초안 작성 단계로 넘기기 전에 무엇이 확정되어야 하는지 확인한다. 미완료 항목은 후속 결정이 필요함을 뜻한다. + +- [x] 범위(In Scope/Out of Scope) 확정 — 특히 브로커/safety floor 제외 + - 기준: 운영자가 슬라이스 1 경계를 확인했다. → confirm-discovery 에서 문서대로 확정(2026-06-03). +- [x] 성공 지표의 측정 방식/데이터 출처 확정 + - 기준: S-1~S-5 측정 방식·출처 명시(본 문서 # 7). +- [x] High 영향 리스크(R-1) 처리 방침 확정 + - 기준: R-1(브로커 미포함) 을 후속 Discovery 인계로 수용. → 범위 경계 확정과 함께 수용(2026-06-03). +- [x] 모든 오픈 질문(OQ) `Open` 상태 없음 확인 + - 기준: OQ 목록에 `Open` 0개 또는 잔여 전부 `Deferred` (OQ-1~OQ-4 전부 Answered → `Open` 0개) +- [x] Freeze 확정 담당자(CONFIRMED_BY) 지정 + - 기준: 운영자가 confirm-discovery 시점에 CONFIRMED_BY 를 지정한다. → Confirmed By: Justin. + +# 9. 파일 처리 결과 +이 Discovery 문서 생성/갱신 결과와 참조 문서를 기록한다. 이후 추적과 리뷰 시 근거로 사용한다. + +- 처리 결과: 생성 +- 생성 경로: docs/discovery/dcy-002_20260603_slot-core-daemon-http-api.md +- 참조 문서: + - docs/discovery/dcy-001_20260603_slot-pure-domain-migration.md (순수 도메인 코어 + 부록 A 컬럼 계약) + - docs/project-structure.md, docs/runtime-flows.md, docs/interface-contract.md, docs/data-model.md (baseline — 본 Discovery 가 갱신 요구) + - trex-orbit `orbit-v2_plan.md` (3-데몬 설계 참고자료) + +# 10. 사용자 결정 필요 항목 요약 +사용자나 승인자가 결정해야 하는 항목만 모아 정리한다. 결정, 확인, 데이터 요청을 구분해서 적는다. + +## DECIDE +- ~~intent 내구성~~ → 결정됨: 동기 커밋 + `intent_id` 멱등 + durable `intent_log`, 완전 outbox 는 브로커 Discovery 로 Deferred (OQ-1, 2026-06-03) +- ~~영속화 스키마 출처~~ → 결정됨: 부록 A 기준 trex-core 소유 신규 마이그레이션(orbit-v2 DDL 참조), archive 제외, 드리프트 테스트 동반 (OQ-4, 2026-06-03) + +## CONFIRM +- ~~API 프레임워크~~ → 결정됨: FastAPI + uvicorn (OQ-2, 2026-06-03) +- ~~1차 엔드포인트 집합~~ → 결정됨: `/v1`(healthz, intents/buy, intents/sell, intents/{id}, slots, capacity); 취소·preallocate 엔드포인트 제외 (OQ-3, 2026-06-03) +- ~~범위 경계(브로커 deferral)~~ → 확정됨: 브로커 집행·safety floor·완전 outbox·전략 데몬을 후속 Discovery 로 미루고 슬라이스 1(데몬+API+영속화+멱등) 승인 (confirm-discovery, 2026-06-03) + +## DATA +- 없음 (별도 외부 데이터 요청 없음) + +# 11. Discovery Freeze +REQ 초안 작성 인계 시점의 확정 플래그와 섹션 참조만 기록한다. 내용 재작성 없이 원본 섹션을 링크로 대신한다. + +## 섹션 참조 +- 범위: [# 5. 요구사항 목록 > 범위 경계](#5-요구사항-목록) +- 리스크/오픈 질문: [# 6. 리스크/가정 목록](#6-리스크가정-목록) +- 성공 기준: [# 7. 초기 성공 기준](#7-초기-성공-기준) +- 인계 전 확인: [# 8. REQ로 넘기기 전 확인 체크](#8-req로-넘기기-전-확인-체크) +- 사용자 결정 필요: [# 10. 사용자 결정 필요 항목 요약](#10-사용자-결정-필요-항목-요약) + +## Freeze 플래그 +- Handoff Decision: 승인 +- Handoff Rationale: OQ-1~OQ-4 전부 Answered(내구성=동기+intent_log / 프레임워크=FastAPI / 엔드포인트=/v1 6종 / 스키마=부록 A 기준 신규). 범위 경계(브로커·safety floor·outbox·전략 데몬 후속 Deferred)와 R-1 처리 방침을 confirm-discovery 에서 확정, CONFIRMED_BY 지정 완료. REQ Drafting 으로 인계 가능. +- Ready for REQ Drafting: true +- Confirmed By: Justin +- Confirmed At (KST): 2026-06-03 diff --git a/docs/discovery/index.md b/docs/discovery/index.md index 4eb8261..d2284dd 100644 --- a/docs/discovery/index.md +++ b/docs/discovery/index.md @@ -6,4 +6,5 @@ | ID | 날짜 | 이슈명 | 문서 | 상태 | |---|---|---|---|---| -| dcy-001_20260603_slot-pure-domain-migration | 20260603 | trex-core 베이스 수립 및 slot 순수 도메인 이식 | [Discovery](./dcy-001_20260603_slot-pure-domain-migration.md) | confirmed | \ No newline at end of file +| dcy-001_20260603_slot-pure-domain-migration | 20260603 | trex-core 베이스 수립 및 slot 순수 도메인 이식 | [Discovery](./dcy-001_20260603_slot-pure-domain-migration.md) | confirmed | +| dcy-002_20260603_slot-core-daemon-http-api | 20260603 | trex-core 슬롯 코어 데몬화 + HTTP intent API | [Discovery](./dcy-002_20260603_slot-core-daemon-http-api.md) | confirmed | \ No newline at end of file