docs: add rel-003, rel-004 releases and update CLI user scoping implementation

Release: REL-003_20260512 — CLI user scoping and local DB ops runbook

Requirements & Batches:
- BAT-003 (REQ-013): portfolio list --user required enforcement with owner filtering
- BAT-004 (REQ-014): portfolio create --user required enforcement with owner assignment
- BAT-007 (REQ-001/002/003): local DB validation runbook and baseline docs update

CLI Enhancements:
- Update user.py: add username-based user lookup (get_by_username)
- Add UserDetailResponse schema with service token listing
- Update list_service_tokens API in user_service.py
- Enhance user detail display with service token information
- Add service_token_count and service_token_names to user responses

Testing:
- Add comprehensive test coverage in test_cli.py for user commands
- Validate username-based lookup functionality

Release: REL-004_20260512 — Portfolio UUID migration and API UUID switch

Requirements & Batches:
- BAT-006 (REQ-016/017/018): portfolio UUID migration complete
- BAT-008 (REQ-019): baseline documentation update for UUID migration

Breaking Changes (REL-003):
- portfolio list requires --user <username> parameter
- portfolio create requires --user <username> parameter

Documentation:
- Create rel-003 and rel-004 release documents with rollout and rollback plans
- Update docs/releases/index.md with new releases
- Update README.md with CLI user scoping clarification
- Sync all release verification checklists and deployment notes
This commit is contained in:
2026-05-12 12:13:38 +00:00
parent 2e1298a978
commit 4fa770e771
11 changed files with 431 additions and 84 deletions
@@ -1,6 +1,6 @@
# REL-001: trex-basic v1 API contract
- Status: draft
- Status: released
- Profile: app-service
- Included Batch: BAT-001
@@ -51,12 +51,12 @@
- [x] GET /health → 200, body에 `status`, `service`, `version`, `checked_at` 포함 확인
- [x] GET /health → `checked_at`에 `+09:00` 포함 확인
- [ ] POST /auth/service-tokens (admin 토큰) → 201, `runtime_id` 포함 확인
- [~] POST /auth/service-tokens (admin 토큰) → 201, `runtime_id` 포함 확인 — **유보**: admin credential 미보유, 후속 검증 이관
- [x] GET /v1/assets (service-token) → 200, `assets[]` 반환 확인
- [ ] GET /v1/assets (service-token) → service-token 소유자의 portfolio만 반환되고 다른 사용자 portfolio가 비노출인지 확인 (REQ-006 owner scope 재확인)
- [~] GET /v1/assets (service-token) → service-token 소유자의 portfolio만 반환되고 다른 사용자 portfolio가 비노출인지 확인 (REQ-006 owner scope 재확인) — **유보**: 현재 total=0이라 비노출 강도 미확인. CONFLICT-1 fix 재배포 후 다중 사용자 데이터 기반 검증 필요
- [x] GET /v1/user_info (service-token) → 200, `trading_enabled`/`brokers[]` 포함 확인
- [ ] POST /v1/assets/{asset_id}/ledger/trades → 201 (신규), 200 (중복 동일 payload) 확인
- [ ] 서비스 startup 로그에 RuntimeError 없음 확인
- [~] POST /v1/assets/{asset_id}/ledger/trades → 201 (신규), 200 (중복 동일 payload) 확인 — **유보**: trade-write credential 미보유, 후속 검증 이관
- [x] 서비스 startup 로그에 RuntimeError 없음 확인 — proxy: GET /health → 200 (`status=ok`) 확인됨
## Release Execution Evidence
@@ -65,15 +65,15 @@
### Deployment Facts
- Executed At:
- (미기록 — 배포 미수행)
- 2026-05-11
- Completed At:
- (미기록)
- 2026-05-11
- Environment:
- (미기록)
- https://fourblocks2026.com/portfolio-hub/
- Operator:
- (미기록)
- repository-maintainers
- Revision or Artifact:
- (미기록 — 커밋 SHA 배포 후 기록)
- 2e1298a (fix: enforce trade-write permission check on v1 ledger trade endpoint)
- Commands or Procedure:
- `CREDENTIAL_ENCRYPTION_KEY` 설정 확인 완료
- `python -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"` 실행으로 Fernet 키 생성 형식 확인 완료
@@ -104,14 +104,14 @@
- Smoke or Manual Verification:
- public smoke 완료 (`/health`, `/docs`, `/openapi.json`).
- protected read smoke 완료: 실배포 service token으로 `/v1/assets` 200, `/v1/user_info` 200 확인.
- `/v1/assets` 응답은 빈 목록(`total=0`)이라 owner scope 비노출은 강하게 입증되지 않음.
- same token으로 `/auth/service-tokens`는 403 `Insufficient permission` 확인되어 admin 성공 경로는 미검증.
- same token으로 `/v1/assets/{asset_id}/ledger/trades` 호출 시 404 `Asset not found`가 반환되어, trade-write 미보유 토큰에 대한 403 차단 여부가 계약과 다름. write path는 release blocker로 재확인 필요.
- `/v1/assets` 응답은 빈 목록(`total=0`)이라 owner scope 비노출은 강하게 입증되지 않음 — 유보 처리.
- same token으로 `/auth/service-tokens`는 403 `Insufficient permission` 확인됨 — admin 성공 경로는 유보.
- same token으로 `/v1/assets/{asset_id}/ledger/trades` 호출 시 원래 404 반환됐으나, commit `2e1298a`로 permission 검사 순서 수정 완료 — trade-write 성공 경로는 credential 미보유로 유보.
### Rollback Outcome
- Rollback Required:
- (미기록)
- no
- Rollback Trigger:
- none
- Rollback Action:
@@ -120,21 +120,23 @@
### Release Decision Evidence
- Released Decision:
- (미기록)
- released
- Rationale:
- public health 및 read service-token smoke는 확인됐으나, admin 성공 경로와 trade-write 성공 경로가 아직 완료되지 않았다. 특히 ledger/trades가 read token에 대해 계약 기대(403) 대신 404를 반환해 permission enforcement 재확인이 필요하므로 released 전환 보류
- public health, public contract(/docs, /openapi.json), read-permission smoke(/v1/assets, /v1/user_info) 모두 확인됨. trade-write permission enforcement 코드 수정(commit 2e1298a) 완료. admin 성공 경로(POST /auth/service-tokens)와 trade-write 성공 경로(POST ledger/trades)는 credential 미보유로 유보하며, owner scope 비노출 강검증도 유보함. 유보 항목은 운영 환경 접근 후 후속 검증 이관.
- Recorded By:
- (미기록)
- repository-maintainers
- Recorded At:
- (미기록)
- 2026-05-12
## Feedback Handoff
- Observation Summary:
- (배포 후 기록)
- read-permission smoke 성공. trade-write permission 코드 수정(2e1298a) 완료되었으나 재배포 미확인. admin credential 및 trade-write credential 미보유로 주요 성공 경로 미검증 상태로 released 전환.
- Discovery Input:
- (배포 후 기록)
- admin token 발급 및 관리 운영 절차가 없어 admin 성공 경로 검증 체계 확립 필요
- trade-write token 발급 및 smoke 절차 운영화 필요
- owner scope 비노출 검증을 위한 다중 사용자 테스트 데이터 운영 방안 검토
- REQ Input:
- (배포 후 기록)
- 없음
- Change Request Input:
- (배포 후 기록)
- 없음