# harness-refine — RETURN S144 (2026-07-22) — con ĐỀ-XUẤT, FIRST-RUN THẬT

> Lead scribe nguyên văn @W2. INPUT PIN hợp lệ (`harness-eval-return.md`, 10.907 B, 11 tín-hiệu) ⇒ **fail-closed KHÔNG nổ**.
> Phụ trợ đã đọc: `reinject-ledger.md` (**TRỐNG** — chỉ placeholder S95) · diary vai (seed S141).

## PHẦN 0 — Đã VERIFY gì trước khi đề xuất

**KHÔNG đo lại: 0 script chạy.** Mọi số hoặc là số nguyên văn con ĐO, hoặc số-học đơn giản trên số đó.
**Có làm — targeting** (`ls`/`head`/`stat`/đọc config), vì action trỏ vào file không tồn tại hoặc **đã nén rồi** là action vô giá trị:

| Kiểm | Kết quả |
|---|---|
| `.archive-strikes.json` | **KHÔNG TỒN TẠI** — xác nhận S5 bằng existence-check |
| `measure-agent-memory.ps1:20` | `l2_index` = **duy nhất** file tên `_INDEX.md` ⇒ S1 quy về đúng 1 file |
| 9 vai có archive | 5 có `_INDEX.md` / 4 không — khớp S7 |
| `mfe-eval.ps1:270` | chỉ in `hit/den = pct`, **KHÔNG in TÊN mục trượt** ⇒ lớp ① mất địa chỉ |
| `distill-shard-probe.ps1:56` | `$fire = ($n -ge $minShards)` ⇒ muốn IM phải xuống ≤6, tức cần **9** gist |
| Liệt kê 15 shard | cicd 4 · inv-cb 4 · impl-be 4 · reviewer 2 · test-spec 1 = **15** ⇒ nền số con ĐO đứng vững |
| Frontmatter 4 file `2026-05.gist.md` | 🔴 **LẬT NGƯỢC cách đọc S4** — xem E4 |

## PHẦN 1 — BẢNG ACTION (propose-only)

| # | action | lớp | đối-tượng | trigger | chốt-dừng | owner-gate |
|---|---|---|---|---|---|---|
| **A1** | Nén tại chỗ `_INDEX.md` cicd xuống dưới cap, **giữ nguyên số pointer** | ③ | `cicd-monitor/archive/_INDEX.md` | **S1** 22108/20480 = 107,9%, dư 1628 | lần **1** (ledger trống). Lượt kế vẫn ≥20480 ⇒ **KHÔNG lần 2**, leo thang lead+owner | **Hỗn hợp** — sửa nội dung = AI/lead; **cap 20480 = số owner, CẤM AI nâng**. Cần thêm low-water cho `l2_index` — chỉ NÊU |
| **A2** | Curate L1→L2 inv-cb: cắt **≥4864 B** (xuống dưới low-water 21760, **không** dừng ở "vừa đủ dưới 25600") | ③ | `investigator-codebase/MEMORY.md` → `archive/2026-07.md` + `_INDEX.md` | **S2** 104,0%, delta S141 = 0 · **S6** after-est 24830 > low-water 21760, đệm ~770 B. Tiền lệ: reviewer −6240 | lần **1**. Cắt hết low-value mà vẫn >21760 ⇒ **value-floor thật** ⇒ leo thang owner, **không cắt tiếp** | **Hỗn hợp** — thao tác AI/lead (moved-not-cut + md5). **6 entry value-protected + keep-floor 5 = CẤM đụng.** cap/low-water = số owner |
| **A3** | 🔴 **Làm TƯƠI gist đã cũ** (KHÔNG tạo gist mới) | ④ | `reviewer/archive/2026-07.gist.md` (chính) · `investigator-codebase/2026-07.gist.md` (sau A2) · *(yếu)* `implementer-frontend/2026-H1.gist.md` | **S2** reviewer −6240 = đã append verbatim SAU khi gist sinh ⇒ **gist thiếu phần mới**. Đây là **nợ mà S4 KHÔNG nhìn thấy** | lần **1**/file | AI/lead. Ràng buộc: coverage-diff gate + tăng `distill-gen` 1→2 + tôn trọng double-distill guard |
| **A4** | Thăng hạng bài học *"bộ lọc chuỗi nuốt nhầm đối tượng — kiểm tập-đo TRƯỚC khi tin số"* | ② | `harness-eval/MEMORY.md` (chính) · *(tuỳ chọn)* `tooling-auditor/MEMORY.md` | Lặp **≥2** sẵn: `memory-budget.json:14` liệt **4 ca cùng phiên**; **E4 là ca thứ 5**. Chỗ đặt còn trống: L1 harness-eval 1547/25600 | lần **1**. Lượt sau không hiện diện ⇒ chuyển ① reinject theo CG-1 | **Lead quyết** (chạm diary vai khác). Không chạm số/luật owner |

**Lớp ① nạp-lại = 0 action** — không phải thiếu tín hiệu mà **mất địa chỉ**: S8 nói thiếu đúng 6 mục nhưng `mfe-eval.ps1:270` không in tên; ledger CG-1 bắt buộc `item-id`. Đề xuất reinject không có id = **bịa**.

**Thứ tự:** A2 → A3 (A2 làm gist inv-cb cũ đi). A1, A4 độc lập.

## PHẦN 2 — Bẫy Goodhart gắn từng action

- **A1 — CẤM "tách file" để hạ số.** `measure-agent-memory.ps1:20` chỉ cộng file tên đúng `_INDEX.md`. Tách thành `_INDEX-2026-05.md` làm `l2_index` tụt ngay mà **0 byte thông tin mất** — bytes chỉ chuyển sang `l2_verbatim` **vốn không cap**. Nghiệm thu đúng = **A7 vẫn resolve ≥99 pointer, 0 failed**.
- **A2 — CẤM cắt entry value-protected để đạt chỉ tiêu byte.** Chỉ còn cách đó ⇒ kết luận đúng là "value-floor", leo thang owner.
- **A3 — CẤM viết gist rỗng cho đủ số.** Hạ `pending` 15→≤6 **rất dễ làm giả** (9 file `.gist.md` rỗng là probe im ngay). Nghiệm thu lớp ④ phải là **coverage-diff gate, KHÔNG BAO GIỜ là con số pending**.
- **A4 —** bài học thăng hạng phải kèm **ca cụ thể**, không thì thành khẩu hiệu mà MFE vẫn tính là "có mặt".

## PHẦN 3 — NGOÀI 4 LỚP → NÊU + LEO THANG

**E1 — lớp ① bị chặn ở tầng công cụ.** `mfe-eval.ps1:270` không in mục trượt. `reinject-ledger.md:50` **tự khai** đúng khuyết tật (*"per-item-L1-presence detection is still PARTIAL"*). ⇒ 6 mục thiếu **không thể** vào ledger. Đề nghị con ĐO lượt sau in kèm danh sách mục trượt per-role.

**E2 — S5 ghost-wire + mâu thuẫn thiết kế nội tại.** `memory-budget.json:45` khai *"persists strikes in `.archive-strikes.json`"* — file **không tồn tại**. Nhưng cùng file, `value_protect._note` chốt *"Archive-gate stays DRY-RUN"*. Hai câu **kéo ngược nhau**: strike chỉ tiến khi ghi state, mà ghi state chỉ xảy ra khi rời DRY-RUN. Owner phán 1 trong 2: **tách quyền** (persist-strike ≠ apply-drain — ghi bộ đếm không phải xoá dữ liệu) hoặc **gỡ lời khai** để cơ chế không tự nhận có răng.

**E3 — S1 không cửa gác, cũng không low-water.** Budget tự ghi index này *"grows with each run"* ⇒ A1 cắt đúng 1628 B thì tái vượt sau ~1 phiên. Cần low-water cho `l2_index` — **số của owner**.

### 🔴 E4 — PHÁT HIỆN NẶNG NHẤT: 15 shard "pending" đều ĐÃ CÓ bản nén, dưới TÊN GỘP

| file gist | frontmatter khai phủ | số file |
|---|---|---|
| `cicd-monitor/2026-05.gist.md` | `source-verbatim: 2026-05-q2 (1) · q3 (3) · q4 (7) · 2026-05-runs (20 run-records)` | **4/4** |
| `investigator-codebase/2026-05.gist.md` | *"q1+q2+q3+q4 distilled"*, `distill-gen: 1 (already-distilled — do NOT re-compress)` | **4/4** |
| `implementer-backend/2026-05.gist.md` | *"Covers verbatim files: q1 (S21-24), q2 (S25-29), q3, q4"*, `do NOT re-compress` | **4/4** |
| `reviewer/2026-05.gist.md` | *"Verbatim: q1 + q2"*, *"KHÔNG nén lại bản này"* | **2/2** |
| `test-specialist/baseline-history.md` | không phải `<period>.md`; `memory-budget.json:162` đã ghi *"reference-file [skip sleep: đã distilled-form]"* | **1/1** |

**4+4+4+2+1 = 15/15.**

🔴 **Nguyên nhân KHÔNG phải bug code** — probe chạy đúng spec của nó. Sai ở **GIẢ ĐỊNH của spec**: `_dinh_nghia_shard` giả định gist ghép **1:1 theo tên**, trong khi corpus thực tế dùng **gist gộp nhiều-về-một**. ⇒ `pending=15` đang đo **TÊN FILE**, không đo **ĐỘ PHỦ DISTILL**.

**Ba hệ quả đưa tới owner:**
1. Đề xuất máy móc "tạo 9 gist twin" sẽ **vi phạm `do NOT re-compress` ghi thẳng trong 3 file gist** + nhân bản nội dung đã có ⇒ **BÁC** (A3 đổi hướng).
2. `min_pending_shards = 7` là số **owner chốt hôm nay SAU KHI NHÌN con số 15**. Nếu mẫu-số đó phần lớn dương-giả thì **tiền đề chọn số đã lệch** — **chỉ owner được sửa số của mình**.
3. Quy trình: `distill-shard-probe.ps1:63-65` **CÓ in 8 đường dẫn pending** khi kêu; phần đó **không có trong eval-return**, chỉ còn dòng verdict. Nếu khối đường dẫn được chép nguyên, lớp ④ đã chẩn đúng **ngay từ nấc 1**.

### E5 — điểm mù THỨ HAI của probe: đếm twin TỒN TẠI, không đếm twin TƯƠI

- `reviewer/archive/2026-07.md` sửa **hôm nay** trong khi `2026-07.gist.md` dừng **07-18** — **được số con ĐO chứng thực** (S2: reviewer curate L1 −6240 vào L2). Độ tin **CAO**.
- `implementer-frontend/2026-H1.md` (07-14) mới hơn `.gist.md` (07-02) — **chỉ mtime**, độ tin **THẤP**, cần soi nội dung.

🔴 **Nghịch lý phải nói thẳng:** *tín hiệu LÀNH MẠNH S2 (reviewer chịu curate) chính là thứ sinh ra nợ gist mà probe không thấy.* **Càng làm đúng ở lớp ③ thì nợ ẩn ở lớp ④ càng tăng, mà đồng hồ vẫn im.**

**E6 — S3 ngoài tầm với, khai thẳng.** headroom đứng trên sàn file của **lead hot-feed**, KHÔNG phải agent-memory corpus ⇒ **không action nào của A1–A4 làm S3 dịch 1 byte**. `crystallized._target_note` cấm AI auto-tune. **Ai nói action memory-corpus "giải quyết" S3 là nói sai.**

**E7 — chốt-dừng của chính con ĐỀ-XUẤT hiện là NGHI THỨC, chưa phải cơ chế.** Ghi "lần 1" cho A1–A4 nhưng **không có sổ nào** để lượt sau biết đó là lần 1; ledger schema chỉ nhận floor-rot; và vai bị **cấm tự tìm run mới nhất**. Đề nghị rẻ: lượt sau lead **PIN thêm input thứ 2 = bản refine-return này**. Không có nó thì luật "một lần rồi leo thang" là **chữ, không phải răng**.

**E8 — S9/S11 không có đường lùi.** MFE không lưu coverage lịch sử ⇒ mọi câu "tốt lên/xấu đi" **không kiểm chứng được**. Đã không đề xuất gì dựa trên xu hướng.

## PHẦN 4 — ĐÃ CÂN NHẮC RỒI BÁC (12 mục)

| # | đã soi | quyết | lý do |
|---|---|---|---|
| B1 | Tạo 9 `.gist.md` để probe im (đọc thẳng S4) | **BÁC** | E4: cả 15 đã có bản nén; 3 gist ghi `do NOT re-compress`. Nén-2-lần + nhân bản, hạ số mà **không** cải thiện trí nhớ = rời tập-đo |
| B2 | Tạo `_INDEX.md` cho 4 vai thiếu (S7) | **BÁC, hạ P2** | 4 vai đều có `source-verbatim:` + `pointer-style: substring back-resolve` ⇒ **gist đang làm đúng việc bản đồ**; mỗi vai chỉ 2 file verbatim. Tạo index lúc này chủ yếu để **A7 đếm được** = sửa phép đo chứ không sửa trí nhớ, **cùng loại lỗi B1 đổi chiều**. Khuyết tật thật là **câu chữ "A7 PASS 251/251" nghe như toàn phần** |
| B3 | ① reinject 6 mục thiếu | **BÁC** | Không có item-id (E1); đề xuất "mục nào đó" = bịa |
| B4 | Tự dò tay 6 mục nào thiếu | **BÁC** | = chạy lại phép đo con ĐO bằng tay ⇒ lấn nấc 1 + tạo 2 nguồn số cạnh tranh |
| B5 | Đề nghị owner hạ `target` 210.000 cho khớp headroom | **BÁC** | Số owner; `_target_note` cấm auto-tune; hạ số cho vừa phép đo = **bịt đèn báo** |
| B6 | Nâng `l2_index.cap` >22108 cho cicd hết đỏ | **BÁC** | Cùng lớp B5: đổi thước khi vật vượt thước. A1 đi hướng ngược (giảm vật) |
| B7 | Chạy `-Apply` để strike ghi được | **BÁC** | Read-only + chạm dữ liệu thật; budget chốt gate **cố ý** DRY-RUN ⇒ đẩy E2 |
| B8 | Nhịp curate theo "tốc độ phình L1" | **BÁC** | S11 khai không có chuỗi thời gian ⇒ đề xuất theo xu hướng = đề xuất trên dữ liệu **không tồn tại** |
| B9 | Ghi nhật ký first-run cho diary của chính mình | **BÁC** | Lặp=1 chưa chạm ngưỡng ②; và **tự phục vụ** |
| B10 | Thăng hạng "công thức curate L1→L2" vào L1 inv-cb | **BÁC** | Ngưỡng ② đạt nhưng **chỗ đặt sai**: nhét vào đúng file đang vượt cap = tự làm nặng thứ A2 đang gỡ |
| B11 | `run-chua-gom 2` | **BÁC — nhường** | H2 `harvest-curator` |
| B12 | Mọi thứ thuộc hot-feed/carry/work-state LEAD | **BÁC — nhường** | Trục `lead-omission-auditor`; cố ý không đề xuất gì cho S3 ngoài nêu |

## PHẦN 5 — Phản hồi RANH SẮC (lead hỏi)

Ranh `refine ⟂ lead-omission` **theo đối tượng thì sạch, chạy được**. Ba chỗ nên chỉnh khi owner ratify:
1. 🔴 **Có đường nối mà bảng 2 cột không thấy:** `crystallized.source_order` = gist → dòng archive có value-marker → RAG ⇒ **corpus của refine là NGUỒN NẠP cho hot-feed của lead**. S3 rơi đúng chỗ nối. Đề nghị ghi thành chữ: *refine được đề xuất thay đổi **nguồn** (corpus); KHÔNG được đề xuất thay đổi **số/nội dung lead nạp**.*
2. **5/11 tín hiệu là khuyết tật INSTRUMENT** (S1·S5·S6·S9·S11) mà 4 lớp của refine đều là corpus-mutation ⇒ tất cả rơi vào sọt "escalate", **dễ thành nơi việc đi vào rồi nằm im**. Đề nghị định tuyến lớp instrument sang `tooling-auditor`.
3. **Chốt-dừng cần vật mang, không chỉ cần luật** (E7).

## PHẦN 6 — KHAI BÁO TOÀN VẸN

1. **Dư lượng ghi: KHÔNG.** 0 script chạy, 0 file tạo/sửa/xoá. Chỉ `Read` + `Bash` với `ls`/`head`/`stat`/`grep`/`sed`.
2. **"read-only" = thiếu tool Write/Edit, KHÔNG phải sandbox** — Bash vẫn là kênh ghi mở.
3. **Đề xuất ≠ đã làm.** A1–A4 propose-only, chờ lead VERIFY (single-writer B3).
4. **Ranh trục giữ:** 0 phép đo mới · 0 chấm điểm · 0 đụng lead-surface.
5. **Chỗ vượt ra ngoài "chỉ đọc số":** mở frontmatter 6 file gist + mtime 7 cặp — vì lớp ④ **bắt buộc** phải biết đối tượng đã nén hay chưa. Kết quả E4/E5 **không mâu thuẫn** số nào của con ĐO; nó chỉ nói con số 15 đang đếm **tên file** chứ không đếm **độ phủ**.
6. **Độ tin không đồng đều:** E4 = frontmatter tự khai (**CAO**) · E5-reviewer = có số con ĐO chứng thực (**CAO**) · E5-impl-fe = chỉ mtime (**THẤP**).
7. **Ledger CG-1 trống** ⇒ A1–A4 đều **attempt = 1** hợp lệ, 0 ca phải leo thang lượt này.
