Problem
#18 verify Round 10 通過(0 HIGH),但留下 7 條 MEDIUM 與數條可直接動手的 LOW,其中幾條是 #18 R10 自己帶進來的:它們都落在 #18 的核心判準上(偵測落空 ≠ 檢查過沒問題;git 動作只在對的 repo 內跑),不該只留在 verify 報告裡。
MEDIUM(R10 #1 –#7 )
Phase 0.5 Step 5 的 UNRESOLVED 語意錯 (logic / regression):plugin_names_for_paths 對 marketplace 內每一個宣告名稱 都會解析一次,任何一個壞掉 / 未物化的 entry(本機實例:che-claude-config 的 manifest 仍宣告 doc-guardian → ./che-local-plugins/plugins/doc-guardian,目錄已不存在 → rc 2)都讓 UNRESOLVED>0,於是 happy path 永遠到不了、還印出「N plugin name(s) touched by these commits could NOT be resolved」這句假話並列出 target 自己。修法:UNRESOLVED 拆成獨立分支(happy path 仍靜默、另印一行「manifest 裡有 N 個 entry 解析不到,無法判定它們有沒有被動到」),措辭不得說「touched by these commits」;smoke test 加一個解析不到的 entry 覆蓋這條路。
Phase 0.5 commit fence 的 git add -A -- "$MP_ROOT" 在巢狀案例上無效 (DA):che-local-plugins 現在解析到外層 che-claude-config,而它就是 git toplevel,pathspec 等於恆等式——實測會 stage 35 個與 marketplace 無關的檔案。改為 git --literal-pathspecs add -A -- "$PLUGIN_DIR" "$MP_ROOT/.claude-plugin/marketplace.json";同時補 --literal-pathspecs(全檔唯一漏掉的 pathspec)。
commit fence 結尾 rm -f "$MSGF" 洗掉 git add / git commit 的退出碼 (codex):pre-commit hook / index lock 失敗後 fence 仍 exit 0,後續 push fence 推的是舊 commit。改用 trap 'rm -f "$MSGF"' EXIT 並保留原退出碼;Phase 2.5 README fence 同。
Phase 2.5 信號 4 在「plugin 沒有任何 component」時未記入 SKIPPED (requirements):三個清單皆空時應 SKIPPED="$SKIPPED 4(無 skills/agents/commands 可比)"。
Phase 2.5 的 SKIPPED 把檔案系統名稱未消毒地丟進 echo (DA):目錄名含字面 \n 在 zsh 下會把結論行斷成兩行。套 clean()(或結論行改 printf '%s\n')。
resolver 註解過度宣稱 (requirements):「兩支公開查詢套同一條規則」只對巢狀同名 成立;真正兩份非巢狀 checkout 時 marketplace_candidates 仍套 plugins/ tie-break、find_plugin_marketplace 取首列,兩者可能給不同 root(本機七個多持有者目前無此形狀)。把 resolve-marketplace.sh L204–214 與 CHANGELOG 的敘述限縮。
signal-4 回報的是 regex 跳脫後的名字 (DA,LOW#22 但與 meta-skill 落腳處:放 .claude/skills/ 而非 devtools plugin #4 同段):s=$(re_esc "$s") 覆寫了顯示用的變數,使用者看到 skill:a\.b。跳脫另存變數只進 grep。
LOW(可與上面同一輪處理)
Type
bug
Expected
上列 MEDIUM 全部修掉、LOW 至少處理 #12 /#23 /#17 /#13 /#24 的檔頭;scripts/test-plugin-update-fences.sh 對 Step 5 的 unresolved 分支與 commit/push fence 有覆蓋;resolver 註解與 CHANGELOG 的宣稱與程式一致。
Actual
R10 出貨的 SKILL.md:Step 5 對 che-local-plugins 每次都走警告分支並指控未被動到的 plugin;Phase 0.5「stage all + commit」對 che-local-plugins 會 stage 整個 che-claude-config;commit 失敗看起來像成功。
Impact
plugin-update 的 git 寫入面。Conflict Class C(與 #19 / #22 同一份 skills/plugin-update/SKILL.md),建議序列在 #18 之後、#19 之前或之後由使用者決定。
Refs #18 (verify R10 findings;PASS 判準 0 HIGH 已達,本 issue 收 MEDIUM/LOW)、#23 (plugin-upgrade 半段)。
Source : surfaced during /idd-verify #18 round 10(codex / requirements / logic / regression / devils-advocate lenses)
Problem
#18 verify Round 10 通過(0 HIGH),但留下 7 條 MEDIUM 與數條可直接動手的 LOW,其中幾條是 #18 R10 自己帶進來的:它們都落在 #18 的核心判準上(偵測落空 ≠ 檢查過沒問題;git 動作只在對的 repo 內跑),不該只留在 verify 報告裡。
MEDIUM(R10 #1–#7)
UNRESOLVED語意錯(logic / regression):plugin_names_for_paths對 marketplace 內每一個宣告名稱都會解析一次,任何一個壞掉 / 未物化的 entry(本機實例:che-claude-config 的 manifest 仍宣告doc-guardian → ./che-local-plugins/plugins/doc-guardian,目錄已不存在 → rc 2)都讓UNRESOLVED>0,於是 happy path 永遠到不了、還印出「N plugin name(s) touched by these commits could NOT be resolved」這句假話並列出 target 自己。修法:UNRESOLVED拆成獨立分支(happy path 仍靜默、另印一行「manifest 裡有 N 個 entry 解析不到,無法判定它們有沒有被動到」),措辭不得說「touched by these commits」;smoke test 加一個解析不到的 entry 覆蓋這條路。git add -A -- "$MP_ROOT"在巢狀案例上無效(DA):che-local-plugins 現在解析到外層che-claude-config,而它就是 git toplevel,pathspec 等於恆等式——實測會 stage 35 個與 marketplace 無關的檔案。改為git --literal-pathspecs add -A -- "$PLUGIN_DIR" "$MP_ROOT/.claude-plugin/marketplace.json";同時補--literal-pathspecs(全檔唯一漏掉的 pathspec)。rm -f "$MSGF"洗掉git add/git commit的退出碼(codex):pre-commit hook / index lock 失敗後 fence 仍 exit 0,後續 push fence 推的是舊 commit。改用trap 'rm -f "$MSGF"' EXIT並保留原退出碼;Phase 2.5 README fence 同。SKIPPED="$SKIPPED 4(無 skills/agents/commands 可比)"。echo(DA):目錄名含字面\n在 zsh 下會把結論行斷成兩行。套clean()(或結論行改printf '%s\n')。marketplace_candidates仍套plugins/tie-break、find_plugin_marketplace取首列,兩者可能給不同 root(本機七個多持有者目前無此形狀)。把resolve-marketplace.shL204–214 與 CHANGELOG 的敘述限縮。s=$(re_esc "$s")覆寫了顯示用的變數,使用者看到skill:a\.b。跳脫另存變數只進 grep。LOW(可與上面同一輪處理)
git add再驗 commit message,abort 時 index 已髒(fix: 改名殘留的失效引用 + 11 處死路徑 (#1, #2) #12);Phase 2.5 README fence 的git commit -F沒有 pathspec,會把 index 裡任何東西一起送出(plugin-debug / plugin-deploy 也寫死 plugins/<name> 佈局 (sister concern from #18) #23)——兩者合起來是一條真實路徑。load_plugin_ctx的WRITTEN_EPOCH沒有長度上限(超過整數範圍時兩個時間檢查都 fail open)(fix: resolver 確定地指向四個月前的 stale 原始碼 (#11) #13)。plugin_holders就被丟掉,站在內層也選不到它(新增 mcp-protocol-migrate:把 MCP server 遷移到最新 protocol 版本 #14);至少在 abort / ℹ 訊息裡說明「巢狀同名視為 subtree」。git push(push.default=matching的 repo 會推多個 branch);改git push origin HEAD(Step 2.5 的 BLOCK 對 75% 的 wrapper 從沒執行過——抽不到就靜默 continue #17)。git rev-list --count @{u}..HEAD,為 0 時明說(fix: 改名殘留的失效引用,並讓它可機械偵測 (#1) #9)。.claude-plugin/plugin.json讀取與 python 內嵌路徑(resolve-marketplace.sh 硬編 4 個 marketplace,本機實有 33 個 — Phase 0.1 對 88% 的合法 marketplace 誤診為「不存在」 #20)——同 plugin-debug / plugin-deploy 也寫死 plugins/<name> 佈局 (sister concern from #18) #23 範圍,可併入。Type
bug
Expected
上列 MEDIUM 全部修掉、LOW 至少處理 #12/#23/#17/#13/#24 的檔頭;
scripts/test-plugin-update-fences.sh對 Step 5 的 unresolved 分支與 commit/push fence 有覆蓋;resolver 註解與 CHANGELOG 的宣稱與程式一致。Actual
R10 出貨的 SKILL.md:Step 5 對 che-local-plugins 每次都走警告分支並指控未被動到的 plugin;Phase 0.5「stage all + commit」對 che-local-plugins 會 stage 整個 che-claude-config;commit 失敗看起來像成功。
Impact
plugin-update的 git 寫入面。Conflict Class C(與 #19 / #22 同一份skills/plugin-update/SKILL.md),建議序列在 #18 之後、#19 之前或之後由使用者決定。Refs #18(verify R10 findings;PASS 判準 0 HIGH 已達,本 issue 收 MEDIUM/LOW)、#23(plugin-upgrade 半段)。
Source: surfaced during /idd-verify #18 round 10(codex / requirements / logic / regression / devils-advocate lenses)