Skip to content

cluster-PR mode 強制 PR 與 direct-commit path 衝突:override 未文件化且 --no-pr 行為未定義 #96

@kiki830621

Description

@kiki830621

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 永遠生效。

兩個獨立缺陷(無論「要不要強制」的答案是什麼都成立)

  1. Silent + 未文件化的 override
    Fork detection 強制 PR 時會印一行 notice(pr-flow.md:44「repo is a fork → PR path enforced」)。cluster 強制 PR 沒有對等 noticepr-flow.md 的演算法表也沒列這個 carve-out。使用者帶 --no-pr 跑 cluster 時,flag 被無聲吃掉。

  2. --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.mdreferences/batch-and-cluster.mdskills/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

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions