update skill and docs
This commit is contained in:
@@ -22,7 +22,7 @@ Bỏ một trong ba thì hai cái còn lại cũng vô dụng.
|
||||
|
||||
| Tình huống | Có nên gọi |
|
||||
|---|---|
|
||||
| Vừa qua AG2, dev sắp bắt đầu | ✅ `--focus agd` trước, ngay trong tuần đầu |
|
||||
| Vừa qua AG2, dev sắp bắt đầu | ✅ `--focus handoff` rồi `--focus agd`, ngay trong tuần đầu |
|
||||
| CI chưa kiểm gì về kiến trúc | ✅ `--focus fit` |
|
||||
| Dev đề xuất một thay đổi chạm thiết kế | ✅ `--focus review` |
|
||||
| Phải lệch thiết kế vì deadline | ✅ `--focus debt` — ghi lại ngay, đừng để nhớ sau |
|
||||
@@ -33,16 +33,17 @@ Bỏ một trong ba thì hai cái còn lại cũng vô dụng.
|
||||
## Cú pháp
|
||||
|
||||
```
|
||||
/sa-3-enablement <PROJECT> [--focus agd|fit|review|debt|all] [--out <path>] [go]
|
||||
/sa-3-enablement <PROJECT> [--focus handoff|agd|fit|review|debt|all] [--out <path>] [go]
|
||||
```
|
||||
|
||||
| `--focus` | Sinh ra | Khi nào chạy |
|
||||
|---|---|---|
|
||||
| `handoff` | `HANDOFF` — gói bàn giao dev: mục lục đường dẫn thật, checklist đủ/thiếu, dev ký đã nhận | **Ngay khi AG2 ký**, chạy lại mỗi khi mở rộng phạm vi |
|
||||
| `agd` | `AGD` + đề cương reference implementation | Ngay sau AG2 |
|
||||
| `fit` | `FIT` — danh sách bài kiểm + cấu hình CI đề xuất | Tuần 1–2 của thi công |
|
||||
| `review` | Một mục trong `DREV` | Mỗi lần có thay đổi chạm kiến trúc |
|
||||
| `debt` | Một mục trong `TDEBT` | Mỗi lần chấp nhận lệch |
|
||||
| `all` | Cả bốn | |
|
||||
| `all` | Cả năm | |
|
||||
|
||||
Review một thay đổi cụ thể:
|
||||
|
||||
@@ -56,7 +57,8 @@ Review một thay đổi cụ thể:
|
||||
|
||||
| Cho bước | Chuẩn bị |
|
||||
|---|---|
|
||||
| `agd` | `SAD`, `ADR`, `ICD`, `FAIL` đã ký · quy ước code hiện có của team |
|
||||
| `handoff` | Phạm vi bàn giao (US/module) · INDEX của BA và SA · quyền mở mọi artifact |
|
||||
| `agd` | `SAD`, `ADR`, `ICD`, `CTR`, `PDM`, `FAIL` đã ký · quy ước code hiện có của team |
|
||||
| `fit` | Cấu hình CI hiện tại · ngôn ngữ/framework · quyền sửa pipeline |
|
||||
| `review` | Mô tả thay đổi + lý do dev đưa ra + code/PR nếu có |
|
||||
| `debt` | Lệch cụ thể là gì · vì sao phải lệch · ai chấp nhận |
|
||||
@@ -65,6 +67,7 @@ Review một thay đổi cụ thể:
|
||||
|
||||
```
|
||||
sa-output/<PROJECT>/03-enablement/
|
||||
├── HANDOFF_<PROJECT>_<phạm vi>_v1.0.md ← dev mở cái này ĐẦU TIÊN: đọc gì, ở đâu, bản nào, ai ký
|
||||
├── AGD_<PROJECT>_v1.0.md ← dev đọc cái này
|
||||
├── FIT_<PROJECT>_v1.0.md ← danh sách bài kiểm + trạng thái xanh/đỏ
|
||||
├── DREV_<PROJECT>.md ← nhật ký, ghi thêm liên tục, không lên version
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
---
|
||||
name: sa-3-enablement
|
||||
description: Giai đoạn 3 của quy trình Solution Architect — đồng hành cùng team trong lúc thi công. Dùng để biến kiến trúc thành thứ dev dùng được (architecture guideline, reference implementation, skeleton), dựng fitness function kiểm thử ràng buộc kiến trúc tự động trên CI, điều hành design review cho thay đổi chạm kiến trúc, trả lời câu hỏi thiết kế của dev, và quản lý sổ nợ kỹ thuật có chủ có hạn. Kích hoạt khi người dùng nói "chuẩn code", "architecture guideline", "reference implementation", "dev hỏi về thiết kế", "review thiết kế", "kiểm thử kiến trúc", "ArchUnit", "fitness function", "nợ kỹ thuật", "tech debt", "code không đúng kiến trúc", "lệch so với thiết kế". Input là SAD/ADR đã qua AG2; output vào sa-output/<PROJECT>/03-enablement/ và phải qua Gate AG3 (Build conformance) trước khi go-live.
|
||||
description: Giai đoạn 3 của quy trình Solution Architect — đồng hành cùng team trong lúc thi công. Dùng để lập gói bàn giao dev (HANDOFF - mục lục mọi đặc tả/contract/schema/ADR theo đường dẫn thật, checklist đủ-thiếu, dev ký đã nhận), biến kiến trúc thành thứ dev dùng được (architecture guideline, reference implementation, skeleton), dựng fitness function kiểm thử ràng buộc kiến trúc tự động trên CI, điều hành design review cho thay đổi chạm kiến trúc, trả lời câu hỏi thiết kế của dev, và quản lý sổ nợ kỹ thuật có chủ có hạn. Kích hoạt khi người dùng nói "bàn giao cho dev", "gói bàn giao", "handoff", "dev cần đọc gì", "chuẩn code", "architecture guideline", "reference implementation", "dev hỏi về thiết kế", "review thiết kế", "kiểm thử kiến trúc", "ArchUnit", "fitness function", "nợ kỹ thuật", "tech debt", "code không đúng kiến trúc", "lệch so với thiết kế". Input là SAD/ADR đã qua AG2; output vào sa-output/<PROJECT>/03-enablement/ và phải qua Gate AG3 (Build conformance) trước khi go-live.
|
||||
---
|
||||
|
||||
# GĐ3 · ENABLEMENT — Đồng hành thi công
|
||||
@@ -8,7 +8,7 @@ description: Giai đoạn 3 của quy trình Solution Architect — đồng hàn
|
||||
Mục tiêu duy nhất: **kiến trúc trên giấy trở thành kiến trúc trong code** — và ở lại đó khi
|
||||
người viết tài liệu không còn ngồi cạnh.
|
||||
|
||||
Output: `AGD` · `FIT` · `DREV` · `TDEBT` trong `sa-output/<PROJECT>/03-enablement/`
|
||||
Output: `HANDOFF` · `AGD` · `FIT` · `DREV` · `TDEBT` trong `sa-output/<PROJECT>/03-enablement/`
|
||||
|
||||
## Bốn nguyên tắc bất di bất dịch
|
||||
|
||||
@@ -30,13 +30,36 @@ Nạp thêm: `../sa-lifecycle/references/design-rules.md` (đặc biệt `D8`)
|
||||
source code hiện có, cấu hình CI, `ba-output/…/03-specification/` (`SRS`).
|
||||
2. **Kiểm AG2** — `SAD` đã `✅ Baselined` chưa, Security và SRE đã ký chưa? Chưa ⇒ báo rõ:
|
||||
ban hành guideline dựa trên kiến trúc chưa chốt sẽ phải ban hành lại.
|
||||
3. **Chọn phạm vi** — `--focus agd|fit|review|debt`. Ban hành guideline và dựng fitness
|
||||
function là hai việc khác nhau về khối lượng.
|
||||
3. **Chọn phạm vi** — `--focus handoff|agd|fit|review|debt`. Ban hành guideline và dựng fitness
|
||||
function là hai việc khác nhau về khối lượng. `handoff` chạy **đầu tiên**, ngay khi AG2 ký, và
|
||||
chạy lại mỗi khi phạm vi bàn giao (US/module) mở rộng.
|
||||
4. **Hỏi người dùng** xác nhận ba điểm trên.
|
||||
|
||||
Bỏ bước dừng khi lệnh có `go`.
|
||||
|
||||
## Thực hiện — 4 hoạt động
|
||||
## Thực hiện — 5 hoạt động
|
||||
|
||||
### 0 — Gói bàn giao dev `HANDOFF` *(`--focus handoff`)*
|
||||
|
||||
Điền `templates/dev-handoff.md`. **Không có nội dung mới** — chỉ đường dẫn thật + version + status
|
||||
chép từ header, để dev trả lời được một câu: *"tôi cần đọc gì, ở đâu, bản nào, ai ký, còn thiếu gì?"*
|
||||
|
||||
Ba việc:
|
||||
|
||||
1. **Điền checklist §2** cho phạm vi bàn giao (US/module/release): 9 dòng bộ BA (`BACKLOG`, `BR`,
|
||||
`RBAC`, `SRS`/`AC` **mỗi US**, `NFR`, `API`, artifact design nếu `screen`, `RTM`) + 14 dòng bộ SA
|
||||
(`QAS`, `SAD`, `ADR`, `ICD`, **`CTR` file thật**, `DOM`, `DAT`, **`PDM` + DDL/migration**, `SEC`, `INF`,
|
||||
`FAIL`, `AGD` + reference implementation, `FIT`, sơ đồ đã deliver). Mở từng file, chép `Version`/
|
||||
`Status` **thật**; không có file ⇒ để ☐ và ghi thiếu, **không ghi "dự kiến"**.
|
||||
2. **§2.3 việc dev tự quyết** — liệt kê đích danh để không ai tưởng đã có (đặt tên, thư viện tiện ích…).
|
||||
3. **§3 `OQ` chặn hành vi** — US còn `OQ` về hành vi ⇒ **loại khỏi gói**, ghi rõ; §4 kênh hỏi và SLA
|
||||
trả lời (BA 1 ngày · SA 2 ngày).
|
||||
|
||||
🔴 **Gói bàn giao có dòng ☐ ở §2.1 hàng 4–5 (SRS/AC) hoặc §2.2 hàng 14, 17 (`CTR`, `PDM`) là gói chưa
|
||||
bàn giao được** — dev sẽ phải tự đoán contract và schema, đúng hai chỗ tốn nhất để sửa sau.
|
||||
|
||||
Người điều phối chạy `node .claude/skills/sa-3-enablement/scripts/handoff-check.mjs --handoff <file>`
|
||||
(H1–H5) và chép kết quả vào §5. Tech Lead + đại diện Dev BE/FE/QA ký §6 "đã nhận".
|
||||
|
||||
### 1 — Architecture Guidelines `AGD` *(`--focus agd`)*
|
||||
|
||||
@@ -55,6 +78,7 @@ cách kiểm (`FIT-nn` hoặc `⚠️ Khuyến nghị`).
|
||||
| Reference implementation phải thể hiện | Vì sao |
|
||||
|---|---|
|
||||
| Cấu trúc module chuẩn | Dev copy cấu trúc, không copy nhầm |
|
||||
| Chạy migration của `PDM` và stub/client sinh từ `CTR` | Schema và contract có một nguồn sự thật, không chép tay |
|
||||
| Xử lý lỗi và mã lỗi theo `ICD` | Thống nhất từ file đầu tiên |
|
||||
| Log có correlation id | Thêm sau rất tốn |
|
||||
| Gọi phụ thuộc ngoài có timeout/retry theo `FAIL` | Đây là chỗ dev hay tự bịa nhất |
|
||||
@@ -146,6 +170,8 @@ không chấp nhận ước lượng.
|
||||
|
||||
**④ Danh sách `TD-nn` mới phát sinh** kèm chủ và hạn.
|
||||
|
||||
**⑤ Trạng thái `HANDOFF`** — số dòng ✅/☐ ở §2, US bị loại khỏi gói vì `OQ`, ai đã ký §6.
|
||||
|
||||
Rồi nhắc người dùng: AG3 cần **Tech Lead + QA + SRE ký**.
|
||||
|
||||
## Bẫy thường gặp
|
||||
|
||||
76
.claude/skills/sa-3-enablement/scripts/handoff-check.mjs
Normal file
76
.claude/skills/sa-3-enablement/scripts/handoff-check.mjs
Normal file
@@ -0,0 +1,76 @@
|
||||
#!/usr/bin/env node
|
||||
// handoff-check.mjs — kiểm gói bàn giao DEV (HANDOFF): mọi đường dẫn ở §2 tồn tại, header khớp
|
||||
// Version/Status, không còn "dự kiến". Chỉ Node ≥ 18, không phụ thuộc gói ngoài. Exit 1 khi có 🔴.
|
||||
//
|
||||
// node handoff-check.mjs --handoff <HANDOFF_….md> [--root <thư mục gốc dự án>] [--json]
|
||||
//
|
||||
// Phép kiểm:
|
||||
// H1 mọi ô "Đường dẫn" ở bảng §2.1/§2.2 có ≥1 đường dẫn thật (không rỗng, không "…", không "dự kiến")
|
||||
// H2 đường dẫn tồn tại (hỗ trợ glob * đơn giản trong tên file)
|
||||
// H3 với file .md: Version/Status trong header khớp ô Version/Status của bảng
|
||||
// H4 dòng gate AG2/G3 mà Status không phải 🔵/✅ ⇒ 🟠 (bàn giao trên bản Draft)
|
||||
// H5 file contract (.yaml) và migration (.sql) được tham chiếu tồn tại; migration có file .down.sql
|
||||
import fs from 'node:fs'
|
||||
import path from 'node:path'
|
||||
|
||||
const args = process.argv.slice(2)
|
||||
const opt = {}
|
||||
for (let i = 0; i < args.length; i++) { const a = args[i]; if (a.startsWith('--')) { const k = a.slice(2); const nxt = args[i + 1]; if (nxt && !nxt.startsWith('--')) { opt[k] = nxt; i++ } else opt[k] = true } }
|
||||
if (!opt.handoff) { console.error('Thiếu --handoff <HANDOFF.md>'); process.exit(2) }
|
||||
const root = path.resolve(opt.root || process.cwd())
|
||||
const out = []; let red = 0
|
||||
const ok = (id, msg) => out.push({ id, status: '✅', msg })
|
||||
const warn = (id, msg) => out.push({ id, status: '🟠', msg })
|
||||
const bad = (id, msg) => { red++; out.push({ id, status: '🔴', msg }) }
|
||||
const text = fs.readFileSync(opt.handoff, 'utf8')
|
||||
|
||||
const expand = (p) => {
|
||||
// glob * chỉ ở tên file
|
||||
const abs = path.isAbsolute(p) ? p : path.join(root, p)
|
||||
if (!abs.includes('*')) return fs.existsSync(abs) ? [abs] : []
|
||||
const dir = path.dirname(abs); const re = new RegExp('^' + path.basename(abs).replace(/[.+^${}()|[\]\\]/g, '\\$&').replace(/\*/g, '.*') + '$')
|
||||
if (!fs.existsSync(dir)) return []
|
||||
return fs.readdirSync(dir).filter((f) => re.test(f)).map((f) => path.join(dir, f))
|
||||
}
|
||||
const header = (file) => {
|
||||
const t = fs.readFileSync(file, 'utf8').slice(0, 4000)
|
||||
const v = (t.match(/\|\s*\*\*Version\*\*\s*\|\s*([^|\n]+)\|/) || [])[1]
|
||||
const s = (t.match(/\|\s*\*\*Status\*\*\s*\|\s*([^|\n]+)\|/) || [])[1]
|
||||
return { version: v && v.trim(), status: s && s.trim() }
|
||||
}
|
||||
|
||||
// bảng §2.x: | # | Cần có | Đường dẫn | Version | Status | Gate | ✅/☐ |
|
||||
const sec2 = text.split(/^## 2\./m)[1]?.split(/^## 3\./m)[0] || ''
|
||||
const rows = [...sec2.matchAll(/^\|\s*(\d+)\s*\|([^\n]*)$/gm)]
|
||||
if (!rows.length) bad('H1', 'Không đọc được bảng §2 (dòng bắt đầu bằng | <số> |)')
|
||||
let checked = 0
|
||||
for (const r of rows) {
|
||||
const cells = r[2].split('|').map((c) => c.trim())
|
||||
const [need, pathsCell, version, status, gate] = cells
|
||||
const label = `#${r[1]} ${need}`
|
||||
if (!pathsCell || /^(…|\.\.\.|-|—)?$/.test(pathsCell) || /dự kiến|sẽ có|TBD|TODO/i.test(pathsCell)) { bad('H1', `${label}: chưa có đường dẫn thật ("${pathsCell || ''}")`); continue }
|
||||
const paths = [...pathsCell.matchAll(/`([^`]+)`/g)].map((m) => m[1]).filter((p) => !/^…/.test(p))
|
||||
if (!paths.length) { bad('H1', `${label}: ô đường dẫn không có \`đường/dẫn\` nào`); continue }
|
||||
for (const p of paths) {
|
||||
if (/…/.test(p)) { bad('H1', `${label}: đường dẫn còn "…" — ${p}`); continue }
|
||||
const found = expand(p)
|
||||
if (!found.length) { bad('H2', `${label}: không tồn tại — ${p}`); continue }
|
||||
checked++
|
||||
for (const f of found.slice(0, 5)) {
|
||||
if (/\.md$/i.test(f)) {
|
||||
const h = header(f)
|
||||
if (version && version !== '—' && version !== '' && h.version && !h.version.startsWith(version)) bad('H3', `${label}: Version bảng "${version}" ≠ header "${h.version}" (${path.basename(f)})`)
|
||||
if (status && status !== '—' && h.status && !h.status.includes(status.replace(/[^🟡🟠🔵✅📦]/g, '') || status)) bad('H3', `${label}: Status bảng "${status}" ≠ header "${h.status}" (${path.basename(f)})`)
|
||||
if (/AG2|G3/.test(gate || '') && h.status && !/🔵|✅/.test(h.status)) warn('H4', `${label}: bàn giao trên bản ${h.status} (${path.basename(f)}) — gate ${gate} chưa qua`)
|
||||
}
|
||||
if (/\.sql$/i.test(f) && !/\.down\.sql$/i.test(f)) { const down = f.replace(/\.sql$/i, '.down.sql'); if (!fs.existsSync(down)) bad('H5', `${label}: migration ${path.basename(f)} không có ${path.basename(down)}`) }
|
||||
}
|
||||
}
|
||||
}
|
||||
if (checked) ok('H2', `${checked} đường dẫn tồn tại`)
|
||||
const duKien = (text.match(/dự kiến|sẽ có sau/gi) || []).length
|
||||
if (duKien) bad('H1', `HANDOFF còn ${duKien} chỗ "dự kiến/sẽ có sau"`)
|
||||
|
||||
if (opt.json) console.log(JSON.stringify({ red, results: out }, null, 2))
|
||||
else { for (const r of out) console.log(`${r.status} ${r.id} ${r.msg}`); console.log(`\n${red ? `🔴 ${red} lỗi` : '✅ Không có lỗi 🔴'} — ${out.filter((r) => r.status === '🟠').length} cảnh báo 🟠`) }
|
||||
process.exit(red ? 1 : 0)
|
||||
116
.claude/skills/sa-3-enablement/templates/dev-handoff.md
Normal file
116
.claude/skills/sa-3-enablement/templates/dev-handoff.md
Normal file
@@ -0,0 +1,116 @@
|
||||
# HANDOFF — Gói bàn giao DEV — <PROJECT> · <phạm vi: US / module / release>
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| **Version** | 1.0 |
|
||||
| **Date** | YYYY-MM-DD |
|
||||
| **Author** | <SA> (skill sa-3-enablement) |
|
||||
| **Status** | 🟡 Draft |
|
||||
| **Approved by** | Tech Lead: — · Dev BE: — · Dev FE: — · QA: — *(ký "đã nhận và đọc")* |
|
||||
| **Source** | INDEX của BA và SA · mọi artifact liệt kê ở §2 |
|
||||
| **Scope** | |
|
||||
| **Confidence** | 🟢 *(chỉ là mục lục — 🔴 nếu còn dòng "dự kiến")* |
|
||||
|
||||
## Change Log
|
||||
|
||||
| Version | Date | Người sửa | Thay đổi |
|
||||
|---|---|---|---|
|
||||
| 1.0 | | | Bản đầu |
|
||||
|
||||
> **Tài liệu này không có nội dung mới.** Nó trả lời đúng một câu cho dev: *"tôi cần đọc gì, ở đâu,
|
||||
> bản nào, đã được ai ký, và còn thiếu gì?"* Mọi dòng là đường dẫn thật + version + status chép từ
|
||||
> header. Dòng nào ghi "dự kiến"/"sẽ có" ⇒ gói chưa bàn giao được.
|
||||
|
||||
---
|
||||
|
||||
## 1. Đọc theo vai
|
||||
|
||||
| Bạn là | Đọc theo thứ tự | Rồi mở |
|
||||
|---|---|---|
|
||||
| Dev BE | `AGD` §2 reference implementation → `CTR` (OpenAPI của module) → `PDM` §2 + `schema/` → `SRS` PART 2 + `AC` của US → `FAIL` §2 | `ADR` liên quan trong `SAD` §8 |
|
||||
| Dev FE | `SRS` §2 (màn hình, bảng field) + `WF`/`HIFI`/`DSPEC` → `UICONV` + `DS` → `CTR` (OpenAPI) → `ICD` §6 hành vi khi API lỗi | `AC` |
|
||||
| QA | `AC` + `SRS` §3, §4.1 (mã lỗi) → `QAS` (bài đo) → `CTR` (contract test) → `FIT` | `RBAC`, `BR` |
|
||||
| DevOps/SRE | `INF` → `FAIL` → `PDM` §4 migration → `AGD` §5 log/metric | `ADR` hạ tầng |
|
||||
|
||||
---
|
||||
|
||||
## 2. Checklist bàn giao — mọi dòng phải ✅ bằng đường dẫn thật
|
||||
|
||||
### 2.1 Nghiệp vụ và đặc tả (bộ BA)
|
||||
|
||||
| # | Cần có | Đường dẫn | Version | Status | Gate | ✅/☐ |
|
||||
|---|---|---|---|---|---|---|
|
||||
| 1 | `PROFILE` + `INDEX` BA | `ba-output/<P>/00-index/…` | | | — | ☐ |
|
||||
| 2 | `BACKLOG` — US trong phạm vi bàn giao | `…/02-analysis/BACKLOG_…` | | | G2 | ☐ |
|
||||
| 3 | `BR` + `RBAC` | `…/02-analysis/BR_…`, `RBAC_…` | | | G2 | ☐ |
|
||||
| 4 | `SRS` **mỗi US** trong phạm vi | `…/03-specification/SRS_<US>_…` | | | G3 | ☐ |
|
||||
| 5 | `AC` mỗi US, đủ nhánh lỗi | `…/03-specification/AC_<US>_…` | | | G3 | ☐ |
|
||||
| 6 | `NFR` | | | | G3 | ☐ |
|
||||
| 7 | `API` (đề xuất của BA) — đã đối chiếu `CTR` §3 | | | | G3 | ☐ |
|
||||
| 8 | *(screen)* `UICONV`, `WF`, `DS`, `HIFI`, `DSPEC` | | | | G3 | ☐ |
|
||||
| 9 | `RTM` coverage US→AC 100% | `…/00-index/RTM_…` | | | G3 | ☐ |
|
||||
|
||||
### 2.2 Kiến trúc và thiết kế kỹ thuật (bộ SA)
|
||||
|
||||
| # | Cần có | Đường dẫn | Version | Status | Gate | ✅/☐ |
|
||||
|---|---|---|---|---|---|---|
|
||||
| 10 | `QAS` — có "đo bằng cách nào" cho mọi Must | `sa-output/<P>/02-architecture/QAS_…` | | | AG2 | ☐ |
|
||||
| 11 | `SAD` — C4 Container + bảng `CMP` + deployment | | | | AG2 | ☐ |
|
||||
| 12 | `ADR` Accepted liên quan phạm vi (liệt kê ID) | `…/adr/ADR-…` | — | Accepted | AG2 | ☐ |
|
||||
| 13 | `ICD` — mọi `IF` của phạm vi | | | | AG2 | ☐ |
|
||||
| 14 | **`CTR` + file contract thật** (OpenAPI/AsyncAPI, lint pass) | `…/contracts/openapi/<module>.yaml` | | | AG2 | ☐ |
|
||||
| 15 | `DOM` — class diagram bounded context liên quan | | | | AG2 | ☐ |
|
||||
| 16 | `DAT` | | | | AG2 | ☐ |
|
||||
| 17 | **`PDM` + DDL/migration chạy được từ rỗng, có down** | `…/schema/<kho>/V001__…sql` | | | AG2 | ☐ |
|
||||
| 18 | `SEC` — authn/authz, map `ROLE` → quyền kỹ thuật | | | | AG2 | ☐ |
|
||||
| 19 | `INF` — môi trường dev/stg, cách deploy | | | | AG2 | ☐ |
|
||||
| 20 | `FAIL` — timeout/retry/idempotent cho mọi phụ thuộc phạm vi | | | | AG2 | ☐ |
|
||||
| 21 | `AGD` + **reference implementation chạy được** | `…/03-enablement/AGD_…` · `<repo>/<module mẫu>` | | | AG3 | ☐ |
|
||||
| 22 | `FIT` — bài kiểm đã bật (ít nhất chế độ cảnh báo) | | | | AG3 | ☐ |
|
||||
| 23 | Sơ đồ đã `deliver` (HTML Archify) cho `SAD`, `SRS` sequence | `…/diagrams/*.html` | — | — | — | ☐ |
|
||||
|
||||
### 2.3 Thứ dev còn phải tự quyết — ghi rõ để không ai tưởng đã có
|
||||
|
||||
| Việc | Thuộc ai | Ràng buộc từ tài liệu nào |
|
||||
|---|---|---|
|
||||
| Quy ước đặt tên biến, cấu trúc thư mục ngoài reference implementation | Tech Lead | `AGD` §1 (không quy định) |
|
||||
| Thư viện tiện ích không chạm `ADR` | Dev | `decision-radar.md` điểm < 3 |
|
||||
| | | |
|
||||
|
||||
---
|
||||
|
||||
## 3. Việc còn mở ảnh hưởng thi công
|
||||
|
||||
| `OQ` | Câu hỏi | Ai trả lời | Chặn US/CMP nào | Dev làm gì trong lúc chờ |
|
||||
|---|---|---|---|---|
|
||||
|
||||
🔴 Còn `OQ` chặn **hành vi** của US trong phạm vi ⇒ US đó **không** trong gói bàn giao; ghi rõ.
|
||||
|
||||
---
|
||||
|
||||
## 4. Kênh hỏi và cam kết trả lời
|
||||
|
||||
| Loại câu hỏi | Hỏi ai | Ghi vào | Trả lời trong |
|
||||
|---|---|---|---|
|
||||
| Nghiệp vụ, AC, mã lỗi | BA | `QLOG` (ba-4) | 1 ngày làm việc |
|
||||
| Thiết kế, contract, dữ liệu | SA | `DREV` (sa-3) | 2 ngày làm việc |
|
||||
| Thay đổi phạm vi | PO qua BA | `CR` | theo quy trình CR |
|
||||
|
||||
---
|
||||
|
||||
## 5. Kiểm bằng máy *(người điều phối chạy, chép kết quả)*
|
||||
|
||||
| Kiểm | Lệnh | Kết quả |
|
||||
|---|---|---|
|
||||
| Mọi đường dẫn §2 tồn tại và header khớp version/status | `node .claude/skills/sa-3-enablement/scripts/handoff-check.mjs --handoff <file>` | ☐ |
|
||||
| `IF` → `CTR` 100%, `DAT` → `PDM` 100% | `sa-conformance --mode full` | ☐ |
|
||||
| Sơ đồ Archify validate | `diagram-check.mjs --md <SAD> --md <SRS…>` | ☐ |
|
||||
|
||||
## 6. Xác nhận đã nhận
|
||||
|
||||
| Vai | Tên | Ngày | Ghi chú |
|
||||
|---|---|---|---|
|
||||
| Tech Lead | | | |
|
||||
| Dev BE | | | |
|
||||
| Dev FE | | | |
|
||||
| QA | | | |
|
||||
Reference in New Issue
Block a user