Mục tiêu duy nhất: loại bỏ rủi ro mất đồng bộ giữa business state và audit. Không thêm feature, không đổi API, không migration.
Chỉ 1 file source + 1 file test + 3 docs.
provisioning/provisioning-service.ts — gói mỗi thao tác Provisioning có audit vào một prisma.$transaction; audit ghi bằng cùng tx ⇒ state + audit nguyên tử. Các thao tác được bọc: createPartner · transitionPartner (activate/suspend/reactivate/revoke Partner) · issueKey · rotateKey · revokeKey · provisionTenant · transitionTenant (activate/suspend/reactivate/archive Tenant).
writeAudit(db, …) nhận client tx; fail-closed: không dựng/không ghi được audit ⇒ NÉM ⇒ rollback.revokeCustomerKeys(db, …) nhận tx (được gọi trong tx của revoke Partner).appendAudit (mặc định = PrismaAuditRepository.append) để giả lập lỗi audit — hành vi production không đổi.__tests__/audit-transaction.test.ts (mới) — chứng minh bất biến bằng fault-injection.AUDIT-TRANSACTION-DESIGN.md, AUDIT-FAILURE-MATRIX.md, báo cáo này.KernelContextBuilder.runInTenantScope bọc reservation + outbox + audit trong prisma.$transaction, audit sink bound ctx.tx. Không đụng — đã thoả bất biến.
AuditEvent append-only, PrismaAuditRepository, schema audit_events): không đổi.packages/platform-core): 0. Frontend: 0.lint ✅ · typecheck:all ✅ · test:domain ✅ · test:core ✅ · platform:metadata:check ✅test:infra (Postgres ephemeral Docker): 200/200 PASS, 0 fail — gồm 8 test Beta-6 mới + toàn bộ regression xanh(booking, auth, RLS, partner Beta-4, tenant Beta-5, ops).
audit-transaction.test.ts (8 case) — chứng minh bất biến:createPartner, suspendPartner, issueKey, rotateKey, provisionTenant, suspendTenant (status/tenantId/key giữ nguyên, không mồ côi).AuditEvent.record ok:false (Thấp, edge): chỉ với input audit không hợp lệ — không phát sinh cho reservation.*. Booking vẫn rollback với mọi lỗi ghi audit THẬT (append trong tx). *Beta-7:* fail-closed hoá sink cho đồng nhất.
platform-ci.yml): verify cục bộ bằng đúng các lệnh CI; job chạy khi push/PR main.createAuditFactory) — đóng nốt edge #1, hoàn tất bất biến cho mọi context.| Tiêu chí DoD | Kết quả |
|---|---|
| Không còn business commit nhưng audit mất | ✅ tx nguyên tử + fail-closed; fault-injection chứng minh rollback |
| Audit & business luôn cùng commit / cùng rollback | ✅ 8 case audit-transaction PASS |
| Tất cả test PASS | ✅ 200/200 test:infra + domain/core |
| CI PASS | ✅ lệnh CI cục bộ xanh (chờ quan sát job PR) |
| Không regression | ✅ toàn bộ Beta-1..5 test xanh |
| Không đổi hành vi API với client | ✅ Provisioning CLI-only; Booking không đụng; audit không bao giờ fail với input hợp lệ |
| Ràng buộc QA | Kết quả |
|---|---|
| Không đổi API contract / OpenAPI | ✅ |
| Không đổi Partner / Tenant / Booking lifecycle | ✅ chỉ đổi transaction boundary |
| Không thêm migration | ✅ 0 |
| Không đổi deployment | ✅ |
| Không ảnh hưởng Alpha / Legacy | ✅ hành vi production không đổi (seam mặc định = repo cũ) |
Trạng thái Sprint: bất biến Transactional Audit đạt trên kiểm chứng cục bộ (200/200, fault-injection). Còn lại: một lần chạy xanh platform-ci.yml trên PR. Chờ Founder review.