From cf908f527617021c571647273c6c2e1651483d0e Mon Sep 17 00:00:00 2001 From: pqhuy1987 Date: Wed, 3 Jun 2026 13:15:03 +0700 Subject: [PATCH] =?UTF-8?q?[CLAUDE]=20Infra:=20adopt=20AI=5FINFRA=20HMW-go?= =?UTF-8?q?vernance=20broadcast=20=E2=80=94=20ultra-on/off=20toggle=20+=20?= =?UTF-8?q?hmw.js=20checkpoint-gate=20+=20memory-safety=20(S49)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit adap-apply 2026-06-03-Agent-ultracode-hmw-mem-governance (reviewer_gate PASS). PROJECT-FIT=ADOPT tailored: SE 8-agent roster. nac=executed-file (verified-pending restart+spawn-test). - T1/T2 toggle: .claude/commands/ultra-on.md + ultra-off.md; marker .claude/hmw-mode.on gitignored (T2 non-negotiable). - T3: session-start BUOC 0.5 reads marker -> reports ON/OFF. - S2/S3/S4: .claude/workflows/hmw.js P2 fan-out — checkpointApproved throw (mechanized), args JSON.parse-guard, role-whitelist fail-soft, VALID_ROLES=8 SE agents, sub-no-spawn-sub, return schema findings+memoryDelta 4-field (R1). - M1-M5: B1 slice-inject / M2 return-delta-only / B3 single-writer append-only / B2 harvest-lien / M5 store_memory-strip re-verified intact (0 tools-grant). - agents/README.md +HMW governance section (VALID_ROLES source-of-truth) + adap-report 5-field LOCK. Test 181 unchanged (no .cs/.tsx). CI-skip (all .md/.js/.gitignore). Co-Authored-By: Claude Opus 4.8 (1M context) --- .claude/agents/README.md | 15 +++ .claude/commands/session-start.md | 8 ++ .claude/commands/ultra-off.md | 11 +++ .claude/commands/ultra-on.md | 50 ++++++++++ .claude/workflows/hmw.js | 98 +++++++++++++++++++ .gitignore | 4 + ...6-03-Agent-ultracode-hmw-mem-governance.md | 46 +++++++++ 7 files changed, 232 insertions(+) create mode 100644 .claude/commands/ultra-off.md create mode 100644 .claude/commands/ultra-on.md create mode 100644 .claude/workflows/hmw.js create mode 100644 docs/governance/adap-reports/2026-06-03-Agent-ultracode-hmw-mem-governance.md diff --git a/.claude/agents/README.md b/.claude/agents/README.md index ca8c1c9..f6569da 100644 --- a/.claude/agents/README.md +++ b/.claude/agents/README.md @@ -139,6 +139,21 @@ All 7 agent có **4 RAG-READ MCP**: `search_memory` + `search_code` (BM25, prefe --- +## 🚦 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 (8 — whitelist `hmw.js`):** `investigator-codebase` · `investigator-api` · `implementer-backend` · `implementer-frontend` · `test-specialist` · `reviewer` · `cicd-monitor` · `frontend-designer`. Role lạ → default subagent + WARN (fail-soft, S4c). +- **Memory governance (M1–M5 + 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/` · 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//MEMORY.md` persistent diary. Spawn auto-inject first 200 lines/25KB. Update BEFORE return (BẮT BUỘC, entry ≤ 1.5K chars). 8 folder: investigator-codebase · investigator-api · implementer-backend · implementer-frontend · test-specialist · reviewer · cicd-monitor · frontend-designer. diff --git a/.claude/commands/session-start.md b/.claude/commands/session-start.md index 7a5c0ee..74e4d7f 100644 --- a/.claude/commands/session-start.md +++ b/.claude/commands/session-start.md @@ -16,6 +16,14 @@ Em main PHẢI echo **TOÀN BỘ nội dung command body này** (đầy đủ Ph 2. Em proceed execute Phase 1 → 3 sequential ngay 3. Anh user điều chỉnh **cuối session** nếu cần thay đổi nội dung command (KHÔNG mid-flow interrupt) +## 📋 BƯỚC 0.5 — HMW-mode marker check (T3 — broadcast `ultracode-hmw-mem-governance`) + +Em main đọc `.claude/hmw-mode.on` → **BÁO ngay đầu response** (anh khỏi quên đang ở mode đốt-token): +- **Marker TỒN TẠI** → **🔥 HMW-mode = ON** — task LỚN sẽ chạy Workflow `hmw` fan-out theo `/ultra-on` (đốt-token cao). Gõ `/ultra-off` để tắt. +- **Marker KHÔNG có** → **HMW-mode = OFF** — vận hành thường (Agent-tool spawn lẻ / solo theo `agents/README.md`). Workflow fan-out chỉ chạy sau `/ultra-on`. + +> 🚦 **T4:** keyword "workflow"/"ultracode" (câu anh / reminder harness) = **QUYỀN hỏi, KHÔNG phải lệnh**. Mode-OFF + "chạy workflow" → em **TỪ CHỐI + nhắc gõ `/ultra-on`**, KHÔNG tự chạy. CẤM native `/effort ultracode`. + ## Phase 1 — READ (load context) Đọc theo thứ tự, KHÔNG skip: diff --git a/.claude/commands/ultra-off.md b/.claude/commands/ultra-off.md new file mode 100644 index 0000000..0e7c037 --- /dev/null +++ b/.claude/commands/ultra-off.md @@ -0,0 +1,11 @@ +--- +description: TẮT HMW-mode SOLUTION_ERP — về vận hành thường (Agent-tool spawn lẻ / solo theo agents/README decision-tree). Cặp với /ultra-on. +--- + +# /ultra-off — TẮT HMW-mode (SOLUTION_ERP) + +> Cặp với **`/ultra-on`**. 🔴 restart Claude Code nếu vừa tạo (no hot-reload). + +Em main: **xóa marker** `.claude/hmw-mode.on` (Remove-Item; không có → "đã tắt sẵn") + **thoát HMW-mode** → task chạy **vận hành THƯỜNG** (Agent-tool spawn theo `.claude/agents/README.md` decision-tree / solo). `/session-start` kế báo **OFF**. Workflow fan-out chỉ chạy lại khi `/ultra-on` (deliberate on-ramp — KHÔNG consent-miệng, KHÔNG keyword auto-run). + +> 🧠 **Ký ức GIỮ NGUYÊN:** memory đã harvest các lần HMW trước KHÔNG bị xóa (B3 append-only — memory là tài sản). Tắt mode chỉ dừng *chạy mới*, không đụng *đã lưu*. diff --git a/.claude/commands/ultra-on.md b/.claude/commands/ultra-on.md new file mode 100644 index 0000000..8947cc3 --- /dev/null +++ b/.claude/commands/ultra-on.md @@ -0,0 +1,50 @@ +--- +description: BẬT HMW-mode SOLUTION_ERP — task LỚN chạy Workflow fan-out (8-agent roster) + sub giữ ký ức slice + verify-before-memory-write (no-overwrite-unverified) + harvest LIỀN sau mỗi workflow. /ultra-off để tắt. Gõ = anh CONSENT chạy Workflow (deliberate on-ramp). +argument-hint: (trống = bật mode · hoặc kèm task lớn đầu tiên) +--- + +# /ultra-on — BẬT HMW-mode (SOLUTION_ERP) + +> Cặp **`/ultra-off`**. 🔴 restart Claude Code sau khi tạo/sửa (command `.md` no hot-reload). +> Gõ lệnh này = **CONSENT chạy Workflow fan-out** · scope **CHỈ repo SOLUTION_ERP** (S1 — KHÔNG fan-out repo/corpus khác) · **same-model** Opus 4.8 inherit mỗi agent. +> **Mode persist qua marker:** `/ultra-on` → em main tạo `.claude/hmw-mode.on` (Write) + vào mode → SỐNG qua session/compact. `/ultra-off` xóa. **`/session-start` đọc marker → BÁO anh ON/OFF** (khỏi quên đang ở mode đốt-token). marker = source-of-truth · **gitignored** (KHÔNG commit — tránh mode kẹt-ON khi clone = on-ramp ungoverned). + +**Task đầu (nếu có):** $ARGUMENTS + +## 🚦 Keyword = QUYỀN, KHÔNG phải LỆNH (T4 — bài học 515K-token false-trigger) +- Chữ "workflow" / "ultracode" trong câu anh HOẶC trong reminder harness = **MỞ QUYỀN hỏi** (eligibility-to-ask), **KHÔNG** auto-run Workflow. +- Mode-OFF + anh nói "chạy workflow" → em main **TỪ CHỐI + nhắc anh gõ `/ultra-on`**, KHÔNG tự chạy. +- 🔴 CẤM dùng native `/effort ultracode` (nó auto-author+run workflow MỌI task — KHÔNG checkpoint / KHÔNG memory-harvest / KHÔNG scope-guard = ngược thiết kế). HMW = home-built orchestrator-workers, **marker-gated**. + +## Phân loại (em main mỗi task) +- **HMW (LỚN):** fan-out nhiều file/nguồn — sweep · audit · cross-stack review · mass migration · multi-source research. Số task THOẢI MÁI (harness queue theo slot, KHÔNG cap cứng) · spawn **ĐÚNG VAI** (`agentType` ∈ VALID_ROLES; role lạ → default subagent + cảnh báo). +- **Thường (nhỏ):** <30min · 1–2 file · hỏi-đáp → Agent-tool spawn lẻ / solo theo `.claude/agents/README.md` decision-tree, KHÔNG HMW. + +## VALID_ROLES (roster SOLUTION_ERP — 8 sub) +`investigator-codebase` · `investigator-api` · `implementer-backend` · `implementer-frontend` · `test-specialist` · `reviewer` · `cicd-monitor` · `frontend-designer` +> Role lạ ∉ list → `hmw.js` degrade về default subagent + WARN (fail-soft, KHÔNG crash). Windows MAX_PATH (Dropbox nested) → KHÔNG `isolation:worktree`. + +## Quy trình HMW — vai trò từng phase +| Phase | Ai | Làm | +|---|---|---| +| **P0** prep | 👤 em main | đọc MEMORY sub liên quan → **memory-pack SLICE/vai** (KHÔNG full) + `taskList` + chụp **chunk-count Qdrant baseline** + git status sạch | +| **P1** decide | sub liên quan (full memory) | recommend approach + **acceptance-checklist** → em main chốt plan | +| ⏸ **checkpoint** (inform) | 👤 em main | BÁO `{số agent · vai · task}` @inform → set `args.checkpointApproved=true` → fan-out NGAY (marker-ON=consent; anh interrupt nếu sai — KHÔNG chờ confirm từng lần) | +| **P2** execute | Workflow `hmw` | fan-out agent: **memory-pack injected** qua `args` + `agentType` + schema. DEFAULT read/analyze; write = file-disjoint. inherit Opus | +| **P3** harvest | 👤 em main (single-writer) | **NGAY sau P2** → VERIFY delta + APPEND-only vào MEMORY.md **mọi agent tham gia** (B3) | +| **P4** final | sub quality (full memory) | reviewer PASS/FAIL · cicd-monitor drift · investigator verify · implementer/test scope → return delta | +| **→** | 👤 em main | synthesize + **git-diff** + **chunk-count check** + commit (anh OK) | + +## 🧠 KỶ LUẬT KÝ ỨC (cốt lõi — M1..M5 + R1) +- **B1 (M1) có ký ức:** agent vai X ← memory-pack **slice của đúng sub X** (qua `args`; script KHÔNG đọc file — lead đọc `.claude/agent-memory/X/MEMORY.md` @P0 rồi bơm @P2). KHÔNG full memory. +- **B2 (M4) đúng chỗ + harvest-LIỀN:** delta vai X → `.claude/agent-memory/X/MEMORY.md`. Harvest NGAY sau MỖI workflow (KHÔNG gom cuối session) → memory mọi agent fresh TRƯỚC lần spawn kế. Tốc-độ KHÔNG override B3. +- **B3 (M3) KHÔNG ghi đè nếu chưa kiểm tra:** em main = **single-writer**, VERIFY delta → **APPEND-only**; KHÔNG overwrite/sửa/xóa entry cũ trừ khi verified; delta nghi ngờ → **pending-verify** (không nhập). *(Generalize: memory cũ = tài sản.)* +- **R1 return contract:** mỗi agent return `findings` + `memoryDelta{task,verdict,learned,surprise}` (bắt buộc) + `checklistEvidence` (tùy). Agent **CHỈ return** — KHÔNG tự ghi ký ức kênh nào. +- **M5 prereq (verify-ONLY, KHÔNG re-author):** `store_memory` đã strip khỏi MỌI sub (broadcast `Memory-store-memory-strip-global`, applied S47) → kênh RAG-write mechanized-blocked. Re-verify intact: `grep store_memory .claude/agents/*.md` → **0** ở dòng `tools:`. + +### 🔴 Enforcement THẬT (G-015 — KHÔNG overclaim) +- **Mechanized** = CHỈ `store_memory` gỡ khỏi allowlist (tool RAG-write đó **không-gọi-được**). KHÔNG = agent "read-only". +- *"KHÔNG ghi file MEMORY.md"* = **prompt-rule, CHƯA mechanized** — sub vẫn giữ `Bash` (+ `Write/Edit` vai write) = kênh ghi MỞ (Bash ghi file bất kỳ / curl thẳng Qdrant `:6333`). +- **Containment thật = defense-in-depth:** `git diff` post-P2 (bắt file-write) + **chunk-count Qdrant pre/post-P2** (bắt RAG-write). Lỗ residual (ghi ngoài-repo / Qdrant net-zero-delta) → sandbox / strip-`Bash` khỏi vai read-only = **defer** (Bash cần cho audit). + +**Guards:** S1 scope-repo-mình · S2 checkpoint-throw (`hmw.js` GIỮ anti-accidental) · S3 sub-KHÔNG-spawn-sub · B3 + harvest-liền · git-diff + chunk-count post-P2 · same-model · số-task-thoải-mái + spawn-đúng-vai · KHÔNG bỏ P3. diff --git a/.claude/workflows/hmw.js b/.claude/workflows/hmw.js new file mode 100644 index 0000000..a67d03f --- /dev/null +++ b/.claude/workflows/hmw.js @@ -0,0 +1,98 @@ +// hmw.js — HMW P2 (Execute) workflow cho SOLUTION_ERP. CHẠY bởi Workflow runtime (body wrap async → +// top-level await/return hợp lệ); KHÔNG node-runnable trực tiếp (`node hmw.js` sẽ lỗi await). +// Em main lo P0/P1/P3/P4 NGOÀI workflow; script này CHỈ lo P2 fan-out. +// Invoke bằng {scriptPath} (no hot-reload — restart/re-invoke sau khi sửa). Scope = repo SOLUTION_ERP ONLY (S1). + +export const meta = { + name: 'hmw', + description: 'HMW P2 execute (SOLUTION_ERP) — fan-out 8-agent roster có MEMORY-PACK slice (qua args vì script không đọc file) + return findings + checklistEvidence + memoryDelta (spawn-record 4-field). DEFAULT read/analyze; write fan-out = file-disjoint + em main git-diff sau P2. taskList thoải mái (queue theo slot, không cap cứng). memoryDelta KHÔNG tự ghi — em main VERIFY + APPEND-only @P3 (no-overwrite-unverified, B3). Same-model inherit Opus. Scope = repo SOLUTION_ERP ONLY (S1 — KHÔNG fan-out repo/corpus khác).', + phases: [{ title: 'Execute', detail: 'fan-out memory-pack-injected agents, structured return' }], +} + +// ─── args (em main bơm @P2 sau khi P1 chốt) ────────────────────────────────── +// args = { +// memoryPack: { 'investigator-codebase':'', 'implementer-backend':'...', reviewer:'...', ... }, // SLICE liên quan, KHÔNG full +// spec: '', +// checkpointApproved: true, // em main set SAU khi BÁO {số agent·vai·task} @inform (S2) +// taskList: [ { role:, label:'..', prompt:'..' }, ... ] +// } + +const VALID_ROLES = [ + 'investigator-codebase', 'investigator-api', + 'implementer-backend', 'implementer-frontend', + 'test-specialist', 'reviewer', 'cicd-monitor', 'frontend-designer', +] + +const SCHEMA = { + type: 'object', + required: ['findings', 'memoryDelta'], + properties: { + findings: { type: 'string', description: 'Kết quả chính. MỌI claim kèm evidence file:line. KHÔNG narrative suông.' }, + checklistEvidence: { type: 'string', description: 'Bằng chứng cho acceptance-checklist P1 (số đo / PASS-FAIL / verdict).' }, + memoryDelta: { + type: 'object', + description: 'Spawn-record 4-field — RETURN-only để EM MAIN harvest @P3. Agent KHÔNG tự ghi ký ức (KHÔNG file MEMORY.md, KHÔNG store_memory/RAG). Em main VERIFY + APPEND-only (KHÔNG overwrite entry cũ nếu chưa kiểm tra — B3).', + required: ['task', 'verdict', 'learned', 'surprise'], + properties: { + task: { type: 'string', description: 'việc gì (1 dòng)' }, + verdict: { type: 'string', description: 'kết luận / PASS-FAIL / root-cause' }, + learned: { type: 'string', description: 'pattern / anti-pattern rút ra' }, + surprise: { type: 'string', description: 'edge-case / bất ngờ (chống mất discovery)' }, + }, + }, + }, +} + +// S4b — args có thể tới OBJECT hoặc JSON-STRING (harness đôi khi stringify object args) → normalize defensive +const A = (typeof args === 'string') ? JSON.parse(args) : (args || {}) + +if (!A || !Array.isArray(A.taskList) || A.taskList.length === 0) { + throw new Error('hmw: cần args.taskList (mảng {role,label,prompt}) — em main bơm @P1. (đã thử JSON.parse nếu args bị stringify.)') +} +// S2 mechanize: checkpoint TRƯỚC P2 = gate CỨNG, không chỉ prompt. Em main BÁO {số agent·vai·task} @inform +// (KHÔNG chờ confirm) → set args.checkpointApproved=true → fan-out. Flag GIỮ = anti-accidental-fire +// (call quên-set-flag → throw, chặn 515K-class accidental). +if (A.checkpointApproved !== true) { + throw new Error('hmw: checkpointApproved chưa set — em-main BÁO {số agent·vai·task} @inform rồi set args.checkpointApproved=true (guard = anti-accidental-fire).') +} +// S4 — số task THOẢI MÁI: harness chạy theo slot, dư tự queue, KHÔNG cap cứng (soft notice only). +if (A.taskList.length > 16) { + log(`hmw: taskList=${A.taskList.length} (>16) → harness queue theo slot (thoải mái, không cap cứng).`) +} + +const memoryPack = A.memoryPack || {} +const spec = A.spec || '' + +phase('Execute') +log(`HMW P2: fan-out ${A.taskList.length} task (same-model inherit, memory-pack-injected, scope=SOLUTION_ERP repo only)`) + +const results = await parallel(A.taskList.map((t, i) => () => { + const raw = t && t.role + const role = VALID_ROLES.includes(raw) ? raw : undefined // S4c whitelist; invalid → default subagent (fail-soft) + if (raw && !role) log(`⚠️ hmw: agentType "${raw}" ∉ VALID_ROLES → default subagent cho task #${i}`) + + const mem = role && memoryPack[role] ? memoryPack[role] : '' + const prompt = [ + mem ? `## MEMORY-PACK (${role}) — SLICE ký ức tích lũy của sub này, ĐỌC trước khi làm (KHÔNG phải full memory):\n${mem}\n` : '', + spec ? `## SPEC / acceptance-criteria (chung):\n${spec}\n` : '', + `## TASK:\n${(t && t.prompt) || '(thiếu prompt — lỗi taskList @P0)'}`, + [ + '## OUTPUT (structured bắt buộc):', + '- findings: kết quả + evidence file:line (KHÔNG narrative suông).', + '- checklistEvidence: số đo / verdict cho acceptance-checklist.', + '- memoryDelta {task·verdict·learned·surprise}: để EM MAIN harvest @P3.', + '⚠️ KHÔNG ghi ký ức kênh nào: KHÔNG file MEMORY.md, KHÔNG store_memory/RAG-write (Qdrant). CHỈ return memoryDelta → em main VERIFY + APPEND-only @P3 (B3). KHÔNG overwrite file/chunk của sub khác.', + '⚠️ Nếu task có WRITE file: CHỈ file-disjoint được giao (em main git-diff verify sau P2). KHÔNG đụng file ngoài phạm vi. Scope = repo SOLUTION_ERP only (S1).', + ].join('\n'), + ].filter(Boolean).join('\n') + + return agent(prompt, { + agentType: role || undefined, + schema: SCHEMA, + label: (t && t.label) || `hmw:${role || 'task'}-${i}`, + }) +})) + +// trả mảng kết quả (lọc null nếu agent lỗi/null — invalid-role vẫn chạy default subagent, KHÔNG skip) +// về em main → P3 VERIFY + harvest + P4 checklist +return results.filter(Boolean) diff --git a/.gitignore b/.gitignore index f760df0..44bbbff 100644 --- a/.gitignore +++ b/.gitignore @@ -82,6 +82,10 @@ src/Backend/SolutionErp.Api/wwwroot/exports/ !.claude/ !.claude/** +# HMW-mode marker — session-local toggle (T2: MUST gitignore — commit → clone stuck-ON / ungoverned on-ramp). +# Pattern AFTER !.claude/** so last-match wins (.claude/ itself not excluded → re-include valid). +.claude/hmw-mode.on + # Claude harness orphan dumps *.zip diff --git a/docs/governance/adap-reports/2026-06-03-Agent-ultracode-hmw-mem-governance.md b/docs/governance/adap-reports/2026-06-03-Agent-ultracode-hmw-mem-governance.md new file mode 100644 index 0000000..b4546bb --- /dev/null +++ b/docs/governance/adap-reports/2026-06-03-Agent-ultracode-hmw-mem-governance.md @@ -0,0 +1,46 @@ +# adap-report — 2026-06-03-Agent-ultracode-hmw-mem-governance + +> SISTER = SOLUTION_ERP. Report-format LOCK (5 trường). Generated S49 (2026-06-03), manual apply by em main (governance task, 0 sub-agents spawned). Commands/script `.md`/`.js` **chưa runtime-live pre-restart** (no hot-reload). + +## 1. id-broadcast +`2026-06-03-Agent-ultracode-hmw-mem-governance` (category: Agent · reviewer_gate: **PASS** · nac: published · targets: **all-fit**). Prereq component = `2026-06-02-Memory-store-memory-strip-global` (đã applied S47, re-verified intact dưới). + +## 2. nac G-011 +**executed-file** (S49 — toggle commands + hmw.js workflow + gitignore marker + session-start T3 + agents/README HMW section written) → **VERIFIED-pending** (cần (a) restart Claude Code để command/script hot-reload, (b) 1 spawn-test Workflow `hmw` thật để prove checkpoint-throw fires + harvest chạy). M5 prereq = **VERIFIED-runtime** (re-check this session: 0 `store_memory` in any agent `tools:`). Remaining external = AI_INFRA `/adap-audit` 2-way cross-check. + +## 3. evidence +**PROJECT-FIT = ADOPT (tailored).** SE = multi-agent project (8-sub roster, NOT roster-0; NOT sequential-thuần). Honest nuance: SE hiện fan-out qua **Agent-tool** (multi-Agent-call-trong-1-message), **CHƯA dùng Workflow runtime** (`.claude/workflows/` chưa tồn tại trước S49). → toggle-gate = on-ramp governed cho KHI SE chạy Workflow fan-out; memory-governance + keyword-discipline áp NGAY cho Agent-tool fan-out hiện tại. + +Files written/edited (all in repo SOLUTION_ERP): +- **T1 toggle** — NEW `.claude/commands/ultra-on.md` (BẬT + P0–P4 procedure + memory-discipline M1–M5 + R1 + Accuracy G-015) + NEW `.claude/commands/ultra-off.md` (TẮT, memory-giữ-nguyên). +- **T2 marker gitignored** — `.gitignore` +`.claude/hmw-mode.on` (đặt SAU `!.claude/**` → last-match-wins; `.claude/` không bị exclude nên re-include hợp lệ). `grep hmw-mode .gitignore` → CÓ. +- **T3 session-start** — `.claude/commands/session-start.md` +BƯỚC 0.5 (đọc marker → BÁO ON/OFF đầu response + T4 keyword-discipline). +- **S2/S3/S4 checkpoint+entrypoint** — NEW `.claude/workflows/hmw.js` (P2 fan-out): `checkpointApproved!==true` → **throw** (mechanized tripwire); args `JSON.parse`-guard (S4b); role-whitelist fail-soft (S4c); taskList soft-cap log-only (S4); `VALID_ROLES` = 8 SE agent; sub-no-spawn-sub (chỉ script/lead fan-out); return SCHEMA `findings`+`memoryDelta{task,verdict,learned,surprise}` (R1). +- **roster doc** — `.claude/agents/README.md` +§HMW-mode (T1–T4 + S1–S4 + VALID_ROLES + M1–M5 + containment G-015). + +SELF-CHECK (broadcast): +- T1/T2: đúng 2-lệnh-đôi + `grep hmw-mode .gitignore` → **CÓ** (gitignored). ✓ +- T3: session-start BƯỚC 0.5 đọc marker + BÁO ON/OFF. ✓ (executed-file; runtime sau restart) +- T4: rule "keyword=quyền-KHÔNG-lệnh" + "mode-OFF+chạy-workflow→từ-chối+nhắc-`/ultra-on`" ghi trong ultra-on.md + session-start + README. ✓ +- S1: scope repo-SOLUTION_ERP-only ghi trong meta.description + prompt-inject + README. ✓ +- S2: `hmw.js` throw nếu `checkpointApproved≠true` — **mechanized** (code line, không chỉ prompt). ⏳ live-fire test pending restart. +- S3/S4: sub-no-spawn-sub · invoke-by-scriptPath (`Workflow({scriptPath})`) · args JSON.parse-guard · role-whitelist fail-soft. ✓ (code) +- M1–M4: B1 slice-inject qua args · M2 return-delta-only (RAG-write allowlist-mechanized; file-MEMORY.md-write = prompt+git-diff, KHÔNG gộp 1 nhãn) · B3 lead single-writer VERIFY→APPEND-only · B2 `agent-memory/` + harvest-liền. ✓ (documented ultra-on.md + README) +- M5 (verify-ONLY): `grep store_memory .claude/agents/*.md` → **0** ở dòng `tools:` (5 hits còn lại = prose doc README/frontend-designer mô tả strip, KHÔNG phải grant). ✓ strip-global intact. +- R1: schema `findings` + `memoryDelta{task,verdict,learned,surprise}` bắt-buộc trong SCHEMA. ✓ +- Restart + spawn-test fan-out nhỏ → kiểm checkpoint-throw + harvest THẬT: ⏳ **pending** (báo đúng nấc executed-file, KHÔNG claim verified-runtime). + +commit-sha: **(pending — commit cuối /adap-apply này).** + +## 4. tailored-gì + skip-gì-vì-sao +- **FUNCTION-floor adopted FULLY (T/S/M/R verbatim-in-spirit):** không hạ 1 điểm floor. Toggle 2-lệnh · marker-gitignored · keyword≠command · scope-repo-mình · checkpoint-throw-mechanized · sub-no-spawn-sub · args-guard · role-whitelist-fail-soft · B1/B2/B3 · harvest-liền · single-writer · return-schema 4-field — giữ đủ. +- **FORM tailored theo SE:** (a) `VALID_ROLES` = **8 SE agent** (investigator-codebase/api · implementer-backend/frontend · test-specialist · reviewer · cicd-monitor · frontend-designer) thay roster AI_INFRA (investigator/implementer/reviewer/cicd 4-role). (b) Marker filename giữ `.claude/hmw-mode.on` (literal AI_INFRA OK — KHÔNG buộc đổi, cơ-chế là floor). (c) Command names giữ `/ultra-on` `/ultra-off` (consistent cross-repo, anh dễ nhớ). (d) +SE-constraint note: Windows MAX_PATH → KHÔNG `isolation:worktree` (SE-specific, AI_INFRA không có). (e) P1/P4 "4 sub full-memory" → map sang SE quality-roster (reviewer/cicd/investigator/implementer-test). (f) Bilingual VN-heavy theo gu SE doc. +- **KHÔNG skip mục nào** — SE fit = adopt (KHÔNG phải n-a). n-a-case (roster-0 / Workflow-never + sequential-thuần) KHÔNG áp: SE có roster thật + Workflow tool available + anh explicit-request topic "workflow và cách quản trị memory". +- **M5 KHÔNG re-author** (link-only verify) — đúng broadcast chỉ-thị (prereq #1 đã S47). + +## 5. honest-caveat +- **🔴 PROJECT-FIT honest:** SE **chưa từng chạy** Workflow runtime fan-out (toàn bộ multi-agent lịch sử = Agent-tool spawn lẻ/parallel). Nên `hmw.js` + checkpoint-throw là **on-ramp sẵn-sàng + executed-file**, CHƯA proven-by-run. checkpoint-throw "mechanized" = đúng (code throw, không chỉ prompt) NHƯNG **chưa fire thật** — verified-runtime cần 1 spawn-test post-restart (SELF-CHECK "test 1 call quên-cờ → bị chặn"). Đừng đọc report này là "HMW đã chạy ở SE". +- **Accuracy (G-015 — KHÔNG overclaim):** strip `store_memory` = tool RAG-write đó **không-gọi-được**, **KHÔNG** = agent "read-only". Sub vẫn giữ `Bash` (mọi sub) + `Write/Edit` (vai write) = kênh ghi MỞ (Bash ghi file bất-kỳ / curl thẳng Qdrant :6333). **Containment thật = defense-in-depth:** git-diff post-P2 + chunk-count Qdrant pre/post-P2 — KHÔNG phải allowlist đơn-độc. Lỗ residual (ghi ngoài-repo / Qdrant net-zero-delta) → sandbox / strip-Bash = defer. +- **Checkpoint INFORM-only ≠ no-gate:** nó *là* gate mechanized (throw chống fire-nhầm) + marker-ON (deliberate-consent) + plan-visible-inform; chỉ KHÔNG block-confirm-từng-lần. Protection 3-lớp, KHÔNG phải "không kiểm soát". +- **"Auto-run" KHÔNG tồn-tại ở SE:** keyword "workflow"/"ultracode" (kể cả trong reminder harness Workflow-tool-description) = MỞ-QUYỀN; chỉ marker-ON (set bởi `/ultra-on` deliberate) mới authorize fan-out. S49 này em main áp adap-apply **solo, 0 Workflow fan-out** = đang tuân T4 đúng (mode hiện OFF — marker chưa tạo). +- **Restart-batch lesson (S47 carry):** 3 broadcast S47 + broadcast NÀY (S49) + login-fix S48 → toàn bộ `.md`/`.js` agent/command-edits cần 1 restart chung để hot-reload. Anh restart 1 lần activate cả `/ultra-on` `/ultra-off` + `hmw.js` + session-start T3.