# Hướng dẫn sử dụng — `ba-3-specification` (Giai đoạn 3) ## Giai đoạn này giải quyết gì Đầu vào là `BACKLOG` đã qua G2. Đầu ra là tài liệu mà **dev code được không phải đoán** và **QA test được không phải hỏi**. Đây là sản phẩm chính của nghề BA, và là gate nghiêm nhất. Một chỗ mơ hồ lọt qua G3 sẽ thành bug hoặc CR — đắt hơn nhiều so với việc hỏi cho rõ ở đây. **Không làm ở giai đoạn này:** quyết kiến trúc, chọn thư viện, viết test case chi tiết (QA làm từ AC), ước lượng công sức. ## Khi nào gọi | Tình huống | Có nên gọi | |---|---| | US đã qua G2, cần viết spec cho dev | ✅ Chạy đầy đủ | | Dev hỏi "field này bao nhiêu ký tự" liên tục | ✅ Bảng field đang thiếu — chạy Bước 3 | | QA bảo "AC này không test được" | ✅ Chạy Bước 4 để viết lại AC | | Cần bảng mã lỗi thống nhất cho module | ✅ Chạy Bước 5 | | Chỉ cần NFR hoặc chỉ cần API contract | ✅ Dùng `--only nfr` / `--only api` | | Backlog chưa chốt, PO còn đang đổi ý | ❌ Quay lại GĐ2 — viết SRS bây giờ là viết để vứt | ## PART 2 thay đổi theo loại sản phẩm 🔴 **Điểm khác biệt lớn nhất của giai đoạn này.** PART 1 và PART 3–8 của SRS dùng chung cho mọi loại; **PART 2 được nạp từ biến thể** theo `PRODUCT` trong profile: | `PRODUCT` | PART 2 mô tả gì | Tiêu chí G3 riêng | |---|---|---| | `screen` | Màn hình, bảng thành phần, bảng field 10 cột | Hai trạng thái rỗng khác nhau; mọi thành phần có điều kiện ẩn/khoá | | `api-service` | Người tiêu thụ, khả năng, hợp đồng dữ liệu | Idempotency · tương thích ngược · phân trang đã chốt | | `data-pipeline` | Luồng, data contract, chất lượng | **Có mục đối soát nguồn–đích**; chạy lại/backfill/đến muộn đã trả lời | | `ml-model` | Bài toán, nhãn, metric + ngưỡng | Tập test cách ly; mọi ngưỡng truy về chi phí nghiệp vụ; có fallback | | `batch-job` | Job, lịch, idempotency | Idempotency và thất bại giữa chừng đã trả lời; có cảnh báo "job không chạy" | | `process-only` | — | Không có PART 2 | **Một US thường có nhiều loại** (màn hình + API, hoặc màn hình + job đêm) ⇒ skill nạp nhiều biến thể, mỗi cái một mục con `2.A`, `2.B`, `2.C`. **Loại chưa có biến thể** (nhúng/IoT/firmware): skill sẽ **nói thẳng** là PART 2 phải tự viết và đề xuất khung dựa trên biến thể gần nhất — không im lặng nhét vào biến thể sai. ## Cú pháp ``` /ba-3-specification [--product ] [--only srs|ac|nfr|api] [--lang vi,en,ko] [--out ] [go] ``` | Tham số | Ý nghĩa | |---|---| | `` | Một hoặc vài US. **Quá 3 US một lần thì chất lượng giảm rõ rệt** | | `--product` | Ghi đè `PRODUCT` của profile cho lần chạy này. Nhiều loại: `--product screen,api-service` | | `--only` | Chỉ sinh một loại tài liệu | | `--lang` | Ngôn ngữ text hiển thị. Bỏ qua nếu `PRODUCT` không có giao diện | | `go` | Bỏ bước dừng xác nhận input | Ví dụ: ``` /ba-3-specification US011 /ba-3-specification US011 US012 --lang vi,ko /ba-3-specification US011 --only api ``` ## Chuẩn bị gì trước khi gọi **Bắt buộc:** - `BACKLOG` chứa US cần đặc tả - `BR` — quy tắc nghiệp vụ đã chốt - `RBAC` — ma trận phân quyền **Rất nên có:** - Quy ước UI của dự án (nếu có) — để khỏi tự phát minh lại - Danh sách mã lỗi đã dùng — để tiếp số, không mở dãy mới - Glossary — để dùng đúng thuật ngữ - Wireframe/prototype nếu đã có **Nếu dự án có sẵn guideline** (như `GLOBAL_UI_CONVENTION.md`, `GLOBAL_NFR.md` của Berriz), nói rõ đường dẫn khi gọi. Skill sẽ tuân thủ thay vì tự định nghĩa. ## Quy trình 7 bước — bạn tham gia ở đâu | Bước | Skill làm | Bạn làm | |---|---|---| | 1. Khung + tóm tắt | Dựng khung đủ mục, viết tóm tắt cho PO | Duyệt phần tóm tắt | | 2. Chọn & nạp biến thể PART 2 | Xác định `PRODUCT`, nạp biến thể, nêu tiêu chí G3 riêng | Xác nhận loại sản phẩm | | 3. Điền biến thể | Dựng bảng ràng buộc, đánh dấu chỗ thiếu | **Đi hỏi** giới hạn, mặc định, nguồn giá trị | | 4. AC | Viết 4 nhóm, sinh bảng dữ liệu biên | Đưa QA review sớm | | 5. Mã lỗi & text | Sinh bảng, đòi nguyên văn từng chuỗi | Chốt giọng văn với PO/thiết kế | | 6. NFR | Rà 7 nhóm, đòi số đo + cách verify | Hỏi người dùng ngưỡng chấp nhận được | | 7. API contract | Đề xuất contract, đánh dấu điểm cần BE chốt | Gửi BE xác nhận | 🔴 **Bước 3 và Bước 5 là hai bước cần bạn đi hỏi nhiều nhất.** Skill sẽ liệt kê chính xác những gì còn thiếu dưới dạng `OQ` — đó là danh sách việc của bạn. ## Bạn sẽ nhận được gì ``` ba-output//03-specification/ ├── SRS__v1.0.md ← tài liệu chính ├── AC__v1.0.md ← nếu tách riêng ├── NFR__v1.0.md └── API__v1.0.md ``` Cộng năm bảng in ra màn hình: truy vết US→AC→BR→field→mã lỗi · tự chấm G3 · checklist W1–W13 (có chạy lệnh quét thật) · danh sách `TBD` còn lại · `OQ` mở. **Danh sách `TBD` là thứ đáng nhìn nhất.** Còn `TBD` trong bảng field hoặc bảng mã lỗi thì G3 không pass được — skill sẽ nói thẳng điều đó thay vì để bạn phát hiện ở buổi họp duyệt. ## Ví dụ hội thoại ``` Bạn: /ba-3-specification US011 Claude: [Bước 0] Input: | BACKLOG_Settlement_v1.0.md | US-011 định nghĩa | ✅ Baselined | | BR_Settlement_v1.0.md | BR-021, BR-022 | ✅ Baselined | | RBAC_Settlement_v1.0.md | 4 vai trò | ✅ Baselined | | Wireframe | Không tìm thấy | — | G2: đã qua (PO 2026-08-28, Tech Lead 2026-08-29). ✅ Guideline dự án tôi tìm thấy: - Chưa thấy quy ước UI hay bộ mã lỗi. Tôi sẽ mở dãy E-STL-0001, cần bạn xác nhận không trùng với module khác. Ngôn ngữ hiển thị: bạn muốn VI, hay VI+KO? Bạn: VI+KO. Mã lỗi thì dùng dãy E-STL, chưa ai dùng. Claude: [sinh SRS, in danh sách TBD] ⚠️ Còn 6 TBD chặn G3: - F01 độ dài mã cửa hàng — chưa ai chốt (OQ-021, hỏi chị Lan) - F04 nguồn dropdown "Loại" — lấy từ API nào? (OQ-022, hỏi anh Huy) - Múi giờ hiển thị createdAt (OQ-023) - 3 thông điệp lỗi chưa có bản KO ``` ## Lỗi thường gặp **"Skill để trống nhiều ô quá, tôi điền đại được không?"** Không. Bịa một giá trị nghe hợp lý (255 ký tự, timeout 30s, giữ log 90 ngày) là cách phổ biến nhất tạo bug — vì nghe hợp lý nên không ai chất vấn, và sai thì phát hiện rất muộn. Mỗi ô trống là một `OQ` có người chịu trách nhiệm trả lời. **"AC của tôi chỉ có luồng thành công, vậy đủ chưa?"** Chưa. Bốn nhóm là bắt buộc: thành công · validation · lỗi hệ thống · phân quyền. Nhóm "lỗi hệ thống" phải có AC *"lưu thất bại thì dữ liệu đã nhập được giữ nguyên"* — AC bị quên nhiều nhất và gây bực bội nhất. **"Hành vi tôi mô tả trong wireframe rồi, khỏi ghi lại nhé?"** Không được (quy tắc W11). Ảnh nói bố cục, bảng nói hành vi. Viết "xem hình" ở cột hành vi là chưa đặc tả — và ảnh thì không grep được, không diff được, không dịch được. **"Field này giống US trước, tôi copy sang."** Copy được, nhưng phải rà lại từng cột. Độ dài, default và thông điệp là ba thứ hay bị mang theo sai nhất. Mỗi field phải truy về một `BR` hoặc một câu trả lời cụ thể. **"Đặc tả 8 US một lượt cho nhanh."** Quá 3 US thì các bảng bắt đầu sơ sài, và mâu thuẫn chéo giữa các US không ai phát hiện. Chia nhỏ, làm kỹ. **"NFR thì copy bộ chuẩn công ty vào là xong."** Copy cả bộ làm loãng và không ai kiểm. Chỉ giữ cái áp dụng cho US này, mỗi cái phải có số đo + điều kiện đo + cách verify. **"API contract tôi tự viết, dev cứ thế code."** Phải ghi rõ `⚠️ BA đề xuất — chờ BE xác nhận` ở đầu file, và liệt kê điểm cần BE chốt. Contract BA đề xuất là **giả định**, không phải sự thật. ## Ra khỏi giai đoạn này khi nào Đủ cả năm: 1. Không còn `TBD` trong bảng ràng buộc của PART 2 và bảng mã lỗi 2. Không còn `OQ` mở ảnh hưởng tới hành vi hệ thống 3. Bảng tự chấm G3 toàn ✅ — **gồm cả tiêu chí riêng của biến thể PART 2 đã nạp** 4. **QA xác nhận mọi AC đều test được** — chữ ký hay bị bỏ qua nhất *(bỏ được ở `RIGOR = light`)* 5. Đã ký đủ theo `RIGOR`: `light` chỉ PO · `standard` PO + Tech Lead + QA · `strict` thêm Bảo mật/Pháp chế, và API **phải do BE xác nhận** Rồi bàn giao cho dev và chuyển sang `/ba-4-delivery-support`. ## Liên quan - Chọn `PRODUCT`: `../ba-lifecycle/references/domain-profiles.md` §1 - Tiêu chí gate G3 + bảng bớt/thêm theo `RIGOR`: `../ba-lifecycle/references/workflow.md` §2 - Quy tắc viết W1–W13: `../ba-lifecycle/references/writing-rules.md` - Ví dụ ở nhiều domain và nhiều `PRODUCT`: `examples.md` - Template: `templates/srs.md` · `templates/srs-part2/.md` · `templates/acceptance-criteria.md` · `templates/nfr-checklist.md` · `templates/api-contract.md`