PHẦN 5 — CHUẨN TÀI LIỆU
5.1 PRD
Song ngữ Việt–Anh, lưu 02-requirements/prd/FE-XXX-<slug>.md, gồm 10 mục:
1. Overview / Tổng quan
2. User Stories
3. Out of Scope
4. Functional Requirements
5. Business Rules
6. Acceptance Criteria ← mỗi mục phải có mã FE-XXX-AC-YY
7. API Contract
8. Mockup / Wireframe
9. Non-functional Requirements
10. Open Questions
Self-review PRD (BA chạy trước khi trình):
- ☐ Business Rules không mâu thuẫn nhau
- ☐ Mọi actor đều có ít nhất 1 User Story
- ☐ Out of Scope đã liệt kê rõ
- ☐ Mọi AC đã có mã định danh
- ☐ AC đủ để viết test case
- ☐ Edge case đã có trong Business Rules
- ☐ API Contract có method + endpoint + payload mẫu
5.2 Spec
Lưu 02-requirements/spec/FE-XXX-spec.md. Template đầy đủ ở Phụ lục C. Cấu trúc mỗi mục:
### FE-001-AC-03 — Chặn tạo phiếu trùng VIN trong cùng ngày
**Given** đã tồn tại phiếu VIN "RL4TA1234" ngày 2026-07-23, trạng thái chưa hủy
**When** tạo phiếu mới cùng VIN, cùng ngày
**Then** trả HTTP 409, mã lỗi E_DUPLICATE_VIN, không ghi bản ghi mới
**Trường hợp biên**
| Tình huống | Kết quả |
|-----------|---------|
| Phiếu cũ đã hủy | Cho tạo |
| Khác ngày | Cho tạo |
| VIN sai định dạng | 400, E_INVALID_VIN — thuộc AC-05 |
| Hai request đồng thời | Một thành công, một 409 |
**Nguồn:** PRD mục 6, BR-07
**Test:** `[FE-001-AC-03] should_reject_duplicate_vin_same_day`
Self-review spec (DEV chạy trước khi mở MR):
- ☐ 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
- ☐ Có dữ liệu mẫu cụ thể, không viết chung chung
- ☐ Đã 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
- ☐ Mọi chỗ phải đoán đã ghi vào "Câu hỏi phát sinh"