check-email 6 broadcast moi (H23 model-at-spawn / H24 lead-self-audit / H22 wal-defect-fix 5-san / H22 push-guard / EOL-CRLF agent-registry / owner-sign) - hash 7/7 + tamper 4/4 MATCH. Pipeline H21: fable-clone invest 5-lane (wf_1f6bd5e2-478, 5/5 clean) -> spec v1 -> fable-clone reviewer 4-lane (wf_78a84f9b-03e: R2 FAIL 4C+8M, R3 FAIL 5C+6M, R1/R4 chet #53) -> v2 -> fable-real reviewer cong-cuoi (wf_cb964f83-331: GO-WITH-FIXES + 8 fix + 2 honesty-C) -> v3 (STILL-BROKEN = 0). Anh chot B: dung tai spec, wave chay phien sau qua /tiep. Do that: 57 wal: da lot origin/main (hub do duoc 1 -> SE = 57x); nguyen nhan KHONG phai turn-seam ma la session-end.md:113 SE tu viet "kep sau -> GIU NGUYEN". K troi 3->10/buoi. v1 SE GAY MAT VIEC (R3 fault-inject: NONWAL=0 -> 0 commit de fixup -> detached HEAD -> hook fail-open -> abort -> mat worktree = E-029 bang cua sau). Owner 6 chot: nguyen-tac moi (vuot-khung = request anh + AI_INFRA) / PA-2 = PA-2a hang-so + PA-2b audit / 6-15-3 / [carry:slug] / KHONG don 57 / fix#8 (a)(b). 0 prod-code, 0 migration, 0 FE. Test 509 giu nguyen (45D + 464I). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
284 lines
27 KiB
Markdown
284 lines
27 KiB
Markdown
# SPEC v2 — SE đối ứng 6 broadcast AI_INFRA (S119, 2026-07-15)
|
||
|
||
> **SUPERSEDES v1** (`spec-adap-6-broadcast-15-07-2026.md` — giữ làm audit-trail, **KHÔNG chạy v1**).
|
||
> **Lý do v2:** `/fable-clone reviewer` 4-lane (`wf_78a84f9b-03e`) → **R2 FAIL** (4C+7M) · **R3 FAIL** (5C+2M) · R1/R4 **chết giữa chừng** (#53). **19 finding**, đa số loại "chạy là hỏng". v1 sẽ **gây mất việc**.
|
||
> **Owner-decision:** `owner-decisions-15-07-2026.md` — Q1=**PA-2** · Q2=**6/15/3** · Q3=**`[carry:<slug>]`** · Q4=**KHÔNG dọn 57**.
|
||
> **Trạng thái:** chờ `/fable-real reviewer` chốt → HMW wave.
|
||
|
||
---
|
||
|
||
# ① ĐỀ-BÀI
|
||
|
||
Giữ nguyên v1 §1 (phơi-nhiễm + 4 cú lật L1-L4 + 2 class + GAP#6 + 3 phát-hiện F1-F3 + positive-control + bẫy mega-line). **Δ v2 với ①:**
|
||
|
||
## 1.A Số ĐO LẠI lúc viết v2 (v1 đã stale khi mực chưa khô)
|
||
|
||
| Trục | v1 ghi | **v2 ĐO LIVE** | Ghi-chú |
|
||
|---|---|---|---|
|
||
| `K` = `git rev-list --count origin/main..HEAD` | **4** | **6** | WAL ghi 3 · v1 ghi 4 · R3 đo 5 · nay **6**. Hook fire **mỗi turn-boundary** ⇒ K **tăng đơn-điệu** |
|
||
| `origin/main` | — | **`3fde8af`** | |
|
||
| non-`wal:` trong range | — | 🔴 **0** (6/6 đều `wal:`) | ⇒ **KHÔNG có commit nào để `fixup` VÀO** |
|
||
| `wal:` trên `origin/main` | 57 | **57** ✓ | |
|
||
| `git status --porcelain` | "sạch, dirty=0" | 🔴 **KHÔNG SẠCH** — `M .claude/WAL.md` + 7 untracked broadcast + 6 untracked run-folder | v1 §2.0 tiền-đề **SAI** |
|
||
| `ls .claude/agents/*.md \| wc -l` | (suy 12) | **13** = 12 roster + **README.md** | ⇒ +2 vai = **15**, KHÔNG phải 14 |
|
||
| gate scope EOL (`agents`+`commands`+`skills`) | — | 🔴 **0 — ĐÃ XANH SẴN** | repo-wide = 188 (131 Migrations) |
|
||
|
||
🔴 **LUẬT SỐ ĐỘNG (v2):** **CẤM hardcode `K`/`n` ở bất-kỳ đâu** trong spec/§5.0/script. Mọi nơi PHẢI tính runtime. Số trong bảng này = **ảnh chụp để reviewer đối chứng**, **KHÔNG phải hằng-số để worker dùng**.
|
||
|
||
## 1.B Δ L2 — v1 sai một nửa (R1 nhặt được trước khi chết)
|
||
|
||
v1 L2: *"188 = `dotnet ef`/VS sinh"*. R1 đo: *"CRLF clusters in exactly the S112 `sub-*`/`review-L*` files — **lead-written sub-returns**"*.
|
||
⇒ **L2 đúng phần Migrations (131/188), SAI phần "toàn bộ"** — một phần 188 do **chính lead ghi ra** (sub-return files trong `runs/`). **Nấc: PARTIAL.** Không đổi kết-luận (vẫn KHÔNG do squash — §5.0 = `reset --soft` = worktree-neutral), nhưng **đổi nguồn** ⇒ ảnh hưởng scope (§2.2).
|
||
|
||
## 1.C Δ L3 — HẠ NẤC xuống **CHƯA VERIFY** (R1 chết đúng trước câu quyết-định)
|
||
|
||
R1 đi được: *"strings exist"* ✓ → *"extracting the actual `^---` regex variants with context"* ✓ → *"**The context is decisive. Let me confirm which site is the actual fs-backed frontmatter reader**"* → **CHẾT**.
|
||
|
||
⇒ 🔴 **CHƯA VERIFY (bắt buộc khai):** *"đường đọc frontmatter `.claude/agents/` là nhánh CR-tolerant (`\s*` / `\r?\n`) hay nhánh LF-only (`[ \t]*\n`)"* — **chưa ai xác nhận**.
|
||
⇒ **Hệ-quả bắt buộc (R2-M7):** v1 **giữ kết-luận L3** ("KHÔNG tuyên miễn-nhiễm") mà **bỏ độ-bất-định** khỏi sổ trung-thực = **lệch đúng chiều có lợi**. v2 **khôi phục**: giữ kết-luận (thận-trọng = đúng) **VÀ** giữ caveat.
|
||
⇒ **adap-request R4 HẠ NẤC:** không được gửi hub dưới dạng *"chúng tôi đọc mã-nguồn"*. Nấc đúng = *"grep-chuỗi trong binary minified thấy 2 dạng regex cùng tồn tại; **CHƯA xác định** dạng nào trên đường đọc thật; đề-nghị hub (chủ mã-nguồn) xác nhận"*.
|
||
|
||
---
|
||
|
||
# ② CÁCH IMPLEMENT (v2)
|
||
|
||
## 2.0 🔴 W0 — PRE-FLIGHT (em-main SOLO)
|
||
|
||
### W0.0 — RE-MEASURE trước mọi thao-tác (R3-C4) 🆕
|
||
Worker **KHÔNG được tin số trong spec** (spec bơm qua args, số đã stale khi tới tay).
|
||
```bash
|
||
git status --porcelain # PHẢI phân-loại TỪNG dòng; chưa phân-loại → ABORT
|
||
K=$(git rev-list --count origin/main..HEAD)
|
||
NONWAL=$(git log --format='%s' origin/main..HEAD | grep -vc '^wal:' || true)
|
||
```
|
||
**Acceptance:** in ra `{K, NONWAL, porcelain-count}`; mọi entry porcelain **được phân-loại**; chưa phân-loại ⇒ **ABORT loud**.
|
||
|
||
### W0.1 — `.gitattributes` theo CLASS
|
||
Thêm `* text=auto eol=lf` + khai binary THẬT (`*.zip *.exe *.dll *.docx *.xlsx *.pptx *.pdf *.png *.jpg *.jpeg *.ico *.woff *.woff2` binary) + **giữ 2 rule cũ**. 🔴 CẤM vá theo đuôi-file-vừa-cắn.
|
||
**Acceptance:** `git check-attr text eol -- .claude/agents/reviewer.md` ⇒ `text: auto`, `eol: lf` (nay: unspecified).
|
||
|
||
### W0.2 — EOL: **SCOPED-ONLY** (R3-C4/C5 — v1 SAI cơ-chế lẫn gate)
|
||
|
||
🔴 **3 đính-chính bắt buộc:**
|
||
1. **`git add --renormalize` KHÔNG rewrite worktree** (R3 đo: file vẫn `i/lf w/crlf` sau renormalize; **chỉ `rm` + `git checkout --`** mới ra `w/lf`) ⇒ **cơ-chế v1 sai từ gốc**.
|
||
2. **`--renormalize` âm-thầm STAGE nội-dung dirty**; acceptance v1 `git diff --stat` = rỗng **PASS giả** (vì mọi thứ chuyển sang index). ⇒ dùng **`git diff --cached --stat`** + **`--dry-run`** trước.
|
||
3. **Gate unscoped BẤT-KHẢ-GIỮ:** W1/W2 spawn agent ghi `agent-memory/*/MEMORY.md` ⇒ **CRLF lại** ⇒ gate **vỡ ngay sau khi "pass"**. Cộng: unscoped đòi `rm`+`checkout` **188 file incl. 131 EF migration + 6 file sống** (`STATUS.md`, `HANDOFF.md`, `docs/CLAUDE.md`, `agent-memory/{implementer-backend,reviewer}/MEMORY.md`, `.mfe-state.json` — R3 confirm cả 6 nằm trong 188).
|
||
|
||
**⇒ v2 QUYẾT:**
|
||
- **GATE = SCOPED** `.claude/agents` + `.claude/commands` + `.claude/skills` ⇒ **0**.
|
||
- **188 repo-wide = INFORM-only.** 🔴 **CẤM mass `rm`+`checkout`.**
|
||
- **KHAI THẲNG:** *"gate scoped **ĐÃ XANH SẴN 0 việc làm** (R2-C4). Giá-trị W0.1/W0.2 = **materialize theo attr mới cho file MỚI/ghi-lại**, KHÔNG phải sửa 188 file cũ."* ⇒ **W0.2 KHÔNG vào §3.9** (gate vacuous).
|
||
- Nếu **thật sự** muốn sửa 188 ⇒ **việc riêng, phiên riêng, worktree sạch tuyệt-đối** — KHÔNG phải phiên này.
|
||
|
||
**Acceptance:** `git add --renormalize --dry-run .` liệt đúng tập dự-kiến, **0 file dirty**; `git diff --cached --stat` sau thao-tác = rỗng; scope-gate = 0 **và vẫn 0 sau W2**.
|
||
|
||
### W0.3 — 🔴 **VIẾT LẠI HOÀN TOÀN** — squash **KHÔNG REBASE** (R3-C1: v1 phá thật)
|
||
|
||
**R3 fault-inject cây tạm chứng minh v1 phá:**
|
||
```
|
||
origin/main..HEAD = 6/6 wal:, NONWAL=0 ⇒ mọi todo-line thành `fixup`
|
||
→ error: cannot 'fixup' without a previous commit ×6
|
||
→ REBASE-EXIT=1 ; .git/rebase-merge LEFT ; HEAD DETACHED
|
||
→ hook wal-flush.ps1 (fail-open, exit 0, KHÔNG guard rebase-state) commit LÊN detached HEAD
|
||
→ git rebase --abort → WORKTREE CONTENT GONE ; commit ORPHANED (reflog only)
|
||
```
|
||
= **`E-029` tới bằng cửa sau** — đúng lỗi v1 trích làm cảnh-báo.
|
||
|
||
**⇒ v2 — 2 NHÁNH RUNTIME, quyết TRƯỚC khi chạm git:**
|
||
```bash
|
||
K=$(git rev-list --count origin/main..HEAD)
|
||
NONWAL=$(git log --format='%s' origin/main..HEAD | grep -vc '^wal:' || true)
|
||
|
||
if [ "$NONWAL" -eq 0 ]; then
|
||
# ── NHÁNH A (ĐANG FIRE HÔM NAY: NONWAL=0, K=6) ──
|
||
# reset --soft ONLY. 🔴 TUYỆT ĐỐI KHÔNG invoke rebase.
|
||
[ "$(git rev-parse HEAD~$K)" = "$(git rev-parse origin/main)" ] || { echo "ABORT: HEAD~K != origin/main"; exit 1; }
|
||
git reset --soft "HEAD~$K"
|
||
# → nội dung 6 wal: gộp vào staging; commit-chốt ở W6
|
||
else
|
||
# ── NHÁNH B (có commit thường trong range) ──
|
||
# rebase+fixup; script PHẢI để dòng todo ĐẦU TIÊN là `pick`, KHÔNG BAO GIỜ emit leading `fixup`
|
||
trap 'git rebase --abort' ERR
|
||
GIT_SEQUENCE_EDITOR=<script> git rebase -i origin/main
|
||
fi
|
||
# 🔴 HARD RULE mọi nhánh: nếu .git/rebase-merge hoặc .git/rebase-apply TỒN TẠI → STOP, CẤM để hết lượt
|
||
[ -d .git/rebase-merge ] || [ -d .git/rebase-apply ] && { echo "STOP: rebase state left"; exit 1; }
|
||
```
|
||
**+ HOOK INTERLOCK (bắt buộc):** thêm vào `wal-flush.ps1` đầu file:
|
||
```powershell
|
||
if ((Test-Path .git/rebase-merge) -or (Test-Path .git/rebase-apply)) { exit 0 }
|
||
```
|
||
⇒ chặn hook ghi lên detached HEAD. *(Hook hiện: `exit 0` fail-open, **0 guard** — đã verify.)*
|
||
|
||
**Acceptance:** chạy lại fault-inject cây tạm ⇒ chọn **nhánh A**, `REBASE-EXIT` **không bao giờ** non-zero, `ls .git/rebase-merge` **absent** sau bước; `HEAD~K == origin/main` assert PASS trước reset.
|
||
|
||
### W0.4 — `workflows/README.md:52` gỡ claim STALE (giữ v1)
|
||
### W0.5 — baseline 7 orphan-folder (giữ v1) — 🔴 chọn **scope theo `mtime > closeout cuối`**, **KHÔNG** tạo `*-synthesis.md` giả (Goodhart — R3 flag)
|
||
|
||
### W0.6 🆕 — **THÍ-NGHIỆM QUYẾT-ĐỊNH EOL** (R2-M7 — lane B xếp ưu-tiên #1, v1 làm rớt)
|
||
> Lane B nguyên-văn: *"thí-nghiệm quyết-định **DUY NHẤT**... nó quyết SE dính CRLF thật hay không; **mọi thứ khác phụ-thuộc kết-quả này**"*.
|
||
> v1 rút xuống "validator FAIL trên copy-CRLF" = kiểm **validator của mình**, KHÔNG kiểm **bộ-đọc THẬT**.
|
||
|
||
**Làm:** copy `reviewer.md` → `.claude/agents/_crlf-probe.md` (đổi `name:`) → **CRLF-hoá byte** → **RESTART CLI** → **spawn-probe**.
|
||
- Spawn **được** ⇒ SE **CRLF-tolerant** ⇒ L3 nhánh "LF-only regex trên đường đọc" **BỊ BÁC** ⇒ R4 request **rút** hoặc hạ mạnh.
|
||
- Spawn **KHÔNG được** ⇒ L3 **XÁC NHẬN** ⇒ R4 request **giữ nguyên nấc mạnh** + SE có **positive-control THẬT** (thay synthetic).
|
||
- Xong ⇒ **XOÁ `_crlf-probe.md`**.
|
||
|
||
**Acceptance:** verdict `{CRLF-tolerant | CRLF-fatal}` ghi ra file; `_crlf-probe.md` đã xoá; kết-quả **cập-nhật ngược** §1.C + R4-nấc.
|
||
🔴 **Đây là bảo-đảm falsifiable DUY NHẤT** — broadcast ④(d): *"mọi kiểm static-text đều KHÔNG falsifiable; chỉ spawn-probe / assert-registry mới thật-sự chứng-minh"*.
|
||
|
||
## 2.1 Sàn H22 — Δ v2
|
||
|
||
| Sàn | Δ so v1 |
|
||
|---|---|
|
||
| **1** | 🔴 **R2-C3 + R3:** (a) đồ-thị wrapper THẬT = **4** (`fable-clone.md` · `fable-real.md` · `ultra-on.md` · raw-invoke em-main) — **`/hmw` KHÔNG tồn tại dưới dạng file** (`ls .claude/commands/` = 18, không có `hmw.md`) ⇒ bỏ khỏi danh-sách. (b) Grep-tool `args.run` trong `.claude/commands/` = **0 hit** ⇒ **cả 4 wrapper đều CHƯA có cờ**. (c) 🔴 **gate + 4 cờ PHẢI CÙNG 1 WAVE / 1 COMMIT** — v1 để gate ở W2, cờ ở W3 ⇒ mọi `/fable-clone` ≥3 lane (**chính run này = 5 lane**) + `/ultra-on` auto-HMW **THROW ngay** trước khi W3 kịp vá = **vỡ đường đang chạy** (đúng broadcast §4). (d) **nửa-(ii) = ÁP, KHÔNG n-a** (R2-M1: broadcast nói *"**wrapper** gọi xuống engine dùng-chung"*, KHÔNG phải engine→engine — v1 đọc sai). (e) Khai thật: chỉ phủ `hmw.js`; **raw Workflow/Agent = kẽ CÒN-LẠI KHÔNG gate được** (F2 — chính run này đi đường đó) |
|
||
| **2** | giữ v1 |
|
||
| **3** | giữ v1 (3-bậc SE-tailored + 🆕 bậc-MẠNH-④ path-trong-wal-commit) |
|
||
| **4** | giữ v1 |
|
||
| **5** | giữ v1 |
|
||
| **push-guard** | 🔴 **R3-C3:** v1 chuyển **phép đếm** vào lượt push nhưng **KHÔNG chuyển squash** ⇒ giữa §5.0 và §5.2, closeout **chắc chắn** làm bẩn path hook (Sàn-2 ghi `closing:` · W4 spawn reviewer→agent-memory · W4/W5 ghi `runs/`) ⇒ mỗi turn-boundary = +1 `wal:` ⇒ n≥1 tại §5.2 ⇒ **CHẶN PUSH → phiên không đóng được** ⇒ người bypass ⇒ **cổng tự xoá chính nó**. **⇒ v2: §5.2 = `squash → count → push` CHAINED TRONG **1 LƯỢT**; §5.0 = **pre-pass**, §5.2 **RE-EXECUTE** phép tính. Recount >0 ⇒ re-squash 1 lần ⇒ recount ⇒ push; vẫn >0 ⇒ **STOP + report**.** Acceptance thêm: **KHÔNG có turn-boundary giữa squash cuối và `git push`**. **(b) else-branch = 🔴 MÌN NGỦ, KHÔNG "vô-hại"** (R2-M6): else = `git log --format='%s' HEAD \| grep -c '^wal:'` = **đếm toàn lịch-sử = 57** ⇒ `-eq 0` fail ⇒ **chặn push VĨNH VIỄN** nếu ref biến mất/đổi tên ⇒ **bỏ hẳn else** (ref EXISTS, đã verify) **hoặc** đổi thành **fail-loud báo owner** |
|
||
|
||
## 2.2 EOL — Δ v2
|
||
|
||
| Δ | Nội-dung |
|
||
|---|---|
|
||
| **② SYMPTOM khôi phục** (R2-M5) | roster ↔ VALID_ROLES ↔ file-count = **14/14/14** (post-W2). v1 làm rớt ② |
|
||
| **③(d) RESTART+VERIFY khôi phục** (R2-M5) | BƯỚC 0.6 = **model-probe**, KHÔNG phải **registry-probe** ⇒ thêm **0.6b registry-probe**. Broadcast ③(d): *"RESTART rồi VERIFY danh-sách agent"* |
|
||
| **④(a) control** | 🔴 phụ-thuộc **W0.6**: probe ra `CRLF-fatal` ⇒ dùng **byte file-đã-chết THẬT** làm control (snapshot TRƯỚC fix); ra `CRLF-tolerant` ⇒ validator **hạ giá-trị** (chỉ còn hygiene) + khai thật |
|
||
| **SCOPE** | như W0.2: gate scoped; 188 INFORM-only; **L2 = PARTIAL** (131 Migrations + phần lead-written sub-returns — §1.B) |
|
||
|
||
## 2.3 H23 — **PA-2** (anh chốt) — Δ v2
|
||
|
||
Giữ v1 PA-1 (a)(b)(c)(d) + **PA-2a/PA-2b** (`owner-decisions` §Q1). **Δ:**
|
||
|
||
| # | Δ |
|
||
|---|---|
|
||
| **M2 🔴 LỖ CHƯA-TEST** (R2-M2) | H23 §2(2) **BẮT BUỘC khai**: *"thứ-tự ưu-tiên giữa 'tham-số tại spawn' và 'pin ở tệp định-nghĩa' khi **CẢ HAI cùng hiện-diện** — rất có thể **chưa từng được test**"*. Ở SE **cả hai HIỆN-DIỆN**: `hmw.js:44` trả alias → `agent(…,{model:…})` **trong khi** frontmatter 12/12 = `inherit`. **Chưa ai test bên nào thắng.** 🔴 **Nếu frontmatter THẮNG ⇒ toàn bộ fix GAP#6 = NO-OP**, floor-2 vẫn thủng khi Fable UP = đúng lỗi reviewer S108 đã bắt. ⇒ (i) khai vào §Nấc-trung-thực + §3.7; (ii) **acceptance NÂNG**: chạy 1 lane `tier:'opus'` **khi lead=Fable** → **đọc model-thực-tế resolve** (H23 §6 phép-thử-phá #3) → lệch ⇒ báo owner. *(Hôm nay lead=Opus ⇒ **không phân-biệt được** ⇒ acceptance này **defer tới phiên lead=Fable**; khai thẳng, KHÔNG giả-vờ đã test.)* |
|
||
| acceptance v1 | `Grep tier:'opus' ≥1 hit` = **chỉ đo CHỮ trong file**, không đo runtime ⇒ **Goodhart-able 100%** ⇒ giữ làm **điều-kiện cần**, KHÔNG phải đủ |
|
||
|
||
## 2.4 H24 — Δ v2
|
||
|
||
| # | Δ |
|
||
|---|---|
|
||
| **(1) 2 vai** | 🔴 **acceptance `ls .claude/agents/*.md = 14` SAI SỐ-HỌC** (R2-C1 + R3-M1): glob bắt luôn `README.md` ⇒ nay **13** = 12+README ⇒ +2 = **15**. Gate cũ **FAIL trên implementation ĐÚNG**, hoặc ép worker **xoá `agents/README.md`** = catastrophic-Goodhart. **⇒ v2: bất-biến trên ROSTER, không trên glob:** `VALID_ROLES.length == 14` **AND** `(ls .claude/agents/*.md \| grep -v README.md \| wc -l) == 14`. 🔴 **+ acceptance FALSIFIABLE (R2-M5):** static-check **KHÔNG đủ** ⇒ **RESTART → spawn-probe 14/14 agent SỐNG** |
|
||
| **(2) detector** | 🔴 **C2 (R2): `anchor_patterns[]` PHẢI SỐ NHIỀU.** v1 nén còn 1 regex `\*\*Last updated:\*\*` — mà `permission-matrix/SKILL.md` **KHÔNG có anchor đó** (nó dùng `**Status (post Session 6 — 2026-04-30):**`; Grep `Last updated` trong `.claude/skills/` = **0 hit**) ⇒ cộng luật *"không anchor ⇒ BỎ QUA"* ⇒ **detector loại thẳng chính positive-control của nó** ⇒ **W4 bất-khả-thi** ⇒ "xanh từ commit đầu" = đúng thứ H24 bảo phải nghi. **⇒ v2: `anchor_patterns[]` gồm ≥2 dạng**, bắt buộc có `\*\*Status \(post Session \d+ — (\d{4}-\d{2}-\d{2})\)\:\*\*`. **+ M3:** thu hẹp acceptance về **đúng nguyên-văn broadcast** = *"**số nhịp** đọc từ config; **0 số NHỊP** hardcode"* — **KHÔNG** "0 số hardcode trong .ps1" (v1 phình scope: `governance-detectors.ps1:419 $walLineCount -gt 40` = **số ANH ĐÃ KÝ** mark `RC-…12-07-2026-11-43-45`; `:256`, `:295`, `:399` = số detector cũ **ngoài scope H24**). **+ M2 (R3): detector KHÔNG disjoint** — `Get-StatusValue:154-157` resolve canonical **từ `docs/STATUS.md`** ⇒ ⚠️ **KHÔNG có row `Policies`** ⇒ nửa `policy` của GAP-3 **không thể fire** nếu chưa thêm `\| Policies \| **216** \|` vào STATUS.md. ⚠️ `\| Sub-agents \| **12** \|` = **row canonical**; W2 nâng 14 ⇒ **PHẢI update STATUS.md CÙNG LANDING**, nếu không C2/B3 **flag mọi derived-doc ghi "14" là stale-vs-12** ⇒ **detector BÃO trên chính thay đổi của H24** ⇒ acceptance "TOTAL ≥ 46" **được thoả bằng RÁC** |
|
||
| **(3) scheduler** | 🔴 **M4 (R2): v1 để MỒ CÔI** — rà 7 wave: `memory-budget.json` **không ở wave nào**; `.session-counter.json` **không ở wave nào**; logic tick/idempotent/fail-loud/fire-guard/cap = net-new **không chủ**. **⇒ v2: W2 sở-hữu** (gộp cùng `hmw.js` owner). Key `lead_self_audit` trong `memory-budget.json` (đo live: keys hiện = tiers/archive_gate/mfe/crystallized_backfill/harness_floor/token_governor/measured ⇒ **chưa có**) |
|
||
| **(4) positive-control** | phụ-thuộc **C2-fix**. Chuỗi fire→chứng-kiến→vá→hết-fire **giữ**. 🔴 **CẤM vá `permission-matrix` trước** |
|
||
| **(5) 3 việc** | giữ v1 (rút gọn (a) = `inherit`) |
|
||
| **enum ĐÓNG** 🆕 | 🔴 **M4:** v1 đòi "class ∈ enum ĐÓNG trong config" nhưng **không liệt enum** + **không nêu config key** ⇒ enum chỉ sống ở lane D ⇒ mà spec **bơm qua args, worker KHÔNG tự Read** ⇒ worker **không bao giờ thấy** ⇒ **tự chế class** = loãng thống-kê = đúng thứ H24 §2(1) cấm. **⇒ v2 CHÉP enum vào THÂN spec:** `lead_self_audit.flag_classes` = `["view-stale-count","view-stale-status","view-stale-header","view-stale-role-desc","view-residual-asym","gap-carry-dropped","gap-carry-aged","gap-owner-specifics","gap-decision-sunk","gap-underfill"]` (**10 class** — 5 STALE + 5 GAP, khớp H24 §2(1) 5+5 dấu-hiệu) |
|
||
|
||
## 2.5 owner-sign — giữ v1 (0 adopt, chỉ báo nấc)
|
||
|
||
---
|
||
|
||
# ③ CHECKLIST + WAVE (v2)
|
||
|
||
## 3.1 Δ đồ-thị phụ-thuộc
|
||
|
||
```
|
||
[W0.0] RE-MEASURE ──PHẢI TRƯỚC── mọi thao-tác git 🆕 (R3-C4: spec-số stale khi tới tay worker)
|
||
[W0.3] NONWAL==0 → reset --soft ONLY ──CẤM rebase── 🔴 (R3-C1: rebase = detached HEAD + mất việc)
|
||
[W0.3] hook-interlock rebase-guard ──CÙNG COMMIT── W0.3 🆕
|
||
[W0.6] spawn-probe CRLF ──PHẢI TRƯỚC── ④(a) chọn control + R4 nấc 🆕 (R2-M7: thí-nghiệm quyết-định)
|
||
[Sàn1] gate + 4 cờ wrapper ──CÙNG 1 COMMIT── 🔴 (R2-C3: tách = vỡ đường đang chạy)
|
||
[W2] STATUS.md `Sub-agents` 12→14 ──CÙNG LANDING── roster 14 🔴 (R3-M2: không thì detector bão)
|
||
[W2] `| Policies | **216** |` thêm vào STATUS ──PHẢI TRƯỚC── GAP-3 nửa policy 🆕
|
||
[§5.2] squash→count→push ──CÙNG 1 LƯỢT── 🔴 (R3-C3: tách = deadlock, gate tự xoá)
|
||
```
|
||
|
||
## 3.2 Δ bảng xung-đột
|
||
|
||
| File | v1 | **v2** |
|
||
|---|---|---|
|
||
| `hmw.js` | 3 hạng-mục | **5** (+PA-2a hằng-số +Sàn-1 gate) — vẫn **GỘP 1 EDIT** |
|
||
| `docs/STATUS.md` | ❌ **VẮNG** | 🆕 **2** (Sub-agents 12→14 · +row Policies) — **PHẢI cùng landing W2** |
|
||
| `.claude/hooks/wal-flush.ps1` | ❌ **VẮNG** | 🆕 **1** (rebase-state guard) — cùng commit W0.3 |
|
||
| `.claude/commands/ultra-on.md` | ❌ **VẮNG** | 🆕 **1** (cờ `args.run`) — cùng commit Sàn-1 |
|
||
| `.claude/commands/fable-real.md` | ❌ **VẮNG** | 🆕 **1** (cờ) — cùng commit Sàn-1 |
|
||
| `memory-budget.json` | 2, mồ-côi | **2, chủ = W2** |
|
||
| `.session-counter.json` | ❌ mồ-côi | 🆕 **chủ = W2** |
|
||
|
||
## 3.3 WAVE v2
|
||
|
||
| Wave | Song-song | Task | File |
|
||
|---|---|---|---|
|
||
| **W0** SOLO | 🔴 không | W0.0 re-measure → W0.1 gitattributes → W0.2 **scoped-only** (KHÔNG mass-checkout) → **W0.3 reset--soft nhánh-A + hook-interlock (1 commit)** → W0.4 README:52 → W0.5 orphan-scope → **W0.6 spawn-probe CRLF (RESTART)** | `.gitattributes` · `session-end.md:111-115` · `wal-flush.ps1` · `README.md:52` · probe |
|
||
| **W1** | ✅ 3 lane | ① detector +2 (**anchor_patterns[] số-nhiều**) · ② `agent-frontmatter-eol-check.ps1` · ③ `wal-recovery-test.ps1` 4-ca | 3 file disjoint |
|
||
| **W1b** 🆕 | ✅ cùng W1 | `scripts/spawn-model-audit.ps1` (PA-2b) | disjoint |
|
||
| **W2** GỘP | 🔴 1 owner | `hmw.js` **1 EDIT** (Sàn-1 gate + VALID_ROLES→14 + H23 note + **PA-2a hằng-số**) **+ 4 cờ wrapper CÙNG COMMIT** + 2 agent MỚI + `memory-budget.json` (`h24_cadence` 6/15/3 + `lead_self_audit` enum) + `.session-counter.json` + **STATUS.md Sub-agents 12→14 + row Policies** | 🔴 **1 commit** |
|
||
| **W3** SERIAL | 🔴 | `tiep.md` §0 → `session-start.md` (0.7-trỏ + **0.6b registry-probe** + counter + 2 vai + H23 note) → `session-end.md` **1 PASS** (§5.2 squash→count→push 1-lượt + sentinel + Sàn-5 + validator + counter) → `fable-clone.md` GAP#6 → `agents/README.md` | 5 file |
|
||
| **W4** | 🔴 sau W1① | fire detector ⇒ **PHẢI in** `permission-matrix/SKILL.md` → reviewer chứng-kiến → **RỒI MỚI** vá | skill |
|
||
| **W5** | 🔴 cuối | `harness-11-engine.md` | engine |
|
||
| **W6** | 🔴 | **§5.2 squash→count→push 1 LƯỢT** → adap-report → adap-request → email | broadcasts/ |
|
||
|
||
## 3.4 Owner-decision — ✅ CHỐT (`owner-decisions-15-07-2026.md`)
|
||
|
||
| | Chốt |
|
||
|---|---|
|
||
| **O1** | ✅ **PA-2** — hình-thức: **PA-2a hằng-số + PA-2b audit** (neo-tại-spawn **bất-khả-thi**: param chỉ nhận alias; SE 0 full-id vì H8) |
|
||
| **O2** | ✅ **6/15/3** → `memory-budget.json:h24_cadence` |
|
||
| **O3** | ✅ `[carry:<slug>]`; "dòng-carry" = **đoạn LOGIC** `NEXT anh`/`NEXT em` trong mega-line |
|
||
| **O4** | ✅ **KHÔNG dọn 57** |
|
||
|
||
## 3.5 Δ n-a (v1 SAI ×3 — R2)
|
||
|
||
| Mục | v1 | **v2** |
|
||
|---|---|---|
|
||
| Sàn-1 nửa-(ii) | "≈n-a — không có engine→engine" | 🔴 **SAI — ÁP.** Broadcast: *"**wrapper** gọi xuống engine dùng-chung"*. SE có **4 wrapper** ⇒ deliverable = cờ ở 4 chỗ |
|
||
| push-guard (b) else | "n-a — giữ else **vô-hại**" | 🔴 **SAI — MÌN NGỦ.** else đếm toàn lịch-sử = **57** ⇒ chặn vĩnh-viễn ⇒ **bỏ else** hoặc fail-loud |
|
||
| H23 §2(4) bộ-soát | "n-a: chưa dựng" | ✅ **GỠ** — PA-2b **dựng thật** |
|
||
|
||
## 3.6 adap-request v2
|
||
|
||
| # | Δ nấc |
|
||
|---|---|
|
||
| **R1** H8⟂pin-simple⟂H23 | **GIỮ** evidenced (hub tự pin 17/17 trong khi broadcast all-inherit) |
|
||
| **R2** push-guard KHUNG sai | **GIỮ** evidenced (57 vs 1) **+ MẠNH THÊM**: R3-C3 chứng minh KHUNG *"đặt guard sát push"* **CHƯA ĐỦ** — phải **squash+count+push CÙNG LƯỢT**, nếu không hook chen giữa ⇒ **guard tự-deadlock** ⇒ đề-xuất (γ) bổ-sung KHUNG |
|
||
| **R3** side-ref | **GIỮ** — 🔴 **VƯỢT KHUNG (lệch N.2) ⇒ PHẢI request, CẤM tự làm** (nguyên-tắc anh S119). Khai **CHƯA VERIFY thực-nghiệm** |
|
||
| **R4** EOL | 🔴 **HẠ NẤC** (§1.C): **KHÔNG** gửi *"đọc mã-nguồn"*. Nấc đúng = *"grep-chuỗi binary thấy 2 dạng regex cùng tồn tại; **CHƯA xác định** dạng nào trên đường đọc thật (lane verify chết giữa chừng); **W0.6 spawn-probe** sẽ trả lời — báo hub sau"*. **Vẫn GIỮ** phần đo được: nhân-quả *squash lật EOL* **SAI với SE** (§5.0=reset--soft, worktree-neutral; nguồn = Migrations **+ lead-written sub-returns** §1.B) + acceptance `count==0` toàn-repo = **dương-giả factory** |
|
||
|
||
## 3.7 §3.9 GATE v2
|
||
|
||
```
|
||
[ ] W0.0 in {K, NONWAL, porcelain-count} ; mọi entry porcelain ĐƯỢC PHÂN LOẠI ; chưa → ABORT
|
||
[ ] W0.1 git check-attr text eol -- .claude/agents/reviewer.md → text:auto eol:lf
|
||
[ ] W0.2 scoped gate = 0 (ĐÃ XANH SẴN — KHAI vacuous, KHÔNG tính là thành-tựu)
|
||
git add --renormalize --dry-run . → 0 file dirty ; git diff --cached --stat sau = rỗng
|
||
🔴 CẤM mass rm+checkout 188
|
||
[ ] W0.3 NONWAL==0 → chọn nhánh reset--soft ; REBASE-EXIT không bao giờ non-zero
|
||
ls .git/rebase-merge → absent ; assert HEAD~K == origin/main PASS
|
||
wal-flush.ps1 có rebase-guard (Test-Path .git/rebase-merge → exit 0)
|
||
[ ] W0.6 spawn-probe CRLF → verdict {tolerant|fatal} ghi file ; _crlf-probe.md đã xoá
|
||
[ ] Sàn1 gate + 4 cờ CÙNG 1 COMMIT ; Grep args.run trong commands/ ≥ 3 (nay 0)
|
||
phóng 3-task thiếu args.run → throw
|
||
[ ] §5.2 squash→count→push CHAINED 1 LƯỢT ; KHÔNG turn-boundary ở giữa
|
||
sau push: wal: trên origin/main = 57 (KHÔNG tăng, KHÔNG giảm)
|
||
[ ] H23 Grep tier:'opus' trong fable-clone.md ≥1 (điều-kiện CẦN, không đủ)
|
||
TIER2_EXPECTED_FULL_ID ≥1 hit = claude-opus-4-8
|
||
spawn-model-audit fault-inject (expected giả) → PHẢI FLAG
|
||
🔸 precedence spawn-param⟂frontmatter = CHƯA TEST → defer phiên lead=Fable (KHAI, không giả-vờ)
|
||
[ ] H24 VALID_ROLES.length == 14 AND (ls agents/*.md | grep -v README | wc -l) == 14
|
||
🔴 RESTART → spawn-probe 14/14 SỐNG (static-check KHÔNG đủ — broadcast ④d)
|
||
STATUS.md | Sub-agents | **14** | CÙNG LANDING ; + row | Policies | **216** |
|
||
detector in 2026-07-14 trên STATUS.md:6 (KHÔNG 2026-08-01 / 1987-03-07 / 2026-20-42)
|
||
anchor_patterns[] ≥2 dạng ; PHẢI in permission-matrix/SKILL.md TRƯỚC vá
|
||
h24_cadence đọc từ config (0 số NHỊP hardcode — KHÔNG đòi 0-số-hardcode toàn file)
|
||
/session-start 2× cùng HEAD → +1 ; counter lùi → fail-loud ; bỏ phiên → OVERDUE
|
||
[ ] EOL ② roster↔VALID_ROLES↔file = 14/14/14 ; ③(d) 0.6b registry-probe tồn tại
|
||
[ ] cicd CI PASS (scripts/*.ps1 + .json + .gitattributes CÓ trigger; agent-memory/runs KHÔNG — AS-6)
|
||
```
|
||
|
||
---
|
||
|
||
## Nấc trung-thực v2
|
||
|
||
- **Provenance:** invest `wf_1f6bd5e2-478` (5/5 clean) → spec v1 → review `wf_78a84f9b-03e` (**R2 FAIL 4C+7M · R3 FAIL 5C+2M · R1/R4 chết #53**) → **v2 vá 19 finding**.
|
||
- 🔴 **v1 SẼ GÂY MẤT VIỆC** — R3 fault-inject chứng minh: rebase→detached HEAD→hook fail-open commit→abort→mất worktree. **v1 KHÔNG ĐƯỢC CHẠY.**
|
||
- 🔴 **CHƯA VERIFY (khôi phục — v1 bỏ, R2-M7):** đường đọc frontmatter `.claude/agents/` là nhánh CR-tolerant hay LF-only ⇒ **W0.6 quyết**. **Kết-luận L3 giữ (thận-trọng), độ-bất-định GIỮ CÙNG.**
|
||
- 🔴 **CHƯA TEST:** precedence spawn-param ⟂ frontmatter (H23 §2(2) bắt buộc khai). Hôm nay lead=Opus ⇒ **không phân-biệt được** ⇒ defer, **không giả-vờ đã test**.
|
||
- **L2 = PARTIAL** (§1.B): 131/188 Migrations ✓ nhưng phần còn lại có **lead-written sub-returns** ⇒ v1 "toàn bộ do dotnet ef" **SAI**.
|
||
- **R1/R4 chết giữa chừng** ⇒ **2/4 trục review KHÔNG có verdict**. Recover: L3 hạ nấc (từ transcript R1) + em-main tự đo. 🔸 **Trục R4 (honesty) CHƯA có lane độc-lập** ⇒ `/fable-real reviewer` PHẢI phủ trục này.
|
||
- **KHÔNG overclaim:** Sàn-1 chỉ phủ `hmw.js`; raw Workflow/Agent = **kẽ CÒN-LẠI** (chính run này đi đường đó). Validator **PHÁT-HIỆN** không **NGĂN-CHẶN**. H24 = **quy-ước lead-executes, KHÔNG hook, KHÔNG enforce**. Gate scoped EOL **ĐÃ XANH SẴN** ⇒ **không tính là thành-tựu**.
|
||
- **H24 hub dogfood n=1 (mốc-0), chưa chu-kỳ-2** ⇒ cấm bán "đã chứng-minh hiệu-quả". Flag tăng = **mở-rộng-thiết-bị** (caveat d).
|
||
- **E-030: hub defer EXECUTE CRLF sang s95** ⇒ SE đi **TRƯỚC** hub; không có mẫu chạy sẵn.
|