Files
ISEP/commands/sdd-check.md
T
Claude c7af690c2b sdd-guard 退役:讓「取消 Active SDD」這個裁決真的執行得下去(inkstone/ISEP#91)
leo 2026-08-16 在 inkstone/InkStoneCo#40 → comment 2942 裁定「取消 Active SDD」,
11 天沒被執行。原因不是有人偷懶,是**執行它的第一步會鎖死自己**:

    sdd-guard.sh 是 fail-closed 的
      · 動 code 檔時 status: active 不是恰好 1 份 → 擋(0 份也擋)
      · 路徑所在的 repo 沒有 3-specs           → 也擋

⇒ 照裁決把最後那份 active 拿掉 → 變 0 份 → 任何人動任何 .ts/.py/.go 全被擋。

而 ISEP 這個 repo 自己就沒有 3-specs——本票開工第一件事實測到:

    $ echo '{"tool_name":"Edit","tool_input":{"file_path":".../hooks/lib/dispatch_parse.py"}}' \
        | bash hooks/sdd-guard.sh
    🚫 SDD 協議攔截:… 找不到任何 SDD        exit 2

**它一直在誤攔 ISEP 自己,只是沒人回報。**

── 這一版做了什麼 ────────────────────────────────────
· hooks/sdd-guard.sh 刪除,hooks.json 取消註冊(85 → 84 條,只少這一條)
· commands/sdd-check.md 改寫:SDD 只記「起初的樣子」,任務本體在 Gitea 票;
  找不到 SDD 不再是停下來的理由,找不到票才是
· agents/inkstoneco-hand.md 拿掉「任何時刻只允許一份 status: active」那條紅線
· hooks/lib/path-resolve.sh 只加註解:它的唯一 caller 走了,但別順手刪
  (#22 學到的東西住在裡面,十幾支閘還在用它要修的那個寫法)

── 迴歸測試:測的不是「檔案刪了沒」,是「那個擋還會不會發生」──
hooks/tests/sdd-guard-retired.test.sh(通過 8/失敗 0,離線):
把「裁決執行完之後的世界」(沒有 3-specs 的 repo、兩份 status: active 的 repo)
丟給 hooks.json 上**整組** Write|Edit|MultiEdit 的閘——清單當場從 hooks.json 讀、
不寫死——不准有任何一支用 SDD/3-specs 當理由擋下來。
⇒ 日後有人換個檔名把同一個形狀種回來,這支照樣紅。

🔴 判準刻意不是「一支閘都不准擋」:同組還住著跟 SDD 無關、且看 session 狀態
決定擋不擋的閘(history-first/subagent-first)。把它們算失敗,這支測試會在別人
改別的東西時無故變紅,紅久了就沒人看——誤攔比漏擋更該修,對測試一樣成立。

**紅的證明**:把 sdd-guard 暫時復原(檔案+註冊)重跑 → 通過 1/失敗 7,
四條行為格全部指名 sdd-guard.sh。已還原。

── 自己跑過的 ──────────────────────────────────────
· hooks/tests/sdd-guard-retired.test.sh                通過 8/失敗 0
· 逐支點名 hooks.json(README「裝什麼」那道指令)      84 條,對 main 做集合差:
  少了 sdd-guard.sh × 1,多出 0 支,其餘一支不差
· 盤點數字全部在這棵樹上實數,不是加減推:
  ls hooks/*.sh|wc -l = 61(原 62)
  grep -c '"command":' hooks/hooks.json = 84(原 85)
  agents 7/commands 7/skills 2/scripts 48(皆未變動)
· 盤點表對帳三格(hooks-inventory 自己寫死的那三道):三格皆無輸出
· scripts/check-version-consistency.sh                  0.16.2 一致
· claude plugin validate .                              Validation passed
· hooks/tests/ 全部離線測試 24 支重跑:本次改動 0 退步
  (dispatch-format-guard 40/52、prod-write-guard 18/19-fail、
   stage-before-prod-guard 9/7-fail、另 3 支需帶參數/建不起沙盒——
   **六支在 gitea/main 上逐支重跑結果一模一樣,是既有狀態不是本次造成**)

── 沒做、也不該由這張票做的 ─────────────────────────
· inkstone/InkStoneCo 那半(拿掉 active SDD + 刪 CLAUDE.md「單一活性鐵律」段)
  ——那是 inkstoneco-hand 的 repo;而且順序上本來就要等這一版出去、
  兩邊 /plugin update 之後才動得,先拿掉就鎖死
· checkbox 分診(掛 inkstone/InkStoneCo#49,票上明寫不要另開票)
· 版本號:待總管定版

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016ZBu4Sa1cGntKFRBYNZ6xs
2026-08-31 00:56:37 +00:00

82 lines
3.4 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
---
name: sdd-check
description: |
動手前把這件事的來歷讀齊——要寫 code、開新功能、
或不確定「這件事當初為什麼長這樣」時自動載入。
🔴 Active SDD 已於 2026-08-16 取消(inkstone/InkStoneCo#40):
**任務本體在 Gitea 票,不在 SDD**SDD 只記「起初的樣子」,
沒有 status、沒有唯一活性、也不再養任務 checkbox。
⇒ 找不到 SDD 不是停下來的理由,找不到票才是;也不要為了動手而現編一份 SDD。
規格層變更改開 Gitea 票(Human+指派 Leo)後停止等 confirm——pending-changes.md 已於 2026-08-19 廢除,禁止寫入。
---
# /sdd-check — 動手前把這件事的來歷讀齊
## 先講清楚它現在是什麼
leo 2026-08-16`inkstone/InkStoneCo#40` → comment 2942):
> 「**取消 Active SDD**⋯⋯所有文件中都不帶有任務 checkbox,因為移動到 Gitea 來管理,
> SDD 會脫節,它所做的是記錄起初的樣子⋯⋯實際情況靠 issues, PR, release 等機制來管理。」
所以三件事分家(`docs/governance/sdd-gitea-governance.md` §0 公理 1):
```
意圖真相 → SDDdocs/3-specs/ 未來式:當初打算怎麼做
狀態真相 → Gitea 票/PR/release 現在式:現在做到哪、誰在做
知識真相 → wiki 過去式:撞過什麼、學到什麼
```
🔴 **這支命令已經不是一道閘了。** 舊版靠 `sdd-guard.sh` 在動 code 前強制要有
「恰好一份 status: active 的 SDD」,那支閘於 `inkstone/ISEP#91` 退役——
它是 fail-closed 的,裁決一執行(active SDD 歸零)就會鎖死所有 code 寫入。
---
## 執行流程
### 第一步:這件事的**票**是哪一張
**這一步不能跳,也是唯一會讓你停下來的一步。**
- 有票號 → 讀它(含整串留言:裁決、假設、前手交回的下一步都在那裡)
- 沒票號 → **先問清楚是哪一張,或先把票開出來**,不要憑一句話開工
`commands/issue-handle.md`Issue 是唯一任務介面)
### 第二步:這件事的**來歷**在哪份 SDD
`system-dev/docs/3-specs/` 下找對應子系統的 `design.md`
- 找到 → 讀它,弄清楚「當初為什麼這樣設計、有哪些邊界不能動」
- **找不到 → 照樣可以動手**。票才是任務本體;
沒有 SDD 只代表這塊當初沒有寫下設計,不代表這件事沒被批准
🔴 **不要為了動手而現編一份 SDD**,也不要去改任何 `status:` frontmatter——
那是已經取消的制度的殘留物。
🔴 **不要把任務 checkbox 寫進 SDD**。要追蹤進度就開票/改票的狀態標籤;
寫進文件裡的 checkbox 沒有人會回來關掉它(`inkstone/InkStoneCo#49`
清的就是這一批:378 條沒人維護的 checkbox)。
### 第三步:把讀到的東西講出來再動手
回覆開頭一行交代即可:
```
📌 票:<owner/repo#N> —— <一句話它要解什麼>
📋 來歷:<design.md 路徑,或「這塊沒有 SDD」>
🚧 邊界:<這次不准動的東西>
```
---
## 什麼時候該停下來問
只有這幾種,**都跟 SDD 在不在無關**:
- 找不到對應的票,也問不出是哪一張
- 票上的要求跟現行規範互相衝突(貼出兩邊出處,給出你的推測,再問)
- 命中四題公式:花錢/不可逆/跨專案結構/品味方向
其餘情況做出最合理的假設、把假設寫進 commit message 或票的留言,繼續走。