gates-and-provenance-maplisted
Install: claude install-skill F-e-u-e-r/opus-pack
# starledger:結構與 provenance gate 語義地圖
(驗證日 2026-07-30,HEAD `55ae7b2`。實碼=`packages/classifier/src/verify-diff.ts`、
`agent-gate.ts`、`provenance.ts`;workflow=`.github/workflows/ai-agent-pr.yml`、
`ai-provenance.yml`,皆 `pull_request_target`、只 checkout 受信 base、把 head 當資料讀。)
## 結構 gate(`verify-agent-artifacts`)
- 觸發是 **path-based**:PR 動到 `ai-annotations.json` 或 `ai-annotations-meta.json` 任一
(含 rename 的舊��徑)才啟用 executor 規則;沒動到=green no-op。
- 動到時:head branch 必須是核准的 executor 前綴(`claude/`、`codex/`)且同 repo;變更檔案
**只能**是完整的 artifact pair;狀態只允許 **A 或 M**——刪檔(D)與改名(R)一律拒。
⇒ prune-only PR(M,M)可過;「刪 annotation 記錄」與「刪 annotation **檔**」是兩回事。
- diff 解析用 NUL 分隔(`git diff --name-status -z -M`),怪檔名繞不過。
## Provenance gate(`verify-ai-provenance`)
先驗 artifact pair 完整性(schema+exact hash),再對「受信 base 的 canonical dataset+live
README discovery」重算並裁決:
| 規則 | 語義 | 對操作的意義 |
|---|---|---|
| PROV-5 | head meta 的 `dataset_sha256` 必須等於**當前 base** 的 canonical SHA | daily sync 讓在途 PR 變紅(born-stale);用 `meta-rebase`(手動、model-free)重蓋,不重跑模型 |
| changed 集合 | head 對 base「新增+內容變更」的 annotation,逐筆重算 fingerprint/OID/metadata/config 驗證 | 逐筆錯 → 逐筆違規列出 |
| PROV-8 | `changed.length ≤ max_total_per_run`——**prune 不計入** | prune-only PR 是 changed=0,天然過 budget |
| PROV-6 | prune 只在「該 node 已離開 canonical dataset」時合法;prune 仍在的 node =違規 | removed-star 生命週期的 gate 端權威 |
| metadata-only 拒絕 | annotations bytes 沒變、只動 meta =拒 | 防 timestamp/metadata churn;真 prune 有 bytes 變化、不受影響 |
| generated_at 規則 | 內容沒變不得只改 generated_at | assembler