Files
sdlc/references/behaviors.md
jiantw83 4b482aefc5 docs(behaviors): 新增四支技能的行為清單
What:
- 在既有的 `references/` 目錄下新增 `references/behaviors.md`。
- 分成 analyze、implement、maintain、plan 四節,對上 `skills/` 下的四支技能。
- 每節一張五列表:觸發時機、關鍵步驟、外部呼叫、完成條件、可驗證跡象。

Why:
- 技能驗證需要一份共同的參考基準。
- 基準留在文件裡,驗證就不必靠人腦記憶技能該有的行為。
- 清單放在技能自己的存取庫,技能改動與清單才會落在同一個 PR。
- 同一個 PR 就不會漂移,也不用跨存取庫開兩條 PR 互卡。

How:
- 逐支技能讀 SKILL.md,抽出行為填進五列表。
- 稽核時修正三列:analyze、plan、maintain 的階段鎖狀態檔原本寫成 `$JSC_HOME/wp/`。
- 三列改成實際路徑 `$JSC_HOME/sessions/{工作階段 id}.stage`。
- `$JSC_HOME/wp/` 只留給 implement 的工作包領取檔與 PR 鎖檔。
- 用 `sh /root/plugins/meta/tools/check-behaviors.sh /root/plugins/sdlc` 驗格式,退出碼 0。

Who:
- 使用 jsc-sdlc 四支技能的開發者。
- 執行技能驗證的 jsc-meta:skill-check。
- 日後異動這四支技能的維護者,要同步更新這一頁。
2026-08-31 13:49:26 +08:00

11 KiB
Raw Permalink Blame History

jsc-sdlc 技能行為清單

本頁記錄 jsc-sdlc 每支技能的行為基準,供技能驗證比對。技能異動時,在同一個 PR 內一起更新這一頁。

analyze

項目 內容
觸發時機 計畫已經寫進 PLAN_CONTENTS、狀態是「未分析」,要把它拆成工作包時用。也用於延伸既有的 ANALYZE_{HASH} 分析頁。要寫程式碼時不用,那是 implement。PLAN_CONTENTS 還沒有計畫時不用,先跑 plan。
關鍵步驟 跑 model-tags.sh sync 與 sdlc-gate.sh lock analyze 過模型閘門,本階段要 reasoning-max 標籤、並行讀 PLAN_CONTENTS 與 ANALYZE_CONTENTS、讓使用者選延伸既有分析或分析新計畫、跑 git fetch --prune origin 後確認來源分支,並核對 HEAD 與 origin/{source-branch} 指到同一個 commit,有落差就停下回報、逐則使用者故事問到共識、先查 REPO_{HASH} 盤點頁決定複用,資料過期就開 sub agent 重新盤點並回寫 REPO_{HASH} 與 REPO_CONTENTS、做 WBS 拆工作包並標相依,交付工作包固定編為 WP-01 且獨立不併入實作包、用 CPM 估工時與天數,標出要徑並依 references/cpm-chart.md 畫 mermaid 甘特圖、寫使用者故事驗收計畫,再逐包寫 TDD 待辦、一次寫入 ANALYZE_{HASH},並把 ANALYZE_CONTENTS 與 PLAN_CONTENTS 各自單列 upsert、跑 tools/stage-report.sh analyze 收尾回報。
外部呼叫 jsc-cli/tools/model-tags.sh sync、jsc-hooks/hooks/sdlc-gate.sh lock、jsc-hooks/hooks/write-guard.sh(claude 的 PreToolUse 擋寫入)、jsc-gitea:wiki 與 jsc-gitea/tools/hash-id、jsc-ask:ask、tools/stage-report.sh、git fetch --prune origin、git branch -r、git rev-list --left-right --count。
完成條件 模型閘門退出 0 並回報實際模型 id、來源分支經使用者確認且與遠端一致、每則使用者故事達成共識、每個複用決策連理由記進「複用決策」欄、每則故事對應至少一個編號工作包、每包有工時與天數、要徑與甘特圖齊備、每個實作包至少一則測試先行的 [ ] 待辦、ANALYZE_{HASH} 存進 wiki 且未決項欄有值(沒有就寫「無」)、目錄頁依 wiki-get 退出碼 0 與 4 分流寫入、stage-report.sh 的輸出原樣貼給使用者。提前停下也要跑收尾回報。
可驗證跡象 wiki 上多一頁或更新一頁 ANALYZE_{HASH};ANALYZE_CONTENTS 多一列該分析;PLAN_CONTENTS 該計畫那列狀態變成「已分析」;重新盤點時另外寫入 REPO_{HASH} 與 REPO_CONTENTS 一列;$JSC_HOME/sessions/{工作階段 id}.stage 是 sdlc-gate.sh lock 寫的階段鎖狀態檔;還沒有工作日誌時,$JSC_HOME/worklog-pending/{HASH}/ 下有暫存的日誌內容檔。工作目錄的檔案一律不動,程式碼沒有任何改動。

implement

項目 內容
觸發時機 分析頁已經有工作包與 TDD 待辦,要動手寫程式碼時用。也用於回頭處理既有工作包 PR 的留言。規劃或分析階段不用。ANALYZE_CONTENTS 沒有未完成分析頁時不用。
關鍵步驟 跑 model-tags.sh sync 與 sdlc-gate.sh lock implement 過模型閘門,本階段要 coding 標籤、讀 ANALYZE_CONTENTS 與每一頁未完成分析頁,這份資料後續步驟重用不再讀第二次、對每支未合併 PR 並行跑 wp-gate.sh check 取狀態與留言、動任何 PR 之前先跑 wp-gate.sh owns 確認歸屬,foreign 就放手、每則留言先經 jsc-ask:ask 取得共識,再由 sub agent 在同一個 worktree 內修、推同一條工作分支、逐則留言用 gitea.sh comment-reply 回覆處置結果,把 latest= 時間寫回分析頁 PR 欄、一輪留言修正算一個任務,當下寫一筆 jsc-log:worklog、列出可挑的工作包,每個候選並行跑 wp-gate.sh check-deps 過相依閘門,只有 ready 進選項、使用者挑定後跑 wp-gate.sh claim 登錄歸屬、確認來源分支,它同時是 worktree 基準與 PR 目標,遠端找不到就停下回報、產生 TICKET_{yyyyMMdd}_{HHmmss}_{HASH} 工作證並寫回分析頁「工作證」欄,同時改工作階段名稱、交付包先問交付內容型別並寫回「交付型別」欄、git fetch --prune origin 後從 origin/{source-branch} 建 worktree,多存取庫並行建、逐項待辦各開一個 sub agent 跑 TDD,主代理每完成一項就把 [ ] 翻成 [x] 並存回 wiki、收尾並行跑 jsc-review:code-review 與 jsc-review:api-doc,後者先用 swagger-detect.sh 判定,退出碼 1 就明確略過並回報、跑 jsc-git:pr 開 PR 回來源分支,把 PR 連結寫回分析頁,再跑 wp-gate.sh lock 上鎖、寫一筆工作日誌,接著用 pr-watch.sh 輪詢等合併,退出碼 10 就回頭跑同一套留言處理、合併後移除 worktree 並把工作包標為完成、問交付格式並產出 DELIVER_{HASH} wiki 頁或 Gitea issue 留言、問要不要登錄維護並 upsert MAINTAIN_CONTENTS、跑 tools/stage-report.sh implement 收尾回報。
外部呼叫 jsc-cli/tools/model-tags.sh sync、jsc-hooks/hooks/sdlc-gate.sh lock、tools/wp-gate.sh 的 check、check-deps、claim、lock、owns、tools/stage-report.sh、jsc-gitea:wiki、jsc-gitea/tools/hash-id、jsc-gitea/tools/gitea.sh(comment-reply 與 issue 留言 API)、jsc-gitea/tools/pr-watch.sh、jsc-ask:ask、jsc-review:code-review、jsc-review:api-doc、jsc-review/tools/swagger-detect.sh、jsc-hooks/hooks/comment-scope.sh、jsc-git:commit、jsc-git:pr、jsc-log:worklog、git fetch、git worktree。
完成條件 模型閘門退出 0、每支未合併 PR 的留言都有處置與回覆、挑中的工作包經 check-deps 判為 ready 並 claim 成功、來源分支經確認並記進分析頁、工作證寫上 wiki、該包每一項待辦在 wiki 上都是 [x]、兩個收尾稽核都放行(api-doc 回報略過也算放行)、PR 開好且 wp-gate.sh lock 回 status=locked、工作日誌已寫、pr-watch.sh 退出 0 且 wp-gate.sh check 回 status=merged、交付文件已產出、維護登錄問題已回答、stage-report.sh 的輸出原樣貼出並列出 worktree 與三條分支。提前停下也要跑收尾回報。
可驗證跡象 開出一條工作分支,並有一支回到來源分支的 PR;分析頁 ANALYZE_{HASH} 的「工作證」欄、「交付型別」欄、PR 欄、待辦勾選狀態都更新過;DELIVER_{HASH} wiki 頁或該 issue 下多一則留言;DELIVER_CONTENTS 多一列;使用者同意登錄時 MAINTAIN_CONTENTS 多一列;LOG_{HASH} 每完成一個任務多一筆條目;$JSC_HOME/wp/{owner}-{repo}.claim 與 $JSC_HOME/wp/{owner}-{repo}-{index}.pr 兩個狀態檔;{cwd}/.worktree/{分析-HASH}/{工作包編號}/{repo} 目錄,PR 合併後被移除;該存取庫 .git/info/exclude 多一筆 .worktree/;PR 每則留言底下有回覆。

maintain

項目 內容
觸發時機 已交付、且已登錄在 MAINTAIN_CONTENTS 的專案要做定期保養時用。還在實作中的專案不用。沒有登錄進 MAINTAIN_CONTENTS 的專案不用。
關鍵步驟 跑 model-tags.sh sync 與 sdlc-gate.sh lock maintain 過模型閘門,本階段不要求特定標籤,只要判定得出實際模型 id、讀 MAINTAIN_CONTENTS,篩出還在維護期內的專案(起始日不晚於今天,結束日為空或不早於今天)、主代理先並行對每個專案跑 git fetch --prune origin,切到維護分支並與 origin/{branch} 對齊,有落差就回報並略過該專案、之後一個專案一個專案跑,每個專案的維護都開一個 sub agent、每個專案提出至少五項維護做法給使用者挑、把改動用 jsc-git:commit 提交到新分支,推送後用 jsc-git:pr 開 PR 回步驟 3.1 那條分支、PR 開好當下寫一筆 jsc-log:worklog、把該專案在 MAINTAIN_CONTENTS 的「前次維護時間」更新成今天、主代理彙整每個專案的做法、PR 表格列與失敗原因、跑 tools/stage-report.sh maintain 收尾回報。
外部呼叫 jsc-cli/tools/model-tags.sh sync、jsc-hooks/hooks/sdlc-gate.sh lock、jsc-gitea:wiki、jsc-ask:ask、jsc-git:commit、jsc-git:pr、jsc-log:worklog、jsc-pkg:pkg-update(選了套件更新才用)、jsc-hooks/hooks/comment-scope.sh、tools/stage-report.sh、git fetch --prune origin。
完成條件 模型閘門退出 0、步驟 2 列出的每個在期專案都跑完自己的 sub agent,各自收在一條 PR 連結或一個記錄下來的略過原因、每個完成的專案都有一筆工作日誌,而且下一個專案開始前就存好、MAINTAIN_CONTENTS 該專案的「前次維護時間」是今天,其他專案那幾列一個位元組都沒變、彙整報告涵蓋每個專案、stage-report.sh 的輸出原樣貼給使用者。沒有專案在期時,一樣要跑收尾回報。
可驗證跡象 每個維護過的專案多一條新分支與一支回到 develop 或 master 的 PR;MAINTAIN_CONTENTS 對應那列的「前次維護時間」變成今天;LOG_{HASH} 每個完成的專案多一筆條目;$JSC_HOME/sessions/{工作階段 id}.stage 是 sdlc-gate.sh lock 寫的階段鎖狀態檔;一個專案都沒完成時,$JSC_HOME/worklog-pending/{HASH}/ 下有暫存的日誌內容檔。

plan

項目 內容
觸發時機 使用者要開新計畫、或要補強既有計畫時用。做分析或寫程式碼時不用。
關鍵步驟 跑 model-tags.sh sync 與 sdlc-gate.sh lock plan 過模型閘門,本階段要 reasoning-max 標籤、讀 PLAN_CONTENTS,列出狀態為「未分析」的計畫與各自的 HASH、讓使用者選延伸既有計畫或建立新計畫、依 references/consensus.md 跑決策樹,把目標、範圍、可行性三項問到共識,每個答案都要導出下一個問題、把共識寫成「身為⋯⋯我想要⋯⋯以便⋯⋯」格式的使用者故事、套 templates/plan-page.md 寫入 PLAN_{HASH}、把這份計畫在 PLAN_CONTENTS 的那一列 upsert,狀態填「未分析」、跑 tools/stage-report.sh plan 收尾回報。
外部呼叫 jsc-cli/tools/model-tags.sh sync、jsc-hooks/hooks/sdlc-gate.sh lock、jsc-hooks/hooks/write-guard.sh(claude 的 PreToolUse 擋寫入)、jsc-gitea:wiki 與 jsc-gitea/tools/hash-id、jsc-ask:ask、tools/stage-report.sh。
完成條件 模型閘門退出 0 並回報實際模型 id、目標、範圍、可行性三項都達成共識,而且使用者明確確認過覆述的摘要、每個共識項目至少對應一則使用者故事、PLAN_{HASH} 存進 wiki 且範本要求的每個區段都有值、沒有留下未填的佔位字、PLAN_CONTENTS 該列狀態是「未分析」,其他列一個位元組都沒變,而且寫入時分流的 wiki-get 退出碼有講出來、stage-report.sh 的輸出原樣貼給使用者。提前停下也要跑收尾回報。
可驗證跡象 wiki 上多一頁或更新一頁 PLAN_{HASH};PLAN_CONTENTS 多一列或更新一列,狀態是「未分析」;$JSC_HOME/sessions/{工作階段 id}.stage 是 sdlc-gate.sh lock 寫的階段鎖狀態檔;還沒有工作日誌時,$JSC_HOME/worklog-pending/{HASH}/ 下有暫存的日誌內容檔。工作目錄的檔案一律不動。