feat: v1 portfolio mutation, sub-resources, ledger path migration (BAT-008~011)
dcy-003/004 기반 v1 API surface 완성 및 BAT-008~011 구현·검증 완료:
- BAT-008 (REQ-019~021,024): 토큰 surface baseline 문서 갱신
- BAT-009 (REQ-025~028): POST/PATCH/DELETE/GET /v1/portfolios CRUD 신설
- _require_write_token, _get_portfolio_or_404, soft delete, daemon-scoped list
- BAT-010 (REQ-030~032): portfolio tag/comment 서브 라우트 신설 + baseline 갱신
- GET/POST/DELETE /v1/portfolios/{id}/tags
- POST/GET/PATCH/DELETE /v1/portfolios/{id}/comments
- BAT-011 (REQ-029): ledger path migration
- POST /v1/assets/{asset_id}/ledger/trades → /v1/portfolios/{portfolio_id}/ledger/trades
- v1_ledger.py 제거, disabled 차단(409) 추가
- test_v1.py / test_daemon_assignment.py 구 path 갱신
- 신규 tests: test_v1_portfolios_crud.py, test_v1_portfolios_list.py,
test_v1_portfolios_tags_comments.py, test_v1_portfolios_ledger.py
- 전체 suite: 340 passed
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
# BAT-008 Design
|
||||
|
||||
- Status: confirmed
|
||||
- Batch: BAT-008
|
||||
|
||||
## Architecture Summary
|
||||
- 코드 변경 없이 baseline 4종 문서(`docs/interface-contract.md`, `docs/runtime-flows.md`, `docs/data-model.md`, `docs/project-structure.md`)를 편집한다.
|
||||
- REQ-019는 BAT-006/007 코드 변경을 반영하는 "정합성 회복" 역할, REQ-020/021/024는 신규 정책 섹션을 추가하는 "정책 명세" 역할로 분리한다.
|
||||
|
||||
## Changed Areas
|
||||
- Docs:
|
||||
- `docs/data-model.md` — auth_tokens 인덱스 조건 갱신, client token 제거
|
||||
- `docs/interface-contract.md` — rebind CLI 명세 추가, POST /auth/tokens 제거, daemon_id forward 명시, 권한 매트릭스 신규 섹션
|
||||
- `docs/runtime-flows.md` — AuthContext daemon_id 추가, 토큰 surface 3종 축소, rotate 흐름, 만료·회전 정책 신규 섹션, env admin SOP 신규 섹션
|
||||
- `docs/project-structure.md` — migrate-null-daemon CLI 서브커맨드, revoke_tokens_by_daemon_id 추가 반영 (필요 시)
|
||||
- Modules: 없음 (코드 변경 없음)
|
||||
- Interfaces: 없음
|
||||
|
||||
## Key Decisions
|
||||
|
||||
1. **파일별 REQ 담당 분리 (충돌 방지)**
|
||||
- `docs/data-model.md`: REQ-019 단독 담당 (인덱스 변경, client 타입 제거)
|
||||
- `docs/interface-contract.md`: REQ-019(rebind/POST /auth/tokens/daemon_id) + REQ-020(권한 매트릭스 신규 섹션)
|
||||
- `docs/runtime-flows.md`: REQ-019(AuthContext/rotate/surface 3종) + REQ-021(만료·회전 정책 섹션) + REQ-024(env admin SOP 섹션)
|
||||
- `docs/project-structure.md`: REQ-019(선택 — CLI/메서드 추가 반영)
|
||||
|
||||
2. **권한 매트릭스 구조 (REQ-020)**
|
||||
- 차원: token type(session/service/env) × 동사(issue/rotate/rebind/revoke/list) × 발급자 권한(admin/trade-write/read)
|
||||
- client token 제외 (REQ-016 폐지 반영)
|
||||
- admin 자기 발급 허용 + 최소 권한 권장 주석 포함 (dcy-004 OQ-4)
|
||||
- 매트릭스 위반 → HTTP 403 fail-closed (dcy-004 NFR-4)
|
||||
|
||||
3. **만료·회전 정책 섹션 위치 (REQ-021)**
|
||||
- `docs/runtime-flows.md`에 "토큰 만료·회전 정책" 섹션 신규 추가
|
||||
- type별 TTL: session=settings.session_token_ttl_hours, service=365일 default, env=만료 없음
|
||||
- no_expiry 허용 범위: service 한정, session 거부 시 ValueError/HTTP 422
|
||||
|
||||
4. **env admin SOP 위치 (REQ-024)**
|
||||
- `docs/runtime-flows.md`에 "env admin token 운영 SOP" 섹션 추가 (README.md 링크 선택)
|
||||
- 7단계 회전 절차 + rollback + token 강도 가이드 + 권장 회전 주기(분기)
|
||||
|
||||
5. **POST /auth/tokens 처리 방식 (REQ-019 AC-2)**
|
||||
- 명세 항목 완전 제거 (또는 "Deprecated: REQ-016에서 폐지" 표시로 잔존)
|
||||
- 구현 편의상 "Deprecated" 주석 표시 후 섹션 삭제하는 방식으로 진행
|
||||
|
||||
6. **project-structure.md 갱신 범위 (REQ-019)**
|
||||
- migrate-null-daemon CLI 서브커맨드 추가 사실 반영
|
||||
- `revoke_tokens_by_daemon_id`, `list_service_tokens_with_null_daemon` 저장소 메서드 추가 사실 반영
|
||||
- 파일 자체 신규 생성 없이 기존 섹션 보강
|
||||
|
||||
## Edge Cases
|
||||
- REQ-021 no_expiry session 거부: 현행 코드에서 session 경로에 no_expiry 파라미터가 없어 코드 level 거부가 구현되지 않음 → 정책 문서에 "policy: 거부, code: 현행 미구현, follow-up 필요" 형태로 명시
|
||||
- 매트릭스 코드 불일치 발견 시: REQ-020 AC-4에 따라 불일치 항목을 별도 follow-up으로 기록하고 매트릭스 본문에 "⚠ 불일치" 표시
|
||||
|
||||
## Architecture Impact
|
||||
- none (문서 전용, 코드·런타임 변경 없음)
|
||||
|
||||
## Reference Doc Update Plan
|
||||
- project-structure.md: CLI 서브커맨드·저장소 메서드 추가 사실 반영 (소규모 갱신)
|
||||
- runtime-flows.md: 신규 정책 섹션 2개 추가 + AuthContext 갱신 + rotate 흐름 보강
|
||||
Reference in New Issue
Block a user