📘 Guide vận hành

PHỤ LỤC C — TEMPLATE SPEC ĐẦY ĐỦ

Lưu tại 02-requirements/spec/_template/spec-template.md. DEV sinh bản draft từ PRD tại tag baseline ghi ở header; BA duyệt từng mục.

---
id: FE-XXX
title: <Tên tính năng>
owner: DEV
status: draft            # draft | reviewing | approved | changed | deprecated
version: 0.1
gitlab_issue: "#XX"
prd_baseline: FE-XXX-v1.0    # tag git của PRD mà spec này dịch ra
approved_by: ""
approved_at: ""
updated: YYYY-MM-DD
---

# SPEC — FE-XXX <Tên tính năng>

## 0. Đối chiếu với PRD
Liệt kê đủ mọi AC trong PRD. Không sót, không tự thêm.

| Mã AC | Tóm tắt | Nguồn trong PRD | Đã đặc tả |
|-------|---------|-----------------|:---------:|
| FE-XXX-AC-01 | | mục 6 | ☐ |

## 1. Đặc tả từng tiêu chí

### FE-XXX-AC-01 — <Tên tiêu chí>
**Given** <trạng thái hệ thống trước khi thao tác, có dữ liệu cụ thể>
**When** <hành động của actor>
**Then** <kết quả chính xác: mã HTTP, mã lỗi, bản ghi thay đổi thế nào>

**Trường hợp biên**
| Tình huống | Kết quả mong đợi |
|-----------|------------------|
| Dữ liệu rỗng | |
| Giá trị trùng | |
| Hai request đồng thời | |
| Không đủ quyền | |
| Hệ thống ngoài timeout | |

**Nguồn:** PRD mục X, BR-XX
**Test:** `[FE-XXX-AC-01] <tên hàm test>`

## 2. Hợp đồng dữ liệu
### API
| Method | Endpoint | AC liên quan |
|--------|----------|--------------|
| POST | `/api/v1/...` | AC-01, AC-03 |

**Mã lỗi**
| HTTP | Mã lỗi | Khi nào | AC |
|------|--------|---------|-----|
| 400 | `E_INVALID_...` | | |
| 409 | `E_DUPLICATE_...` | | |

### Thay đổi cơ sở dữ liệu
| Bảng | Thay đổi | Ràng buộc | AC |
|------|----------|-----------|-----|
| | thêm cột / index / sửa kiểu | unique, not null, FK | |

**Dữ liệu cũ:** dữ liệu đã migrate có thỏa mãn ràng buộc mới không? Nếu không, xử lý thế nào?

## 3. Ngoài phạm vi
Liệt kê những thứ KHÔNG làm lần này, để tránh hiểu nhầm khi nghiệm thu.

## 4. Câu hỏi phát sinh
> Mục quan trọng nhất của file. Ghi lại mọi chỗ phải đoán khi dịch PRD sang spec.

| ID | Câu hỏi | Mức | Giả định đang dùng | Trạng thái | Người trả lời |
|----|---------|-----|--------------------|-----------|---------------|
| SQ-01 | | P1 | | open | BA |

Quy tắc: không mục P1 nào còn `open` thì mới được chuyển `status: approved`.

## 5. Checklist trước khi mở MR (DEV tự chạy)
- [ ] Mỗi AC trong PRD có đúng một mục trong spec — không sót, không thừa
- [ ] Mỗi mục có đủ Given / When / Then
- [ ] Dữ liệu mẫu cụ thể, không viết chung chung kiểu <string>
- [ ] Đã liệt kê trường hợp biên: rỗng, trùng, concurrent, timeout, permission
- [ ] Mã lỗi và HTTP status đã xác định cho mọi nhánh lỗi
- [ ] Mọi chỗ phải đoán đã ghi vào mục 4

## 6. Checklist duyệt (BA chạy)
- [ ] Từng mục Given/When/Then phản ánh đúng ý nghiệp vụ, không chỉ đúng kỹ thuật
- [ ] Trường hợp biên khớp với thực tế vận hành của khách hàng
- [ ] Không có AC nào bị DEV diễn giải rộng hơn hoặc hẹp hơn PRD
- [ ] Mọi câu hỏi mức P1 ở mục 4 đã có câu trả lời từ khách hàng