專案

一般

配置概況

動作

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] 慣例

是由 Sashiba Chou24 天 前加入.

狀態:
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:TrailPunct char array:原 ASCII 集(. , ; >,不變)+ CJK/全形尾隨標點 16 字(。,、;:!?)].」』】》〉~),全部以 [char]0xXXXX code 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-GitOctalPathcore.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 已同步更新)。

沒有任何資料可供顯示

動作

匯出至 PDF Atom