# QAS + ASR — Quality Attribute Scenarios & Architecturally Significant Requirements — e-commerce | | | |---|---| | **Version** | 1.0 | | **Date** | 2026-09-14 | | **Author** | SA (skill sa-2-architecture, chế độ `go`, hoạt động `qas`) | | **Status** | 🟡 Draft *(duyệt từng phần — xem `Approved by`; AG2 cần cả ba vai trò (Tech Lead/Security/Ops-SRE) ký, mới có một chữ ký thay có điều kiện — **chưa đủ điều kiện chuyển `🔵 Approved`**)* | | **Approved by** | Tech Lead: **Điều phối dự án** (uỷ quyền, chế độ chạy thử — ký thay theo ngoại lệ `DEC-01`, **không phải chữ ký Tech Lead thật**) — duyệt **từng phần** bản v1.0 · 2026-09-14: chấp nhận 14 `QAS-001…014` đủ 6 phần và cách đo (Phần A); chấp nhận **TẠM** các số SA tự đề xuất — `QAS-003` p95 ≤500ms, `QAS-004` p95 ≤300ms, `QAS-007` loại trừ bảo trì ≤2 giờ/tháng, `QAS-014` đối soát ≤15 phút — làm baseline tạm để GĐ2 không nghẽn; `OQ-018…021` **giữ nguyên mở**, chờ PO/Tech Lead thật xác nhận số cuối cùng. Chốt thêm điều kiện: diễn tập DR (`QAS-008`) **phải thực hiện trước khi ký AG2** — xem `OQ-022` (đã cập nhật) và ghi làm điều kiện tiên quyết của AG2, cũng là input bắt buộc cho hoạt động `inf` khi tới lượt. Ghi thêm `DEC-12`. · Security: — *(chưa ký)* · Ops/SRE: — *(chưa ký, kể cả điều kiện diễn tập DR ở `OQ-022` cũng do Ops/SRE xác nhận, chưa có)*. `OQ-004` (tính hợp lệ ký thay) vẫn mở. `Confidence` **giữ nguyên** 🔴 — duyệt từng phần không phải bằng chứng nguồn mới, không nâng `Confidence`. Status **giữ** 🟡 Draft — AG2 chưa đủ ba chữ ký thật/hợp lệ. | | **Source** | `sa-output/e-commerce/01-context/CTX_e-commerce_v1.0.md` (v1.2) §2 (`DRV-01…09`), §3 (`CON-nn`) · `01-context/OPT_e-commerce_v1.0.md` §1, §8 (`ASM-07…09`, chọn P2) · `01-context/TCO_e-commerce_v1.0.md` §2 (kịch bản tải A/B, `ASM-10`) · `01-context/ARISK_e-commerce_v1.0.md` §3 (`ARISK-01…10`), §6 (`POC-01`, `POC-02`) · `00-index/OQ_e-commerce.md` v1.7 · `00-index/DEC_e-commerce.md` v1.8 · `ba-output/e-commerce/03-specification/NFR_US002-003_v1.0.md` (`NFR-PERF-01/02`, `NFR-SEC-01…03`, `NFR-AVL-01/02`, `OQ-033`) · `ba-output/e-commerce/03-specification/SRS_US002-003_v1.0.md` · `ba-output/e-commerce/03-specification/API_US002-003_v1.0.md` · `ba-output/e-commerce/01-discovery/BRIEF_CartCheckout_v1.0.md` §4 (`GOAL-01/02`) · `e-commerce/docs/sections/02-phan-tich-yeu-cau.md` (`NFR-01…08`) · `e-commerce/docs/SAD.md` §5.3.2, §9.4.1, §9.5.2 (RTO/RPO, ngưỡng alert — kế thừa, chưa thiết kế lại) | | **Scope** | Toàn sàn e-commerce theo phương án **P2** (modular monolith + managed AWS, tách riêng Payment — `DEC-06`/`OQ-011`, **chưa** phải `ADR` chính thức). Chi tiết nhất: module **Giỏ hàng & Checkout** (US-002/003, `SCR-04`) — nơi BA đã có `NFR_US002-003`. Chỉ hoạt động 1/9 của `sa-2-architecture` (**QAS**) — không tạo `ASR`/`SAD`/`ADR` ở lượt này (xem Phần B, để trống có chủ đích). | | **Confidence** | 🔴 Giả định chưa xác minh — AG1 (gate GĐ1 SA) chưa có chữ ký PO/Tech Lead thật (chỉ "PO uỷ quyền — điều phối dự án" ký từng phần dưới ngoại lệ `DEC-01…10`); `POC-01`/`POC-02` (đo throughput SQS/EventBridge, RDS gộp tải) **chưa chạy**; BA chưa ký G1 cho `BRIEF_CartCheckout`. Toàn bộ `QAS` trong tài liệu này giữ mức thấp nhất cho tới khi: (a) PO/Tech Lead ký AG1 thật, (b) `POC-01`/`POC-02` chạy xong, (c) các con số do SA **đề xuất** (chưa có nguồn PO/Tech Lead) ở mục A3 được xác nhận — xem `DEC-11`. | ## Change Log | Version | Date | Người sửa | Thay đổi | ADR/DEC | |---|---|---|---|---| | 1.0 | 2026-09-14 | SA (qua skill sa-2-architecture, chế độ `go`, hoạt động `qas`) | Bản đầu — lượng hoá toàn bộ `NFR-01…08` (SAD/docs) và `NFR-PERF/SEC/AVL` (BA, `NFR_US002-003`) thành 14 `QAS-nnn` đủ sáu phần, rà đủ 7 nhóm thuộc tính (Bảo trì đánh dấu N/A có lý do). Mọi `QAS` truy vết về `DRV`/`ARISK`/`NFR` nguồn. Chạy dưới ngoại lệ gate AG1 chưa qua — ghi `DEC-11` (SA), tiếp nối `DEC-01…10`. Không tạo `ASR`/`SAD`/`ADR` ở lượt này theo yêu cầu điều phối — Phần B để trống có ghi chú. | `DEC-11` | | 1.0 | 2026-09-14 | Điều phối dự án (thay mặt Tech Lead, ngoại lệ `DEC-01`) — tác vụ **sign/approve** | Duyệt **từng phần**: chấp nhận 14 `QAS` đủ 6 phần và cách đo; chấp nhận **TẠM** các số SA đề xuất (`QAS-003` ≤500ms, `QAS-004` ≤300ms, `QAS-007` loại trừ bảo trì ≤2h/tháng, `QAS-014` đối soát ≤15 phút) làm baseline tạm — `OQ-018…021` **giữ nguyên mở** chờ PO/Tech Lead thật. Chốt điều kiện mới: diễn tập DR (`QAS-008`) phải thực hiện **trước khi ký AG2** (cập nhật `OQ-022`, ghi thành điều kiện tiên quyết AG2 và input bắt buộc cho `INF`). Không đổi nội dung chuyên môn. Security/Ops chưa ký; `OQ-004` mở; `Confidence` giữ 🔴; Status giữ 🟡 Draft; AG2 **chưa** ký. Ghi thêm `DEC-12`. | `DEC-12` | > Sơ đồ thắng về **quan hệ và luồng** — tài liệu này không có sơ đồ (chỉ bảng lượng hoá). > Bảng/văn bản thắng về **ràng buộc và con số**. Mâu thuẫn ngoài hai loại này là lỗi tài liệu, > phải sửa chứ không chọn bên (`D12`). --- ## 0. Ghi chú Preflight & ngoại lệ gate — bắt buộc đọc trước **AG1 (gate GĐ1 SA) chưa được ký chính thức.** Audit gần nhất (2026-09-12, xem `ARISK_e-commerce_v1.0.md` §Tự chấm, `DTM_e-commerce.md` §12): AG1 đủ cấu trúc 4/4 artifact (`CTX`/`OPT`/`TCO`/`ARISK`, mỗi file tự chấm 7/7 tiêu chí **cấu trúc**), nhưng: - Mọi phê duyệt đều là **"PO uỷ quyền — Điều phối dự án"**, không phải chữ ký PO/Tech Lead thật (`OQ-004` còn mở). - Hai `POC` bắt buộc — `POC-01` (throughput SQS/EventBridge, hạ `ARISK-01`) và `POC-02` (RDS gộp tải, hạ `ARISK-02`) — **chưa chạy**, chỉ mới có kế hoạch + tiêu chí PASS/FAIL viết trước. - BA chưa ký G1 chính thức cho `BRIEF_CartCheckout` (`OQ-001` của BA còn mở). Người dùng (vai điều phối dự án chạy thử) đã được cảnh báo lại về tình trạng này và **khẳng định muốn tiếp tục** sang GĐ2 (`sa-2-architecture`), hoạt động 1/9 (`QAS`), tham chiếu mô hình ngoại lệ đã dùng xuyên suốt GĐ1 (`DEC-01…10`). Quyết định ngoại lệ này được ghi nhận dưới đây và tại sổ `00-index/DEC_e-commerce.md`. > **DEC-11 (SA)** — Bắt đầu `sa-2-architecture` (hoạt động 1 — `QAS`) cho e-commerce trong khi > AG1 (gate GĐ1 SA) chưa có chữ ký PO/Tech Lead thật (audit 2026-09-12: AG1 🟠 — 4 artifact GĐ1 > duyệt từng phần bởi PO uỷ quyền, `Confidence` 🔴 toàn bộ; `POC-01`/`POC-02` chưa chạy; BA chưa > ký G1 cho `BRIEF_CartCheckout`). Tiếp nối `DEC-01…10`. > **Quyết định:** Tiếp tục lượng hoá `NFR` thành `QAS` dưới ngoại lệ gate. Mọi `QAS` giữ > `Confidence` 🔴 cho tới khi: (a) PO/Tech Lead ký AG1 thật; (b) `POC-01`/`POC-02` chạy xong và > kết quả được ghi vào `ARISK`; (c) các con số **SA đề xuất** (chưa có nguồn PO/Tech Lead — > đánh dấu rõ trong mục A3) được PO/Tech Lead xác nhận qua các `OQ` mới (`OQ-018…023`). > **Người quyết:** Điều phối dự án (đại diện PO, dự án chạy thử). > **Radar (ước lượng):** ~4 — chi phí đảo ngược thấp (sửa lại `QAS` khi có số thật không tốn > nhiều, đây là tài liệu chưa phải cam kết thi công) · bán kính ảnh hưởng: toàn bộ GĐ2 phụ thuộc > `QAS` này, nhưng bản thân *việc ghi tài liệu dưới ngoại lệ* thì nhỏ · **có** chạm `QAS` Must > trực tiếp (đang tạo chính `QAS`, không phải quyết định kiến trúc đã cam kết dựa trên nó) · > không ràng buộc dài hạn (ngoại lệ tạm thời, tiếp nối tiền lệ) · không tranh cãi mới → **ghi > `DEC-nn`, không cần `ADR` riêng cho việc chạy dưới ngoại lệ** (`decision-radar.md §1–§2`) — khác > với `ADR` cho quyết định kiểu kiến trúc P2, việc đó vẫn phải làm ở hoạt động `asr`/`adr` kế tiếp > (đã cảnh báo ở `DTM §11` "🟠 Nợ #1"). > **Hệ quả nếu không chấp nhận ngoại lệ:** dừng GĐ2 hoàn toàn cho tới khi AG1 ký thật và > `POC-01`/`POC-02` chạy xong — chậm tiến độ chạy thử tương ứng thời gian PO/Tech Lead xử lý các > `OQ` đang mở (`OQ-004/005/006/007/008/010/012` của GĐ1 cộng `OQ-018…023` mới của tài liệu này). 🔴 **Nhắc quan trọng cho người đọc:** đây **chỉ là hoạt động 1/9** của `sa-2-architecture`. `ASR` (hoạt động 2), `SAD` (hoạt động 3), `ADR`, `ICD`, `DAT`, `SEC`, `INF`, `FAIL` **chưa được tạo** — theo đúng yêu cầu điều phối ("Không tạo ASR/SAD/ADR ở lượt này"). Thứ tự bắt buộc của GĐ2 (`SKILL.md`: 1→2→3 trước khi làm 4–8) vẫn được tôn trọng: đây đúng là bước đầu tiên. --- # PHẦN A — Quality Attribute Scenarios ## A1. Tóm tắt | Nhóm thuộc tính | Số `QAS` | Must | Đã có cách đo | Đã đo thật | |---|---|---|---|---| | Hiệu năng | 4 (`QAS-001…004`) | 4/4 | 4/4 (k6/artillery, kịch bản cụ thể) | 0/4 | | Thông lượng | 2 (`QAS-005/006`) | 2/2 | 2/2 (`POC-01`/`POC-02`, tiêu chí đã viết trước) | 0/2 | | Sẵn sàng | 2 (`QAS-007/008`) | 2/2 | 2/2 (uptime monitor · diễn tập DR) | 0/2 | | Mở rộng | 1 (`QAS-009`) | 1/1 | 1/1 *(một phần — phụ thuộc `POC-01`/`POC-02` + hoạt động `inf` chưa chạy)* | 0/1 | | Bảo mật | 3 (`QAS-010…012`) | 3/3 | 3/3 | 0/3 | | Bảo trì | 0 | — | — | — | | Quan sát được | 2 (`QAS-013/014`) | 2/2 | 2/2 | 0/2 | | **Tổng** | **14** | **14/14** | **14/14** | **0/14** | **Nhóm không áp dụng:** - **Bảo trì (Maintainability)** — không áp dụng ở giai đoạn `QAS` này. Lý do: mẫu đo chuẩn của nhóm này ("một dev mới onboard và sửa được một bug thật trong ≤3 ngày", theo `templates/quality-scenarios.md` A2) đòi hỏi **một đội thi công thật** đang làm việc trên codebase thật — dự án chưa có đội thi công thật được xác nhận (`OQ-010` của `OPT` còn mở, `CON-05` vẫn là giả định "team MVP chuẩn" theo `DEC-02`). Không có bài đo nào chạy được trước khi có đội thật và có codebase để đo — theo đúng quy tắc "không đo được ⇒ bỏ hẳn, đừng ghi định tính" (`SKILL.md` mục 1). `NFR-07` (kiến trúc module hoá để các nhóm phát triển độc lập) không bị bỏ qua — nó là ứng viên `ASR` (ép cấu trúc modular monolith theo domain, xem `OPT §3` P2) sẽ được xử lý ở hoạt động `asr` kế tiếp, không phải một `QAS` đo bằng con số thời gian. **Hành động:** đo lại nhóm này trong sprint đầu tiên sau khi có đội thi công thật + codebase đủ lớn để chọn một bug thật làm bài đo (không phải việc của lượt chạy này). --- ## A2. Mẫu một `QAS` *(tham chiếu — xem cấu trúc đầy đủ ở `templates/quality-scenarios.md`)* --- ## A3. Danh sách `QAS` ### Hiệu năng | ID | Tên | Kích thích + môi trường | Đo lường | Đo bằng cách nào | Ai đo | Mức | Nguồn | |---|---|---|---|---|---|---|---| | `QAS-001` | Latency danh mục/tìm kiếm | Guest/Customer gọi `GET /v1/catalog/search`; môi trường giờ cao điểm flash sale, tải kịch bản B (10.000 concurrent user, `TCO §2` `ASM-10`) | **p95 ≤ 2 giây** | k6/artillery, kịch bản `GET /v1/catalog/search` tại 10.000 concurrent user, staging cấu hình giống production, chạy trước mỗi major release | QA + SRE | Must | `DRV-04`, `NFR-01` | | `QAS-002` | Latency checkout | Customer/Guest gọi `POST /v1/checkout` (giỏ 2–3 seller); môi trường giờ cao điểm, tải kịch bản B | **p95 ≤ 3 giây** (bao gồm tách đơn theo seller + gọi Payment) | k6 kịch bản `POST /v1/checkout` với payload giỏ đa seller mô phỏng, tải đỉnh kịch bản B, staging, trước mỗi release | QA + SRE | Must | `DRV-01`, `DRV-02`, `NFR-01` | | `QAS-003` | Latency tải giỏ hàng | Customer/Guest mở `SCR-04` → `GET /v1/cart`; giỏ ≤ 50 dòng (đề xuất BA, `ASM-16` mới); tải bình thường lẫn giờ cao điểm | **p95 ≤ 500ms** *(🔴 đề xuất của SA — chưa PO/Tech Lead xác nhận, nối `OQ-033` của BA, xem `OQ-018`)* | k6 kịch bản `GET /v1/cart`, 1 user và tải đồng thời tương ứng kịch bản A/B, staging | QA | Must | `NFR-PERF-01` (BA), `DRV-04` | | `QAS-004` | Latency sửa/xoá dòng giỏ hàng | Customer/Guest gọi `PATCH`/`DELETE /v1/cart/items`; 1 request ghi đơn lẻ | **p95 ≤ 300ms** *(🔴 đề xuất của SA — chưa xác nhận, nối `OQ-033` của BA, xem `OQ-019`)* | k6 kịch bản `PATCH`/`DELETE /v1/cart/items` đơn lẻ + tải đồng thời tương ứng, staging | QA | Must | `NFR-PERF-02` (BA), `DRV-04` | 🔴 Mọi ngưỡng trên **kế thừa nguyên trạng "giả định mặc định đã chốt trong brief"** (ghi chú cuối `docs/sections/02-phan-tich-yeu-cau.md` §2.2) — **chưa phải SLA hợp đồng**. `QAS-003`/`QAS-004` là số **SA tự đề xuất** (không có trong `NFR_US002-003` của BA, vốn để trống chờ `OQ-033`) — không bịa, đã gắn `ASM`/`OQ` tương ứng. ### Thông lượng | ID | Tên | Kích thích + môi trường | Đo lường | Đo bằng cách nào | Ai đo | Mức | Nguồn | |---|---|---|---|---|---|---|---| | `QAS-005` | Thông lượng message bus `OrderPlaced`/`PaymentConfirmed` | Burst event publish tại đỉnh flash sale — ước ~21 event/giây trung bình (15.000 đơn/giờ × ~5 event/đơn, `TCO` kịch bản B) × biên an toàn ×5; SQS FIFO per-seller message group + EventBridge fan-out ≥ 5 consumer rule, AWS `ap-southeast-1` thật | Thông lượng **sustained ≥ 100 msg/s** trong 30 phút; **p99 độ trễ publish→consume ≤ 2 giây**; **0 message mất**; fan-out lag ≤ 5 giây | **`POC-01`** (đã lập ở `ARISK §6`) — k6/artillery load generator, AWS thật, tối đa 5 ngày làm việc, **chưa chạy** | Tech Lead + 1 DevOps | Must | `DRV-04`, `ARISK-01`, `ASM-07` (OPT) | | `QAS-006` | Thông lượng RDS gộp (ghi checkout + đọc catalog) | Đồng thời ~15.000 đơn/giờ (ghi) + ~150.000 truy vấn catalog/giờ (đọc, ×10 tải ghi) trên 1 cụm RDS chính (P2, schema-per-module, không tính Payment); staging `db.r6g.xlarge` Multi-AZ, dataset ~50GB/300k SKU (kịch bản A) | **p95 write (checkout) ≤ 300ms**, **p95 read (catalog) ≤ 200ms**, **CPU RDS < 75%**, connection pool không exhaust | **`POC-02`** (đã lập ở `ARISK §6`) — load test staging cấu hình instance thật, tối đa 5 ngày, **chưa chạy** | Tech Lead/DBA | Must | `DRV-04`, `ARISK-02`, `ASM-08` (OPT) | 🔴 Cả hai `QAS` này **không tạo bài đo mới** — chúng chính là `POC-01`/`POC-02` đã có kế hoạch ở `ARISK_e-commerce_v1.0.md §6` (theo đúng ghi chú người duyệt: "ARISK-01/02 chính là bài đo"). Việc còn lại là **chạy POC**, không phải thiết kế lại tiêu chí. ### Sẵn sàng | ID | Mục tiêu | Ngân sách lỗi | Phạm vi tính | Không tính vào | Đo bằng cách nào | Mức | |---|---|---|---|---|---|---| | `QAS-007` | 99.9%/tháng cho dịch vụ giao dịch lõi (Catalog, Checkout, Payment, Identity — `SAD §3.1`) | **43 phút/tháng** | API công khai của 4 service trên | Bảo trì có báo trước **≤ 2 giờ/tháng** *(🔴 đề xuất của SA — chưa PO xác nhận, xem `OQ-020`, `ASM-17` mới)* | Uptime/health-check monitor (CloudWatch Synthetics hoặc tương đương), tính theo tháng, báo cáo hàng tháng cho SRE | Must | | ID | Nhóm service | RPO | RTO | Đo bằng cách nào | Mức | |---|---|---|---|---|---| | `QAS-008` | Payment, Cart & Order, Identity & Access (giao dịch cốt lõi) | **≤ 15 phút** | **≤ 1 giờ** | Diễn tập DR (failover drill) — **CHƯA TỪNG DIỄN TẬP**; con số kế thừa nguyên trạng từ `SAD §5.3.2`/`§9.5.2`, chưa thiết kế lại (thuộc hoạt động `inf`, chưa chạy). Theo `SKILL.md` mục 7: "RTO/RPO chưa diễn tập là RTO/RPO trên giấy" ⇒ `Confidence` 🔴, cần lịch diễn tập trước AG2 (xem `OQ-022`) | Must | 🔴 **`QAS-008` không phải RTO/RPO mới** — SA **không thiết kế lại** HA/DR ở lượt chạy này (đó là hoạt động `inf`, chưa chạy); ghi lại đây để `QAS` nhóm Sẵn sàng đầy đủ theo yêu cầu template, nhưng con số vẫn là **đề xuất kế thừa từ SAD**, chưa qua diễn tập thật — thấp hơn cả mức "ước lượng có cơ sở". ### Mở rộng | ID | Tải hôm nay | Tải mục tiêu | Trong bao lâu | Scale bằng cách nào | Giới hạn trên | Mức | |---|---|---|---|---|---|---| | `QAS-009` | 0 (chưa go-live, greenfield) | Kịch bản A (Năm 1): **2.000 concurrent user**, ~400 đơn/giờ đỉnh · Kịch bản B (đỉnh flash sale): **10.000 concurrent user**, ~15.000 đơn/giờ đỉnh (≈4,2 đơn/giây) — `TCO §2`, `ASM-10` | Từ go-live tới đợt flash sale đầu tiên — **thời điểm cụ thể chưa xác nhận** (🔴 mới, xem `OQ-018`… không, xem ghi chú dưới) | ECS Fargate auto-scaling theo CPU/request count cho nhóm "giao dịch" (Cart/Order/Catalog) — **ngưỡng kích hoạt cụ thể chưa chốt**, thuộc hoạt động `inf` (chưa chạy) | Chưa xác định — đề xuất xét lại kiến trúc nếu tải thật vượt kịch bản B ×2 (~20.000 concurrent) mà chưa kiểm chứng lại (xem "Ngoài phạm vi" §D) | Must | *Bài đo cho `QAS-009` tái sử dụng chính `QAS-005`/`QAS-006` (`POC-01`/`POC-02`) chạy lần lượt ở kịch bản A rồi kịch bản B — không tạo bài đo trùng lặp.* ### Bảo mật | ID | Mối đe doạ | Yêu cầu | Kiểm chứng bằng cách nào | `THR-nn` liên quan | Mức | |---|---|---|---|---|---| | `QAS-010` | IDOR — request giả mạo `cartItemId`/`session` không phải chủ sở hữu lên `PATCH`/`DELETE /v1/cart/items` | 100% request phải qua kiểm tra quyền sở hữu (đối chiếu `customerId`/`sellerId` JWT hoặc `session_id` Guest); 0 lượt IDOR thành công | Security test tự động (integration test gọi thẳng API với token/session không phải chủ sở hữu — tương ứng `AC-US003-12/13` của BA) trên staging trước mỗi release | *(chưa có — `THR` thuộc hoạt động `sec`, chưa chạy)* | Must | | `QAS-011` | Rò rỉ/chia sẻ thừa PII (địa chỉ, SĐT người nhận) cho seller khi tách đơn — vi phạm NĐ13/2023 | 100% trường PII chia sẻ cho seller đã qua rà soát Pháp chế/Security trước go-live (data minimization: chỉ trường cần thiết để giao hàng); 0 trường dư thừa bị lộ qua audit | Review thủ công bởi đại diện Pháp chế/Security (**chưa có người — kế thừa `OQ-007` của `CTX`/`ARISK-06`**) đối chiếu danh sách field SA chuẩn bị, cộng kiểm thử so khớp field thực tế truyền cho seller vs danh sách đã duyệt | *(chưa có — `THR` thuộc hoạt động `sec`)* | Must | | `QAS-012` | Bypass MFA khi đăng nhập Admin | 100% đăng nhập Admin bắt buộc bước MFA thứ hai, 0 lượt bypass; Seller: khuyến khích (không bắt buộc) | Test tự động: đăng nhập Admin không qua MFA phải bị từ chối; audit log đăng nhập admin rà soát hàng tháng | *(chưa có — `THR` thuộc hoạt động `sec`)* | Must (Admin) / Should (Seller) | *Không ghi "bảo mật" như một mục — mỗi dòng trên nêu đúng một mối đe doạ cụ thể. Threat model STRIDE đầy đủ (`THR-nn`) là hoạt động `sec`, **chưa chạy** ở lượt này; ba `QAS` trên là input đầu vào cho hoạt động đó, không thay thế nó.* ### Bảo trì *Xem "Nhóm không áp dụng" ở A1 — không có `QAS` nào trong nhóm này ở lượt chạy này.* ### Quan sát được | ID | Kịch bản | Đo lường | Đo bằng cách nào | Mức | |---|---|---|---|---| | `QAS-013` | Sự cố tăng đột biến lỗi 5xx ở service giao dịch cốt lõi (Cart & Order, Payment, Identity) | Cảnh báo tự động trong **≤ 1 phút** (health check fail liên tục > 1 phút — kế thừa `SAD §9.4.1`); on-call acknowledge trong **≤ 15 phút** (`NFR-08`), quá hạn thì escalate | Diễn tập inject lỗi (chaos/fault injection thủ công — dừng task ECS) trên staging trước go-live, đo thời gian từ inject tới cảnh báo xuất hiện trên kênh (PagerDuty/OpsGenie) — **chưa từng diễn tập** | Must | | `QAS-014` | Webhook xác nhận thanh toán VNPay/Momo trễ/lỗi khiến đơn kẹt "chờ thanh toán" dù tiền đã thu (`DRV-08`) | Job đối soát phát hiện lệch trạng thái trong **≤ 15 phút** kể từ khi giao dịch được xác nhận phía cổng thanh toán *(🔴 đề xuất của SA — `SAD §3.4` chưa chốt tần suất job cụ thể, xem `OQ-021`, `ASM-18` mới)* | Test giả lập webhook trễ/mất trên staging — **cần sandbox VNPay/Momo thật, hiện CHƯA có (`ARISK-03`)**; đo thời gian phát hiện qua log job đối soát | Must | --- ## A4. `QAS` xung đột nhau | `QAS` A | `QAS` B | Xung đột ở đâu | Phương án cân bằng | Ai quyết | `ADR` | |---|---|---|---|---|---| | `QAS-010` (kiểm tra ownership mọi request `PATCH`/`DELETE /v1/cart/items`) | `QAS-003`/`QAS-004` (latency ≤500ms/≤300ms) | Mỗi lần kiểm tra ownership cần đối chiếu JWT/session với chủ sở hữu `CartItem` — nếu tra DB mỗi lần sẽ ăn vào ngân sách latency vốn đã eo hẹp (đề xuất) | Cache thông tin ownership/session trong Redis thay vì query DB mỗi request; đo lại `QAS-003`/`004` sau khi có thiết kế cụ thể | Tech Lead (quyết định thi công, không phải trade-off nghiệp vụ) | *(chưa có — sẽ chốt ở hoạt động `asr`/`adr` kế tiếp nếu cần)* | | `QAS-005` (SQS FIFO per-seller message group, sustained ≥100 msg/s) | `QAS-009` (mở rộng tới kịch bản B, ~4,2 đơn/giây × ~5 event/đơn) | AWS giới hạn cứng throughput cho **một message group** SQS FIFO (không phải toàn hàng đợi) — nếu một seller có volume rất cao, event của riêng seller đó có thể chạm trần group dù tổng hệ thống chưa chạm 100 msg/s; đảm bảo **thứ tự xử lý đúng theo seller** (liên quan `DRV-06` — tính nhất quán dữ liệu tài chính) buộc serialize trong group đó | Cần quyết định ở `ADR` message backbone: chấp nhận rủi ro cho seller lớn (theo dõi + cảnh báo riêng), hay thiết kế sharding/batching cho seller volume cao | Tech Lead + PO (ảnh hưởng kiến trúc + rủi ro vận hành cho seller lớn) | *(chưa có — `ADR` message backbone thuộc hoạt động `asr`/`adr` kế tiếp, `POC-01` phải chạy trước khi chốt)* | --- # PHẦN B — Architecturally Significant Requirements ## Ghi chú phạm vi — KHÔNG thực hiện ở lượt chạy này Theo yêu cầu điều phối ("Không tạo ASR/SAD/ADR ở lượt này"), Phần B **để trống có chủ đích**. `sa-2-architecture` yêu cầu thứ tự bắt buộc 1 (`QAS`) → 2 (`ASR`) → 3 (`SAD`) — tài liệu này đã hoàn thành đúng bước 1. Hoạt động `--focus asr` kế tiếp phải: - Rà toàn bộ 9 `DRV` ở `CTX §2` (chưa `DRV` nào có `ASR`/`QAS` phục vụ, theo `DTM §2` — 0/9, "kỳ vọng đúng lúc này"). - Rà 14 `QAS` Must ở Phần A trên — mọi `QAS` Must là ứng viên trực tiếp cho `ASR` (theo tiêu chí B1 của template: *"có `QAS` mức Must đứng sau"*). - Ứng viên `ASR` quan sát được trong lúc làm `QAS` (ghi lại để hoạt động `asr` không phải dò lại từ đầu, **không phải `ASR` chính thức**): - Ép hàng đợi bền + cơ chế đối soát bù cho xác nhận thanh toán bên thứ ba (`DRV-08`, `QAS-014`). - Ép biên cô lập Payment Service (network/IAM riêng) cho PCI-DSS SAQ A (`CON-06`, đã có trong `OPT` P2, chưa phải `ASR` chính thức). - Ép ranh giới message group theo seller cho thông lượng/thứ tự sự kiện (`DRV-06`, `QAS-005`, xung đột A4 dòng 2) — cần `ADR` message backbone. - Ép rà soát PII trước khi chia sẻ cho seller (`DRV-07`, `QAS-011`) — cần người phụ trách (`OQ-007` còn mở) trước khi có thể "Đã thiết kế". - `DEC-06` (chọn P2) phải được nâng thành `ADR` chính thức ngay khi hoạt động `asr`/`adr` bắt đầu (đã cảnh báo ở `DTM §11` "🟠 Nợ #1", radar ước lượng ~7 — **chưa đủ ngưỡng ≥8 bắt buộc POC** nhưng `POC-01` vẫn cần chạy trước khi `Accepted` vì bản thân `ASM-07` chưa xác minh). --- ## C. Đối chiếu với `NFR` của bộ BA | `NFR` của BA/SAD | Nội dung gốc | `QAS` tương ứng | Đã lượng hoá | Hành động | |---|---|---|---|---| | `NFR-01` (SAD) | Catalog/search <2s, checkout <3s | `QAS-001`, `QAS-002` | ✅ (số giữ nguyên, `Confidence` 🔴 vì chưa SLA) | Không đổi số — QAS tham chiếu đúng NFR-01, không có lệch | | `NFR-02` (SAD) | Scale-out ngang, cache/CDN/MQ, hàng nghìn–chục nghìn concurrent | `QAS-005`, `QAS-006`, `QAS-009` | ✅ (cụ thể hoá thành 2 kịch bản A/B với số concurrent/throughput rõ) | Không lệch — là làm rõ thêm, không đổi ý nghĩa | | `NFR-03` (SAD) | Uptime 99.9% dịch vụ giao dịch lõi | `QAS-007`, `QAS-008` | ✅ (thêm ngân sách lỗi 43 phút/tháng + RTO/RPO kế thừa) | Không lệch | | `NFR-04` (SAD) | Bảo mật PII, MFA | `QAS-011`, `QAS-012` | ✅ (một phần — `THR` STRIDE đầy đủ chờ hoạt động `sec`) | Hoạt động `sec` kế tiếp bổ sung `THR-nn` | | `NFR-05` (SAD) | PCI-DSS, NĐ52/85, NĐ13/2023 | `QAS-011` (một phần) | 🟡 Một phần | Phần PCI-DSS (biên cô lập Payment) chưa có `QAS` riêng — thuộc `SEC`/`ADR` hoạt động sau | | `NFR-06` (SAD) | Đa ngôn ngữ 5 thứ tiếng | *(không có `QAS`)* | ❌ Không lượng hoá thành `QAS` | Đây là yêu cầu chức năng/UI (chiến lược i18n), không phải thuộc tính chất lượng đo bằng con số kiểu latency/throughput — sẽ thành `ASR` (ép chiến lược tách chuỗi hiển thị khỏi code) ở hoạt động `asr`, không phải `QAS` | | `NFR-07` (SAD) | Bảo trì — kiến trúc module hoá | *(không có `QAS`, xem A1)* | ❌ N/A có lý do | Xem "Nhóm không áp dụng" A1 — chờ đội thi công thật (`OQ-010`) | | `NFR-08` (SAD) | Vận hành — 3 môi trường, on-call 24/7 sự cố nghiêm trọng | `QAS-013` | ✅ | Không lệch | | `NFR-PERF-01` (BA, `OQ-033`) | Ngưỡng `GET /v1/cart` — chưa chốt | `QAS-003` | 🟡 SA đề xuất 500ms | **`QAS` thắng `NFR`** — BA nên cập nhật `NFR_US002-003` §1 tham chiếu `QAS-003`, giữ `OQ-033` mở cho tới khi PO/Tech Lead xác nhận qua `OQ-018` | | `NFR-PERF-02` (BA, `OQ-033`) | Ngưỡng `PATCH`/`DELETE /v1/cart/items` — chưa chốt | `QAS-004` | 🟡 SA đề xuất 300ms | Tương tự — BA cập nhật tham chiếu `QAS-004`, `OQ-019` | | `NFR-SEC-01` (BA) | IDOR ownership check | `QAS-010` | ✅ Khớp hoàn toàn | Không lệch | | `NFR-SEC-02` (BA) | Cookie Guest `HttpOnly/Secure/SameSite` | *(không có `QAS` — thuộc mô hình xác thực)* | — | Thuộc hoạt động `sec` (mô hình authn), không phải `QAS` số | | `NFR-SEC-03` (BA) | Rate limit `PATCH`/`DELETE` Guest — "SAD định nghĩa" nhưng SAD cũng chưa có số cụ thể | *(chưa có `QAS`)* | ❌ Khoảng trống thật | Cần Tech Lead/Security chốt số cụ thể ở hoạt động `sec`/`icd` — ghi `OQ-023` | | `NFR-AVL-01/02` (BA) | Banner lỗi khi Cart & Order Service lỗi/chậm | *(không có `QAS` — thuộc `FAIL`)* | — | Thuộc hoạt động `fail` (failure mode), không phải `QAS` | | `NFR-AUD` (BA) | N/A cho `CartItem` | *(không áp dụng)* | ✅ Nhất quán | Không cần `QAS` | --- ## D. Giả định & Ngoài phạm vi **Giả định** *(tiếp số toàn dự án — `ASM-01…15` đã dùng ở `CTX`/`OPT`/`TCO`, bắt đầu `ASM-16`)*: | ID | Giả định | Cách xác minh | Nếu sai thì `QAS` nào đổi | |---|---|---|---| | `ASM-16` | Giỏ hàng có tối đa ~50 dòng/giỏ (đề xuất BA `NFR-PERF-01`) đủ làm baseline đo `GET /v1/cart` | Đo phân phối số dòng/giỏ thật trong 4–6 tuần đầu soft-launch (cùng đợt với `DRV-02` `GOAL-01`) | `QAS-003` — giỏ lớn hơn nhiều lần có thể cần phân trang/lazy-load, đổi cả ngưỡng latency lẫn thiết kế API | | `ASM-17` | Cửa sổ bảo trì có báo trước ≤ 2 giờ/tháng được loại khỏi ngân sách lỗi 99.9% | PO xác nhận chính sách bảo trì (`OQ-020`) | `QAS-007` — nếu PO không chấp nhận loại trừ, ngân sách lỗi thực tế hẹp hơn 43 phút/tháng | | `ASM-18` | Job đối soát thanh toán chạy đủ nhanh (đề xuất ≤15 phút) để phát hiện lệch trạng thái trước khi ảnh hưởng đáng kể tới CSKH | Tech Lead xác nhận tần suất job thật (`OQ-021`), đo lại sau khi có sandbox VNPay/Momo | `QAS-014` — tần suất chậm hơn thực tế cần thiết kế lại (webhook + polling kết hợp, hoặc rút ngắn chu kỳ) | *`ASM-01…15` của `CTX`/`OPT`/`TCO` (đặc biệt `ASM-07` → `QAS-005`, `ASM-08` → `QAS-006`, `ASM-10` → `QAS-009`, `ASM-04` → residency liên quan `QAS-011`) vẫn áp dụng nguyên trạng — không lặp lại nội dung, chỉ tham chiếu theo `artifact-map.md §7`.* **Ngoài phạm vi:** - `ASR`/`SAD`/`ADR`/`ICD`/`DAT`/`SEC`/`INF`/`FAIL` — chưa thực hiện ở lượt chạy này (chỉ hoạt động `qas`), theo đúng yêu cầu điều phối. Xem Phần B để biết ứng viên `ASR` đã quan sát được. - Kiến trúc này (P2, chưa `Accepted` bằng `ADR`) không nhắm tới tải vượt kịch bản B (10.000 concurrent) **×2** (~20.000 concurrent) mà chưa kiểm chứng lại bằng `POC`/bài đo thật — ngưỡng phải xét lại nếu traffic thật sau go-live tiệm cận mức này. - `NFR-06` (i18n)/`NFR-07` (bảo trì qua module hoá) không được lượng hoá thành `QAS` số — xử lý qua `ASR` (chiến lược i18n) và bằng cách đánh dấu N/A có lý do (bảo trì), không phải bỏ sót. - `QAS-008` (RTO/RPO) và ngưỡng cảnh báo ở `QAS-013` **kế thừa nguyên trạng** từ `SAD §5.3.2/ §9.4.1/§9.5.2` — SA **không** thiết kế lại HA/DR/observability ở lượt này (đó là hoạt động `inf`, chưa chạy); chỉ ghi lại để nhóm Sẵn sàng/Quan sát được của `QAS` đầy đủ theo template. ## E. Open Questions *Tiếp số sổ SA (`00-index/OQ_e-commerce.md` đang ở `OQ-017`) — bắt đầu `OQ-018`.* | ID | Câu hỏi | Hỏi ai | Từ ngày | Chặn gì | Hệ quả nếu trả lời ngược | |---|---|---|---|---|---| | `OQ-018` | Ngưỡng p95 cho `GET /v1/cart` là bao nhiêu? SA đề xuất ≤500ms (nối `OQ-033` của BA). | PO + Tech Lead | 2026-09-14 | `QAS-003` baseline; bài đo `FIT` ở GĐ3 | Nếu PO/Tech Lead muốn ngưỡng chặt hơn (VD ≤200ms): có thể cần thiết kế cache Redis mạnh hơn hoặc bỏ bớt dữ liệu trả về (VD ảnh sản phẩm rút gọn); nếu lỏng hơn (VD ≤1s): giảm áp lực thiết kế cache, nhưng tăng rủi ro trải nghiệm kém ở `DRV-02` (bỏ giỏ) | | `OQ-019` | Ngưỡng p95 cho `PATCH`/`DELETE /v1/cart/items` là bao nhiêu? SA đề xuất ≤300ms (nối `OQ-033` của BA). | PO + Tech Lead | 2026-09-14 | `QAS-004` baseline; bài đo `FIT` ở GĐ3 | Tương tự `OQ-018` — ngưỡng chặt hơn cần tối ưu ghi (VD giảm số lần round-trip DB); ngưỡng lỏng hơn giảm áp lực thiết kế | | `OQ-020` | Cửa sổ bảo trì có báo trước (nếu có) được loại trừ khỏi ngân sách lỗi 99.9%/tháng là bao nhiêu giờ? SA đề xuất ≤2 giờ/tháng. | PO | 2026-09-14 | `QAS-007` (ngân sách lỗi thật); chính sách release ở `INF` (chưa chạy) | Nếu PO không chấp nhận loại trừ nào: ngân sách lỗi thực tế thu hẹp còn đúng 43 phút/tháng kể cả bảo trì có kế hoạch — cần chiến lược blue-green/zero-downtime deploy nghiêm ngặt hơn, tăng chi phí vận hành | | `OQ-021` | Tần suất chạy job đối soát thanh toán (reconciliation) là bao nhiêu? SA đề xuất ≤15 phút/lần. | Tech Lead | 2026-09-14 | `QAS-014`; thiết kế job đối soát ở `DAT`/`INF` (chưa chạy) | Nếu tần suất thật thưa hơn (VD hàng giờ): thời gian phát hiện đơn kẹt "chờ thanh toán" lâu hơn, tăng rủi ro khiếu nại CSKH (`DRV-08`, `RISK-02` của BA) | | `OQ-022` | Lịch diễn tập DR (failover drill) đầu tiên cho nhóm service giao dịch cốt lõi là khi nào? **Đã chốt điều kiện (sign 2026-09-14, `DEC-12`): phải thực hiện TRƯỚC khi ký AG2** — ngày/lịch cụ thể vẫn chờ Ops/SRE. | Ops/SRE | 2026-09-14 | `QAS-008` (nâng `Confidence` từ 🔴); điều kiện tiên quyết ký AG2 (đã ghi vào điều kiện AG2, xem header) | Nếu không diễn tập trước AG2: Ops/SRE từ chối ký AG2 (theo `workflow.md §2` AG2 — "Chặn: RTO/RPO chưa diễn tập"), phải lùi gate — điều kiện này nay là bắt buộc, không còn là lựa chọn "ký có điều kiện kèm ARISK mới" | | `OQ-023` | Ngưỡng rate limit cụ thể (số request/phút theo IP) cho `PATCH`/`DELETE /v1/cart/items` của Guest là bao nhiêu? `NFR-SEC-03` của BA ghi "SAD định nghĩa" nhưng SAD cũng chưa có số. | Tech Lead + Security | 2026-09-14 | Hoạt động `sec`/`icd` kế tiếp; `NFR-SEC-03` của BA | Không có ngưỡng ⇒ rủi ro lạm dụng API (spam thêm/xoá giỏ hàng) không bị chặn — cần Security chấp nhận rủi ro tạm thời nếu chưa chốt được số trước go-live | **Nhắc:** cộng với `OQ-010` (kinh nghiệm team thật — ảnh hưởng gián tiếp `QAS-005`/`ASM-05` mới tương tự `ARISK-05`) và `OQ-012` (thời điểm chạy `POC-01`, đã đóng có điều kiện — POC phải chạy trước `ADR` message backbone) còn mở từ GĐ1, xem sổ đầy đủ `00-index/OQ_e-commerce.md`.