Skip to content

bug: idd-close 兩層 gate 都不防「寫時為真、關時已假」的 checklist — semantic gate 對已刪除的檔案照樣放行 #324

Description

@kiki830621

Problem

idd-close 有兩層 gate,各自防一種失敗模式(skill 自己的說法):

  • Step 0 Structural Gatehonest forgetting- [ ] 沒打勾不能關)
  • Step 1.6 Semantic Gatemotivated cheating(打勾了但實際沒做)

兩層都不防第三種:寫的當下是真的,關的時候已經不是了。

實例

PsychQuant/plaud-mcp-connector#44 的 authoritative checklist(## Implementation Complete > ### Checklist)第一項:

- [x] 新增 `docs/upstream-report-port-8199.md` → commit `d54ffbc`

寫下時完全屬實。但該 issue 隨後跑了三輪 verify,第三輪之後 那個檔案被刪除了(commit 9f6d22c)——因為查明它的三個 upstream ask 都站不住。

close 時:

Gate 判定 為什麼
Step 0 Structural ✅ PASS 全部 - [x],supersession active
Step 1.6 Semantic(Pattern 3:backtick file path) ✅ PASS docs/upstream-report-port-8199.md 確實出現在 git log --grep="#44" --name-only —— 它被新增過一次、刪除過一次,兩個都是 #44 的 commit

兩層 gate 都放行,而 checklist 描述的交付物已經不存在。 Semantic gate 的 pattern 檢查的是「這個 path 有沒有在本 issue 的 commit 裡出現」,新增與刪除同樣命中。

當次由人補發一則 superseding ## Implementation Complete(把該項改成 - [-] won't fix 並寫明檔案已刪),gate 才反映真實。但那不是 gate 抓到的,是人記得。

Type

bug

Expected

至少其中之一:

  1. Semantic gate Pattern 3 檢查檔案的最終狀態:path 若在 git log --grep --name-only 中出現,另外確認它在 HEAD 是否存在(或該 issue 最後一個 commit 是否刪除它)。刪除 → warn,讓使用者確認 checklist 是否過時。
  2. 提示 checklist 時效性:當 ## Implementation Complete 的最新一則距今超過 N 個 commit(或該 issue 之後有 ## Verify (FAIL)),提示「checklist 可能已過時,考慮補發一則」。

方案 1 較精確、範圍也小。

Actual

兩層 gate 都放行過時的 checklist,- [x] 指向已刪除的檔案。

Impact

  • skills/idd-close/SKILL.md Step 1.6(Keyword → Check 對映表,Pattern 3)
  • 使用者流程:任何經歷「多輪 verify → 重做」的 issue。輪數愈多、checklist 愈可能過時

為什麼值得修

這個缺口的形狀跟前兩個 gate 不同,也比它們難察覺:

  • honest forgetting 有 - [ ] 可見
  • motivated cheating 有「宣稱與 commit 不符」可測
  • 時效失準沒有任何表面訊號 —— checklist 讀起來完全正常、commit 確實存在、path 確實被碰過

而它出現的時機恰好是最容易鬆懈的地方:一個跑了三輪 verify、終於要收工的 issue。

相關

同一次執行另外開了 #322(Step 0.5 gate 的 enum 與抽取範圍)、#323(Step 6.7 worktree GC 的 exit code)。三者共通點:回傳值 / 判定通過,但事實不是那樣,而呼叫端沒有辦法從輸出看出來。

Source: surfaced during /idd-close execution on PsychQuant/plaud-mcp-connector#44(2026-08-17)。

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions