Skip to content

idd-issue --blocked-by:GraphQL mutation 名稱錯誤(addBlockedByDependency 不存在,應為 addBlockedBy / blockingIssueId),且失敗訊息誤指原因、原生 dependency 從未建立 #353

Description

@kiki830621

Problem

Original text:
「兩張 issue 都開」
— Source: 使用者,2026-09-24(+08:00)對話——同意開「idd-issue 的 GraphQL mutation 名稱錯誤」這張 issue

idd-issue 的 --blocked-by 三層 fallback 中,Layer 1(GitHub 原生 dependency)用的 mutation 在 GitHub GraphQL schema 裡不存在:

mutation($i:ID!,$b:ID!){addBlockedByDependency(input:{issueId:$i,blockedByIssueId:$b}){issue{id}}}

實際名稱(2026-09-24 introspection 查證):

$ gh api graphql -f query='{__schema{mutationType{fields{name}}}}' --jq '...name' | grep -i block
addBlockedBy
removeBlockedBy
$ gh api graphql -f query='{__type(name:"AddBlockedByInput"){inputFields{name}}}'
clientMutationId / issueId / blockingIssueId

正確寫法:

mutation($i:ID!,$b:ID!){addBlockedBy(input:{issueId:$i,blockingIssueId:$b}){issue{number}}}

照文件原樣執行的回應是 Variable $b is declared by anonymous mutation but not used;改用 addBlockedBy 後在 PsychQuant/Akashic-Library#620、#621 實測成功(原生 blocked-by 已建立)。

Type

bug

為什麼一直沒被發現(安靜的失敗)

SKILL.md 的呼叫是 if ! gh api graphql … 2>/dev/null; then echo "⚠ … failed (repo not enabled / API error / permission); body blockquote already in place":

  • 2>/dev/null 吞掉了 GraphQL 的錯誤訊息;
  • 失敗訊息把原因歸給「repo 沒啟用/API 錯誤/權限」——三個都不是真因,讀的人會以為是環境問題;
  • Layer 2(body blockquote)照樣成功,所以結果看起來「大致可用」。

依 CHANGELOG,這條 fallback 自 v2.52.0(#21)起就在;原生 dependency 很可能從未成功建立過。

受影響檔案(v3.1.0 原始碼)

  • plugins/issue-driven-dev/skills/idd-issue/SKILL.md(第 110、772、774 行附近:TaskCreate 描述、mutation、失敗訊息)
  • plugins/issue-driven-dev/references/bundle-flags.md(Fallback Chain 段)
  • README.md、CHANGELOG.md 的相關敘述

Expected

  1. mutation 改為 addBlockedBy(input:{issueId, blockingIssueId})
  2. 失敗時印出 GraphQL 回傳的錯誤,不要吞掉、不要猜原因
  3. 加一個會打到真 schema 的檢查(或至少 introspection 斷言 mutation 名稱存在),讓 schema 改名時會被發現,而不是安靜地退回 Layer 2

Actual

Layer 1 永遠失敗,訊息誤導;只有 Layer 2 的 body blockquote 生效。

Impact

--blocked-by 與 --bundle-mode ordered 建的依賴在 GitHub UI 上沒有原生的 blocked 標示與側欄關聯,只剩內文一行註記。


Current Status

Phase: verified
Last updated: 2026-10-02 by idd-verify(經 /idd-all,PR unattended)
Dashboard: #353 (comment)
Verify: #353 (comment)

Key Decisions

  • 驗證 2 輪 PASS、0 blocking;follow-up [bug] idd-issue --blocked-by handler:Layer 2 字面 \n、不去重、stdout 被佔用、目標編號與 node ID 未檢查 (follow-up from #353 verify) #359–[bug] SKILL.md 程式碼裡的 $0/$1/$2 會被 skill 參數替換改掉 (follow-up from #353 verify) #362;verified tag idd-353-verified = 68779cc
  • 「已存在」只比對整句 Target issue has already been taken,並印出該句作依據;其他 has already been taken 照常警告(取代下方第 6 條的寬鬆寫法)
  • Layer 1 訊息全走 stderr(bundle 用 CHILD_NUM=$(…) 擷取 stdout);node ID 用 -f 傳
  • live schema 檢查另由每週 workflow live-schema.yml 執行(週一 09:00 臺北時間+手動;merge 後才會跑)
  • 主規格的直接修改超出診斷原訂界線(多了已存在判定與 stderr 兩條 SHALL),決定保留在主規格,理由見驗證報告
  • Layer 1 改用 addBlockedBy(issueId, blockingIssueId),GitHub 錯誤原樣印出;already been taken 視為已存在(實測)(比對已收窄,見上)
  • 根因:mutation 與欄位名稱都不在現行 schema,且規格條文寫了同一錯名
  • Complexity = Simple(現行帶錯名的檔案 4 個 < 5,呼叫點單一)
  • 測試採離線守衛為主,真 schema introspection 做成 opt-in(repo 測試皆不打網路)
  • 直接更正 openspec/specs/idd-issue-bundle/spec.md(先例 a4f0723、e6cd7da),不動 archive

Scope Changes

Blocking

Commits

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

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