# spec — vá đội STYLE 3 vai theo SETUP-REVIEW (S176, 06-08-2026)

> Engine `/fable-real reviewer` run `wf_264fb5c2-0db` → verdict **`SETUP-REVIEW: SỬA-6`**. Nền thiết-kế **ĐỨNG VỮNG, KHÔNG BÁC**.
> 🔴 Spec do **LEAD ghi SAU khi verify** (honest-note (c)). Run chấm/verify vẫn sinh spec (honest-note (d)).

---

## ① Tính-năng / đề-bài

Vá 6 điểm engine bắt trong cách cài đặt đội STYLE 3 vai (`front-end-reviewer-style` · `back-end-reviewer-style` · `database-reviewer-style`, land `090ab1c`), **giữ nguyên nền**: production-làm-chuẩn đo bằng TREE · 3 địa-phận rời · trục ĐỒNG-NHẤT ⟂ ĐÚNG-SAI của `reviewer`.

🔴 **SỬA-1 là điểm sống-chết:** thước dispatch mù working-tree ⇒ đội **chết câm** đúng use-case chính (review TRƯỚC commit). Không vá thì 3 persona chỉ là chi-phí.

## ② Cách implement

| # | Mức | Vá gì | Ở đâu |
|---|---|---|---|
| **1** | 🔴 TRUNG-CAO | Thước dispatch: `git diff --name-only origin/main...HEAD` (ba-chấm, **mù uncommitted + untracked**) → **`git diff --name-only origin/main`** (2-chấm) **∪** `git status --porcelain` lọc `??`. Thêm câu CẤM ba-chấm làm thước dispatch | `agents/README.md:68` · `front-end-reviewer-style.md:30` · `back-end-reviewer-style.md:27` · `database-reviewer-style.md:26` |
| **2** | VỪA | Câu "mọi thứ CÒN LẠI trên `origin/main` = ĐÃ PRODUCTION" quá rộng 2 vế: (a) `deploy.yml:20-27` `paths-ignore` (docs/** · **/*.md · .claude/** · scripts/**.md) **chưa từng deploy** ⇒ thêm *"= CHUẨN trong địa-phận glob của mày"*; (b) cửa-sổ deploy-FAIL ⇒ thêm *"wal/cicd lần push gần nhất KHÔNG có `deploy VERIFIED` ⇒ lùi mốc chuẩn về commit VERIFIED gần nhất"* | fe:31 · be:28 · db:27 |
| **3** | VỪA | Miễn-trừ thành **dấu-cao-su**: 2/3 nguồn (commit-message · WAL) do **chính lead** viết, format chỉ đòi CON-TRỎ. Đổi thành: **PHẢI trích NGUYÊN VĂN lời anh ≤1 dòng + con-trỏ**; xếp hạng `prompt/_context "> anh:"` (mạnh) > `WAL có ngày` (vừa) > `commit message` (yếu — chỉ nhận khi chứa trích nguyên văn; *"theo yêu cầu anh"* trống = **KHÔNG TÍNH, vẫn FLAG**) | fe:49-52 · be:47 · db:43 |
| **4** | VỪA | Thách-CLEAN nhánh `DAT` **bẻ được** (chỉ đòi "nêu 1 khối khớp", không bắt neo). Áp khuôn `db` cho cả 3: **cặp neo `file:line ⇄ file:line`** (bản mới ⇄ bản production) **+ 1 chi-tiết khớp CỤ THỂ** (tên prop/banner/badge/cột). Thiếu neo ⇒ **coi như CHƯA SOI, lead từ chối nhận `DAT`** | fe:111 · be:90 · (db:85 đã đạt — làm mẫu) |
| **5a** | 🔴 THẬT | **Seed 3 dir `agent-memory/<vai>/` + MEMORY.md mồi** rồi re-run `measure-agent-memory.ps1`. Hiện `ls agent-memory` = 23 dir, thiếu cả 3 ⇒ máy enumerate theo DIR ⇒ **3 vai vô hình câm** trong đo/budget (class *vắng-mặt trông giống ổn*). **Lead đã tự đo lại: 3/3 THIẾU — CONFIRMED** | `.claude/agent-memory/` |
| **5b** | VỪA | Khai lỗ **CHỌN CHỦ ĐÍCH**: ngoài 3 glob (`tests/` `scripts/` `.gitea/` `docs/` `.claude/`) **+ seam FE↔BE** (DTO⟂type · route string · `MenuKeys.cs`⟂`menuKeys.ts`) = **0 vai style soi** — thuộc `reviewer`/lead | `agents/README.md` §RULE |
| **5c** | VỪA | `README:67` ra lệnh *"MỖI LƯỢT REVIEW gọi THÊM"* mà **không kèm nhãn hiệu-lực**, trong khi `STATUS:476` khai `verified-pending-restart` ⇒ **kẽ giữa 2 doc**. Thêm *"(hiệu-lực sau restart CLI)"* + thêm nhánh style vào decision-tree `:87-155` (hiện chỉ §RULE có) | `agents/README.md:67` + decision-tree |
| **6a** | VỪA | Claim *"BE 0 máy style gác"* bị **chép ra 4 SITE** (be:4 · be:55 · README:71 · STATUS:476) ⇒ cắm `.editorconfig` là **4 chỗ sai cùng lúc**; detector C2/B3 chỉ so SỐ nên **KHÔNG bắt**. Biến thành **PHÉP ĐO per-spawn** trong be §1: *"trước khi tin mục này re-đo 10 giây: `ls .editorconfig; grep -rn 'dotnet format\|EnforceCodeStyleInBuild' .gitea/workflows/ src/Backend/*/*.csproj` — có hit ⇒ mục HẾT HẠN, FLAG lead cập-nhật, KHÔNG tự gánh tiếp"*; rút README:71 thành câu-trỏ; STATUS:476 giữ như lineage có ngày | be:4/55 · README:71 · STATUS:476 |
| **6b** | VỪA | **Lead chép luật vào persona — vi phạm chính B1 viết trong CÙNG file:** `db:32` (PascalCase số nhiều) · `db:34-35` (liệt đủ field `BaseEntity`/`AuditableEntity`) · `db:61` (PK `Id`/FK `{Entity}Id`) trong khi `db:71` CẤM chép · `be:63` (mũi tên 4-layer) trong khi `be:74` CẤM · `fe:4` chép **digits** *"React 19 + Vite 8 + TS 6"* — class **ĐÃ drift thật trong repo**: root `CLAUDE.md` ghi **React 18** vs `package.json` ^19.2.5 · `fe:67` (danh sách "máy BẮT" = chép config ESLint). Đổi ô-chép → **con-trỏ + lệnh-đo**. Riêng tên 3-file migration (`db:4`+`db:51`) = rule bất-biến EF, **chấp nhận giữ** | fe · be · db |

🔸 **Lo hão (engine bác thẳng, ghi để khỏi lo lại):** ① ca **REVERT** — thước là TREE nên tự lành (bằng chứng revert thật `3f339c0`) ② `spawn-model-audit.ps1` · `governance-detectors.ps1` · `mfe-eval.ps1` **enumerate ĐỘNG**, không hardcode ⇒ tự nhận vai mới ③ `roster 26 > WIDTH_CAP 20` — LOUD-skip **có log** `hmw.js:165-169`, không câm; pre-existing từ 23>20 @S153; use-case 1-3 lane không đụng trần. **Chỉ cần nhớ:** xếp 3 vai style **cuối** taskList sweep thì chúng là nhóm bị cắt.

## ③ Checklist (vai · deliverable · acceptance ĐO ĐƯỢC)

| # | Vai | Deliverable | Acceptance (ĐO ĐƯỢC) |
|---|---|---|---|
| C1 | lead | Vá thước dispatch 4 site | `grep -rn 'origin/main\.\.\.HEAD' .claude/agents/ = 0 hit` **VÀ** `grep -c 'git status --porcelain' 3 persona = 3` |
| C2 | lead | Vá 2 vế phạm-vi chuẩn | `grep -c 'paths-ignore\|deploy VERIFIED' fe+be+db ≥ 3` |
| C3 | lead | Miễn-trừ đòi trích nguyên văn | `grep -c 'TRÍCH NGUYÊN VĂN' 3 persona = 3` |
| C4 | lead | Thách-CLEAN đòi cặp neo | `grep -c 'file:line ⇄ file:line' 3 persona = 3` |
| C5a | lead | Seed 3 dir agent-memory | `ls -d .claude/agent-memory/*-reviewer-style \| wc -l = 3` **VÀ** `measure-agent-memory.ps1` in ra đủ 3 vai |
| C5b/c | lead | Khai lỗ + nhãn hiệu-lực + decision-tree | `grep -c 'hiệu-lực sau restart CLI' README ≥ 1` **VÀ** `grep -c 'seam FE↔BE' README ≥ 1` |
| C6a | lead | Claim BE thành phép-đo per-spawn | `grep -c 'HẾT HẠN' back-end-reviewer-style.md ≥ 1` **VÀ** `grep -c '0 máy style' README = 0` (rút thành câu-trỏ) |
| C6b | lead | Ô-chép → con-trỏ | `grep -c 'React 19 + Vite 8' fe = 0` **VÀ** `grep -c 'BaseEntity.cs' db ≥ 1` (trỏ file thay vì liệt field) |
| C7 | `reviewer` | Re-review sau vá | verdict `ĐẠT` hoặc SỬA còn lại đều mức THẤP |

🔴 **Thứ tự bắt buộc:** C1 trước hết (không có nó thì mọi vá khác vô nghĩa — đội không bao giờ được gọi). C5a rẻ nhất, làm cùng lượt.
