Files
solution-erp/.claude/agents/README.md
pqhuy1987 090ab1cdfd [CLAUDE] Skill: doi STYLE 3 vai — production-la-chuan (anh chot S176)
Anh giao truc tiep, ly do do duoc: "may cu lam di lam lai hoai".
Luat loi anh dat: "cac tinh nang da deploy thanh production roi thi se la
chuan, tru khi tao co dieu chinh lai lan nua".

Ca THAT lam anh neu — S176 vong-4b: lead dung thung rac KHKK thieu banner do
+ thieu dau "xoa ~", trong khi man thung rac Duyet NCC DA CHAY PROD co du ca
hai. Anh phai tu chup man PE gui sang bao "anh chi la mau". Mot luot lam lai
dang le khong can, vi ban chuan da nam san trong repo.

3 vai (khong phai 4 — anh neu 4 roi tu chot lai 3: "3 con tao nham" +
"chot theo y may"). Con clean-code-reviewer-style bi bo vi no phu chong ca 3
con kia nen KHONG viet noi cau scope-roi ma roster nay bat buoc; truc
clean-code (dat ten, trung lap, mat-do comment, pattern drift) gop vao tung
con trong dia phan cua no.

- front-end-reviewer-style : fe-admin/src/** + fe-user/src/**
- back-end-reviewer-style  : src/Backend/** TRU Persistence/**
- database-reviewer-style  : Persistence/** + ten bang/cot/index

Thiet ke:
- "Production = chuan" DO DUOC, khong phai khau hieu: repo auto-deploy main
  => `git diff origin/main...HEAD` = phan MOI; phan con lai tren origin/main
  = da production = chuan. Moi vai phai DI TIM ANH EM DA CHAY THAT roi doi
  chieu, va bao cao PHAI neu file:line cua ban chuan do.
- Ve "tru khi tao dieu chinh lai" = MIEN-TRU co dieu kien: bang chung owner
  phai CHI DUOC RA (prompt / _context FLOW dong "> anh:" / commit / WAL),
  KHONG duoc suy. Khong thay => van FLAG kem "(chua thay bang-chung owner)".
  Sai ve phia hoi thua, khong ve phia im lang de lot.
- Truc DONG-NHAT (giong ban da chay khong) VUONG GOC truc DUNG-SAI cua
  `reviewer` (co bug khong) => chay SONG SONG duoc, khong giam nhau.
- Luat style TRO docs/rules.md, CAM chep vao persona (B1) — chep la de nguon
  su-that thu hai roi drift.
- Bai S176 dua thang vao persona: "be mau thi be HINH, dung be LOI KHAI"
  (banner PE co cau "khong con tinh vao luy ke"; grep luy ke trong KHKK = 0
  hit => be nguyen la dan mot khang-dinh chua chung minh len man nguoi dung).
- May truoc, vai sau: FE co ESLint chay truoc. BE do duoc la 0 may style nao
  gac (0 .editorconfig, 0 analyzer, 0 dotnet format trong CI) nen con BE phai
  ganh ca lop co-hoc — da khai thang trong persona kem ghi chu: cam duoc may
  vao CI thi PHAI cap nhat lai persona do.
- Moi vai bat buoc co dong thach-CLEAN khi tra DAT: "DAT" suong khong phan
  biet duoc voi "chua soi".

Wiring: hmw.js VALID_ROLES 23->26 + writeGuard liet 3 vai vao nhanh read-only
(khong the de chung roi nham nhanh Bash-write MD, rui ro mojibake G-009) ·
agents/README bang Skill-assignment + RULE BAT BUOC (goi theo glob diff cham
dau; diff khong cham => KHONG goi, khong phai bo sot) · STATUS Sub-agents
23->26.

🔸 Nac trung-thuc: executed-file / verified-pending-restart — 3 vai CHUA
spawn-probe lan nao.
⚠️ roster 26 > hmw_width.cap 20 => full-roster-sweep LOUD-skip rong hon truoc;
so cap = quyen anh (O-7 van treo).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-06 10:07:21 +07:00

333 lines
56 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Multi-agent SOLUTION_ERP — Master Coordination Guide
> 🔴 **Số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents. KHÔNG chép số vào file này** (B1 derived-trỏ-canonical). *Bản trước S122 cứng-hoá "12-agent" ở **8 chỗ** trong khi roster đã 14 — đó chính là class `view-stale-role-desc`, và `agents/README` bị lấy làm **ví-dụ minh-hoạ** cho class đó trong [`lead-stale-auditor.md`](lead-stale-auditor.md). Vá @S122 bằng cách **bỏ số**, không phải bằng cách **đổi số** — đổi số thì roster kế lại stale.*
> **Architecture:** sub-agents **worker-tier-pin `opus`+`effort:max` (owner-decision S124 2026-07-15 — thay thế all-inherit Harness-8, trước nữa two-tier Harness-4)** + em main **lead DEFAULT Opus 5 MAX** (thư `9c909007` @S149 (re-stamp 07-25 G-024a; pre `59ce1d0f`); Fable = anh `/model`·`/fable-real` — 🧊 idiom "anh chọn per-session" superseded-VALUE) coordinator — **nhóm product/quality** (7 core S39 + frontend-designer pink S47 + database-agent read-advisory S52 + 📄 office-document S107) + **nhóm monitor INFORM-only** (H1 `tooling-auditor` + H2 `harvest-curator`, 2026-06-07 Harness 1 · H24 `lead-stale-auditor` + `lead-gap-auditor`, **S121 W2** · trio-memory `harness-eval` + `harness-refine` + `harness-audit`, **S141** · round-KIỂM ×3 `ring1-audit`/`ring2-audit`/`ring4-audit`, **S145** [C4/C4b TÁCH mỗi-vòng-1-con] · bộ-ba vòng Ctx `ctx-curator`/`ctx-verifier`/`ctx-audit`, **S153** [adopt `0df10df4` — OWNER-VETO hub-form 3-vai: nháp@pause · nạp@tiep · chuỗi@2-bookend]). 🔴 **Liệt-kê NHÓM, KHÔNG tổng-số** — số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents (đúng luật dòng đầu file: vá bằng **BỎ số**, không **ĐỔI số**). Tier: **TOÀN BỘ sub `model: opus` + `effort: max`** (worker-tier-pin S124 — sub cố-định KHÔNG theo lead; **đo S126:** lane no-tier resolve `claude-opus-4-8` DÙ lead=Fable = pin ăn runtime, và per-task `tier:'fable'` THẮNG pin trong lượt lệnh engine-đắt anh gõ. **Lead runtime = default Opus 5 MAX (thư `9c909007` @S149 (re-stamp 07-25 G-024a; pre `59ce1d0f`); Fable = anh `/model`·`/fable-real`); lịch-sử flip-chain lead = canonical [`docs/STATUS.md` §Sub-agents]** (🔴 S106 gộp 1-chain per anh-confirm — reader này KHÔNG enumerate/cập-nhật mỗi flip; BƯỚC 0.6 probe mỗi phiên xác-định runtime lead SỐNG) · effort **Max** (env machine-wide + frontmatter). SE KHÔNG có lớp helper/gopher rẻ (**mọi sub đều substantive memory-bearing → worker-tier = opus+max, KHÔNG hạ thấp hơn**). *(Lineage: two-tier H4 [4 promote inherit + 7 demote pin `claude-opus-4-8`] → all-inherit H8 S66S123 → worker-tier-pin S124 — chi-tiết ở Upgrade 2026-06-10 + S66 dưới.)*
> 🔍 **Đếm roster = ĐO ĐĨA, đừng tin số trong doc:** `ls -1 .claude/agents/*.md | grep -v README | wc -l`. ⚠️ **Glob thô `ls .claude/agents/*.md` bắt LUÔN `README.md`** ⇒ ra **thừa 1** — đây là bẫy số-học thật (R2-C1: acceptance cũ `=14` **FAIL trên implementation ĐÚNG**, và ép "sửa" bằng cách **xoá `README.md`** = catastrophic-Goodhart).
> **Upgrade S52 (2026-06-08 — AI_INFRA broadcast `2026-06-08-Agent-database-codebase-agents`):** **+database-agent (read-advisory DB specialist, floor DB1DB11)** — schema/query/migration-design-review/perf/concurrency (DB11 RowVersion vá lost-update S43). Tailor READ-tier (implementer-backend vẫn author) · color OMIT (8 standard hết) · `store_memory` strip. `codebase-agent` = **SKIP n-a** (investigator-codebase đã cover grep/audit + `csharp-lsp` Windows no-op). ✅ **verified-runtime** — spawned OK S53 (first real spawn, caught Mig 46 committed-but-unapplied-local drift) + S56 2× (pre-golive-verify schema-stream + golive-harden design+review). DB11 lost-update fix landed S56 (atomic ExecuteUpdate + Serializable tx, gotcha #58).
> Pattern: Anthropic Building Effective Agents orchestrator-workers + Cognition "writes single-threaded" hybrid + post-deploy automated watchdog.
> **Upgrade S39 (2026-05-29):** 4→7 agent (split investigator + implementer, +test-specialist) + budget +50% + 5 RAG MCP per agent. Reference BVAAU 7-agent config (adapted, NOT copied — SOLUTION_ERP 2-FE-app fit + 6 skill proven battle-test 38 session). Prior: S20t12 initial 3 + S21t1 +cicd-monitor.
> **Upgrade S47 (2026-06-02):** **+frontend-designer (8th sub, pink)** — FD1FD10 visual-verification design floor (forked AI_INFRA canonical, broadcast `Agent-frontend-designer-floor`). + **`store_memory` STRIPPED khỏi MỌI sub → lead = sole RAG-writer** (broadcast `Memory-store-memory-strip-global`); sub ghi finding → MEMORY.md (file). adap-reports: `docs/governance/adap-reports/`.
> **Upgrade 2026-06-07 (Harness 1·2·3 adopt — AI_INFRA broadcast):** **+2 monitor sub INFORM-only** `tooling-auditor` (H1 tooling/docs-freshness 4-mặt) + `harvest-curator` (H2 harvest-integrity 5-trục) → roster 8→10, **TÁCH BIỆT** per anh-mandate (H1≠H2 "hay quên+nhầm"). + **wave-folder memory-isolation** (Harness 2 — `hmw.js` wave-mode + `.claude/workflows/wave-*/` gitignored, B1B6). + **email channel** `broadcasts/` (Harness 3 — cross-project comms, self-id=`se`). KHÔNG copy-paste AI_INFRA — tailor SE roster/stack.
> **Upgrade 2026-06-10 (Harness-4 two-tier model — AI_INFRA broadcast `harness-4-model-tier-promotion` + `model-fable-5-max`):** lead = **Fable 5 (1M) Max** (user-level machine-wide, SE không project-pin) · sub two-tier theo tiêu chí H4.3 (a gate≥writer · b verdict-nuôi-quyết-định · c chống-rubber-stamp · d 1M-thật): **promote 4 giữ `inherit`** (reviewer·investigator-codebase·database-agent·harvest-curator) + **demote 7 pin `claude-opus-4-8`** (full-id no-suffix — gotcha #37 cấm `[1m]`; runtime resolve `[1m]` 1M trên máy chung per AI_INFRA s20). `hmw.js` tier-map H4.5 (role-less → `'opus'` · per-task `tier:'fable'|'opus'` override). Email-back AI_INFRA H4.7 BẮT BUỘC. Justification per-vị-trí: adap-report `2026-06-10-Governance-harness-4-model-tier-promotion.md`.
> **Upgrade S63 (2026-06-15 — Harness-5 + 6 adopt):** **H5 model-fallback** — ⚠️ Fable 5/Mythos 5 **suspended 2026-06-12 no-ETA** → lead SE tạm **Opus 4.8 (1M) Max** (promote `inherit` tự theo → two-tier collapse single-tier Opus; demote-pin giữ; **revert-FREE** khi Fable về: đổi lead lại + spawn-test). KHÔNG sửa frontmatter · external-outage blameless KHÔNG RCA · session-start BƯỚC 0.6 check. **H6 governed-ultracode** — mode-ON: substantive task TỰ chạy HMW (KHÔNG đợi keyword "workflow"); workflow-agent default = **inherit lead** (`hmw.js` role-less `'opus'`→inherit) · role-fidelity (agentType ∈ VALID_ROLES) + memory-fidelity (memoryDelta→đúng agent-memory single-writer) ĐÃ sẵn từ HMW-engine. adap-report `2026-06-13-Governance-harness-5-...` + `2026-06-15-Agent-harness-6-...`.
> **Upgrade S64 (2026-06-15 — Harness-7 writing-quality adopt):** sàn chất lượng viết **hướng ra ngoài** (email · broadcast · adap-report · tài-liệu-sister · **câu trả lời lead cho anh**) phải tiếng Việt rõ nghĩa, câu hoàn chỉnh, đủ dấu câu, đúng ngữ pháp (O1); nội bộ giữ lối nén §6.4/§6.5 (O2 — bất đối xứng); reviewer +**Category 6** writing-quality (O3, verified-pending-restart). Rule canonical `docs/rules.md §1.1`. adap-report `2026-06-15-Governance-harness-7-writing-quality.md`. body-hash `a4580ea9…` verified-MATCH (lesson gotcha #61: verify body-hash PHẢI đọc UTF-8 tường minh, PS5.1 default mis-decode tiếng Việt → false-mismatch).
> **Upgrade S66 (2026-06-16 — Harness-8 all-inherit + workflow-fastest adopt):** 🔴 BẮT BUỘC (anh-chốt, mọi sister; chất lượng trên chi phí). **H8.1** — toàn bộ 11 sub-agent có memory → `model: inherit` (ăn top-tier lead), **GỠ cơ chế demote two-tier của Harness-4** (7 sub pin `claude-opus-4-8` đã flip `inherit`: 2 implementer · test-specialist · cicd-monitor · investigator-api · frontend-designer · tooling-auditor; 4 đã-inherit giữ nguyên reviewer·investigator-codebase·database-agent·harvest-curator). SE KHÔNG có helper/gopher rẻ để chừa → cả 11 lên inherit. Escape-hatch per-task `tier:'opus'` (hmw.js) GIỮ cho sweep/cost. **H8.2** — chạy workflow nhanh nhất: **song song tối đa + xuất nhanh + lead auto-HMW** cho task substantive (theo H6) — "nhanh" = parallelism, **KHÔNG phải hạ model**. **Caveat (trung thực):** runtime HIỆN KHÔNG đổi (inherit = Opus 4.8 1M vì Fable suspended H5 — trùng two-tier đã collapse); khác biệt thật khi Fable về (cả đội tự lên Fable 5 không sửa frontmatter) + H5.6 restore gọn hơn (chỉ đổi lead). Frontmatter no hot-reload → **executed-file → runtime-verified S98** (2026-07-02 Fable-restore: inherit-chain spawn-test ×2 self-report `claude-fable-5` — "cả đội tự lên Fable, 0 sửa frontmatter" xảy ra đúng thiết kế). `[1m]` cấm trong frontmatter `model` (gotcha #37). adap-report `2026-06-16-Governance-harness-8-all-inherit-workflow-fastest.md`.
> **Upgrade S70 (2026-06-17 — Harness-9 L2-recovery + adap 2-workflow adopt):** **(1) PROCESS-mandate 🔴 BẮT BUỘC (PART 2/3, áp MỌI adap từ nay):** mỗi adap 1 Harness = **2 workflow tách biệt** (IMPLEMENT + REVIEW double-check RIÊNG) + REPORT về AI_INFRA kèm **run-id** bằng chứng; task ngắn-nhưng-cần-confirm VẪN phải review-workflow. Codify `.claude/commands/adap-apply.md`. **(2) L2 dark-matter recovery (PART 1, tailored):** archive `agent-memory/<sub>/archive/*.md` KHÔNG vào RAG → build `archive/_INDEX.md` (mục-lục 1-dòng/bản-ghi + con-trỏ **substring** sha-keyed, fallback Ctrl-F, KHÔNG line-hint) + `<period>.gist.md` (nén 4-field ADDITIVE, `distill-gen` counter, verbatim FROZEN) + `memory-budget.json` (seed-by-measure qua `scripts/measure-agent-memory.ps1`) + budget-audit @session-start (§2.1.2) + `.ragignore` guard. Rollout S70 (đầy-đủ-nhất, stage investigate→implement→audit qua 3 Workflow run-id): 4 over-cap sub (cicd-monitor · investigator-codebase · reviewer · implementer-backend). adap-report `2026-06-17-Governance-harness-9-l2-recovery-and-adap-workflow.md`.
> **Upgrade S72 (2026-06-18 — Harness-10 flat-refine + checklist-v2 adopt):** run-trace SUBFOLDER→**FLAT** (file phẳng cùng cấp: `sub-<role>-<i>.md` raw + `<stage>-synthesis.md` verified, KHÔNG `sub-md/`/`harvest/` subdir) — `hmw.js` (`:103` subMd path) + `workflows/README` + `runs/README` + session-start/end + decision-tree (dòng dưới) repoint. **C8 migration:** 5 run cũ S71 GIỮ subfolder (đừng rewrite history); close-gate dual-accept cả hai dạng. **+`/sleep-recovery-memory-l2`** (đóng A8 — port §J2-tailored SE-only: sleep-compress L2 gist additive, INFORM-only ≥7d). **Anti-bypass detector (refine b): TAILORED-OUT** — SE dùng Anthropic Workflow tool (no CLI-launcher bypass-surface), containment = git-diff + run-folder TRACKED + ledger orphan-scan (G-015). 3 run-id bằng-chứng: audit `wf_13868efb-ea7` · implement `wf_ac43b5ff-7d1` · review (pending). adap-report `2026-06-18-Governance-harness-10-flat-refine-checklist-v2.md` (pending).
> **Upgrade S75 (2026-06-18 — Harness-11 engine bộ-nhớ-và-governance TỰ-BẢO-TRÌ adopt):** engine tự-DÒ toàn-diện (luôn tươi báo cờ) + AUTO chỉ semantic-null git-diff + **single-writer bar-KHÔNG-hạ (D9)** + đổi-luật owner-approve (D7). 🔑 Canonical → [`docs/governance/harness-11-engine.md`](../../docs/governance/harness-11-engine.md) (**KHÔNG copy luật ở đây — B1 dogfood**). Artifact MỚI: `scripts/governance-detectors.ps1` (C1 broken-pointer + C2/B3 staleness + C3 vocab-fork + C4 self-exclusion, NO-API DÒ+FLAG-only, **runtime-proven** bắt drift root CLAUDE.md mig53→55 + 0 self-match; số flag động → run-trace) + `scripts/memory-archive-gate.ps1` (PHẦN A hysteresis 0.85/keep-floor 5/2-strike/A7 NO-API L1-eval) + budget.json `archive_gate`. 3-tier D5(AUTO)/D6(DÒ+FLAG)/D7(owner-approve) + one-direction-lock D8 (canonical→derived) codify ở engine-doc. Cadence wired: D1 session-start §2.1.3 (chạy detector) · D2 session-end §L.b(c) (archive-gate). Áp qua workflow: audit `wf_7fdc3bd5-930` + implement `wf_c5e5844e-7c1` + review `wf_d7ca1ff8-942` + double-check `wf_a0b68d2f-30e`. adap-report `docs/governance/adap-reports/2026-06-18-Governance-harness-11.md`.
> **Upgrade S79 (2026-06-20 — User-Mark H-12/13 canonical §P + Harness-14 Eval/Budget/Outcome adopt):** áp **canonical §P đầy-đủ** (P1-P10) khi anh gõ `/user-mark-active-high` "áp đầy-đủ chính-xác nhất theo AI_INFRA". Artifact: **4 lệnh** `.claude/commands/user-mark-{active-high,active,medium,disable}.md` (DACI report-before-stamp) + ledger `.claude/governance/ACTIVE-MARKS.md` (4 cấp Active-High/Active/Medium/Disable + display-filter) + `harness-11-engine.md §E` (cơ-chế P1-P10) **+§F** (Harness-14 3-mức maturity) + `rules.md §6.6` (objective-criteria: KHÔNG quy-mô-đội / KHÔNG thời-gian-tuổi) + session-start §2.1.4 / session-end §L.b(h) mark-display. **3 mark Active-High stamped** anh-confirm S79 (`RC-pqhuy1987-20-06-2026-10-29-09/10/11`). completeness-gate H-6→H-13 ĐẠT (H-8 11/11 inherit no-`[1m]`). 4 workflow: invest `wf_82337f7f-95c` + review `wf_a7cbe93e-912` + align-re-review `wf_9d3beebb-a95` + H14-review `wf_4d4eba6f-8a0`. ⚠️ restart CLI (lệnh/session no hot-reload). adap-report 3× (`…rc-signature` + `…harness-all-update` + `2026-06-20-Governance-harness-14`).
> **Upgrade S93 (2026-06-29 — Harness-16 MFE adopt):** **memory-fidelity-EVAL** (đo nạp-vs-nhớ-vs-dùng bằng SỐ ĐO, KHÁC H6.7 `memoryDelta`-routing-fidelity). Artifact: `scripts/mfe-eval.ps1` (deterministic NO-API: LEAD coverage-FIT token-RANGE + age-band flag-not-cut + Goodhart-anchor strikes/RCA · SUB per-role coverage ĐO-THẬT prose-only→N/A · sub-workflow N/A) + `eval/mfe/` (seed sample-questions stable-id-anchored + README) + `memory-budget.json:mfe` config + engine **§H** + artifact-row. Judge recall/apply = **SCAFFOLD-only** (chờ age-maturity + independent-judge). Wire **opt-in** `session-start §2.1.6` + `session-end §L.b(c)` (param `eval`, no-param=như cũ). 🔴 **READS-not-writes** `token_governor` (owner-authority). C3 alias-map recorded §H (KHÔNG seed $aliasSets). 2-workflow: WF1 implement-investigate `wf_4c63e1bd-99e` + WF2 review `wf_13e3d35a-023` (3-lane PASS: code-gate denom-29-re-derived + cross-harness 0-conflict + honesty 5-floor). adap-report `2026-06-29-Governance-harness-16-mfe.md` + email AI_INFRA. ⚠️ restart CLI.
> **Upgrade S107 (2026-07-10 — +office-document, 12th sub):** **+office-document (📄 Office document WRITE specialist)** — anh giao trực tiếp S107 ("Sub chính" mảng Office). Floor **OD1OD10** (skill-first · 🔴 fidelity-to-template 100% · extract-không-bịa · round-trip verify · file-mới-không-đè-gốc · boundary-code ⟂ implementer-backend). Skill nạp: bộ 4 Office standalone (`docx`·`xlsx`·`pptx`·`pdf`) + `form-engine` (project). VALID_ROLES `hmw.js` 9→**10**. Use-case SE: extract spec Excel/Word anh gửi (Database NCC → Supplier Phase B khi unpark) · chuẩn hóa template 8 form placeholder · document deliverable · screenshot→docx #74 · verify render form-engine. ✅ **verified-runtime S107 CÙNG PHIÊN** — registry HOT-RELOAD agent MỚI giữa phiên (harness mới; ⚠️ **ENV-DEPENDENT** — hub experiment 2026-07-11 NGƯỢC kết quả [0 notice + spawn not-found ×2] → KHÔNG fleet-generalize, restart = default an toàn; S27 restart-lesson giữ cho EDIT agent hiện có, chưa re-verify) + spawn-test PASS (OD1 skill invoke · OD4 extract-honest — finding: 2 template `wwwroot/templates` **0 placeholder `{{field}}`**, mẫu blank "…………..", mapping ở render-engine hoặc chưa placeholder-hóa · OD5 round-trip 37KB VN-dấu · OD7 gốc nguyên vẹn).
---
## 🎯 Architecture
> ⓘ **Diagram dưới = 7 core lane (pre-S47 snapshot) — KHÔNG phải roster hiện-hành.** Roster THẬT = 7 core (diagram) + 🩷 frontend-designer (S47) + 🔵 database-agent (S52) + 📄 office-document (S107) + 🟫 tooling-auditor H1 + ⬜ harvest-curator H2 (2026-06-07 Harness 1) + 🔷 lead-stale-auditor + 🔶 lead-gap-auditor (**H24, S121 W2**) + 🧪 harness-eval + 🧪 harness-refine + 🧪 harness-audit (**trio-memory, S141**) + 🔬 ring1-audit + 🔬 ring2-audit + 🔬 ring4-audit (**round-KIỂM ×3, S145 — C4/C4b TÁCH mỗi-vòng-1-con: vòng tooling/harvest · soi-lead H24 · nén-ngủ**) + 🔎 ctx-curator + 🔎 ctx-verifier + 🔎 ctx-audit (**bộ-ba vòng Ctx lớp trí-nhớ MỀM `_mind`, S153 — adopt `0df10df4`, OWNER-VETO hub-form 3-vai: vai-1 nháp@mỗi-pause [carve-out §1] · vai-2 đối-chiếu+nạp@mỗi-tiep · vai-3 chuỗi@2-bookend**) — xem skill matrix + decision tree + tool grant dưới. Số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents. (Cosmetic ASCII chưa vẽ lại — H1 tooling-auditor flag drift này @session-start.)
> 🔴 **Bài S143 — enumeration TÊN cũng lão-hoá, và grep-theo-SỐ không bắt được:** sweep roster wave S141S142 đặt acceptance là `grep "roster 14|14/14|14 folder|14 vai"` → 0 hit ⇒ tuyên bố sạch. Nhưng đúng 2 dòng tự xưng là bản gốc về roster — dòng NÀY ("Roster THẬT") và `:225` ("VALID_ROLES … ĐỦ roster") — **liệt kê TÊN, không chứa con số nào** ⇒ lọt lưới, giữ 14 vai qua cả wave. **Acceptance cho lần sau: ĐẾM PHẦN TỬ trong mọi enumeration rồi so canonical, đừng so hình-dạng chuỗi.**
```
┌──────────────────────────────────────────────────────────────┐
│ EM (Main) — lead default Opus 5 MAX (owner /model·/fable-real)│
│ • Reasoning + write code (single-threaded principle) │
│ • Schema/UX/architecture decision + cross-stack tight coupling│
│ • Coordinate TOÀN roster sub-agent via spawn + SendMessage │
│ • Synthesize cross-agent findings + commit/push (em main only)│
│ • Fallback solo nếu spawn fail (gotcha #53 truncate / 529) │
└──────────────────────────────────────────────────────────────┘
↓ spawn + keep-alive (worker-tier-pin S124: MỌI sub `model: opus`+`effort: max` = worker-tier; lead=default Opus 5 MAX per 9c909007 (re-stamp; pre 59ce1d0f); Fable qua /model·/fable-real)
── RESEARCH (READ) ────────── ── IMPLEMENT (WRITE) ──────────── ── QUALITY ──────────
┌──────────────────┐ ┌───────┐ ┌─────────────────┐ ┌──────────┐ ┌────────┐ ┌─────────┐ ┌────────┐
│investigator- │ │invest-│ │implementer- │ │implement-│ │test- │ │reviewer │ │cicd- │
│codebase │ │igator-│ │backend │ │er- │ │special-│ │ │ │monitor │
│ │ │api │ │ │ │frontend │ │ist │ │ │ │ │
│ INTERNAL audit │ │EXTERN-│ │ .NET Domain+App │ │ FE 2 app │ │ tests/ │ │adversa- │ │post- │
│ SQL/EF/grep/ │ │AL docs│ │ +Infra+Api │ │cookie- │ │dedica- │ │rial pre-│ │deploy │
│ reference mirror │ │CVE/lib│ │ entity/CQRS/Mig │ │cutter │ │ted │ │commit + │ │Gitea + │
│ │ │/cross-│ │ /Controller │ │mirror │ │xUnit │ │live curl│ │bundle │
│ │ │project│ │ │ │SHA256 │ │ │ │ │ │+ smoke │
└──────────────────┘ └───────┘ └─────────────────┘ └──────────┘ └────────┘ └─────────┘ └────────┘
cyan blue yellow orange purple red green
```
---
## 🚨 RULE BẮT BUỘC (S39 updated)
**Em main BẮT BUỘC phân việc cho sub-agent đúng vai trò khi ACCEPT criteria match. Budget +50% → lean toward delegate + parallel, ít em main solo fallback.**
**Workflow forward S39+:**
- Trước mọi task → classify qua decision tree dưới
- Read-only research → **split**: internal codebase audit → `investigator-codebase` · external docs/CVE/lib → `investigator-api` (có thể spawn parallel cả 2)
- WRITE scaffold → **split**: .NET backend → `implementer-backend` · FE 2 app → `implementer-frontend` (parallel khi independent — vd BE entity + FE types cùng lúc)
- Test → **`test-specialist`** dedicated (KHÔNG để implementer kiêm)
- Deploy claim → `cicd-monitor` sau push (skip docs-only gotcha #41)
- Heavy diff / security / wire BE claim → `reviewer` pre-commit
- 🔴 **ĐỘI STYLE (S176, anh chốt) — MỖI LƯỢT REVIEW gọi THÊM 1 lần, song song `reviewer`:** `front-end-reviewer-style` · `back-end-reviewer-style` · `database-reviewer-style`.
- **Gọi con nào = theo DIFF chạm đâu** (`git diff --name-only origin/main...HEAD`): `fe-*/src/**` → FE · `src/Backend/**` trừ `Persistence/**` → BE · `Persistence/**` → DB. Diff không chạm ⇒ **KHÔNG gọi**, không phải bỏ sót.
- **Trục của đội này ⟂ `reviewer`:** đội STYLE soi **ĐỒNG-NHẤT** (có giống bản đã chạy không), `reviewer` soi **ĐÚNG-SAI** (có bug không). Chạy song song được vì không giẫm nhau.
- 🔴 **Luật lõi anh giao:** *"các tính năng đã deploy thành production rồi thì sẽ là chuẩn, trừ khi tao có điều chỉnh lại lần nữa"* — lý do sinh đội: **"mày cứ làm đi làm lại hoài"**. Ca thật S176 vòng-4b: thùng rác KHKK thiếu banner + dấu xoá mà màn Duyệt NCC **đã chạy prod** có đủ ⇒ anh phải chụp màn gửi làm mẫu. Một lượt làm lại **đáng lẽ không cần**.
- 🔸 **Máy trước, vai sau:** FE có ESLint chạy trước (`npm run lint`); **BE hiện 0 máy style nào gác** (đo S176) nên con BE gánh nặng hơn. Cắm được `.editorconfig` + `dotnet format --verify-no-changes` vào CI thì trả lớp cơ-học về máy và **cập nhật lại persona con BE**.
- 🧊 Anh nêu ban đầu **4** con (có `clean-code-reviewer-style`) rồi tự chốt lại **3** ("3 con tao nhầm" + "chốt theo ý mày"): con clean-code phủ chồng cả 3 con kia nên **không viết nổi câu scope rời** mà roster này bắt buộc ⇒ trục clean-code (đặt tên · trùng lặp · mật-độ comment · pattern drift) **gộp vào từng con trong địa phận của nó**.
**Em main solo CHỈ khi:** schema/UX/architecture decision · cross-stack tight coupling · bug fix reasoning chain · gotcha #53 fallback (spawn truncate/529 → em main solo reliable, proven S37 BE 700 LOC + FE 4 file).
**Anti-truncation rules (gotcha #53 — 5× occurrence S35-S37):**
- **Spawn prompt = RICH, fill-to-budget (H15-v3 S83 — supersedes old "≤8K brief"):** nạp INPUT tới token-budget của sub (mem-sub **60K** / wf-sub **50K** per `memory-budget.json:spawn_fill_directive`) bằng context GIÁ-TRỊ cao (relevant gotchas + state + full task-context + docs/memory liên-quan) — KHÔNG padding. Truncation #53 = rủi-ro RETURN của agent (vá bằng lean `memoryDelta` return + em-main recover-disk), **KHÔNG** vá bằng starve INPUT. *(Heuristic "≤8K brief" cũ = guard thời context-nhỏ S36, nay nghỉ.)*
- Tiered Memory v1: L1 HOT soft-cap ~30KB + L2 archive on-demand + L3 RAG just-in-time (per AI_INFRA policy). Investigator 32KB S37 truncate = lesson; soft-cap ~30KB tránh tái diễn.
- Agent keep entry ≤ 1.5K chars (frontmatter rule mỗi agent).
- Em main grep verify manual nếu agent return truncated mid-task.
- 529 Overload transient → em main solo fallback (KHÔNG retry loop).
---
## 🔄 Invocation decision tree (em main apply)
```
├── Read-only INTERNAL audit (codebase/SQL/EF diff/grep > 5 files)?
│ → investigator-codebase (cyan)
├── Read-only EXTERNAL (official docs / NuGet-npm CVE / lib eval / cross-project ref)?
│ → investigator-api (blue)
│ → Cả 2 investigator parallel OK khi task cần both (vd "audit current + research best practice")
├── DB schema-design / migration design-review / perf audit (N+1·index·projection) / transaction-concurrency (RowVersion lost-update)?
│ → database-agent (read-advisory, floor DB1DB11) — DESIGN/REVIEW/PERF/CONCURRENCY-advise; implementer-backend AUTHOR sau
│ ⟂ vs investigator-codebase: deep DB-layer (introspection/query-plan/concurrency) vs broad codebase grep/audit
│ ⓘ Schema-design quyết-định-cuối vẫn em main solo; database-agent = deep-DB lens hỗ trợ + review implementer output
├── OFFICE DOCUMENT (đọc/tạo/sửa/convert docx·xlsx·pptx·pdf / extract spec file anh gửi / template form placeholder / báo cáo document / screenshot→docx #74)?
│ → office-document (📄) [OD1OD10; skill docx·xlsx·pptx·pdf + form-engine]
│ ⟂ vs implementer-backend: C# render-engine (OpenXml/ClosedXML/LibreOffice service trong src/) = implementer-backend · office-document = FILE-level document/template/spec-extract (KHÔNG đụng src/·fe-*·tests/)
├── WRITE .NET backend (entity/EF Config/Mig/CQRS/Controller/DbInit)?
│ ✓ Spec deterministic · pattern proven >1× · >30min · ≤2 layer
│ → implementer-backend (yellow) [Case 1/2/3/5]
├── WRITE FE 2 app (page/types/component cookie-cutter mirror)?
│ ✓ UX flow chốt by em main · spec deterministic
│ → implementer-frontend (orange) [Case 1/2]
│ → BE + FE parallel khi independent (em main chốt DTO shape first)
├── WRITE FE DESIGN/REDESIGN (đẹp thật / UX mới / greenfield visual — KHÔNG mechanical mirror)?
│ ✓ design-system-first + visual-verification loop (Playwright screenshot ≥2 viewport → rubric → fix)
│ → frontend-designer (pink) [FD1FD10 floor]
│ ⟂ vs implementer-frontend: đẹp/UX/thiết kế → frontend-designer · cookie-cutter SHA256 mirror theo spec → implementer-frontend (KHÔNG double-touch 1 file UI)
├── WRITE test (xUnit Domain policy / Infra handler / authz regression)?
│ → test-specialist (purple) [test-before bug/critical, test-after feature UAT]
├── After push code commit (NOT docs-only)?
│ → cicd-monitor (green) — Gitea poll + bundle hash + Mig prod + smoke
├── Adversarial pre-commit / heavy diff / wire BE claim / security?
│ → reviewer (red) — Smart Friend 5-category + live curl
├── @session-start/@session-end TOOLING-FRESHNESS audit (skill·sub-role·plugin·docs 4-mặt + drift)?
│ → tooling-auditor (H1 monitor, INFORM-only) — báo state+diff @start · chốt+new-alloc @end · em main APPEND
├── @session-end HARVEST-INTEGRITY gate (5-trục Coverage/Completeness/Fidelity/Placement/Corruption) / run-folder harvest (`runs/<run-id>/<stage>-synthesis.md` ← `sub-<role>-<i>.md` phẳng, Harness-10 h10-refine; run cũ S71 `harvest/`←`sub-md/`) / @session-start harvest mới?
│ → harvest-curator (H2 monitor, INFORM-only) — propose delta · em main single-writer VERIFY→APPEND · Fidelity nghi → reviewer
├── @session-end §L.b(g-bis) — KIỂM vòng tooling/harvest (verify OUTPUT H1+H2, AUTO sau đo, KHÔNG consent)?
│ → ring1-audit (round-KIỂM monitor, INFORM-only, C4/C4b S145 vai #1/3) — verdict per-claim + tự tái-dựng ≥1 số + thách-CLEAN · no-self-exempt ≠ H1/H2 · NO-OP nếu H1/H2 không chạy · em main VERIFY→APPEND
├── @session-end §L.b(j)(ii-bis) — KIỂM vòng soi-lead H24 (verify OUTPUT lead-stale+lead-gap, AUTO sau cặp H24)?
│ → ring2-audit (round-KIỂM monitor, INFORM-only, C4/C4b S145 vai #2/3) — verdict per-FLAG + thách-CLEAN (H24 báo ít/0 FLAG → tự soi 1 surface tìm FLAG sót) · no-self-exempt ≠ lead-stale/lead-gap · KHÔNG soi lead trực-tiếp · NO-OP nếu H24 không chạy
├── sau `/sleep-recovery-memory-l2` Phase 4.5 — KIỂM vòng nén-ngủ (verify gist+Fidelity, AUTO sau nén)?
│ → ring4-audit (round-KIỂM monitor, INFORM-only, C4/C4b S145 vai #3/3) — verdict per-claim + tự đo byte + thách-CLEAN (mở 1 gist vs `<period>.md` gốc) · no-self-exempt độc-lập lượt nén · NO-OP nếu 0 gist tươi
├── @session-start §2.1.9 / @session-end §L.b(k) — ĐỒNG-KIỂM CHÍNH-HỆ-MEMORY (độ-giữ · hành-động · đúng-spec), anh ĐÃ GẬT consent?
│ → **TUẦN TỰ 3 spawn RIÊNG** (🔴 CẤM `parallel()`; CẤM tự chạy khi chưa consent):
│ 1. harness-eval (trio-memory monitor, INFORM-only) — ĐO: đọc output instrument + budget.json → SỐ nguyên-văn + verdict
│ 2. harness-refine (…) — ĐỀ-XUẤT: đọc `harness-eval-return.md` PIN → action 4-lớp + mục "đã cân-nhắc→BÁC"
│ 3. harness-audit (…) — KIỂM: đọc run-folder PIN → ĐẠT/TRƯỢT per-claim + re-chạy ≥2 số load-bearing
│ ⟂ vs H1/H2/H24/round-KIỂM: H1 = tooling-freshness · H2 = harvest-integrity · H24 = soi LEAD · round-KIỂM ×3 (`ring1-audit`/`ring2-audit`/`ring4-audit`) = KIỂM 3 vòng tooling-harvest / soi-lead H24 / nén-ngủ [đọc output con-đo vòng mình] · trio = soi CHÍNH HỆ MEMORY (corpus agent-memory)
│ ⟂ vs reviewer: trio KHÔNG chấm diff-code; đụng thao-tác harvest → NHƯỜNG harvest-curator
│ 🔴 3 vai KHÔNG có Write/Edit ⇒ lead scribe return từng con vào `runs/<run-id>/harness-{eval,refine,audit}-return.md` NGAY
├── Quick task < 30 min? → Em solo direct
└── Schema/UX/architecture/cross-stack tight/bug reasoning chain?
→ Em solo (Cognition) + investigator pre-flight optional + reviewer pre-commit
```
---
## 📋 Phân việc matrix — split boundary (CRITICAL)
| Layer / File | Owner |
|---|---|
| `src/Backend/SolutionErp.{Domain,Application,Infrastructure,Api}/**` | **implementer-backend** |
| `fe-admin/src/**` + `fe-user/src/**` (cookie-cutter mirror scaffold theo spec) | **implementer-frontend** |
| FE **design/UX/redesign** (aesthetic · new visual · design-system · a11y polish) | **frontend-designer** (self-gate rubric FD4 trước reviewer) |
| `tests/**` | **test-specialist** |
| Mig design / FK strategy / discriminator / schema | **em main solo** (database-agent deep-DB design-review/concurrency-advise optional + implementer-backend scaffold sau khi chốt) |
| DB schema introspection / query-perf (N+1·index) / migration design-review / concurrency RowVersion | **database-agent** (read-advisory — DESIGN/REVIEW/ADVISE, KHÔNG author file) |
| File Office (docx/xlsx/pptx/pdf) — template 8 form + spec-extract file anh gửi + document deliverable + screenshot→docx | **office-document** (📄 FILE-level — KHÔNG đụng `src/`·`fe-*`·`tests/`; render-engine code = implementer-backend) |
| UX flow (drawer/tab/modal) / page structure | **em main solo** (implementer-frontend scaffold sau khi chốt) |
| Internal SQL/EF/grep audit | **investigator-codebase** |
| External docs/CVE/lib/cross-project | **investigator-api** |
| Pre-commit verify | **reviewer** (NEVER write) |
| Post-deploy verify | **cicd-monitor** (NEVER write) |
**Boundary dứt khoát:** implementer-backend KHÔNG touch FE · implementer-frontend KHÔNG touch BE (chỉ Read DTO shape) · cả 2 implementer KHÔNG viết test (→ test-specialist) · test-specialist reveal prod bug → REPORT em main KHÔNG fix · **frontend-designer = design/UX/đẹp (FE-only, KHÔNG BE/DB) ⟂ implementer-frontend = mechanical mirror theo spec — KHÔNG double-touch cùng 1 file UI (chồng lấn → escalate em main).** **office-document = FILE Office (docx/xlsx/pptx/pdf · template · spec-extract) ⟂ implementer-backend = C# render-engine trong `src/` — file-level vs code-level, KHÔNG double-touch.**
---
## 🛠️ Skill assignment (6 skill, re-distributed S39)
| Agent | Skills |
|---|---|
| investigator-codebase | `contract-workflow` + `permission-matrix` + `ef-core-migration` |
| investigator-api | `dependency-audit-erp` |
| implementer-backend | `ef-core-migration` + `permission-matrix` + `contract-workflow` + `form-engine` |
| implementer-frontend | `permission-matrix` |
| test-specialist | `contract-workflow` + `permission-matrix` |
| reviewer | `dependency-audit-erp` + `contract-workflow` + `permission-matrix` |
| **front-end-reviewer-style** (đội STYLE, S176) | `permission-matrix` — 🔴 luật style FE **KHÔNG** ở skill mà ở `docs/rules.md` + **bản ĐÃ PRODUCTION** (B1 trỏ, cấm chép). Chạy SAU máy `npm run lint` |
| **back-end-reviewer-style** (đội STYLE, S176) | `contract-workflow` + `permission-matrix` — 🔴 BE **0 máy style gác** (đo S176: 0 `.editorconfig`/analyzer/`dotnet format`) nên vai gánh cả lớp cơ-học, khác con FE |
| **database-reviewer-style** (đội STYLE, S176) | `ef-core-migration` (3-file rule = trục đắt nhất) — 🔴 chỉ soi ĐẶT TÊN + hình-dạng migration, **KHÔNG** phán schema (đó là `database-agent`) |
| cicd-monitor | `iis-deploy-runbook` + `dependency-audit-erp` + `ef-core-migration` |
| frontend-designer | `frontend-design` + `senior-frontend` + `brand-guidelines` + `theme-factory` + `webapp-testing` (FD2 loop) + `web-artifacts-builder` |
| database-agent (read-advisory S52) | `sql-database-assistant` (SQL Server first-class — KHÔNG cover EF-Core) + `ef-core-migration` (EF Core 10 pin + 3-file rule) |
| office-document (📄 S107) | `docx` + `xlsx` + `pptx` + `pdf` (bộ 4 Office standalone `~/.claude/skills/` — duplicate namespaced `anthropic-skills:*` → dùng standalone) + `form-engine` (project — template 8 form HĐ `{{field}}` + PDF LibreOffice + RG-001) |
| tooling-auditor (monitor H1) | ref-only — reads skill registry, KHÔNG dùng domain skill |
| harvest-curator (monitor H2) | none — deterministic 5-trục scan + Fidelity-escalate `reviewer` |
| lead-stale-auditor (monitor H24, S121 W2) | ref-only — ĐỌC output `scripts/governance-detectors.ps1` làm nền (KHÔNG chạy lại) + enum ĐÓNG `lead_self_audit.flag_classes` (`memory-budget.json`), KHÔNG dùng domain skill |
| lead-gap-auditor (monitor H24, S121 W2) | ref-only — cùng nguồn `lead-stale-auditor` (output máy + enum ĐÓNG flag_classes); trục CÁI-THIẾU nên máy gần như mù, KHÔNG dùng domain skill |
| harness-eval (monitor trio-memory, S141) | ref-only — ĐỌC output `scripts/{measure-agent-memory,mfe-eval,memory-archive-gate,crystallized-backfill,nhip-no-probe}.ps1`, KHÔNG dùng domain skill |
| harness-refine (monitor trio-memory, S141) | ref-only — reads `harness-eval-return.md` (PIN) + `reinject-ledger.md`, KHÔNG dùng domain skill |
| harness-audit (monitor trio-memory, S141) | ref-only — reads run-folder PIN + `memory-budget.json` + `scripts/`; re-chạy ≥2 số load-bearing để đối-chứng |
| ring1-audit (monitor round-KIỂM, S145) | ref-only — ĐỌC output H1 `tooling-auditor` + H2 `harvest-curator` (KHÔNG chạy lại đo) + tự đếm `.claude/agents/*.md`/run-folder đối-chứng; no-self-exempt ≠ H1/H2; KHÔNG dùng domain skill |
| ring2-audit (monitor round-KIỂM, S145) | ref-only — ĐỌC output `lead-stale-auditor` + `lead-gap-auditor` FLAG (KHÔNG re-soi-lead) + `flag_classes` enum ĐÓNG + `class_repeat`; no-self-exempt ≠ 2 vai H24; KHÔNG dùng domain skill |
| ring4-audit (monitor round-KIỂM, S145) | ref-only — ĐỌC output `/sleep-recovery-memory-l2` `.gist.md` + Fidelity verdict; tự đo byte gốc vs gist; no-self-exempt độc-lập lượt nén; KHÔNG dùng domain skill |
| ctx-audit (vai-3 vòng Ctx, S153) | ref-only — SOI-CHUỖI `_mind` @2-bookend: bất-biến |block|∈{p,p+1} đếm-ĐĨA + mồi-ngầm + kiểm-vết vai-1/2 (hồi-tố = fallback); ĐỌC output `mind-check` KHÔNG re-implement; PIN fail-closed, `_mind` vắng ⇒ NO-OP-có-khai; KHÔNG soi lead-surface (turf H24), KHÔNG kiểm vòng-đo khác (turf ring); KHÔNG dùng domain skill |
| ctx-curator (vai-1 vòng Ctx, S153 OWNER-VETO) | ref-only — KIỂM bản NHÁP block @mỗi-`/pause` (5 khoản ngữ-nghĩa, SAU `mind-check --draft`); trả CHỈ văn bản `DAT\|SUA\|SKIP-CO-KHAI` ≤12 dòng; carve-out duy nhất `pause.md §1`; KHÔNG lấn @tiep/2-đầu; KHÔNG dùng domain skill |
| ctx-verifier (vai-2 vòng Ctx, S153 OWNER-VETO) | ref-only — ĐỐI-CHIẾU 4-khoản (B-vs-`next:` TIN-SỔ-MÁY) + BẢN NẠP-LẠI ≤15 dòng @mỗi-`/tiep`, kết `LEAD-PHAI-NHAC-LAI:`; KHÔNG nạp NỀN hộ lead (`tiep_reload` = việc lead); KHÔNG lấn @pause/2-đầu; KHÔNG dùng domain skill |
## 🔧 Tool grant (S39 — +3 RAG MCP per agent)
MỌI agent trong roster có **4 RAG-READ MCP**: `search_memory` + `search_code` (BM25, prefer over Read full file — tiết kiệm token) + `cross_project_search` + `list_projects`. Base tools per role (READ: Read/Grep/Glob/Bash [+WebFetch/Search cho api] · WRITE: +Edit/Write/Skill).
> **2 monitor sub (tooling-auditor H1 + harvest-curator H2 — 2026-06-07):** read-only toolset **KHAI TRONG frontmatter** = `[Read, Grep, Glob, Bash, +4 RAG-read]`, **NO `store_memory`, NO Write/Edit** (mirror investigator read-set). 🔴 **Đây là điều KHAI, KHÔNG phải điều ĐƯỢC CẤP — đo S143 trên 9 vai read-only (2 monitor này + 2×H24 + 3×trio + reviewer + investigator-codebase): runtime APPEND `Write`+`Edit` vào cuối tool-list bất kể frontmatter.** Nhân-chứng: `reviewer` (frontmatter 0 Write/Edit) đã Write+Edit thật. ⇒ mọi câu "read-only" dưới đây đọc là **ý-định**, không phải enforcement. INFORM-only — propose → em main single-writer VERIFY→APPEND (B3). 🔴 **G-015 accuracy (Harness-10 run-trace model, `runs/README.md §Containment` — 🧊 `_ledger.md` retired H18-B S100):** run-folder `runs/<run-id>/` được git **TRACKED** → mọi write HIỆN trong git-diff = audit trực-tiếp. Containment: tracked-change NGOÀI `runs/<run-id>/` VÀ NGOÀI code-disjoint đã giao = vi-phạm (thay model Harness-2 B6 "mọi tracked-change = vi-phạm"). G-015 no-overclaim: TRACKED ≠ read-only-enforced — sub vẫn giữ `Bash` (write-channel mở qua shell/curl) → containment THẬT = em main single-writer + git-diff(in-repo) + chunk-count (RAG), KHÔNG allowlist đơn-độc.
> ⚠️ **`store_memory` GỠ khỏi MỌI sub (2026-06-02 — AI_INFRA broadcast `Memory-store-memory-strip-global`, adap-report cùng id).** → **lead (em main) = sole RAG-writer** (mechanized failure-safe: sub vật-lý không gọi được `store_memory`). Sub tìm thấy finding/pattern mới → ghi **MEMORY.md** (file); lead + re-index đưa vào RAG. *Accuracy (G-015): đây KHÔNG = sub "read-only" — sub vẫn giữ `Bash` (+ vai write giữ `Write/Edit`); containment thật = defense-in-depth git-diff + Qdrant chunk-count, chưa phải allowlist đơn độc.*
---
## 🔌 External skill/plugin mapping (H3 — Harness 1 adopt 2026-06-07)
> Floor H3: nạp đúng skill/plugin hợp stack, **gộp-vai KHÔNG phình roster**. Audit (investigator-api 2026-06-07; tooling-auditor H1 re-count S53): **18** plugin registered (15 enabled / 3 disabled) user-global (`~/.claude/settings.json` — +csharp-lsp +typescript-lsp +session-report vs S49's 15) + ~23 standalone skill (`~/.claude/skills/`). **0 agent mới** — mọi cái = skill→gộp-vai-hiện-có. Nấc: enabled/available → **assigned** (bảng dưới = doc) → used (per-session auto-trigger). tooling-auditor (H1) rà new-alloc mỗi session-end.
| Skill/plugin (nguồn) | Value-locus | Map → vai | Ghi chú |
|---|---|---|---|
| `sql-database-assistant` (standalone) | skill-only | investigator-codebase + implementer-backend | SQL/EF query; đọc kèm `ef-core-migration` (KHÔNG override pin EF Core 10 / dbo single-schema) |
| `frontend-design` (standalone, KHÔNG enable plugin trùng) | skill-only | frontend-designer | duplicate plugin↔standalone → chọn standalone |
| `skill-creator` | skill-only | mọi sub (khi tạo skill project) | additive |
| `claude-md-management` (`claude-md-improver`) | skill+cmd | em main | doc-maintenance |
| `pr-review-toolkit` (silent-failure-hunter / type-design-analyzer / comment-analyzer / pr-test-analyzer) | agent-bearing | reviewer (tham-chiếu .md như CHECKLIST, KHÔNG enable agent) | giữ roster `reviewer` canonical |
| `session-report` (node `.mjs`, Win-OK Node 20) | skill-only | em main / cicd-monitor | optional — token/spawn-cost observability |
**🔴 KHÔNG DÙNG (tránh phình roster + name-collision — H3.3)** — 🔄 **vá @S153 (H1 F-6 → ring1 F-r2 chốt số):** tiêu-đề cũ ghi *"KHÔNG **enable**"* nhưng đo `~/.claude/settings.json` thì **3 site dưới đây ĐANG `enabled: true`** (`csharp-lsp` `:33` · `commit-commands` `:31` · `feature-dev` — plugin này **ship THẬT** `agents/code-reviewer.md` nên nó là hard-site, không phải nấc-khác) ⇒ vị-từ SAI ở tầng `enabled`. Nấc THẬT của khối này = **`enabled` nhưng CỐ Ý KHÔNG DÙNG / dùng một phần** (`used`, không phải bit enable). 🔴 **Trạng-thái enable THẬT đọc `~/.claude/settings.json:17-35`** — bảng này nói về *dùng hay không*. Ranh sạch: `code-review@` = nấc-khác (plugin ship 0 agent, ring1 tự nhận trượt claim "4-phẳng" của chính nó @open) · `pr-review-toolkit`/`code-modernization`/`hookify` = `false` thật trên đĩa.
🔸 *Số đã đi qua 3 lượt: H1 @open "3" → ring1 @open "4" → H1 @close "2 hard + 2 nấc-khác" → **ring1 @close "3 hard + 1 nấc-khác"** (mở thư-mục plugin đếm agent thật). Bản chốt = bản cuối, vì nó là bản DUY NHẤT chạm vào `agents/` của từng plugin.*
- `code-modernization` (5 agent: legacy-analyst/security-auditor/test-engineer…) — SE = .NET 10 greenfield, agent-set trùng test-specialist/reviewer/investigator. Chỉ cmd `modernize-assess/map` ad-hoc khi port NamGroup module.
- `code-reviewer` (×3 nguồn: pr-review-toolkit + feature-dev + standalone skill) collide roster `reviewer`**giữ `reviewer` canonical**, KHÔNG dùng plugin code-reviewer.
- `csharp-lsp`**Windows no-op** (`csharp-ls` không trên PATH; cần `dotnet tool install --global csharp-ls` trước). Defer (Bash dotnet build + grep symbol đủ).
- `commit-commands/commit-push-pr` — giả định GitHub `gh`; SE = Gitea → partial no-op (chỉ `commit.md` dùng được).
---
## 🚦 HMW-mode — Workflow fan-out governance (S49, broadcast `ultracode-hmw-mem-governance`)
> Áp dụng KHI chạy **Workflow runtime fan-out** (`.claude/workflows/hmw.js`). Vận hành thường (Agent-tool spawn lẻ / parallel-trong-1-message) KHÔNG đổi — decision-tree trên vẫn chuẩn. Toggle: `/ultra-on` · `/ultra-off`.
- **Toggle 2-lệnh = on-ramp DUY NHẤT (T1/T2):** `/ultra-on` tạo marker `.claude/hmw-mode.on` (gitignored) + vào mode · `/ultra-off` xóa. Marker = single-source-of-truth, persist qua session/compact. `/session-start` đọc marker → BÁO ON/OFF (T3).
- **Keyword = QUYỀN, KHÔNG lệnh (T4):** "workflow"/"ultracode" mở quyền hỏi, KHÔNG auto-run. Mode-OFF + "chạy workflow" → TỪ CHỐI + nhắc `/ultra-on`. CẤM native `/effort ultracode`. *(Bài học 515K-token false-trigger.)*
- **Scope (S1):** Workflow fan-out CHỈ repo SOLUTION_ERP — KHÔNG fan-out repo/corpus khác.
- **Checkpoint (S2):** `hmw.js` **throw** nếu `checkpointApproved≠true` (mechanized tripwire anti-accidental). Em main BÁO {số agent·vai·task} @inform → set cờ → fan-out (KHÔNG chờ confirm từng lần; marker-ON=consent). Sub KHÔNG spawn sub (S3).
- **VALID_ROLES (whitelist `hmw.js` — ĐỦ roster; số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents, B1 KHÔNG chép số):** `investigator-codebase` · `investigator-api` · `implementer-backend` · `implementer-frontend` · `test-specialist` · `reviewer` · `cicd-monitor` · `frontend-designer` · `database-agent` (+S57 — S56 đã dùng 3× qua fail-soft WARN) · `office-document` (+S107 — Office WRITE OD1OD10) · `tooling-auditor` + `harvest-curator` (+S110 anh-directed — H21 roster-parity lệnh-B) · **`lead-stale-auditor` + `lead-gap-auditor` (+S121 W2 — H24 lead-self-audit)** · **`harness-eval` + `harness-refine` + `harness-audit` (+S141 — trio-memory)** · **`ring1-audit` + `ring2-audit` + `ring4-audit` (+S145 — C4/C4b round-KIỂM ×3: vòng tooling/harvest · soi-lead H24 · nén-ngủ; AUTO fire-after-measure, no-self-exempt, NO-OP nếu vòng không đo)** · **`ctx-curator` + `ctx-verifier` + `ctx-audit` (+S153 OWNER-VETO hub-form 3-vai `0df10df4` — vòng Ctx lớp mềm `_mind`: vai-1 KIỂM-nháp @mỗi-`/pause` [carve-out duy nhất của luật "NGỪNG spawn" §1] · vai-2 ĐỐI-CHIẾU+NẠP @mỗi-`/tiep` · vai-3 SOI-CHUỖI 2 đầu phiên; cả 3 trả CHỈ văn-bản)**. 🔸 **Cả 13 monitor đều INFORM-only, lane RETURN-only** (propose-only; 13 + 10 worker = roster 23, số canonical → STATUS §Sub-agents). 🔴 **KHÔNG đọc "KHÔNG Write/Edit" thành cơ-chế chặn — đo S143:** frontmatter 9 vai read-only **không khai** `Write/Edit`, nhưng **runtime VẪN cấp**, nối ở cuối tool-list (nhân-chứng trực-tiếp: `reviewer` đã Write+Edit thật trong `runs/2026-07-22-S143-closeout-audit/`). Whitelist = **tuyên-bố ý-định**; containment THẬT = em main single-writer + git-diff commit-gate. Role lạ ∉ VALID_ROLES → `hmw.js` **THROW (STOP-HARD)** + báo owner (S4c, DIRECTED REC-3 2026-07-13); role-less null → inherit lead.
- 🔴 **2 vai H24 = trục RIÊNG, KHÔNG gộp H1/H2:** H1 `tooling-auditor` = tooling-freshness · H2 `harvest-curator` = harvest-integrity · **H24 = soi chính LEAD** (`lead-stale-auditor` = cái CÓ-nhưng-LỆCH · `lead-gap-auditor` = cái BỊ THIẾU). Class-flag lấy từ **enum ĐÓNG** `lead_self_audit.flag_classes` (`.claude/agent-memory/memory-budget.json`) — **vai KHÔNG tự chế class**; cặp light chạy **VÔ-ĐIỀU-KIỆN mỗi bookend** (hình B @S149); chỉ **`deep`** còn cổng `h24_cadence.deep_every` (`session-start §2.1.8` · `session-end §L.b(j)`). 🧊 *Mệnh-đề cũ "theo NHỊP, không phải mỗi phiên" GỠ @S164 — trái hành-vi đo được (S154 counter≈28 · S158 counter=32 đều < `light_every` mà cặp VẪN chạy); đây là site thứ 7 của FLAG-1 sau khi 6 site trong 2 file LỆNH vá @S159 — lớp persona/doc sót lại.*
- ⚠️ **Đổi roster = đổi 2 BỀ-MẶT ĐỘC-LẬP:** (1) file `.md` trong `.claude/agents/`**Agent-tool registry** · (2) hằng `VALID_ROLES` trong `hmw.js`**workflow `agentType`**. Sửa 1 quên 1 = vai **spawn được tay nhưng THROW trong workflow** (hoặc ngược lại). 🔴 **Registry = ảnh-chụp lúc khởi phiên, KHÔNG hot-reload** ⇒ vai mới cần **RESTART + spawn-probe THẬT** (`session-start §0.6b`) — `ls` + grep VALID_ROLES là **điều-kiện CẦN, KHÔNG ĐỦ**.
- **Memory governance (M1M5 + R1):** B1 slice-inject (agent ← slice MEMORY của đúng vai qua `args`) · M2 return-delta-only (`memoryDelta{task,verdict,learned,surprise}`) · B3 lead single-writer VERIFY→APPEND-only (no-overwrite-unverified) · B2 harvest-LIỀN sau mỗi workflow vào `agent-memory/<role>` · M5 `store_memory` strip (đã S47). **Containment = defense-in-depth** (git-diff + Qdrant chunk-count post-P2), KHÔNG allowlist đơn-độc (G-015: sub vẫn giữ Bash/Write — KHÔNG "read-only").
> Floor T/S/M/R đầy đủ → `.claude/commands/ultra-on.md`. adap-report → `docs/governance/adap-reports/2026-06-03-Agent-ultracode-hmw-mem-governance.md`.
---
## 💾 Memory discipline
Each agent `.claude/agent-memory/<name>/MEMORY.md` persistent diary. Spawn auto-inject first 200 lines/25KB. Update BEFORE return (BẮT BUỘC, entry ≤ 1.5K chars). **Folder = ĐO ĐĨA, KHÔNG enumerate ở đây** (`ls .claude/agent-memory/*/MEMORY.md | wc -l` — mỗi vai roster 1 folder; số vai canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents — đúng luật dòng-1 file này: vá bằng **BỎ số**, không **ĐỔI số**). *(🧊 S151 XOÁ đoạn khai "17 folder + ring dir RỖNG + `ls` thô ra 18 là ảo-giác": nó SAI từ `398d343` — cả 3 ring diary đã tracked CÓ RUỘT — và là **lập-luận tự-niêm-phong** dạy người soi sau gỡ cờ; H1 F-2 HIGH + stale FLAG-1 @S151. Xoá lập-luận, không chỉ đổi số.)*
**Tiered Memory Policy v1** (adopt AI_INFRA bulletin 2026-05-29 — thay ngưỡng cứng ">25KB archive" bằng tiered + just-in-time; size to ≠ chất lượng, context-rot):
- **L1 HOT** = `MEMORY.md` soft-cap **~30KB** (role + patterns + anti-patterns + 5-8 entry gần nhất) → auto-inject mỗi spawn
- **L2 COLD** = `archive/<YYYY-MM>.md` verbatim (activity cũ) → Read on-demand. **Harness-9 (S70):** `archive/_INDEX.md` mục-lục 1-dòng/bản-ghi (con-trỏ **substring** sha-keyed, fallback Ctrl-F, frozen-additive) = **inject "tấm bản-đồ"**; verbatim + `archive/<period>.gist.md` (nén 4-field, `distill-gen` counter) = đọc-theo-nhu-cầu. "Inject mục-lục, KHÔNG inject lãnh-thổ." Budget-audit @session-start (§2.1.2 session-start.md) chống quên chỉnh ngân sách.
- **L3 SEARCHABLE** = RAG `search_memory` → just-in-time
- Discipline: search L3 / Read L2 TRƯỚC khi deep-dive (đừng nhồi L1). Agent nhớ vô hạn qua L2+L3, context spawn vẫn gọn. Curate khi L1 > ~30KB (KHÔNG còn hard 25KB).
**End-of-session:** em main SendMessage mỗi agent flush MEMORY → đọc 7 update → synthesize cross-agent → integrate project memory/session log → commit/push.
---
## 📊 Cost reality — **re-ground S144 (2026-07-22)**
🔴 **KHAI ĐƠN-VỊ TRƯỚC (bắt buộc — `cost-lens:28` cột "đốt đơn-vị NÀO"):**
Bảng dưới đo bằng **`subagent_tokens` do harness báo per-run** (tổng token của sub, gồm cả phần cache-read).
⚠️ **KHÁC đơn-vị bảng cũ** (*"Effective tokens billed (after caching)"*) **và KHÁC** cả 2 đơn-vị hub dùng ở `depth-cost` (vào+ra tách riêng).
**KHÔNG so trực tiếp được với số hub.** Xem §residual.
| Lớp spawn | Đo THẬT S144 | n | Ghi chú |
|---|---|---|---|
| Probe tối thiểu (cấm gọi tool) | **~28.0K**/vai | 3 | registry-probe trio; sàn dưới của một lần spawn |
| Monitor audit đầy đủ (H1/H2) | **~223232K**/vai | 2 vai × 2 lượt | gồm lượt resume sau #53 |
| Lane invest (đọc 3 file + verify) | **~164K**/lane | 5 | `wf_491c05a8-6dc` 819.982 / 5 |
| Lane review (chấm 1 spec + spot-check) | **~144K**/lane | 3 | `wf_301d3943-144` 432.515 / 3 |
**Phiên S144 (governance-heavy, 13 spawn + 3 workflow):** ~2,3M `subagent_tokens` cho riêng sub.
### 🔴 Bài học đắt nhất của phiên: lane CHẾT vẫn ĐỐT ĐỦ
`wf_491c05a8-6dc`: 3/5 lane cháy `maxTurns:20`**~490K token đốt, 0 sản phẩm**.
⇒ Cost thật **KHÔNG** tỉ lệ với kết quả — phải đếm **token/lane-SỐNG**, không phải token/lane-phóng.
Vá: `hmw.js` C1 nay LOUD-báo lane chết (trước đây `.filter(Boolean)` nuốt lặng ⇒ số này vô hình).
### Nhánh TỰ LÀM TƯƠI (`auto-toan-vong:29-31` — O-4e)
Bảng này **đóng băng** từ thời roster 7 vai tới nay (roster đã lớn hơn nhiều — canonical → [`docs/STATUS.md`](../../docs/STATUS.md) §Sub-agents, KHÔNG hardcode số) = đúng bệnh *"số-đo-đóng-băng"* hub vá.
🔴 **Luật từ nay:** khi roster đổi **hoặc** số đo lệch >30% so lần ghi trước ⇒ **đọc lại + cập nhật NGAY trong phiên đó**, không ghi-nhận-rồi-treo-disposition.
*(Ngưỡng 30% = AI-tự-đặt, đảo được — không phải số owner.)*
### Residual (khai thẳng, không tô)
- 🔴 **Falsifier `depth-cost:59` VẪN CHƯA trả lời được**: nó hỏi *"bảng cost ghi đơn-vị nào, lệch mấy lần"* — SE dùng đơn-vị **thứ ba**, muốn so phải đo lại theo đơn-vị hub (vào/ra tách). C9 chỉ đóng phần **re-ground roster 7→17**, **KHÔNG** đóng phần so-sánh-chéo-nhà.
- Số cũ (*~1.85M / ~9× solo*) **gỡ** vì mẫu-số roster đã sai 7 vs 17; **không** giữ để so — hai đơn-vị khác nhau, so là tự lừa.
**+50% budget** (vs prior ~700K opt / ~1.35M heavy → now ~1.05M opt / ~2M heavy ceiling). Max 20× plan absorbs ~5× comfortable. Trade-off justify: split nhẹ hơn mỗi spawn (giảm gotcha #53 truncate) + parallel BE+FE+test (giảm wall-clock) + test-specialist clear coverage gap backlog (quality).
---
## 🎯 Project tunings (SOLUTION_ERP)
**Stack:** .NET 10 Clean Arch + CQRS MediatR + EF Core 10 + SQL Server + 2 React 19 Vite 8 FE + Gitea CI + Windows IIS.
**State 🧊 FROZEN-HISTORICAL (S38 — 2026-05-28; số CỐ Ý không cập nhật — state sống → [`docs/STATUS.md`](../../docs/STATUS.md) §CURRENT STATE; nhãn thêm @S151 per H1 F-8 "sửa NHÃN, KHÔNG sửa SỐ"):** 40 mig · 84 tables · ~223 endpoints · 53 FE pages · 130 test PASS · 53 gotchas · 27 memory · 6 skills · 7 sub-agents · Phase 10 COMPLETE 11/11 Plan G-*.
**Windows MAX_PATH:** project path nested + Dropbox-managed → implementer KHÔNG dùng `isolation: worktree`. Default branch OK.
**UAT live mode (Phase 9):** `feedback_uat_skip_verify` — skip `dotnet test` mỗi chunk, vẫn `npm run build` × 2. test-specialist test-after khi UAT confirm; test-before cho bug/critical algo.
---
## 🔗 References
- [Anthropic Building Effective Agents](https://www.anthropic.com/engineering/building-effective-agents)
- [Cognition "Don't Build Multi-Agents"](https://cognition.ai/blog/dont-build-multi-agents)
- BVAAU 7-agent reference: `D:\Dropbox\CONG_VIEC\BENHVIEN_A_AU\SOURCE_CODDE\.claude\agents\` (adapted S39 — split trục + 5 RAG tool; SOLUTION_ERP giữ 6 skill + backend/frontend split thay domain/infra cho 2-FE-app fit)
- Memory: `feedback_per_chunk_commit` · `feedback_uat_skip_verify` · `feedback_audit_reuse_before_clone` · `feedback_implementer_truncation_mitigation` (gotcha #53)
## ⚠️ CLI restart required
Agent definition change (S39 split 4→7) → **anh main restart Claude Code CLI** để registry hot-reload (per S27 lesson — model:inherit + new agent files). Verify post-restart: spawn smoke test mỗi agent mới (investigator-api / implementer-frontend / test-specialist) confirm load OK.
> **Cập nhật S107 (2026-07-10):** harness hiện tại **HOT-RELOAD agent file MỚI giữa phiên** (office-document tạo + spawn-test PASS cùng phiên, 0 restart). S27 lesson thu hẹp còn: **EDIT agent đang tồn tại** + command `.md` (chưa re-verify hot-reload) → restart vẫn là default an toàn cho 2 ca đó.
> ⚠️ **ENV-DEPENDENT (S110 2026-07-11 — triage-reply S5 hub):** hub chạy CÙNG experiment ADD-agent-mới → kết quả NGƯỢC (0 system-notice + spawn "not found" ×2 qua turn-boundary) ⇒ hot-reload-ADD-mới KHÔNG fleet-proof, chỉ verified trên env SE tại S107; **restart = default an toàn MỌI ca** khi nghi ngờ.