wal: flush 20260807T1729

This commit is contained in:
pqhuy1987
2026-08-07 17:29:49 +07:00
parent 66e904c33a
commit 40914682b1
3 changed files with 236 additions and 7 deletions

View File

@ -1,5 +1,7 @@
# Implementer-Backend Agent — Persistent Memory # Implementer-Backend Agent — Persistent Memory
- **S180 (2026-08-07) lane W3 — nghi thức 2 đầu: 4 nhãn + vòng hỏi ngược + tiền-kiểm 9/19 + gói-B persona `[#53 vai thứ 20; cứu TRỌN nhờ ghi-đĩa-từng-phần — lead resume, xong nốt]`:** Nghề ăn tiền = **KHAI ĐÚNG NẤC CƯỠNG CHẾ**: ký 4/4 nhãn thành văn nhưng đo lại thì **1 có máy đủ · 2 nửa · 1 (`bị chặn`) CHƯA CÓ MÁY** — vị từ `(3)` cho **cùng một số** với *trỏ đặc tả**trỏ nỗ lực gỡ*, không phân biệt được ⇒ khai thẳng thay vì để nó trông như đã cưỡng chế (LỚP-9). 🔴 **Bác đề bài 1 chỗ, đứng:** khung *"chỉ bỏ-qua-KHÔNG-khai mới là lỗi"* ⊥ chữ hub (`phu-luc:189` tính cả ca **CÓ KHAI mà điều kiện đánh-giá-lại ra SAI***tự ý bỏ*) ⇒ nhận khung đó thì **một dòng khai là tự tha được**; ký theo hub + luật *`không-xác-định` rơi về nhãn NẶNG* (mặc-định-vô-tội = thưởng cho đặc tả mơ hồ). 🔴 **Bác lane F:** `check-email` bị đếm là 1 trong "6 cửa gọi `nhip-no-probe`" — đĩa nói **2 hit đều là NHẮC TÊN, 0 lời gọi** ⇒ tập đúng = 5. Sửa lane C 4/19→**5/19** (`snapshot:69` đóng từ 🟡 sang CÓ). 🔴 **Fault-inject lượt ĐẦU chết vì HARNESS:** viết inline qua bash ⇒ bash nuốt `$`/backtick của chuỗi PS ⇒ WAL "lành" không bao giờ ghi đúng ⇒ chiều B kêu **trông y hệt script hỏng**; dựng harness thành `.ps1` riêng ⇒ 5/5. **Tự bắt citation-trap vòng 1** (ghi chú vá trích nguyên cụm số cũ ⇒ grep vẫn =1), vòng 2 diễn-giải ⇒ 0, re-grep bằng lệnh KHÁC. Wall-clock ĐO TRƯỚC khi cắm (luật `check-email.md:41`): ròng **194ms < 281ms** đã-chấp-nhận ⇒ **vẫn KHÔNG cắm vào `/pause`·`/tiep`** (đã có probe). Tag `[s180, w3-nghi-thuc, khai-dung-nac-cuong-che, khai-khong-tu-mien-tru, use-vs-mention-lane-f, harness-hong-trong-nhu-script-hong, do-truoc-roi-noi-khong]`
- **S180 (2026-08-07) lane W2 — dựng máy điểm danh vật chứng (4 vị từ · fault-inject 3 chiều · ca-N1 BẮT) `[#53 vai thứ 19; cứu TRỌN nhờ ghi-đĩa-từng-phần — lead resume, xong nốt]`:** Nghề ăn tiền = **ĐO PHÂN BỐ TRƯỚC KHI CHỌN NGƯỠNG**: K của vị-từ-tỉ-lệ lấy = **phân vị 5 đo thật trên 446 tệp họ `sub-*`** (K=3,00), KHÔNG chỉnh cho vừa ca đã biết — ca N1 rơi ở phân vị 3,6, **lọt lưới sát nút** ⇒ khai thẳng *"vị từ này là lưới PHỤ"* thay vì hạ K xuống 2,7 (= Goodhart). Vị từ CHÍNH = **nhãn treo NEO VÀO HEADING** (tách *dùng**nhắc đến*): thô cho **1 dương-giả trên chính bản đã xong** (câu định nghĩa nhãn) — neo heading ⇒ 6/0. 🔴 **Bẫy thước tự bắt:** `grep '[^\x00-\x7F]'` Git-Bash cho **268 hit trên tệp biết-là-sạch****control âm sai = hỏng THƯỚC**, phải đọc byte bằng .NET. 🔴 **Bác lệnh lead 1 chỗ, đúng:** spec bảo `git show HEAD~1:<file>` — hook `wal:` chèn commit giữa ⇒ HEAD~1 **không phải bản trước CỦA TỆP**, phép so thành *so bản mới với chính nó***trông y hệt phép đo hợp lệ**; dùng `git log -2 -- <file>`. **Quét toàn kho lộ 2 lớp dương-giả (294→31 cờ):** con-trỏ CHÉO giữa lượt chạy (README bắt trỏ `input spec:` sang lượt trước) = lỗi MÁY không phải nợ kho ⇒ phân giải toàn cây; `KHONG-KHAI` 245/720 = cờ cho **luật chưa từng tồn tại****hạ xuống hạng-mục-đếm-riêng NHƯNG GIỮ SỐ + mẫu số** (phép thử *"cái mất đi là dương-giả hay CHỨNG-NHÂN?"*). Vá đến SAU test ⇒ **chạy lại trọn 3 chiều**. Tag `[s180, w2-artifact-integrity, do-phan-bo-truoc-chon-nguong, neo-heading-use-vs-mention, control-am-sai-la-hong-thuoc, headn-khong-phai-ban-truoc, giu-so-bo-co]` - **S180 (2026-08-07) lane W2 — dựng máy điểm danh vật chứng (4 vị từ · fault-inject 3 chiều · ca-N1 BẮT) `[#53 vai thứ 19; cứu TRỌN nhờ ghi-đĩa-từng-phần — lead resume, xong nốt]`:** Nghề ăn tiền = **ĐO PHÂN BỐ TRƯỚC KHI CHỌN NGƯỠNG**: K của vị-từ-tỉ-lệ lấy = **phân vị 5 đo thật trên 446 tệp họ `sub-*`** (K=3,00), KHÔNG chỉnh cho vừa ca đã biết — ca N1 rơi ở phân vị 3,6, **lọt lưới sát nút** ⇒ khai thẳng *"vị từ này là lưới PHỤ"* thay vì hạ K xuống 2,7 (= Goodhart). Vị từ CHÍNH = **nhãn treo NEO VÀO HEADING** (tách *dùng**nhắc đến*): thô cho **1 dương-giả trên chính bản đã xong** (câu định nghĩa nhãn) — neo heading ⇒ 6/0. 🔴 **Bẫy thước tự bắt:** `grep '[^\x00-\x7F]'` Git-Bash cho **268 hit trên tệp biết-là-sạch****control âm sai = hỏng THƯỚC**, phải đọc byte bằng .NET. 🔴 **Bác lệnh lead 1 chỗ, đúng:** spec bảo `git show HEAD~1:<file>` — hook `wal:` chèn commit giữa ⇒ HEAD~1 **không phải bản trước CỦA TỆP**, phép so thành *so bản mới với chính nó***trông y hệt phép đo hợp lệ**; dùng `git log -2 -- <file>`. **Quét toàn kho lộ 2 lớp dương-giả (294→31 cờ):** con-trỏ CHÉO giữa lượt chạy (README bắt trỏ `input spec:` sang lượt trước) = lỗi MÁY không phải nợ kho ⇒ phân giải toàn cây; `KHONG-KHAI` 245/720 = cờ cho **luật chưa từng tồn tại****hạ xuống hạng-mục-đếm-riêng NHƯNG GIỮ SỐ + mẫu số** (phép thử *"cái mất đi là dương-giả hay CHỨNG-NHÂN?"*). Vá đến SAU test ⇒ **chạy lại trọn 3 chiều**. Tag `[s180, w2-artifact-integrity, do-phan-bo-truoc-chon-nguong, neo-heading-use-vs-mention, control-am-sai-la-hong-thuoc, headn-khong-phai-ban-truoc, giu-so-bo-co]`
- **S180 (2026-08-07) lane W1-b — ký chuẩn đặt tên + dựng máy soi (11/11 ràng buộc · 3/3 vá · fault-inject 4 lượt/3 chiều) `[#53 vai thứ 18/phiên; cứu TRỌN nhờ ghi-đĩa-từng-phần — artifact 21KB đủ ruột TRƯỚC khi return chết; lead resume, xong nốt]`:** Nghề mới ăn tiền = **LUẬT NẤC: "một nhóm tên sạch CHÍNH XÁC tới độ sâu máy của nó KIỂM, không sâu hơn một nấc"** ⇒ mỗi mục chuẩn PHẢI khai nấc + trỏ máy ép đúng nấc đó; nhóm không máy ⇒ ghi `CHƯA CÓ MÁY`, **CẤM ký luật hình dạng** (ký sâu hơn máy = ký ra thứ tự nó trôi). Hệ quả 2: máy chỉ-ĐỌC (`detectors:1109` liệt-không-cờ) hoặc THA (`:1660` `-or` chấp 2 tên) ⇒ tên vẫn trôi — **nhưng KHÔNG cần STOP-HARD**: `:1639` chỉ in INFORM mà nhóm sạch 12/12. 🔴 **Tự bắt mình tái phạm citation-trap:**`hmw.js:33` bỏ số "11 class", bản vá ĐẦU **trích nguyên văn** cụm cũ ⇒ grep vẫn =1 ⇒ bài học **lời-giải-thích nằm TRONG tập đo**; vòng 2 mới =0 (control-dương 2 chuỗi cùng tệp). **Bác 3 chỗ, 3/3 đứng:** (a) lane a "23 lệch" → tôi đo **8/233** (16 script `s<n>-`/`plan-`*một-lần HỢP LỆ*, gọi lệch = **dương-giả**, mà dương-giả ngày đầu là cách nhanh nhất để người ta tắt máy soi; +1 vật lane a sót `resume-S146`); (b) lead tả bản vá S159 = `(sub|harness)-*` → đĩa thật `^(sub-.+|.+-return)\.md$` (bộ ba lọt qua nhánh `-return`, KHÔNG qua tiền tố) — mirror theo *diễn giải* sẽ đẻ **bản sao thứ 3 lệch nhau**; (c) `wave-plan:85` kê W3 sửa "5 class"→**6** = đúng LỚP-5 vừa gỡ, phải **BỎ SỐ** không đổi số. Bẫy đơn-vị cắn thật: `scripts/`+`docs/governance/` đếm theo **MỤC** (gồm thư mục) ≠ **TỆP** ⇒ lệch 4; và tự mình đẻ 2 vật giữa lượt ⇒ 231→233, phải KHAI. Phát hiện mới ngoài lane a: `settings.json:2` `autoMemoryDirectory` = **đường dẫn TUYỆT ĐỐI** neo cả tên thư mục lẫn gốc kho (lane a chỉ liệt `:9`). Tag `[s180, w1b-naming-standard, luat-nac, citation-trap-tu-bat, duong-gia-vs-chung-nhan, muc-vs-tep, inform-only-exit0]` - **S180 (2026-08-07) lane W1-b — ký chuẩn đặt tên + dựng máy soi (11/11 ràng buộc · 3/3 vá · fault-inject 4 lượt/3 chiều) `[#53 vai thứ 18/phiên; cứu TRỌN nhờ ghi-đĩa-từng-phần — artifact 21KB đủ ruột TRƯỚC khi return chết; lead resume, xong nốt]`:** Nghề mới ăn tiền = **LUẬT NẤC: "một nhóm tên sạch CHÍNH XÁC tới độ sâu máy của nó KIỂM, không sâu hơn một nấc"** ⇒ mỗi mục chuẩn PHẢI khai nấc + trỏ máy ép đúng nấc đó; nhóm không máy ⇒ ghi `CHƯA CÓ MÁY`, **CẤM ký luật hình dạng** (ký sâu hơn máy = ký ra thứ tự nó trôi). Hệ quả 2: máy chỉ-ĐỌC (`detectors:1109` liệt-không-cờ) hoặc THA (`:1660` `-or` chấp 2 tên) ⇒ tên vẫn trôi — **nhưng KHÔNG cần STOP-HARD**: `:1639` chỉ in INFORM mà nhóm sạch 12/12. 🔴 **Tự bắt mình tái phạm citation-trap:**`hmw.js:33` bỏ số "11 class", bản vá ĐẦU **trích nguyên văn** cụm cũ ⇒ grep vẫn =1 ⇒ bài học **lời-giải-thích nằm TRONG tập đo**; vòng 2 mới =0 (control-dương 2 chuỗi cùng tệp). **Bác 3 chỗ, 3/3 đứng:** (a) lane a "23 lệch" → tôi đo **8/233** (16 script `s<n>-`/`plan-`*một-lần HỢP LỆ*, gọi lệch = **dương-giả**, mà dương-giả ngày đầu là cách nhanh nhất để người ta tắt máy soi; +1 vật lane a sót `resume-S146`); (b) lead tả bản vá S159 = `(sub|harness)-*` → đĩa thật `^(sub-.+|.+-return)\.md$` (bộ ba lọt qua nhánh `-return`, KHÔNG qua tiền tố) — mirror theo *diễn giải* sẽ đẻ **bản sao thứ 3 lệch nhau**; (c) `wave-plan:85` kê W3 sửa "5 class"→**6** = đúng LỚP-5 vừa gỡ, phải **BỎ SỐ** không đổi số. Bẫy đơn-vị cắn thật: `scripts/`+`docs/governance/` đếm theo **MỤC** (gồm thư mục) ≠ **TỆP** ⇒ lệch 4; và tự mình đẻ 2 vật giữa lượt ⇒ 231→233, phải KHAI. Phát hiện mới ngoài lane a: `settings.json:2` `autoMemoryDirectory` = **đường dẫn TUYỆT ĐỐI** neo cả tên thư mục lẫn gốc kho (lane a chỉ liệt `:9`). Tag `[s180, w1b-naming-standard, luat-nac, citation-trap-tu-bat, duong-gia-vs-chung-nhan, muc-vs-tep, inform-only-exit0]`

View File

@ -0,0 +1,45 @@
# LEAD NOTE — mojibake trong `sub-w3-nghi-thuc.md` (khai thẳng, sửa MỘT PHẦN)
## Sự việc
`sub-w3-nghi-thuc.md` (26 KB) bị **mojibake ở nửa sau** — UTF-8 bị ghi như CP1252.
Bắt được lúc lead đọc verdict từ đĩa: `## §4 — (3) TIỀN-KIá»M…` thay vì `## §4 — (3) TIỀN-KIỂM…`.
## Đo (2 chiều, có control-dương)
| phép | kết quả |
|---|---|
| `U+FFFD` (ký tự thay thế = **mất byte**) | **0** ⇒ 🟢 **KHÔNG mất chữ nào**, chỉ mã hoá hai lần |
| mojibake ban đầu | **1.278** dấu hiệu |
| sau 4 vòng sửa | **1.226** — cải thiện, **KHÔNG hội tụ** |
| 🟢 **control-dương** | `sub-w2-luoi-ghi-dia.md` cùng thư mục = **0 mojibake** ⇒ không phải lỗi toàn kho, chỉ riêng lượt ghi này |
## Vì sao không sửa hết được
Các dòng bị **TRỘN** — đoạn hỏng và đoạn lành xen kẽ **không có ranh sạch**. Thử 4 cách, đều chỉ vá một phần:
1. theo DÒNG + `cp1252` strict → 20 dòng, 52 fail (dòng chứa ký tự ngoài bảng ⇒ cả dòng fail).
2. theo DÒNG + đa codec (`cp1252`/`latin-1`/`cp1258`), chỉ nhận nếu **giảm** mojibake → +5.
3. bảng ngược cp1252 đầy đủ 256 byte, lặp 3 lớp → +1.
4. theo ĐOẠN CON liên tiếp, lặp 3 vòng → 1.278 → 1.226.
## 🔴 Quyết định: DỪNG, không sửa tiếp
- Mỗi vòng ghi lại file = **một lần rủi ro hỏng thêm**; lợi ích biên đang giảm nhanh, rủi ro thì không.
- **Nội dung ĐỌC ĐƯỢC bằng mắt** (mojibake khả nghịch với người đọc) và **0 byte mất**.
- Cố cho đẹp lúc này = tối ưu **hình thức của bằng chứng** trong khi **bản thân bằng chứng đã nguyên vẹn** — đúng kiểu Goodhart mà cả phiên này đi bắt.
- 🔸 **Đường sửa triệt để nếu cần sau:** nhờ chính W3 viết lại các §4-§6 (nó còn nội dung trong context), hoặc đọc bản gốc từ `git log -p` nếu có commit trước lúc hỏng. **Không cấp bách.**
## Gốc kỹ thuật
Bẫy **PowerShell 5.1**: `Set-Content`/`Add-Content` mặc định **ANSI codepage**, không UTF-8. W3 hẳn đã đổi sang append bằng PowerShell ở nửa sau (nửa đầu sạch).
SE **đã biết lớp này**`check-email.md` cảnh báo *"CẤM `Get-Content -Raw` cho hash — PS 5.1 đọc UTF-8-no-BOM bằng ANSI → mojibake → false-tamper (S125)"*. Cùng bẫy, chiều **ghi** thay vì chiều **đọc**.
## 🔴 Lỗ hổng THẬT lộ ra — đáng giá hơn cả bản vá
**`artifact-integrity.ps1` (W2) KHÔNG bắt được ca này.** Nó đo **cấu trúc** (placeholder ở heading · tỉ lệ ruột/khung · tệp rỗng · nguồn-2) — **không đo MÃ HOÁ**.
File này qua hết mọi vị từ W2: có ruột (63 dòng), 0 placeholder, có nguồn-2, không rỗng. **Sạch theo mọi thước đang có, mà hỏng thật.**
**Lại đúng luật W1-a:** *"một artifact sạch **chính xác tới độ sâu máy của nó KIỂM**, không sâu hơn một nấc."* W2 kiểm cấu trúc ⇒ sạch cấu trúc; **mã hoá là nấc chưa ai kiểm**.
**Đề xuất vị từ V-5 (chưa cắm, ghi để W6 hoặc anh phán):**
```
V-5 mojibake: dem ('§','â€','á','á»','ă') trong *.md; >0 => FLAG
+ control-duong: U+FFFD == 0 => "khong mat byte, sua duoc"
+ phan biet 2 nac: U+FFFD>0 = MAT DU LIEU (nang) ⟂ moji-only = SAI MA HOA (sua duoc)
```
🔸 **Rẻ, 1 dòng grep, 0 cấu hình** — cùng hạng với V-2 (vị từ mạnh nhất của W2).
🔸 **CẤM** gộp V-5 vào `LECH` của `naming-scan` — khác trục (tên ⟂ nội dung).

View File

@ -15,14 +15,16 @@
## §0 — Trạng thái ghi đĩa (cập nhật liên tục) ## §0 — Trạng thái ghi đĩa (cập nhật liên tục)
| Mục | Trạng thái | Ghi ở § | | Mục | Trạng thái | Ghi ở § |
|---|---|---| |---|---|---|
| (1) 4 nhãn suy-giảm | ⏳ đang làm | §1 | | Phép đo nền (wall-clock + bảng 19 cửa + persona) | ✅ XONG | §1 |
| (2) Vòng hỏi ngược 5 cột | ⏳ | §2 | | (1) 4 nhãn suy-giảm | ✅ KÝ 4/4 — nhưng **cưỡng chế 1 đủ / 2 nửa / 1 CHƯA CÓ MÁY** | §2 |
| (3) Tiền-kiểm đầu cửa | ⏳ | §3 | | (2) Vòng hỏi ngược 5 cột | ✅ CÓ — khuôn + luật đóng 3 điều kiện + 1 hàng sinh bằng máy | §3 |
| (4) Gói-B persona | ⏳ | §4 | | (3) Tiền-kiểm đầu cửa | ✅ **5/19 → 9/19** + máy mới + fault-inject 5/5 | §4 |
| Fault-inject 3 chiều | ⏳ | §5 | | (4) Gói-B persona | ✅ 4 tệp / 5 sửa — 4 phép đo sau-restart **BÀN GIAO lead** | §5 |
| CHƯA ĐO / CẦN LEAD | | §6 | | Hệ quả lên máy sống + CHƯA ĐO / CẦN LEAD | ✅ 6 mục | §6 |
**Vật đã hạ cánh:** `docs/governance/ritual-labels.md` (mới) · `scripts/tien-kiem-cua.ps1` (mới) · `.claude/commands/{adap-apply,adap-report,adap-request,check-email}.md` · `.claude/agents/{lead-stale-auditor,ring2-audit,back-end-reviewer-style,database-reviewer-style}.md`.
--- ---
@ -89,3 +91,183 @@ Lệnh: `Measure-Command`, n=5, lấy min/trung-vị/max. Máy này, 2026-08-07.
**Nguồn số enum (đọc đĩa, không tin doc):** `.claude/agent-memory/memory-budget.json` → `lead_self_audit.flag_classes` = **12 phần tử = 6 `view-*` + 6 `gap-*`**. Phần tử thứ 6 của nhánh view là **`view-claim-broader-than-sample`** (mở @S172 theo escalate của `ring2-audit`). **Nguồn số enum (đọc đĩa, không tin doc):** `.claude/agent-memory/memory-budget.json` → `lead_self_audit.flag_classes` = **12 phần tử = 6 `view-*` + 6 `gap-*`**. Phần tử thứ 6 của nhánh view là **`view-claim-broader-than-sample`** (mở @S172 theo escalate của `ring2-audit`).
🔴 **PHÁT HIỆN NGOÀI DANH SÁCH ĐỀ BÀI — nặng hơn ca `ring2`:** đề bài chỉ giao sửa `ring2-audit.md:4`. Nhưng `lead-stale-auditor.md` — **chính vai PHẢI DÙNG enum đó** — cũng chỉ liệt **5/6** class `view-*`, thiếu đúng `view-claim-broader-than-sample`. Đây là **ghost-enum tái phát**: đúng lớp lỗi `F-B HIGH` mà `tooling-auditor` đã ghi @S143 (*"enum mở 10→11 nhưng commit KHÔNG đụng `lead-gap-auditor.md` — vai bị luật CẤM tự chế class ⇒ lần tới gặp ca sẽ escalate lại đúng thứ vừa được duyệt"*). Lần này vật thể là nhánh `view-*` và vai là `lead-stale-auditor`. Sửa `ring2` mà bỏ `lead-stale-auditor` = vá cái GƯƠNG, để nguyên cái MÁY. 🔴 **PHÁT HIỆN NGOÀI DANH SÁCH ĐỀ BÀI — nặng hơn ca `ring2`:** đề bài chỉ giao sửa `ring2-audit.md:4`. Nhưng `lead-stale-auditor.md` — **chính vai PHẢI DÙNG enum đó** — cũng chỉ liệt **5/6** class `view-*`, thiếu đúng `view-claim-broader-than-sample`. Đây là **ghost-enum tái phát**: đúng lớp lỗi `F-B HIGH` mà `tooling-auditor` đã ghi @S143 (*"enum mở 10→11 nhưng commit KHÔNG đụng `lead-gap-auditor.md` — vai bị luật CẤM tự chế class ⇒ lần tới gặp ca sẽ escalate lại đúng thứ vừa được duyệt"*). Lần này vật thể là nhánh `view-*` và vai là `lead-stale-auditor`. Sửa `ring2` mà bỏ `lead-stale-auditor` = vá cái GƯƠNG, để nguyên cái MÁY.
---
## §2 — (1) BỐN NHÃN — đã ký `docs/governance/ritual-labels.md`, và CHỨNG vị từ chạy THẬT
**Vật đã hạ cánh:** `docs/governance/ritual-labels.md` (kebab thường, đúng `naming-standard.md:170` luật vật MỚI).
### 2.1 — Bốn vị từ, chạy thật, kèm control-dương
`$M` = vật mốc · `$V` = **vật chứng của LƯỢT** (không phải đặc tả) · `$B` = mã bước.
| Vị từ | Lệnh | Ca thật đã chạy | Kết quả | Control-dương |
|---|---|---|---|---|
| (1) vật mốc | `test -e "$M" && echo 1 \|\| echo 0` | `docs/governance/rename-ledger.md` | **0** = VẮNG | `test -e naming-standard.md` → **1** ⇒ thước đọc được đĩa |
| (2) dòng khai | `grep -c -- "$B" "$V"` | `$B=rename-ledger` trong `sub-w1b-chuan-ten.md` | **0** = KHÔNG KHAI | cùng tệp, `grep -c naming-standard` → **6** ⇒ thước đọc được tệp |
| (3) con trỏ `file:line` | `grep -E -c -- "$B.*[^ ]+\.(md\|ps1\|py\|js\|json):[0-9]+" "$V"` | như trên | **0** | cùng tệp, bỏ neo `$B` → **39** ⇒ thước bắt được khuôn con trỏ |
| (4) điều kiện chạy lại | *lệnh do đặc tả nêu* | `naming-standard.md` **không nêu** điều kiện chạy-lại-được cho bước "lập sổ đổi tên" | **không-xác-định** | — |
⇒ Tra bảng quyết định `ritual-labels.md §2.1`: (1)=0 · (2)=0 ⇒ **nhãn `quên`**. **Hàng đầu tiên của vòng hỏi ngược, sinh bằng máy, không bằng cảm giác.**
🔴 **Ca này là một phát hiện thật, không phải ví dụ dựng:** `naming-standard.md:10` tuyên *"Sổ đổi tên: `docs/governance/rename-ledger.md` — chỉ-thêm-không-xoá"* và `:278` tuyên *"Sáu ô còn lại: xem `rename-ledger.md`"* — **tệp không tồn tại**, và **vật chứng lượt W1-b không có dòng khai nào**. Đúng lớp *lời-hứa-chưa-land* (`feedback_dryrun_finds_promised_but_unlanded`). **Tôi KHÔNG sửa `naming-standard.md`** (nằm trong danh sách cấm) — nộp thành 1 hàng cho lead.
### 2.2 — 🔴 NHÃN NÀO **CHƯA CÓ MÁY** (luật nấc W1-a: sạch đúng tới độ sâu máy KIỂM, không sâu hơn một nấc)
| Nhãn | Máy chấm được tới đâu | Nấc |
|---|---|---|
| **quên** | **TRỌN** — `(1)=0 ∧ (2)=0`, cả hai vị từ đều cơ khí | ✅ **CÓ MÁY ĐỦ** |
| **tự ý bỏ** | máy chỉ chấm được nhánh `(2)≥1 ∧ (3)=0`. Nhánh `(4)=sai` **CHƯA CÓ MÁY** — không máy nào chạy lại điều kiện cho phép | 🟡 **NỬA** |
| **suy giảm hợp lệ** | máy chấm được *có khai + có con trỏ*; **không** chấm được *con trỏ trỏ đúng chỗ cho phép hay không* | 🟡 **NỬA** |
| **bị chặn** | ❌ **CHƯA CÓ MÁY.** Phân biệt *"con trỏ tới đặc tả"* ⟂ *"con trỏ tới nỗ lực gỡ"* là phán-xét ngữ nghĩa, `(3)` cho **cùng một số** ở cả hai | ❌ **CHƯA CÓ MÁY** |
**⇒ Nói thẳng: 1/4 nhãn có máy đủ · 2/4 nửa · 1/4 chưa có máy.** Bốn nhãn **đã thành văn 4/4**, nhưng **cưỡng chế bằng máy thì KHÔNG phải 4/4**. Ghi đúng nấc này vào `ritual-labels.md §2.2` chứ không để nó trông như đã cưỡng chế — đó chính là **LỚP-9** (cưỡng chế được tuyên mà chưa có máy) mà cả gói này tồn tại để chữa.
🔴 **Máy anh em để đối chứng (lead chỉ, đã dùng):** `scripts/artifact-integrity.ps1` (W2) đang chạy thật. Nó chấm **vật chứng có đủ ruột không**; bốn nhãn ở đây chấm **bước có chạy không**. Hai trục khác nhau, **không** gộp số.
### 2.3 — 🔴 BÁC MỘT VẾ TRONG KHUNG ĐỀ BÀI (vế này nếu nhận sẽ làm thủng chính bộ nhãn)
Đề bài khung 4 nhãn là *"làm đủ ⟂ làm thiếu CÓ KHAI ⟂ bỏ qua CÓ KHAI ⟂ bỏ qua KHÔNG khai — **chỉ nhãn cuối mới là lỗi**"*.
**Đo lại chữ hub** (`phu-luc:189`, nguyên văn): *tự ý bỏ* = *"bỏ mà không khai, **hoặc** khai là 'bỏ êm' trong khi điều kiện cho phép bỏ **đánh giá lại trên đĩa là sai**"*.
⇒ Hub **có tính** một ca **CÓ KHAI** là lỗi nặng. Nếu áp khung *"chỉ bỏ-qua-KHÔNG-khai mới là lỗi"* thì **viết một dòng khai là tự tha được**, và bộ nhãn thành đồ trang trí. Hai khung cũng **không cùng phân hoạch**: *làm đủ* của đề bài = **TRỌN**, mà TRỌN **không sinh hàng nào** nên nó không phải một trong 4 nhãn.
**Xử:** ký theo **chữ hub**, ghi rõ ở `ritual-labels.md §2.2(a)(b)`: (a) khai không tự miễn trừ · (b) `(4)=không-xác-định` ⇒ rơi về nhãn **NẶNG**, không rơi về nhãn vô tội — vì nếu chỗ mù mặc định về vô tội thì cách rẻ nhất để sạch là **viết đặc tả mơ hồ**.
---
## §3 — (2) VÒNG HỎI NGƯỢC 5 CỘT — đã ký `ritual-labels.md §3`
Khuôn nguyên chữ hub, 5 cá»™t **không Äổi tên**: *bưá»c thiếu hoặc lệch · Äặc tả nói gì · bằng chứng trên ÄÄ©a · nhãn nào · câu hỏi Äích danh*.
**Luật Äóng — ba Äiều kiện, thiếu má»™t là CHƯA ĐÓNG** (`ritual-labels.md §3.2`):
1. **0 ô trá»ng** — kể cả cá»™t *nhãn*: không phân loại ÄÆ°á»£c ⇒ ghi `chưa-phân-loại` **kèm lý do**; ô trá»ng Äọc thành *đã xét và sạch*.
2. Má»—i hàng có **má»™t Äá»nh Äoạt** cá»§a người Äiều phá»i, thuá»™c Äúng 3 giá trá»: `chạy-bổ-sung` · `khai-suy-giảm` · `khai-không-thể-nữa`.
3. Bảng **luôn kèm MẪU SỐ** *N hàng / M bưá»c ÄÆ°á»£c soi*; `M` = sá» bưá»c **thật sá»± ÄÆ°á»£c duyệt**, không phải sá» bưá»c tồn tại.
🔴 **§3.3 CẤM thay bảng bằng má»™t con sá» tổng** — neo thẳng ca S119 (*"vá 19 finding"* khi thật **23**) + con trỏ `feedback_meta_count_selfcoverage_blindspot`. Ghi rõ Äây là **há»™i tụ Äá»™c lập**: luật Äóng cá»§a hub và i học S119 là cùng má»™t kết luận tìm ra ở hai nÆ¡i, để lần sau không ai tưởng là luật ngoại nhập.
🔴 **§3.4 `C3-02` thành văn:** vai kiểm **CHỈ ĐỐI CHIẾU**, nguồn = **chính tệp lệnh cá»§a cá»­a**; Äặc tả tá»± chỏi ⇒ nhãn `Äặc-tả-xung-Äá»™t` + **cả hai** con trỏ + trả người Äiều phá»i; **CẤM tá»± phán**. Ghi rõ: `Äặc-tả-xung-Äá»™t` ở Äây là **giá trá» cá»™t Nhãn**, KHÔNG phải mã thoát (thang mã thoát = W3b).
**Ai sinh bảng:** `lead-gap-auditor` (hàng *thiếu*) + `lead-stale-auditor` (hàng *lệch*) — cặp **Äang spawn vôiều-kiện ở CẢ HAI Äầu phiên**. **0 vai má»i** (Äúng lane C §E.1; vai má»i thuá»™c P4/W4b).
**Hàng mẫu đã sinh BẰNG MÁY** (§2.1): `bưá»c "lập sổ Äổi tên" | naming-standard.md:10 + :278 | (1)=0 (2)=0, control 1/6 | quên | "Sổ này land ở wave nào, hay gỡ hai con trỏ?"` — **1 hàng / 1 bưá»c ÄÆ°á»£c soi**.
---
## §4 — (3) TIỀN-KIá»M ĐẦU CỬA: 5/19 → **9/19**
### 4.1 — Máy mới `scripts/tien-kiem-cua.ps1`
- **Chỉ Äọc · LUÔN `exit 0` · INFORM.** Fail-soft y khuôn `nhip-no-probe`: lá»—i ⇒ `tien-kiem loi (khong chan)`.
- Thi hành Äúng chữ hub `phu-luc:194`: chọn **cá»­a Äóng gần nhất** bằng **dấu thời gian ghi TRONG tệp** — `.claude/WAL.md` dòng `updated:` (cá»­a `/pause`·`/snapshot`) + `.claude/governance/.session-counter.json` khoá `last_ticked_at`/`last_ticked_session` (cá»­a `/session-*`). **KHÔNG dùng `mtime`** (hook `wal:` chạm tệp má»—i lượt; `git checkout` viết lại `mtime` hàng loạt).
- **Pure-ASCII: 0 byte >127.** 🔴 Control-dương cho chính thưá»c ASCII: `ritual-labels.md` = **4.250** byte >127 ⇒ thưá»c **có bắt ÄÆ°á»£c**, sá» 0 kia không phải thưá»c hỏng. *(Bài W2: control-âm-sai = hỏng THƯỚC.)*
- Cờ in ra: `THIEU-TAP` (0/2 nguồn) · `NGUON-HONG:<tên>` · `LECH-PHIEN:<a>/<b>` · `ok`.
### 4.2 — Fault-inject **BA chiều: 5/5 PASS** (harness `scratchpad/fi-tienkiem.ps1`, cây tạm, KHÔNG chạm repo thật)
| Chiều | Ca | Kỳ vọng | Thực tế | |
|---|---|---|---|---|
| **B** | cấy ĐÚNG, 2 nguồn lành | IM = `ok`, 0 dương-giả | `nguon 2/2 \| ok` | ✅ |
| **A-1** | cấy HỎNG nguồn WAL | `NGUON-HONG:Wal` | `nguon 1/2 \| NGUON-HONG:Wal` | ✅ |
| **A-2** | cấy HỎNG nguồn counter | `NGUON-HONG:Counter` | `nguon 1/2 \| NGUON-HONG:Counter` | ✅ |
| **A-3** | 2 nguồn lệch phiên | `LECH-PHIEN` | `nguon 2/2 \| LECH-PHIEN:S177/S180` | ✅ |
| **A2** | **MẤT CẢ TẬP** (xoá cả 2) | cờ `THIEU-TAP` **RIÊNG**, CẤM in `ok` | `THIEU-TAP - 0/2 nguon moc doc duoc \| KHONG ket luan duoc gi` | ✅ |
`exit 0` ở **5/5** (ràng buộc cứng trong harness: `exit != 0` ⇒ FAIL). Harness in **control-harness** (`WAL=True/False counter=True/False`) mỗi ca ⇒ chứng cây tạm thật sự có/không có tệp như ý định.
🔴 **Lượt fault-inject ĐẦU chết vì HARNESS, không vì script:** viết harness inline qua `bash` ⇒ bash nuá»t `$`/backtick cá»§a chuá»—i PowerShell ⇒ tệp WAL "lành" **không bao giờ ÄÆ°á»£c ghi Äúng** ⇒ chiều B in `NGUON-HONG:Wal` **trông y hệt script hỏng**. Dá»±ng lại harness thành `.ps1` Äá»™c lập ⇒ 5/5. Đúng bài S139: *harness cần cùng ká»· luật như production*. Nếu tin lượt Äầu thì đã Äi sá»­a má»™t script **không hỏng**.
### 4.3 — Wall-clock ĐO ĐƯỢC (bắt buộc TRƯỚC khi cắm — luật `check-email.md:41`)
| | trung vị (n=5) | **ròng** (trừ khởi động) |
|---|---|---|
| CONTROL `powershell -NoProfile` khởi động không | 196 ms | — |
| **`tien-kiem-cua.ps1` (MỚI)** | 390 ms | **~194 ms** |
| `nhip-no-probe.ps1` (đã được chấp nhận ở `/pause`·`/tiep`) | 477 ms | ~281 ms |
⇒ Máy má»i **rẻ hÆ¡n cái đã ÄÆ°á»£c chấp nhận**. 🔸 Khai thẳng: phần lá»n 194 ms là Äọc + `ConvertFrom-Json` trên sổ Äếm ~45 KB; **không** phải "bằng không" theo nghÄ©a Äen. Đo trên máy này, ÄÄ©a nóng ⇒ dùng để **so tương Äá»i**, không phải SLA tuyệt Äá»i.
🔴 **KHÔNG cắm vào `/pause` · `/tiep`.** Hai cá»­a đó **đã có** probe; thêm bưá»c nữa = làm Äiểm dừng Äắt lên, trái floor `goi-chot §3` và trái bất-biến `check-email.md:41`. Đây là **quyết Äá»nh có Äo rồi má»i nói không**, không phải bỏ sót.
### 4.4 — Độ phủ sau lượt (mẫu số **19**)
| | n/19 | Cửa |
|---|---|---|
| Trước | **5** | `session-start` · `session-end` · `tiep` · `pause` · `snapshot` |
| Cắm mới | **+4** | `adap-apply` 🔴 *(ca LỚP-2: chính cửa áp gói này)* · `adap-report` · `adap-request` · `check-email` |
| **Sau** | **9** | còn thiếu **10**: `send-email` · `sleep-recovery-memory-l2` · `fable-real` · `fable-clone` · `ultra-on` · `ultra-off` · `user-mark-active` · `user-mark-active-high` · `user-mark-medium` · `user-mark-disable` |
**Control-dương cho phép đếm:** `grep -c tien-kiem-cua .claude/commands/ultra-on.md` = **0** ⇒ con số 9 không do mẫu khớp tràn lan.
🔸 **Vì sao dừng ở 9, không cắm ná»t 10:** 6 cá»­a (`fable-*`, `ultra-*`, `user-mark-*`) là **cá»­a má»™t-dòng, không có Äiểm dừng nào để soi** — cắm vào là **nghi thức trang trí**, và má»—i lời gọi thừa là má»™t cÆ¡ há»™i alarm-fatigue. `send-email` + `sleep-recovery-memory-l2` **Äáng cắm**, xin lead má»™t dòng Äồng ý vì chúng không nằm trong danh sách ưu tiên cá»§a đề bài.
---
## §5 — (4) GÓI-B PERSONA (chỉ ăn từ RESTART kế) — 4 tệp / 5 sửa
| # | Tệp | Sá»­a | Đo TRƯỚC | Đo SAU (trên ÄÄ©a) |
|---|---|---|---|---|
| 1 | `lead-stale-auditor.md` | +mục **Tập-Äo BẮT BUỘC gồm thư mục lượt chạy**: cách soi rẻ (so khá»i trạng-thái `run.md` ⟂ dòng `END`/bảng kết từng `sub-*.md` cùng run-folder) · **PIN Äích danh, cấm `glob-latest`** · ranh: run-folder phiên Đà ĐÓNG = record Äóng-băng, Äừng flag · không lấn `artifact-integrity.ps1` | `run-folder\|runs/` = **0** (control-dương cùng tệp: `FLAG`=4, `governance-detectors`=2) | **6** |
| 2 | `lead-stale-auditor.md` | heading **BỎ SỐ** + trỏ khoá `lead_self_audit.flag_classes`; **+1 dòng bảng** `view-claim-broader-than-sample` | liệt **5** class `view-*`; enum ÄÄ©a = **12 = 6+6** | liệt **6**; `[0-9]+ class` còn 2 hit **Äều hợp lệ** (*"gắn 1 class"* · *"1 class lặp N lần"*) |
| 3 | `ring2-audit.md:4` | **BỎ SỐ cả hai vế**, trỏ khoá. **KHÔNG sá»­a 5â†6** (luật B1) | `5 class` = **1** | `5 class` = **0** · `[0-9]+ class` = **0** (control `class` = 7 ⇒ thưá»c sá»ng) |
| 4 | `back-end-reviewer-style.md:4` | bỏ digit, trỏ `SolutionErp.Domain.csproj` → `TargetFramework` | `.NET 10` = **1** | **0** (control `.NET` = 2 ⇒ thưá»c sá»ng) |
| 5 | `database-reviewer-style.md:4` | bỏ digit, trỏ `SolutionErp.Infrastructure.csproj` → `PackageReference …EntityFrameworkCore*` | `EF Core 10` = **1** | **0** (control `EF Core` = 1 ⇒ thưá»c sá»ng) |
Khuôn de-number lấy **nguyên** từ `front-end-reviewer-style.md:4` (SỬA-6b @S179) — **không tự chế khuôn mới**.
🔴 **PHÁT HIỆN NGOÀI DANH SÁCH ĐỀ BÀI (sá»­a #2):** đề bài chỉ giao `ring2-audit.md:4`. Nhưng `lead-stale-auditor` — **chính vai PHẢI DÙNG enum** — cÅ©ng chỉ liệt **5/6** class `view-*`, thiếu Äúng `view-claim-broader-than-sample`. Đây là **ghost-enum tái phát**, Äúng lá»p `F-B HIGH` mà `tooling-auditor` ghi @S143: vai bá» luật *"CẤM tá»± chế class"* trói ⇒ lần tá»i gặp ca **suy-luận-vượt-mẫu** sẽ **escalate lại Äúng thứ vừa ÄÆ°á»£c duyệt**. Sá»­a `ring2` mà bỏ `lead-stale-auditor` = **vá cái GƯƠNG, để nguyên cái MÁY**.
🔴 **Tá»° BẮT CITATION-TRAP — vòng 1 THỦNG:** ghi chú vá cá»§a tôi trong `lead-stale-auditor.md` **trích nguyên văn** cụm sá» cÅ© ⇒ `grep "5 class"` **vẫn = 1** trên chính bản đã sá»­a Äúng. Vòng 2 diá»…n-giải-không-trích ⇒ **0**. Đúng bài W1-b: *lời-giải-thích nằm TRONG tập Äo*. Đã grep lại bằng **lệnh KHÁC** (`[0-9]+ class` thay chuá»—i cá» Äá»nh) để không tá»± tha.
### 5.1 — 🔴 PHÉP ĐO CHỈ XANH **SAU RESTART** (tôi KHÔNG restart ÄÆ°á»£c — bàn giao lead)
Sá»­a `.claude/agents/*.md` là **hot-reload ENV-DEP**: ÄÄ©a Äổi ngay, **hành vi vai chỉ Äổi sau restart CLI**. Đo trên ÄÄ©a (bảng trên) **KHÔNG chứng ÄÆ°á»£c vai đã ăn**. Bá»n phép sau, má»—i cái **chỉ xanh sau restart**:
| # | Phép đo | Xanh = |
|---|---|---|
| 1 | spawn `lead-stale-auditor`, hỏi *"liệt tập-Äo bắt buá»™c cá»§a mày"* | câu trả lời **có chứa** `runs/` hoặc `run-folder` |
| 2 | spawn `lead-stale-auditor`, hỏi *"nhánh `view-*` gồm class nào"* | liệt **đủ 6**, có `view-claim-broader-than-sample`, và **Äọc khoá** chứ không Äọc sá» trần |
| 3 | spawn `ring2-audit`, hỏi *"má»—i nhánh có bao nhiêu class"* | trả lời **trỏ khoá `lead_self_audit.flag_classes`**, KHÔNG Äọc sá» trần |
| 4 | spawn `back-end-reviewer-style` + `database-reviewer-style`, hỏi *"version .NET / EF Core"* | trả lời **trỏ `.csproj`**, KHÔNG Äọc sá» từ persona |
🔴 Không chạy 4 phép này thì *"chưa ăn"* trông **y hệt** *"hỏng"*, và cả hai trông **y hệt** *"đã xong"*.
---
## §6 — HỆ QUẢ ĐO ĐƯỢC LÊN MÁY ĐANG SỐNG + CHƯA ĐO / CẦN LEAD
### 6.1 — Tripwire `-Expect` cá»§a `naming-scan.ps1` ĐÃ KÊU vì tôi (Äúng thiết kế, KHÔNG phải hỏng)
Chạy `naming-scan.ps1` read-only sau khi land:
```
mau so: 56 muc (tep + thu muc) [!] lech ky vong 55 - chuan hoac kho da doi, doc lai naming-standard.md
OK 54/56 | LECH 1/56 | MIEN-theo-luat 1/56
```
- Nguyên nhân: `scripts/tien-kiem-cua.ps1` là **mục thứ 56** cá»§a nhóm `scripts/`; lead vừa vá `-Expect` **54â†55**, giờ thành **55â†56**.
- 🔴 **`-Expect` kêu VÀNG, KHÔNG Äá»™i thành `LECH`** — `LECH` giữ nguyên 1/56 (`master-import-data.generated.md`), và **cả 2 tệp má»i cá»§a tôi Äều KHÔNG lệch chuẩn**. Đúng như lead mô tả: `-Expect` là **tripwire có chá»§ Äích**, cho `THIEU-TAP` má»™t **mẫu sá»** — **không** phải lá»p lá»—i drift. Tôi **không lặp nhãn "LỚP-5"** mà W2 gán nhầm.
- **Tôi KHÔNG sửa `naming-scan.ps1`** (nằm trong danh sách cấm). **Xin lead bump `-Expect` 55→56.**
- Toàn kho: `LECH 8/236` — **+2 tệp mới của tôi không thêm dòng lệch nào**. Exit 0.
### 6.2 — CHƯA ĐO / CẦN LEAD
1. 🔴 **4 phép đo sau-restart (§5.1)** — tôi không restart được. **Không chạy = gói-B chưa nghiệm thu**, dù đĩa đã đúng.
2. 🔴 **`-Expect` 55→56** trong `naming-scan.ps1` — tệp cấm, lead vá.
3. 🔴 **Hàng vòng-hỏi-ngược Äầu tiên chờ Äá»nh Äoạt:** `docs/governance/rename-ledger.md` **không tồn tại** trong khi `naming-standard.md:10` + `:278` trỏ tá»i nó, và vật chứng W1-b **0 dòng khai** ⇒ nhãn **`quên`**. `naming-standard.md` là **tệp cấm** ⇒ tôi không Äụng. Ba lá»±a chọn: `chạy-bổ-sung` (lập sổ) / `khai-suy-giảm` / `khai-không-thể-nữa` (gỡ 2 con trỏ).
4. 🟡 **`lead-gap-auditor.md:42` neo sá» trần cho nhánh `gap-*`** — hôm nay **ĐÚNG** (6 gap-*), nên **KHÔNG sá»­a** (bài S143: *biết chá»— KHÔNG sá»­a*). Nhưng nó là **neo cùng loại** vá»i 2 cái vừa gỡ ⇒ ứng viên de-number Äợt sau. Ngoài scope W3.
5. 🟡 **Cắm ná»t `send-email` + `sleep-recovery-memory-l2`** (§4.4) — cần lead gật, không có trong danh sách ưu tiên đề bài.
6. â›” **KHÔNG làm, Äúng phạm vi:** thang mã thoát 4 trạng thái (`C3-04` + khoản (v)) = **W3b**, chờ P1. Luật tá»±-trá» 3 bậc (`C3-07`/khoản (vi)) = chờ **P5** owner gật ná»™i dung. Trần chi phí `C3-08` chỉ **khai `KHÔNG ĐO ĐƯỢC`** + nghÄ©a vụ khai, **không phải thuá»c**.
### 6.3 — Bất-biến giữ được
- **Mã thoát: 0 lái.** Máy má»i `exit 0` ở 5/5 fault-inject; 4 tệp lệnh sá»­a Äều ghi rõ *"KHÔNG chặn · máy luôn exit 0 · cổng chặn = W3b"*.
- **14 Äoạn máy (11 vỡ-câm): 0 vỡ.** Chúng Äọc **TÊN** (`sub-*` · `session-<N>` · tên vai · `agent-memory/`). Lượt này **0 Äổi tên, 0 xoá tên**; 2 tệp má»i Äều là tên MỚI đúng chuẩn (`naming-scan` xác nhận 0 dòng lệch mới). Bất-biến ngầm `agents/<role>.md`.BaseName ≡ `agent-memory/<role>/` **không bị chạm** — tôi chỉ sửa RUỘT 4 persona, **0 rename**.
- **Tệp cấm: 0 chạm.** `STATUS.md` · `HANDOFF.md` · `CLAUDE.md` · `broadcasts/_index.md` · `naming-standard.md` · `naming-scan.ps1` · `artifact-integrity.ps1` · `adap-upgrade-pack-*.md`.
---
**END sub-w3-nghi-thuc — 4 nhãn KÝ 4/4 nhưng CƯỠNG CHẾ 1 đủ / 2 ná»­a / 1 CHƯA CÓ MÁY · vòng hỏi ngược 5 cá»™t CÓ (khuôn + luật Äóng 3 Äiều kiện + 1 hàng sinh bằng máy) · tiền-kiểm 5/19 → 9/19 (wall-clock ròng 194 ms < 281 ms đã-chấp-nhận) · persona-B 4 tệp/5 sá»­a, 4 phép Äo sau-restart BÀN GIAO · fault-inject 5/5 ba chiều · 2 chá»— bác đề bài/lane (khung 4-nhãn "chỉ nhãn cuá»i là lá»—i" ⟂ chữ hub · lane F Äếm `check-email` là cá»­a gọi probe trong khi nó chỉ NHẮC TÊN) · 1 sá» cá»§a lane C sá»­a (4/19 → 5/19, `snapshot` Äóng từ CHƯA-ĐO sang CÓ).**