fix(implement): 工作包 PR 閘門改為只檢查候選工作包自身相依,並修正平行工作包共用 worktree 路徑衝突

This commit is contained in:
2026-08-26 17:59:08 +08:00
parent 41bcbf0f1c
commit 87d73034c5
5 changed files with 150 additions and 30 deletions
+9 -6
View File
@@ -77,12 +77,13 @@ SDLC 各階段引用的參考分支與來源分支,**一律指遠端的 `origi
### 路徑
```
{cwd}/.worktree/{analysis-HASH}/{repo}
{cwd}/.worktree/{analysis-HASH}/{wp-number}/{repo}
```
- `{analysis-HASH}`:`ANALYZE_{HASH}` 的 HASH 部分,不含 `ANALYZE_` 前綴。
- `{wp-number}`:這次要做的工作包編號(例如 `WP-06`)。**一定要有這一層**:同一份分析常有好幾個互不相依的工作包平行進行,路徑少了這一層,兩個工作包會搶同一個目錄——第二個到的會被「目標路徑已存在」擋下,因為它不是同一份工作的 worktree。
- `{repo}`:存取庫名稱,不含 owner(`HP/WebService.Buy` → `WebService.Buy`)。不同 owner 的同名存取庫同時出現時,才改用 `{owner}-{repo}` 避免蓋掉,並在輸出中說明。
- 一份分析涉及多個存取庫時,每個存取庫各一個 worktree,並列在同一個 HASH 目錄下。
- 一份分析涉及多個存取庫時,每個存取庫各一個 worktree,並列在同一個 `{wp-number}` 目錄下。
### 建立前先問分支怎麼處理
@@ -114,16 +115,18 @@ SDLC 各階段引用的參考分支與來源分支,**一律指遠端的 `origi
- worktree 內還有未提交變更時**不移除**,回報並停止——那些變更沒有進 PR,移除等於丟掉。
- 同一份分析的多個 worktree 全部移除後,若 `.worktree/{HASH}/` 已空就一併刪掉那層目錄。
### PR 未合併就不開下一個工作包
### 一個工作包的 PR 沒合併,擋的是相依於它的包,不是整份分析
一個工作包的 PR 還沒合併,就不得開始下一包。修正一律回原 worktree、推同一條工作分支,**不為同一包開第二個 PR**。
一個工作包的 PR 還沒合併,這一包就沒結清:修正一律回原 worktree、推同一條工作分支,**不為同一包開第二個 PR**。
但「這一包沒結清」不等於「不得開始下一包」——SDLC 實作可能有好幾個互不相依的工作包平行進行,各自的 worktree、各自的 PR。真正被擋住的只有**相依於它的**工作包;跟它無關的工作包不受影響,可以另開一個工作階段(或另一個 worktree)同時進行。
這條規則在程式層強制,不靠內文自律,分工是兩層:
| 層 | 誰執行 | 做什麼 |
| --- | --- | --- |
| 工具閘門 | `tools/wp-gate.sh` | 唯一去問 Gitea 的一方,也是唯一有權解鎖的一方。`check` 查合併狀態、印出全部留言、印 `latest=` 時間戳;`lock` 在 PR 開好後記下未結清。結束碼 0 放行、1 擋住、2 用法錯誤、3 查不到(查不到就擋,不放行) |
| hook 提醒 | `jsc-hooks` 的 `sdlc-gate.sh wp-check` | 只讀 `$JSC_HOME/wp/` 的狀態檔,不打網路。`prompt` 模式注入提醒但**不擋提示**;`skill` 模式擋掉 `plan`、`analyze`、`maintain`,放行 `implement`——擋住的是「跳去做別的階段」,不是「回來把這一包做完」 |
| 工具閘門 | `tools/wp-gate.sh` | 唯一去問 Gitea 的一方,也是唯一有權解鎖的一方。`check` 查合併狀態、印出全部留言、印 `latest=` 時間戳,只管那一支 PR 自己;`check-deps` 查某個候選工作包能不能挑,活抓分析頁的相依欄逐一核對;`lock` 在 PR 開好後記下未結清(一個工作包一支鎖檔)。結束碼 0 放行、1 擋住、2 用法錯誤、3 查不到(查不到就擋,不放行) |
| hook 提醒 | `jsc-hooks` 的 `sdlc-gate.sh wp-check` | 只讀 `$JSC_HOME/wp/` 的狀態檔,不打網路。`prompt` 模式注入提醒但**不擋提示**;`skill` 模式擋掉 `plan`、`analyze`、`maintain`,放行 `implement`——擋住的是「跳去做別的階段」,不是「回來把這一包做完」。這一層是整個存取庫共用的粗粒度提醒,不是逐工作包判斷,細粒度的相依判斷交給 `check-deps` |
狀態檔不綁 session:PR 沒合併就是沒合併,開新對話照樣擋。