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,162 @@
# AGD — Architecture Guidelines — <PROJECT>
| | |
|---|---|
| **Version** | 1.0 |
| **Date** | YYYY-MM-DD |
| **Author** | <SA> (skill sa-3-enablement) |
| **Status** | 🟡 Draft |
| **Approved by** | Tech Lead: — |
| **Source** | SAD_… v1.0 · ADR-001..0nn · ICD_… v1.0 · FAIL_… v1.0 |
| **Scope** | |
| **Confidence** | 🟢 |
## Change Log
| Version | Date | Người sửa | Thay đổi | ADR |
|---|---|---|---|---|
| 1.0 | | | Bản đầu | — |
> **Tài liệu này chỉ chứa thứ truy được về một `ADR` hoặc `QAS`.** Quy ước đặt tên biến, thứ
> tự import, độ dài hàm thuộc Tech Lead và nằm ở tài liệu khác. Trộn hai loại làm dev ngừng
> phân biệt cái nào quan trọng.
---
## 1. Đọc gì trước
| Bạn là | Đọc theo thứ tự |
|---|---|
| Dev mới vào dự án | §2 → reference implementation → `SAD` §4 |
| Dev thêm một tính năng | §3 (ràng buộc) → `ICD` cho interface liên quan |
| Dev sửa một bug | §4 (đường lỗi) → `FAIL` |
| Người review PR | §3 + bảng `FIT` |
## 2. Reference implementation
| | |
|---|---|
| **Đường dẫn** | `<repo>/<module mẫu>` |
| **Chạy thử** | `<lệnh>` |
| **Thể hiện các quyết định** | `ADR-002`, `ADR-004`, `ADR-007` |
Module mẫu thể hiện đủ sáu thứ. Thiếu thứ nào thì dev sẽ tự bịa thứ đó:
| # | Thể hiện | Ở file nào |
|---|---|---|
| 1 | Cấu trúc module chuẩn | |
| 2 | Xử lý lỗi + mã lỗi theo `ICD` §3 | |
| 3 | Log có correlation id | |
| 4 | Gọi phụ thuộc ngoài có timeout/retry theo `FAIL` | |
| 5 | Kiểm tra quyền theo `SEC` §3 | |
| 6 | Kiểm thử ở đủ các mức | |
🔴 **Code luôn thắng văn bản về khả năng được đọc.** Mọi thứ giải thích dài hơn 10 dòng nên
chuyển thành code mẫu.
## 3. Ràng buộc kiến trúc
*Bốn cột bắt buộc. Ràng buộc không có nguồn là sở thích cá nhân, và team sẽ nhận ra.*
### 3.1 Ranh giới module & phụ thuộc
| # | Ràng buộc | Nguồn | Ví dụ đúng / sai | Cách kiểm |
|---|---|---|---|---|
| 1 | Tầng domain không import tầng infra | `ADR-002` | ✅ `domain/Order.ts` không import `infra/` · ❌ import `infra/db` | `FIT-01` |
| 2 | Module chỉ giao tiếp qua interface công khai | `ADR-004` | | `FIT-02` |
### 3.2 Dữ liệu
| # | Ràng buộc | Nguồn | Ví dụ đúng / sai | Cách kiểm |
|---|---|---|---|---|
| | Chỉ hệ thống chủ được ghi thực thể X | `DAT` §1 | | |
| | Truy vấn danh sách phải có phân trang | `QAS-001` | | |
| | Không dùng dữ liệu production ở non-prod | `SEC` §5 | | `FIT-nn` |
### 3.3 Interface & contract
| # | Ràng buộc | Nguồn | Ví dụ đúng / sai | Cách kiểm |
|---|---|---|---|---|
| | Số lớn (id, tiền) truyền dạng `string` | `ICD` §1 | ✅ `"1234567890123456789"` · ❌ `1234567890123456789` | `FIT-nn` |
| | Thời gian dùng ISO-8601 UTC | `ICD` §1 | | |
| | Lỗi nghiệp vụ trả HTTP 4xx | `ICD` §1 | ❌ 200 kèm `{success:false}` | |
| | Đổi contract breaking phải qua `ADR` | `ICD` §3 | | `FIT-nn` (Pact) |
### 3.4 Bảo mật
| # | Ràng buộc | Nguồn | Ví dụ đúng / sai | Cách kiểm |
|---|---|---|---|---|
| | Không có secret trong mã nguồn | `SEC` §6 | | `FIT-nn` |
| | Kiểm quyền ở tầng service, không chỉ ở gateway | `SEC` §3 | | ⚠️ Khuyến nghị |
| | Không log dữ liệu PII | `SEC` §5 | | ⚠️ Khuyến nghị |
### 3.5 Ràng buộc chỉ là khuyến nghị
*Quy tắc `D8`: không kiểm tự động được ⇒ phải ghi nhãn, kèm cách kiểm thủ công.*
| Ràng buộc | Vì sao không tự kiểm được | Kiểm thủ công thế nào | Tần suất |
|---|---|---|---|
---
## 4. Đường lỗi — dev phải làm gì
*Trích từ `FAIL`. Đây là chỗ dev hay tự bịa nhất, nên viết cực cụ thể.*
| Gọi tới | Timeout | Retry | Idempotent | Hết retry | Người dùng thấy gì |
|---|---|---|---|---|---|
| CSDL chính | … ms | 0 | — | trả 503 | |
| API ngoài … | … ms | 3 · mũ + jitter | ✅ khoá … | vào hàng đợi | |
**Mẫu code chuẩn:** `<đường dẫn trong reference implementation>`
🔴 **Không tự đặt timeout.** Ngân sách timeout theo tầng ở `FAIL` §2 — đặt sai một tầng làm
sai cả chuỗi.
## 5. Log, metric, trace
| | Quy tắc | Nguồn |
|---|---|---|
| Định dạng log | JSON, các trường bắt buộc: `ts`, `level`, `correlationId`, `service`, `msg` | `SAD` §9 |
| Correlation id | lấy từ header `…`, truyền xuống mọi lời gọi | `SAD` §9 |
| Mức log | `error` cho lỗi cần người xử lý · `warn` cho lỗi tự hồi phục | |
| **Cấm log** | PII, secret, toàn bộ request body | `SEC` §5 |
| Metric bắt buộc mỗi endpoint | số request, tỉ lệ lỗi, phân vị độ trễ | `QAS` |
## 6. Kiểm thử
| Mức | Kiểm gì | Bắt buộc khi nào | Ngưỡng |
|---|---|---|---|
| Đơn vị | logic nghiệp vụ thuần | mọi rule trong `BR` của BA | |
| Tích hợp | ranh giới với CSDL/hàng đợi | mọi repository | |
| Contract | `IF-nnn` không đổi breaking | mọi interface công khai | `FIT-nn` |
| Hiệu năng | `QAS` mức Must | trước mỗi release | `FIT-nn` |
## 7. Khi nào phải hỏi SA
*Ranh giới rõ ràng giúp team không bị chặn, và SA không thành nút thắt.*
| Tình huống | Quyết định bởi |
|---|---|
| Đặt tên, cấu trúc thư mục trong module, chọn thư viện tiện ích | **Dev / Tech Lead** — không cần hỏi |
| Thêm một bảng vào CSDL của chính module mình | Tech Lead |
| Thêm một endpoint theo đúng chuẩn `ICD` | Tech Lead |
| Gọi trực tiếp dữ liệu của module khác | **Hỏi SA** — chạm `ADR-004` |
| Thêm một phụ thuộc hạ tầng mới (cache, queue, dịch vụ ngoài) | **Hỏi SA** |
| Đổi contract công khai theo hướng breaking | **Hỏi SA** — cần `ADR` |
| Bỏ qua một ràng buộc ở §3 vì gấp | **Hỏi SA** — thành `TD-nn` có hạn |
Chấm nhanh: `../../sa-lifecycle/references/decision-radar.md` §2. Điểm ≥ 5 ⇒ hỏi SA.
## 8. Ngoài phạm vi
*Những gì tài liệu này KHÔNG quy định:*
- Quy ước đặt tên, format code, độ dài hàm ⟶ tài liệu của Tech Lead
- Quy trình Git, đặt tên nhánh, mẫu commit ⟶ tài liệu quy trình
- Thiết kế giao diện, design system ⟶ tài liệu thiết kế
## 9. Open Questions
| ID | Câu hỏi | Hỏi ai | Từ ngày | Chặn gì |
|---|---|---|---|---|

View File

@@ -0,0 +1,150 @@
# DREV — Design Review Log — <PROJECT>
| | |
|---|---|
| **Cập nhật** | YYYY-MM-DD |
| **Author** | <SA> (skill sa-3-enablement) |
| **Scope** | |
> **Đây là sổ sống** — ghi thêm liên tục, không lên version, không archive. Mục cũ không bao
> giờ sửa; sai thì thêm mục mới tham chiếu ngược.
---
## 1. Tóm tắt
| Trạng thái | Số mục |
|---|---|
| Đang chờ SA (⏳) | |
| Đã kết luận, đang thực hiện | |
| Đã đóng | |
| Sinh ra `ADR` mới | |
| Sinh ra `TD` | |
**Thời gian chờ trung bình:** … ngày · **mục tiêu: ≤ 2 ngày làm việc**
🔴 Chờ lâu hơn 2 ngày thì dev sẽ đi tiếp mà không chờ — và review thành phê bình sau khi đã
code xong: vô ích và gây mâu thuẫn.
## 2. Nhật ký
### DREV-nnn — <tiêu đề ngắn>
| | |
|---|---|
| **Ngày nhận** | |
| **Người hỏi** | |
| **Loại** | ❓ câu hỏi làm rõ · 🔧 đề xuất thay đổi thiết kế · ⚠️ phát hiện thiết kế sai |
| **Trạng thái** | ⏳ chờ SA · 🔄 đang thực hiện · ✅ đóng |
| **Ngày kết luận** | |
**Bối cảnh** — *(dev mô tả gì, đang gặp vấn đề gì thật)*
**Điểm radar** *(theo `../../sa-lifecycle/references/decision-radar.md` §2)*
| Tiêu chí | Điểm | Lý do |
|---|---|---|
| Chi phí đảo ngược | | |
| Bán kính ảnh hưởng | | |
| Chạm thuộc tính chất lượng | | |
| Ràng buộc dài hạn | | |
| Tranh cãi | | |
| **Tổng** | /10 | ⇒ *(0–2 trả Tech Lead · 3–4 `DEC` · 5–7 `ADR` · 8–10 `ADR` + POC)* |
**Đối chiếu thiết kế**
| Tài liệu | Nội dung liên quan | Có mâu thuẫn không |
|---|---|---|
| `ADR-nnn` | | |
| `QAS-nnn` | | |
| `SAD` §… | | |
**Phương án** — *(≥ 2, kể cả khi dev chỉ đưa 1. Phần lớn giá trị của review nằm ở đây.)*
| # | Phương án | Ưu | Nhược | Chi phí |
|---|---|---|---|---|
| 1 | | | | |
| 2 | | | | |
**Kết luận** — chọn đúng một trong bốn:
- [ ] ✅ **Đúng thiết kế** — không cần làm gì
- [ ] 🟡 **Lệch nhưng chấp nhận được** ⇒ `TD-nn`, hạn …
- [ ] 🔴 **Lệch phải sửa** ⇒ việc: …, chủ: …, hạn: …
- [ ] ⚠️ **Thiết kế sai, cần `ADR` mới** ⇒ `ADR-nnn` (`Supersedes: ADR-nnn`)
**Người quyết · ngày:** …
**Việc phát sinh**
| Việc | Chủ | Hạn | Ghi ở đâu |
|---|---|---|---|
---
### DREV-nnn — <tiêu đề>
*(cùng cấu trúc)*
---
## 3. Mẫu tham khảo — một mục đã hoàn chỉnh
### DREV-012 — Gọi thẳng CSDL module Order từ module Report
| | |
|---|---|
| **Ngày nhận** | 2026-09-12 |
| **Người hỏi** | anh Nam (dev) |
| **Loại** | 🔧 đề xuất thay đổi thiết kế |
| **Trạng thái** | ✅ đóng |
| **Ngày kết luận** | 2026-09-13 |
**Bối cảnh** — Báo cáo tổng hợp cần join 3 bảng của module Order. Gọi qua interface công khai
mất 4,1 giây, vượt `QAS-003` (p95 ≤ 3s). Dev đề xuất truy vấn thẳng CSDL của Order.
**Điểm radar: 8/10** — chi phí đảo ngược 1 · bán kính 2 · chạm `QAS` 2 · ràng buộc dài hạn 2 ·
tranh cãi 1 ⇒ cần `ADR`, không quyết trong PR.
**Đối chiếu:** `ADR-004` chốt module chỉ giao tiếp qua interface công khai. `QAS-003` yêu cầu
p95 ≤ 3s — **thiết kế hiện tại không đạt**. Dev đúng về vấn đề, sai về cách giải.
**Phương án**
| # | Phương án | Ưu | Nhược | Chi phí |
|---|---|---|---|---|
| 1 | Giữ ranh giới + read model riêng cho báo cáo | Đúng `ADR-004`, mở đường tách service | Thêm cơ chế đồng bộ | +1 tuần |
| 2 | Giữ ranh giới + cache kết quả | Rẻ nhất, +2 ngày | Dữ liệu trễ ≤ 5 phút | +2 ngày |
| 3 | Gọi thẳng CSDL | Nhanh nhất | Vi phạm `ADR-004`, chặn việc tách service sau này | +0 |
| 4 | Nới `QAS-003` lên 5s | Không phải làm gì | Cần PO chấp nhận | +0 |
**Kết luận:** ⚠️ hỏi PO trước (`OQ-034`: báo cáo trễ 5 phút có chấp nhận được không).
PO trả lời 2026-09-13: chấp nhận ⇒ chọn **PA-2**.
**Người quyết:** SA + Tech Lead, sau khi PO trả lời `OQ-034` · 2026-09-13
**Việc phát sinh**
| Việc | Chủ | Hạn | Ghi ở đâu |
|---|---|---|---|
| Bổ sung `QAS-003` ghi rõ "dữ liệu báo cáo trễ ≤ 5 phút" | SA | 2026-09-15 | `QAS` v1.1 |
| Ghi `DEC-07` về mức trễ chấp nhận được | SA | 2026-09-15 | `00-index/DEC` |
| Cài cache + cơ chế làm mới | anh Nam | 2026-09-19 | |
---
## 4. Câu hỏi lặp lại ⇒ tài liệu chưa rõ
*Cùng một câu hỏi từ ≥ 2 người ⇒ không phải lỗi của dev, là lỗi của tài liệu.*
| Câu hỏi | Số lần bị hỏi | Tài liệu phải sửa | Đã sửa |
|---|---|---|---|
| | | `AGD` §… / `ICD` §… | ☐ |
## 5. Phản hồi "kiến trúc không thực tế"
*Cùng một phản hồi về cùng một chỗ, ≥ 3 lần ⇒ khả năng cao thiết kế sai thật.*
| Chỗ bị phản hồi | Số lần | Ai | Đã đánh giá lại | Kết luận |
|---|---|---|---|---|
| | | | ☐ | |

View File

@@ -0,0 +1,126 @@
# FIT — Fitness Functions — <PROJECT>
| | |
|---|---|
| **Version** | 1.0 |
| **Date** | YYYY-MM-DD |
| **Author** | <SA> (skill sa-3-enablement) |
| **Status** | 🟡 Draft |
| **Approved by** | Tech Lead: — · QA: — |
| **Source** | AGD_… v1.0 · QAS_… v1.0 · ADR-… |
| **Scope** | |
| **Confidence** | 🟢 |
## Change Log
| Version | Date | Người sửa | Thay đổi |
|---|---|---|---|
| 1.0 | | | Bản đầu |
> **Quy tắc `D8`:** ràng buộc không kiểm tự động được thì chỉ là khuyến nghị. Tài liệu này là
> chỗ biến ràng buộc thành thứ CI cưỡng chế được.
---
## 1. Bảng trạng thái
| ID | Ràng buộc | Nguồn | Công cụ | Bước CI | Chế độ | Trạng thái | Vi phạm | `TD` |
|---|---|---|---|---|---|---|---|---|
| `FIT-01` | Tầng domain không import infra | `ADR-002` | ArchUnit | `test` | 🚫 chặn | 🟢 | 0 | |
| `FIT-02` | Không có secret trong mã nguồn | `SEC` §6 | gitleaks | `pre-build` | 🚫 chặn | 🟢 | 0 | |
| `FIT-03` | `QAS-004` batch ≤ 45 phút | `QAS-004` | k6 | `perf` (nightly) | ⚠️ cảnh báo | 🔴 | 52 phút | `TD-05` |
**Chế độ:** ⚠️ cảnh báo · 🚫 chặn merge · ⏸ chưa bật
**Trạng thái:** 🟢 xanh · 🔴 đỏ · ⚪ chưa chạy lần nào
## 2. Lộ trình bật
*Đừng cố phủ hết ngay. Thứ tự đem lại giá trị nhanh nhất, và mọi bài kiểm bắt đầu ở chế độ
cảnh báo.*
| Tuần | Bật gì | Vì sao thứ tự này |
|---|---|---|
| 1 | Phụ thuộc giữa tầng/module · quét secret | Rẻ nhất, chặn được nhiều lỗi nhất |
| 2 | Quét lỗ hổng thư viện · lint contract | Công cụ có sẵn, cấu hình nhanh |
| 3 | Kiểm thử hiệu năng `QAS` mức Must | Tốn công dựng nhất |
| 4 | Kiểm tra IaC / policy hạ tầng | Cần quyền trên pipeline hạ tầng |
**Lịch chuyển cảnh báo → chặn**
| `FIT` | Bật cảnh báo | Vi phạm lúc bật | Ngày chuyển sang chặn | Ai dọn nợ | Trạng thái |
|---|---|---|---|---|---|
| `FIT-01` | 2026-09-01 | 12 | 2026-09-20 | anh Nam | |
🔴 **Bật chế độ chặn ngay trên codebase đã có nợ sẽ làm CI đỏ toàn bộ và team sẽ tắt nó.**
Quy tắc chuyển tiếp: bật cảnh báo → ghi số vi phạm làm mốc → quy tắc "không tăng thêm" →
giảm dần về 0 → chuyển sang chặn.
## 3. Chi tiết từng fitness function
### `FIT-01` — <tên>
| | |
|---|---|
| **Ràng buộc kiểm** | *(phát biểu chính xác, kiểm chứng được)* |
| **Nguồn** | `ADR-002` / `QAS-nnn` / `SEC` §… |
| **Công cụ** | |
| **File bài kiểm** | `<đường dẫn trong repo>` |
| **Chạy ở đâu** | bước `<tên>` trong `<file CI>` · mỗi PR / nightly / trước release |
| **Thời gian chạy** | … s |
| **Chế độ** | ⚠️ cảnh báo → 🚫 chặn từ … |
| **Đỏ thì ai sửa** | |
| **Ngoại lệ được phép** | *(danh sách whitelist + lý do + hạn — whitelist không có hạn là whitelist vĩnh viễn)* |
**Cấu hình mẫu**
```
<đoạn cấu hình/code thật, để người khác nhân bản được>
```
### `FIT-02` — <tên>
*(cùng cấu trúc)*
## 4. Bảng phủ — ràng buộc nào chưa có bài kiểm
*Mọi ràng buộc trong `AGD` §3 và mọi `QAS` mức Must phải xuất hiện ở đây.*
| Ràng buộc / `QAS` | Có `FIT` | Nếu không: nhãn `⚠️ Khuyến nghị` | Cách kiểm thủ công | Tần suất |
|---|---|---|---|---|
| `AGD` §3.1-1 | `FIT-01` | — | — | — |
| `AGD` §3.4-2 | ❌ | ⚠️ Khuyến nghị | review PR có checklist | mỗi PR chạm authz |
| `QAS-007` | ❌ | ⚠️ Khuyến nghị | diễn tập thủ công | mỗi quý |
🔴 Dòng không có `FIT` **và** không có nhãn `⚠️ Khuyến nghị` ⇒ chặn AG3. Trong sáu tháng nó sẽ
bị vi phạm và không ai biết.
## 5. `QAS` mức Must × bài đo thật
*AG3 yêu cầu **đã đo**, không chấp nhận ước lượng.*
| `QAS` | Mục tiêu | Bài đo | Môi trường | Lần đo gần nhất | Kết quả | Đạt |
|---|---|---|---|---|---|---|
| `QAS-001` | p95 ≤ 300ms | `perf/api.js` | stg | | | ☐ |
| `QAS-004` | ≤ 45 phút | `perf/batch.js` | stg | | 52 phút | ❌ |
**Sai lệch môi trường** — stg khác prod ở đâu, và sai số ước tính bao nhiêu:
| Khác biệt | Ảnh hưởng tới `QAS` nào | Sai số ước tính | Cách bù |
|---|---|---|---|
## 6. Bảo trì bộ fitness function
| Việc | Tần suất | Ai |
|---|---|---|
| Rà whitelist quá hạn | hàng tháng | |
| Rà bài kiểm chạy quá lâu (làm chậm CI) | hàng tháng | |
| Rà `FIT` không còn đúng vì `ADR` đã superseded | sau mỗi `ADR` mới | |
| Rà bài kiểm luôn xanh vì nó không kiểm gì cả | mỗi quý | |
🔴 **Bài kiểm luôn xanh từ ngày đầu là bài kiểm đáng nghi.** Thử phá nó một lần để chắc chắn
nó đỏ được — bài kiểm không bao giờ đỏ là bài kiểm không kiểm gì.
## 7. Open Questions
| ID | Câu hỏi | Hỏi ai | Từ ngày | Chặn gì |
|---|---|---|---|---|

View File

@@ -0,0 +1,101 @@
# TDEBT — Technical Debt Register — <PROJECT>
| | |
|---|---|
| **Cập nhật** | YYYY-MM-DD |
| **Author** | <SA> (skill sa-3-enablement) |
| **Scope** | |
> **Đây là sổ sống** — ghi thêm liên tục, không lên version. Mục đóng vẫn giữ lại.
---
## 1. Tóm tắt
| | Số mục | Tổng lãi suất/tháng | Tổng chi phí trả nợ |
|---|---|---|---|
| 🔴 Cao | | … ngày công/tháng | … ngày công |
| 🟠 Trung bình | | | |
| 🟡 Thấp | | | |
| ✅ Đã trả | | — | — |
**Ba mục nên trả trước** *(lãi suất cao / chi phí trả thấp)*: `TD-…`, `TD-…`, `TD-…`
🔴 **Cột "lãi suất" là cột làm cho nợ được ưu tiên.** Không có nó, sổ nợ chỉ tăng không giảm.
Viết bằng ngôn ngữ PM hiểu: *"mỗi tính năng chạm module này tốn thêm 2 ngày"*, *"gây trung bình
1 sự cố/tháng"*.
## 2. Phân loại
| Loại | Nghĩa | Xử lý |
|---|---|---|
| 🎯 **Có ý thức, có kế hoạch** | Chấp nhận để kịp mốc, biết rõ sẽ sửa khi nào | Ghi hạn, theo dõi |
| 🌫️ **Có ý thức, chưa có kế hoạch** | Biết là sai, chưa biết sửa thế nào | Ghi, đưa vào `TRM` |
| 💥 **Vô ý** | Phát hiện qua review hoặc `FIT` đỏ | Đánh giá rồi xếp vào 2 loại trên |
| ⚠️ **Do kiến trúc sai** | Thiết kế không khả thi | **Không phải nợ** — mở `ADR` mới, đừng ghi ở đây |
## 3. Sổ nợ
| ID | Mô tả | Loại | Nguồn | Vì sao chấp nhận | **Lãi suất** | Chi phí trả | Mức | Chủ | Hạn xét lại | Trạng thái |
|---|---|---|---|---|---|---|---|---|---|---|
| `TD-01` | | 🎯 | `DREV-012` | | +2 ngày/tính năng chạm module | 5 ngày công | 🔴 | | | Mở |
| `TD-02` | | 💥 | `FIT-01` đỏ, 12 vi phạm | | | | | | | |
**Trạng thái:** Mở · Đang trả · Đã trả (kèm ngày) · Đã chuyển thành `ADR` · Chấp nhận vĩnh viễn
🔴 Mục "sẽ sửa sau" không có **chủ** và **hạn** ⇒ không phải mục nợ hợp lệ, chặn AG3.
## 4. Chi tiết mục mức cao
### `TD-01` — <tên>
| | |
|---|---|
| **Lệch so với** | `ADR-nnn` / `AGD` §… / `QAS-nnn` |
| **Ở đâu trong code** | `<đường dẫn>` |
| **Ai chấp nhận · ngày** | |
| **Vì sao chấp nhận** | *(lý do thật: mốc nào, đánh đổi gì)* |
| **Lãi suất** | *(con số)* |
| **Rủi ro nếu để lâu** | |
| **Cách trả** | *(các bước cụ thể)* |
| **Chi phí trả** | … ngày công |
| **Điều kiện phải trả ngay** | *(dấu hiệu nào thì không hoãn được nữa)* |
| **Ngoại lệ trong `FIT`** | `FIT-nn` whitelist mục … · hạn … |
🔴 **Whitelist trong `FIT` phải có hạn.** Whitelist không hạn là cách biến nợ tạm thời thành
kiến trúc vĩnh viễn.
## 5. Nợ đã trả
| ID | Mô tả | Trả ngày | Chi phí thực tế | So với ước lượng | Bài học |
|---|---|---|---|---|---|
*Cột "so với ước lượng" giúp lần sau ước lượng đúng hơn. Nợ thường tốn hơn ước lượng ban đầu
khoảng 1,5–2 lần.*
## 6. Nợ chấp nhận vĩnh viễn
*Nợ quyết định không trả. Ghi lại để người sau không mất thời gian điều tra "sao chỗ này lạ vậy".*
| ID | Mô tả | Vì sao không trả | Ai quyết · ngày | Cần biết gì khi động vào chỗ này |
|---|---|---|---|---|
## 7. Trình bày cho PM / PO
*Bảng này dùng để đưa nợ vào sprint. Dịch sang ngôn ngữ tiến độ và rủi ro.*
| Nợ | Đang làm chậm cái gì | Chậm bao nhiêu | Trả mất | Hoà vốn sau |
|---|---|---|---|---|
| `TD-01` | mọi tính năng chạm module Order | +2 ngày/tính năng | 5 ngày | 3 tính năng |
**Câu hỏi trình PM:** *"Quý tới có bao nhiêu tính năng chạm module Order?"* — nếu ≥ 3 thì trả
nợ ngay là lựa chọn rẻ hơn, và PM tự thấy điều đó.
## 8. Rà định kỳ
| Việc | Tần suất | Ai | Lần gần nhất |
|---|---|---|---|
| Rà mục quá hạn xét lại | 2 tuần/lần | SA | |
| Cập nhật lãi suất theo thực tế | hàng tháng | SA + Tech Lead | |
| Rà whitelist `FIT` hết hạn | hàng tháng | SA | |
| Trình bảng §7 cho PM | mỗi lần lập kế hoạch sprint/quý | SA | |