Files
system-dev-template/docs/3-specs/jdd-dual-profile/requirements.md
T
Leo 2a8c259d08 依 D22 翻正舊 ignore 政策:本 repo 自己的 SDD 進版控 + 新增 jdd-dual-profile 卷
🔴 修的病:這個框架 repo 自己的 5 份 SDD 全部被 .gitignore 擋在版控之外,
只活在一台硬碟上——clone 不到、雲端 CC 讀不到、沒備份。SDD 是進度真相源,
「框架 repo 沒吃自己的狗糧」。

依據 D22(已翻案):Gitea private 除機敏值外全 push,雲端工人靠 clone,docs 缺=斷糧;
只有 GitHub mirror 才嚴篩,而 docs 整包已在 github-publish-exclude.txt。

.gitignore 改法:整條擋 → 只擋子項(/*)+ 逐個放行真 SDD。
與 template/ 底下逐位元組相同的自裝副本(TEMPLATE-sdd/、SDD-LIFECYCLE.md)續擋。

新增 docs/3-specs/jdd-dual-profile/(status: draft,等 leo confirm 才升 active):
JDD(PM 軌 root/journeys/角色權限/站號 sprint)與雙 profile 合成一卷,
33 條 task/6 phase,每條掛服務哪條 Gherkin(G1–G7)。
新增 hook 6 支、改既有 hook 1 支。**0 行實作**。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-05 23:22:14 +08:00

230 lines
13 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.
# jdd-dual-profile — Requirements
> 建立:2026-08-05 | 最後更新:2026-08-05
> 負責人:system-dev-template CC
> 來源:InkStoneCo 總管交辦 **W2**`InkStoneCo/system-dev/docs/3-specs/pending-changes.md`
> 「[proposal] 總管系統藍圖 v3 三件套落地安排」§三 W2)
> 需求輸入:《JDD 導入規格》§三/四/五/六 +《分離導入規格》§三/六 +《總管系統藍圖 v3》§3/§4/§5.5
> 狀態:**等 leo confirm,未實作**
---
## 為什麼合成一份(不是兩份 SDD)
JDD 的角色權限 hook 必須靠 profile 分流才成立——「總管版憲法」與「repo 版憲法」是同一支
CLAUDE.md 生成流程的兩個輸出。拆兩份 SDD 會把 CLAUDE.md 生成、manifest、install/update
改造各做兩遍,且第二遍必然要推翻第一遍的檔案佈局。總管裁定:合成一份。
---
## 一、Epic
| Epic | 一句話 | 需求輸入 |
|------|--------|---------|
| **E1 雙 profile 框架** | 同一個 template 能裝出「總管級」或「repo 級」兩種實例,憲法由安裝位置決定、不靠 agent 自我判斷 | 分離 §三 |
| **E2 PM 軌文件(JDD** | 框架提供 `root.md` / `journeys.md` 兩份範本與格式紀律,讓驗收線從「tasks 全關」換成「站的 Gherkin 全綠」 | JDD §三、§五 |
| **E3 角色封路** | orchestratorengineer 的可寫範圍用 hook 機械強制,不靠 prompt 叮嚀 | JDD §四、§六 |
| **E4 防糾纏** | 實例不改機制、框架不含實例資料,兩條鐵律各配機械閘;update 能報出被手改過的檔 | 分離 §一、§六 |
**明確不在本 SDD 範圍**W3 才做):arcrun-policy plugin 本體、政策包內容搬遷、
marketplace 發行。本 SDD 只負責**留好插槽**(載入順序文件化 + profile 憲法的 must-read 注入點)。
---
## 二、User Story EARS
### E1 雙 profile 框架
**US-1.1**:身為安裝者,我要一條指令就裝出正確的那部憲法,不必自己判斷該裝哪些檔。
- `EARS-1.1.1` When 安裝者執行 `install.sh --profile=orchestrator`the system shall
只鋪設 orchestrator profile 宣告的產物,且不鋪設 repo profile 專屬的產物。
- `EARS-1.1.2` When 安裝者執行 `install.sh --profile=repo`the system shall
只鋪設 repo profile 宣告的產物(含 SDD 三件式與 repo 級 wiki 規範)。
- `EARS-1.1.3` When 安裝者未指定 `--profile`the system shall 自動偵測
(目前目錄下存在多個各自帶 `.git` 的子目錄 → 建議 orchestrator),
**並在寫入任何檔案前要求人確認一次**;確認結果寫入 marker 檔,之後不再問。
- `EARS-1.1.4` The system shall 在安裝完成後於 `system-dev/.profile` 留下單行 profile 名,
作為所有 hook 判定 scope 的唯一機器可讀來源。
**US-1.2**:身為框架維護者,我要 common 與兩個 profile 共用**一條版本流**,不開第二個 repo。
- `EARS-1.2.1` The system shall 以單一 `VERSION` 檔涵蓋 common 與所有 profile 的變更。
- `EARS-1.2.2` When 執行 update 而該實例所屬 profile 的產物本版未變動,the system shall
對該 profile 的產物 no-op(不下載、不覆蓋、不在報表列為「已更新」)。
**US-1.3**:身為安裝者,我要 CLAUDE.md 由 profile 範本生成,而我自己補的內容永遠不會被更新洗掉。
- `EARS-1.3.1` The system shall 把生成的 CLAUDE.md 切成「框架區」與「本地補充區」,
兩區以機器可辨識的界標分隔。
- `EARS-1.3.2` While 執行 updatethe system shall 只覆蓋框架區、**絕不動本地補充區**。
- `EARS-1.3.3` If 框架區內容與本版原始範本不一致(=被手改過),then the system shall
不覆蓋該檔、將它列入漂移清單,並提示「回框架提案 or 放棄本地改動」。
### E2 PM 軌文件(JDD
**US-2.1**:身為總管(PM),我要一份白話根文件,讓不懂技術的人讀了能勾或搖頭。
- `EARS-2.1.1` The system shall 於 orchestrator profile 提供 `root.md` 範本,
格式為「一句白話 + 來源標記 + 紅綠燈」。
- `EARS-2.1.2` If `root.md` 中任一 🔴 卡缺少【要驗證 + 對帳日】,then the system shall
在寫入當下攔截並指出行號。
- `EARS-2.1.3` If `root.md``journeys.md` 出現技術名詞黑名單詞(API/DB/WASM/MCP
endpointschema…),then the system shall 攔截並列出命中詞與行號。
**US-2.2**:身為總管,我要 `journeys.md` 承載「角色 → Journey → Station → Gherkin」三層,
並附站點索引表供回歸考查範圍。
- `EARS-2.2.1` The system shall 於 orchestrator profile 提供 `journeys.md` 範本,
含三層巢狀結構與「附:站點索引表」段。
- `EARS-2.2.2` The system shall 在範本內以註記聲明:站全域編號、跨 Journey 共享、
重複出現只寫引用不重抄;Gherkin 的 Then 只寫使用者看得到/感覺到的結果。
**US-2.3**:身為 routine/總管,我要 sprint 的單位是「一組站號」,起牀就有明確的「離通關還缺什麼」。
- `EARS-2.3.1` The system shall 於 orchestrator profile 提供 sprint 範本,
以站號(而非 task 批次)為單位,含起訖日與到期結算欄。
- `EARS-2.3.2` If `tasks.md` 中**新增**的 task 條目未標注它服務哪一站,then the system shall 攔截。
- `EARS-2.3.3` When sprint 收尾驗收,the system shall 以「指定站的 Gherkin 全綠」為判準,
而非「tasks 全關」。
- `EARS-2.3.4` When 偵測到某站相關實作變動,the system shall 查站點索引表並列出需重考的
JourneyGherkin 清單(提醒,不阻擋)。
### E3 角色封路
**US-3.1**:身為系統,我要 agent 的身分由兩個機械來源決定,沒有任何一格靠 agent 自陳。
- `EARS-3.1.1` The system shall 以 `system-dev/.profile` 決定 **scope 軸**
以環境變數 `AGENT_ROLE` 決定 **role 軸**
- `EARS-3.1.2` If `AGENT_ROLE` 未設定,then the system shall 依 scope 推定預設 role
orchestrator profile → orchestratorrepo profile → engineer),不詢問 agent。
- `EARS-3.1.3` If 身分組合落在「repo profile × orchestrator」這個**不存在的格子**
then the system shall 攔截並要求修正環境變數,不得靜默降級。
**US-3.2**:身為系統,我要 orchestrator 寫不了 code、改不了技術軌文件。
- `EARS-3.2.1` If role 為 orchestrator 且寫入目標是程式碼路徑(`src/**``*.py``*.ts`
`*.go``*.sh` 等),then the system shall 攔截(exit 2)。
- `EARS-3.2.2` If role 為 orchestrator 且寫入目標是 `tasks.md` / `requirements.md` /
`design.md`then the system shall 攔截。
**US-3.3**:身為系統,我要 engineer 改不了考卷。
- `EARS-3.3.1` If role 為 engineer 且寫入目標是 `journeys.md` / `root.md` /
任何 `*.feature` 或 md 內的 Gherkin 區塊,then the system shall 攔截。
- `EARS-3.3.2` The system shall 在攔截訊息中說明「考生不能改考卷」與正確做法
(回報給 PM,由 PM 改站或改考題)。
**US-3.4**:身為 session,我醒來時世界已就位,不需要「知道」有哪些機制存在。
- `EARS-3.4.1` When SessionStartthe system shall 依 profile 注入對應的必讀
orchestratorroot/journeys 與本 sprint 未點亮站;repo:現行 status/principles/mistakes)。
- `EARS-3.4.2` The system shall 於 profile 憲法留下 policy plugin 的 must-read 注入點,
使 W3 的 plugin SessionStart hook 能把政策必讀推到眼前,而框架本身不新造外掛格式。
### E4 防糾纏
**US-4.1**:身為框架維護者,我要實例改不了機制——要改就回框架提案。
- `EARS-4.1.1` If 寫入目標落在安裝產物區(`.claude/hooks/``system-dev/` 範本區、
plugin 安裝目錄),then the system shall 攔截並提示「機制變更走框架/政策包 repo 提案」。
- `EARS-4.1.2` While session 帶有框架開發標記(框架 repo 根目錄存在 `.sdt-framework-dev`
或環境變數 `SDT_FRAMEWORK_DEV=1`),the system shall 放行 EARS-4.1.1。
**US-4.2**:身為框架維護者,我要框架範本裡混進實例專名時 CI 就擋下。
- `EARS-4.2.1` When CI 執行,the system shall 掃描範本區,命中實例專名黑名單 → fail
並指出檔案與行號。
- `EARS-4.2.2` The system shall 讓黑名單住在可維護的設定檔,並提供**逐行豁免標記**
(留痕可審),供尚未搬遷的政策內容過渡使用。
- `EARS-4.2.3` The system shall 不對 policy pack 套用本檢查(政策包本來就是一家之言)。
**US-4.3**:身為安裝者,我要 update 告訴我「哪些檔被手改過」。
- `EARS-4.3.1` When 執行 updatethe system shall 比對每個安裝產物的實際雜湊與 manifest
記錄的雜湊,差異者列入漂移清單並逐項提示處置選項。
- `EARS-4.3.2` The system shall 對漂移檔採「不覆蓋 + 另存新版供 diff」策略,不靜默覆寫。
---
## 三、非功能需求
| 項 | 要求 | 為什麼 |
|---|---|---|
| 向下相容 | 既有實例(1.18.x)跑 update **不得 404**;已安裝檔案的遠端路徑不得搬移 | 舊實例跑的是**舊** update.sh,檔案清單與 base URL 寫死在裡面;1.16.0 已被「來源改動=自動更新死掉」咬過一次 |
| 雲端可跑 | 所有 hook 只用 repo 相對路徑與 POSIX 工具,不假設本機絕對路徑 | 分離 §三 common「封路 hook 工具箱(雲端可跑)」 |
| 容錯 | hook 解析失敗(拿不到 file_path/無 jq)一律放行並留痕,不誤殺 | 沿既有 hook 慣例(sdd-guard、wiki-secret-scan |
| 誠實限制 | 每支 hook 頂部註明「擋語法層、擋不了 bash 繞道」,不宣稱不可繞過 | 沿既有 hook 慣例 |
| 安裝時間 | 乾淨環境雙 profile 各 < 10 分鐘 | 分離 §八 arch_iteration 預測① |
| bash 版本 | 相容 macOS bash 3.2(空陣列展開需先判長度) | install.sh 既有踩過的坑 |
---
## 四、驗收 Gherkin(唯一驗收線,tasks 逐條掛號)
> 來源:《JDD 導入規格》§七 三題(G1–G3)+《分離導入規格》§七 四題(G4–G7),原文照抄。
```gherkin
# ── G1JDD §七之一)
Scenario: PM 總管優先補接縫而非做新功能
Given 安裝流程的所有零件均已 commit(部分未 push、部分接口未串)
And root.md 與 journeys.md 已就位,J-1(安裝者一次通關)已定義
When PM 總管接到指令「交付 J-1
Then 它派出的第一批工作是補接縫(push 缺漏、串斷點)
And 不包含任何新功能開發
# ── G2JDD §七之二)
Scenario: 考生改考卷被攔截
Given engineer subagent 的某站 Gherkin 未過
When 它嘗試修改 journeys.md 中的該條 Gherkin
Then hook 攔截,修改不生效
# ── G3JDD §七之三)
Scenario: 進度以站計量
Given sprint 進行中
When 詢問 PM 總管目前進度
Then 回答形式為「J-x 已點亮 n/m 站」,而非 tasks 完成數
# ── G4(分離 §七之一)
Scenario: 憲法分流不靠判斷
Given template 已裝雙 profile
When 在總管 repo 開 session
Then CLAUDE.md 只含總管憲法(無 SDD 三件式細節)
When 在成員 repo 開 session
Then CLAUDE.md 只含 repo 憲法+一行上游指針
# ── G5(分離 §七之二)— 本 SDD 只負責插槽,Then 的後半由 W3 兌現
Scenario: 政策包即插即用
Given 乾淨實例已裝 repo profile
When 安裝 arcrun-policy plugin 並 spawn engineer 實作小功能
Then 白名單 hook 攔下 python 路徑、primer 出現在 session 開頭
And engineer 的交付物走 Arcrun 零件
# ── G6(分離 §七之三)
Scenario: 實例改機制被攔
Given 實例 session(非 --framework-dev
When 嘗試編輯 .claude/hooks/ 下任一檔
Then hook 攔截並提示走框架提案
# ── G7(分離 §七之四)
Scenario: 框架混入實例名被 CI 擋
Given 範本檔新增一行含 "arcrun"
When CI 執行
Then 檢查 fail 並指出檔案與行號
```
**G5 的範圍切割(重要)**:本 SDD 交付的是 GivenWhen 能成立的**插槽**——
乾淨實例裝得出 repo profile、載入順序文件化、profile 憲法有 must-read 注入點。
`Then` 的兩句(白名單 hook 攔 python、primer 出現)由 **W3 的 arcrun-policy plugin** 兌現。
W2 收工時 G5 記 `◐ 半通(插槽就位,政策包未做)`,不得標 ✅。
---
## 五、關聯
- 上游提案:`InkStoneCo/system-dev/docs/3-specs/pending-changes.md` §三 W2
- 需求輸入原件:`~/Desktop/總管/JDD-template-upgrade.md``~/Desktop/總管/分離導入規格.md`
`~/Desktop/總管/總管系統藍圖v3.md`
- 生命週期規則:`docs/3-specs/SDD-LIFECYCLE.md`
- 下一波:W3 arcrun-policy plugin(本 SDD 的 G5 後半)