# sub-apply-L3 — wave Opus-5-MAX apply: 4 adap-report nhóm-B + C-c + C-e

> Lane: L3 · Agent: implementer (Opus 5, effort MAX) · Ngày: 2026-07-25 · Run: `2026-07-25-S149-adap-backlog`
> Đề-bài (spec `spec-adap-backlog-25-07-2026.md:10`): 4 report-B (spawn-label · depth-axis · goi-chot · dong-du-vong) — **bảng per-khoản theo C14, CẤM số-tổng**; evidence commit/run THẬT (tự `git log` lấy sha, CẤM bịa); phần dở = `verified-pending`/DEFER 🔒. + **C-c** label-falsifier + **C-e** masthead codify (PROPOSE-only, KHÔNG sửa canonical).
> **Khung rỗng ghi đĩa TRƯỚC khi làm** (chống #53 return-garble: ghi-đĩa-TRONG-lúc-làm).

## ⓪ Ghi-chú tên file (khai lệch, không tự ý im)

Prompt lane có **2 tên khác nhau** cho cùng một sub-MD: chỉ-thị đích-danh của lead ghi `sub-apply-L3.md`; khối boilerplate RUN-TRACE ghi `sub-task-2.md`. Lane chọn **`sub-apply-L3.md`** (chỉ-thị đích-danh + đúng khuôn đặt tên `sub-apply-L*` mà L1/L4 đang dùng — `git status` cho thấy `sub-apply-L1.md`, `sub-apply-L4.md` cùng có mặt). Cả 2 đều nằm trong run-folder ⇒ **không vi phạm isolation**. Trả `subMdPath` = tên đã chọn.

## ① Ground-truth đo hôm nay (2026-07-25, trước khi viết report)

| # | Phép đo | Lệnh / công cụ | Kết quả | Ý nghĩa |
|---|---|---|---|---|
| G1 | Khuôn label đã codify chưa | đọc `.claude/commands/fable-clone.md:62-71` | **CÓ** — tiêu-đề `🔴 KHUÔN LABEL 4 THÀNH-PHẦN (C3 — spawn-label:22-27, BINDING)`; khuôn `{nhóm\|Vòng-N\|Core\|Gate\|WF} {vai} {pha/wave} s{N}` `:67` | khoản ①③ spawn-label có vật-chứng |
| G2 | Label trong run 07-25 | `grep -ic "label" runs/2026-07-25-S149-adap-backlog/run.md` | **0** | 🔴 acceptance C3 "neo artifact" (`spec-…-v2.md:110`) **TRƯỢT** trên chính run này |
| G3 | Trần WIDTH | `memory-budget.json:9-13` + `hmw.js:148` | `cap: 20` · `mechanism: loud-skip` · `ratified: 2026-07-24` ⟂ `const WIDTH_CAP = 20` | mirror khớp, 0 drift |
| G4 | Cơ-chế LOUD-skip | `hmw.js:149-156` | in `🔴 VƯỢT TRẦN WIDTH` `:152` + `🔴 LANE BỊ BỎ` `:154` + `slice(0, WIDTH_CAP)` `:156`, **0 throw** | khớp `depth-axis:43` "không văng lỗi" |
| G5 | Ratify-attribution | `memory-budget.json:14` `_ratified_by` | **"OWNER-DELEGATED → LEAD-DECIDED @S149. KHONG PHAI 'owner chot'"** | 🔴 cấm nâng thành owner-chốt |
| G6 | K2 vế (a) | `grep -rn "BLOCKED-by-O-2" **/*.md` | **14 hit**, 0 hit trong spec 07-25; 14/14 nằm trong run-folder LỊCH SỬ S144/S149 | vế (a) **ĐẠT** (spec-mới sạch) |
| G7 | K2 vế (b) | `grep -ic "trục sâu" docs/governance/harness-11-engine.md` | **0 hit** | 🔴 vế (b) **TRƯỢT** — posture-A chưa codify ở engine-doc |
| G8 | Bảng gate 5 vòng | đọc `.claude/commands/session-end.md:175-181` | 5 dòng V1–V5, đủ cột con-KIỂM + cột bằng-chứng-phải-dán | khoản ① dong-du-vong có vật-chứng |
| G9 | writeGuard | `grep -n writeGuard .claude/workflows/hmw.js` | `:225` (khai báo) · `:252` (truyền) · `:208` (lineage S72) | khoản ② có vật-chứng |
| G10 | Máy eval use-side | `ls -la scripts/applied-eval-nokey.ps1` | **tồn tại, 19.045 B** | khoản ④ máy THẬT, không phải dự-định |
| G11 | Đường `/pause` còn tiến-trình ngoài? | `grep -i "powershell\|nhip-no-probe" .claude/commands/pause.md` | **`:89` VẪN gọi** `powershell.exe … nhip-no-probe.ps1`, kèm khai *"probe KHÔNG chặn điểm dừng"* (fail-open) | 4.3 vi-phạm-theo-chữ còn sống |
| G12 | Chi-phí bước dừng mới | đọc `pause.md:44-46` | `machine-block` ~**140ms** · `secrets-sweep` ~**64ms** (3 lượt, tb); ròng ~64ms + 1 write | có SỐ, **không có NGƯỠNG** ⇒ chưa chấm được |
| G13 | masthead ở rule-file | ripgrep glob `{docs/**,.claude/commands/*.md,.claude/skills/**,CLAUDE.md}` | **0 match** | C-e: claim invest HOLD, và mở rộng hơn phạm vi invest tự khai |
| G14 | masthead toàn repo | `grep -rn` (nguồn 2, độc lập) | **22 hit** — toàn bộ ở run-note + inbox-copy + chính file này | 2 nguồn khớp: rule-file = 0 |
| G15 | Neo commit | `git log --oneline -2 -- <file>` + `git merge-base --is-ancestor` | `hmw.js`/`session-end.md`/`fable-clone.md`/`pause.md` → **`72d2d1b wal: pause`** · `memory-budget.json` → `611b41f wal: flush` · `hoi-tu-synthesis.md` → `f33d729 wal: flush`. `72d2d1b` **KHÔNG** ancestor `origin/main` (=`2f39a7e`) | 🔴 **CẤM cite sha `wal:`** — neo bằng file:dòng |

**Kết luận G15 (quan trọng nhất về evidence):** spec bắt "evidence commit/run THẬT, tự `git log` lấy sha". Lane đã chạy `git log` — và kết quả là **không có sha nào hợp lệ để cite**: mọi thay-đổi S144/S149 còn nằm trong commit `wal:` sẽ bị squash ở closeout. Cite chúng = tái phạm đúng class **`bằng-chứng-tự-huỷ-sau-squash`** đã ghi ở `adap-reports/2026-07-18-Governance-model-tier-h23-precedence-tested-update.md:26`. ⇒ 4 report đều neo **file:dòng trên đĩa** + khai thẳng "commit-anchor pending closeout-squash". **Không bịa sha, cũng không im lặng bỏ trường evidence.**

## ② VIỆC A — 4 report nhóm-B (đã ghi, mỗi thư 1 file, format-LOCK 5 trường)

Đường dẫn: `docs/governance/adap-reports/<id>.md`.

### A1. `2026-07-18-Governance-spawn-label-panel-audit-khung`
Nấc **executed**, khoản-④ **verified-pending**. Bảng 4 khoản: ① executed (codify `fable-clone.md:62-64` + dogfood `C14:14`) · ② executed (đo lại ký tự: 25 / 24 / 34, 3/3 ≤40) · ③ executed-luật, **0 phép đo máy** · ④ 🔴 **verified-pending** (G2: run 07-25 có 0 label ⇒ trượt neo-artifact C3:110).
Caveat nặng nhất khai trong report: **lane không tự verify được label của chính nó** — label nằm ở phía gọi, không có trong prompt gửi xuống ⇒ người duy nhất verify được là lead lúc spawn, và hiện không có vết bắt buộc.

### A2. `2026-07-19-Agent-ensemble-depth-axis-deepen-on-contested`
Nấc **executed**. Bảng F1–F4: **F1 KÉP** executed-WIDTH (G3/G4) + **N/A-by-posture** phần SÂU (posture-A, `gate-synthesis.md:3`) — 🔴 kèm **1 vế acceptance TRƯỢT**: K2(b) đòi ≥1 dòng posture ở `harness-11-engine.md`, đo được **0 hit** (G7) · **F2/F3 n-a by posture** (đổi lý do từ *"chưa có"* → *"cố ý không dựng"*) · **F4 executed** (LOUD-skip, 0 throw).
Caveat nặng nhất: **nhãn "O-2 RESOLVED" đã có, vật-chứng codify thì chưa** — posture-A chỉ sống trong run-folder, không có ở nhà canonical ⇒ đúng lớp *"vắng-mặt trông giống ổn"*. + giữ nguyên phân biệt **OWNER-DELEGATED ≠ owner-chốt** (G5).

### A3. `2026-07-19-Governance-goi-chot-owner-nam-khoan`
Nấc **executed** cho 4.1/4.2/4.4/4.5; **4.3 KÉP executed-luật + verified-pending-đo**. Bảng 5 khoản (không phải 4 — `C14:4`): 4.1 nhãn O-5 **đóng bằng #23** (`run.md:7`) · 4.2 ADOPT-có-phạm-vi + C15 xong, còn vế *lane workflow `tier:`-override* **chưa đo** · **4.3 🔒 ngưỡng-rẻ = owner-SỐ, lane KHÔNG đặt** (G11/G12) · 4.4 cổng-người ADOPT, **máy quét = dự-định** · 4.5 ĐÃ-CÓ (worker-tier-pin S124).
Caveat nặng nhất: 4.1 nấc `executed` **tựa trên file đã sửa, KHÔNG tựa trên runtime đã chứng** — bằng-chứng lớp thi hành là **lời khai của lead** (`run.md:7`), probe thật thuộc **L6**; L6 probe lệch thì dòng 4.1 phải hạ nấc.

### A4. `2026-07-19-Governance-harness-dong-du-vong-audit-va-eval-use-side`
Nấc **executed** ①②④(cơ-chế); **③-thực-thi + ④-vòng-chạy-thật = verified-pending**. Bảng 4 khoản: ① executed (O-3 tập-rỗng @S149 + bảng gate G8) · ② executed **kèm caveat có răng** (whitelist `tools:` KHÔNG chặn ghi runtime, backstop thật = git-diff commit-gate) · ③ KÉP luật-land / thực-thi-chờ · ④ máy wire @S149, máy THẬT 19.045 B (G10), **ghost-wire 18 ngày** trước đó.
Caveat nặng nhất: **chưa có lượt bookend THẬT nào chạy end-to-end** (`hoi-tu-synthesis.md:29`) ⇒ khung 5-vòng mới verify bằng fault-inject + smoke. + dải JUMP 🔒 FROZEN · M8 V5-counter DEFER (V5 **không có máy đếm**, số do người điền) · trio giữ CONSENT chờ #12.

## ③ VIỆC B — PROPOSE (KHÔNG sửa canonical; lead single-writer áp)

### C-c — label-falsifier: 3 task thử + negative-control

**Vì sao phải thay phép của hub:** falsifier gốc (`spawn-label:47`) là *"mở bảng Background-tasks → chọn 3 task → chỉ đọc label"*. Panel là bề-mặt của **owner**; sub-agent không thấy panel, và panel **ephemeral không grep được** (chính C3:110 đã nhận). ⇒ phép phải chuyển sang bề-mặt **grep được** = `runs/<id>/run.md`, giữ nguyên FUNCTION (đọc-label-là-đủ-hiểu).

**Phần TÍCH-CỰC — 3 task thật của SE, chỉ đọc label, không mở transcript:**

| # | Label (thật, có trong repo) | ai | gì | nhịp | phiên | Ký tự | Verdict |
|---|---|---|---|---|---|---|---|
| T1 | `Vòng-3 harness-eval w1 @start s144` (`fable-clone.md:70`, `runs/2026-07-22-S144-trio-first-run/run.md:13`) | `harness-eval` | đo memory (wave-1 của bộ-ba đo→đề-xuất→kiểm) | Vòng-3, `@start` = đầu phiên | s144 | **34** | ✅ 4/4 |
| T2 | `Gate reviewer anchor s144` (`fable-clone.md:70`, `C14:14`) | `reviewer` | cổng review nhánh *anchor* | `Gate` = cổng review trước phát | s144 | **25** | ✅ 4/4 |
| T3 | `Gate reviewer teeth s144` (`C14:14`) | `reviewer` | cổng review nhánh *teeth* | `Gate` | s144 | **24** | ✅ 4/4 |

⇒ **3/3 đọc được cả {ai · gì · nhịp · phiên}, 3/3 ≤ 40 ký tự.** Khoản ①② ĐẠT trên tập này.

**Phần ÂM (negative-control) — bắt buộc phải TRƯỢT, nếu "đạt" thì phép đo là rác:**

```text
[NEGATIVE-CONTROL SAMPLE — KHÔNG phải label đang dùng, KHÔNG copy đi nơi khác]
NC-1  "Vòng-3 harness-audit"        → thiếu {pha, phiên}  ⇒ đọc ra: ai ✔ nhịp ✔ | pha ✘ phiên ✘  ⇒ TRƯỢT ✅(đúng kỳ vọng)
NC-2  "audit tài liệu"              → dạng tự-do (verbatim ví dụ xấu của hub, spawn-label:20)
                                      ⇒ đọc ra: 0/4                              ⇒ TRƯỢT ✅(đúng kỳ vọng)
NC-3  "Gate reviewer anchor"        → thiếu {phiên}       ⇒ 3/4                   ⇒ TRƯỢT ✅(đúng kỳ vọng)
```

⇒ **3/3 negative-control TRƯỢT đúng chiều** ⇒ phép đọc **phân biệt được** label đủ và label thiếu (không phải phép luôn-xanh).

**Phần ÂM THẬT (không phải mẫu dựng) — chạy trên chính run hôm nay:**
`grep -ic "label" runs/2026-07-25-S149-adap-backlog/run.md` = **0** ⇒ 6 lane của wave này **không có label nào neo vào artifact** ⇒ **khoản ④ (phủ MỌI loại spawn) TRƯỢT tại chỗ**, ngay trong phiên áp chính khuôn đó. Đây là bằng-chứng mạnh hơn mọi mẫu dựng.

**PROPOSE-diff (KHÔNG áp trong lane này):**
1. **`runs/<id>/run.md`** — thêm 1 mục `## Label lane` liệt kê label từng lane, ghi **lúc scaffold @P1** (không phải lúc đóng run). Lý do: đó là thời-điểm duy nhất lead còn cầm label trong tay; ghi sau = chép lại trí-nhớ.
2. **`.claude/commands/hmw.md`** (hoặc chỗ mô-tả `args.run` của RUN-TRACE) — 1 dòng: *"scaffold run-folder ⇒ ghi `## Label lane` với label đủ 4 thành-phần cho từng task; thiếu = run-folder chưa scaffold xong"*. Đây là chỗ **chặn từ lúc VIẾT**, đúng tinh thần `goi-chot:38`.
3. **Nếu muốn có máy** — detector INFORM-only: với mỗi `runs/<id>/run.md` mới, regex `^-?\s*\S+\s+\S+\s+\S+\s+s\d+` trên mục `## Label lane`; 0 dòng khớp ⇒ FLAG. 🔴 **Bắt buộc kèm fault-inject 2 chiều** (cây tạm `-RepoRoot`): run-folder có label đúng ⇒ **không được** FLAG; run-folder 0 label ⇒ **phải** FLAG. Không có vế âm thì detector này vô nghĩa (bài C6: neo literal *"máy sẽ"* xanh cả khi cắm câu giả).
4. 🔴 **Cảnh báo citation-trap (S-lesson `feedback_citation_trap_selfreference`):** chính file này chứa 3 mẫu NC là **label sai có chủ đích**. Detector nào quét "label xấu trong repo" sẽ bắt đúng file định nghĩa negative-control — và lây qua mọi doc trích lại. Discriminator phải là **enclosure use ⟂ mention** (chỉ quét trong mục `## Label lane`, bỏ qua fenced-block gắn nhãn `NEGATIVE-CONTROL SAMPLE`), **KHÔNG** vá bằng charset/regex-tinh-vi hơn.

**Không tự áp vì:** cả 3 đích đều là canonical (`run.md` của run đang chạy do lead sở hữu · `hmw.md` là command · detector là `scripts/governance-detectors.ps1` — spec `:13` giao **L6 là lane DUY NHẤT** đụng file đó).

### C-e — masthead codify 1 dòng

**Trạng-thái đo được (2 nguồn độc lập, khớp):** ripgrep glob rule-file = **0 match** (G13) · grep repo-wide = **22 hit**, toàn bộ ở run-note / inbox-copy / chính file này (G14). ⇒ luật masthead **có trong sổ ghi việc, KHÔNG có trong file luật**. Đây đúng bệnh mà chính khoản-2 của thư 3-khoan đặt tên: **implement-home ⟂ discoverability-home** (`sub-invest-8-thu-bind-3.md:17`). Lưu ý phạm-vi: invest S149 tự khai chỉ grep `.claude/commands/*.md` + `docs/rules.md` (`sub-invest-8-thu-bind-3.md:82`); lane này **mở rộng thêm** `docs/**`, `.claude/skills/**`, `CLAUDE.md` — vẫn 0.

**PROPOSE-diff — 1 dòng, đích CHÍNH: `docs/rules.md` §6.3 (chèn sau dòng 282):**

```diff
  - Phase đổi → update `STATUS.md` + `HANDOFF.md` + `changelog/migration-todos.md`
+ - **Sửa body doc nào → đọc lại dòng-1 + masthead/tiêu-đề của CHÍNH doc đó** trước khi tuyên sweep xong (tiêu-đề là "view của doc về chính nó", không nằm trong danh mục của ai nên sống sót lâu nhất — `2026-07-20-…3-khoan:19-27`)
```

**Vì sao chọn §6.3 chứ không chỗ khác:**
- §6.3 (`docs/rules.md:276-282`) là danh sách **"sửa X → phải update Y"**, luôn-áp-dụng, không gắn với chu-kỳ. Luật masthead đúng dạng đó ⇒ vào **cùng hình-thức với các dòng anh em**, không phải mục lạ.
- §6.4 (`:284-296`) là **cadence audit định kỳ** (cuối session / cuối phase / đầu tháng). Nhét vào đó sẽ ngầm biến luật *"mỗi lượt sửa doc"* thành *"việc của đợt audit"* — **thu hẹp sai** phạm vi, đúng cái bẫy làm khoản này chết 5 ngày qua.
- `.claude/commands/session-end.md` **không** phải nhà đúng: sweep xảy ra bất cứ lúc nào ta sửa doc, không chỉ lúc đóng phiên; đặt ở đó lại tái tạo lỗ *implement-home mà không có discoverability-home*.
- `docs/rules.md` được `CLAUDE.md` trỏ đích danh (*"⭐ Coding conventions"*) ⇒ đạt vế **discoverability-home**.

**Tuỳ chọn thứ hai, TÁCH RIÊNG để anh/lead duyệt độc lập (KHÔNG bó vào cái trên):** thêm 1 dòng vào checklist §6.4 (`docs/rules.md:298-305` khối ```) — `6. Doc nào sửa body trong lượt này → dòng-1 + masthead khớp chưa?`. Giá trị: biến luật thành **mục phải tick** ở lượt audit. Nêu riêng vì gộp 2 diff thành "1 dòng" là tự nói dối về khối lượng.

**Acceptance sau khi lead áp:** `rg -i masthead docs/rules.md` ≥ **1 hit** (hiện 0). 🔸 Đây là acceptance **đếm-chữ**, yếu — nó chứng *dòng đã tồn tại*, **không** chứng *có ai làm theo*. Phép mạnh hơn (positive-control): lấy 1 doc vừa sửa body trong phiên, kiểm dòng-1 có nói điều cũ không. Lane này **không tự nâng** acceptance vì đó là quyết định của lead.

## ④ Honest-caveat + verified-pending / DEFER 🔒 (gom, không giấu trong report)

| Mục | Trạng-thái | Ghi chú |
|---|---|---|
| Neo commit 4 report | 🔴 **pending closeout-squash** | Mọi vật-chứng đang ở commit `wal:`, không phải ancestor `origin/main`. Hub clone repo về **chưa thấy** các dòng được cite. Cần re-anchor sang commit closeout S149 |
| Khoản ④ spawn-label (phủ mọi loại spawn) | **verified-pending** | G2 = 0 label trong run 07-25 |
| Posture-A codify ở engine-doc (K2 vế b) | 🔴 **TRƯỢT — còn 1 dòng phải land** | G7 = 0 hit. Trùng phạm vi C-f của **L4** ⇒ lead đối chứng 2 nguồn |
| 4.3 ngưỡng "rẻ" | 🔒 **owner-SỐ, DEFER — lane KHÔNG đặt** | Có 2 số đo (G12) nhưng không có ngưỡng ⇒ không chấm được. Từ chối suy ngưỡng từ chính số vừa đo |
| 4.2 lane workflow `tier:`-override qua resume | **chưa đo** | C15 chỉ kết luận cho Agent-tool |
| 4.4 máy quét lời-hứa-máy | **dự-định, chưa có** | Khai đúng dạng theo chính khoản 4 |
| Bookend lượt ĐẦU | **verified-pending — phiên sau** | `hoi-tu-synthesis.md:29` |
| M8 V5-counter | **DEFER** | `hoi-tu-synthesis.md:27`; V5 hiện không có máy đếm |
| Dải JUMP {4,3,3} + view-residual-asym | 🔒 **FROZEN chờ anh** | `hoi-tu-synthesis.md:26`; `_frozen_until_owner` chưa ghi vào file |
| Trio consent #12 | 🔒 **owner-held** | Khoảng cách với 2 sister là CÓ CHỦ ĐÍCH |
| sha 4 thư | **chưa tái-đo hôm nay** | Kế thừa frontmatter inbox theo brief; hub sửa file sau 07-24 thì lệch |
| Probe model #23 | **KHÔNG thuộc lane này** | L6 làm; A3 không chép claim lead làm evidence |
| Fault-inject cho `WIDTH_CAP=20` | **kế thừa, chưa tái-chứng hôm nay** | Luật SE đòi re-run khi số đổi; lane không chạy lại (ngoài phạm vi) |

## ⑤ Acceptance-checklist evidence

| Ràng (spec `:10`, `:16-19`) | Đo | Verdict |
|---|---|---|
| 4 file report nhóm-B, đúng id outbox | `docs/governance/adap-reports/` +4 file, tên khớp `broadcasts/inbox/ai_infra/<id>.md` 1:1 | **ĐẠT** |
| Format-LOCK 5 trường (`adap-report.md:14-19`) | mỗi file có `## 1. id-broadcast` → `## 5. honest-caveat` | **ĐẠT** |
| Bảng per-khoản theo C14, **CẤM số-tổng** | A1 4 dòng · A2 4 dòng (F1–F4) · A3 **5** dòng (không ép về 4) · A4 4 dòng; **0 dòng "tổng"**, 0 câu dạng "x/y khoản đã xong" | **ĐẠT** |
| Evidence commit/run THẬT, CẤM bịa sha | Đã chạy `git log --oneline` + `merge-base --is-ancestor` (G15); phát hiện **không có sha hợp lệ** ⇒ neo file:dòng + khai lý do, **0 sha bịa** | **ĐẠT (theo cách khai thẳng)** |
| Nấc G-011 đúng, CẤM nấc ảo | 4/4 dừng ở `executed`, **0 file claim `verified`**; phần dở gắn `verified-pending`/`n-a`/🔒 | **ĐẠT** |
| honest-caveat bắt buộc | 4/4 có §5 với ≥4 gạch đầu dòng, mỗi file ≥1 mục 🔴 | **ĐẠT** |
| C-c falsifier | 3/3 task thật đọc được 4/4 thành-phần · **3/3 negative-control TRƯỢT đúng chiều** · 1 phép âm THẬT trên run 07-25 = 0 label | **ĐẠT (và phát hiện khoản ④ hở)** |
| C-e propose | 1 diff chính (`docs/rules.md` §6.3) + lý do bác 3 đích khác + 1 tuỳ-chọn TÁCH RIÊNG + acceptance kèm tự-phê "yếu vì đếm-chữ" | **ĐẠT** |
| Ghi ngoài phạm vi cho phép? | Chỉ 4 file `adap-reports/` + `sub-apply-L3.md`. **0** file canonical bị sửa; **0** ghi `agent-memory/`; **0** đụng `governance-detectors.ps1` (của L6) | **ĐẠT** |

## Log tiến-trình

- [L1] khung rỗng ghi đĩa TRƯỚC khi đọc/viết.
- [L2-3] đọc spec + run.md + sub-invest §② (spec THẮNG sub-MD ⇒ tập 4 thư = spawn-label · depth-axis · goi-chot · dong-du-vong, KHÔNG phải tập ở `sub-invest:64`).
- [L4-5] format-LOCK `adap-report.md:14-19` + C14 17-khoản + 1 report mẫu (`h23-precedence`) → rút luật cite-sha.
- [L6-8] ground-truth G1–G15 (2 lượt grep độc lập cho masthead; git log + ancestor-check cho neo commit).
- [L9-12] ghi 4 report.
- [L13] ghi C-c + C-e + acceptance vào file này.
