---
name: delivery-gate
description: 交付閘門 —— 在任何「做完了」之前跑一次。檢查四層防線、要求覆蓋率數字、完成交付登記（排程表／日誌／證據帳本／索引）。當使用者說「做完了」「可以提交了」「收尾」，或你自己準備宣告完成時使用。
---

# 交付閘門

> 放在 `.claude/skills/delivery-gate/SKILL.md`，用 `/delivery-gate` 呼叫，
> 或讓 agent 依 description 自動觸發。
>
> **這份 skill 把「交付」從一個感覺變成一個清單。**

---

## 步驟 1 — 先問「我剛才是在哪一種狀態下驗的」

在報告任何綠燈之前，回答這三題：

```
1. 我驗到了幾個？（種入 N 個 · 渲染 M 處 · 走完 K 個分頁）
   🚨 任何一個是 0 ⇒ 一律 FAIL。沒有數字的 PASS 只是「沒去看」的同義詞。

2. 我是在哪一種資料狀態下驗的？空庫還是有資料？另一種驗了嗎？
   🚨「再跑一次看有沒有過」不是驗證。

3. 我跑的是「原始碼檢查」還是「行為檢查」？
   🚨 靜態掃描回答不了「輸出的那一刻有沒有做對」。
```

---

## 步驟 2 — 跑對應的守衛

依「改到什麼就跑什麼」對照表跑，**每一支單獨執行並讀 exit code**：

```bash
python tools/<guard>.py > out.txt 2>&1; echo "exit=$?"
```

🚨 **不要接 `| head` / `| tail`** —— 那會把 exit code 換成管線末端的，
曾經真的因此帶著紅燈提交過。

改過守衛的比對邏輯 ⇒ **同時跑對應的 `*_drill.py`**。

---

## 步驟 3 — 交付登記（同一個工作階段內，不是可選收尾）

> **判準：沒寫進檔案的進度＝不存在的進度；寫錯的進度＝存在的假進度，更毒。**

四件事，缺一不可：

```
□ 1. 排程表 §三  整列移出，〈已完成〉補一行（X ✅日期 一句話）
□ 2. 當季日誌    補一則敘事（那天發生什麼、為什麼那樣選、估時怎麼變的）
□ 3. 證據帳本    補一列：結論 ＋ **當下實測的數字** ＋ 驗法 ＋ 指回日誌
□ 4. 索引        新增的擴充點加一列，code 定義處加標記
```

⚠️ **登記的對象不只「完成品」。**
如果這次對話產出了新提案／新估時／新落差，**也要進排程表** ——
寫進規格或證據帳本不算數，那兩個檔答的是別的問題。少登記一次就憑空少算數十小時。

⚠️ **並行寫入**：每一個寫入步驟後都 `grep -c` 驗一次識別字，不是最後驗一次。

---

## 步驟 4 — 輸出交付說明

固定格式，四段：

```markdown
## 做了什麼
<一到三行>

## 驗到了什麼（數字）
<守衛名>：<覆蓋率數字>（exit 0）
<測試名>：<N 項通過 / M 項>
狀態：我在<空庫／有資料>下驗的；另一種<驗了／沒驗，理由是…>

## 登記
排程表：<X> 整列移出　日誌：已補　證據帳本：已補一列　索引：<更新了什麼／不適用>

## 還沒做完的 / 已知落差
<誠實列出。沒有的話寫「無」，不要留白>
```

---

## 步驟 5 — 如果有任何一格是紅的

**不要宣告完成。** 回報：

```
紅在哪一層（L1 hook / L2 守衛 / L3 演練 / L4 端到端）
實際抓到的那一行
我的判斷：這是真問題還是誤報？
  · 真問題 → 回去修，不要繞過
  · 誤報   → 🚨 誤報比漏報更危險，它會讓人把守衛關掉。
             修守衛（加反向案例），不要在指令上加例外。
```
