docs(proofline): approve line 0004 requirements

This commit is contained in:
2026-08-15 13:59:21 +09:00
parent 2abd67da97
commit 19b63a336e
10 changed files with 198 additions and 1 deletions
+61
View File
@@ -0,0 +1,61 @@
---
id: "req-0004"
status: approved
discovery: "dcy-0004"
criteria:
create:
- "ac-0024"
- "ac-0025"
- "ac-0026"
- "ac-0027"
- "ac-0028"
- "ac-0029"
- "ac-0030"
- "ac-0031"
update: []
retire: []
satisfy: []
---
# 포트폴리오 데몬 배정 persistence와 소유자 불변식
## Objective
포트폴리오 생성·수정에서 선택한 비-null `managed_by_daemon_id`를 일관되게 검증·저장하고, daemon의 존재·활성·소유자 변경과 경합하더라도 승인된 오류 계약과 동일 소유자 불변식을 원자적으로 보존한다.
## Scope
- `POST /v1/portfolios`가 비-null `managed_by_daemon_id`를 생성 persistence에 반영하고 성공 응답과 후속 조회에서 같은 값을 반환한다.
- 데몬 미선택 생성은 기존처럼 `managed_by_daemon_id = null`인 미배정 포트폴리오를 생성한다.
- 생성과 PATCH의 비-null 데몬 지정·재지정은 server-generated UUID 형식, 존재, active 상태와 target portfolio owner 기준 동일 소유자를 검증한다.
- admin이 다른 사용자를 대신해 생성·수정하는 경우 호출자가 아니라 최종 target portfolio owner를 데몬 소유권 비교 기준으로 사용한다.
- malformed UUID는 `422`, 미존재·foreign daemon은 존재를 숨겨 `404`, 소유자 범위의 inactive daemon은 `409`로 실패하고 portfolio와 관련 상태를 부분 변경하지 않는다.
- 데몬 검증과 portfolio write를 하나의 원자적 transaction 및 row-lock 경계로 직렬화한다.
- 데몬 비활성화가 assignment보다 먼저 확정되면 새 assignment를 거부하고, assignment가 먼저 확정된 뒤 비활성화되면 기존 reference를 보존하면서 기존 service-token revoke 계약을 적용한다.
- 참조 중인 daemon의 owner transfer를 `409`로 거부하고 owner, portfolio assignment와 broker credentials를 무변경으로 보존한다. 미참조 daemon owner transfer는 기존 credential invalidation 계약을 유지한다.
- 기존 portfolio mutation의 인증·소유권·strategy·asset·disabled-state 보호를 유지한다.
## Constraints
- `managed_by_daemon_id`는 기존 soft reference와 server-generated UUID identity를 유지하며 내부 식별자·테이블 구조를 변경하지 않는다.
- explicit `managed_by_daemon_id: null` PATCH 해제는 이 REQ가 소유하지 않는다.
- 자동 데몬 배정·해제·이전·재배정과 기존 데이터 일괄 backfill을 수행하지 않는다.
- `trex-web` 코드·타입·화면·테스트와 필수 `strategy_id` UI 적응은 범위 밖이다.
### Current Implementation Assessment
- 이 REQ와 AC는 요청자의 명시적 지시에 따라 confirmed Discovery와 이미 local `main`에 반영된 구현을 사후 specification으로 포착한다. `approved`/`active`는 normative authority이며 과거 ProofLine implementation chronology, terminal lifecycle closure, 배포 또는 release satisfaction marker가 아니다.
- 제품 구현은 `e2102b6f2b855b7679ab67818202ef706d9848fb`와 1차 QC 보완 `e90519ad3968b48711ced37f42fb45bd883a82af`에 존재하며, evidence 포함 현재 local `main`은 `2abd67da973d334c18d94396292bcc19bd2f81d8`이다.
- 2차 QC에서 집중 API/CRUD/admin daemon `62 passed`, 기본 전체 suite `624 passed, 18 skipped`, migration head 적용 disposable PostgreSQL daemon+strategy integration `12 passed`, assignment/owner-transfer race 반복 `5/5 passed`를 확인했다.
- 변경 production 및 신규 line-0004 테스트 Ruff, `compileall`, `git diff --check`, `proofline validate`가 통과했고 별도 read-only 독립 QC reviewer도 PASS를 기록했다. 기존 admin daemon test의 F401 6건과 deprecation warning은 기준 커밋에 존재한 비차단 debt다.
- push, PR, 원격 main 반영, 운영 DB migration 실행, 배포와 release는 수행되지 않았다.
## Non-Goals
- `trex-web` 또는 다른 서비스 변경
- PATCH의 명시적 `managed_by_daemon_id: null` 해제 지원
- daemon 실행·중지·재시작이나 배포 자동화
- 자동 assignment 해제·owner 이전·다른 daemon 재배정·backfill
- 내부 `daemons`·`portfolios` 식별자 또는 테이블 구조 변경
- push, PR, 원격 main 반영, production migration, 배포 또는 release 승인
- 사후 specification으로 과거 구현에 ProofLine 정식 delivery chronology나 terminal closure를 소급 부여하는 행위