From 16746008ccad14463f1c7ee53596fa4e3d68e73d Mon Sep 17 00:00:00 2001 From: Justin Ko Date: Fri, 19 Jun 2026 17:59:36 +0900 Subject: [PATCH] =?UTF-8?q?docs(rel-002):=20released=20=EC=A0=84=ED=99=98?= =?UTF-8?q?=20=E2=80=94=20M1=20=EB=B0=B0=ED=8F=AC=20evidence=20=EA=B7=80?= =?UTF-8?q?=EC=86=8D=20(trex-op=202026-06-19)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 Claude-Session: https://claude.ai/code/session_01VHtM5Ws1HKCKQ4JGi6GRb5 --- docs/releases/index.md | 2 +- ...-002_20260619_trade-history-and-pnl-api.md | 75 ++++++++++++------- 2 files changed, 50 insertions(+), 27 deletions(-) diff --git a/docs/releases/index.md b/docs/releases/index.md index 0e8bcf7..af02a13 100644 --- a/docs/releases/index.md +++ b/docs/releases/index.md @@ -9,4 +9,4 @@ | REL ID | Profile | Status | Included Batch | Date | Doc | | --- | --- | --- | --- | --- | --- | | REL-001 | app-service | released | BAT-001~016 (전체 통합) | 2026-05-21 | [rel-001](./rel-001_20260521_v1-api-full-surface.md) | -| REL-002 | app-service | confirmed | BAT-017 (dcy-007 M1: 거래내역+실현PnL API) | 2026-06-19 | [rel-002](./rel-002_20260619_trade-history-and-pnl-api.md) | +| REL-002 | app-service | released | BAT-017 (dcy-007 M1: 거래내역+실현PnL API) | 2026-06-19 | [rel-002](./rel-002_20260619_trade-history-and-pnl-api.md) | diff --git a/docs/releases/rel-002_20260619_trade-history-and-pnl-api.md b/docs/releases/rel-002_20260619_trade-history-and-pnl-api.md index 145ab41..ac93327 100644 --- a/docs/releases/rel-002_20260619_trade-history-and-pnl-api.md +++ b/docs/releases/rel-002_20260619_trade-history-and-pnl-api.md @@ -1,6 +1,6 @@ # REL-002: 일일 거래내역 + 실현 PnL 조회 API (dcy-007 M1) -- Status: confirmed +- Status: released - Profile: app-service - Included Batch: BAT-017 @@ -49,15 +49,15 @@ - [ ] DB 마이그레이션 불필요 확인 (alembic head `20260605_0025` 그대로) - [ ] REL-001 운영 인스턴스 health 정상 확인 (배포 베이스라인) - **배포 직후 (portfolio-hub)**: - - [ ] `GET /health` → HTTP 200 + `db_enabled: true` 확인 - - [ ] `GET /v1/portfolios/{id}/trades?date=YYYY-MM-DD` (read_token 이상) → HTTP 200 + 항목 필드(`trade_id`, `side`, `quantity`, `price`, `executed_at`, `fee_amount`, `tax_amount`) 확인 (REQ-039 AC-1) - - [ ] `GET /v1/portfolios/{id}/trades` (날짜 파라미터 누락) → HTTP 422 확인 (REQ-039 AC-3) - - [ ] `GET /v1/portfolios/{id}/pnl/realized?from=YYYY-MM-DD&to=YYYY-MM-DD` (read_token 이상) → HTTP 200 + `total_realized_pnl`, `cost_basis_from`, `items`, `data_completeness_warning` 필드 확인 (REQ-040 AC-1) - - [ ] `GET /v1/portfolios/{id}/pnl/realized` (from/to 누락) → HTTP 422 확인 (REQ-040 AC-3) - - [ ] 비소유자 토큰으로 `/trades` 또는 `/pnl/realized` 호출 → HTTP 403 확인 (REQ-039 AC-6, REQ-040 AC-7) - - [ ] 존재하지 않는 portfolio_id로 호출 → HTTP 404 확인 (REQ-039 AC-7, REQ-040 AC-8) - - [ ] OpenAPI `/docs` 에서 신규 엔드포인트 2개 노출 확인 (REQ-039 AC-8, REQ-040 AC-9) - - [ ] 기존 `GET /v1/portfolios`, `POST /v1/portfolios/{id}/ledger/trades`, `GET /health` 정상 동작 회귀 없음 확인 + - [x] `GET /health` → HTTP 200 + `db_enabled: true` 확인 ✅ (2026-06-19 17:27 KST, trex-op) + - [x] `GET /v1/portfolios/{id}/trades?date=YYYY-MM-DD` (read_token 이상) → HTTP 200 + 항목 필드(`trade_id`, `side`, `quantity`, `price`, `executed_at`, `fee_amount`, `tax_amount`) 확인 (REQ-039 AC-1) ✅ (체결 2건 확인) + - [x] `GET /v1/portfolios/{id}/trades` (날짜 파라미터 누락) → HTTP 422 확인 (REQ-039 AC-3) ✅ + - [x] `GET /v1/portfolios/{id}/pnl/realized?from=YYYY-MM-DD&to=YYYY-MM-DD` (read_token 이상) → HTTP 200 + `total_realized_pnl`, `cost_basis_from`, `items`, `data_completeness_warning` 필드 확인 (REQ-040 AC-1) ✅ (`total_realized_pnl=-9306.585` 확인) + - [x] `GET /v1/portfolios/{id}/pnl/realized` (from/to 누락) → HTTP 422 확인 (REQ-040 AC-3) ✅ + - [x] 비소유자 토큰으로 `/trades` 또는 `/pnl/realized` 호출 → HTTP 403 확인 (REQ-039 AC-6, REQ-040 AC-7) ✅ + - [x] 존재하지 않는 portfolio_id로 호출 → HTTP 404 확인 (REQ-039 AC-7, REQ-040 AC-8) ✅ + - [ ] OpenAPI `/docs` 에서 신규 엔드포인트 2개 노출 확인 (REQ-039 AC-8, REQ-040 AC-9) — [비차단] 수동 확인 미완, 운영 관찰 중 + - [x] 기존 `GET /v1/portfolios`, `POST /v1/portfolios/{id}/ledger/trades`, `GET /health` 정상 동작 회귀 없음 확인 ✅ ## Known Issues (QC PASS-WITH-NOTES 비차단 잔여) @@ -73,28 +73,31 @@ ### Deployment Facts - Executed At: - - (운영팀 핸드오프 후 기록 — 예정 2026-06-22 KST) + - 2026-06-19 17:27 KST - Completed At: - - (배포 완료 후 기록) + - 2026-06-19 17:27 KST - Environment: - portfolio-hub 운영 인스턴스 (port 8002) - Operator: - - (배포 수행자 기록) + - trex-op (운영팀) - Revision or Artifact: - - 코드 freeze 커밋: `bd34450` (main HEAD, 2026-06-18) + - 배포 커밋: `d89f137` (main HEAD, push 완료) + - 이전 커밋: `50beba3` → 배포 커밋: `d89f137` + - 비고: Freeze pin `bd34450`과 배포 커밋 `d89f137`의 차이는 REL 문서(docs-only) 변경으로 런타임 동일 - Commands or Procedure: - - DB 마이그레이션 없음 (alembic head `20260605_0025` 유지) - - portfolio-hub 이미지 빌드 (freeze 커밋 `bd34450`) → rolling restart + - `bash /root/release/scripts/deploy-portfolio-hub.sh` + - DB 마이그레이션 없음 (alembic head `20260605_0025` 유지, REL-001 시점과 동일) + - 프로세스: PID 461546 (port 8002), RUNNING (2026-06-19 17:33 KST 확인) ### Profile-Specific Checks - app-service: - Health Endpoint: - - (배포 후 기록 — `GET /health` HTTP 200 + `db_enabled: true` 확인) + - `GET /health` → HTTP 200, `db_enabled: true` (2026-06-19 배포 후 확인) ✅ - Startup Log Fields: - - (배포 후 기록) + - PID 461546 (port 8002), RUNNING 상태 확인 (2026-06-19 17:33 KST) ✅ - Request Log Fields: - - (배포 후 기록) + - (운영 관찰 계속 중) - Smoke or Manual Verification: - **배포 전 자동 테스트 evidence (2026-06-18)**: - BAT-017 신규 테스트: 50 passed (test_wac_calculation.py 20건 + test_v1_portfolios_trades.py 12건 + test_v1_portfolios_pnl.py 18건) — pytest 실행 출력: `50 passed, 8 warnings in 3.43s` @@ -102,25 +105,45 @@ - 합계: 427 passed, 0 failed - 독립 QC (`qc-reviewer`, 2026-06-18): **PASS-WITH-NOTES** — 50 passed 독립 재현 + 전체 427 passed 회귀 없음, WAC=11,000/realized=199,300 단위+e2e 검증, R-1 경고필드(buy없음·oversell·완전이력 null) 정상, NFR-3 격리(domain DB import 0) 확인, 스코프·DB 마이그레이션 무, 위생 이상 없음. - 운영팀 주간 테스트: 4개 서비스 전수 통과 (2026-06-19 사장님 확인) - - 배포 후 smoke: (운영팀 핸드오프 후 기록) + - **배포 후 smoke (2026-06-19 17:27 KST, trex-op)**: + - `GET /health` → HTTP 200, `db_enabled: true` ✅ + - `GET /v1/portfolios/{id}/trades?date=2026-06-19` (read_token 이상) → HTTP 200, 체결 2건, 필드 전체 확인 (`trade_id`, `side`, `quantity`, `price`, `executed_at`, `fee_amount`, `tax_amount`) ✅ (REQ-039 AC-1) + - `GET /v1/portfolios/{id}/trades` (날짜 파라미터 누락) → HTTP 422 ✅ (REQ-039 AC-3) + - `GET /v1/portfolios/{id}/pnl/realized?from=2026-06-01&to=2026-06-19` (read_token 이상) → HTTP 200, `total_realized_pnl=-9306.585`, 필드 전체 확인 (`total_realized_pnl`, `cost_basis_from`, `items`, `data_completeness_warning`) ✅ (REQ-040 AC-1) + - `GET /v1/portfolios/{id}/pnl/realized` (from/to 누락) → HTTP 422 ✅ (REQ-040 AC-3) + - 비소유자 토큰으로 신규 엔드포인트 호출 → HTTP 403 ✅ (REQ-039 AC-6, REQ-040 AC-7) + - 존재하지 않는 portfolio_id로 호출 → HTTP 404 ✅ (REQ-039 AC-7, REQ-040 AC-8) + - 기존 `GET /v1/portfolios` 회귀 없음 ✅ + - [비차단] OpenAPI `/docs` 신규 엔드포인트 2개 노출 — 수동 확인 미완 (운영 관찰 중, 차단 아님) ### Rollback Outcome - Rollback Required: - - (배포 후 기록) + - No - Rollback Trigger: - - none (사전) + - none (트리거 조건 발생 없음) - Rollback Action: - - none (사전) + - none (롤백 수행 없음) ### Release Decision Evidence - Released Decision: - - confirmed 단계 도달. released 전환 조건: 운영 배포 완료 + health endpoint 확인 + 배포 후 smoke 통과 후 recorded. + - released 전환 승인. - Rationale: - - 오늘(2026-06-19) 확보된 evidence: (1) 코드 freeze 커밋 `bd34450` push 완료, (2) BAT-017 QC PASS-WITH-NOTES (독립 qc-reviewer 50 passed 재현, 2026-06-18), (3) 운영팀 주간 테스트 통과 사장님 확인(2026-06-19). 실제 배포(2026-06-22 예정)와 배포 후 smoke evidence는 아직 없으므로 released로 전환하지 않는다. 배포 완료 후 운영팀이 본 문서의 Deployment Facts + Profile-Specific Checks + Rollback Outcome을 기록하고 팀장이 released 전환을 승인한다. + - app-service profile released DoD 전항목 충족 판정 근거: + (1) 배포 완료: 2026-06-19 17:27 KST, trex-op 수행, 커밋 d89f137 (freeze bd34450 대비 docs-only 차이, 런타임 동일) ✅ + (2) 프로세스 기동 확인: PID 461546 (port 8002) RUNNING (17:33 KST 확인) ✅ + (3) health endpoint: `GET /health` → HTTP 200, `db_enabled: true` ✅ + (4) DB 마이그레이션 없음: alembic head `20260605_0025` 유지 (REL-001과 동일) ✅ + (5) 신규 엔드포인트 smoke 전항목 통과: trades 200/422, pnl/realized 200/422, 403/404 정상 ✅ + (6) 기존 API 회귀 없음 ✅ + (7) 롤백 불필요 (트리거 없음) ✅ + (8) 배포 전 QC: BAT-017 50 passed + 전체 427 passed, qc-reviewer PASS-WITH-NOTES (2026-06-18) ✅ + - 비차단 잔여 (released 전환을 막지 않음): + - OpenAPI `/docs` 신규 엔드포인트 노출 수동 확인 미완 — 기능 결함 아님, 운영 관찰 중 + - Known Issues 4건 (symbol 필터 edge 테스트, HTTP_422 deprecated, 성능 미검증, symbol 컬럼 부재) — QC PASS-WITH-NOTES 비차단으로 이미 기록됨, cleanup/차기 Discovery 후보 - Recorded By: - - portfolio-hub-dev (팀장 지시 M1 릴리즈 REL 작성, 2026-06-19) + - 팀장 (portfolio-hub-dev evidence 기입 + released 전환 판정, 2026-06-19) - Recorded At: - 2026-06-19 KST