Problem
Original text:
「「Cluster → 1 PR」跟「direct-commit」直接衝突 — cluster-PR mode 強制開 PR(idd-implement 明文「不接受 --no-pr」),direct-commit 則不開 PR。我需要你定一個:這樣真的好嗎?要強制 PR 嗎」
— Source: 使用者於 /idd-issue 提出
IDD 有兩條互斥的 PR 路徑決策,在 cluster 情境下直接衝突,且衝突的解法目前未文件化、行為未定義。
衝突點
| 來源 |
規則 |
references/pr-flow.md:22 |
--no-pr flag → direct-commit path(無條件,path-resolution 演算法權威表) |
references/pr-flow.md:25 |
pr_policy: "never" → direct-commit path |
skills/idd-implement/SKILL.md:49 |
「Cluster-PR mode 強制 PR path(不接受 --no-pr)」 |
references/batch-and-cluster.md:133 |
「Cluster-PR mode always uses PR path; never direct-commit」 |
pr-flow.md 是 path resolution 的 canonical 演算法(line 22–26 的優先序表),但它完全沒提 cluster 例外。例外散落在另外兩個檔案。一個照 pr-flow.md 讀的人會認定 --no-pr 永遠生效。
兩個獨立缺陷(無論「要不要強制」的答案是什麼都成立)
-
Silent + 未文件化的 override
Fork detection 強制 PR 時會印一行 notice(pr-flow.md:44「repo is a fork → PR path enforced」)。cluster 強制 PR 沒有對等 notice,pr-flow.md 的演算法表也沒列這個 carve-out。使用者帶 --no-pr 跑 cluster 時,flag 被無聲吃掉。
-
--no-pr 撞上 cluster 的行為「未定義」
idd-implement/SKILL.md:49 只說「不接受」。不接受 = abort?= 印警告後忽略?= 靜默忽略?skill 沒寫,三種都可能,實作會漂移。
設計問題本身:強制是否正確?
batch-and-cluster.md:133 給的理由是「cluster on direct-commit = stacked half-isolated changes on default branch」。但 direct-commit path 實際語意是「commit 到 current branch」(idd-implement Phase 0.5:stay on current branch),不必然是 default branch。若使用者本來就在一條 feature branch 上,cluster direct-commit 就是 N 個 issue 的 commit 落在那條 branch — 未必是「污染 default branch」。理由部分成立、但被誇大。
候選解法(待 diagnose 決定,此處僅列出不預判):
- A. 維持強制,但改為「明示 + 一致」 — cluster 一律 PR;遇到
--no-pr / pr_policy:never 時印 explicit override notice(比照 fork detection),並把這個 carve-out 補進 pr-flow.md 的演算法表。改動最小。
- B. cluster 容許
--no-pr — 降級為「1 條共用 branch + N 個 Refs #N commit、不開 PR」。verify 端有 /idd-verify --branch / --commits 可覆蓋。尊重 direct-commit 使用者。
- C. 問 — cluster + direct-commit policy →
AskUserQuestion 確認,不靜默。
Type
refactor(既有行為的一致性 / 文件契約缺陷;非新功能)
Expected
cluster 與 single-issue 的 PR 路徑決策有單一、文件化、行為明確的契約:
pr-flow.md 的 path-resolution 演算法是唯一 source of truth,cluster 例外(若保留)必須列在表內。
- 任何 override(fork / cluster)都印出 explicit notice,比照 fork detection 既有作法。
--no-pr 撞 cluster 的結果是明確指定的單一行為(abort 或 degrade 或 ask),不是「未定義」。
Actual
pr-flow.md 演算法表說 --no-pr 無條件生效;idd-implement.md:49 + batch-and-cluster.md:133 說 cluster 推翻它 — 三檔互相矛盾。
- cluster 強制 PR 無 notice、無文件。
--no-pr + cluster 的行為(abort / 忽略 / 詢問)未在任何 skill 指定。
Impact
- 影響的檔案:
references/pr-flow.md、references/batch-and-cluster.md、skills/idd-implement/SKILL.md(可能含 idd-all / idd-plan 的 cluster 路徑)。
- 影響的使用者流程:
pr_policy: "never" 或習慣 --no-pr 的使用者,一旦把多個 issue number 丟進 idd-implement 就會拿到出乎意料的 forced-PR,且看不到原因。
- 影響 IDD 自身的文件可信度:canonical 演算法檔(
pr-flow.md)與實際行為不符。
Notes
由 PR #94(auto-close-trap cluster)的工作過程中浮現 — 該 cluster 走 --pr,使用者注意到若改 direct-commit 偏好會與 cluster 強制 PR 衝突。
Current Status
Phase: closed
Complexity
Plan — user picked Option A in /idd-all session.
Next
Done. PR #99 merged (squash b7f72ff). Follow-up #100 tracks 2 non-blocking deferred items.
History
Problem
IDD 有兩條互斥的 PR 路徑決策,在 cluster 情境下直接衝突,且衝突的解法目前未文件化、行為未定義。
衝突點
references/pr-flow.md:22--no-prflag → direct-commit path(無條件,path-resolution 演算法權威表)references/pr-flow.md:25pr_policy: "never"→ direct-commit pathskills/idd-implement/SKILL.md:49--no-pr)」references/batch-and-cluster.md:133pr-flow.md是 path resolution 的 canonical 演算法(line 22–26 的優先序表),但它完全沒提 cluster 例外。例外散落在另外兩個檔案。一個照pr-flow.md讀的人會認定--no-pr永遠生效。兩個獨立缺陷(無論「要不要強制」的答案是什麼都成立)
Silent + 未文件化的 override
Fork detection 強制 PR 時會印一行 notice(
pr-flow.md:44「repo is a fork → PR path enforced」)。cluster 強制 PR 沒有對等 notice,pr-flow.md的演算法表也沒列這個 carve-out。使用者帶--no-pr跑 cluster 時,flag 被無聲吃掉。--no-pr撞上 cluster 的行為「未定義」idd-implement/SKILL.md:49只說「不接受」。不接受 = abort?= 印警告後忽略?= 靜默忽略?skill 沒寫,三種都可能,實作會漂移。設計問題本身:強制是否正確?
batch-and-cluster.md:133給的理由是「cluster on direct-commit = stacked half-isolated changes on default branch」。但 direct-commit path 實際語意是「commit 到 current branch」(idd-implementPhase 0.5:stay on current branch),不必然是 default branch。若使用者本來就在一條 feature branch 上,cluster direct-commit 就是 N 個 issue 的 commit 落在那條 branch — 未必是「污染 default branch」。理由部分成立、但被誇大。候選解法(待 diagnose 決定,此處僅列出不預判):
--no-pr/pr_policy:never時印 explicit override notice(比照 fork detection),並把這個 carve-out 補進pr-flow.md的演算法表。改動最小。--no-pr— 降級為「1 條共用 branch + N 個Refs #Ncommit、不開 PR」。verify 端有/idd-verify --branch/--commits可覆蓋。尊重 direct-commit 使用者。AskUserQuestion確認,不靜默。Type
refactor(既有行為的一致性 / 文件契約缺陷;非新功能)
Expected
cluster 與 single-issue 的 PR 路徑決策有單一、文件化、行為明確的契約:
pr-flow.md的 path-resolution 演算法是唯一 source of truth,cluster 例外(若保留)必須列在表內。--no-pr撞 cluster 的結果是明確指定的單一行為(abort 或 degrade 或 ask),不是「未定義」。Actual
pr-flow.md演算法表說--no-pr無條件生效;idd-implement.md:49+batch-and-cluster.md:133說 cluster 推翻它 — 三檔互相矛盾。--no-pr+ cluster 的行為(abort / 忽略 / 詢問)未在任何 skill 指定。Impact
references/pr-flow.md、references/batch-and-cluster.md、skills/idd-implement/SKILL.md(可能含idd-all/idd-plan的 cluster 路徑)。pr_policy: "never"或習慣--no-pr的使用者,一旦把多個 issue number 丟進idd-implement就會拿到出乎意料的 forced-PR,且看不到原因。pr-flow.md)與實際行為不符。Notes
由 PR #94(auto-close-trap cluster)的工作過程中浮現 — 該 cluster 走
--pr,使用者注意到若改 direct-commit 偏好會與 cluster 強制 PR 衝突。Current Status
Phase: closed
Complexity
Plan — user picked Option A in
/idd-allsession.Next
Done. PR #99 merged (squash
b7f72ff). Follow-up #100 tracks 2 non-blocking deferred items.History
/idd-issue(manual fill)