feat(W2 Phase 0-1): 雙 profile 地基+JDD 兩軸身分+兩支防炸閘

SDD: docs/3-specs/jdd-dual-profile(draft → active,leo 2026-08-05 回「開工」)
範圍:總管指定的「防炸兩件 → Phase 0 → Phase 1」,Phase 2 以後未開工。

■ 防炸(排在所有 task 之前,因為它們炸的是既有的東西)
- check-no-instance-names.sh + instance-names.txt:框架範本不得混入實例專名
  基線實測 22 行命中(非先前誤報的 20)→ 9 行無損泛化改寫、13 行檔級豁免記帳待 W3 搬走
  拒絕假性清理(把專名換成模糊詞=資訊消失、分層問題還在)
- check-legacy-paths.sh:已發佈腳本引用的 35 條遠端路徑只增不移
  舊實例跑的是舊腳本、路徑寫死;搬檔=整排 404 且不會有下一次更新來修它(1.16.0 前科)

■ Phase 0 地基
- template/manifest/{common,repo,orchestrator}.tsv:安裝清單單一真相源
  修好 install/update 兩份硬編清單的既有漂移——install 從不裝 wiki-first-search /
  subagent-wiki-guard / publish-lag-check / decisions-summary,但 update 會
  ⇒ 乾淨安裝反而拿不到 1.16/1.17/1.18 的招牌功能
- .claude/hooks/lib/role-lib.sh:scope×role 兩軸機械判定,零自陳
  身分矩陣六組實測全通過,含「成員 repo × orchestrator」不存在的格子擋下
- .sdt-framework-dev:框架開發標記(官方沒有 --framework-dev 這個參數,實查非記憶)

■ Phase 1 雙 profile
- profiles/{repo,orchestrator}/CLAUDE.md 兩部憲法
- install.sh:--profile + 自動偵測+寫檔前確認、manifest 驅動、
  CLAUDE.md 三段組裝(框架區/本地補充區界標+sha256)、.profile、.template-manifest、
  settings.json 寫入 env.AGENT_ROLE 預設
- update.sh:漂移偵測(不覆蓋手改檔、另存 .new、白話清單)+ 基準快照隨更新前進
- template/CLAUDE.md 原路徑凍結留底(相容)

■ 順手修掉兩個舊 bug(都在本次要動的函式裡)
- add_if_missing 少了 mkdir -p ⇒ 新目錄的檔 curl 失敗但 VERSION 照升(2026-07 記「待回報」至今未修)
- 下載健全性只用 [ -s ]=非空即接受 ⇒ 404 頁面會無聲覆寫好檔
  (SKILL.md 260→1 行的機制;同一支腳本的版本號那條路早就防了,檔案這條沒防)

■ 實測(非推論)
- G4 憲法分流:兩個乾淨環境各裝一次,orchestrator 版含 SDD 三件式關鍵字 0 次、
  repo 版含上游指針 8 次;界標 4/4;sha 宣告與實算相符
- G7 CI 擋實例名:注入違規行 → fail 並指出 sdd-check.md:77,exit 1;還原後 exit 0
- 漂移偵測:手改兩支 hook → 正確報 2 支、手改內容保住、產 .new;
  解掉後歸零;連跑三輪冪等

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-05 23:56:48 +08:00
parent 2a8c259d08
commit 6a49f25aef
23 changed files with 1259 additions and 132 deletions
+88
View File
@@ -0,0 +1,88 @@
# common.tsv — 兩個 profile 都要裝的產物(安裝清單的單一真相源)
#
# 為什麼有這張表(SDD jdd-dual-profile 決策 D1):
# 在這之前,安裝清單**硬編在 install.sh,另一份幾乎重複的硬編在 update.sh**。
# 兩份手抄的清單必然漂移——而且已經漂了:
# · wiki-first-search.sh 1.16.0 頭條功能)→ update 會裝,**install 不裝**
# · subagent-wiki-guard.sh 1.17.0 頭條功能)→ update 會裝,**install 不裝**
# · publish-lag-check.sh 1.18.0 頭條功能)→ update 會裝,**install 不裝**
# · wiki/decisions-summary.md → update 保留它,**install 不建**
# 但 CLAUDE.md 範本的「Wiki 讀取順序」表裡就列著它 ⇒ 新用戶開檔即撲空
# ⇒ **乾淨安裝反而拿不到最新三版的招牌功能**,只有「先裝舊版再 update」的人拿得到。
# 本表讓兩支腳本讀同一份清單,這類漂移在結構上不可能再發生。
#
# ── 欄位 ──────────────────────────────────────────────
# 1 src 來源。T:<路徑> template/ 底下;S:<路徑> scripts/ 底下;- 建目錄用
# 2 dest 安裝到實例的哪裡(相對實例根)
# 3 class overwrite 模板/邏輯檔,新版直接蓋(使用者不會手改)
# keep 使用者資料檔,**永遠不動**(蓋掉=清空他的記憶)
# add-if-missing 使用者資料檔,缺了才補,已有絕不覆蓋
# keep-with-template 使用者會手填的客製檔;保留原檔,新版另存 .template.<ext>
# claude-md 特殊:CLAUDE.md 走「框架區+本地補充區」組裝,見 install.sh
# dir 只建目錄
# 4 module core | wiki | sdd —— 對應 install.sh 的 --wiki/--sdd/--all 模組選擇
# 5 profile 這裡一律 commonrepo/orchestrator 專屬的在各自的 tsv
#
# ⚠️ 路徑契約:dest 一旦發佈就是對既有實例的承諾,**只增不移**
# (舊實例跑的是舊腳本,路徑寫死;搬檔=它們整排 404、更新機制本身壞掉)。
# 要改版面先跑 scripts/check-legacy-paths.sh。
#
#src dest class module profile
# ── 目錄骨架 ──
- system-dev/docs/1-vision dir core common
- system-dev/docs/2-architecture/decisions dir core common
- system-dev/docs/4-guides dir core common
- system-dev/docs/5-records/incidents dir core common
- system-dev/docs/5-records/test-reports dir core common
- system-dev/docs/6-user dir core common
- system-dev/scripts dir core common
- .claude/commands dir core common
- .claude/hooks dir core common
- .claude/hooks/lib dir core common
# ── core:兩個模組都要的底盤 ──
T:system-dev/docs/README.md system-dev/docs/README.md overwrite core common
T:system-dev/docs/4-guides/logseq-markers.md system-dev/docs/4-guides/logseq-markers.md overwrite core common
T:system-dev/VERSION system-dev/VERSION overwrite core common
S:install.sh system-dev/scripts/install.sh overwrite core common
S:update.sh system-dev/scripts/update.sh overwrite core common
T:.claude/commands/issue-handle.md .claude/commands/issue-handle.md overwrite core common
T:.claude/hooks/pre-write-guard.sh .claude/hooks/pre-write-guard.sh keep-with-template core common
T:.claude/hooks/lib/role-lib.sh .claude/hooks/lib/role-lib.sh overwrite core common
T:.claude/hooks/publish-lag-check.sh .claude/hooks/publish-lag-check.sh overwrite core common
# ── wiki 模組 ──
- system-dev/wiki dir wiki common
- system-dev/wiki/cards dir wiki common
T:system-dev/wiki/INDEX.md system-dev/wiki/INDEX.md overwrite wiki common
T:system-dev/wiki/TAXONOMY.md system-dev/wiki/TAXONOMY.md keep wiki common
T:system-dev/wiki/status.md system-dev/wiki/status.md keep wiki common
T:system-dev/wiki/mistakes.md system-dev/wiki/mistakes.md keep wiki common
T:system-dev/wiki/principles.md system-dev/wiki/principles.md add-if-missing wiki common
T:system-dev/wiki/decisions-summary.md system-dev/wiki/decisions-summary.md add-if-missing wiki common
T:system-dev/wiki/.wikiignore system-dev/wiki/.wikiignore keep wiki common
T:system-dev/docs/SKILL.md system-dev/docs/SKILL.md overwrite wiki common
T:.claude/commands/wiki-init.md .claude/commands/wiki-init.md overwrite wiki common
T:.claude/commands/wiki-capture.md .claude/commands/wiki-capture.md overwrite wiki common
T:.claude/commands/wiki-update.md .claude/commands/wiki-update.md overwrite wiki common
T:.claude/commands/wiki-recall.md .claude/commands/wiki-recall.md overwrite wiki common
T:.claude/commands/wiki-extract.md .claude/commands/wiki-extract.md overwrite wiki common
T:.claude/hooks/session-start-recall.sh .claude/hooks/session-start-recall.sh overwrite wiki common
T:.claude/hooks/wiki-secret-scan.sh .claude/hooks/wiki-secret-scan.sh overwrite wiki common
T:.claude/hooks/wiki-first-search.sh .claude/hooks/wiki-first-search.sh overwrite wiki common
T:.claude/hooks/subagent-wiki-guard.sh .claude/hooks/subagent-wiki-guard.sh overwrite wiki common
# ── sdd 模組 ──
- system-dev/docs/3-specs dir sdd common
- system-dev/workflows dir sdd common
T:system-dev/docs/3-specs/TEMPLATE-sdd/design.md system-dev/docs/3-specs/TEMPLATE-sdd/design.md overwrite sdd common
T:system-dev/docs/3-specs/TEMPLATE-sdd/tasks.md system-dev/docs/3-specs/TEMPLATE-sdd/tasks.md overwrite sdd common
T:system-dev/docs/3-specs/SDD-LIFECYCLE.md system-dev/docs/3-specs/SDD-LIFECYCLE.md overwrite sdd common
T:system-dev/docs/3-specs/pending-changes.md system-dev/docs/3-specs/pending-changes.md add-if-missing sdd common
T:system-dev/docs/2-architecture/decisions/TEMPLATE-adr.md system-dev/docs/2-architecture/decisions/TEMPLATE-adr.md overwrite sdd common
T:.claude/commands/sdd-check.md .claude/commands/sdd-check.md overwrite sdd common
T:.claude/hooks/sdd-guard.sh .claude/hooks/sdd-guard.sh overwrite sdd common
T:scripts/sdd-active-check.sh system-dev/scripts/sdd-active-check.sh overwrite sdd common
T:system-dev/workflows/tasks-project-sync.yaml system-dev/workflows/tasks-project-sync.yaml overwrite sdd common
T:system-dev/workflows/tasks-project-sync.local.sh system-dev/workflows/tasks-project-sync.local.sh overwrite sdd common
1 # common.tsv — 兩個 profile 都要裝的產物(安裝清單的單一真相源)
2 #
3 # 為什麼有這張表(SDD jdd-dual-profile 決策 D1):
4 # 在這之前,安裝清單**硬編在 install.sh,另一份幾乎重複的硬編在 update.sh**。
5 # 兩份手抄的清單必然漂移——而且已經漂了:
6 # · wiki-first-search.sh (1.16.0 頭條功能)→ update 會裝,**install 不裝**
7 # · subagent-wiki-guard.sh (1.17.0 頭條功能)→ update 會裝,**install 不裝**
8 # · publish-lag-check.sh (1.18.0 頭條功能)→ update 會裝,**install 不裝**
9 # · wiki/decisions-summary.md → update 保留它,**install 不建**,
10 # 但 CLAUDE.md 範本的「Wiki 讀取順序」表裡就列著它 ⇒ 新用戶開檔即撲空
11 # ⇒ **乾淨安裝反而拿不到最新三版的招牌功能**,只有「先裝舊版再 update」的人拿得到。
12 # 本表讓兩支腳本讀同一份清單,這類漂移在結構上不可能再發生。
13 #
14 # ── 欄位 ──────────────────────────────────────────────
15 # 1 src 來源。T:<路徑> = template/ 底下;S:<路徑> = scripts/ 底下;- = 建目錄用
16 # 2 dest 安裝到實例的哪裡(相對實例根)
17 # 3 class overwrite 模板/邏輯檔,新版直接蓋(使用者不會手改)
18 # keep 使用者資料檔,**永遠不動**(蓋掉=清空他的記憶)
19 # add-if-missing 使用者資料檔,缺了才補,已有絕不覆蓋
20 # keep-with-template 使用者會手填的客製檔;保留原檔,新版另存 .template.<ext>
21 # claude-md 特殊:CLAUDE.md 走「框架區+本地補充區」組裝,見 install.sh
22 # dir 只建目錄
23 # 4 module core | wiki | sdd —— 對應 install.sh 的 --wiki/--sdd/--all 模組選擇
24 # 5 profile 這裡一律 common(repo/orchestrator 專屬的在各自的 tsv)
25 #
26 # ⚠️ 路徑契約:dest 一旦發佈就是對既有實例的承諾,**只增不移**
27 # (舊實例跑的是舊腳本,路徑寫死;搬檔=它們整排 404、更新機制本身壞掉)。
28 # 要改版面先跑 scripts/check-legacy-paths.sh。
29 #
30 #src dest class module profile
31 # ── 目錄骨架 ──
32 - system-dev/docs/1-vision dir core common
33 - system-dev/docs/2-architecture/decisions dir core common
34 - system-dev/docs/4-guides dir core common
35 - system-dev/docs/5-records/incidents dir core common
36 - system-dev/docs/5-records/test-reports dir core common
37 - system-dev/docs/6-user dir core common
38 - system-dev/scripts dir core common
39 - .claude/commands dir core common
40 - .claude/hooks dir core common
41 - .claude/hooks/lib dir core common
42 # ── core:兩個模組都要的底盤 ──
43 T:system-dev/docs/README.md system-dev/docs/README.md overwrite core common
44 T:system-dev/docs/4-guides/logseq-markers.md system-dev/docs/4-guides/logseq-markers.md overwrite core common
45 T:system-dev/VERSION system-dev/VERSION overwrite core common
46 S:install.sh system-dev/scripts/install.sh overwrite core common
47 S:update.sh system-dev/scripts/update.sh overwrite core common
48 T:.claude/commands/issue-handle.md .claude/commands/issue-handle.md overwrite core common
49 T:.claude/hooks/pre-write-guard.sh .claude/hooks/pre-write-guard.sh keep-with-template core common
50 T:.claude/hooks/lib/role-lib.sh .claude/hooks/lib/role-lib.sh overwrite core common
51 T:.claude/hooks/publish-lag-check.sh .claude/hooks/publish-lag-check.sh overwrite core common
52 # ── wiki 模組 ──
53 - system-dev/wiki dir wiki common
54 - system-dev/wiki/cards dir wiki common
55 T:system-dev/wiki/INDEX.md system-dev/wiki/INDEX.md overwrite wiki common
56 T:system-dev/wiki/TAXONOMY.md system-dev/wiki/TAXONOMY.md keep wiki common
57 T:system-dev/wiki/status.md system-dev/wiki/status.md keep wiki common
58 T:system-dev/wiki/mistakes.md system-dev/wiki/mistakes.md keep wiki common
59 T:system-dev/wiki/principles.md system-dev/wiki/principles.md add-if-missing wiki common
60 T:system-dev/wiki/decisions-summary.md system-dev/wiki/decisions-summary.md add-if-missing wiki common
61 T:system-dev/wiki/.wikiignore system-dev/wiki/.wikiignore keep wiki common
62 T:system-dev/docs/SKILL.md system-dev/docs/SKILL.md overwrite wiki common
63 T:.claude/commands/wiki-init.md .claude/commands/wiki-init.md overwrite wiki common
64 T:.claude/commands/wiki-capture.md .claude/commands/wiki-capture.md overwrite wiki common
65 T:.claude/commands/wiki-update.md .claude/commands/wiki-update.md overwrite wiki common
66 T:.claude/commands/wiki-recall.md .claude/commands/wiki-recall.md overwrite wiki common
67 T:.claude/commands/wiki-extract.md .claude/commands/wiki-extract.md overwrite wiki common
68 T:.claude/hooks/session-start-recall.sh .claude/hooks/session-start-recall.sh overwrite wiki common
69 T:.claude/hooks/wiki-secret-scan.sh .claude/hooks/wiki-secret-scan.sh overwrite wiki common
70 T:.claude/hooks/wiki-first-search.sh .claude/hooks/wiki-first-search.sh overwrite wiki common
71 T:.claude/hooks/subagent-wiki-guard.sh .claude/hooks/subagent-wiki-guard.sh overwrite wiki common
72 # ── sdd 模組 ──
73 - system-dev/docs/3-specs dir sdd common
74 - system-dev/workflows dir sdd common
75 T:system-dev/docs/3-specs/TEMPLATE-sdd/design.md system-dev/docs/3-specs/TEMPLATE-sdd/design.md overwrite sdd common
76 T:system-dev/docs/3-specs/TEMPLATE-sdd/tasks.md system-dev/docs/3-specs/TEMPLATE-sdd/tasks.md overwrite sdd common
77 T:system-dev/docs/3-specs/SDD-LIFECYCLE.md system-dev/docs/3-specs/SDD-LIFECYCLE.md overwrite sdd common
78 T:system-dev/docs/3-specs/pending-changes.md system-dev/docs/3-specs/pending-changes.md add-if-missing sdd common
79 T:system-dev/docs/2-architecture/decisions/TEMPLATE-adr.md system-dev/docs/2-architecture/decisions/TEMPLATE-adr.md overwrite sdd common
80 T:.claude/commands/sdd-check.md .claude/commands/sdd-check.md overwrite sdd common
81 T:.claude/hooks/sdd-guard.sh .claude/hooks/sdd-guard.sh overwrite sdd common
82 T:scripts/sdd-active-check.sh system-dev/scripts/sdd-active-check.sh overwrite sdd common
83 T:system-dev/workflows/tasks-project-sync.yaml system-dev/workflows/tasks-project-sync.yaml overwrite sdd common
84 T:system-dev/workflows/tasks-project-sync.local.sh system-dev/workflows/tasks-project-sync.local.sh overwrite sdd common
+16
View File
@@ -0,0 +1,16 @@
# orchestrator.tsv — 「總管」profile 專屬產物
#
# 這個 profile 是誰:管一群成員 repo 的上層資料夾(PM/總管)。它的憲法效忠
# root.md journeys.mdPM 軌),裡面的 agent 預設身分是 orchestrator
# (可寫 root/journeys/sprint**禁寫 code、禁改 tasks/requirements/design**)。
#
# ⚠️ 本表目前只有憲法一項。Phase 2(JDD 文件範本:root.md / journeys.md / sprint /
# triage-map / plugin-load-order)與 Phase 3orchestrator-scope-guard.sh
# 的產物**尚未開工**,總管指定 Phase 1 做完先停下驗 Gherkin。屆時往這張表加行即可,
# 不必再改 install.shupdate.sh —— 這正是 manifest 的用意(加產物=加一行資料)。
#
# 欄位定義見 common.tsv。
#
#src dest class module profile
T:profiles/orchestrator/CLAUDE.md CLAUDE.md claude-md core orchestrator
1 # orchestrator.tsv — 「總管」profile 專屬產物
2 #
3 # 這個 profile 是誰:管一群成員 repo 的上層資料夾(PM/總管)。它的憲法效忠
4 # root.md + journeys.md(PM 軌),裡面的 agent 預設身分是 orchestrator
5 # (可寫 root/journeys/sprint,**禁寫 code、禁改 tasks/requirements/design**)。
6 #
7 # ⚠️ 本表目前只有憲法一項。Phase 2(JDD 文件範本:root.md / journeys.md / sprint /
8 # triage-map / plugin-load-order)與 Phase 3(orchestrator-scope-guard.sh)
9 # 的產物**尚未開工**,總管指定 Phase 1 做完先停下驗 Gherkin。屆時往這張表加行即可,
10 # 不必再改 install.sh/update.sh —— 這正是 manifest 的用意(加產物=加一行資料)。
11 #
12 # 欄位定義見 common.tsv。
13 #
14 #src dest class module profile
15 T:profiles/orchestrator/CLAUDE.md CLAUDE.md claude-md core orchestrator
+15
View File
@@ -0,0 +1,15 @@
# repo.tsv — 「成員 repo」profile 專屬產物
#
# 這個 profile 是誰:一個實際寫 code 的子專案 repo。它的憲法效忠 requirements.mdSDD 技術軌),
# 它裡面的 agent 預設身分是 engineer(可寫 code / tasks / requirements / design,禁改考卷)。
#
# 為什麼這張表這麼短:SDD 三件式、repo 級 wiki 規範等**本來就在 common**——
# 它們是兩個 profile 共用的底盤。真正只屬於 repo profile 的,就是那部憲法本身。
# (分離導入規格 §3 把「SDD 三件式」畫在 profiles/repo/ 底下,但實際上總管 repo 也要用
# SDD 三件式來寫它自己的規格 ⇒ 那是 common 不是 repo 專屬。見 design 決策 D5 同理。)
#
# 欄位定義見 common.tsv。
#
#src dest class module profile
T:profiles/repo/CLAUDE.md CLAUDE.md claude-md core repo
1 # repo.tsv — 「成員 repo」profile 專屬產物
2 #
3 # 這個 profile 是誰:一個實際寫 code 的子專案 repo。它的憲法效忠 requirements.md(SDD 技術軌),
4 # 它裡面的 agent 預設身分是 engineer(可寫 code / tasks / requirements / design,禁改考卷)。
5 #
6 # 為什麼這張表這麼短:SDD 三件式、repo 級 wiki 規範等**本來就在 common**——
7 # 它們是兩個 profile 共用的底盤。真正只屬於 repo profile 的,就是那部憲法本身。
8 # (分離導入規格 §3 把「SDD 三件式」畫在 profiles/repo/ 底下,但實際上總管 repo 也要用
9 # SDD 三件式來寫它自己的規格 ⇒ 那是 common 不是 repo 專屬。見 design 決策 D5 同理。)
10 #
11 # 欄位定義見 common.tsv。
12 #
13 #src dest class module profile
14 T:profiles/repo/CLAUDE.md CLAUDE.md claude-md core repo