docs(sdlc): 參考文件與 README 同步階梯、工作包隔離與日誌粒度
What:`references/branch.md` 新增「分支階梯與 base 推導」一節(只寫拿到 `jsc-git/tools/base-branch.sh --derive` 回應之後要做什麼)與「工作包隔離」一節(歸屬依據、狀態檔欄位、誰寫誰讀、查無歸屬放行、逃生門),閘門分工那一表補上 `claim`、`lock`、`owns`。`references/stage-report.md` 改寫暫存那一節,講明本節只適用於「還沒完成任何任務就停下」的階段。README 的工具表、`implement` 與 `maintain` 兩段說明、參考文件表與相依技能清單同步更新。 Why:階梯表與歸屬狀態檔的正本各有其處——階梯在 `jsc-meta` 的 `references/guidelines.md`,狀態檔格式在 `jsc-hooks`。抄第二份就會有兩份互相打架的規則,但完全不提又會讓實作階段不知道拿到 `7` 或「已建立功能主幹」時該做什麼。 How:兩節都只寫本階段要做的事,並把唯一來源用連結指出去。`branch.md` 的階梯那一節寫成一張「腳本回應 → 這個階段要做的事」對照表,`7` 明寫成「中止並問使用者,不退回 `develop`」。`stage-report.md` 補一句「暫存不等於已寫入」,因為日誌改成一個任務一筆之後,做完事情的階段本來就有日誌可連。 Who:讀 `jsc-sdlc` 參考文件與 README 的人,以及跑實作與維護兩階段的工作階段。
This commit is contained in:
+27
-3
@@ -60,6 +60,17 @@ SDLC 各階段引用的參考分支與來源分支,**一律指遠端的 `origi
|
||||
- 需要換分支才能讀到正確現況時,**停下來請使用者自己切換**。
|
||||
- 不代為 `switch`、不 `stash`、不動工作區、不建分支。
|
||||
|
||||
## 分支階梯與 base 推導
|
||||
|
||||
階梯表本身(哪一種類型往上接哪一條、`{子功能}` 怎麼組、base 為什麼一律由 `jsc-git/tools/base-branch.sh --derive` 推導)的唯一來源,在 `jsc-meta` 的 [`references/guidelines.md`](https://gitea.jsc.idv.tw/plugins/meta/src/branch/develop/references/guidelines.md)「PR 分支階梯」那一節。本檔不抄第二份,只寫 sdlc 拿到腳本回應之後要做什麼:
|
||||
|
||||
| 腳本回應 | 這個階段要做的事 |
|
||||
| --- | --- |
|
||||
| 印出一條分支名(結束碼 `0`) | 拿它當 `jsc-git:pr` 的 base,不再自行改判 |
|
||||
| 結束碼 `7`(推不出唯一合法基底) | **中止並問使用者**,不退回 `develop`——退回 `develop` 就是讓子功能越級直接進主線 |
|
||||
| stderr 印出「已建立功能主幹」 | 在階段回報裡講明建了哪一條主幹,那是這次實作多長出來的一條分支 |
|
||||
| 結束碼 `2`(分支名含非 ASCII) | 先把中文簡述翻成英文短語,過 `jsc-git/tools/slugify.sh {類型} {英文短語}` 再重組分支名 |
|
||||
|
||||
## 實作階段的分支選擇
|
||||
|
||||
實作在 worktree 內進行,工作分支從 `origin/{source-branch}` 長出來,做完再 PR 回同一條來源分支。
|
||||
@@ -125,12 +136,25 @@ SDLC 各階段引用的參考分支與來源分支,**一律指遠端的 `origi
|
||||
|
||||
| 層 | 誰執行 | 做什麼 |
|
||||
| --- | --- | --- |
|
||||
| 工具閘門 | `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` |
|
||||
| 工具閘門 | `tools/wp-gate.sh` | 唯一去問 Gitea 的一方,也是唯一有權解鎖的一方。`check` 查合併狀態、印出全部留言、印 `latest=` 時間戳,只管那一支 PR 自己;`check-deps` 查某個候選工作包能不能挑,活抓分析頁的相依欄逐一核對;`claim` 在領包當下登錄歸屬;`lock` 在 PR 開好後記下未結清並把 PR 掛到工作包名下;`owns` 比對某支 PR 是不是自己這一包的。狀態檔的寫入一律轉呼叫 `sdlc-gate.sh`。結束碼 0 放行、1 擋住、2 用法錯誤、3 查不到(查不到就擋,不放行) |
|
||||
| hook 提醒 | `jsc-hooks` 的 `sdlc-gate.sh wp-check` | 只讀 `$JSC_HOME/wp/` 的狀態檔,不打網路。`prompt` 模式注入提醒但**不擋提示**;`skill` 模式擋掉 `plan`、`analyze`、`maintain`,放行 `implement`——擋住的是「跳去做別的階段」,不是「回來把這一包做完」。這一層是整個存取庫共用的粗粒度提醒,不是逐工作包判斷,細粒度的相依判斷交給 `check-deps`,歸屬比對交給 `owns` |
|
||||
|
||||
狀態檔不綁 session:PR 沒合併就是沒合併,開新對話照樣擋。
|
||||
|
||||
查驗程序的細節(何時帶 `--since`、留言逐筆的處理結果、修不動的留言怎麼辦、時間戳寫回哪裡)由 `skills/implement/SKILL.md` 步驟 4 擁有,本檔不重複。
|
||||
### 工作包隔離:一個工作階段只碰自己領的那一包
|
||||
|
||||
同一份分析常有好幾包平行進行,每包各自的 worktree 與 PR。動任何一支 PR 之前先確認它是自己這一包的,靠的是狀態檔而不是記憶——記憶跨不了工作階段。
|
||||
|
||||
| 項目 | 規則 |
|
||||
| --- | --- |
|
||||
| 歸屬依據 | **分析頁上的工作包代號**。不看分支名、不看 worktree 目錄名,那兩個都可能被改,改了也沒有徵兆。`WP-03`、`WP-3`、`3` 視為同一包 |
|
||||
| 狀態檔 | 領取檔 `$JSC_HOME/wp/{owner}-{repo}.claim`(欄位 `repo`、`wp`、`pr`、`analyze`、`claimed`,一個存取庫一支)與鎖檔 `$JSC_HOME/wp/{owner}-{repo}-{index}.pr`(欄位 `repo`、`index`、`wp`、`locked`)。兩者都是純文字 key=value,一行一欄 |
|
||||
| 誰寫 | 只有 `jsc-hooks` 的 `sdlc-gate.sh`:領包時 `wp-claim`、開完 PR 時 `wp-lock` 的第四個參數帶工作包代號、結清或交回時 `wp-unclaim` 與 `wp-unlock`。`wp-gate.sh` 一律轉呼叫,**不自己拼檔案**——兩邊各拼各的,格式一改就對不上,而且誰寫壞了看不出來 |
|
||||
| 誰讀 | `wp-gate.sh owns` 與 `sdlc-gate.sh wp-check`,兩邊都只讀不改 |
|
||||
| 查無歸屬 | **放行只提醒**:沒有分析頁、查不到工作包代號、領取檔不存在、工作包還沒掛上 PR,一律 `status=unowned` 並 exit 0。這跟「查不到就擋」不衝突——那條講的是查得到卻查失敗,這條講的是根本還沒有歸屬可查,拿不存在的歸屬擋人會讓沒登錄過的工作包全部動不了 |
|
||||
| 逃生門 | `JSC_WP_GATE=off`,由 hook 那一層認 |
|
||||
|
||||
查驗程序的細節(何時帶 `--since`、怎麼等 PR 合併、留言逐筆的處理結果、修不動的留言怎麼辦、時間戳寫回哪裡)由 `skills/implement/SKILL.md` 步驟 4 與步驟 11 擁有,本檔不重複。
|
||||
|
||||
## 不破壞既有工作
|
||||
|
||||
|
||||
Reference in New Issue
Block a user