Một lần dry-run thật, thực hiện theo góc nhìn kỹ sư đối tác, chỉ dùng tài liệu bàn giao. Ngày: 2026-07-06.
Mục tiêu: xác nhận partner hoàn thành Availability → Booking → Confirm → Cancel không sửa mã, không hỏi đội dev.
npm run api:start port 3020 + migrate deploy). Lý do dùng local: IP máy dry-run chưa được allowlist trên staging (/api/booking/* → 403 nginx — xem Friction F-1), nên staging không thể chạy end-to-end trong sprint này. Local dùng cùng code + cùng migration + cùng examples ⇒ đại diện trung thực cho hành vi API.
ops CLI, không SQL); (b) Partner chỉ dùng examples/curl/flow.sh + key.BNG ops (setup):
✓ migrate deploy
✓ api:start → {"status":"ok"}
create-partner → activate-partner → provision-tenant → activate-tenant → seed-inventory
✓ partner active, tenant active, inventory seeded
✓ issue-key --deliver → raw key sandbox (active)
→ bàn giao: BASE_URL=http://localhost:3020, KEY=<secret>, UNIT=u_muongthanh_deluxe
Partner (chỉ chạy examples/curl/flow.sh):
1) Availability → {"ok":true,"data":{"available":true,"price":1180000,"billableUnits":2,"total":2360000}} HTTP 200
2) Create → {"ok":true,"data":{"reservationId":"…","code":"BNG-KQZPEK","status":"pending","totalAmount":2360000,…}} HTTP 201
3) Confirm → {"ok":true,"data":{… "status":"confirmed" …}} HTTP 200
4) Cancel → {"ok":true,"data":{… "status":"cancelled" …}} HTTP 200
exit code: 0
| Hạng mục | Kết quả |
|---|---|
| Tổng thời gian (partner flow, 4 call) | < 1 giây (sub-second, 4 request tuần tự). |
| Tổng thời gian (kể cả BNG provision + api start) | ~30–60 giây end-to-end trên máy dev. Trong ngân sách 30 phút của mục tiêu Beta-3. |
| Bước gây khó khăn | (1) examples mặc định BNG_BASE_URL = staging → partner phải override cho local/sandbox (đã ghi trong examples/README.md). (2) Trích raw key từ output issue-key (dòng 2 sau banner) — thao tác BNG-side, cần rõ trong ops guide. |
| Thiếu tài liệu | TENANT_INACTIVE (403) trước đây thiếu trong Error Catalog + OpenAPI → đã bổ sung trong sprint này (drift Beta-5). |
| Có cần hỏi đội dev? | Không cho luồng chức năng (docs + examples đủ). Có một câu hỏi vận hành ngoài tài liệu partner: *"làm sao partner qua được nginx gate trên staging?"* → trả lời: BNG allowlist IP (đã có trong Integration Guide §2.3, nhưng là hành động của BNG, không phải partner tự làm). |
/api/booking/* = 403 nginx. Đây là điều kiện tiên quyết onboarding, không phải lỗi tích hợp.TENANT_INACTIVE.