動作
Improvement #323
進行中
SC
防謊報護欄 v1.7:寫入權矩陣機械化四道閘 + 工程層/來源品質防線 + L4 fail-closed 稽核修補
Improvement #323:
防謊報護欄 v1.7:寫入權矩陣機械化四道閘 + 工程層/來源品質防線 + L4 fail-closed 稽核修補
狀態:
New
優先權:
Normal
被分派者:
-
開始日期:
2026-07-04
完成日期:
完成比例:
0%
預估工時:
概述
防謊報護欄 v1.7:寫入權矩陣機械化四道閘 + 工程層/來源品質防線 + L4 fail-closed 稽核修補¶
背景¶
CLAUDE.md 的「寫入權矩陣」「防冒名紀律」「協調者守門」過去多半是紙上約定——靠 agent 自律與人類記得跑步驟。稽核(2026-07-02 ~ 07-04)發現多個結構性破口:
-
project-manager 實際握有寫權:agent 定義的
tools明文列有Write/Edit/Bash,與矩陣「PM 不寫任何檔」矛盾;且宣告memory:欄會讓 harness 自動補發 Write+Edit,架空鎖寫。 -
shell 旁路無人擋:
echo "......" >> docs/specs/x.md走 Bash/PowerShell 工具寫治理目錄,不留 Write jsonl、繞過所有偵測層。 -
同輪 commit 藏過本地 hook:Stop hook 只看 working tree,同 turn
git commit後樹是乾淨的,S1/S2 直接被跳過。 -
L4 外部接地 fail-open 破口:缺 API key 時每條 claim 標 ERROR 卻仍 exit 0(唯一帳號外的眼睛變 silent no-op);
unreachable/non-text/fetch-fail不進 gate;忠實引用爛/未評來源能全綠通過。 - hourly cron 噪音:空 verifications 目錄下每小時失敗一次,狂發 GitHub 失敗信。
變更內容¶
1 機械化四道閘(v1.7,CLAUDE.md §機械化四道閘)¶
-
S2/S7 事前 deny — 新增
write-matrix-guard.ps1(PreToolUseWrite|Edit|NotebookEdit):具名角色寫非授權治理目錄 → 動手前即 deny,並指路 fallback 規則 11。fail-open(主協調者/泛型 agent/舊 build/repo 外一律放行)。 -
shell 旁路 deny — 新增
shell-write-guard.ps1(PreToolUseBash|PowerShell):把同一矩陣延伸到>/>>/tee/Set-Content/Add-Content/Out-File/Tee-Object重導向旁路。同款 fail-open,誠實標示為「抬高成本」非絕對閘。 -
S1 證據錨點閘 —
fabrication-check.ps1:本輪新增規格 `` 行帶[evidence: conclusions/<檔>]錨點但該結論 `human_checkpoint` 缺/pending/非過去日 → block。`conclusions/_template.md` 新增 `human_checkpoint` 欄。 -
committed_spec_audit(CI 層) — 新增
committed_spec_audit.py:在 GitHub runner 對已提交的 specs 重跑 S1 不變式,堵住「同輪 commit 藏過本地 hook」。watcher≠watchee。 -
.claude/settings.json註冊兩支 PreToolUse guard。
2 工程層謊報防線(S3,CLAUDE.md §進度聲稱證據規則)¶
- 新增
.github/workflows/tests.yml:push/PR 時在 windows-latest(PS 5.1 實環境)跑模板自身測試(hook e2e / CJK 回歸 / claims_gen / pdf_fetch)。「runner 跑出來的綠才算數」。
3 來源品質防線(S5)¶
-
claims_gen.py:逐字對源表新增source-quality欄抽取,帶進 claims.json(欄缺 → fail-open 不 retro-flag 舊檔)。 -
external_review.py:source_quality ∈ {unassessed, retracted, predatory}的承重列列為紅旗(exit 2),逼進人類抽查——忠實引用未評/爛來源不再全綠。
4 L4 external review fail-closed 修補(稽核 F1–F4)¶
- F1:缺 provider API key → 開跑前 fail-closed(exit 3 config error),不再全 ERROR 卻 exit 0。
-
F2:
RED_VERDICTS統一涵蓋contradicted/unsupported/unreachable/non-text/fetch-fail/ERROR,摘要與 exit gate 對齊到同一集合。 -
F3:CI 補裝
pypdf(否則 PDF 引用全判 non-text,而 non-text 現在 gate)。 -
F4:無可審檔案 → exit 0(非失敗);移除 hourly
schedulecron(噪音來源),保留 push/manual 觸發。 - workflow actions 版本更新(checkout@v5、setup-python@v6、upload-artifact@v7)。
5 project-manager 鎖寫(教訓 14)¶
-
tools收窄為Read/Glob/Grep,移除Write/Edit/Bash;刻意不宣告memory:欄(避免 harness 自動補發寫權)。PM 產出一律交主協調者落檔。
6 其他¶
-
.gitignore:忽略secrets.local.env、hook.state/、audit-ledger、cron 報告、PDF 二進位快取。 - 文件更新:CLAUDE.md(四道閘 / S3 章節)、
hooks/README.md、external-review-flow.md、run_external_review.py。 - 新增測試:
test-write-matrix-guard.ps1、test-shell-write-guard.ps1、test-committed-spec-audit.py、test-external-review.py、test-v17-s1s2s6.ps1。
驗收標準¶
- 五套測試全綠(本機執行):
-
python .claude/hooks/test-committed-spec-audit.py→ 11 passed, 0 failed (exit 0) -
python .claude/hooks/test-external-review.py→ 18 passed, 0 failed (exit 0) -
test-write-matrix-guard.ps1→ 23 PASS (exit 0) -
test-shell-write-guard.ps1→ 21 PASS (exit 0) -
test-v17-s1s2s6.ps1(S1/S2/S6)→ 40 PASS (exit 0) -
兩支 PreToolUse guard 已註冊進
.claude/settings.json。 - 兩支 guard fail-open:無 agent_type / 泛型 agent / 舊 build / repo 外路徑 / parse error → 一律放行。
-
external_review.py缺 key → exit 3;紅旗 → exit 2;無檔 → exit 0。 -
PM agent
tools僅Read/Glob/Grep,無memory:欄。 -
(人類動作,push 後)GitHub Settings → Branch protection 將
tests設為 required check。
誠實邊界¶
- 所有 PreToolUse guard 皆 fail-open + 依賴 harness 送
agent_type(v2.1.x+);主協調者主線不受閘。故 Stop-hook S2 偵測層與人類稽核不撤除(縱深防禦,收窄非消滅)。 - shell-write-guard 是啟發式 pattern-match,變數 / base64 / 別名可繞——CI(committed_spec_audit)+ 人類稽核為後盾。
-
human_checkpoint欄協調者可偽造——S1 只把「悄悄跳過」變成「git 歷史可見的假日期」,不證明人類真的看過。
沒有任何資料可供顯示
動作