All checks were successful
Deploy SOLUTION_ERP / build-deploy (push) Successful in 5m25s
Ap spec-apply-hub-s145-v2 (5 axis, governance-only: 0 prod-code, 0 migration). Workflow S145 chet giua chung -> /tiep §4 relaunch-cat-gon wf_3d803740-41d 3/3 DONE. Owner-decision @S146: - session_ctx_kb = 64 TUONG-MINH (giu nguyen caveat ghost-wire: 0 reader) - session-model: scaffold IDEMPOTENT (tach cap-SO vs tao-THU-MUC) · closed.md WIRE (session-end §6.3-bis) · V2 AUTO (go cong NGUOI, GIU cong NHIP 6/15/3) Landed: C7 §N.8 predicate 4-ve · hook wal-flush.ps1 4 path (+.claude/sessions/) · San-3 tin-hieu ⑤ + ORPHAN-L · D2 KIEM end-only · §L.c completeness-gate co RANG. LIVE-VERIFY hook 4-path PASS repo THAT (da7ee8a). Session-model chay TRON VONG dau tien: pause-S146 -> resume-S146 -> ORPHAN-L can so. H24 force-fire (P=8 pause >= 1, luat auto moi): 2 vai + h24-audit -> 7 FLAG, va het: - sweep-consent sot 6 site (h24-audit.md:4 = frontmatter description) - closed.md wired-but-declared-unwired (ghost-wire CHIEU NGUOC) - owner-decision [7] BI GHI DE do tai-dung slot-index -> mat uy-quyen push 3/3 vai lane-H24 garble #53: ghi-dia-SOM cuu tron, ghi-MUON mat trang. So: orphan run-folder 3->0 · carry 14->20 (co tag [carry:*]) · +E-013 +E-014 error-ledger · +memory feedback_absence_looks_like_clean · .gitignore +lock file. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
103 lines
16 KiB
Markdown
103 lines
16 KiB
Markdown
# sub-reviewer-2 — R3 "acceptance-teeth" (S144 adap dot-11)
|
||
|
||
> Vai: reviewer adversarial. Câu hỏi duy nhất: **qua được C1→C13 thì có NGHĨA LÝ gì, hay chỉ xanh-vì-mù?**
|
||
> Khung áp: `broadcasts/inbox/2026-07-21-Governance-eval-quality-audit-ra-thuoc-eval-cua-eval.md` (gọi tắt `eval:`).
|
||
> Đối tượng chấm: `.claude/workflows/runs/2026-07-22-S144-adap-dot-11/spec-adap-dot-11-22-07-2026.md` §③ C1→C13 (`:149-172`).
|
||
|
||
## 0. VERDICT — `PASS_WITH_FIXES`
|
||
|
||
**4 răng-thật · 4 nửa-răng · 5 nghi-thức-rỗng.** Spec đáng làm, nhưng **thước đo của nó yếu hơn việc nó mô tả**.
|
||
Hai mục phải sửa trước khi worker chạy:
|
||
- **C6 rỗng-hoàn-toàn** — tập-đo có **0 phần tử**; đạt mà không cần sửa gì; sweep này **đã chạy rồi** ở wave-3 với pattern RỘNG HƠN.
|
||
- **C11 bất-khả-thi** — muốn `grep=0` phải **xoá một luật owner đang GIỮ**, trái chính luật-chung #6 của spec.
|
||
Một mục **độc-hại**: **C12** đẩy em-main viết vào `CLAUDE.md` một claim **stale-by-construction**.
|
||
|
||
## 1. Ground-truth đã đo (lượt 3-5, re-đo từ đĩa — không chép spec)
|
||
|
||
| Neo | Lệnh | Kết quả |
|
||
|---|---|---|
|
||
| `hmw.js:225` | `grep -n "filter(Boolean)"` | `return results.filter(Boolean)` — XÁC NHẬN spec ①(2) đúng |
|
||
| `hmw.js:114-116` | `grep "cap c"` | `S4 — số task THOẢI MÁI … KHÔNG cap cứng (soft notice only)`; ngưỡng `>16` chỉ `log()` ⇒ C8 chưa có clamp: ĐÚNG |
|
||
| `hmw.js:124-125` | idem | `throw có thể bị nuốt thành null = STOP-SILENT, tệ hơn` + `(trước parallel) — halt KHÔNG phụ-thuộc semantics parallel()` |
|
||
| `fable-clone.md` (70 dòng) | `grep "lượt"` | **KHÔNG có** chuỗi `trần lượt` (hiện = 0) |
|
||
| `.claude/agents/` | `ls` | 18 mục − `README.md` = **17 vai** ⇒ spec P2-2 "roster nay 17" **ĐÚNG**; `harness-audit.md` **đã tồn tại** ⇒ C4 không phải đẻ vai mới |
|
||
| **C6 tập-đo** | `grep -rn "máy sẽ" docs/governance/ .claude/` (trừ `runs/`) | **0 hit** |
|
||
| C6 toàn repo | `grep -rn "máy sẽ" --include="*.md"` (trừ `runs/`) | **7 hit — 100% nằm trong `broadcasts/`, 100% là use⟂mention** (câu *định nghĩa* luật, không phải lời hứa) |
|
||
| C6 rủi-ro thật | `grep "detector\|guard\|hook"` ∩ `chặn\|quét\|bắt\|đảm` trong `docs/governance/*.md` | **19 hit** — **ngoài** tập-đo của C6 |
|
||
| **C6 trùng-việc** | `broadcasts/outbox/ai_infra/2026-07-18-se-to-ai_infra-adap-wave-3-ban-17-07-bao-nac.md:26` | *"Grep lớp câu 'máy sẽ quét / detector phủ / đã fault-inject' trên governance SE ra **3 câu** … cả 3 trace được vào mã đang chạy … **Không câu nào phải hạ chữ**"* |
|
||
| **C12 tiền-đề** | `grep -n "HMW\|posture\|ensemble" CLAUDE.md docs/CLAUDE.md` | **0 hit** (CLAUDE.md 147 dòng) ⇒ phát hiện P3-3 của spec **ĐÚNG** |
|
||
| **C12 bẫy** | `fable-clone.md:16` | *"Hiệu-lực CHỈ lượt đó — KHÔNG còn 'về mặc-định', KHÔNG marker, KHÔNG persist"* |
|
||
| **C11 xung-đột** | `.claude/commands/sleep-recovery-memory-l2.md:52` | *"**INFORM 7-ngày GIỮ** (quyền owner cục-bộ, B1 §3.4; cấm-là-cấm-hub-phát-chuẩn)"* |
|
||
| C11 over-broad | `grep -c "ngày"` file trên | **6** — phần lớn văn xuôi (`:68/:76/:80`), KHÔNG phải trigger |
|
||
| **C7 đường pause** | `pause.md:44` (53 dòng) | đã gọi `powershell.exe … scripts/nhip-no-probe.ps1` **ngay trong** đường dừng |
|
||
| C10 mẫu-số | `ls scripts/` | ~10 thước: `governance-detectors` · `memory-archive-gate` · `memory-selfimprove-audit` · `mfe-eval` · `applied-eval-nokey` · `agent-frontmatter-eol-check` · `crystallized-backfill` · `nhip-no-probe` · `measure-agent-memory` · `deps-audit` |
|
||
| C5 máy nền | idem | `scripts/mfe-eval.ps1` + `scripts/applied-eval-nokey.ps1` **có thật** |
|
||
|
||
## 2. Bảng C1→C13 — 4 câu hub (`eval:15-24`)
|
||
|
||
| # | Lớp đo (`eval:20`) | Goodhart-able? — đường lách cụ thể | Pos/Neg-control (`eval:31`) | Bỏ thì lọt gì (`eval:22`) | **Verdict** |
|
||
|---|---|---|---|---|---|
|
||
| **C1** | integrity→**efficacy** | Khó. Hardcode `log('lane CHẾT')` qua được vế dương nhưng **trượt vế âm** | **CÓ CẢ 2** (null→phải có · sạch→phải không) + `node --check` | Đúng ca đã cắn hôm nay: 3/5 lane chết, lead thấy "sạch". **Active, không dormant** | **RĂNG THẬT** |
|
||
| **C2** | **activity** (2/3 vế không đo được) | **CAO** — `grep -c 'trần lượt' ≥1` hiện = 0, gõ đúng cụm chữ là xong | KHÔNG | Lane chết vì cháy lượt — ca thật, nhưng **thước không quy được NHÂN**: marker C1 chỉ biết `null`, không biết *vì sao* | **NỬA-RỖNG** |
|
||
| **C3** | **activity**, tự-chấm | **CAO** — chấm chính label mình vừa viết, n=3, **không có artifact** (label panel ephemeral, `grep` không truy được; chỉ `hmw.js:9` là chuỗi tĩnh) | KHÔNG (thiếu ca label-hỏng-phải-trượt) | Ca thật có (`spec:67` `"Probe harness-eval alive"` thiếu pha+phiên) ⇒ **dormant-đúng-thiết-kế, thước hỏng** | **RỖNG** |
|
||
| **C4** | integrity→outcome | TRUNG BÌNH — re-check con số **dễ nhất**; **không cấm em-main tự kiểm vòng chính mình đo** (trái `m-3 no-self-exempt` S139) | Một nửa (thách-CLEAN ≥1 lens) | Vòng báo CLEAN sai — ca thật S143 (lead ĐO tốt nhưng ĐẾM-VỀ-MÌNH ~13%) | **NỬA-RĂNG** |
|
||
| **C5** | **efficacy** (nửa) | Vế `payload chứa literal 'FLOOR theo evidence'` = dán chuỗi | **CHỈ NEG, THIẾU POS** 🔴 — matcher **luôn** trả 0-hit qua neg-control **hoàn hảo** | Matcher rác báo APPLIED bừa | **NỬA-RĂNG** |
|
||
| **C6** | **activity, tập rỗng** | **TUYỆT ĐỐI** — tập-đo literal = **0/19**; và **rời-tập-đo** miễn phí: viết "hệ thống chặn X" là thoát | KHÔNG (không có câu-hứa-giả cắm vào) | **KHÔNG LỌT GÌ MỚI** — sweep rộng hơn đã chạy 3/3-sạch @wave-3 | **RỖNG HOÀN TOÀN** 🔴 |
|
||
| **C7** | **activity** | **CAO** — "đo wall-clock 1 lần, **ghi số**" **PASS ở MỌI giá trị** (`eval:21c` nhãn-hứa-không-ép). Tập cấm chỉ liệt "spawn-agent/quét-rộng" ⇒ `pause.md:44` gọi `powershell.exe` **lọt qua khe** | KHÔNG | Điểm dừng đắt lên — ràng buộc CỨNG `goi-chot:44` | **NỬA-RỖNG** |
|
||
| **C8** | integrity→efficacy | Khó — đòi **THROW**, `log` không giả được | **CÓ CẢ 2** (fault-inject 2 chiều) | `depth-axis` F1 trần cứng; hiện `hmw.js:114-116` = FAIL đo được | **RĂNG THẬT** |
|
||
| **C9** | activity + **mâu-thuẫn** | "cột đơn-vị hiện diện" = có cột là xong | KHÔNG | Bảng cost đóng băng ở 7 vai (roster thật 17) | **NỬA-RỖNG** — acceptance đòi *"trả lời được falsifier `depth-cost:59`"* mà **chính spec `:103` khai falsifier "CHƯA ĐO ĐƯỢC"**, không nêu lối thoát |
|
||
| **C10** | activity + phép-thử thật | **CAO ở chỗ chọn mẫu** — "1 detector **bất kỳ**" trên **~10**; lựa chọn hợp lý = cái **đã** fault-inject (S138 13/13 · S143 7 ca) ⇒ **xanh chắc chắn, 0 thông tin về 9 cái kia**. Bảng "mỗi thước có verdict" = 100%-do-cấu-trúc (`eval:32`) | Có, nhưng **cỡ mẫu 1/10 tự chọn** | Thước xanh-vì-mù — chính bệnh hub tự bắt 17/18 | **NỬA-RĂNG** |
|
||
| **C11** | **activity, grep-vắng-mặt** | **TUYỆT ĐỐI** — grep-cho-VẮNG là dạng dễ lách nhất: đổi tên `ngày`→`chu-kỳ`/`d` là = 0, **hành vi y nguyên**. Thêm: phạm vi "trigger" **không nêu file** ⇒ người chấm tự chọn | KHÔNG | Proxy-giả theo tuổi | **RỖNG + BẤT-KHẢ-THI** 🔴 — đạt `=0` buộc **xoá luật owner đang GIỮ** (`sleep-…l2.md:52`), trái **luật-chung #6** và **O-1** của chính spec; lại **over-broad**: 6 chữ "ngày" phần lớn là văn xuôi ⇒ đỏ-giả vĩnh viễn |
|
||
| **C12** | **activity** (đo presence, mục tiêu là **use**) | **CAO** — thêm 1 dòng là xong (hiện 0 hit) | KHÔNG (không có phép thử "phiên mới có THẤY không") | Posture vô hình với phiên mới | **RỖNG + ĐỘC-HẠI** 🔴 — `fable-clone.md:16` nói posture **KHÔNG persist, chỉ sống trong lượt**; ghi dòng thường-trực vào `CLAUDE.md` (load MỌI phiên) = **đẻ ghost-wire mới**, đúng lớp SE đang trả nợ |
|
||
| **C13** | integrity (per-dòng) | TRUNG BÌNH — *"lý-do-không-làm"* là **cửa thoát vô hạn**: mọi dòng đều đạt được bằng một lý do ⇒ **không bao giờ đỏ** | KHÔNG | Báo số tổng che dòng sót (bài `meta-count` S119) | **NỬA-RĂNG** — cấu trúc đúng, **ngưỡng vắng** |
|
||
|
||
## 3. Câu chốt A — răng THẬT ⟂ nghi thức rỗng
|
||
|
||
- **RĂNG THẬT (2):** **C1**, **C8**. Cả hai: fault-inject **2 chiều** + đòi **hình dạng mã** (`THROW` ≠ `log`) mà lời-nói không giả được. Đây là chỗ SE **đi trước hub** (`eval:31` hub 17/18 thiếu positive-control) — giữ nguyên.
|
||
- **NỬA-RĂNG (4):** **C4**, **C5**, **C10**, **C13** — có lõi thật, hỏng ở **cỡ mẫu / thiếu nửa control / thiếu ngưỡng**.
|
||
- **NGHI THỨC RỖNG (5):** **C2**, **C3**, **C6**, **C11**, **C12**.
|
||
🔴 Nguy nhất **không phải mục thiếu, mà là C6** — nó **trông nghiêm nhất** (binding floor, giao cho vai `reviewer`, có "đếm trước/sau") nhưng **tập-đo rỗng + việc đã làm rồi**. Qua C6 sẽ tạo cảm giác "đã phủ lời-hứa-máy" trong khi **19 câu** họ-diễn-đạt chưa ai sờ tới.
|
||
|
||
## 4. Câu chốt B — phép thử 2 (`eval:52`): bịa input chắc-chắn-sai
|
||
|
||
### Ca 1 — bịa cho **C6** ⇒ **KHÔNG ĐỎ** (xanh-vì-mù, đã chứng minh bằng số)
|
||
Bịa: chèn vào `docs/governance/harness-11-engine.md` câu *"Cổng nén-kết-tinh **tự-động quét** mọi shard mới và **chặn** shard thiếu guard."* — **không có mã nào làm việc đó**.
|
||
Chạy acceptance C6 (`grep "máy sẽ"` trên governance SE) → **0 hit → BÁO XANH**. Câu bịa **lọt trọn**.
|
||
Bằng chứng hậu thuẫn: literal `"máy sẽ"` trong `docs/governance/` = **0**, trong khi họ-diễn-đạt cùng nghĩa = **19**. ⇒ **C6 không có cách nào đỏ** trên đúng loại lỗi nó sinh ra để bắt.
|
||
|
||
### Ca 2 — bịa cho **C1** ⇒ **ĐỎ ĐÚNG** (răng thật)
|
||
Bịa: sửa `hmw.js` thành in **vô điều kiện** `log('hmw: 0/0 lane CHẾT (null) — KHÔNG phải "sạch"')`.
|
||
- Vế dương (ép 1 lane null → output phải chứa `lane CHẾT`) → **XANH** (lách được nếu chỉ có 1 chiều).
|
||
- Vế âm (lane sạch → **KHÔNG** được chứa) → **ĐỎ**. ⇒ C1 **bịt được** ca giả này nhờ **2 chiều**.
|
||
|
||
### Ca 3 (bonus) — **C11** ⇒ **KHÔNG ĐỎ**
|
||
Đổi `≥ 7 (ngày)` thành `≥ 7 (chu-kỳ)` → `grep 'ngày\|7 day'` = **0 → XANH**, trigger **vẫn đếm tuổi y hệt**. Rời-tập-đo thuần tuý.
|
||
|
||
## 5. Đề xuất SIẾT (acceptance mới — mô tả tiêu chí, KHÔNG viết mã hộ)
|
||
|
||
| # | Siết thành |
|
||
|---|---|
|
||
| **C6** | Bỏ neo literal. Tập-đo = **danh sách liệt kê tường minh** các câu-hứa-năng-lực trong `docs/governance/*.md` (mẫu số công bố, hiện đo được **19**), mỗi câu một dòng disposition {mã + lệnh + positive-control ⟂ đã hạ thành dự-định}. **Bắt buộc positive-control**: cắm **1 câu-hứa-giả** vào cây tạm → sweep **phải** nhặt ra. Và tách bạch **use⟂mention** (7 hit hiện có đều là *mention*, không được tính là vi phạm). Deliverable thật của `goi-chot:52` là **câu hỏi thường-trực ở cửa review**, không phải một lần quét ⇒ acceptance nên đo *gate đã cài*, không đo *đã quét xong*. |
|
||
| **C11** | **Gỡ khỏi phạm vi em-main** hoặc viết lại: `grep=0` **mâu thuẫn** với `sleep-…l2.md:52` (owner GIỮ 7-ngày) + luật-chung #6 + O-1. Nếu giữ: đo **hành vi** (bơm trạng thái *0 shard chưa-gist nhưng đã 30 ngày* → trigger **phải im**; *3 shard chưa-gist, 0 ngày* → **phải kêu**) thay vì grep chữ. |
|
||
| **C12** | Bỏ vế "CLAUDE.md có dòng nêu posture **đang hiệu lực**" (stale-by-construction vs `fable-clone.md:16`). Thay bằng: `CLAUDE.md` trỏ **nơi tra posture**, và phép thử **use**: phiên mới chỉ đọc file luật có **nói đúng posture hiện hành** không (1 ca dương + 1 ca âm). |
|
||
| **C7** | Thêm **ngưỡng** (số của **owner** — O-gated, em không tự đặt) để "rẻ" có thể ĐỎ; đổi tập cấm từ liệt-kê-danh-mục sang **bất kỳ tiến-trình ngoài nào** trong đường dừng (nếu không, `pause.md:44` lọt khe). |
|
||
| **C10** | Cỡ mẫu **≥3, và ưu tiên thước CHƯA từng fault-inject** (loại trừ các ca S138/S143 đã xanh) — nếu không, phép-thử-2 xanh-do-chọn-mẫu. Bỏ vế "mỗi thước có verdict" khỏi headline (100% do cấu trúc, `eval:32`). |
|
||
| **C5** | Thêm **positive-control**: id THẬT đã biết → **phải** ra APPLIED. Không có vế này, matcher chết (luôn 0-hit) đạt C5 tuyệt đối. |
|
||
| **C2** | Bỏ `grep -c 'trần lượt'` khỏi acceptance (đếm chữ). Giữ vế "≤3 file/lane" nhưng **khai rõ nó chỉ đo được ở run KẾ** — không phải cổng của run này. Muốn "0 lane chết **vì cháy lượt**" đo được thì cần tín hiệu **phân biệt nguyên nhân**, C1 hiện chỉ biết `null`. |
|
||
| **C3** | Thêm **negative-control**: cắm 1 label thiếu {pha·phiên} → phép đọc-lại **phải trượt**. Và neo **artifact** (label phải xuất hiện trong `runs/<id>/run.md`) — nếu không thì không tái-lập/không audit được. |
|
||
| **C4** | Cấm **tự-kiểm vòng chính mình đo** (`m-3 no-self-exempt` S139); nêu đích danh **con số** bị re-check phải là con số **có thể sai** (không phải hằng số hiển nhiên). |
|
||
| **C13** | "Lý-do-không-làm" phải kèm **phân loại** {owner-gated · defer-có-ngày · bác-bỏ-có-bằng-chứng} — nếu không, cửa thoát vô hạn. |
|
||
| **C9** | Gỡ mâu thuẫn: hoặc khai *"falsifier `depth-cost:59` vẫn CHƯA đo được, C9 chỉ đóng phần re-ground roster"*, hoặc nêu đơn-vị chung làm cho nó đo được. Không để acceptance đòi thứ chính spec khai bất-khả-đo. |
|
||
|
||
## 6. Công bằng (Smart-Friend guard — nói cả chỗ đúng)
|
||
|
||
- Spec **re-đo đúng** roster **17** (`ls .claude/agents/` = 18 − README) — không chép số cũ.
|
||
- ①(2) `hmw.js:225`, `:114-116`, `:124-125` **khớp đĩa 3/3**.
|
||
- P3-3 phát hiện `CLAUDE.md` thiếu posture: **ĐÚNG** (0 hit) — vấn đề nằm ở *cách vá*, không ở *chẩn đoán*.
|
||
- Luật-chung #3 (bảng disposition từng dòng) + #4 (ghi đĩa trong lúc làm) là **tự-nhận-thức thật**, và chính #4 cứu lượt này.
|
||
- **C1 + C8 là hàng thật** — 2 chiều, đúng chuẩn `eval:31` mà hub tự thú còn thiếu.
|
||
|
||
## 7. Cảnh báo phối-hợp (ngoài 4 câu)
|
||
|
||
**C1 CẤM `throw` ⟂ C8 ĐÒI `throw`** trong cùng một tài liệu (`spec:53` vs `spec:158`). Hoà giải **có tồn tại nhưng nằm trong mã, không nằm trong spec**: `hmw.js:124` — *"(trước parallel) — halt KHÔNG phụ-thuộc semantics parallel()"* ⇒ C8 chặn **up-front trước `parallel()`** (throw sống), C1 nói về **per-lane trong `parallel()`** (throw bị nuốt thành null). Worker đọc spec đơn thuần sẽ thấy mâu thuẫn ⇒ **nên ghi 1 dòng phân định vào spec** trước khi giao.
|