Problem
idd-issue/SKILL.md 的 --blocked-by handler(Step 3.B,三層 fallback)在 #353 修好 Layer 1 的 mutation 之後,同一個 handler 還有以下缺陷。都是既有問題,#353 的兩輪驗證時發現。
Layer 2 的換行是字面上的 \n。 BLOCKED_BLOCKQUOTE="${BLOCKED_BLOCKQUOTE}> Blocked by #${M}\n" 與 NEW_CHILD_BODY="${BLOCKED_BLOCKQUOTE}\n${ORIGINAL_BODY}" 在 bash 雙引號裡不會轉成換行。--blocked-by 50,51 加上內文 ## Problem,用 bash 執行後 od -c 得到的是單一行:
> Blocked by #50\n> Blocked by #51\n\n## Problem
GitHub 會把它整段渲染成一行 blockquote,內文第一個標題被吞進去。這違反 spec「Multiple blocked-by targets」的「child body contains three blockquote lines」。目前實際建立的 issue 第一行是乾淨的,代表執行的 agent 自行修正了,但照字面執行就會壞。
Layer 2 不去重。 references/bundle-flags.md 的 Idempotency Contract 寫「演算法掃 > Blocked by #M 字串先 dedup」,SKILL.md 的 Layer 2 沒有這段。--blocked-by 50,50 會寫兩行,Layer 3 的 parent entry 也會重複列出。
stdout 通道仍被佔用。 bundle 的 orchestration 用 CHILD_NUM=$(create_child_with_parent …) 擷取 child 編號,再把它當下一個 child 的 --blocked-by。idd-issue --blocked-by:GraphQL mutation 名稱錯誤(addBlockedByDependency 不存在,應為 addBlockedBy / blockingIssueId),且失敗訊息誤指原因、原生 dependency 從未建立 #353 已讓 Layer 1 的訊息全走 stderr,但同一條路徑上還有:
Layer 2 的 gh-egress.sh edit:wrapper 最後 exec gh issue edit,會把 issue URL 印到 stdout;
--parent handler 的 echo "→ #… already in parent … skip (idempotent)",以及它對 parent 的 gh-egress.sh edit。
目標編號沒有驗證。 spec 規定每個值是正整數,但 BLOCKED_BY_LIST 與 CHILD_NUM 都沒檢查。for M in $(echo "$BLOCKED_BY_LIST" | tr ',' '\n') 未加引號,會做 word splitting 與 pathname expansion;以 - 開頭的值會被 gh issue view 當成選項(引號內,所以不是 shell injection,是 argument injection)。
node ID 查詢沒有檢查。 Layer 1 先用 gh issue view … --json id 查 child 與每個目標的 node ID,結果沒驗證。目標編號打錯或 gh 暫時失敗時 ID 是空字串,mutation 照送,警告裡印的是 GitHub 對空 ID 的錯誤,而不是「找不到 #M」。
Type
bug
Expected
Impact
--blocked-by 多個目標時 child body 的開頭會壞掉;--bundle-mode ordered 照文件執行時,下一個 child 的 --blocked-by 可能拿到 URL 或訊息而不是編號。
Follow-up from #353 verify
Source : /idd-verify #353 第 1、2 輪(PR #358 )
Problem
idd-issue/SKILL.md的--blocked-byhandler(Step 3.B,三層 fallback)在 #353 修好 Layer 1 的 mutation 之後,同一個 handler 還有以下缺陷。都是既有問題,#353 的兩輪驗證時發現。\n。BLOCKED_BLOCKQUOTE="${BLOCKED_BLOCKQUOTE}> Blocked by #${M}\n"與NEW_CHILD_BODY="${BLOCKED_BLOCKQUOTE}\n${ORIGINAL_BODY}"在 bash 雙引號裡不會轉成換行。--blocked-by 50,51加上內文## Problem,用 bash 執行後od -c得到的是單一行:references/bundle-flags.md的 Idempotency Contract 寫「演算法掃> Blocked by #M字串先 dedup」,SKILL.md 的 Layer 2 沒有這段。--blocked-by 50,50會寫兩行,Layer 3 的 parent entry 也會重複列出。CHILD_NUM=$(create_child_with_parent …)擷取 child 編號,再把它當下一個 child 的--blocked-by。idd-issue --blocked-by:GraphQL mutation 名稱錯誤(addBlockedByDependency 不存在,應為 addBlockedBy / blockingIssueId),且失敗訊息誤指原因、原生 dependency 從未建立 #353 已讓 Layer 1 的訊息全走 stderr,但同一條路徑上還有:gh-egress.sh edit:wrapper 最後exec gh issue edit,會把 issue URL 印到 stdout;--parenthandler 的echo "→ #… already in parent … skip (idempotent)",以及它對 parent 的gh-egress.sh edit。BLOCKED_BY_LIST與CHILD_NUM都沒檢查。for M in $(echo "$BLOCKED_BY_LIST" | tr ',' '\n')未加引號,會做 word splitting 與 pathname expansion;以-開頭的值會被gh issue view當成選項(引號內,所以不是 shell injection,是 argument injection)。gh issue view … --json id查 child 與每個目標的 node ID,結果沒驗證。目標編號打錯或gh暫時失敗時 ID 是空字串,mutation 照送,警告裡印的是 GitHub 對空 ID 的錯誤,而不是「找不到 #M」。Type
bug
Expected
printf或$'\n'),並在寫入前對> Blocked by #M去重--parent、gh-egress.sh edit的輸出)不寫 stdout,或改成不靠 stdout 傳回CHILD_NUMCHILD_NUM都符合^[1-9][0-9]*$,拆分時不做 globbingblocked-by-mutationsuite 做法:把這些片段從 SKILL.md 抽出來以 stubgh實際執行,並附 positive controlreferences/bundle-flags.md的 Idempotency ContractImpact
--blocked-by多個目標時 child body 的開頭會壞掉;--bundle-mode ordered照文件執行時,下一個 child 的--blocked-by可能拿到 URL 或訊息而不是編號。Source:
/idd-verify #353第 1、2 輪(PR #358)