動作
Bug #338
進行中
SC
修 fabrication-check iron-rule-4 CJK 標點假陽性:TrailPunct 結構性剝尾 + 回歸固化 42 案 + research 角色 [N] 慣例
Bug #338:
修 fabrication-check iron-rule-4 CJK 標點假陽性:TrailPunct 結構性剝尾 + 回歸固化 42 案 + research 角色 [N] 慣例
狀態:
New
優先權:
Normal
被分派者:
-
開始日期:
2026-07-09
完成日期:
完成比例:
0%
預估工時:
概述
修復 fabrication-check iron-rule-4「URL 黏中文標點」假陽性(結構性根治)¶
背景¶
fabrication-check.ps1 的 C-H5(iron-rule-4 引用清單對照)以正則 https?://[^\s)\]<>"]+ 抽取 URL,尾隨修剪只認 ASCII 標點(.TrimEnd('.',',',';','>'))。中文散文裡 URL 天生會頂到 。,、」) 等全形標點,標點被吃進 URL 尾巴,導致與檔末「本次實際抓取的 URL 清單」段裡乾淨寫法的同一 URL 比對不上 → 誤判為「清單外偷渡來源」→ 假陽性 BLOCK。
- 此假警報在 Q-RC8 / Feature #337 該輪重演 3 次,每次都要協調者手動繞過。
- 重複繞過 hook 會養成「看到警告先繞過」的警報疲勞——正是場景 H 的溫床,PM 於 2026-07-09 優先序規劃中列為第 2 順位、業主核可由頂層協調者直接處理(CLAUDE.md 例外情境 3:修改專案結構本身)。
- 修法選型依專案信念「禁止某措辭對會換句話說的情境無效,唯有結構性上限可靠」:主修 hook 抽取層(結構性、不靠 agent 遵守),角色定義慣例僅作 defense-in-depth。
變更內容¶
1. .claude/hooks/fabrication-check.ps1(主修,結構性)¶
- 新增
$script:TrailPunctchar array:原 ASCII 集(. , ; >,不變)+ CJK/全形尾隨標點 16 字(。,、;:!?)].」』】》〉~),全部以[char]0xXXXXcode point 建構(遵守腳本 ASCII-only 約束;註解全 ASCII,避開 CP950 下 CJK 註解在@()內吞換行的既知 parse 地雷)。 -
Get-CitedUrls(供 C-H5 BLOCK 與 PDF-pending 提醒共用)與 Check B(warn-only)兩處.TrimEnd(...)改用$script:TrailPunct。 - 不削弱偵測:CJK/全形標點永不可能是合法 URL 的一部分,剝掉只會把「黏標點的 URL」還原成真 URL;真偷渡(清單外 URL)仍照常攔截(回歸案 41 證明)。
- 採列舉集而非寬鬆正則——與 F-new-7 confirm 勾號列舉集同理由,防散文誤觸。
2. .claude/hooks/test-v17-s1s2s6.ps1(回歸固化,40 → 42 案)¶
- 案 40:body URL 黏中文句號、同 URL 乾淨列於清單段 → 不得 block(修前為假陽性 BLOCK)。
- 案 41:真偷渡 URL(不在清單)與黏標點 URL 並存 → 仍須 block(證明修法未弱化 C-H5)。
- 兩案皆走真 hook 端到端(throwaway git repo + stdin 驅動),非單元近似。
3. .claude/agents/research-primary.md / research-verifier.md(defense-in-depth,軟約束)¶
- 鐵則 4 條目明文化既有最佳實務:散文一律用
[N]標號引用,真 URL 只放檔末清單段。 - verifier 版同時明列例外:逐字對源核對表的來源欄仍用真 URL(L4
claims_gen機械比對需要)——避免與既知教訓「iron-rule-4 body 全清成 [N] 會讓 L4 抽 0 條靜默略過」打架。 - 此慣例另涵蓋 hook 修法不涵蓋的觸發源(pending-PDF URL 進 body、憑記憶 URL),故保留為第二層。
順帶查核(無變更)¶
- 記憶所載「hook CJK 檔名盲點」(git core.quotepath 八進位逃逸):查證 ARGUS 版已修(
ConvertFrom-GitOctalPath+core.quotepath=false+ UTF-8 雙向、test-cjk-regression.ps1回歸在案)——該盲點屬上游 ai-template 舊版,本 repo 不需動作。
驗收標準(機械證據)¶
| 項 | 指令 | 結果 |
|---|---|---|
| 複現確認(修前) | scratchpad repro-ironrule4.ps1
|
黏標點 URL → notListed=2(假陽性 BLOCK 成立) |
| hook 煙霧測試 | echo '{...}' | powershell -File .claude/hooks/fabrication-check.ps1 |
exit 0,parse 無誤 |
| 回歸套件 | powershell -File .claude/hooks/test-v17-s1s2s6.ps1 |
RESULT: all PASS(42/42),exit 0;原 40 案零 regression,新案 40/41 通過 |
影響範圍與生效¶
- hook 由 runtime 每輪讀取 → 即時生效;agent 角色定義於下次 spawn 讀取 → 下輪研究任務生效。
- 不動 block 判定門檻、不動 fail-open 階梯、不動任何治理規則語義——僅修抽取層 tokenizer。
- 殘留(誠實標明):「spot-check metadata 裸 URL」與「pending-PDF URL 進 body」兩觸發源不在本修法範圍,仍靠
[N]/去 scheme 慣例規避(記憶fabrication-hook-gotchas已同步更新)。
沒有任何資料可供顯示
動作