Source document
docs/platform/RELEASE-REPORT-BETA-4.md
Source version
0.0.0
Generated time
2026-07-06T14:59:21.363Z
Owner
Unassigned
Audience
Internal
Status
Approved

Release Report — Stage Beta · Sprint Beta-4 · Partner Management Foundation

Mục tiêu: nền quản lý Partner để onboard đối tác đầu tiên chuẩn hoá, Founder điều hành không cần SQL thủ công.
Không mở rộng Platform Core · không Payment · không Frontend đầy đủ · không đổi deployment.

1. Những gì đã hoàn thành

Code (surgical — 3 file infra)

suspend/reactivate THUẬN NGHỊCH (không huỷ key). Không migration (customers.status đã có).

suspendPartner(reversible) · reactivatePartner · revokePartner(terminal) với guard invariant (PartnerTransitionError/PartnerNotFoundError); audit cho 7 thao tác (partner.* + apikey.issued/rotated/revoked), scope tenantId=partnerId, metadata sanitize.

reactivate-partner · revoke-partner(--confirm) · deliver-key · show-audit; issue-key thêm cờ opt-in --deliver (mặc định giữ nguyên pending_delivery). Transition sai → exit 2 (không throw thô, không 5xx).

Tài liệu (Deliverables #1/#2/#3/#5)

Test (Deliverable #4) — chạy trong CI (platform-ci.ymltest:infra)

key cũ 401→key mới 200→suspend→401→reactivate→200; assert đủ 7 audit event; assert không 5xx; assert key không bị huỷ khi suspend (bằng chứng thuận nghịch).

bootstrap CLI trọn vẹn → key auth → suspend chặn → reactivate khôi phục, audit không lộ raw key.

Kết quả kiểm chứng (đã chạy)

2. Những gì CHƯA hoàn thành / cố ý không làm

3. Rủi ro còn lại

  1. Audit chưa atomic với state-change (Trung bình): tiến trình chết giữa updateappend có thể để lệch 1 event.

*Giảm thiểu:* thao tác là single-row, cửa sổ hẹp. *Khắc phục:* Beta-5 gói prisma.$transaction.

  1. Cổng Partner thêm 1 truy vấn customer mỗi lần auth key có customerId (Thấp): 2 point-lookup có index; chấp nhận được.

*Tối ưu sau:* cache/@relation join khi cần (đo trước).

  1. Hai lối tạo (provisionCustomer active vs createPartner pending) (Thấp): có thể gây nhầm. *Giảm thiểu:* tài liệu nêu rõ; Beta-5 cân nhắc hợp nhất.
  2. Key gắn customerId=null không bị cổng Partner (Thấp, chủ ý): key legacy/seed không có partner vẫn auth như cũ (không hồi quy). Partner thật luôn có customerId.
  3. revoke-partner terminal, không hoàn tác (Thấp, chủ ý): đúng thiết kế; khôi phục = tạo Partner mới.

4. Đề xuất Beta-5

  1. Atomic audit: gói mỗi thao tác Partner/Key + audit trong một prisma.$transaction (khử rủi ro #1).
  2. Partner read/report API + Founder viewer tối giản: endpoint/CLI liệt kê partner theo status + audit timeline (chỉ đọc), tiến tới màn hình Founder (M4B) — không mở Core.
  3. Self-serve onboarding có kiểm soát: luồng cấp sandbox key + allowlist IP tự động (nối tiếp ma sát #1 của Beta-3 PIK).
  4. Hợp nhất create path: gộp provisionCustomer/createPartner về một API có status khởi tạo rõ ràng (giảm rủi ro #3), kèm test hồi quy seed/Alpha.
  5. Quan sát CI thật: xác nhận một lần chạy xanh của platform-ci.yml trên PR; cân nhắc thêm job đo thời gian E2E.

QA — Definition of Done

Tiêu chí DoDKết quả
Founder quản lý Partner theo tài liệu demoPARTNER-MANAGEMENT-DEMO.md 10 bước chạy được (CLI + curl)
API Key lifecycle đúng (issue/rotate/revoke, key cũ chết)✅ E2E: key cũ 401, key mới 200
Suspend/Re-activate đúng✅ E2E: suspend→401, reactivate→200 (cùng key, thuận nghịch)
Audit đầy đủ✅ 7 event assert trong E2E + CLI
E2E PASS · CI PASS✅ 185/185 (lệnh CI cục bộ xanh); job chạy khi push main
Không lỗi 5xx✅ assert tường minh
Không cần thao tác DB trực tiếp✅ toàn bộ qua ops CLI
Ràng buộc QAKết quả
Không sửa Platform Corepackages/platform-core không đụng
Không đổi deployment
Không ảnh hưởng Alpha/Legacy✅ test cũ 185 xanh; key legacy (customerId null) không hồi quy
Không phát sinh secret trong repo✅ secret scan sạch
Không migration ngoài phạm vi0 migration, schema.prisma không đổi

Trạng thái Sprint: deliverable + DoD đạt trên kiểm chứng cục bộ (lint/typecheck/test:infra xanh, E2E phủ toàn luồng). Còn lại để "CI PASS" theo nghĩa quan sát: một lần chạy xanh platform-ci.yml khi mở PR lên main. Chờ Founder review.