22 KiB
0. 문서 상태
이 문서의 현재 상태와 식별 정보를 기록한다. 문서 추적과 승인 흐름에 필요한 최소 메타데이터를 적는다.
- 상태: confirmed (transport 부분은 dcy-006/BAT-007 에서 RabbitMQ 로 대체됨; logical intent/admission 계약은 유효)
- 문서 ID: dcy-002_20260603_slot-core-daemon-http-api
- 이슈명: trex-core 슬롯 코어 데몬화 + HTTP intent API
- 작성 시각(KST): 2026-06-03
- 마지막 갱신 시각(KST): 2026-06-05 (BAT-007 transport supersede)
- 대체됨: 본 Discovery 의 HTTP
/v1API transport 가정은 dcy-006(strategy-module-rabbitmq-transport, BAT-007)에서 RabbitMQ messaging 으로 대체됨. logical 계약(intent admission, idempotency viaintent_log, 단일 writer 불변식)은 그대로 유효하며 transport 만 교체.adapters/api/HTTP 어댑터,GET /v1/healthz,POST /v1/intents/buy|sell,GET /v1/slots,GET /v1/capacity엔드포인트는 BAT-007 에서 제거됨. - 후속 Discovery 참조: dcy-006_20260605_strategy-module-rabbitmq-transport (transport 대체)
- 생성된 REQ 참조: REQ-005, REQ-006, REQ-007, REQ-008, REQ-009
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 는
- 기대 상태
- 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컬럼 계약을 영속화 구현이 만족해야 한다.
- 불변식 A —
주요 사용자 시나리오
사용자 또는 운영자가 실제로 어떤 상황에서 이 변경을 필요로 하는지 대표 시나리오를 적는다.
- 매수 전략 데몬이 신호 발생 시
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_iddedup viaintent_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/프로세스).
- 인증/인가 고도화, 멀티테넌시, 수평 확장.
- 완전 비동기 durable outbox(intent 상태머신 + 소비 루프) — 브로커 집행 Discovery 에서
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_logdurable 기록. 브로커 집행이 들어오는 후속 Discovery 에서intent_log에 status+소비 루프를 얹어 outbox 로 점진 승격(API 계약 무변경).
- 완화 방안(OQ-1 결정):
- 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멱등 + durableintent_log이음매. 수락 시 admission+슬롯 전이를 동기 커밋하고 admit/reject 를 즉시 응답, 수락 intent 를 같은 트랜잭션에서intent_log에 기록. 완전 비동기 outbox 는 가치(느린 브로커 집행 디커플링)가 실현되는 브로커 집행 Discovery 로 Deferred 하며, 그때intent_log에 status+소비 루프를 얹어 API 계약 변경 없이 승격한다. 근거: 이번 범위엔 intent 뒤 느린 다운스트림이 없어 outbox 이득 미실현 + 동기 응답이 매수 admit/reject UX 에 유리 + "수락==커밋"이 유실 창 제거. - 반영 위치:
# 4(멱등 처리 항목),# 5FR-4·NFR-3,# 6R-2 완화,# 5Out 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).
- 반영 위치:
# 5FR-1/FR-2/FR-3/FR-4,# 4HTTP 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 재사용(재발명 회피). - 반영 위치:
# 5FR-5,# 6R-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/slotimport 목록.
8. REQ로 넘기기 전 확인 체크
REQ 초안 작성 단계로 넘기기 전에 무엇이 확정되어야 하는지 확인한다. 미완료 항목은 후속 결정이 필요함을 뜻한다.
- 범위(In Scope/Out of Scope) 확정 — 특히 브로커/safety floor 제외
- 기준: 운영자가 슬라이스 1 경계를 확인했다. → confirm-discovery 에서 문서대로 확정(2026-06-03).
- 성공 지표의 측정 방식/데이터 출처 확정
- 기준: S-1~S-5 측정 방식·출처 명시(본 문서 # 7).
- High 영향 리스크(R-1) 처리 방침 확정
- 기준: R-1(브로커 미포함) 을 후속 Discovery 인계로 수용. → 범위 경계 확정과 함께 수용(2026-06-03).
- 모든 오픈 질문(OQ)
Open상태 없음 확인- 기준: OQ 목록에
Open0개 또는 잔여 전부Deferred(OQ-1~OQ-4 전부 Answered →Open0개)
- 기준: OQ 목록에
- 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멱등 + durableintent_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. 요구사항 목록 > 범위 경계
- 리스크/오픈 질문: # 6. 리스크/가정 목록
- 성공 기준: # 7. 초기 성공 기준
- 인계 전 확인: # 8. REQ로 넘기기 전 확인 체크
- 사용자 결정 필요: # 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