專案

一般

配置概況

動作

Improvement #323

進行中
SC

防謊報護欄 v1.7:寫入權矩陣機械化四道閘 + 工程層/來源品質防線 + L4 fail-closed 稽核修補

Improvement #323: 防謊報護欄 v1.7:寫入權矩陣機械化四道閘 + 工程層/來源品質防線 + L4 fail-closed 稽核修補

是由 Sashiba Chou28 天 前加入.

狀態:
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(PreToolUse Write|Edit|NotebookEdit):具名角色寫非授權治理目錄 → 動手前即 deny,並指路 fallback 規則 11。fail-open(主協調者/泛型 agent/舊 build/repo 外一律放行)。
  • shell 旁路 deny — 新增 shell-write-guard.ps1(PreToolUse Bash|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.pysource_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。
  • F2RED_VERDICTS 統一涵蓋 contradicted/unsupported/unreachable/non-text/fetch-fail/ERROR,摘要與 exit gate 對齊到同一集合。
  • F3:CI 補裝 pypdf(否則 PDF 引用全判 non-text,而 non-text 現在 gate)。
  • F4:無可審檔案 → exit 0(非失敗);移除 hourly schedule cron(噪音來源),保留 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.mdexternal-review-flow.mdrun_external_review.py
  • 新增測試:test-write-matrix-guard.ps1test-shell-write-guard.ps1test-committed-spec-audit.pytest-external-review.pytest-v17-s1s2s6.ps1

驗收標準

  • 五套測試全綠(本機執行):
  • python .claude/hooks/test-committed-spec-audit.py11 passed, 0 failed (exit 0)
  • python .claude/hooks/test-external-review.py18 passed, 0 failed (exit 0)
  • test-write-matrix-guard.ps123 PASS (exit 0)
  • test-shell-write-guard.ps121 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 toolsRead/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 歷史可見的假日期」,不證明人類真的看過。

沒有任何資料可供顯示

動作

匯出至 PDF Atom