# retro-harvest-synthesis — S122 (2026-07-15)

**run:** `2026-07-15-S122-retro-harvest-7-orphan` · **wf:** `wf_5ce007c4-980` · **lead:** Opus 4.8
**fan-out:** 7 lane `investigator-codebase`, read-only · **7/7 done · 0 error · 1 empty** · 526s · 836K tok · 159 tool-use

---

## 🔴 KẾT QUẢ CHÍNH — tiền-đề của chính run này BỊ LẬT

Run được phóng để **retro-harvest 7 orphan** với tiền-đề: *đây là 7 việc dở, synthesis chưa ai viết*.

**Đo ra: SAI. 0/7 là việc mất. 7/7 đều ĐÃ XONG và đều CÓ bản ghi kết-quả trong `run.md`.**

| Folder | Kết-quả có ở đâu | LANDED @ |
|---|---|---|
| S112-pe-signoff-close-review | `run.md:19` `## synthesis` | `a829d0d` (2 file, +513/−148) |
| S112-pe-signoff-save-advance | `run.md:21` `## synthesis` | `a829d0d` (qua run close-review kế) |
| S112-supplier-excel-import | `run.md:25` `## synthesis` | `e100ef0` + **Mig 63** (20 file, +8268/−14) |
| S112-supplier-import-close-review | `run.md:8` `## synthesis` | Run #496 (neo gián-tiếp — **lane rỗng**) |
| S113-supplier-import-v2-invest | `run.md:34` `## Synthesis` + `## OUTCOME` | `5fa11b5` + **Mig 64** (28 file, +7659/−105) |
| S114-multi-ncc-per-hangmuc | `run.md:28` `## Synthesis` | `d436af2` + **Mig 65** (18 file, +7272/−425) |
| pe-negative-quote (**S116**) | `run.md:8-19` `## Stages` + `## wf run-id` | `88368fd` (7 file, spec-match 7/7) |

## Gốc: phép đo hỏi "đã harvest chưa" nhưng đo "có file tên X không"

Orphan-authority (`workflows/README.md:20`) định-nghĩa orphan = **vắng mặt của một filename pattern**. Nhưng *"đã harvest chưa"* là câu hỏi về **NỘI DUNG**. Khi hai thứ lệch nhau, detector đo được **cái dễ đo**, không phải **cái cần đo** — và im lặng biến **7 việc đã xong thành 7 việc "dở"**.

### Thực-địa có ÍT NHẤT 4 dạng — doc chỉ thừa-nhận 2

| Dạng | Ở đâu | Doc thừa-nhận? |
|---|---|---|
| 1. `<stage>-synthesis.md` phẳng | h10-refine, hiện-hành (17 file) | ✅ `README.md:17` |
| 2. `harvest/<stage>-synthesis.md` | C8, 5 run S71 | ✅ `README.md:19` |
| 3. **`## synthesis` trong thân `run.md`** | **6 folder S112–S114** | ❌ **không ở đâu cả** |
| 4. **Kết-quả rải trong `## Stages` + `## wf run-id`** | **pe-negative-quote (S116)** | ❌ **không ở đâu cả** |

🔴 **KHÔNG phải chuyện "convention cũ của một thời-kỳ".** Cùng ngày **2026-07-12**: `h22-wal-adopt` ghi ra **file phẳng** (dạng-1) còn `S112-pe-signoff-close-review` ghi vào **thân run.md** (dạng-3). Cùng lead, cùng ngày, hai kiểu ⇒ **thói-quen không nhất-quán**, không phải di-sản migration.

### Bằng-chứng bồi: H2-gate ĐÃ soi và coi là đóng

Commit `8fa2fcc` có message khoe *"close-review run.md synthesis [H2 gate]"* — nhưng `git show --stat` **KHÔNG chạm folder đó**. ⇒ H2 harvest-curator **đã nhìn qua, đã coi là đóng**; chỉ là tên file không khớp glob nên folder-scan vẫn kêu.

## Đo trước / sau

```
TRƯỚC:  total 25 run.md · naive-orphan 13 · dual-accept-orphan 8 · C8 cứu 5
SAU:    total 26 run.md · naive-orphan  7 · dual-accept-orphan 2 · C8 cứu 5
        7 tồn-đọng → 0. Còn lại 2 = S119 (wave đang chạy) + S122 (run này).
```
🟢 **Đo TRƯỚC tái-hiện CHÍNH XÁC dự-báo FIX#4** (`naive 13 / dual 8 / 5 folder h10+h910`) — nhưng **cả FIX#4 lẫn lead đều đang đo TÊN FILE**, và lead đã lấy sự trùng-khớp đó làm chỗ dựa. Con-số đúng, hướng đo sai.

## Quyết-định owner @S122

| # | Chốt |
|---|---|
| 1 | **Đóng thật 7 bằng retro-harvest** (không scope, không allowlist) — sinh ra run này |
| 2 | **Làm cả hai**: chuẩn-hoá 7 file **+** mở detector tri-accept |

**Khử mâu-thuẫn của (2)** (lead đã nêu trước khi anh chọn: *"vừa dọn dạng-3 vừa hợp-pháp-hoá nó = tín-hiệu lẫn-lộn"*) — giải bằng đúng khuôn **C8 đã dùng sẵn**:
> **Tri-accept = lưới PHÁT-HIỆN cho bản cũ, KHÔNG phải giấy phép VIẾT bản mới.**
C8 vốn vận-hành y hệt: *"5 run cũ S71 giữ `sub-md/`+`harvest/` (**đừng rewrite history**); close-gate chấp nhận CẢ HAI dạng"* — tha cho di-sản, **không** cho phép viết mới kiểu cũ. ⇒ tín-hiệu cho phiên sau vẫn **đơn-nghĩa**.

## Cách chuẩn-hoá (additive — 0 rewrite history)

- **COPY**, không cắt: thân synthesis giữ nguyên trong `run.md`; file mới ghi rõ **"bản gốc trong run.md mới là CHUẨN"** ⇒ ai cũng diff lại được.
- Tên file theo convention **đo được** từ 17 file đang có: `<stage>-synthesis.md` (`implement` ×5 · `review` ×4 · `audit` ×2 · `invest`/`ensemble`/`curate`/`finalize`/`doublecheck`/`checklist-verify`).
- Mỗi file có mục **"Verify độc-lập @S122"** (lead re-check, KHÔNG tin thẳng return sub) + mục **"Gap KHÔNG chứng minh được"**.

## Chất lượng fan-out

**6/6 lane có return đều neo bằng SHA thật, 0 garble.** Đáng ghi:
- Lane **S114** **tự đo ordinal migration** (sorted-listing → 65/66) thay vì tin nhãn `CLAUDE.md` — đúng yêu-cầu "KHÔNG trích doc dẫn-xuất rồi bảo xong".
- Lane **pe-negative-quote** phân-biệt được sha `3e16dba5` (session-log @S116) vs `617b0aa0` (đĩa nay): **khác vì file tiến-hoá sau S116, 2 app vẫn identical với NHAU ⇒ invariant nguyên, KHÔNG mâu-thuẫn**. Checker so-literal-hash sẽ kêu oan đúng chỗ này.
- Lane **supplier-excel-import** truy được **cả 5 owner-decision vào TRONG CODE** (`:376` code cite thẳng *"decision 5"*).

🟡 **1 lane RỖNG:** `parallel[3]` (`S112-supplier-import-close-review`) — agent xong nhưng **không gọi StructuredOutput** ⇒ schema fail, `agents_empty_result=1`.
🟢 **Nhưng dữ-liệu KHÔNG mất** — synthesis nằm trên đĩa (`run.md:8`), lead lấy lại nguyên vẹn + neo chéo từ 2 lane khác. **Đúng nguyên-lý `/tiep` §2: per-turn ≠ per-task — return mất theo phiên, file trên đĩa còn.** File synthesis của folder đó **tự khai nấc bằng-chứng THẤP HƠN** 6 cái kia.

## Containment (B6)

`git status --porcelain` **RỖNG** sau P2 · 7 folder đích **0 thay đổi** · **0** file `*-synthesis.md` do sub ghi. Sub tôn-thủ read-only tuyệt-đối; **synthesis 100% do lead ghi** (single-writer).

## Tật phụ nhặt được (ghi, KHÔNG sửa — no rewrite history)

1. **Sub-MD naming swap ×3** (`pe-signoff-save-advance` · `supplier-excel-import` · `supplier-import-close-review`): journal completion-order ≠ lane-order ⇒ tên file **không khớp** nội-dung. Cả 3 synthesis **tự khai** và dặn *"harvest reads content"*. ⇒ **lỗi hệ-thống của journal-order**, không phải sơ-suất lẻ.
2. **`pe-negative-quote/run.md:20-23` còn 4 dòng `[ ]` THỪA** mâu-thuẫn thẳng với `:19` *"✅ PIPELINE COMPLETE"* ngay trên — tàn-dư template. Checker đếm `[ ]` sẽ kết-luận run **dở 4 bước** trong khi nó **xong hết**. **Cùng họ với chính bug đang vá: đo dấu-hiệu bề-mặt thay vì đo nội-dung.**
3. **3 folder (S113 · S114 · pe-negative-quote) có 0 sub-MD** dù chạy nhiều lane (S114: **498K token, 4 lane, 0 error** → chỉ còn 8 dòng gom). ⇒ **run-trace thủng**; cả 3 đều **có TRƯỚC** sàn H22 S111 ép RUN-TRACE ≥3 task ⇒ **sàn đó ra đời là đúng**, và đây là vết-thương nó sinh ra để bịt.
4. **Lead tự nhận:** memoryPack bơm cho sub ghi *"**S113**/pe-negative-quote"* — **SAI**, đây là **S116** (`run.md:1`). Sub **không bị dắt theo** (tự truy git ra đúng ngày). Lớp lỗi = *lead đưa tiền-đề sai cho sub*; lần này sub đỡ được, **lần sau chưa chắc**.

## → adap-report (hub)

**"Orphan" trong thiết-kế H22/H18-B đo TÊN FILE, không đo NỘI DUNG.** SE đo được: 8 dương-giả trên 25 run (**32%**), trong đó folder **được ghi chép đầy-đủ nhất** (`pe-negative-quote`: có cicd PASS + bundle-hash + smoke 200 + 6 stage `[x]`) **vẫn** bị xếp orphan. Đây **không phải** lỗi tailor của SE — là **giới-hạn của chính định-nghĩa orphan**. Kèm: thực-địa **4 dạng** ghi synthesis trong khi doc thừa-nhận **2**.

---
*C4 per-turn primary — synthesis viết NGAY sau fan-out turn, không để sang phiên. Lead single-writer (B6).*
