docs(agent): bổ sung role fix-dispatcher và siết lại bộ tài liệu agent
- Thêm agent/roles/0_fix_dispatcher.md: phân tier/lane cho từng defect trước khi các agent khác chạy, kèm agent/commands/fix.md và hợp đồng đầu ra agent/output/dispatch_plan.md. - Cập nhật system/guardrail, response_policy, security và các checklist ui/ux/pr_readiness cho khớp luồng mới. - Mở rộng knowledge: i18n_rules, screen_map, theme_tokens, secrets_and_config; cập nhật workflow intake_to_fix và handoff_contract. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -8,6 +8,7 @@ Mọi agent kết thúc lượt bằng khối YAML này, đặt **ngay trên** p
|
||||
defect_id: UI-2026-0907-01 # UI-<YYYYMMDD>-<số thứ tự trong ngày>
|
||||
from_agent: ui-bug-triage
|
||||
next_agent: ui-visual-fixer # xem bảng giá trị hợp lệ bên dưới
|
||||
tier: T2 # T0 | T1 | T2 | T3 | T3-SEC — do fix-dispatcher chấm
|
||||
category: visual # visual | flow | i18n-a11y | security | not-ui
|
||||
severity: S2 # S1 | S2 | S3 | S4
|
||||
confidence: high # low | medium | high
|
||||
@@ -26,6 +27,7 @@ blocked_on: [] # danh sách open question CHẶN bước ti
|
||||
|
||||
| Giá trị | Nghĩa |
|
||||
|---|---|
|
||||
| `fix-dispatcher` | Escalate về hub: vượt phạm vi tier hiện tại, cần chấm lại |
|
||||
| `ui-visual-fixer` / `ux-flow-fixer` / `i18n-a11y-fixer` | Route sang specialist UI |
|
||||
| `security-defect-fixer` | Route sang specialist bảo mật (`category: security`) |
|
||||
| `fix-implementer` | Plan đã sẵn sàng để hiện thực |
|
||||
@@ -50,3 +52,11 @@ blocked_on: [] # danh sách open question CHẶN bước ti
|
||||
`next_agent: security-defect-fixer`; phần UI tách thành `defect_id` riêng, xử lý sau.
|
||||
9. `blocked_on` của role 7 có thể chứa câu hỏi **chính sách** (`needs-security-decision`).
|
||||
Đó là chờ hợp lệ — người trả lời là Cowork Team, không phải agent khác.
|
||||
10. **`tier` chỉ đi lên.** Không agent nào được hạ `tier` trong envelope nhận được. Thấy
|
||||
việc lớn hơn tier đang mang → đặt `next_agent: fix-dispatcher`, ghi lý do vào
|
||||
`blocked_on`, dừng. Hub là chỗ duy nhất được ghi `tier`.
|
||||
11. `tier: T0` mà `next_agent` khác `HUMAN_REVIEW` là mâu thuẫn: T0 không gọi agent nào.
|
||||
`tier: T3-SEC` thì `security_review` **luôn** là `required`.
|
||||
12. `report_id` (nếu có) gom các `defect_id` tách ra từ **cùng một** phản ánh. Nó chỉ để
|
||||
truy vết ngược về người báo lỗi; không dùng nó để gộp PR — một PR vẫn là một
|
||||
`defect_id` (`guardrail.md` G8).
|
||||
|
||||
@@ -1,12 +1,37 @@
|
||||
# Workflow — từ phản ánh của người dùng tới PR
|
||||
|
||||
## 1. Pipeline
|
||||
## 0. Lane theo tier — đọc trước
|
||||
|
||||
Pipeline dưới đây là **lane FULL (T3)**, không phải mặc định. `0_fix_dispatcher` chấm tier
|
||||
trước và cắt bớt bước:
|
||||
|
||||
| Tier | Lane | Bước thực chạy | Gọi agent |
|
||||
|---|---|---|---|
|
||||
| **T0** | DIRECT | hub sửa → 4 cổng máy (`roles/0_fix_dispatcher.md` §4.1) | 0 |
|
||||
| **T1** | SOLO | hub triage inline → **5** → hub review bằng `checklist/ui_review.md` | 1 |
|
||||
| **T2** | PAIR | hub triage inline → **2/3/4** → **5** → **6** | 3 |
|
||||
| **T3** | FULL | **1** → **2/3/4** → **5** → **6** | 4–5 |
|
||||
| **T3-SEC** | FULL-SEC | **7** → *(Cowork Team)* → **5** → **6** | 3 + chờ người |
|
||||
|
||||
Bỏ bước nào cũng phải **nêu rõ trong `dispatch_plan`** cổng nào thay thế. Bước **6** chỉ
|
||||
được bỏ ở T0 và T1.
|
||||
|
||||
## 1. Pipeline (lane FULL)
|
||||
|
||||
```text
|
||||
Người dùng báo lỗi (chat / issue / miệng)
|
||||
│
|
||||
▼
|
||||
┌───────────────────────────┐
|
||||
│ 0. fix-dispatcher HUB │ → dispatch_plan.md
|
||||
│ Router │ + tách N defect_id + tier + lane
|
||||
└───────────┬───────────────┘
|
||||
│ T0 → hub tự sửa, KHÔNG đi tiếp
|
||||
│ T1 → nhảy thẳng xuống bước 5
|
||||
│ T2 → nhảy thẳng xuống bước 2/3/4
|
||||
│ T3 → đi tiếp bước 1
|
||||
▼
|
||||
┌───────────────────────────┐
|
||||
│ 1. ui-bug-triage │ → defect_record.md
|
||||
│ Planner │ + category + severity + confidence
|
||||
└───────────┬───────────────┘
|
||||
@@ -39,6 +64,7 @@
|
||||
|
||||
| Agent | Đọc | Sửa file | Chạy lệnh | Quyết định |
|
||||
|---|---|---|---|---|
|
||||
| 0. dispatcher | ✅ | ✅ **chỉ ở T0** | ✅ (grep, gate) | tier + lane + tách defect |
|
||||
| 1. triage | ✅ | ❌ | ✅ (grep, tra manifest) | phân loại + route |
|
||||
| 2/3/4. specialist | ✅ | ❌ | ✅ (đọc, kiểm LOC) | nguyên nhân gốc + phương án |
|
||||
| 7. security | ✅ | ❌ | ✅ (đọc, `git log -S`) | lỗ hổng + migration; **không** quyết chính sách |
|
||||
@@ -48,12 +74,19 @@
|
||||
|
||||
Chỉ **một** agent được sửa file. Ranh giới này là thứ giữ cho pipeline review được.
|
||||
|
||||
Ngoại lệ duy nhất là hub ở **T0**, và nó bị bó rất chặt để đổi lại: danh sách đóng 6 loại
|
||||
thay đổi, 9 disqualifier, trần ≤ 2 file / ≤ 10 dòng, và 4 cổng máy bắt buộc dán output thật.
|
||||
Vượt bất kỳ ràng buộc nào → `git checkout --` rồi chấm lại T2. Hub **không** được sửa file ở
|
||||
T1/T2/T3 — ở đó nó chỉ điều phối và (ở T1) review, vì reviewer không được là người viết patch.
|
||||
|
||||
## 3. Cổng chuyển bước
|
||||
|
||||
Không bước nào được đi tiếp nếu chưa đạt:
|
||||
|
||||
| Từ → Đến | Điều kiện |
|
||||
|---|---|
|
||||
| 0 → bất kỳ | Mỗi defect_id có đúng 1 tier + 1 lane, tier ≠ T0 dẫn được về một dòng cụ thể của Bước 3, đã xét override bảo mật trước |
|
||||
| 0 → tự sửa (T0) | Trúng danh sách đóng, 0 disqualifier, Gate S + blast radius đã **đo bằng lệnh** |
|
||||
| 1 → 2/3/4 | `confidence >= medium`, có ít nhất một `file:line`, đã redact |
|
||||
| 2/3/4 → 5 | Đúng **một** nguyên nhân gốc, có cách kiểm chứng, không vượt 400 LOC (hoặc đã có kế hoạch tách) |
|
||||
| 7 → 5 | Như trên, **cộng thêm**: có đường di trú cho cả 4 nhóm người dùng, và 4 câu chính sách đã có đáp án của Cowork Team |
|
||||
@@ -65,27 +98,49 @@ Không bước nào được đi tiếp nếu chưa đạt:
|
||||
## 4. Vòng lặp và giới hạn
|
||||
|
||||
- FAIL ở bước 6 → về bước 5 (lỗi hiện thực) hoặc về 2/3/4 (sai nguyên nhân gốc).
|
||||
- **Tier +1 mỗi lần FAIL.** Chạy lại ở nguyên tier cũ là lỗi điều phối: hai lần thất bại ở
|
||||
cùng độ sâu gần như luôn có nghĩa là hồ sơ lỗi sai từ đầu.
|
||||
- Tier chỉ đi **lên**. Không có đường hạ tier giữa dòng, kể cả khi diff hoá ra nhỏ.
|
||||
- Quá **2 vòng** mà vẫn FAIL → dừng, đưa người thật vào. Vòng thứ ba thường có nghĩa là
|
||||
`defect_record` sai từ đầu, không phải bản vá sai.
|
||||
|
||||
## 5. Đường tắt hợp lệ
|
||||
|
||||
| Tình huống | Đường tắt |
|
||||
|---|---|
|
||||
| Lỗi chính tả một chuỗi, đã biết chính xác key | 1 → 4 → 5 → 6, bỏ giai đoạn điều tra ở bước 4 |
|
||||
| Thiếu key i18n, UI hiện ra `a.b_c` | 1 → 4 → 5 → 6 |
|
||||
| Lỗi do chính bản vá vừa merge | về thẳng 5 nếu nguyên nhân gốc chưa đổi |
|
||||
| Dev báo thẳng một lỗ hổng, không qua triệu chứng giao diện | vào thẳng 7, bỏ bước 1 |
|
||||
Đây là các đường tắt hub được phép chọn ở Bước 3. Chúng **thay thế** phần "đường tắt" của
|
||||
bộ v1.2 — trước đây tự phát, giờ có tier và có cổng bù.
|
||||
|
||||
Không có đường tắt nào bỏ qua bước **6**.
|
||||
| Tình huống | Tier | Đường tắt |
|
||||
|---|---|---|
|
||||
| Nới một số đo hiển thị (px, margin, spacing) | T0 | hub sửa, 0 agent |
|
||||
| Sai chính tả / sai dấu một chuỗi đã có key | T0 | hub sửa, đủ 3 ngôn ngữ, **vẫn phải có test** |
|
||||
| Đổi token màu có sẵn sang token có sẵn | T0 | hub sửa, 0 agent |
|
||||
| Thiếu key i18n, UI hiện ra `a.b_c`, đã biết file | T1 | 5 → hub review |
|
||||
| Nguyên nhân gốc đã có `file:line` từ người báo (dev) | T1 | 5 → hub review |
|
||||
| Chạm QSS/token dùng chung, phải kiểm 2 theme | T2 | 4 (hoặc 2) → 5 → 6 |
|
||||
| Lỗi do chính bản vá vừa merge | T3 | đủ pipeline — regression nghĩa là nguyên nhân gốc lần trước sai |
|
||||
| Dev báo thẳng một lỗ hổng | T3-SEC | vào thẳng 7, bỏ bước 1 |
|
||||
|
||||
Bước **6** chỉ được bỏ ở T0 và T1. Ở T0 nó được thay bằng 4 cổng máy; ở T1 nó được thay bằng
|
||||
hub review với `checklist/ui_review.md` (hợp lệ vì hub không viết patch ở T1). Ở T2/T3/T3-SEC
|
||||
không có đường tắt nào bỏ qua bước 6.
|
||||
|
||||
## 6. Chạy bằng Claude Code
|
||||
|
||||
```bash
|
||||
mkdir -p .claude/agents && cp agent/roles/*.md .claude/agents/
|
||||
mkdir -p .claude/agents .claude/commands
|
||||
cp agent/roles/[1-7]_*.md .claude/agents/
|
||||
cp agent/commands/fix.md .claude/commands/
|
||||
```
|
||||
|
||||
Rồi lần lượt:
|
||||
`.claude/` nằm trong `.gitignore` (dòng 109) nên phải cài lại trên mỗi clone — `agent/`
|
||||
là bản gốc. `0_fix_dispatcher.md` không copy sang `agents/`: hub chạy ở session chính vì
|
||||
subagent không gọi được subagent. Điểm vào:
|
||||
|
||||
```text
|
||||
> /fix màn Folder kéo to ra thì mất cây thư mục bên trái
|
||||
```
|
||||
|
||||
Hub in `dispatch_plan` rồi tự chạy lane. Muốn chạy tay lane FULL:
|
||||
|
||||
```text
|
||||
> dùng ui-bug-triage cho phản ánh này: "màn Folder kéo to ra thì mất cây thư mục bên trái"
|
||||
@@ -94,4 +149,5 @@ Rồi lần lượt:
|
||||
> dùng regression-reviewer với patch vừa rồi
|
||||
```
|
||||
|
||||
Chạy tuần tự, không song song — mỗi bước phụ thuộc output của bước trước.
|
||||
Các bước trong **một** `defect_id` chạy tuần tự — mỗi bước phụ thuộc output của bước trước.
|
||||
Các `defect_id` **độc lập** thì chạy song song được, gọi trong cùng một message.
|
||||
|
||||
Reference in New Issue
Block a user