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

Release Report — Stage Beta · Sprint Beta-5 · Tenant Provisioning Foundation

Mục tiêu: chứng minh Tenant lifecycle hoạt động thật trong mô hình multi-tenant. Founder điều hành không cần SQL thủ công.
Không Payment · không Notification prod · không Frontend · không refactor Core · không đổi deployment · không đổi mô hình Partner (Beta-4).

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

Schema / Migration (in-scope, proven necessary)

Backward-compatible — mọi tenant/seed/Alpha hiện có → active (không hồi quy). 1 migration duy nhất, đúng phạm vi Tenant lifecycle. RLS áp qua prisma/rls/enable-rls.sql (tách khỏi migration) nên cột mới không đụng RLS.

Code (surgical)

(runInTx + checkAvailability) — nơi RLS cho phép đọc chính row tenant. Chặn booking/availability khi tenant != activeTENANT_INACTIVE (403). Đặt ở BookingService, KHÔNG ở authtenants là RLS-FORCE (auth chạy trước context). Tương thích ngược: tenant không có row lifecycle (legacy/test) giữ hành vi cũ; chỉ chặn tenant đã provision & không active.

provisionTenant(provisioned) · activateTenant · suspendTenant(reversible) · reactivateTenant · archiveTenant(terminal) với guard invariant (TenantTransitionError/TenantNotFoundError); audit 5 event tenant.* (scope tenantId); tenantHealth (read-only).

archive-tenant(--confirm) · tenant-health · show-audit --tenant. 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)

booking 201→suspend→403 TENANT_INACTIVE→reactivate→201→archive→403 (terminal); assert 5 audit event; assert không 5xx; assert suspend Tenant không đụng Partner (độc lập 2 cổng).

2. Test result

(booking-e2e, booking-lifecycle-e2e, availability-concurrency), auth, RLS harness.

3. LIVE verification

trước khi migrate deploy (theo DB-SAFETY.md). Đề nghị áp ở lần deploy staging kế (an toàn: additive column, non-locking).

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

(gate ở BookingService, không ở resolver) — đã phủ. (Cổng Partner Beta-4 vẫn chỉ ở api-key path — xem Rủi ro.)

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

  1. Audit chưa atomic với state-change (Trung bình, lặp từ Beta-4): tiến trình chết giữa updateappend có thể lệch 1 event. *Khắc phục Beta-6:* gói mỗi thao tác Partner/Tenant + audit trong prisma.$transaction.
  2. Cổng Tenant thêm 1 truy vấn tenants mỗi write/availability (Thấp): point-lookup theo PK; chấp nhận được. Nếu cần, cache theo request.
  3. Cổng Partner (Beta-4) chỉ ở api-key path (Thấp, tồn dư): JWT session tới partner suspended chưa bị chặn ở auth (login end-user chưa mở). Không ảnh hưởng DoD Beta-5. *Beta-6:* thống nhất cổng Partner cho cả JWT.
  4. Hai lối tạo tenant (createTenant active vs provisionTenant provisioned) (Thấp): tài liệu nêu rõ; Beta-6 cân nhắc hợp nhất.
  5. Tương thích ngược "tenant không row ⇒ cho phép" (Thấp, chủ ý): chỉ áp cho tenant chưa provision qua Beta-5; tenant thật luôn có row. Không hở cho luồng DoD (suspend/archive luôn có row).
  6. Migration chưa áp LIVE (Trung bình về quy trình): cần backup + cửa sổ bảo trì khi deploy staging.

6. Đề xuất Beta-6

  1. Atomic audit cho Partner + Tenant (prisma.$transaction) — khử rủi ro #1 cho cả hai sprint.
  2. Áp migration + LIVE verification trên staging: pg_dumpmigrate deploy → chạy demo Tenant thật (đo end-to-end).
  3. Thống nhất cổng Partner cho JWT path (rủi ro #3) khi mở auth end-user.
  4. Hợp nhất create path (Partner + Tenant) về API có status khởi tạo rõ ràng + test hồi quy seed/Alpha.
  5. Tenant/Partner read API + Founder viewer (chỉ đọc): liệt kê tenant theo status + audit timeline, tiến tới M4B — không mở Core.

QA — Definition of Done

Tiêu chí DoDKết quả
Founder tạo Partner✅ (Beta-4, demo tái dùng)
Founder tạo Tenantprovision-tenant + activate-tenant
Founder provision inventoryseed-inventory (tenant-health: units > 0)
Booking qua Tenant active✅ E2E: 201
Tenant suspend chặn request✅ E2E: 403 TENANT_INACTIVE
Tenant re-activate cho chạy lại✅ E2E: 201 (cùng key + inventory)
Audit đầy đủ✅ 5 event tenant assert (E2E + CLI)
E2E PASS · CI PASS✅ 192/192 (lệnh CI cục bộ xanh); job chạy khi push main
Không thao tác DB trực tiếp✅ toàn bộ qua ops CLI
Ràng buộc QAKết quả
Không ảnh hưởng Partner lifecycle (Beta-4)✅ additive; partner-management-e2e + ops-partner xanh
Không ảnh hưởng Booking (Beta-1/2)booking-e2e/booking-lifecycle-e2e/concurrency xanh (fix tương thích: tenant không row ⇒ cho phép)
Không đổi deployment
Không ảnh hưởng Alpha/Legacy✅ column default active; tenant chưa provision không bị gate
Không secret trong repo✅ secret scan sạch
Không migration ngoài phạm vi1 migration add_tenant_status, đúng Tenant lifecycle
CI xanh✅ lệnh CI cục bộ xanh (chờ quan sát job trên PR)

Trạng thái Sprint: deliverable + DoD đạt trên kiểm chứng cục bộ. Còn lại: (a) áp migration + LIVE verification staging (cần cửa sổ bảo trì), (b) một lần chạy xanh platform-ci.yml trên PR. Chờ Founder review.