init git
This commit is contained in:
@@ -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ì |
|
||||
|---|---|---|---|---|
|
||||
150
.claude/skills/sa-3-enablement/templates/design-review-log.md
Normal file
150
.claude/skills/sa-3-enablement/templates/design-review-log.md
Normal 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 |
|
||||
|---|---|---|---|---|
|
||||
| | | | ☐ | |
|
||||
126
.claude/skills/sa-3-enablement/templates/fitness-functions.md
Normal file
126
.claude/skills/sa-3-enablement/templates/fitness-functions.md
Normal 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ì |
|
||||
|---|---|---|---|---|
|
||||
101
.claude/skills/sa-3-enablement/templates/tech-debt-register.md
Normal file
101
.claude/skills/sa-3-enablement/templates/tech-debt-register.md
Normal 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 | |
|
||||
Reference in New Issue
Block a user