# ASR — Architecturally Significant Requirements — e-commerce | | | |---|---| | **Version** | 1.0 | | **Date** | 2026-09-14 | | **Author** | SA (skill sa-2-architecture, chế độ `go`, hoạt động `asr`) | | **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-15: chấp nhận 15 `ASR-001…015` (14 `Must` + 1 `Should`) đủ nguồn/"vì sao định hình kiến trúc"/cấu trúc bị ép, và chấp nhận danh sách 12 `ADR` ứng viên (`ADR-001…012`, §B2) với radar ước lượng đã ghi kèm; xác nhận `ADR-005`/`ADR-006`/`ADR-009` (radar ước lượng ≥8) **chỉ được chuyển `Accepted`** sau khi `POC-01`/`POC-02`/diễn tập DR (Ops/SRE) chạy xong, đúng `decision-radar.md §2`/§6 — không ký tắt qua bước đo. Chốt **TẠM** `OQ-024` (phương thức MFA Admin = TOTP app, theo `ASM-20`) và `OQ-025` (không dịch nội dung seller tự nhập ở MVP, chỉ i18n UI hệ thống, theo `ASM-21`) làm hướng đi tạm để `sad`/`sec` kế tiếp không nghẽn — **`OQ-024`/`OQ-025` giữ nguyên MỞ**, chờ Security/PO thật xác nhận, không coi là đã đóng. Ký thay Tech Lead theo ngoại lệ `DEC-01` (SA) — **không phải chữ ký Tech Lead thật**. · Security: — *(chưa ký)* · Ops/SRE: — *(chưa ký)* — AG2 cần cả ba cùng ký; tài liệu này **vẫn chưa qua AG2**. `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ệ. Ghi thêm `DEC-14`. | | **Source** | `01-context/CTX_e-commerce_v1.0.md` (v1.2) §2 (`DRV-01…09`), §3 (`CON-01…09`) · `01-context/OPT_e-commerce_v1.0.md` §1, §3 (P2), §5 (P3/P4 loại), §8 (`ASM-07…09`) · `01-context/ARISK_e-commerce_v1.0.md` §3 (`ARISK-01…10`), §6 (`POC-01`/`POC-02`) · `02-architecture/QAS_e-commerce_v1.0.md` v1.0 (toàn bộ `QAS-001…014`, đặc biệt Phần B "Ghi chú phạm vi") · `00-index/OQ_e-commerce.md` v1.9 · `00-index/DEC_e-commerce.md` v1.10 · `00-index/DTM_e-commerce.md` §11 ("🟠 Nợ #1" — `ADR-001`) · `00-index/ADL_e-commerce.md` §8 (việc phải làm #1) · `ba-output/e-commerce/02-analysis/BR_CartCheckout_v1.0.md` (`BR-CART-01…09`) · `ba-output/e-commerce/02-analysis/RBAC_CartCheckout_v1.0.md` (`ROLE-01/02`, ma trận §2, §4, §6) · `ba-output/e-commerce/02-analysis/IMPACT_CartCheckout_v1.0.md` · `ba-output/e-commerce/03-specification/API_US002-003_v1.0.md` · `e-commerce/docs/sections/02-phan-tich-yeu-cau.md` (`NFR-01…08`) · `e-commerce/docs/sections/03-kien-truc.md` §3.1–§3.4 (tham khảo, kế thừa nguyên trạng — không thiết kế lại ở lượt này) | | **Scope** | Toàn sàn e-commerce theo phương án **P2** (modular monolith + managed AWS, tách riêng Payment Service — `DEC-06`, chưa phải `ADR` chính thức). Chi tiết nhất: module **Giỏ hàng & Checkout** (US-002/003, `BR-CART-01…09`, `RBAC` `ROLE-01/02`). Chỉ hoạt động 2/9 của `sa-2-architecture` (**ASR**) — không tạo `SAD`/`ADR`/`ICD`/`DAT`/`SEC`/`INF`/`FAIL` ở lượt này; `QAS` (hoạt động 1) đã có ở `QAS_e-commerce_v1.0.md`, duyệt từng phần theo `DEC-12`. | | **Confidence** | 🔴 Giả định chưa xác minh — theo yêu cầu điều phối. AG1 chưa có chữ ký PO/Tech Lead thật (`OQ-004` mở); `POC-01`/`POC-02` chưa chạy; BA chưa ký G1 cho `BRIEF_CartCheckout`; `QAS` nguồn của phần lớn `ASR` dưới đây cũng đang giữ `Confidence` 🔴 (xem `QAS_e-commerce_v1.0.md` header). Mọi `ASR` giữ mức thấp nhất cho tới khi: (a) AG1 ký thật, (b) `POC-01`/`POC-02` chạy xong, (c) các `OQ` nguồn (`OQ-002/007/010/012/018…025`) được trả lời. | ## 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 `asr`) | Bản đầu — chưng cất 15 `ASR-nnn` từ `DRV`/`CON`/`QAS` (GĐ1–2 SA) và `BR-CART`/`ROLE` (BA), bao phủ đủ 14 nhóm bắt buộc theo ghi chú người duyệt (tách đơn theo seller, Payment cô lập, webhook idempotent + đối soát, message backbone + giới hạn FIFO group, RDS gộp, ownership check, PII/residency, MFA Admin, HA/DR + drill, observability, AWS bắt buộc, đối tác thanh toán/vận chuyển, ranh giới module Conway, đa ngôn ngữ) cộng 1 `ASR` tổng thể (kiểu kiến trúc P2, gắn `ADR-001` đang nợ theo `DTM`/`ADL`). Mỗi `ASR` có nguồn, "vì sao định hình kiến trúc", cấu trúc bị ép, đánh giá radar ước lượng và `ADR` ứng viên (số dự kiến — hoạt động `adr` kế tiếp xác nhận lại thứ tự thật). Không viết `ADR` ở lượt này. Thêm `OQ-024`/`OQ-025` (phương thức MFA Admin, chủ sở hữu chiến lược i18n) và `ASM-19…21`. Ghi `DEC-13` (tiếp nối `DEC-01…12`, ngoại lệ gate tiếp tục GĐ2 hoạt động `asr`). Không sửa `QAS`/`CTX`/`OPT` đã duyệt từng phần. `Confidence` 🔴 toàn bộ. | `DEC-13` | | 1.0 | 2026-09-15 | Đ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 15 `ASR-001…015` (14 `Must` + 1 `Should`) và danh sách 12 `ADR` ứng viên (`ADR-001…012`, §B2) với radar ước lượng; xác nhận `ADR-005`/`ADR-006`/`ADR-009` (radar ≥8) chỉ được `Accepted` sau khi `POC-01`/`POC-02`/diễn tập DR chạy xong. Chốt **TẠM** `OQ-024` (MFA Admin = TOTP app, `ASM-20`) và `OQ-025` (không dịch nội dung seller tự nhập ở MVP, chỉ i18n UI hệ thống, `ASM-21`) làm hướng đi tạm — cả hai **giữ nguyên mở**, chờ Security/PO thật xác nhận. 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-14`. | `DEC-14` | > Sơ đồ thắng về **quan hệ và luồng** — tài liệu này không có sơ đồ mới (chỉ bảng chưng cất yêu > cầu). 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) vẫn chưa được ký chính thức**, và **AG2 (gate của chính GĐ2) càng chưa tới hạn** — tài liệu này mới là hoạt động 2/9 của GĐ2. Tình trạng kế thừa nguyên vẹn từ `QAS_e-commerce_v1.0.md` §0 và `ARISK`/`OPT` §Tự chấm: AG1 4/4 artifact đủ cấu trúc nhưng nội dung còn `OQ-004` (tính hợp lệ ký thay), `OQ-005/006/007/008/010/012` (số/người thật) mở, `POC-01`/`POC-02` chưa chạy. Người dùng (vai điều phối dự án chạy thử) đã được cảnh báo lại và **khẳng định muốn tiếp tục** sang hoạt động 2 (`ASR`) của `sa-2-architecture`, sau khi hoạt động 1 (`QAS`) đã được duyệt từng phần (`DEC-12`). Quyết định ngoại lệ này được ghi tại `DEC-13` dưới đây và tại sổ `00-index/DEC_e-commerce.md`. > **DEC-13 (SA)** — Tiếp tục `sa-2-architecture` (hoạt động 2 — `ASR`) cho e-commerce trong khi > AG1 chưa có chữ ký PO/Tech Lead thật và AG2 (gate của chính GĐ2) chưa tới hạn — tiếp nối > `DEC-01…12`. > **Quyết định:** Chưng cất 15 `ASR` từ `DRV`/`CON`/`QAS`/`BR-CART`/`ROLE` đã có, giữ > `Confidence 🔴` cho tới khi nguồn tương ứng được xác nhận thật (đặc biệt: AG1 ký thật, > `POC-01`/`POC-02` chạy xong, `OQ-002/007/010/012/018…025` được trả lời). > **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 (chưng cất `ASR` từ tài liệu đã có, sửa lại > không tốn nhiều nếu nguồn đổi) · bán kính ảnh hưởng: toàn bộ hoạt động `sad`/`adr` kế tiếp phụ > thuộc danh sách 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 chưng cất từ chính các `QAS` Must) nhưng chưa phải quyết định kiến trúc đã > cam kết thi công · không ràng buộc dài hạn (danh sách `ASR` có thể sửa khi nguồn đổi, chưa phải > `ADR` bất biến) · không tranh cãi mới, tiếp nối tiền lệ `DEC-11/12` → **ghi `DEC-nn`, không cần > `ADR` cho việc chạy dưới ngoại lệ** (`decision-radar.md §1–§2`) — khác với các `ADR` ứng viên > liệt kê ở §B2 dưới đây, việc đó vẫn để hoạt động `sad`/`adr` kế tiếp. > **Hệ quả nếu không chấp nhận ngoại lệ:** dừng GĐ2 ở hoạt động `qas`, không có `ASR` để hoạt > động `sad` (bắt buộc có trước theo thứ tự 1→2→3 của `SKILL.md`) dùng làm đầu vào — chậm tiến độ > chạy thử tương ứng thời gian xử lý các `OQ` đang mở. 🔴 **Nhắc quan trọng:** đây là hoạt động 2/9. `SAD` (hoạt động 3), `ADR`, `ICD`, `DAT`, `SEC`, `INF`, `FAIL` **chưa được tạo**. Theo `SKILL.md`: "1→2→3 bắt buộc trước; 4–8 chạy song song được" — `ASR` này là điều kiện đầu vào bắt buộc cho `SAD` (hoạt động 3) kế tiếp. --- # PHẦN B — Architecturally Significant Requirements ## B0. Tóm tắt | Nhóm | Số `ASR` | Must | Should | Có ứng viên `ADR` | Chỉ cần `DEC` | |---|---|---|---|---|---| | Cấu trúc hệ thống (kiểu kiến trúc, ranh giới, tách đơn) | 3 (`ASR-001,003,014`) | 3/3 | — | 3/3 | 0 | | Bảo mật & tuân thủ | 4 (`ASR-002,007,008,009`) | 3/4 | 1/4 *(MFA Admin Must, phần Seller Should)* | 3/4 | 1 (`ASR-009`, borderline) | | Tích hợp & dữ liệu | 3 (`ASR-004,005,006`) | 3/3 | — | 3/3 | 0 | | Hạ tầng & vận hành | 2 (`ASR-010,011`) | 2/2 | — | 2/2 | 0 | | Ràng buộc nền tảng (đầu vào, không phải quyết định SA) | 1 (`ASR-012`) | 1/1 | — | 0/1 *(đã phản ánh trong `ADR-001`)* | — | | Phụ thuộc bên ngoài | 1 (`ASR-013`) | 1/1 | — | 1/1 | 0 | | Frontend / i18n | 1 (`ASR-015`) | — | 1/1 | 0/1 *(borderline)* | 1 | | **Tổng** | **15** | **13/15** | **2/15** | **12/15** | **2/15** (+1 N/A) | **Đọc bảng:** 15 nằm trong khoảng "8–15 mục" khuyến nghị của `SKILL.md` §2 — không phải danh sách 200 mục. Ba `ASR` không bắt buộc `ADR` (`ASR-009`, `ASR-012`, `ASR-015`) vẫn được giữ trong sổ vì đều có `QAS` Must hoặc Should đứng sau (tiêu chí B1), chỉ khác ở việc quyết định cụ thể có thể chốt bằng `DEC-nn`/`AGD` thay vì `ADR` bất biến. ## B1. Tiêu chí một yêu cầu là `ASR` *(tham chiếu — xem đầy đủ ở `templates/quality-scenarios.md` §B1)* Có ≥ 1 điều: ép một **cấu trúc** · ép một **ràng buộc không đảo ngược** · ép một **đánh đổi** · có `QAS` mức **Must** đứng sau. Mỗi `ASR` dưới đây ghi rõ đang thoả điều nào. ## B2. Danh sách `ASR` — chi tiết ### ASR-001 — Kiểu kiến trúc tổng thể phải là Modular Monolith + managed AWS, Payment tách riêng (P2) `[Must]` | | | |---|---| | **Phát biểu** | Toàn sàn phải được tổ chức thành 2–3 nhóm triển khai ECS Fargate (modular monolith theo domain), **không** phải ~10 microservices độc lập database-per-service (P1); duy nhất Payment Service tách hoàn toàn khỏi phần còn lại. | | **Nguồn** | `DEC-06` (chọn P2, chưa phải `ADR`) · `OPT_e-commerce_v1.0.md` §1, §3, §4 (điểm 4.05 vs 2.95) · `CON-05` (năng lực team, Conway) · `CON-01`/`CON-02` (chi phí/thời gian) | | **Vì sao định hình kiến trúc** | **Chi phí đổi sau cao** (đảo từ monolith sang microservices hay ngược lại tốn tái cấu trúc network/DB/CI-CD, không phải một buổi chiều) **+ cắt ngang mọi component** (mọi module — Catalog, Cart&Order, Seller, Commission, Promo, Review, Notify, Shipping — đều nằm trong ranh giới triển khai này) | | **Ép ra cấu trúc gì** | Ranh giới triển khai (deployment boundary): tối đa 2–3 đơn vị ECS Fargate cho phần monolith + 1 đơn vị Payment riêng biệt mạng/IAM; 1 RDS chính schema-per-module (xem `ASR-006`); SQS/EventBridge thay Kafka/MSK (xem `ASR-005`) | | **Quyết định cần `ADR`** | **Có — `ADR-001`** (số đã "nợ" theo `DTM §11`/`ADL §8`) — *"Kiểu kiến trúc tổng thể GĐ2 — Modular Monolith P2, không phải Microservices P1"*. Radar ước lượng **~7** (chi phí đảo ngược cao=2 · bán kính toàn hệ thống=2 · chạm `QAS` Must gián tiếp qua `QAS-005/006/009`=1 · ràng buộc ≥1 năm=2 · chưa tranh cãi mới=0). **Dưới ngưỡng 8 cứng nhưng vẫn cần `POC-01`/`POC-02` trước khi `Accepted`** vì bản thân `ASM-07`/`ASM-08` (SQS đủ throughput, RDS đủ tải gộp) chưa xác minh — nếu một trong hai `POC` fail, quyết định này phải viết lại một phần (kiến trúc lai), không phải toàn bộ. | | **Trạng thái** | Đã ghi nhận — `ADR-001` chưa viết (hoạt động `sad`/`adr` kế tiếp phải viết ngay khi bắt đầu, theo cảnh báo đã có ở `DTM`/`ADL`) | --- ### ASR-002 — Payment Service là biên cô lập PCI-DSS SAQ A, không lưu thông tin thẻ `[Must]` | | | |---|---| | **Phát biểu** | Payment Service phải là ranh giới mạng + IAM + dữ liệu (RDS riêng) hoàn toàn tách biệt khỏi phần monolith còn lại; hệ thống sàn không được lưu số thẻ/CVV ở bất kỳ đâu — mọi xử lý thẻ do VNPay/Momo thực hiện, sàn chỉ lưu `gateway_transaction_ref` + kết quả. | | **Nguồn** | `DRV-03` (giảm phạm vi PCI-DSS) · `CON-06` (PCI-DSS SAQ A + NĐ13/2023, cứng) · `BR-CART-05` (BA, "Không lưu trữ thông tin thẻ thanh toán" — không thể đổi trong 1 năm) | | **Vì sao định hình kiến trúc** | **Ràng buộc công nghệ/pháp lý không đảo ngược** (vi phạm PCI-DSS/hợp đồng với VNPay/Momo, không phải quyết định kỹ thuật có thể đổi ý sau) **+ cắt ngang** (mọi luồng chạm dữ liệu thanh toán trong toàn hệ thống phải đi qua đúng một biên này) | | **Ép ra cấu trúc gì** | Payment Service = container riêng, network/IAM riêng, RDS riêng nhỏ (đã phản ánh sơ bộ ở `OPT §3` P2); mọi module khác chỉ nhận `gateway_transaction_ref`/`status`, không bao giờ nhận/lưu dữ liệu thẻ | | **Quyết định cần `ADR`** | **Có — `ADR-002`** (dự kiến) — *"Payment Service là biên cô lập PCI-DSS SAQ A"*. Radar ước lượng **~7** (đảo ngược tốn — tách lại sau khi đã gộp nhầm sẽ phải audit lại toàn bộ luồng thẻ=2 · bán kính: mọi module chạm thanh toán=1 · chạm `QAS-011` Must (PII) gián tiếp=1 · ràng buộc pháp lý ≥1 năm, không thương lượng=2 · chưa tranh cãi=1). Không cần POC bắt buộc (không phải con số hiệu năng chưa đo — đây là ràng buộc pháp lý đã có sẵn), nhưng cần Security ký (theo `decision-radar.md §5`: bảo mật/quyền riêng tư do Security chốt). | | **Trạng thái** | Đã ghi nhận — `ADR-002` chưa viết; input trực tiếp cho hoạt động `sec` (threat model) và `dat` (ownership dữ liệu Payment) kế tiếp | --- ### ASR-003 — Tách đơn hàng theo seller khi checkout (Order cha / OrderSeller con) `[Must]` | | | |---|---| | **Phát biểu** | Khi checkout, hệ thống phải nhóm `CartItem` theo `seller_id` và tạo một `OrderSeller` (đơn con) riêng cho mỗi nhóm; `Order` (đơn cha) là tập hợp các `OrderSeller`, mỗi `OrderSeller` có vòng đời trạng thái độc lập. | | **Nguồn** | `BR-CART-01` (BA) · `DRV-01` (blocker MVP) · `DRV-02` (bỏ giỏ đa seller) · `DRV-06` (minh bạch dòng tiền 3 bên) | | **Vì sao định hình kiến trúc** | **Chi phí đổi sau cao** (đổi mô hình dữ liệu Order/OrderSeller sau go-live cần migrate toàn bộ đơn hàng lịch sử + sửa mọi module đọc `Order`) **+ cắt ngang nhiều component** (Cart&Order, Commission&Payout, Shipping&Fulfillment, Review đều phụ thuộc cấu trúc cha-con này) | | **Ép ra cấu trúc gì** | Mô hình dữ liệu 1 `Order` — N `OrderSeller` — N `OrderItem`; mỗi `OrderSeller` là đơn vị hạch toán/vận chuyển/đối soát độc lập; ranh giới sở hữu dữ liệu giữa Cart&Order (tạo `Order`/`OrderSeller`) và Commission&Payout/Shipping (tiêu thụ) | | **Quyết định cần `ADR`** | **Có — `ADR-003`** (dự kiến) — *"Mô hình Order/OrderSeller — tách đơn theo seller"*. Radar ước lượng **~6** (đảo ngược cao=2 · bán kính nhiều module=2 · chạm `QAS` Must gián tiếp (không có `QAS` số riêng nhưng là nền cho toàn luồng checkout `QAS-002`)=1 · ràng buộc ≥1 năm (mô hình dữ liệu lõi)=1 · ít tranh cãi, đã là mô hình kinh doanh đã chốt=0). *Lưu ý: cơ chế tách chi tiết "luôn đúng N đơn cho N seller, không gộp" vẫn phụ thuộc `OQ-011` (BA) chưa đóng — `ADR-003` phải chờ hoặc ghi rõ giả định.* | | **Trạng thái** | Đã ghi nhận — `ADR-003` chưa viết; phụ thuộc `OQ-011` (BA) trước khi có thể coi là "Đã kiểm chứng" | --- ### ASR-004 — Webhook xác nhận thanh toán phải idempotent + có job đối soát bù `[Must]` | | | |---|---| | **Phát biểu** | Cập nhật `Payment.status = success` chỉ được thực hiện khi webhook VNPay/Momo có chữ ký hợp lệ và xử lý **idempotent** (webhook gọi lại nhiều lần không tạo hiệu ứng phụ); đồng thời phải có job đối soát bù chạy định kỳ để phát hiện lệch trạng thái khi webhook trễ/mất. | | **Nguồn** | `QAS-014` (đối soát ≤15 phút, đề xuất SA, `OQ-021`) · `DRV-08` (webhook chưa xác minh khả thi gần thời gian thực) · `BR-CART-06` (BA) · `ARISK-03` | | **Vì sao định hình kiến trúc** | **Ép một đánh đổi** (không thể đảm bảo consistency mạnh cho trạng thái thanh toán vì phụ thuộc bên thứ ba — phải chấp nhận eventual consistency có giới hạn thời gian, đây là quyết định kiến trúc không phải chi tiết code) **+ cắt ngang** (chạm Payment Service, Cart&Order — cập nhật `OrderSeller.status`, và tầng quan sát được — job đối soát cần alerting riêng) | | **Ép ra cấu trúc gì** | Idempotency key (theo `gateway_transaction_ref`) cho endpoint nhận webhook; job đối soát bù (reconciliation) chạy định kỳ, độc lập với luồng webhook chính; cần bảng log webhook đã nhận để so khớp | | **Quyết định cần `ADR`** | **Có — `ADR-004`** (dự kiến) — *"Cơ chế idempotency & đối soát cho webhook thanh toán bên thứ ba"*. Radar ước lượng **~6** (đảo ngược trung bình-cao (đổi cơ chế đối soát sau khi có dữ liệu thật tốn công viết lại job + backfill)=1 · bán kính: Payment + Cart&Order + Observability=1 · chạm `QAS-014` Must trực tiếp=2 · ràng buộc trong khoảng GĐ2, có thể đổi khi có sandbox thật=1 · chưa tranh cãi=1). | | **Trạng thái** | Đã ghi nhận — `ADR-004` chưa viết; phụ thuộc sandbox VNPay/Momo thật (`ARISK-03`, chưa có) để kiểm chứng | --- ### ASR-005 — Message backbone SQS FIFO (per-seller group) + EventBridge cho luồng đặt hàng, có giới hạn thông lượng theo group `[Must]` | | | |---|---| | **Phát biểu** | Luồng sự kiện `OrderPlaced`/`PaymentConfirmed` phải dùng SQS FIFO (message group theo `seller_id`, đảm bảo thứ tự xử lý trong cùng seller) + EventBridge fan-out cho các consumer chuỗi sau đặt hàng (hoa hồng, payout, notify, loyalty); phải có phương án cho seller có volume cao chạm trần throughput của một message group. | | **Nguồn** | `QAS-005` (≥100 msg/s sustained, p99 ≤2s, 0 mất message) · `ARISK-01` · `DEC-06` (P2 chọn SQS/EventBridge thay Kafka/MSK) · `ASM-07` (chưa xác minh) | | **Vì sao định hình kiến trúc** | **Ràng buộc công nghệ không đảo ngược trong ngắn hạn** (đổi từ SQS/EventBridge sang Kafka/MSK sau khi đã có producer/consumer thật là viết lại toàn bộ tầng tích hợp bất đồng bộ, không phải cấu hình) **+ cắt ngang** (mọi module tiêu thụ event `OrderPlaced` — Commission, Payout, Notification, Loyalty — đều phụ thuộc cơ chế này) | | **Ép ra cấu trúc gì** | SQS FIFO queue với message group key = `seller_id`; EventBridge rule cho fan-out ≥5 consumer; cơ chế giám sát riêng cho seller có volume cao (theo dõi/cảnh báo riêng theo `QAS` A4 xung đột dòng 2); **KHÔNG** dùng Kafka/MSK trừ khi `POC-01` fail | | **Quyết định cần `ADR`** | **Có — `ADR-005`** (dự kiến) — *"Message backbone cho luồng đặt hàng — SQS FIFO + EventBridge"*. Radar ước lượng **~8** (đảo ngược cao=2 · bán kính nhiều module=2 · chạm `QAS-005` Must trực tiếp=2 · ràng buộc ≥1 năm (chọn message broker là quyết định dài hạn)=1 · chưa tranh cãi mới=1). **≥8 ⇒ theo `decision-radar.md §2`, `ADR` này không được chuyển `Accepted` khi chưa có `POC`/bài đo — `POC-01` (`ARISK §6`) chính là bài đo bắt buộc, hiện CHƯA CHẠY.** | | **Trạng thái** | Đã ghi nhận — `ADR-005` chưa viết; **chặn `Accepted` cho tới khi `POC-01` chạy xong** (đã ghi ở `OQ-012`, `ARISK §6`) | --- ### ASR-006 — Một cụm RDS PostgreSQL chính, schema-per-module, chịu tải ghi/đọc gộp (trừ Payment) `[Must]` | | | |---|---| | **Phát biểu** | Toàn bộ module ngoại trừ Payment phải dùng chung 1 cụm RDS PostgreSQL Multi-AZ, phân tách theo schema-per-module (ranh giới logic rõ ràng dù chung instance); cụm này phải chịu được tải ghi (checkout) + đọc (catalog) gộp ở tải đỉnh. | | **Nguồn** | `QAS-006` (p95 write ≤300ms, p95 read ≤200ms, CPU <75%) · `ARISK-02` · `DEC-06` (P2) · `ASM-08` (chưa xác minh) | | **Vì sao định hình kiến trúc** | **Chi phí đổi sau cao** (tách read replica/DB riêng cho từng module sau khi đã gộp là một dự án migration riêng, không phải config) **+ cắt ngang** (mọi module ngoài Payment — Catalog, Cart&Order, Seller, Commission, Promo, Review, Notify, Shipping — đều chia sẻ cùng một instance, một module quá tải ảnh hưởng tất cả) | | **Ép ra cấu trúc gì** | 1 RDS instance chính (`db.r6g.xlarge` Multi-AZ theo `TCO`/`ARISK`, tham khảo — số thật thuộc hoạt động `inf`), schema riêng cho từng module, connection pool chia sẻ có giới hạn theo module để tránh một module chiếm hết pool | | **Quyết định cần `ADR`** | **Có — `ADR-006`** (dự kiến) — *"Chiến lược dữ liệu — RDS gộp schema-per-module cho P2"*. Radar ước lượng **~8** (đảo ngược cao=2 · bán kính toàn bộ module ngoài Payment=2 · chạm `QAS-006` Must trực tiếp=2 · ràng buộc ≥1 năm=1 · chưa tranh cãi=1). **≥8 ⇒ bắt buộc `POC`/bài đo trước `Accepted` — `POC-02` (`ARISK §6`) là bài đo bắt buộc, hiện CHƯA CHẠY.** | | **Trạng thái** | Đã ghi nhận — `ADR-006` chưa viết; **chặn `Accepted` cho tới khi `POC-02` chạy xong** | --- ### ASR-007 — Mọi thao tác Cart/Order phải qua kiểm tra quyền sở hữu (ownership check) `[Must]` | | | |---|---| | **Phát biểu** | Mọi request đọc/sửa/xoá `Cart`/`CartItem`/`Order` phải được đối chiếu quyền sở hữu: Guest theo `session_id` của chính phiên, Customer theo `customer_id` của chính họ — 0% truy cập chéo (IDOR) thành công. | | **Nguồn** | `QAS-010` (100% request qua kiểm tra, 0 IDOR thành công) · `RBAC_CartCheckout_v1.0.md` §2 (ma trận: "Xem giỏ hàng/đơn hàng của người khác" = ❌ cho cả `ROLE-01` Guest và `ROLE-02` Customer) | | **Vì sao định hình kiến trúc** | **Ép một đánh đổi** (kiểm tra ownership mỗi request cạnh tranh trực tiếp với ngân sách latency `QAS-003`/`QAS-004` — đã ghi nhận ở `QAS` A4 xung đột dòng 1, cần quyết định cache ownership hay query DB mỗi lần) **+ cắt ngang** (mọi endpoint `GET`/`PATCH`/`DELETE` của `/v1/cart*` đều cần cùng một cơ chế) | | **Ép ra cấu trúc gì** | Chỗ ra quyết định authz (API gateway hay từng service) phải nhất quán cho toàn bộ nhóm "giao dịch"; cần cơ chế cache session/ownership (VD Redis) nếu chọn tối ưu latency thay vì query DB mỗi request | | **Quyết định cần `ADR`** | **Có — `ADR-007`** (dự kiến) — *"Chỗ ra quyết định ownership/authz cho Cart & Order — gateway hay service, có cache không"*. Radar ước lượng **~6** (đảo ngược trung bình=1 · bán kính: toàn bộ endpoint Cart&Order=1 · chạm `QAS-010` Must trực tiếp + xung đột trực tiếp với `QAS-003/004`=2 · ràng buộc trong khoảng GĐ2=1 · đã có xung đột ghi nhận ở `QAS` A4, cần Tech Lead quyết=1). | | **Trạng thái** | Đã ghi nhận — `ADR-007` chưa viết; input trực tiếp cho hoạt động `sec` (mô hình phân quyền) và `sad` (nơi đặt logic authz) | --- ### ASR-008 — Dữ liệu PII chia sẻ cho seller phải qua data-minimization + xác nhận residency NĐ13/2023 `[Must]` | | | |---|---| | **Phát biểu** | Khi tách đơn theo seller, chỉ những trường PII (địa chỉ, SĐT người nhận) thực sự cần thiết để giao hàng mới được chia sẻ cho seller tương ứng; toàn bộ dữ liệu này (và mọi PII khách hàng/seller khác) phải được xác nhận nơi lưu trữ (residency) đáp ứng NĐ13/2023 trước go-live. | | **Nguồn** | `QAS-011` (100% trường PII đã rà soát, 0 trường dư thừa) · `CON-06` (NĐ13/2023, cứng) · `DRV-07` (chưa rà soát) · `ARISK-06` · `ASM-04` (`ap-southeast-1` chưa xác nhận đủ) | | **Vì sao định hình kiến trúc** | **Ràng buộc pháp lý không đảo ngược** (vi phạm NĐ13/2023 là vi phạm pháp luật, không phải lựa chọn kỹ thuật) **+ cắt ngang** (mọi module có PII — Identity, Cart&Order khi tách đơn, Seller Management với KYC — đều chịu ràng buộc vùng lưu trữ và chính sách chia sẻ này) | | **Ép ra cấu trúc gì** | Danh sách trường PII được phép truyền cho seller (whitelist, không phải blacklist); vùng lưu trữ dữ liệu (region AWS) phải được Legal/Security xác nhận; cơ chế che/ẩn field khi hiển thị cho seller (mức che — theo `RBAC` §4, chưa chốt) | | **Quyết định cần `ADR`** | **Có — `ADR-008`** (dự kiến) — *"Vùng lưu trữ dữ liệu cá nhân & chính sách chia sẻ PII cho seller"*. Radar ước lượng **~7** (đảo ngược cao — đổi region sau go-live là migration dữ liệu thật=2 · bán kính nhiều module có PII=1 · chạm `QAS-011` Must trực tiếp=2 · ràng buộc pháp lý ≥1 năm, không thương lượng=2 · chưa tranh cãi (chờ người rà soát)=0). **Phủ quyết thuộc Security/Legal** (`decision-radar.md §5`), không phải SA — SA chỉ chuẩn bị danh sách trường để người đó rà soát (đã ghi ở `ARISK-06`). | | **Trạng thái** | Đã ghi nhận — `ADR-008` chưa viết; **chặn hoàn toàn cho tới khi có đại diện Pháp chế/Bảo mật** (`OQ-007`, vẫn chưa có người sau cả GĐ1 lẫn hoạt động `qas`) | --- ### ASR-009 — Đăng nhập Admin bắt buộc MFA (Seller khuyến khích, không bắt buộc) `[Must cho Admin / Should cho Seller]` | | | |---|---| | **Phát biểu** | 100% đăng nhập tài khoản Admin phải qua bước xác thực thứ hai (MFA); 0 lượt bypass được chấp nhận. Seller được khuyến khích bật MFA nhưng không bắt buộc ở MVP. | | **Nguồn** | `QAS-012` (100% Admin qua MFA, Must; Seller Should) | | **Vì sao định hình kiến trúc** | Chủ yếu **chạm `QAS` Must** (tiêu chí thứ tư của B1) — bán kính hẹp hơn các `ASR` khác (chỉ Identity/Admin module), chi phí đổi sau ở mức trung bình (thêm MFA sau go-live không tốn quá nhiều nếu thiết kế đúng ngay từ đầu, nhưng đổi phương thức MFA sau khi user đã đăng ký thì tốn UX) | | **Ép ra cấu trúc gì** | Identity/Access module cần bước xác thực thứ hai (TOTP app / SMS OTP / khác — **chưa chốt phương thức cụ thể**, xem `OQ-024` mới) trong luồng đăng nhập Admin; cần lưu trạng thái MFA đã bật/thu hồi được | | **Quyết định cần `ADR`** | **Không bắt buộc `ADR`** — radar ước lượng **~4** (đảo ngược trung bình=1 · bán kính hẹp, 1 module=0 · chạm `QAS-012` Must trực tiếp=2 · ràng buộc trong 1 release, có thể đổi nhà cung cấp MFA sau=1 · chưa tranh cãi=0). Theo `decision-radar.md §2` (3–4 điểm) ⇒ **`DEC-nn` là đủ** khi Tech Lead chốt phương thức cụ thể ở hoạt động `sec`. *Ngoại lệ: nếu chọn nhà cung cấp MFA bên thứ ba ràng buộc hợp đồng dài hạn, nâng lên `ADR` theo `decision-radar.md §4` "ngoại lệ tiền lệ".* | | **Trạng thái** | Đã ghi nhận — quyết định cụ thể (phương thức MFA) để hoạt động `sec` chốt bằng `DEC-nn`, không nhất thiết `ADR` | --- ### ASR-010 — HA/DR cho nhóm dịch vụ giao dịch lõi: RPO ≤15 phút, RTO ≤1 giờ, bắt buộc diễn tập trước AG2 `[Must]` | | | |---|---| | **Phát biểu** | Payment, Cart & Order, Identity & Access phải có khả năng khôi phục sau sự cố với RPO ≤15 phút và RTO ≤1 giờ; **con số này phải được chứng minh bằng diễn tập (failover drill) thật trước khi AG2 được ký** — không chấp nhận RTO/RPO chỉ tồn tại trên giấy. | | **Nguồn** | `QAS-008` · `OQ-022` (đã chốt điều kiện qua `DEC-12`: diễn tập là điều kiện tiên quyết AG2) | | **Vì sao định hình kiến trúc** | **Chi phí đổi sau cao** (thiết kế lại chiến lược backup/failover sau khi đã go-live là một dự án riêng, có rủi ro downtime khi thực hiện) **+ cắt ngang** (ảnh hưởng chiến lược backup, network, và runbook vận hành của cả 3 service lõi) **+ chạm `QAS` Must trực tiếp** | | **Ép ra cấu trúc gì** | Chiến lược backup point-in-time (RPO ≤15 phút ⇒ tần suất backup/WAL archiving tương ứng); kiến trúc Multi-AZ + quy trình failover có runbook; **lịch diễn tập cụ thể — vẫn chưa có, `OQ-022` giữ mở chờ Ops/SRE** | | **Quyết định cần `ADR`** | **Có — `ADR-009`** (dự kiến) — *"Chiến lược HA/DR cho nhóm dịch vụ giao dịch lõi"*. Radar ước lượng **~9** (đảo ngược cao=2 · bán kính 3 service lõi + toàn bộ vận hành=2 · chạm `QAS-008` Must trực tiếp=2 · ràng buộc hạ tầng ≥1 năm=2 · chưa tranh cãi nhưng con số kế thừa từ `SAD.md` chưa được SA thiết kế lại=1). **≥8 ⇒ bắt buộc bài đo (diễn tập DR) trước `Accepted`** — đây chính là điều kiện đã chốt ở `DEC-12`/`OQ-022`, nhất quán với `decision-radar.md §6`. | | **Trạng thái** | Đã ghi nhận — `ADR-009` chưa viết; input bắt buộc cho hoạt động `inf` kế tiếp; **chặn `Accepted` cho tới khi diễn tập DR chạy** (đã là điều kiện ký AG2, không chỉ điều kiện `Accepted` của riêng ADR này) | --- ### ASR-011 — Observability phải cảnh báo lỗi 5xx tăng đột biến trong ≤1 phút cho nhóm giao dịch lõi `[Must]` | | | |---|---| | **Phát biểu** | Sự cố lỗi 5xx tăng đột biến ở Cart & Order, Payment, Identity phải được cảnh báo tự động trong ≤1 phút; on-call phải acknowledge trong ≤15 phút. | | **Nguồn** | `QAS-013` | | **Vì sao định hình kiến trúc** | **Cắt ngang** (mọi service lõi cần cùng chuẩn logging/metric để pipeline cảnh báo hoạt động nhất quán) **+ chạm `QAS` Must trực tiếp**; chi phí đổi sau ở mức trung bình (đổi công cụ observability sau này khả thi nhưng tốn công di chuyển dashboard/alert đã cấu hình) | | **Ép ra cấu trúc gì** | Chuẩn log/metric/trace thống nhất cho 3 service lõi; pipeline cảnh báo (CloudWatch Synthetics/Alarms hoặc tương đương) kết nối kênh on-call (PagerDuty/OpsGenie); ngưỡng cấu hình cảnh báo phải khớp ≤1 phút | | **Quyết định cần `ADR`** | **Có — `ADR-010`** (dự kiến) — *"Kiến trúc observability & alerting cho dịch vụ giao dịch lõi"*. Radar ước lượng **~6** (đảo ngược trung bình=1 · bán kính 3 service lõi=1 · chạm `QAS-013` Must trực tiếp=2 · ràng buộc trong khoảng GĐ2/GĐ3, có thể đổi công cụ=1 · chưa tranh cãi=1). | | **Trạng thái** | Đã ghi nhận — `ADR-010` chưa viết; input cho hoạt động `inf` (observability) kế tiếp | --- ### ASR-012 — Toàn bộ hạ tầng phải chạy trên AWS `[Must — ràng buộc đầu vào]` | | | |---|---| | **Phát biểu** | Không dùng cloud khác hoặc on-premise cho bất kỳ thành phần nào của hệ thống. | | **Nguồn** | `CON-03` (cứng, đã xác nhận vòng 3 Q&A brief — không phải sở thích SA) | | **Vì sao định hình kiến trúc** | **Ràng buộc công nghệ không đảo ngược** — nhưng đây là **ràng buộc đầu vào** (khách hàng đã chốt), không phải một quyết định do SA cân nhắc và chọn giữa nhiều phương án | | **Ép ra cấu trúc gì** | Loại toàn bộ phương án dùng cloud khác/on-prem ngay từ `OPT` (đã thực hiện ở GĐ1); mọi dịch vụ managed trong `ASR-001…011` (ECS Fargate, RDS, SQS/EventBridge, CloudWatch) đều phải là dịch vụ AWS | | **Quyết định cần `ADR`** | **Không cần `ADR` riêng** — đây là input, không phải quyết định SA; đã được phản ánh làm điều kiện tiên quyết trong `ADR-001` (kiểu kiến trúc tổng thể). Ghi lại ở đây để đầy đủ theo yêu cầu bao phủ, không phải vì cần quyết định thêm. | | **Trạng thái** | Đã ghi nhận — không cần thiết kế thêm, chỉ cần tuân thủ xuyên suốt `SAD`/`INF` | --- ### ASR-013 — Tích hợp bắt buộc VNPay/Momo (thanh toán) + GHN/GHTK (vận chuyển, có fallback chéo) `[Must]` | | | |---|---| | **Phát biểu** | Hệ thống phải tích hợp đúng 4 đối tác đã chốt (không phải "chờ chọn tuỳ ý"); GHN/GHTK phải có cơ chế fallback chéo khi một bên lỗi. Mỗi đối tác cần chính sách timeout/retry/idempotent nhất quán. | | **Nguồn** | `CON-04` (cứng về danh tính đối tác) · `ARISK-03` (VNPay/Momo) · `ARISK-04` (GHN/GHTK fallback chưa kiểm chứng) | | **Vì sao định hình kiến trúc** | **Ràng buộc hợp đồng/công nghệ không đảo ngược** (đổi đối tác thanh toán/vận chuyển là quyết định kinh doanh + hợp đồng, không phải cấu hình) **+ cắt ngang** (Payment Service phụ thuộc VNPay/Momo; Shipping & Fulfillment phụ thuộc GHN/GHTK; cùng một chính sách resilience nên áp dụng nhất quán) | | **Ép ra cấu trúc gì** | Adapter/anti-corruption layer riêng cho từng đối tác; chính sách timeout/retry/idempotent chung (kế thừa đề xuất từ `SAD.md §3.4`: VNPay/Momo 10s, GHN/GHTK 8s — **chưa kiểm chứng sandbox thật**); cơ chế fallback GHN↔GHTK cần test riêng | | **Quyết định cần `ADR`** | **Có — `ADR-011`** (dự kiến) — *"Chính sách resilience khi đối tác thanh toán/vận chuyển bên ngoài lỗi (timeout/retry/fallback chung)"*. Radar ước lượng **~6** (đảo ngược trung bình=1 · bán kính Payment + Shipping=1 · chạm gián tiếp `QAS-002`/`QAS-014`=1 · ràng buộc hợp đồng đối tác, khó đổi giữa chừng=2 · chưa tranh cãi=1). Đây cũng là input trực tiếp cho hoạt động `fail` (đường lỗi) — không trùng lặp, `ADR` chốt chính sách chung, `FAIL` áp dụng chi tiết từng phụ thuộc. | | **Trạng thái** | Đã ghi nhận — `ADR-011` chưa viết; phụ thuộc sandbox thật của cả 4 đối tác (chưa có, `CON-04`/`ARISK-03/04`) để kiểm chứng đầy đủ | --- ### ASR-014 — Ranh giới nhóm triển khai (deployment grouping) phải khớp năng lực đội thi công thật (Conway) `[Must]` | | | |---|---| | **Phát biểu** | Việc gom module vào 2–3 nhóm ECS Fargate (thay vì ~10 service độc lập như P1) phải phản ánh đúng số người/kỹ năng đội thi công thật, không chỉ theo giả định "team MVP chuẩn" (`DEC-02`, 🔴 chưa xác nhận) hay đội hình đề xuất của hồ sơ thầu (9 vị trí TB, đỉnh 10). | | **Nguồn** | `DEC-02` (giả định tạm, chưa xác nhận) · `CON-05` (con người, chưa xác nhận số thật) · `OQ-002`/`OQ-010` (còn mở) · `OPT §1`/§4 (tiêu chí 5 "Năng lực team & vận hành") | | **Vì sao định hình kiến trúc** | **Chi phí đổi sau cao** (vẽ lại ranh giới triển khai sau khi team đã quen vận hành theo ranh giới cũ tốn công tái tổ chức CI/CD + on-call) **+ cắt ngang** (ảnh hưởng toàn bộ cách tổ chức code, quyền truy cập, và trách nhiệm vận hành của mọi module) | | **Ép ra cấu trúc gì** | Nhóm "giao dịch" (Cart/Order/Catalog, scale nhanh) tách khỏi nhóm "hỗ trợ" (Seller/Promo/Review/Notify/Shipping) — theo đề xuất `OPT §3` P2; **ranh giới cụ thể này chưa được xác nhận lại ở mức chi tiết ASR khi có số team thật** (xem `ASM-19` mới) | | **Quyết định cần `ADR`** | **Có — `ADR-012`** (dự kiến) — *"Ranh giới nhóm triển khai (deployment boundary) theo domain và năng lực đội"* — khác `ADR-001` (kiểu kiến trúc tổng thể: monolith hay không) ở chỗ đây là quyết định **cụ thể module nào nằm nhóm nào**. Radar ước lượng **~7** (đảo ngược cao=2 · bán kính toàn bộ tổ chức code/vận hành=2 · chạm gián tiếp mọi `QAS` (mở rộng, quan sát được)=1 · ràng buộc ≥1 năm=1 · chưa tranh cãi, nhưng phụ thuộc số liệu chưa xác nhận=1). | | **Trạng thái** | Đã ghi nhận — `ADR-012` chưa viết; **phụ thuộc `OQ-010` (Tech Lead xác nhận đội thật)** trước khi có thể coi ranh giới này là vững | --- ### ASR-015 — Chiến lược đa ngôn ngữ (5 thứ tiếng) phải tách chuỗi hiển thị khỏi code ngay từ đầu `[Should]` | | | |---|---| | **Phát biểu** | Nội dung hiển thị (VI mặc định/EN/ZH/KO/JA) phải được quản lý tách biệt khỏi logic code (resource file/bảng dịch theo locale), để bổ sung ngôn ngữ mới không cần sửa code nghiệp vụ. | | **Nguồn** | `DRV-09` (Should, không chặn MVP) | | **Vì sao định hình kiến trúc** | Chủ yếu **ràng buộc kiến trúc bảo trì dài hạn** — nếu không tách ngay từ đầu, retrofit i18n sau khi đã có hàng trăm màn hình là công việc tốn kém hơn nhiều lần so với làm đúng từ đầu; bán kính rộng (toàn bộ tầng hiển thị FE) nhưng không chạm `QAS` Must nào (chỉ Should) | | **Ép ra cấu trúc gì** | Framework i18n ở tầng FE (tách string ra resource file theo locale); chiến lược lưu trữ nội dung động (VD tên sản phẩm do seller nhập — có cần dịch không, ai dịch — **chưa chốt**, xem `OQ-025` mới) | | **Quyết định cần `ADR`** | **Borderline, không bắt buộc** — radar ước lượng **~5** (đảo ngược trung bình=1 · bán kính rộng nhưng chỉ FE=1 · không chạm `QAS` Must (chỉ Should)=0 · ràng buộc trong khoảng dự án=1 · chưa tranh cãi=0, +2 vì đây là danh mục "Chiến lược đa ngôn ngữ" được `decision-radar.md §3` liệt kê rõ trong nhóm Frontend). Khuyến nghị: nếu Tech Lead không thấy tranh cãi, ghi `DEC-nn` + đưa framework cụ thể vào `AGD` (GĐ3) thay vì mở một `ADR` riêng; nâng lên `ADR-013` nếu phát sinh tranh luận về công nghệ i18n cụ thể. | | **Trạng thái** | Đã ghi nhận — quyết định công cụ cụ thể để hoạt động `sad`/GĐ3 (`AGD`) chốt | --- ## B3. Ma trận `ASR` × `CMP` *Chưa điền — `SAD` (hoạt động 3, kế tiếp) chưa tồn tại nên chưa có `CMP-nn` để đối chiếu. Khung để hoạt động `sad` điền khi có bảng component:* | | `CMP-nn` (điền ở hoạt động `sad`) | |---|---| | `ASR-001…015` | *(chờ `SAD`)* | 🔴 Nhắc cho hoạt động `sad` kế tiếp: mỗi `CMP` phải phục vụ được ít nhất một `ASR` ở trên (cột "cái nó KHÔNG làm" của `SAD` giúp kiểm tra ngược); `ASR-012` (AWS) không sinh ra `CMP` riêng, chỉ là ràng buộc nền cho mọi `CMP`. --- ## C. Đối chiếu với `BR`/`ROLE` của bộ BA | `BR`/`ROLE` (BA) | Nội dung gốc | `ASR` tương ứng | Khớp? | Hành động | |---|---|---|---|---| | `BR-CART-01` | Tách đơn theo seller | `ASR-003` | ✅ | Không lệch — `BR-CART-01` chính là nguồn của `ASR-003`; cơ chế chi tiết vẫn chờ `OQ-011` (BA) | | `BR-CART-02` | Giữ tồn kho khi checkout (chống oversell) | *(không có `ASR` riêng)* | ➖ N/A | Đây là quy tắc nghiệp vụ thuần (điều kiện hành động), không ép cấu trúc kiến trúc riêng — thuộc `SAD`/logic thi công, không phải `ASR` | | `BR-CART-03` | Giới hạn giá trị đơn COD (chưa chốt) | *(không có `ASR`)* | ➖ N/A | Đây là quyết định nghiệp vụ/rủi ro tài chính (PO chọn phương án), không ép cấu trúc kiến trúc — nếu PO chọn phương án (b) "xác thực bổ sung" (OTP), có thể phát sinh `ASR` mới (tích hợp OTP) — chưa xảy ra | | `BR-CART-04` | Điều kiện chọn phương thức thanh toán | Gián tiếp qua `ASR-002`/`ASR-013` | 🟡 Một phần | Không có `ASR` riêng vì bản thân việc "cho chọn 1 trong 3 phương thức" không ép cấu trúc — cấu trúc bị ép là do *mỗi* phương thức cần tích hợp riêng (`ASR-002` Payment, `ASR-013` đối tác ngoài) | | `BR-CART-05` | Không lưu thông tin thẻ | `ASR-002` | ✅ | Khớp hoàn toàn | | `BR-CART-06` | Xác thực webhook thanh toán | `ASR-004` | ✅ | Khớp hoàn toàn | | `BR-CART-07` | Điều kiện tối thiểu Guest checkout | *(không có `ASR`)* | ➖ N/A | Danh sách field bắt buộc là chi tiết UI/validation, không ép cấu trúc kiến trúc | | `ROLE-01` Guest / `ROLE-02` Customer (`RBAC` §1, §2) | 2 vai trò, phạm vi dữ liệu theo `session_id`/`customer_id` | `ASR-007` | ✅ | Khớp — `ASR-007` chính là hoá kỹ thuật của ranh giới "không xem được giỏ/đơn người khác" trong ma trận `RBAC` §2 | | `RBAC` §4 (PII địa chỉ/SĐT chia sẻ cho seller) | Mức che khi hiển thị cho seller — chưa chốt | `ASR-008` | 🟡 Một phần | `ASR-008` bao phủ phần "vùng lưu trữ + data minimization"; phần "mức che hiển thị cụ thể" vẫn chờ Pháp chế/Bảo mật — ghi nhận là chưa tách rời được cho tới khi có người đó | | `RBAC` §8 `OQ-012` (RISK-01 phương án OTP cho Guest giá trị cao) | Guest cần giới hạn/OTP cho đơn giá trị cao? | *(chưa có `ASR` — phụ thuộc `BR-CART-03`)* | ➖ Chờ PO | Nếu PO chọn phương án OTP ở `BR-CART-03`, sẽ phát sinh `ASR` mới (tích hợp OTP) ở lần cập nhật `ASR` tiếp theo | *`BR-nnn` ép ràng buộc kiến trúc ⇒ `ADR` (theo `artifact-map.md §7`) — bảng trên xác nhận 4/7 `BR-CART` có `ASR` tương ứng trực tiếp; 3 còn lại (`BR-CART-02/03/07`) là quy tắc nghiệp vụ thuần không ép cấu trúc, đúng theo tiêu chí B1 (không phải mọi `BR` đều thành `ASR`).* --- ## D. Giả định & Ngoài phạm vi **Giả định** *(tiếp số toàn dự án — `ASM-01…18` đã dùng ở `CTX`/`OPT`/`TCO`/`QAS`, bắt đầu `ASM-19`)*: | ID | Giả định | Cách xác minh | Nếu sai thì `ASR`/`ADR` nào đổi | |---|---|---|---| | `ASM-19` | Ranh giới "nhóm giao dịch" (Cart/Order/Catalog) vs "nhóm hỗ trợ" (Seller/Promo/Review/Notify/Shipping) theo `OPT §3` P2 vẫn là ranh giới đúng ở mức chi tiết `ASR-014`/`ADR-012` | Tech Lead xác nhận lại tại hoạt động `sad`, sau khi có số đội thi công thật (`OQ-010`) | `ASR-014`/`ADR-012` (dự kiến) — nếu team thật nhỏ hơn/khác cơ cấu, phải vẽ lại nhóm (VD gộp thêm module vào 1 nhóm duy nhất) | | `ASM-20` | MFA cho Admin dùng TOTP app (không phụ thuộc thêm nhà cung cấp SMS gateway) làm mặc định đề xuất cho `ASR-009` | Security xác nhận phương thức tại hoạt động `sec` (`OQ-024` mới) | `ASR-009` — nếu cần SMS OTP, phát sinh phụ thuộc nhà cung cấp SMS mới (chi phí + `ASR` phụ thuộc bên ngoài mới) | | `ASM-21` | Nội dung do seller tự nhập (tên sản phẩm, mô tả) **không** cần dịch tự động sang 5 ngôn ngữ ở MVP — chỉ UI hệ thống (nhãn, thông báo) cần i18n theo `ASR-015` | PO xác nhận phạm vi i18n tại hoạt động `sad`/GĐ3 (`OQ-025` mới) | `ASR-015` — nếu seller content cũng cần dịch, cần thêm chiến lược dịch thuật (thủ công/máy) và ảnh hưởng `DAT` (lưu bản dịch) | *`ASM-01…18` của `CTX`/`OPT`/`TCO`/`QAS` vẫn áp dụng nguyên trạng — không lặp lại nội dung, chỉ tham chiếu (đặc biệt `ASM-04`→`ASR-008`, `ASM-07`→`ASR-005`, `ASM-08`→`ASR-006`).* **Ngoài phạm vi:** - `SAD`/`ADR`/`ICD`/`DAT`/`SEC`/`INF`/`FAIL` — chưa thực hiện ở lượt chạy này (chỉ hoạt động `asr`). Mọi "`ADR` ứng viên" ở §B2 là **đề xuất số thứ tự**, chưa phải file `ADR` thật — hoạt động `adr` kế tiếp xác nhận lại số thật theo thứ tự viết, không nhất thiết khớp số đề xuất ở đây. - Ma trận `ASR` × `CMP` (§B3) — để trống, chờ `SAD`. - `BR-CART-02/03/07` không có `ASR` tương ứng (xem §C) — đây là quyết định nghiệp vụ thuần, đúng theo tiêu chí B1, không phải bỏ sót. - `ASR` mới có thể phát sinh nếu PO chọn phương án OTP cho `BR-CART-03` (xem §C, dòng cuối) — chưa xảy ra ở lượt này. ## E. Open Questions *Tiếp số sổ SA (`00-index/OQ_e-commerce.md` đang ở `OQ-023`) — bắt đầu `OQ-024`.* | ID | Câu hỏi | Hỏi ai | Từ ngày | Chặn gì | Hệ quả nếu trả lời ngược | |---|---|---|---|---|---| | `OQ-024` | Phương thức MFA cho Admin là gì — TOTP app (Google Authenticator/Authy), SMS OTP, hay khoá bảo mật cứng? | Tech Lead + Security | 2026-09-14 | `ASR-009`; thiết kế `SEC` (mô hình xác thực) | Nếu chọn SMS OTP: phát sinh phụ thuộc nhà cung cấp SMS gateway mới (chi phí + `ARISK` phụ thuộc ngoài mới, tương tự `ARISK-10`); nếu chọn TOTP app: không phát sinh chi phí vận hành thêm nhưng cần hướng dẫn user cài app | | `OQ-025` | Nội dung do seller tự nhập (tên/mô tả sản phẩm) có cần dịch sang 5 ngôn ngữ ở MVP không, hay chỉ UI hệ thống cần i18n? Nếu cần dịch, ai cung cấp bản dịch (dịch máy tự động hay seller tự nhập đa ngôn ngữ)? | PO + Tech Lead | 2026-09-14 | `ASR-015`; `DAT` (có cần lưu bản dịch theo locale không) | Nếu cần dịch nội dung seller: `DAT` phải thêm mô hình lưu trữ đa ngôn ngữ cho `Product`/`ProductVariant` (ngoài phạm vi module Giỏ hàng & Checkout hiện tại), tăng effort đáng kể so với chỉ dịch UI tĩnh | **Nhắc:** cộng với các `OQ` còn mở ảnh hưởng trực tiếp `ASR` ở tài liệu này — `OQ-002`/`OQ-010` (team thật, chặn `ASR-001`/`ASR-014`), `OQ-007` (đại diện Pháp chế, chặn `ASR-008`), `OQ-011` (BA, cơ chế tách đơn, chặn `ASR-003`), `OQ-012` (thời điểm `POC-01`, chặn `ASR-001`/`ASR-005`), `OQ-018…023` (số `QAS` nguồn của nhiều `ASR`) — xem sổ đầy đủ `00-index/OQ_e-commerce.md`. --- ## Tự chấm ### ① Bảng tự chấm Gate AG2 *(`workflow.md §2` — chỉ dòng liên quan tới `ASR`, tự chấm sớm)* | # | Tiêu chí | ☐/✅ | Ghi chú | |---|---|---|---| | 1 | `ASR` liệt kê yêu cầu thực sự định hình kiến trúc, mỗi cái truy về `DRV` hoặc `QAS` | ✅ | 15 `ASR`, mỗi cái có cột "Nguồn" trỏ về `DRV`/`CON`/`QAS`/`BR`/`ROLE` cụ thể, không có `ASR` "mồ côi" nguồn | | — | `QAS` — mọi NFR đã lượng hoá | ✅ *(đã đạt ở hoạt động `qas` trước)* | Xem `QAS_e-commerce_v1.0.md`, không lặp lại ở đây | | — | `SAD` có sơ đồ C4 | ☐ | **Chưa tới** — hoạt động 3, kế tiếp | | 2 | `ADR-nnn` tồn tại cho mọi quyết định đạt ngưỡng radar | ☐ | **Chưa viết `ADR` nào** — đúng theo yêu cầu điều phối "không viết ADR ở lượt này"; §B2 đã liệt kê đủ 12/15 ứng viên `ADR` (radar 6–9) để hoạt động `adr` kế tiếp không phải dò lại từ đầu | | — | `ICD`/`DAT`/`SEC`/`INF`/`FAIL` | ☐ | Chưa tới — hoạt động 4–8 | | — | `sa-conformance` báo coverage `ASR → ADR/CMP` ≥ 100% | ☐ | **0/15** — kỳ vọng đúng lúc này (đã ghi nhận là "🟠 Nợ" trong `DTM`/`ADL` từ trước khi file này tồn tại), sẽ chặn AG2 thật nếu vẫn 0/15 khi hoạt động `adr`/`sad` đã chạy xong | **Kết luận tự chấm (riêng phần `ASR`):** Hoạt động `asr` hoàn tất đúng phạm vi được giao — 15 `ASR` có nguồn, có "vì sao định hình kiến trúc", có `ADR` ứng viên (hoặc lý do không cần). AG2 **còn xa** vì 7/9 hoạt động khác của GĐ2 chưa chạy — đây là tiến độ kỳ vọng, không phải lỗi. ### ② Checklist D1–D12 *(`design-rules.md`)* | # | Mục | ☐/✅ | Ghi chú | |---|---|---|---| | D1 | Một ADR một quyết định | N/A | Tài liệu này không viết `ADR` — chỉ liệt kê ứng viên; mỗi ứng viên đã được tách theo đúng nguyên tắc một quyết định (VD `ADR-001` kiểu kiến trúc tổng thể tách khỏi `ADR-012` ranh giới nhóm triển khai cụ thể, dù liên quan) | | D2 | Không NFR định tính; đủ 4 câu | N/A | `ASR` không phải `QAS` — không áp dụng trực tiếp; mọi `ASR` tham chiếu đúng `QAS` đã lượng hoá ở hoạt động trước, không tự đặt số mới | | D3 | Nêu phương án bị loại + lý do gắn `CON`/`QAS` | ✅ *(kế thừa)* | `ASR-001` tham chiếu `OPT §5` (P1/P3/P4 đã loại) làm nền; không lặp lại nội dung, chỉ dẫn | | D4 | Sơ đồ khai báo mức + legend | N/A | Không có sơ đồ mới trong tài liệu này | | D5 | Interface có chủ/contract | N/A | Chưa tới `ICD` | | D6 | Phụ thuộc ngoài process có timeout/retry | 🟡 Một phần | `ASR-004`/`ASR-013` đã nêu yêu cầu (idempotent, timeout/retry) nhưng chi tiết đầy đủ 4 câu hỏi D6 thuộc hoạt động `fail` kế tiếp | | D7 | Một chủ sở hữu dữ liệu | 🟡 Một phần | `ASR-006` xác nhận 1 RDS chính là chủ cho các module ngoài Payment, `ASR-002` xác nhận Payment có DB riêng — chi tiết từng thực thể để `DAT` | | D8 | Ràng buộc có FIT hoặc nhãn khuyến nghị | N/A | Chưa tới `AGD`/`FIT` (GĐ3) | | D9 | Con số hạ tầng quy ra tiền + nguồn | N/A | `ASR` không thêm con số hạ tầng mới — kế thừa `TCO`/`ARISK` | | D10 | Không quyết định thay người có thẩm quyền | ✅ | `ASR-008` ghi rõ phủ quyết thuộc Security/Legal; `ASR-002` ghi Security cần ký; mọi chỗ chưa rõ đều có `OQ` kèm hệ quả phương án ngược (§E, và trong từng khối ASR) | | D11 | Có mục "Ngoài phạm vi" + `ASM-nn` | ✅ | §D đầy đủ — `ASM-19…21` mới, có cách xác minh/hệ quả; mục "Ngoài phạm vi" liệt kê rõ những gì chưa làm | | D12 | Câu quy định thẩm quyền sơ đồ vs văn bản | ✅ | Có ngay sau Change Log | ### ③ Bảng đối chiếu với bộ BA Xem Phần C ở trên (`BR`/`ROLE` × `ASR`) — 4/7 `BR-CART` có `ASR` tương ứng trực tiếp; 3 còn lại xác nhận đúng là không ép cấu trúc (không phải bỏ sót). Không có hành động "BA cập nhật SRS" nào cần thiết ở lượt này vì không phát hiện lệch nội dung, chỉ có 1 dòng chờ quyết định PO (`BR-CART-03`) có thể sinh `ASR` mới sau. ### ④ Danh sách `OQ` mở kèm người phải trả lời, chặn gì Xem §E (mới: `OQ-024`, `OQ-025`) cộng các `OQ` còn mở từ `CTX`/`OPT`/`ARISK`/`QAS` (`OQ-002/004/005/006/007/008/010/012/013…023`) — sổ đầy đủ tại `00-index/OQ_e-commerce.md`. Ba câu quan trọng nhất cho tiến độ `ASR`→`ADR`/`SAD` kế tiếp: **`OQ-010`** (team thật — chặn `ASR-001`/`ASR-014`), **`OQ-012`** (thời điểm `POC-01` — chặn `ASR-001`/`ASR-005`), **`OQ-007`** (đại diện Pháp chế — chặn `ASR-008`). **Nhắc:** AG2 cần **Tech Lead + Security + Ops/SRE ký** — còn xa vì `SAD`/`ADR`/`ICD`/`DAT`/`SEC`/ `INF`/`FAIL` chưa chạy. Hoạt động kế tiếp bắt buộc là **`sad`** (hoạt động 3, theo đúng thứ tự 1→2→3 của `SKILL.md`), dùng chính 15 `ASR` ở tài liệu này làm đầu vào để phân rã component và vẽ C4; `ADR-001` (kiểu kiến trúc tổng thể) nên được viết ngay khi `sad`/`adr` bắt đầu, theo đúng cảnh báo đã có từ `DTM §11`/`ADL §8`.