---
name: feedback-guard-built-but-never-called
description: "Máy/guard dựng xong, chạy đúng, fault-inject có răng — mà KHÔNG cửa nào gọi ⇒ chết câm; thang 2 nấc xếp nó vào \"CÓ\" và ta yên tâm nhầm"
metadata: 
  node_type: memory
  type: feedback
  originSessionId: 1ba002a9-95df-4fc1-ab97-e36eeb531eeb
  modified: 2026-08-07T16:02:37.345Z
---

Một guard có thể **đúng hoàn toàn** mà vẫn vô dụng: nếu **không cửa nghi-thức nào gọi nó**, nó chỉ chạy khi có người gõ tay ⇒ hết phiên là hết chạy. Đo thật @S181: `naming-scan.ps1` + `artifact-integrity.ps1` (dựng ở W1/W2, chạy tốt, fault-inject 2 chiều có răng) có **0 cửa gọi** — phát hiện **chỉ vì** bảng máy⟂tay bắt phải có **BA nấc**.

**Why:** thang 2 nấc (*"có máy / không có máy"*) xếp máy mồ côi vào **CÓ**, và ta đọc thành "đã tự động hoá". Nấc thứ ba (*fire tự động?*) mới tách được **tồn tại** khỏi **được gọi**. Cùng họ với `feedback_dryrun_finds_promised_but_unlanded` (lệnh chỉ sống trong comment) và `feedback_absence_looks_like_clean` — đều là **vắng mặt trông giống ổn**.

**Đối ngẫu bắt được cùng phiên — thước của mình sai trước khi trách máy:** mutation-test lần đầu ra *"chỉ 1 bài đỏ ⇒ máy soi một chiều"*, và tôi đã viết cả đoạn giải thích nghe rất hợp lý. Nhưng máy **có** chiều ngược; **regex đo của tôi** thiếu pattern. Khi phép đo tố cáo công cụ, **nghi phép đo trước** — công cụ đã qua fault-inject, thước thì vừa gõ ra.

**How to apply:** dựng guard xong ⇒ **grep xem cửa nào gọi nó** (`grep -rl "<tên script>" .claude/commands/ .claude/hooks/`), 0 hit = chưa xong việc, phải wire. Khi kiểm độ phủ tự-động hoá, **đếm cửa gọi**, đừng đếm sự tồn tại của máy. Và trước khi kết luận "máy thiếu X", chạy control dương cho **chính thước đo** của mình. Liên [[feedback_dryrun_finds_promised_but_unlanded]] · [[feedback_absence_looks_like_clean]] · [[feedback_faultinjection_proves_teeth]].
