From 7b83465acf53dc116ed832e5891f8675e58bfc22 Mon Sep 17 00:00:00 2001 From: richblack Date: Fri, 17 Jul 2026 16:51:15 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20SDD=20=E7=94=9F=E5=91=BD=E9=80=B1?= =?UTF-8?q?=E6=9C=9F=E9=90=B5=E5=BE=8B=E2=80=94=E2=80=94=E5=96=AE=E4=B8=80?= =?UTF-8?q?=E6=B4=BB=E6=80=A7=20SDD=EF=BC=8Bpending-changes=20=E7=B7=A9?= =?UTF-8?q?=E8=A1=9D=EF=BC=8B=E9=9B=99=E5=B1=A4=E7=A1=AC=E7=B4=84=E6=9D=9F?= =?UTF-8?q?=EF=BC=88issue=20#6=EF=BC=89+=20bump=201.15.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit leo 2026-07-17 拍板:任何時刻每 repo 只有一份現行 SDD(status: active)。 - 新增 3-specs/SDD-LIFECYCLE.md:frontmatter 狀態標記(active|draft|paused|closed + superseded_by)+五條鐵律(單一活性/禁 CC 自建 SDD/規格變更走 pending-changes.md 等 confirm/開新 SDD 先逐條搬舊任務才准寫 code/session 開始回報三數字) - 新增 3-specs/pending-changes.md:規格變更緩衝區骨架(待裁決/已裁決留底) - TEMPLATE-sdd/design.md 掛 frontmatter(status: draft),移除舊「> 狀態」blockquote - sdd-guard.sh 升級:active>1 不論寫什麼檔一律 exit 2;寫 code 檔需恰好 1 份 active;老 repo 無 frontmatter 退回舊行為(統計排除 archive/ 與 TEMPLATE) - 新增 template/scripts/sdd-active-check.sh:獨立檢查,pre-commit/CI 可掛,>1 exit 1 - /sdd-check 加生命週期段(五鐵律摘要+三數字回報格式);template/CLAUDE.md 鐵律指向 SDD-LIFECYCLE.md - install.sh/update.sh 鋪齊新檔(issue #13 教訓:update 不補新檔=結構斷層) - 三情境 pipe-test 真跑通過:兩份 active 擋(2)/一份放行(0)/零 frontmatter 退舊行為(0) - 版號:遠端已被 issue #5(vault 萃取)佔走 1.14.0,本案改記 1.15.0 Co-Authored-By: Claude Fable 5 --- CHANGELOG.md | 16 ++++ scripts/install.sh | 6 ++ scripts/update.sh | 7 ++ template/.claude/VERSION | 2 +- template/.claude/commands/sdd-check.md | 20 ++++ template/.claude/hooks/sdd-guard.sh | 96 ++++++++++++++++--- template/CLAUDE.md | 9 +- template/scripts/sdd-active-check.sh | 49 ++++++++++ template/system-dev/VERSION | 2 +- .../system-dev/docs/3-specs/SDD-LIFECYCLE.md | 39 ++++++++ .../docs/3-specs/TEMPLATE-sdd/design.md | 6 +- .../docs/3-specs/pending-changes.md | 15 +++ 12 files changed, 247 insertions(+), 20 deletions(-) create mode 100755 template/scripts/sdd-active-check.sh create mode 100644 template/system-dev/docs/3-specs/SDD-LIFECYCLE.md create mode 100644 template/system-dev/docs/3-specs/pending-changes.md diff --git a/CHANGELOG.md b/CHANGELOG.md index 8a66c39..fd1c187 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,22 @@ --- +## 1.15.0 — SDD 生命週期鐵律:單一活性 SDD(issue #6) + +leo 拍板全體系採「單一活性 SDD」制度:任何時刻每個 repo 只有一份現行 SDD(`status: active`),所有開發任務唯一對應它的 tasks。prompt 軟約束+檔案系統硬約束(hook)雙層。 + +- **新增 `system-dev/docs/3-specs/SDD-LIFECYCLE.md`**:規則真相源。frontmatter 狀態標記(`active | draft | paused | closed` + `superseded_by`,機器可查)+五條鐵律(單一活性/禁止 CC 自建 SDD/規格變更只有 pending-changes.md → confirm 一條路/開新 SDD 先逐條搬舊任務才准寫 code/session 開始回報「現行規格+未完成任務 N+待裁決 proposal M」三數字)。 +- **新增 `system-dev/docs/3-specs/pending-changes.md`**:規格變更緩衝區骨架(待裁決/已裁決留底)。update 走 `add_if_missing`——proposal 是用戶資料,絕不覆蓋。 +- **TEMPLATE-sdd/design.md 掛 frontmatter**:`status: draft` 起手,原「> 狀態:」blockquote 移除(被 frontmatter 取代)。 +- **`sdd-guard.sh` 升級**:① active >1 → **不論寫什麼檔一律 exit 2**(先收斂)② 寫 code 檔需「恰好 1 份」active,=0 擋並指向 SDD-LIFECYCLE.md ③ **向下相容**:3-specs 下沒有任何 design.md 帶 frontmatter(老 repo 未遷移)→ 退回舊行為(有 design.md 就放行+提醒補標記),避免 update 後老 repo 立刻全紅;統計一律排除 archive/ 與 TEMPLATE(否則 update 鋪新 TEMPLATE 就誤判已遷移)。 +- **新增 `template/scripts/sdd-active-check.sh`**:獨立硬約束,pre-commit / CI 可掛(掛法見檔頭),active >1 → 列清單 exit 1。下游落地 `system-dev/scripts/`。 +- **`/sdd-check` 加「生命週期」段**:五條鐵律摘要+session 開始三數字回報格式+「兩份 active=違規,當場糾正」。 +- **template/CLAUDE.md 絕對鐵律更新**:指向 SDD-LIFECYCLE.md,濃縮五條。 +- install / update 均鋪齊新檔(SDD-LIFECYCLE.md、pending-changes.md、sdd-active-check.sh、新版 hook),杜絕 1.12 時代「update 不補新檔→結構斷層」(issue #13 教訓)。 +- 誠實限制不變:hook 只擋語法層明顯違規,繞道可行但留痕可審,不聲稱不可繞過。 + +--- + ## 1.14.0 — vault 萃取能力:raw Logseq 筆記 → system-dev/wiki(知識一庫 ingest 前段;issue #5) 筆記 vault(Logseq graph 如 `notes`/`kb`、或 Obsidian)只有原文、需要萃。新增可**重跑、冪等**的 vault 增量萃取,把原始筆記萃成 `system-dev/wiki/` 的精耕卡+`[[wikilink]]`,供下游 Arcrun ingest 從 wikilink 機械拉三元組進 KBDB。**AI 只產卡片檔,不寫 KBDB、不拉三元組**(那是下游的事)。 diff --git a/scripts/install.sh b/scripts/install.sh index 9ea509a..100c6bd 100644 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -303,6 +303,11 @@ if $WANT_SDD; then download_if_missing ".claude/commands/sdd-check.md" "$REPO_URL/.claude/commands/sdd-check.md" download_if_missing ".claude/hooks/sdd-guard.sh" "$REPO_URL/.claude/hooks/sdd-guard.sh" + # SDD 生命週期鐵律(1.14,issue #6):規則真相源 + 規格變更緩衝區 + 獨立單一活性檢查 + download_if_missing "system-dev/docs/3-specs/SDD-LIFECYCLE.md" "$REPO_URL/system-dev/docs/3-specs/SDD-LIFECYCLE.md" + download_if_missing "system-dev/docs/3-specs/pending-changes.md" "$REPO_URL/system-dev/docs/3-specs/pending-changes.md" + download_if_missing "system-dev/scripts/sdd-active-check.sh" "$REPO_URL/scripts/sdd-active-check.sh" + # ── tasks⇄Project 投影(optional,issue #16)────────────────── # 帶檔 ≠ 啟用:workflow yaml 只是「留記錄+手動啟用素材」,啟用=對話答好且 acr push。 # 投影邏輯依附 tasks.md(住 3-specs),故隨 SDD 模組帶下來;裝了不代表開。 @@ -326,6 +331,7 @@ download_if_missing ".claude/commands/issue-handle.md" "$REPO_URL/.claude/comman chmod +x .claude/hooks/*.sh 2>/dev/null || true chmod +x system-dev/workflows/*.sh 2>/dev/null || true +chmod +x system-dev/scripts/*.sh 2>/dev/null || true # ── 依模組產生 settings.json 的 hooks 區塊 ──────── # settings.json 因模組而異,不能直接下載單一靜態檔,改條件組裝。 diff --git a/scripts/update.sh b/scripts/update.sh index c967204..ba53606 100755 --- a/scripts/update.sh +++ b/scripts/update.sh @@ -255,6 +255,13 @@ if $HAS_SDD; then update_file ".claude/commands/sdd-check.md" "$TEMPLATE_URL/.claude/commands/sdd-check.md" update_file ".claude/hooks/sdd-guard.sh" "$TEMPLATE_URL/.claude/hooks/sdd-guard.sh" + # SDD 生命週期鐵律(1.14,issue #6):規則檔+獨立檢查腳本=邏輯檔可覆蓋; + # pending-changes.md 裝著用戶的 proposal=用戶資料,只補不覆蓋。 + # (issue #13 教訓:update 不補新檔會造成結構斷層,新檔必須在這裡鋪。) + update_file "system-dev/docs/3-specs/SDD-LIFECYCLE.md" "$TEMPLATE_URL/system-dev/docs/3-specs/SDD-LIFECYCLE.md" + add_if_missing "system-dev/docs/3-specs/pending-changes.md" "$TEMPLATE_URL/system-dev/docs/3-specs/pending-changes.md" + update_file "system-dev/scripts/sdd-active-check.sh" "$TEMPLATE_URL/scripts/sdd-active-check.sh" + # tasks⇄Project 投影(issue #16):邏輯檔,可覆蓋。舊版沒有 → add_if_missing 補。 # 啟用狀態存遠端(acr push),不在這些檔裡,覆蓋不會關掉誰的同步。 add_if_missing "system-dev/workflows/tasks-project-sync.yaml" "$TEMPLATE_URL/system-dev/workflows/tasks-project-sync.yaml" diff --git a/template/.claude/VERSION b/template/.claude/VERSION index 850e742..141f2e8 100644 --- a/template/.claude/VERSION +++ b/template/.claude/VERSION @@ -1 +1 @@ -1.14.0 +1.15.0 diff --git a/template/.claude/commands/sdd-check.md b/template/.claude/commands/sdd-check.md index fb4bfde..844b7c8 100644 --- a/template/.claude/commands/sdd-check.md +++ b/template/.claude/commands/sdd-check.md @@ -4,6 +4,26 @@ --- +## 生命週期(單一活性鐵律,全文見 `system-dev/docs/3-specs/SDD-LIFECYCLE.md`) + +五條鐵律摘要: + +1. **單一活性**:任何時刻整個 repo 只允許一份 `status: active` 的 SDD;所有開發任務對應它的 tasks,找不到對應任務 → 停下來問,不准直接做。 +2. **禁止自行建立 SDD**:澄清問題→回答不動文件;任務層變更→更新現行 SDD 的 tasks(標日期與原因);規格層變更→走第 3 條。 +3. **規格變更只有一條路**:change proposal 寫進 `system-dev/docs/3-specs/pending-changes.md`(摘要+觸發原因+影響分析),然後**停止**等使用者「confirm」。 +4. **開新 SDD 的唯一時機**:使用者 confirm 後——先把舊 SDD 未完成任務逐條搬入新 SDD(做完前不准寫 code)→ 舊的標 `closed` + `superseded_by` 移入 `archive/` → 新 SDD changelog 記繼承 → 列搬移/作廢清單請最終確認。 +5. **每次 session 開始**先讀 active SDD 與 pending-changes.md,回報三個數字: + + ``` + 📐 現行規格:〈SDD 名稱〉 + 📋 未完成任務:N + ⚖️ 待裁決 proposal:M + ``` + + 若出現**兩份 active=規則已被違反,當場糾正**(收斂到一份,其餘 paused/closed)。 + +--- + ## 執行流程 ### 第一步:理解任務 diff --git a/template/.claude/hooks/sdd-guard.sh b/template/.claude/hooks/sdd-guard.sh index 2295cd2..06d7452 100755 --- a/template/.claude/hooks/sdd-guard.sh +++ b/template/.claude/hooks/sdd-guard.sh @@ -1,10 +1,16 @@ #!/bin/bash -# PreToolUse hook — 動 code 前檢查有沒有對應 SDD +# PreToolUse hook — 動 code 前檢查 SDD + 單一活性 SDD 鐵律(issue #6) # wishlist §2:把 /sdd-check 從「命令要人打」升級成「hook 自動攔」。 +# 生命週期規則全文:system-dev/docs/3-specs/SDD-LIFECYCLE.md # # 掛在 settings.json 的 PreToolUse(matcher: Write|Edit)。 # stdin 收到 JSON:{ tool_name, tool_input: { file_path, ... } } -# 行為:動到 code 檔(.ts/.go/...)但 system-dev/docs/3-specs/ 下沒有任何 SDD → 警告(exit 2 擋)。 +# 行為: +# 1. status: active 的 SDD > 1 份 → 單一活性鐵律已被違反,**不論寫什麼檔**一律擋(exit 2), +# 先收斂到一份再說。 +# 2. 動 code 檔(.ts/.go/...)→ 需要「恰好 1 份」active SDD;0 份 → 擋。 +# 3. 向下相容:3-specs 下完全沒有任何 design.md 帶 frontmatter(老 repo 尚未遷移生命週期制度) +# → 退回舊行為:有 design.md 就放行+提醒,沒有才擋。避免 template update 後老 repo 立刻全紅。 # # 誠實限制(抄 arcrun):只擋語法層明顯違規(直接寫 code 檔)。 # 藏在 helper 裡、用 bash 繞道的改動擋不到。 @@ -24,6 +30,42 @@ fi # 拿不到路徑 → 不擋(容錯,寧可放過也不誤殺) [ -z "$FILE_PATH" ] && exit 0 +SPECS_DIR="system-dev/docs/3-specs" + +# ── 統計 active / frontmatter ────────────────────── +# 排除 archive/(已封存)與 TEMPLATE(範本自帶 status: draft frontmatter,不算數—— +# 否則 update 一鋪新版 TEMPLATE-sdd,老 repo 就被誤判「已遷移」而全紅,向下相容破功)。 +# frontmatter 判定=design.md 前 10 行有 ^status: 行(機器可查,見 SDD-LIFECYCLE.md)。 +ACTIVE_COUNT=0 +FM_COUNT=0 +ACTIVE_LIST="" +if [ -d "$SPECS_DIR" ]; then + while IFS= read -r f; do + [ -n "$f" ] || continue + HEAD10=$(head -10 "$f" 2>/dev/null || true) + if printf '%s\n' "$HEAD10" | grep -q '^status:[[:space:]]*'; then + FM_COUNT=$((FM_COUNT + 1)) + if printf '%s\n' "$HEAD10" | grep -q '^status:[[:space:]]*active'; then + ACTIVE_COUNT=$((ACTIVE_COUNT + 1)) + ACTIVE_LIST="${ACTIVE_LIST} • ${f} +" + fi + fi + done < <(find "$SPECS_DIR" -name 'design.md' -not -path '*TEMPLATE*' -not -path '*/archive/*' 2>/dev/null) +fi + +# ── 鐵律 1:單一活性被違反(active > 1)→ 不論寫什麼檔一律擋 ── +if [ "$ACTIVE_COUNT" -gt 1 ]; then + cat >&2 </dev/null | wc -l | tr -d ' ') -fi +# ── 向下相容:整個 3-specs 沒有任何帶 frontmatter 的 design.md ── +# =老 repo 還沒遷移生命週期制度 → 退回舊行為(有 design.md 就放行+提醒), +# 避免 template update 一裝新 hook,老 repo 所有 code 寫入立刻全紅。 +if [ "$FM_COUNT" -eq 0 ]; then + SDD_COUNT=0 + if [ -d "$SPECS_DIR" ]; then + SDD_COUNT=$(find "$SPECS_DIR" -name 'design.md' -not -path '*TEMPLATE*' -not -path '*/archive/*' 2>/dev/null | wc -l | tr -d ' ') + fi -if [ "$SDD_COUNT" -eq 0 ]; then - cat >&2 <&2 <&2 + exit 0 +fi + +# ── 新行為:寫 code 檔需「恰好 1 份」active SDD ── +if [ "$ACTIVE_COUNT" -eq 0 ]; then + cat >&2 <&2 +# 恰好 1 份 active:放行,留痕提醒要宣告(stderr 警告,不擋) +printf '📋 提醒:現行 active SDD=\n%s動手前請確認已讀它的 design.md、對應到 tasks,並在回覆宣告。\n' "$ACTIVE_LIST" >&2 exit 0 diff --git a/template/CLAUDE.md b/template/CLAUDE.md index 87ae11c..7290f7e 100644 --- a/template/CLAUDE.md +++ b/template/CLAUDE.md @@ -7,12 +7,15 @@ ## 絕對鐵律(違反 = 停手) -1. **任何 code 變動前必須有對應 SDD**(`system-dev/docs/3-specs/[子系統]/design.md`) +1. **任何 code 變動前必須有對應 SDD**,且遵守 **SDD 生命週期鐵律**(全文:`system-dev/docs/3-specs/SDD-LIFECYCLE.md`): + - **單一活性**:任何時刻只有一份 `status: active` 的 SDD,所有任務對應它的 tasks + - **禁止自行建立 SDD**:找不到對應 → 停手問 [負責人] + - **規格層變更**:proposal 寫進 `3-specs/pending-changes.md`,等使用者「confirm」才動 + - **開新 SDD**(confirm 後):先把舊 SDD 未完成任務搬進新 SDD,才准寫 code + - **session 開始**回報:「現行規格〈名稱〉+未完成任務 N+待裁決 proposal M」 2. [技術棧限制,例如:前端只用 React,不引入其他框架] 3. [其他專案特定限制] -找不到對應 SDD → **停手問 [負責人]**,不要自行建立。 - --- ## 工作流程(強制) diff --git a/template/scripts/sdd-active-check.sh b/template/scripts/sdd-active-check.sh new file mode 100755 index 0000000..bc255ba --- /dev/null +++ b/template/scripts/sdd-active-check.sh @@ -0,0 +1,49 @@ +#!/bin/bash +# sdd-active-check.sh — 單一活性 SDD 獨立硬約束(SDD 生命週期鐵律,issue #6) +# 規則全文:system-dev/docs/3-specs/SDD-LIFECYCLE.md +# +# 用法:bash sdd-active-check.sh [specs目錄] +# 參數 1(可選)=specs 目錄,預設 system-dev/docs/3-specs +# +# 行為:統計 status: active 的 design.md(design.md 前 10 行有 ^status: active, +# 排除 archive/ 與 TEMPLATE)—— +# >1 份 → stderr 列出清單,exit 1(違反單一活性) +# ≤1 份 → exit 0 +# +# pre-commit 掛法(.git/hooks/pre-commit,記得 chmod +x): +# #!/bin/sh +# bash system-dev/scripts/sdd-active-check.sh || exit 1 +# CI 也是同一行,違反即紅。 +# +# 誠實限制:與 sdd-guard.sh 同精神——只做語法層機械檢查,繞道可行但留痕可審, +# 不聲稱不可繞過。價值是「不變量被違反時一定有機器出聲」。 + +set -euo pipefail + +SPECS_DIR="${1:-system-dev/docs/3-specs}" + +# 沒有 specs 目錄(沒裝 SDD 模組)→ 無事可查,放行 +[ -d "$SPECS_DIR" ] || exit 0 + +ACTIVE_COUNT=0 +ACTIVE_LIST="" +while IFS= read -r f; do + [ -n "$f" ] || continue + if head -10 "$f" 2>/dev/null | grep -q '^status:[[:space:]]*active'; then + ACTIVE_COUNT=$((ACTIVE_COUNT + 1)) + ACTIVE_LIST="${ACTIVE_LIST} • ${f} +" + fi +done < <(find "$SPECS_DIR" -name 'design.md' -not -path '*TEMPLATE*' -not -path '*/archive/*' 2>/dev/null) + +if [ "$ACTIVE_COUNT" -gt 1 ]; then + cat >&2 < 來源:leo 2026-07-17 拍板。 +> 適用:`system-dev/docs/3-specs/` 下的「規格 SDD」(requirements/design/tasks 三件式資料夾)。 +> **不適用**:派工表/sprint 檔、journeys/ 卷宗、TEMPLATE-sdd、README、pending-changes.md——它們不是 SDD,不掛 status。 + +## 狀態標記(機器可查) + +每個 SDD 資料夾的 `design.md` 最上方掛 YAML frontmatter: + +```yaml +--- +status: active # active | draft | paused | closed +superseded_by: "" # closed 且被取代時填接替的 SDD 資料夾名 +--- +``` + +- `active`:現行規格,全 repo 開發任務唯一對應源。**任何時刻整個 repo 最多一份。** +- `draft`:起草中,尚未採納。 +- `paused`:動過工、暫停中;恢復=升回 active(先收掉現任 active)或被新 SDD 繼承。 +- `closed`:已完成或被取代;被取代者填 `superseded_by` 並移入 `3-specs/archive/`。 + +## 五條鐵律 + +1. **單一活性**:任何時刻只允許一份 `status: active`。所有開發任務必須對應這份 SDD 的 tasks。找不到對應任務 → 停下來問,不准直接做。 +2. **禁止自行建立 SDD**:CC 在任何情況下不得主動建新 SDD。收到使用者意見先分類:澄清問題→回答即可不動文件;任務層變更(不影響核心設計)→更新現行 SDD 的 tasks 區段並標日期與原因;規格層變更(核心設計/方向改變)→走第 3 條,不准直接改 spec。 +3. **規格變更只有一條路**:產出 change proposal 寫入 `system-dev/docs/3-specs/pending-changes.md`(變更摘要與觸發原因+影響分析:現行 SDD 哪些任務作廢/修改/不受影響/尚未完成),然後**停止**,等使用者明說「confirm」。沒 confirm 就繼續依現行 SDD 工作。多個 proposal 可並存緩衝區、由人一次裁決——CC 的速度導向影響分析,不是規格增生。 +4. **開新 SDD 的唯一時機**:使用者 confirm 一份規格層 proposal 時,依序: + a. 舊 SDD 未完成且仍有效的任務**逐條搬入**新 SDD 的 tasks——**這步做完前不准寫任何程式碼**(強迫顯式盤點,遺漏會在 d 的清單被看到,而不是三天後才發現)。 + b. 舊 SDD frontmatter 改 `status: closed, superseded_by: <新SDD>`,資料夾移入 `3-specs/archive/`。 + c. 新 SDD 的 changelog 首行記錄:繼承自哪份、為何取代。 + d. 向使用者列出「已搬移任務清單」與「已作廢任務清單」請求最終確認。 +5. **每次 session 開始**:先讀現行 active SDD 與 pending-changes.md,回報三個數字——「現行規格〈名稱〉+未完成任務 N+待裁決 proposal M」——再開始工作。若回報出現兩份 active=規則已被違反,當場糾正。 + +## 硬約束(不信任單點自律,用結構保證不變量) + +- `.claude/hooks/sdd-guard.sh`(PreToolUse Write|Edit):active 數 >1 → 任何寫檔一律擋;寫 code 檔需恰好 1 份 active。 +- `scripts/sdd-active-check.sh`:獨立檢查,pre-commit / CI 可掛,違反 exit 1。 +- 誠實限制:hook 只擋語法層明顯違規,繞道可行但留痕可審;不聲稱不可繞過。 diff --git a/template/system-dev/docs/3-specs/TEMPLATE-sdd/design.md b/template/system-dev/docs/3-specs/TEMPLATE-sdd/design.md index 44bbc65..ce540d8 100644 --- a/template/system-dev/docs/3-specs/TEMPLATE-sdd/design.md +++ b/template/system-dev/docs/3-specs/TEMPLATE-sdd/design.md @@ -1,6 +1,10 @@ +--- +status: draft # active | draft | paused | closed(生命週期鐵律見 ../SDD-LIFECYCLE.md) +superseded_by: "" # closed 且被取代時填接替的 SDD 資料夾名 +--- + # [子系統名稱] — Design -> 狀態:[草稿 / 審核中 / 已採納 / 已廢棄] > 建立:[YYYY-MM-DD] | 最後更新:[YYYY-MM-DD] > 負責人:[名稱] diff --git a/template/system-dev/docs/3-specs/pending-changes.md b/template/system-dev/docs/3-specs/pending-changes.md new file mode 100644 index 0000000..5dd2d59 --- /dev/null +++ b/template/system-dev/docs/3-specs/pending-changes.md @@ -0,0 +1,15 @@ +# Pending Changes(規格變更緩衝區) + +> 規則來源:`SDD-LIFECYCLE.md` 第 3、4 條。 +> 規格層變更(核心設計/方向改變)**只有這一條路**:CC 把 change proposal 寫進「待裁決」—— +> 變更摘要與觸發原因+影響分析(現行 SDD 哪些任務作廢/修改/不受影響/尚未完成)——然後**停止**, +> 等使用者明說「confirm」才依第 4 條開新 SDD;沒 confirm 就繼續依現行 SDD 工作。 +> 多個 proposal 可並存,由人一次裁決。本檔不是 SDD,不掛 status。 + +## 待裁決 + +(無) + +## 已裁決 + +(無——裁決後從「待裁決」移到這裡留底,標 confirmed / rejected + 日期。)