dispatch-format-guard 修兩處:規則自己的合格範例會被自己擋,禮貌收尾不該算違規
inkstone/ISEP#65:leo 發現「寫完 ISEP#30 那條規則之後,同一天總管又犯了 8 次」, 派來查「現行閘為什麼抓不到」。查證結果分兩層: ━━ 真正在跑的閘其實是 dispatch-format-guard.sh,不是 no-ticket-no-dispatch.sh ━━ no-ticket-no-dispatch.sh 的殼驗證早就是已知行為(只驗有沒有一行【工單】), 但 ISEP#30 已經為此新增了 dispatch-format-guard.sh 做內容判定,測試 19/19 通過。 問題是它有兩個沒被那 19 條測資蓋到的洞: 1. **regex 洞(本體 bug)**:頂層 CLAUDE.md 規定的合格格式帶全形括號—— 「【工單】owner/repo#N(→ comment M)」。_COMMENT_RE 只吃「→ comment M」 本體,兩側括號沒被算進去,殘留括號讓 _REF_RE 比不過,於是**規則自己定義 的合格範例會被自己的閘擋下**(半形括號 `(...)` 同樣會中)。用今天派我這張 票的那份派工單原句實測,改之前 exit=2「票號形狀不對」。 2. **零容忍過頭**:純禮貌收尾(「謝謝」)跟「記得先讀 CLAUDE.md」這種真內容 一樣被當「派工單不只有票號」擋下。ISEP#65 test 4 明講這四種不該擋 (只有票號/空行/「謝謝」/括號包住的 comment 格式),優先做成低誤鎖。 判斷:不改 no-ticket-no-dispatch.sh、不另立第三支閘——dispatch-format-guard.sh 已經是「另立一支」的正確位置,這兩個洞在它自己的地盤上補。 修法: - _COMMENT_RE 兩側括號(全形/半形)都設可選 - 新增 _COURTESY_CLOSERS 白名單(謝謝/多謝/感謝/辛苦了…)+ _is_courtesy_closer(), 只在圍欄外生效,判準仍是「整行清乾淨標點後完全相等」不是「包含」—— 白名單不是黑名單,猜漏頂多誤鎖一次,不會反過來放走真內容(③g 測資證明) 測試:hooks/tests/dispatch-format-guard.test.sh 19→33 條,全過。新增: - ③b/③c 全形/半形括號格式(規則自己的例句) - ③d/③e/③f ISEP#65 test 4 的三種不該擋 - ③g 白名單邊界(禮貌詞混真內容裡照樣算數,防止白名單被誤用成漏洞) - ⑮b–⑮i:leo 點名的「寫完規則後又犯的 8 次」當回歸樣本,內容是從 ISEP#60/#61/#64、Arcrun#142/#144/#165、arcrun-rag#104、InkStoneCo#102 的真實票內文摘錄(見 hooks/tests/fixtures/README.md 記載來歷), 不是想像出來的例子;8 種形狀全部驗證會被擋 reply-identity.test.sh 11/11 仍全過(共用 dispatch_parse.py 沒有回歸) 升版 0.5.0 → 0.5.1(改完不升版沒人吃得到;check-version-consistency.sh 在本分支照慣例是紅的,tag 於 merge 時打)。 另查:.shell-payload/ 整個被 gitignore(scripts/vendor-to-shell.py 產物), 不是 git 分發的一部分——「這支閘會不會被吃到」取決於消費端有沒有重跑 plugin update/vendor-to-shell.py,不是這個 repo 委交的內容缺漏,故不在 本票改動範圍內,僅記錄供總管排查用。 未動 no-ticket-no-dispatch.sh(判斷見上,職責保持不重疊,兩支閘互斥見 dispatch_parse.py 的 has_ticket_marker 分岔)。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
@@ -61,6 +61,32 @@ t 0 "② 合規:兩張票就兩行【工單】" \
|
||||
t 0 "③ 合規:用 #issuecomment- 定址也認得" \
|
||||
"$(payload '【工單】inkstone/ISEP#30#issuecomment-4327')"
|
||||
|
||||
# ── inkstone/ISEP#65:CLAUDE.md 規定的合格格式(全形/半形括號包住 → comment M)
|
||||
# 曾經被本閘自己擋下——這裡把它釘成迴歸測試,不再走回頭路。
|
||||
t 0 "③b 合規:全形括號包住 → comment M(CLAUDE.md 標準寫法,曾被自己的閘擋下)" \
|
||||
"$(payload '【工單】inkstone/ISEP#65(→ comment 4515)')"
|
||||
|
||||
t 0 "③c 合規:半形括號變體" \
|
||||
"$(payload '【工單】inkstone/ISEP#65(→ comment 4515)')"
|
||||
|
||||
# ── inkstone/ISEP#65 test 4:不該擋的三種雜訊 ────────────────────────
|
||||
t 0 "③d 不該擋:票號後面只有空行" \
|
||||
"$(payload '【工單】inkstone/ISEP#65
|
||||
|
||||
')"
|
||||
|
||||
t 0 "③e 不該擋:票號後面只有一句「謝謝」(零資訊禮貌收尾,白名單豁免)" \
|
||||
"$(payload '【工單】inkstone/ISEP#65
|
||||
謝謝')"
|
||||
|
||||
t 0 "③f 不該擋:禮貌收尾帶標點也認得(「謝謝!」)" \
|
||||
"$(payload '【工單】inkstone/ISEP#65
|
||||
謝謝!')"
|
||||
|
||||
t 2 "③g 白名單不是漏洞:禮貌詞混在真內容裡照樣算數" \
|
||||
"$(payload '【工單】inkstone/ISEP#65
|
||||
辛苦了,順便告訴你 main 現在是 8e28041')"
|
||||
|
||||
t 0 "④ 不是派工的動作(Bash)→ 一律不管" \
|
||||
'{"tool_name":"Bash","tool_input":{"command":"ls"}}'
|
||||
|
||||
@@ -132,6 +158,33 @@ t 2 "⑮ 內容躲在圍欄裡也算數(圍欄只讓裡面的【】不被當
|
||||
【就地】main 現在是 8e7e265
|
||||
```')"
|
||||
|
||||
# ── inkstone/ISEP#65 test 5:拿「寫完規則之後總管又犯的 8 次」當回歸樣本 ──
|
||||
# 內容是從各自票的真實內文摘錄(hooks/tests/fixtures/README.md 記著來歷),
|
||||
# 不是想像出來的例子。8 種形狀都要被擋,證明這不是只補了一個特例。
|
||||
t 2 "⑮b 回歸:ISEP#60 那次的內容(自造第四套機制的診斷)" \
|
||||
"$(payload "$FIX/real-content-isep60.txt")"
|
||||
|
||||
t 2 "⑮c 回歸:ISEP#61 那次的內容(push-guard 戳記機制失敗史)" \
|
||||
"$(payload "$FIX/real-content-isep61.txt")"
|
||||
|
||||
t 2 "⑮d 回歸:ISEP#64 那次的內容(PR 分診現況數字)" \
|
||||
"$(payload "$FIX/real-content-isep64.txt")"
|
||||
|
||||
t 2 "⑮e 回歸:Arcrun#142 那次的內容(庫索引從沒被產生過)" \
|
||||
"$(payload "$FIX/real-content-arcrun142.txt")"
|
||||
|
||||
t 2 "⑮f 回歸:Arcrun#144 那次的內容(樹狀圖驗收記錄)" \
|
||||
"$(payload "$FIX/real-content-arcrun144.txt")"
|
||||
|
||||
t 2 "⑮g 回歸:Arcrun#165 那次的內容(MCP 徹查現場)" \
|
||||
"$(payload "$FIX/real-content-arcrun165.txt")"
|
||||
|
||||
t 2 "⑮h 回歸:arcrun-rag#104 那次的內容(收檔實測數字)" \
|
||||
"$(payload "$FIX/real-content-arcrunrag104.txt")"
|
||||
|
||||
t 2 "⑮i 回歸:InkStoneCo#102 那次的內容(milestone 打假背景)" \
|
||||
"$(payload "$FIX/real-content-inkstoneco102.txt")"
|
||||
|
||||
echo
|
||||
echo "── C 群:訊息本身 ──────────────────────────────────────────────"
|
||||
clean
|
||||
|
||||
Vendored
+18
@@ -12,3 +12,21 @@ leo 2026-08-27 要的測資是「今天實際發生的 5 次違規派工」
|
||||
其餘的覆蓋率改用「一條規則一個最小案例」來補(見 dispatch-format-guard.test.sh B 群)。
|
||||
|
||||
**不要用想像出來的例子替補那 4 份**,那會讓測試看起來比實際更綠。
|
||||
|
||||
---
|
||||
|
||||
## 第二批:`real-content-*.txt`(inkstone/ISEP#65)
|
||||
|
||||
leo 2026-08-27 又在同一天抓到總管**寫完規則之後又犯了 8 次**(八條線的派工單,
|
||||
每一條都帶了「這個 session 才知道的事」):`ISEP#60`/`#61`/`#64`、
|
||||
`Arcrun#142`/`#144`/`#165`、`arcrun-rag#104`、`InkStoneCo#102`。
|
||||
|
||||
🔴 **原始的違規派工 prompt 本身一樣拿不回來**(同一個道理:agent 一停就蒸發),
|
||||
但這 8 次的**內容已經被總管補寫回各自的票**(ISEP#65 body 明講)。
|
||||
這裡的 8 份 `real-content-*.txt` 是**從那些票的真實內文摘錄**(一字未改地複製,
|
||||
只是截取一段,並在最前面加回 `【工單】owner/repo#N` 讓它符合派工單的殼)——
|
||||
不是想像出來的例子,是真的存在於 Gitea 上、總管真的寫過的句子,只是原本的位置
|
||||
錯了(在 prompt 裡,不在票上)。
|
||||
|
||||
用途:驗證 dispatch-format-guard.sh 修完 ISEP#65 之後,**這 8 種「票號 + 這個
|
||||
session 才知道的事」的形狀全部會被擋下**——不是只驗一個最小案例。
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
【工單】inkstone/Arcrun#142
|
||||
|
||||
實查結論:這兩樣東西(庫索引與全庫摘要)從沒被產生過,不是壞掉,是根本沒做。
|
||||
於是「開場就知道有哪些子庫、各裝了什麼」這件事永遠靠現查,查不到就當作沒有。
|
||||
相關:inkstone/Arcrun#81、#87、#100(總圖說 0 條關聯,實際 1854 條)。
|
||||
@@ -0,0 +1,5 @@
|
||||
【工單】inkstone/Arcrun#144
|
||||
|
||||
leo 明講「不要現在執行,記下來」,本票只是把它接住,開工前要先確認優先序。
|
||||
測試 OK,出現了樹狀圖,但不符合需求——達成的是 mindmap 向右向上分佈,
|
||||
上下間距很大、展開字很小,用戶要擁有觸控板否則很難閱讀。
|
||||
@@ -0,0 +1,5 @@
|
||||
【工單】inkstone/Arcrun#165
|
||||
|
||||
不要先修,先查清楚再說——現在連斷在哪都還沒人講得出來。
|
||||
已知的現場(總管 2026-08-26 用 MCP 實查,不是讀 code 推的):同一個知識庫
|
||||
(youlin/yuga3bse),同一套 MCP 工具,四次查詢分數與筆數都對不上。
|
||||
@@ -0,0 +1,5 @@
|
||||
【工單】inkstone/arcrun-rag#104
|
||||
|
||||
現況(總管 2026-08-14 實測,非推測):leo 把 5 個資料夾接上重裝後的 leo21c,
|
||||
App 顯示你的檔案 12022 共幾份、819 已送上去、11183 排隊中、20 送不上去。
|
||||
逐資料夾實數(find 計 .md/.pdf/.txt,已排除 node_modules/.git)。
|
||||
@@ -0,0 +1,5 @@
|
||||
【工單】inkstone/InkStoneCo#102
|
||||
|
||||
背景(同一天稍早,leo 對同一件事說過的重話):昨天要完成 51,你現在還有沒派的,
|
||||
去看看 milestone 一大堆沒有一個完成,現在整理,不要詐騙,去看清楚哪些完成的。
|
||||
Gitea 的百分比只數票的開關,它不知道票裡的東西通了沒。
|
||||
@@ -0,0 +1,6 @@
|
||||
【工單】inkstone/ISEP#60
|
||||
|
||||
`subagent-claim-worksheet.sh`(`SubagentStop` 產待驗單)與 `claim-verify-police.sh`
|
||||
(`Stop` 擋收工)這一套自造的第四套機制整個移除,它守的東西改由 Gitea 原生的三格承接
|
||||
(子票相依/tag/指派——見 `inkstone/ISEP#59` 與 PR `#58`)。
|
||||
`#issuecomment-4289` 量到同一份待驗單重生三次、同內容兩個檔名。
|
||||
@@ -0,0 +1,5 @@
|
||||
【工單】inkstone/ISEP#61
|
||||
|
||||
`main-and-prod-push-guard.sh` 的戳記機制已經走進死路:原設計用
|
||||
`CLAUDE_CODE_CHILD_SESSION=1` 判斷 subagent,實測結果總管主 session 也是 1,
|
||||
那個變數不是身分標記,誰都擋。改成戳記(`/tmp/.main-push-ok`,總管手動寫)也失敗。
|
||||
@@ -0,0 +1,6 @@
|
||||
【工單】inkstone/ISEP#64
|
||||
|
||||
現況(總管實查,2026-08-27 12:40):open PR 總數 23,總管已關掉 8 個「內容早就在
|
||||
main」的空 PR,剩 15 個要分診。已關的 8 個實測 git merge-base --is-ancestor 證明
|
||||
HEAD 已是 main 的祖先,diff +0/-0:Arcrun#166/#161/#158/#155/#153、
|
||||
arcrun-rag#142/#141/#139。
|
||||
Reference in New Issue
Block a user