Files
portfolio-hub/docs/batches/bat-008_20260521_token-surface-docs/design.md
T
genichinandClaude Sonnet 4.6 4bf6b554a7 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>
2026-05-21 07:25:39 +00:00

3.7 KiB
Raw Blame History

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 흐름 보강