This commit is contained in:
Leonard-ThindPad-P50
2026-09-08 10:26:21 +07:00
commit c81f249920
169 changed files with 38726 additions and 0 deletions

View File

@@ -0,0 +1,141 @@
# Bản đồ artifact
## 1. Toàn bộ artifact, ai sinh, ai tiêu thụ
| Mã | Tên đầy đủ | Thư mục | Sinh bởi | Tiêu thụ bởi |
|---|---|---|---|---|
| `BRIEF` | Project Brief | `01-discovery/` | ba-1 | PO, toàn team |
| `STAKEHOLDER` | Stakeholder Map & Analysis | `01-discovery/` | ba-1 | BA, PM |
| `ELICITATION` | Biên bản khai thác yêu cầu | `01-discovery/` | ba-1 | ba-2 |
| `RISK` | Sổ rủi ro & giả định | `01-discovery/` | ba-1 | PM, ba-5 |
| `PROCESS` | Quy trình AS-IS / TO-BE | `02-analysis/` | ba-2 | Dev, QA, ba-5 |
| `BACKLOG` | Feature list & User story backlog | `02-analysis/` | ba-2 | PO, ba-3 |
| `BR` | Business Rules | `02-analysis/` | ba-2 | ba-3, Dev, QA |
| `RBAC` | Ma trận phân quyền | `02-analysis/` | ba-2 | ba-3, Dev, Security |
| `IMPACT` | Phân tích tác động | `02-analysis/` | ba-2 | Tech Lead, QA |
| `SRS` | Software Requirements Specification | `03-specification/` | ba-3 | Dev, QA |
| `AC` | Acceptance Criteria (nếu tách khỏi SRS) | `03-specification/` | ba-3 | QA |
| `API` | API contract đề xuất | `03-specification/` | ba-3 | Dev BE/FE |
| `NFR` | Yêu cầu phi chức năng | `03-specification/` | ba-3 | Dev, Ops, QA |
| `WF` | Wireframe / Prototype | `03-specification/` | ba-3 | Dev, PO |
| `QLOG` | Clarification log | `04-delivery/` | ba-4 | Dev, QA |
| `CR` | Change Request | `04-delivery/` | ba-4 | PO, PM, Dev |
| `TCREVIEW` | Biên bản review test case | `04-delivery/` | ba-4 | QA |
| `UAT` | Kế hoạch & kết quả UAT | `04-delivery/` | ba-4 | PO |
| `RELNOTE` | Release note nghiệp vụ | `05-post-release/` | ba-5 | Người dùng |
| `MANUAL` | Tài liệu hướng dẫn sử dụng | `05-post-release/` | ba-5 | Người dùng, CS |
| `BENEFIT` | Benefit realization review | `05-post-release/` | ba-5 | PO, BA Lead |
| `RTM` | Requirements Traceability Matrix | `00-index/` | ba-traceability | Mọi vai trò |
| `GLOSSARY` | Từ điển thuật ngữ | `00-index/` | ba-1, bồi đắp dần | Mọi vai trò |
| `DECISION` | Sổ quyết định (`DEC-nn`) | `00-index/` | mọi skill | Mọi vai trò |
| `OQ` | Sổ open question | `00-index/` | mọi skill | Mọi vai trò |
| `INDEX` | Mục lục dự án | `00-index/` | ba-lifecycle | Mọi vai trò |
## 2. Header bắt buộc của mọi artifact
Mọi file `.md` sinh ra phải mở đầu bằng khối này. Thiếu một dòng ⇒ gate không chấm được.
```markdown
# <LOẠI> — <Tên phạm vi>
| | |
|---|---|
| **Version** | 1.0 |
| **Date** | 2026-08-30 |
| **Author** | <tên BA> (qua skill ba-3-specification) |
| **Status** | 🟡 Draft / 🟠 In Review / 🔵 Approved / ✅ Baselined / 📦 Archived |
| **Approved by** | — *(điền tên + ngày khi được ký)* |
| **Source** | <danh sách file input đã dùng, mỗi cái một dòng> |
| **Scope** | <module / US id> |
## Change Log
| Version | Date | Người sửa | Thay đổi | CR |
|---|---|---|---|---|
| 1.0 | 2026-08-30 | … | Bản đầu | — |
```
**Ý nghĩa `Status`** — đây là thứ gate đọc, không phải tên file:
| Status | Nghĩa | Ai được sửa file |
|---|---|---|
| 🟡 Draft | BA đang viết | BA tự do |
| 🟠 In Review | Đã gửi duyệt | BA sửa theo comment |
| 🔵 Approved | Người duyệt đã đồng ý nội dung | BA sửa, ghi Change Log |
| ✅ Baselined | Đã qua gate, là nguồn sự thật | **Chỉ sửa qua `CR-nnn`** |
| 📦 Archived | Đã bị thay bằng version mới | Không sửa |
## 3. Quy tắc version
| Thay đổi | Tăng |
|---|---|
| Sửa lỗi chính tả, làm rõ câu chữ, không đổi nghĩa | `+0.1` |
| Thêm/sửa nội dung nghiệp vụ, thêm AC, sửa rule | `+0.1` |
| Tái cấu trúc tài liệu, đổi phạm vi, gộp/tách US | `+1.0` |
| Qua gate lần đầu | đặt `1.0`, Status `✅ Baselined` |
File đạt `✅ Baselined` mà cần sửa: tạo version mới, **chuyển bản cũ vào `archive/`** cùng
thư mục, Status bản cũ đổi thành `📦 Archived`. Không xoá file.
## 4. Mẫu `INDEX_<PROJECT>.md`
```markdown
# INDEX — <PROJECT>
| | |
|---|---|
| **Cập nhật** | 2026-08-30 |
| **Giai đoạn hiện tại** | GĐ2 · Analysis |
| **Gate gần nhất đã qua** | G1 (2026-08-20, ký bởi …) |
## Artifact
| Loại | File mới nhất | Version | Status | Cập nhật |
|---|---|---|---|---|
| BRIEF | `01-discovery/BRIEF_<...>_v1.0.md` | 1.0 | ✅ | 2026-08-20 |
## Open Question đang mở
| ID | Nội dung | Hỏi ai | Từ ngày | Chặn gì |
|---|---|---|---|---|
## Quyết định đã chốt
| ID | Quyết định | Người quyết | Ngày | Ảnh hưởng |
|---|---|---|---|---|
```
`INDEX` do `ba-lifecycle` cập nhật mỗi lần chạy. Các skill giai đoạn **không sửa INDEX** —
chúng chỉ ghi artifact của mình rồi báo cho người dùng chạy `/ba-lifecycle` để đồng bộ.
## 5. Quan hệ phụ thuộc
Mũi tên = "cần cái kia mới viết đúng được". Thiếu input ⇒ vẫn làm, nhưng phải ghi `OQ` và
nêu rõ trong Source là đã dùng nguồn thay thế nào.
```mermaid
flowchart LR
STK["STAKEHOLDER"] --> BRIEF["BRIEF"]
ELI["ELICITATION"] --> BRIEF
BRIEF --> RISK["RISK"]
BRIEF --> BACKLOG["BACKLOG"]
PROCESS["PROCESS"] --> BACKLOG
BACKLOG --> BR["BR"]
BACKLOG --> RBAC["RBAC"]
IMPACT["IMPACT"] --> SRS["SRS"]
BR --> SRS
RBAC --> SRS
SRS --> AC["AC"]
SRS --> API["API"]
SRS --> NFR["NFR"]
SRS --> WF["WF"]
AC --> UAT["UAT"]
UAT --> BENEFIT["BENEFIT"]
UAT --> RELNOTE["RELNOTE"]
UAT --> MANUAL["MANUAL"]
```
**RTM đọc:** `BRIEF`(RQ) · `BACKLOG`(US) · `SRS`+`AC`(AC, field, mã lỗi) · `UAT`(test case) · `CR`
Đọc xuôi mũi tên để biết **sửa cái này thì phải sửa tiếp cái nào**. Ví dụ sửa một `BR` ⇒
phải rà lại `SRS`, `AC`, test case, và cập nhật `RTM`.

View File

@@ -0,0 +1,275 @@
# Quy tắc vẽ sơ đồ trong tài liệu BA
Mọi sơ đồ trong bộ skill này viết bằng **mermaid**, không dùng ASCII art.
Lý do không phải thẩm mỹ:
| ASCII art | mermaid |
|---|---|
| Dán vào Confluence/PowerPoint là vỡ, phải vẽ lại tay | GitHub · GitLab · Confluence · Artifact của Claude Code render thẳng |
| `git diff` ra một khối rác | Diff theo dòng, review được từng cạnh |
| Ký hiệu tự chế, khách quen UML/BPMN đọc lệch | Ký hiệu chuẩn của từng loại sơ đồ |
| Sửa một node phải căn lại cả hình | Sửa một dòng |
---
## W13 — Mỗi sơ đồ phải có bảng đi kèm
🔴 **Quy tắc quan trọng nhất của file này.**
**Sơ đồ để nhìn, bảng để truy vết và test.** Sơ đồ không diễn đạt được: điều kiện chính xác,
ai được làm, mã lỗi nào, quy tắc nào chi phối, ai chịu trách nhiệm. Một sơ đồ đứng một mình
là một bức tranh đẹp mà QA không viết được test case từ đó.
| Sơ đồ | Bảng bắt buộc đi kèm |
|---|---|
| Quy trình AS-IS/TO-BE | Bảng chi tiết từng bước: ai · input · output · công cụ · thời gian |
| Vòng đời trạng thái | Bảng chuyển: nguồn · sự kiện · **điều kiện** · đích · ai được làm · BR · ghi vết |
| Use case | Bảng US: id · vai trò · RQ · MoSCoW |
| ERD | Bảng thực thể: trường · kiểu · khoá · ràng buộc |
| Sequence | Bảng bước: mã lỗi mỗi nhánh · timeout · hành vi khi thất bại |
| Lineage / phụ thuộc | Bảng luồng: tần suất · khối lượng · SLA · chủ sở hữu |
Khi sơ đồ và bảng mâu thuẫn: **bảng thắng**. Ghi câu này vào tài liệu (quy tắc W11).
---
## Chọn loại sơ đồ
| Cần thể hiện | Dùng | Ở đâu trong bộ skill |
|---|---|---|
| Quy trình có rẽ nhánh | `flowchart TD` | `PROCESS` A1/B1 |
| Vòng đời trạng thái | `stateDiagram-v2` | `BR` §3 |
| Actor × chức năng, toàn cảnh phạm vi | `flowchart LR` + `subgraph` | `BACKLOG` §0 |
| Thực thể và quan hệ | `erDiagram` | `BR` §4 |
| Luồng nhiều bên theo thời gian | `sequenceDiagram` | `srs-part2/*` |
| Luồng dữ liệu, phụ thuộc job | `flowchart LR` | `srs-part2/data-pipeline`, `batch-job` |
| Điều hướng màn hình | `flowchart LR` | `srs-part2/screen` |
| Ma trận 2×2 | `quadrantChart` | `STAKEHOLDER` §2 |
| Ma trận 3×3 trở lên | **bảng markdown** — mermaid không có loại này | `RISK` §2 |
| Ranh giới hệ thống | `flowchart LR` + `subgraph` | `BRIEF` §5.3 |
**Không dùng** `gantt` (tiến độ là việc của PM, không phải BA) và `pie` (một bảng luôn rõ hơn).
---
## Quy ước bắt buộc
### 1. ID node không dấu, nhãn có dấu
Ký tự tiếng Việt trong **ID** làm vỡ ở một số renderer. Luôn tách ID và nhãn:
```
✅ A1["Nhận file POS từ cửa hàng"]
❌ Nhận file POS
```
Với `stateDiagram-v2` dùng dạng khai báo riêng:
```
state "Chờ duyệt" as ChoDuyet
```
### 2. ID mang mã truy vết
Node ID chính là ID trong bảng — đó là thứ nối sơ đồ với bảng (W13):
```
A3["A3. Đối chiếu thủ công"] ← khớp cột # của bảng chi tiết bước
UC11(["US-011 Tải file POS"]) ← khớp id trong BACKLOG
SCR01["SCR-01 Danh sách"] ← khớp id trong bảng màn hình
```
### 3. Không tô màu, không style
Renderer đổi theme sáng/tối; màu cứng làm chữ biến mất. Phân biệt bằng **hình dạng** và
**nhãn**, không bằng màu:
| Ý nghĩa | Hình dạng |
|---|---|
| Bước xử lý | `A["..."]` chữ nhật |
| Điểm quyết định | `A{"..."}` thoi |
| Bắt đầu / kết thúc | `A(["..."])` bo tròn |
| Dữ liệu / tài liệu | `A[("...")]` trụ |
| Hệ thống ngoài phạm vi | `A[["..."]]` khung đôi |
Đánh dấu đặc biệt bằng **tiền tố trong nhãn**, không bằng màu:
`"⚠️ P1 · Đối chiếu thủ công"` · `"🆕 B2 · ..."` · `"➖ A5 · (bỏ)"`
### 4. Hướng vẽ
`TD` (trên xuống) cho quy trình có nhiều rẽ nhánh · `LR` (trái sang phải) cho luồng tuyến
tính, lineage, điều hướng, use case. Sơ đồ quá 20 node ⇒ **tách thành nhiều sơ đồ**, đừng
thu nhỏ chữ.
### 5. Nhãn cạnh là điều kiện, không phải mô tả
```
✅ ChoDuyet --> DaDuyet: duyệt (chênh lệch ≤ 10tr)
❌ ChoDuyet --> DaDuyet: chuyển sang trạng thái đã duyệt
```
Điều kiện đầy đủ vẫn nằm ở bảng — nhãn cạnh chỉ là gợi nhớ.
---
## Mẫu chuẩn — sao chép rồi sửa
### Quy trình
````markdown
```mermaid
flowchart TD
START(["Đơn hàng phát sinh"]) --> A1["A1. Ghi nhận vào POS"]
A1 --> A2["A2. Xuất file cuối ca"]
A2 --> D1{"Có sai lệch?"}
D1 -->|Không| END(["Kết thúc"])
D1 -->|Có| A3["⚠️ P1 · A3. Đối chiếu thủ công"]
A3 --> EXT[["Gọi điện xác nhận với cửa hàng"]]
EXT --> A2
```
````
### Vòng đời trạng thái
````markdown
```mermaid
stateDiagram-v2
state "Nháp" as Nhap
state "Chờ duyệt" as ChoDuyet
state "Đã duyệt" as DaDuyet
state "Đã đóng" as DaDong
[*] --> Nhap
Nhap --> ChoDuyet: gửi duyệt (đủ trường bắt buộc)
ChoDuyet --> DaDuyet: duyệt
ChoDuyet --> Nhap: từ chối
DaDuyet --> DaDong: đóng (có ghi chú lý do)
DaDong --> [*]
```
````
Kèm bảng chuyển trạng thái đầy đủ, **và bảng "chuyển trạng thái KHÔNG được phép"** — sơ đồ
chỉ vẽ được cạnh có tồn tại, không vẽ được cạnh bị cấm.
### Use case
Mermaid không có use case diagram; dùng `flowchart LR` với `subgraph` làm ranh giới hệ thống:
````markdown
```mermaid
flowchart LR
NV(["👤 Nhân viên đối soát"])
TN(["👤 Trưởng nhóm"])
KT(["👤 Kế toán"])
subgraph HT["Hệ thống đối soát"]
UC11(["US-011 Tải file POS"])
UC13(["US-013 Xem chênh lệch"])
UC14(["US-014 Đóng chênh lệch"])
end
NV --- UC11
NV --- UC13
TN --- UC13
TN --- UC14
KT --- UC13
```
````
Dùng `---` (không mũi tên): quan hệ actor–use case là **liên kết**, không phải luồng.
### ERD khái niệm
Tên thực thể **không dấu, viết hoa**; tên tiếng Việt để ở bảng đi kèm.
````markdown
```mermaid
erDiagram
CUA_HANG ||--o{ GIAO_DICH : "phát sinh"
GIAO_DICH ||--o| CHENH_LECH : "sinh ra khi lệch"
NGUOI_DUNG ||--o{ CHENH_LECH : "xử lý"
CUA_HANG {
string ma_cua_hang PK "3-20 ký tự"
string ten
enum trang_thai
}
CHENH_LECH {
bigint id PK
bigint giao_dich_id FK
decimal so_tien "VND"
enum trang_thai
}
```
````
Ký hiệu lực lượng: `||--o{` một-nhiều · `||--||` một-một · `}o--o{` nhiều-nhiều ·
`||--o|` một-không hoặc một.
🔴 **ERD ở GĐ2 là mô hình khái niệm**, không phải schema. Nêu thực thể, quan hệ, khoá nghiệp
vụ. Không nêu kiểu dữ liệu vật lý, index, bảng trung gian — đó là việc của SA/dev.
### Sequence
````markdown
```mermaid
sequenceDiagram
autonumber
actor U as Nhân viên
participant FE as Giao diện
participant BE as Hệ thống
participant POS as Hệ thống POS
U->>FE: Bấm Lưu
FE->>BE: POST /stores
BE->>POS: GET /verify (timeout 3s)
alt POS phản hồi kịp
POS-->>BE: 200 OK
BE-->>FE: 200 + id
FE-->>U: Toast "Đã lưu"
else POS timeout
POS--xBE: timeout
BE-->>FE: 503 · E-STR-0503
FE-->>U: Báo lỗi, GIỮ NGUYÊN dữ liệu đã nhập
end
```
````
`autonumber` đánh số bước để bảng đi kèm tham chiếu được. **Bắt buộc vẽ cả nhánh lỗi** —
sequence chỉ có luồng thành công là vi phạm quy tắc W4.
### Ma trận 2×2
````markdown
```mermaid
quadrantChart
title Stakeholder — Quan tâm × Ảnh hưởng
x-axis "Quan tâm thấp" --> "Quan tâm cao"
y-axis "Ảnh hưởng thấp" --> "Ảnh hưởng cao"
quadrant-1 "Quản lý sát"
quadrant-2 "Giữ hài lòng"
quadrant-3 "Theo dõi"
quadrant-4 "Giữ thông tin"
"STK-01 Trưởng phòng TC": [0.85, 0.90]
"STK-04 Pháp chế": [0.20, 0.85]
```
````
⚠️ `quadrantChart` cần mermaid ≥ 10. Renderer cũ (một số bản Confluence) không hiểu ⇒ giữ
bảng phân nhóm bên dưới làm phương án dự phòng.
---
## Khi mermaid không diễn đạt được
Ba trường hợp, và cách xử lý:
| Trường hợp | Làm gì |
|---|---|
| Bố cục màn hình | Wireframe ảnh — mermaid không phải công cụ vẽ UI |
| Ma trận ≥ 3×3, bảng số liệu | Bảng markdown |
| Sơ đồ > 20 node | Tách thành nhiều sơ đồ theo phân vùng, mỗi cái một mục con |
**Không bao giờ** quay lại ASCII art vì "hình này mermaid vẽ xấu". Xấu thì tách nhỏ hoặc
đổi loại sơ đồ.

View File

@@ -0,0 +1,192 @@
# Project Profile — ba trục quyết định cách chạy pipeline
Bộ skill này **không phụ thuộc ngành nghiệp vụ** (bán lẻ, y tế, logistics, ngân hàng, HR…
đều dùng chung khung). Nhưng nó **phụ thuộc ba thứ khác**, và ba thứ đó phải được khai báo
ngay ở Bước 0 của mọi skill:
```
PROFILE = PRODUCT × LIFECYCLE × RIGOR
```
Khai sai profile ⇒ skill đòi bạn điền những mục không tồn tại trong loại sản phẩm của bạn,
hoặc bỏ qua những mục sống còn. Đây là thứ quyết định mọi guideline phía sau.
---
## 0. Cách khai báo
Lần đầu chạy một project, `ba-lifecycle` tạo `00-index/PROFILE_<PROJECT>.md`:
```markdown
# PROFILE — <PROJECT>
| | |
|---|---|
| **PRODUCT** | screen |
| **LIFECYCLE** | brownfield |
| **RIGOR** | standard |
| **Ngành** | Bán lẻ / đối soát doanh thu |
| **Người chốt profile** | <PO/BA Lead>, ngày… |
| **Lý do chọn** | … |
## Hệ quả đã áp dụng
| Quyết định | Vì trục nào |
|---|---|
| Dùng biến thể SRS PART 2 = `screen` | PRODUCT |
| Bắt buộc AS-IS đầy đủ + phân tích dữ liệu cũ | LIFECYCLE |
| Gate ký bởi PO + Tech Lead + QA | RIGOR |
```
Mọi artifact khác thêm một dòng vào header: `| **Profile** | screen · brownfield · standard |`
**Đổi profile giữa chừng** phải ghi `DEC-nn` và nêu artifact nào phải viết lại.
---
## 1. Trục PRODUCT — loại sản phẩm
Trục quan trọng nhất. Nó quyết định **GĐ3 viết cái gì**.
| Giá trị | Sản phẩm là gì | Biến thể SRS PART 2 |
|---|---|---|
| `screen` | Có giao diện người dùng — web admin, web app, app di động | `srs-part2/screen.md` |
| `api-service` | Chỉ API/service, không giao diện; người tiêu thụ là hệ thống khác | `srs-part2/api-service.md` |
| `data-pipeline` | Sản phẩm là **dữ liệu** — ETL, ingest, kho dữ liệu, báo cáo BI | `srs-part2/data-pipeline.md` |
| `ml-model` | Sản phẩm là **mô hình dự đoán** — phân loại, xếp hạng, dự báo, sinh nội dung | `srs-part2/ml-model.md` |
| `batch-job` | Job chạy theo lịch, không giao diện — đối soát đêm, sinh báo cáo, dọn dữ liệu | `srs-part2/batch-job.md` |
| `process-only` | **Không phải phần mềm** — cải tiến quy trình, đổi cách làm việc | Không có PART 2 |
### Hệ quả theo từng giai đoạn
| | `screen` | `api-service` | `data-pipeline` | `ml-model` | `batch-job` | `process-only` |
|---|---|---|---|---|---|---|
| **GĐ1** Discovery | Đủ | Đủ; "người dùng" là **team tiêu thụ API** | Đủ; hỏi thêm về nguồn dữ liệu | Đủ; **bắt buộc** hỏi chi phí của dự đoán sai | Đủ | Đủ |
| **GĐ2** `PROCESS` | Đủ | Đủ | Đủ | Đủ | Đủ | Đủ — **trọng tâm** |
| **GĐ2** `RBAC` | Đủ | Theo client/scope thay vì vai trò người | Theo tập dữ liệu + độ nhạy cảm | Ai được xem điểm số/lý do | Ai được chạy tay | Đủ |
| **GĐ3** PART 2 | Màn hình, field | Endpoint, schema | Luồng dữ liệu, data contract | Bài toán, metric, ngưỡng | Job, lịch, chạy lại | ❌ N/A |
| **GĐ3** `AC` | 4 nhóm đầy đủ | 4 nhóm đầy đủ | 4 nhóm + **đối soát nguồn–đích** | 🔴 Chỉ áp cho hệ thống bao quanh; phần dự đoán dùng **ngưỡng metric** | 4 nhóm + **chạy lại** | Tiêu chí quy trình |
| **GĐ3** text hiển thị | Bắt buộc | N/A | N/A | Chỉ phần hiển thị cho người | N/A | N/A |
| **GĐ4** UAT | Người dùng thao tác | Team tiêu thụ tích hợp thử | Đối soát số liệu song song | 🔴 Đánh giá trên tập giữ lại + shadow mode | Chạy song song với cách cũ | Chạy thử quy trình |
| **GĐ5** `MANUAL` | Cho người dùng cuối | **Tài liệu tích hợp** cho dev | Từ điển dữ liệu + hướng dẫn đọc số | Hướng dẫn diễn giải kết quả | Sổ tay vận hành | Quy trình mới |
🔴 **`ml-model` là loại lệch nhiều nhất.** Yêu cầu mang tính xác suất, nên Given/When/Then
không mô tả được — đọc kỹ phần đầu `srs-part2/ml-model.md` trước khi bắt đầu.
### Loại chưa hỗ trợ
`embedded` / IoT / firmware: NFR khác hẳn (điện năng, nhiệt độ, thời gian thực cứng, an
toàn chức năng), và không có khái niệm "trạng thái rỗng". **Bộ skill này chưa có biến thể
PART 2 cho nó.** Dùng khung GĐ1/GĐ2/GĐ4/GĐ5 vẫn được; PART 2 của GĐ3 phải tự viết. Nói rõ
điều này với người dùng thay vì cố nhét vào biến thể gần đúng nhất.
### Một project có nhiều loại
Bình thường — một tính năng thường gồm `screen` + `api-service`, đôi khi + `batch-job`.
Cách xử lý: **profile khai loại chính**, và GĐ3 nạp nhiều biến thể PART 2, mỗi biến thể một
mục con. Không tách thành nhiều project.
---
## 2. Trục LIFECYCLE — nền cũ hay nền mới
Quyết định **GĐ1 và GĐ2 nặng ở đâu**.
| Giá trị | Nghĩa | AS-IS | Dữ liệu cũ | `IMPACT` |
|---|---|---|---|---|
| `greenfield` | Chưa có gì, không thay thế cái nào | Chỉ mô tả cách làm thủ công hiện tại (nếu có) | N/A — ghi rõ | Rút gọn: chỉ trục tích hợp |
| `brownfield` | Thay thế/bổ sung hệ thống đang chạy | 🔴 **Bắt buộc đầy đủ** | 🔴 **Bắt buộc chọn 1 trong 3 phương án** | Đầy đủ 6 trục |
| `enhancement` | Thêm/sửa trên module đã có | Chỉ phần bị đụng | Bắt buộc nếu đổi schema/rule | Đầy đủ 6 trục — **trọng tâm** |
**Hệ quả cụ thể:**
- `greenfield` ⇒ [process-model.md](../../ba-2-analysis/templates/process-model.md) PHẦN A rút
gọn còn A3 (điểm đau) + A4 (đường tắt) + A5 (ngoại lệ). Bỏ A1, A2, A6 và **ghi rõ lý do**,
đừng để trống.
- `enhancement` ⇒ GĐ1 chạy chế độ rút gọn (`--mode enhancement`): chỉ `RQ` + rủi ro, bỏ
`BRIEF` đầy đủ. Nhưng `IMPACT` ở GĐ2 thì **nặng hơn** bình thường.
- `brownfield` ⇒ mục "dữ liệu cũ xử lý thế nào" trong `IMPACT` §1.2 là blocker của G2.
---
## 3. Trục RIGOR — mức nghiêm ngặt
Quyết định **gate chặt tới đâu và ai phải ký**. `standard` là baseline; `light` bớt đi,
`strict` thêm vào.
| Giá trị | Dùng khi | Ký gate |
|---|---|---|
| `light` | POC, thử nghiệm, công cụ nội bộ ≤ 2 tuần, không đụng tiền/dữ liệu cá nhân | Chỉ PO |
| `standard` | Mặc định — sản phẩm thật, có người dùng thật | PO + Tech Lead + QA (theo từng gate) |
| `strict` | Có tiền, dữ liệu cá nhân, yêu cầu pháp lý, chịu kiểm toán (tài chính, y tế, bảo hiểm) | Như standard **+ Bảo mật/Pháp chế ở G2 và G3** |
Chi tiết tiêu chí bớt/thêm theo từng gate: [workflow.md §2.0](workflow.md).
### Chọn `light` không phải là được phép làm ẩu
`light` bỏ **thủ tục**, không bỏ **tư duy**. Bốn thứ không bao giờ được bỏ ở bất kỳ mức nào:
1. Phát biểu bài toán (không có thì không biết đang giải gì)
2. Ít nhất một `GOAL` có cách đo (không có thì không biết có thành công không)
3. `OQ` cho mọi chỗ chưa rõ (bịa vẫn là bịa, kể cả trong POC)
4. Ghi lại quyết định `DEC-nn` (POC hôm nay thành sản phẩm sáu tháng sau là chuyện thường)
### Nâng mức giữa chừng
POC `light` được duyệt thành sản phẩm ⇒ **nâng lên `standard` và chạy bù**: rà lại G1, G2,
G3 theo checklist đầy đủ trước khi làm tiếp. Ghi `DEC-nn`. Không nâng bù là cách một POC
mang theo mọi thiếu sót của nó vào sản phẩm thật.
---
## 4. Bảng tra nhanh — profile nào nạp gì
| Profile | Template GĐ2 nạp | Biến thể PART 2 | Gate ký bởi |
|---|---|---|---|
| `screen · brownfield · standard` | Đủ 5 | `screen` | PO + TL + QA |
| `screen · greenfield · light` | `BACKLOG`, `BR` | `screen` | PO |
| `api-service · enhancement · standard` | `BACKLOG`, `BR`, `IMPACT` (nặng) | `api-service` | PO + TL + QA |
| `data-pipeline · brownfield · strict` | Đủ 5 + đối soát | `data-pipeline` | PO + TL + QA + Bảo mật |
| `ml-model · greenfield · standard` | `PROCESS`, `BACKLOG`, `BR` | `ml-model` | PO + TL + QA |
| `batch-job · enhancement · strict` | `BACKLOG`, `BR`, `RBAC`, `IMPACT` | `batch-job` | PO + TL + QA + Bảo mật |
| `process-only · brownfield · standard` | `PROCESS` (trọng tâm), `RBAC` | ❌ | PO |
---
## 5. Ba ví dụ profile thật
**① Màn hình quản trị đối soát trong hệ thống bán lẻ đang chạy**
```
screen · brownfield · standard
```
Có giao diện, thay thế quy trình Excel đang dùng, đụng dữ liệu giao dịch có sẵn, không phải
hệ thống chịu kiểm toán trực tiếp. → PART 2 `screen`, AS-IS bắt buộc, ký 3 bên.
**② Luồng nạp dữ liệu POS hằng đêm vào kho dữ liệu, phục vụ báo cáo tài chính**
```
data-pipeline · greenfield · strict
```
Không giao diện, sản phẩm là dữ liệu, phục vụ báo cáo tài chính nên chịu kiểm toán. → PART 2
`data-pipeline`, bắt buộc mục đối soát nguồn–đích và audit log, thêm chữ ký Bảo mật.
**③ Thử nghiệm gợi ý sản phẩm cho app khách hàng, chạy 3 tuần xem có đáng đầu tư không**
```
ml-model · greenfield · light
```
POC, chưa có người dùng thật ngoài nhóm thử. → PART 2 `ml-model` nhưng chỉ mục 2.1–2.5,
gate chỉ PO ký. Vẫn bắt buộc: bài toán, một metric có ngưỡng, `OQ`, `DEC`.
---
## 6. Chọn thế nào khi lưỡng lự
| Lưỡng lự | Chọn | Vì |
|---|---|---|
| `screen` hay `api-service` | Theo **người tiêu thụ**: người → `screen`, hệ thống → `api-service` | Ai đọc AC quyết định AC viết thế nào |
| `data-pipeline` hay `batch-job` | Sản phẩm là **dữ liệu để phân tích** → pipeline; là **việc được làm xong** → batch-job | Pipeline cần data contract, batch-job cần idempotency |
| `ml-model` hay `screen` | Có thành phần dự đoán ⇒ **nạp cả hai biến thể** | Màn hình vẫn cần spec bình thường |
| `brownfield` hay `enhancement` | Thay cả quy trình → brownfield; thêm một mẩu vào cái đang chạy → enhancement | Quyết AS-IS nặng hay nhẹ |
| `standard` hay `strict` | Có tiền, dữ liệu cá nhân, hoặc ai đó có thể bị kiểm toán ⇒ `strict` | Nâng mức rẻ hơn nhiều so với sửa sau kiểm toán |
| `light` hay `standard` | Kết quả sẽ được dùng thật bởi người ngoài nhóm ⇒ `standard` | "POC" mà có người dùng thật thì không còn là POC |
**Không chắc ⇒ chọn mức cao hơn và hỏi người dùng.** Sai hướng "chặt quá" tốn thêm ít thủ
tục; sai hướng "lỏng quá" mất thông tin không lấy lại được.

View File

@@ -0,0 +1,211 @@
# Workflow BA — 5 giai đoạn, 5 gate
## 1. Sơ đồ
```mermaid
flowchart TD
START(["Ý tưởng / yêu cầu thô"])
GD1["GĐ1 · DISCOVERY<br/>ba-1-discovery<br/><br/>Hiểu bài toán, ai cần, thành công là gì"]
GD2["GĐ2 · ANALYSIS<br/>ba-2-analysis<br/><br/>Mô hình hoá nghiệp vụ, phân rã US, chốt rule"]
GD3["GĐ3 · SPECIFICATION<br/>ba-3-specification<br/><br/>Đặc tả tới mức code được, test được"]
GD4["GĐ4 · DELIVERY<br/>ba-4-delivery-support<br/><br/>Giải đáp, quản lý thay đổi, UAT"]
GD5["GĐ5 · POST-RELEASE<br/>ba-5-post-release<br/><br/>Bàn giao, đo hiệu quả, đề xuất vòng sau"]
END(["Đóng dự án hoặc mở vòng mới"])
START --> GD1
GD1 -->|"G1 — PO ký: bài toán & phạm vi đã đúng"| GD2
GD2 -->|"G2 — PO + Tech Lead ký: khả thi, backlog đủ"| GD3
GD3 -->|"G3 — PO + Tech Lead + QA ký: Ready for Dev"| GD4
GD4 -->|"G4 — PO ký UAT pass: Go-live"| GD5
GD5 -->|"G5 — Benefit review"| END
GD4 -.->|"spec sai/thiếu → CR"| GD3
GD4 -.->|"UAT lộ hiểu sai nghiệp vụ"| GD2
GD5 -.->|"KPI không đạt → vòng mới"| GD1
```
*Nét liền = đường đi xuôi qua gate. Nét đứt = ba đường quay lui hợp lệ (§5).*
`ba-traceability` chạy song song, cập nhật RTM sau mỗi giai đoạn và **có quyền chặn G2, G3, G4**.
## 2.0 Mức nghiêm ngặt — đọc trước §2
Checklist ở §2 là **baseline của mức `standard`**. Hai mức còn lại là delta so với nó:
| RIGOR | Cách đọc §2 |
|---|---|
| `light` | Áp checklist §2 **trừ đi** bảng "Bớt ở light" của từng gate |
| `standard` | Áp đúng checklist §2 |
| `strict` | Áp checklist §2 **cộng thêm** bảng "Thêm ở strict" của từng gate |
Mức được khai trong `00-index/PROFILE_<PROJECT>.md` — xem [domain-profiles.md §3](domain-profiles.md).
Chưa khai profile ⇒ **mặc định `standard`**, và skill phải nói rõ là đang dùng mặc định.
🔴 **`light` bỏ thủ tục, không bỏ tư duy.** Bốn thứ không bao giờ được bỏ ở bất kỳ mức nào:
phát biểu bài toán · ít nhất một `GOAL` có cách đo · `OQ` cho mọi chỗ chưa rõ · `DEC-nn` cho
mọi quyết định.
## 2. Tiêu chí pass từng gate
Gate chỉ ✅ khi **đủ artifact** *và* **đủ nội dung** *và* **có chữ ký duyệt ghi trong header
artifact** (dòng `Approved by: <tên> · <ngày>`).
### G1 — Problem sign-off · duyệt bởi **PO**
- [ ] `BRIEF` có: bối cảnh, phát biểu bài toán, phạm vi in/out, `GOAL-nn` kèm KPI đo được
- [ ] `STAKEHOLDER` có đủ 4 nhóm: quyết định · sử dụng · bị ảnh hưởng · cung cấp thông tin;
mỗi người có tên thật, vai trò, mức quan tâm/ảnh hưởng
- [ ] `ELICITATION` có biên bản ít nhất một buổi làm việc với nhóm "quyết định" và nhóm "sử dụng"
- [ ] `RQ-nnn` được đánh MoSCoW, mỗi cái truy về được một stakeholder cụ thể
- [ ] `RISK-nn` và `ASM-nn` đã ghi, rủi ro mức cao có người chịu trách nhiệm
- [ ] KPI có **giá trị hiện tại (baseline)** — không có baseline thì sau này không đo được
**Chặn:** phát biểu bài toán mô tả *giải pháp* thay vì *vấn đề* ("cần thêm nút export" là
giải pháp; "mất 2 giờ/ngày tổng hợp số liệu thủ công" mới là vấn đề).
| Bớt ở `light` | Thêm ở `strict` |
|---|---|
| Bỏ `ELICITATION` dạng biên bản chính thức — ghi tóm tắt vào `BRIEF` là đủ | Rà đích danh Bảo mật/Pháp chế trong `STAKEHOLDER`, có chữ ký của họ ở phần phạm vi dữ liệu |
| `STAKEHOLDER` chỉ cần nhóm "quyết định" và "sử dụng" | Mọi `ASM` chạm dữ liệu cá nhân/tiền phải có **kế hoạch xác minh kèm hạn** ngay ở G1 |
| Chỉ cần **1** `GOAL` có baseline, không cần đủ mọi GOAL | Ghi rõ căn cứ pháp lý áp dụng (điều khoản nào) |
| Ký: chỉ PO | Ký: PO + Bảo mật/Pháp chế |
### G2 — Solution sign-off · duyệt bởi **PO + Tech Lead**
- [ ] `PROCESS` có AS-IS và TO-BE, mỗi bước ghi rõ ai làm, input/output, điều kiện rẽ nhánh
- [ ] `BACKLOG` phân rã tới `US-nnn`, mỗi US có value statement và ước lượng sơ bộ
- [ ] Mỗi `RQ-nnn` của G1 map được về ≥1 `US-nnn` — **RQ không có US là RQ bị bỏ quên**
- [ ] `BR-nnn` đã chốt, không mâu thuẫn nhau
- [ ] `RBAC` có ma trận vai trò × hành động; hành động phê duyệt/chốt sổ có bảng SoD
- [ ] `IMPACT` nêu module/dữ liệu/tích hợp bị ảnh hưởng và cách xử lý dữ liệu cũ
- [ ] Tech Lead xác nhận **khả thi kỹ thuật** và nêu ràng buộc (nếu có)
- [ ] `ba-traceability` báo coverage RQ→US ≥ 100%
**Chặn:** backlog có US nhưng không truy được về RQ nào (scope creep), hoặc TO-BE không
giải quyết được pain point đã ghi ở G1.
| Bớt ở `light` | Thêm ở `strict` |
|---|---|
| Bỏ `PROCESS` AS-IS nếu `LIFECYCLE = greenfield` | `RBAC` **bắt buộc** có bảng SoD, kể cả khi nghiệp vụ trông đơn giản |
| Bỏ `RBAC` nếu chỉ có **1** vai trò — ghi rõ "1 vai trò" thay vì bỏ im lặng | `IMPACT` phải có kịch bản **rollback đã thử**, không chỉ mô tả |
| `IMPACT` rút gọn: chỉ trục dữ liệu và tích hợp | Mọi `ASM` phải chuyển sang **đã xác minh** trước khi qua G2 (thay vì trước G3) |
| Ký: chỉ PO | Ký: PO + Tech Lead + Bảo mật |
### G3 — Ready for Dev · duyệt bởi **PO + Tech Lead + QA**
- [ ] `SRS` đủ mọi mục bắt buộc (xem `ba-3-specification/templates/srs.md`)
- [ ] Mỗi màn hình có bảng field: kiểu, bắt buộc, độ dài, default, validation, message lỗi
- [ ] Mỗi `US` có `AC-<US>-nn` viết theo Given/When/Then, **có cả luồng lỗi**
- [ ] Bảng mã lỗi `E-<DOMAIN>-nnnn` đầy đủ, mỗi mã có thông điệp hiển thị
- [ ] `NFR` đã chốt cho các nhóm áp dụng, mỗi cái có cách verify
- [ ] `API` contract có, hoặc ghi rõ là **giả định của BA** chờ BE xác nhận
- [ ] Wireframe/prototype khớp với bảng component
- [ ] QA xác nhận **mọi AC đều test được** — AC không test được là AC chưa viết xong
- [ ] Không còn `OQ` mở nào ảnh hưởng tới hành vi hệ thống
- [ ] `ba-traceability` báo coverage US→AC và AC→test case ≥ 100%
**Chặn:** còn bất kỳ `TBD` nào trong bảng field hoặc bảng mã lỗi. Còn `OQ` mở về hành vi.
**Đây là gate nghiêm nhất** — một chỗ mơ hồ lọt qua G3 sẽ thành một bug hoặc một CR.
> Checklist trên viết theo `PRODUCT = screen`. Loại khác thì dòng "bảng field" và "wireframe"
> được thay bằng tiêu chí tương ứng của biến thể PART 2 — xem đầu file
> `ba-3-specification/templates/srs-part2/<loại>.md`.
| Bớt ở `light` | Thêm ở `strict` |
|---|---|
| `AC` chỉ bắt buộc nhóm 1 (thành công) và 2 (validation). Nhóm 3–4 bắt buộc **nếu** có ghi/xoá dữ liệu hoặc có >1 vai trò | Bảng lưu vết (`NFR-AUD`) bắt buộc cho mọi hành động ghi |
| `NFR` chỉ bắt buộc nhóm áp dụng rõ ràng; các nhóm khác ghi "N/A — POC" | Mọi mã lỗi phải có bản dịch đủ mọi ngôn ngữ hỗ trợ, không được để sau |
| `API` được phép là phác thảo, không cần bảng đối chiếu mã lỗi | `API` phải do BE xác nhận, **không chấp nhận contract BA tự đề xuất** |
| Không cần chữ ký QA | Ký: PO + Tech Lead + QA + Bảo mật/Pháp chế |
### G4 — UAT pass · duyệt bởi **PO**
- [ ] `UAT` có kịch bản phủ hết AC mức Must
- [ ] Kết quả UAT ghi rõ pass/fail từng kịch bản, có bằng chứng
- [ ] Mọi defect mức Critical/High đã đóng; Medium/Low có kế hoạch
- [ ] Mọi `CR-nnn` phát sinh đã được quyết (chấp nhận / hoãn / từ chối), tài liệu đã cập nhật
- [ ] `QLOG` không còn câu hỏi mở chặn dev
- [ ] Dữ liệu migration (nếu có) đã đối chiếu và khớp
**Chặn:** defect được "chấp nhận tạm" mà không có ticket theo dõi.
| Bớt ở `light` | Thêm ở `strict` |
|---|---|
| Thay UAT chính thức bằng **demo + checklist** cho PO, vẫn phải có tiêu chí pass chốt trước | Bằng chứng UAT (ảnh, log, dữ liệu đầu vào/ra) phải **lưu trữ được** phục vụ kiểm toán |
| Không cần kịch bản viết trước cho mức Should | Chạy song song với cách làm cũ tối thiểu 1 chu kỳ nghiệp vụ, đối chiếu kết quả |
| Defect Low được đóng không cần ticket | Mọi defect, kể cả Low, phải có ticket |
### G5 — Benefit review · duyệt bởi **PO + BA Lead**
- [ ] `RELNOTE` nghiệp vụ đã phát hành cho người dùng
- [ ] `MANUAL` / tài liệu đào tạo đã bàn giao
- [ ] `BENEFIT` so sánh KPI thực tế với baseline và mục tiêu ở `GOAL-nn`
- [ ] Feedback người dùng đã thu thập và phân loại
- [ ] Đề xuất vòng sau đã lập, đưa vào backlog
**Chặn:** không đo được KPI vì G1 không ghi baseline — ghi nhận đây là bài học, không lấp liếm.
| Bớt ở `light` | Thêm ở `strict` |
|---|---|
| Bỏ `MANUAL` nếu người dùng là chính nhóm làm — vẫn phải có `RELNOTE` dù ngắn | Báo cáo `BENEFIT` phải nêu rõ **rủi ro tồn dư** và ai theo dõi tiếp |
| Chỉ cần đo KPI + bài học; bỏ khảo sát người dùng chính thức | Lưu hồ sơ đào tạo: ai đã được đào tạo, ngày nào |
🔴 **Nâng mức giữa chừng.** POC `light` được duyệt thành sản phẩm ⇒ nâng lên `standard` và
**chạy bù** G1–G3 theo checklist đầy đủ trước khi làm tiếp, ghi `DEC-nn`. Không chạy bù là
cách một POC mang theo mọi thiếu sót của nó vào sản phẩm thật.
## 3. Ai làm gì
| Vai trò | Trách nhiệm trong pipeline |
|---|---|
| **BA** | Sở hữu toàn bộ artifact ở đây. Khai thác, phân tích, đặc tả, giải đáp, hỗ trợ UAT |
| **PO / Khách hàng** | Quyết ưu tiên và scope. Ký G1, G4, G5. Trả lời `OQ` nghiệp vụ |
| **Tech Lead** | Ký G2, G3 về mặt khả thi. Quyết kiến trúc. Trả lời `OQ` kỹ thuật |
| **QA** | Ký G3 về tính test được. Viết test case từ AC. Chủ trì thực thi UAT |
| **Dev** | Tiêu thụ SRS. Đặt `OQ` qua `QLOG` |
| **PM** | Tiến độ, nguồn lực. Không ký gate nội dung |
BA **không** thay PO quyết ưu tiên, **không** thay Tech Lead chọn kiến trúc, **không** thay
PM quản tiến độ — nhưng phải cung cấp đủ thông tin để cả ba ra quyết định.
## 4. Khi nào được bỏ giai đoạn
Bảng này là hệ quả của trục `LIFECYCLE` và `RIGOR` trong profile — xem
[domain-profiles.md §2, §3](domain-profiles.md).
| Tình huống | LIFECYCLE | Được bỏ | Bắt buộc giữ |
|---|---|---|---|
| Sửa lỗi nghiệp vụ nhỏ, không đổi hành vi | `enhancement` | GĐ1, GĐ2 | Cập nhật SRS + RTM |
| Enhancement trên module đã có | `enhancement` | GĐ1 rút gọn (chỉ `RQ` + `IMPACT`) | GĐ2 `IMPACT` (nặng hơn bình thường), GĐ3 đầy đủ |
| Module hoàn toàn mới, thay hệ thống đang chạy | `brownfield` | — | Đủ 5 giai đoạn, AS-IS bắt buộc |
| Module mới, không thay thế gì | `greenfield` | `PROCESS` PHẦN A rút gọn còn A3–A5 | Đủ 5 giai đoạn |
| POC / thử nghiệm | thường `greenfield` + `RIGOR=light` | GĐ5 | GĐ1 (để biết đo cái gì), GĐ3 rút gọn theo bảng "Bớt ở light" |
Bỏ giai đoạn **phải ghi lý do vào `DEC-nn`** trong `00-index/`. Bỏ im lặng là nợ kỹ thuật
tài liệu, sáu tháng sau không ai biết tại sao thiếu.
## 5. Vòng lặp ngược
Gate không phải một chiều. Ba đường quay lui hợp lệ:
- **GĐ4 → GĐ3**: dev phát hiện spec sai/thiếu ⇒ `CR`, sửa SRS, cập nhật RTM, không cần ký lại G3
nếu thay đổi không đụng AC. Đụng AC ⇒ QA phải ký lại.
- **GĐ4 → GĐ2**: UAT cho thấy nghiệp vụ hiểu sai ⇒ quay lại `PROCESS`/`BR`. Đây là tín hiệu
G1/G2 làm ẩu, ghi vào bài học ở GĐ5.
- **GĐ5 → GĐ1**: KPI không đạt ⇒ mở vòng mới, `BRIEF` phiên bản mới, không sửa đè bản cũ.
## 6. Ánh xạ sang bộ `ba:*` của berriz-platform-docs
Đang làm dự án Berriz thì dùng bảng này để khỏi làm trùng:
| Giai đoạn ở đây | Lệnh Berriz tương ứng | Phần bộ này bổ khuyết |
|---|---|---|
| GĐ1 Discovery | `/ba:brainstorm` (Gate 1) | Stakeholder map, biên bản elicitation, KPI baseline, risk |
| GĐ2 Analysis | `/ba:blueprint` (Gate 2) + `/ba:wbs` (Gate 3) + `/ba:analyze` | Quy trình AS-IS/TO-BE, phân tích tác động |
| GĐ3 Specification | `/ba:srs` (Gate 4) + `/ba:wireframe` + `/ba:prototype` | Bảng NFR verify, API contract, review AC theo QA |
| GĐ4 Delivery | `/ba:feedback` + `/ba:pr` | Change request có quy trình, kế hoạch & kết quả UAT |
| GĐ5 Post-release | — (không có) | Toàn bộ |
| Traceability | `/ba:review` | Ma trận RTM hai chiều, báo cáo coverage định lượng |
Nguyên tắc: **artifact do lệnh `ba:*` sinh ra là nguồn sự thật**, bộ này đọc chúng và bổ
sung phần còn thiếu vào `ba-output/`, không sao chép lại nội dung.

View File

@@ -0,0 +1,142 @@
# 13 quy tắc viết tài liệu BA
Mọi skill `ba-*` phải tuân thủ. Đây là thứ phân biệt một tài liệu dev đọc xong code được
với một tài liệu dev đọc xong phải đi hỏi lại.
## W1 — Một câu, một yêu cầu
❌ "Hệ thống cho phép người dùng tìm kiếm, lọc theo trạng thái và xuất Excel."
✅ Tách ba dòng, ba ID. Câu ghép làm test case không map được 1-1, và khi bỏ một vế thì
không biết ID nào bị ảnh hưởng.
## W2 — Cấm từ mơ hồ
Danh sách cấm, kèm cách thay:
| Cấm | Thay bằng |
|---|---|
| nhanh, mượt, tối ưu | "phản hồi ≤ 2 giây ở p95 với 1.000 bản ghi" |
| thân thiện, dễ dùng | mô tả hành vi cụ thể, hoặc đưa vào wireframe |
| v.v., các trường hợp khác, tương tự | liệt kê hết. Không liệt kê hết được ⇒ `OQ` |
| nên, có thể, thường thì | `phải` (Must) hoặc `được phép` (May) — chọn một |
| xử lý phù hợp, xử lý tương ứng | nêu đích danh hành vi |
| dữ liệu lớn, nhiều người dùng | con số + đơn vị |
Quét trước khi nộp: `grep -niE "nhanh|mượt|thân thiện|v\.v|nên |có thể |phù hợp" <file>`
## W3 — Mọi con số phải có đơn vị và nguồn
"Tối đa 40" ⇒ 40 **ký tự** hay 40 **byte**? Tiếng Hàn/tiếng Việt có dấu khác nhau ở chỗ
này. Ghi `40 ký tự (UTF-8, tính theo code point)` và nguồn: ai chốt, ngày nào.
## W4 — Luồng lỗi là bắt buộc, không phải phần thêm
Mỗi hành động phải có tối thiểu: luồng thành công · luồng validation fail · luồng hệ thống
lỗi (timeout/5xx) · luồng không đủ quyền. Thiếu luồng lỗi ⇒ dev tự bịa ⇒ mỗi màn hình một
kiểu.
## W5 — Text hiển thị viết nguyên văn, trong bảng riêng
Nhãn, placeholder, hint, thông điệp lỗi, text màn hình rỗng, nhãn trạng thái — **BA sở hữu
những chuỗi này**. Viết đúng từng ký tự vào bảng, đủ mọi ngôn ngữ hỗ trợ. Không viết
"hiển thị thông báo lỗi phù hợp".
## W6 — Trạng thái phải có sơ đồ chuyển
Thực thể có trạng thái ⇒ phải có bảng: `trạng thái nguồn | sự kiện | điều kiện | trạng thái
đích | ai được làm`. Kèm câu trả lời cho: trạng thái khởi tạo là gì, trạng thái nào là cuối,
từ trạng thái cuối có quay lại được không.
## W7 — Phân biệt "ẩn" và "khoá"
Ba trạng thái khác nhau, đừng gộp: **không hiển thị** · **hiển thị nhưng disable** ·
**hiển thị và read-only**. Mỗi field/nút trong bảng component phải chỉ rõ cái nào, theo
điều kiện gì.
## W8 — Cấm quyết định thay PO trong tài liệu
Gặp chỗ chưa rõ, viết:
```markdown
> **OQ-012** — Đơn hàng đã huỷ có được tính vào doanh thu tháng không?
> **Hỏi:** PO (chị Lan) · **Từ:** 2026-08-28 · **Chặn:** AC-US059-04, BR-021
> **Phương án BA đề xuất:** Không tính, vì … *(đề xuất, chưa phải quyết định)*
```
Không được im lặng chọn một phương án rồi viết như thể đã chốt. Đó là nguồn gốc của phần
lớn CR ở giai đoạn UAT.
## W9 — Truy vết trong chính câu văn
Mỗi AC ghi kèm US nó phục vụ; mỗi BR ghi kèm RQ nó hiện thực hoá; mỗi field ghi kèm BR
quy định nó. Truy vết nằm rải trong tài liệu, RTM chỉ tổng hợp lại — không phải ngược lại.
## W10 — Viết cho ba người đọc cùng lúc
| Người đọc | Họ tìm gì | Đáp ứng bằng |
|---|---|---|
| PO | Có đúng cái tôi cần không | Mục tóm tắt nghiệp vụ đầu tài liệu, ngôn ngữ nghiệp vụ |
| Dev | Tôi code gì | Bảng field, bảng component, mã lỗi, API |
| QA | Tôi test gì | AC Given/When/Then, bảng dữ liệu biên |
Một tài liệu, ba mục tiêu. Đừng viết SRS chỉ cho dev đọc.
## W11 — Ảnh không thay lời
Wireframe minh hoạ bố cục. Hành vi luôn nằm ở bảng component và AC. Khi ảnh và bảng mâu
thuẫn: **bảng thắng về việc "có tồn tại không"**, ảnh thắng về "nằm ở đâu, to bằng nào".
Ghi rõ quy tắc này trong mỗi tài liệu có ảnh.
## W12 — Ghi cả cái tài liệu KHÔNG nói
Cuối mỗi tài liệu, mục **"Ngoài phạm vi"**: những thứ người đọc có thể tưởng là có nhưng
không có. Ví dụ: *"Không xử lý đơn hàng đa tiền tệ trong phiên bản này"*. Nó ngăn dev làm
thừa và ngăn PO tưởng đã có.
## W13 — Sơ đồ vẽ bằng mermaid, và luôn có bảng đi kèm
Hai vế, cả hai bắt buộc.
**Vế 1 — mermaid, không ASCII art.** ASCII vỡ khi dán sang Confluence/PowerPoint, `git diff`
ra một khối rác, và ký hiệu tự chế khiến khách quen UML/BPMN đọc lệch. Loại sơ đồ nào dùng
cú pháp nào, quy ước ID/nhãn/hình dạng: [`diagram-rules.md`](diagram-rules.md).
**Vế 2 — sơ đồ để nhìn, bảng để truy vết và test.** Sơ đồ không diễn đạt được điều kiện
chính xác, ai được làm, mã lỗi nào, quy tắc nào chi phối. Sơ đồ đứng một mình là bức tranh
đẹp mà QA không viết được test case từ đó.
| Sơ đồ | Bảng bắt buộc đi kèm |
|---|---|
| Quy trình | Bảng bước: ai · input · output · công cụ · thời gian |
| Vòng đời trạng thái | Bảng chuyển + **bảng chuyển bị cấm** *(sơ đồ không vẽ được cạnh cấm)* |
| Use case | Bảng US: id · vai trò · RQ · MoSCoW |
| ERD | Bảng thực thể: trường · kiểu · khoá · ràng buộc |
| Sequence | Bảng bước: mã lỗi mỗi nhánh · timeout · hành vi khi thất bại |
Sơ đồ mâu thuẫn bảng ⇒ **bảng thắng** (hệ quả của W11).
---
## Checklist tự chấm trước khi nộp bất kỳ tài liệu nào
```
[ ] W1 Không có câu chứa 2 yêu cầu trở lên
[ ] W2 grep từ mơ hồ trả về rỗng
[ ] W3 Mọi con số có đơn vị + nguồn
[ ] W4 Mọi hành động có đủ 4 luồng
[ ] W5 Có bảng text hiển thị nguyên văn
[ ] W6 Thực thể có trạng thái đều có bảng chuyển trạng thái
[ ] W7 Mọi field/nút có điều kiện ẩn/khoá/read-only rõ ràng
[ ] W8 Mọi chỗ chưa rõ là OQ, không phải quyết định ngầm
[ ] W9 Mọi AC/BR/field có tham chiếu ngược
[ ] W10 Có tóm tắt nghiệp vụ cho PO ở đầu
[ ] W11 Có câu quy định ảnh vs bảng
[ ] W12 Có mục "Ngoài phạm vi"
[ ] W13 Sơ đồ dùng mermaid (không ASCII), và mỗi sơ đồ có bảng đi kèm
```
Quét W13: `grep -n '```mermaid' <file>` phải khớp số sơ đồ; `grep -nE '^\s*[┌└├│─▼]' <file>`
phải rỗng.
In checklist này dạng bảng ☐/✅ ở cuối mỗi lần chạy skill. Mục chưa đạt ⇒ nói rõ thiếu gì,
**không được đánh ✅ cho có**.