feat(W2 Phase 2-3): JDD 文件範本+八條封路 hook+還清兩件舊債

SDD: docs/3-specs/jdd-dual-profile(active)。編號 task 26/33 完成,Phase 4-5 未開工。

■ Phase 2 JDD 文件範本(orchestrator profile)
範本形狀對齊「實際跑出來的那兩份」(總管已寫的 root.md 15 卡、journeys.md J-1 九站),
不是照規格憑空造:
- 卡片是巢狀 bullet(`- **P1** 🟢 …` + 子項放來源/對帳),非規格畫的平行文字行
- 站點索引**巢狀 bullet 不用表格**(表格會把層級壓平,看不出從屬)
- 兩份都保留「這卷還缺什麼(誠實記)」收尾段——規格沒有,但那是防假綠的地方
新增:root.md / journeys.md / sprint.md / triage-map.md 四範本(add-if-missing,
填了就永不覆蓋)+ plugin-load-order.md(W3 插槽,框架不發明平行外掛格式)

■ Phase 3 封路 hook(八條規則落六支檔)
- role-guard(J1+J2+J3)★命門:考生不能改考卷。六組實測含「考題藏在別的 md 裡」也擋
- jdd-format-guard(J4+J5+J8):紅卡缺對帳日/任務缺站號/PM 文件混技術名詞
- station-done-guard(J6):收工判準是站的考題全綠,不是任務全關
- regression-scope(J7):動實作 → 列出要重考哪幾題(只提醒不擋)
- install-artifact-guard(S1):實例不改機制
- orchestrator-scope-guard(S4):總管不進成員 repo 動實作(從實例上收進框架,
  路徑清單改由實例自填,範本零專名)
掛載鏈依「範圍大的擋在前」:改機制 → 角色 → 位置 → 格式 → 既有三支

■ 還清兩件舊債
- update.sh 檔案清單改讀 manifest(舊硬編降為抓不到來源時的 fallback)
  ——install/update 兩份手抄清單漂移的根因全修
- CLAUDE.md 界標補植:舊實例全文原封包進本地區、框架區重鋪、原檔備份、冪等
  ——解開「沒界標⇒不敢覆蓋⇒框架改的憲法永遠送不到既有實例」這個死結

■ 修掉三個自己造的問題(實測抓出來的,不是想出來的)
- jdd-format-guard 誤擋真實 journeys.md 的「這卷還缺什麼」自述段
  → 排除法改**正面圈定**(只掃卡片本體與站內文),說明區/自述段/索引自然不在範圍
- install-artifact-guard 把 pre-write-guard.sh 也擋了——而它的錯誤訊息正叫人去改那支
  → 使用者自訂插槽列為最優先放行
- check-legacy-paths 用 HEAD 當基準會**自我弱化**:改成清單驅動後保護範圍 35→29 條
  → 基準改指最後一次真正發佈的版本

■ 實測(全部貼過輸出)
- G2 考生改考卷:6/6,含 orchestrator 寫 code/engineer 改考題/考題藏別處
- G4 憲法分流:兩環境重裝,總管版技術軌關鍵字 0、成員版上游指針 8,界標 4/4
- G6 實例改機制:4/4,含框架開發標記放行與自訂插槽放行
- G7 CI 擋實例名:注入違規 → 指出檔案行號 exit 1
- G3 進度以站計量:起牀推「J-1 已點亮 2/9 站」、收工列未亮站並禁用任務數當理由
- 回歸考、界標補植冪等、orchestrator-scope-guard 四組:全通

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-08-06 00:26:56 +08:00
parent 6a49f25aef
commit 2f5d9f3bb2
18 changed files with 1246 additions and 83 deletions
+11
View File
@@ -52,6 +52,17 @@ T:.claude/hooks/pre-write-guard.sh .claude/hooks/pre-write-guard.sh keep-with-te
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
# ── JDD 封路 hook(角色軸屬 common,兩個 profile 都裝)──
# 為什麼 role-guard 不按 profile 分裝(設計決策 D5):
# 總管 repo 裡也會派 engineer subagent(身分矩陣右上角那一格)。
# 若「考生不能改考卷」只裝在成員 repo,那顆 subagent 在總管 repo 裡就改得動考卷
# ——而總管 repo 正是考卷所在地,等於這條規則在最該生效的地方失效。
T:.claude/hooks/install-artifact-guard.sh .claude/hooks/install-artifact-guard.sh overwrite core common
T:.claude/hooks/role-guard.sh .claude/hooks/role-guard.sh overwrite core common
T:.claude/hooks/jdd-format-guard.sh .claude/hooks/jdd-format-guard.sh overwrite core common
T:.claude/hooks/station-done-guard.sh .claude/hooks/station-done-guard.sh overwrite core common
T:.claude/hooks/regression-scope.sh .claude/hooks/regression-scope.sh overwrite core common
# ── wiki 模組 ──
- system-dev/wiki dir wiki common
- system-dev/wiki/cards dir wiki common
1 # common.tsv — 兩個 profile 都要裝的產物(安裝清單的單一真相源)
52 # ── wiki 模組 ── # ── JDD 封路 hook(角色軸屬 common,兩個 profile 都裝)──
53 - # 為什麼 role-guard 不按 profile 分裝(設計決策 D5):
54 - # 總管 repo 裡也會派 engineer subagent(身分矩陣右上角那一格)。
55 # 若「考生不能改考卷」只裝在成員 repo,那顆 subagent 在總管 repo 裡就改得動考卷
56 # ——而總管 repo 正是考卷所在地,等於這條規則在最該生效的地方失效。
57 T:.claude/hooks/install-artifact-guard.sh
58 T:.claude/hooks/role-guard.sh
59 T:.claude/hooks/jdd-format-guard.sh
60 T:.claude/hooks/station-done-guard.sh
61 T:.claude/hooks/regression-scope.sh
62 # ── wiki 模組 ──
63 -
64 -
65 T:system-dev/wiki/INDEX.md
66 T:system-dev/wiki/INDEX.md T:system-dev/wiki/TAXONOMY.md
67 T:system-dev/wiki/TAXONOMY.md T:system-dev/wiki/status.md
68 T:system-dev/wiki/status.md T:system-dev/wiki/mistakes.md
+10 -4
View File
@@ -4,13 +4,19 @@
# 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 的用意(加產物=加一行資料)
# ⚠️ 四份 JDD 文件的 class 是 add-if-missing,這是刻意的:
# 給你一份可以直接動手填的骨架,但**一旦你填了內容,update 永遠不會覆蓋**。
# 理由:這幾份是**實例資料**不是框架邏輯——裡面寫的是你的需求、你的旅程、你的站。
# 來源檔名帶 .template 後綴、落地時去掉:來源是範本,落地就是你的文件了
#
# 欄位定義見 common.tsv。
#
#src dest class module profile
T:profiles/orchestrator/CLAUDE.md CLAUDE.md claude-md core orchestrator
T:profiles/orchestrator/docs/root.md.template system-dev/docs/root.md add-if-missing core orchestrator
T:profiles/orchestrator/docs/journeys.md.template system-dev/docs/journeys.md add-if-missing core orchestrator
T:profiles/orchestrator/docs/sprint.md.template system-dev/docs/sprint.md add-if-missing core orchestrator
T:profiles/orchestrator/docs/triage-map.md.template system-dev/docs/triage-map.md add-if-missing core orchestrator
T:profiles/orchestrator/docs/plugin-load-order.md system-dev/docs/plugin-load-order.md overwrite core orchestrator
T:profiles/orchestrator/hooks/orchestrator-scope-guard.sh .claude/hooks/orchestrator-scope-guard.sh overwrite core orchestrator
1 # orchestrator.tsv — 「總管」profile 專屬產物
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 / # ⚠️ 四份 JDD 文件的 class 是 add-if-missing,這是刻意的:
8 # triage-map / plugin-load-order)與 Phase 3(orchestrator-scope-guard.sh) # 給你一份可以直接動手填的骨架,但**一旦你填了內容,update 永遠不會覆蓋**。
9 # 的產物**尚未開工**,總管指定 Phase 1 做完先停下驗 Gherkin。屆時往這張表加行即可, # 理由:這幾份是**實例資料**不是框架邏輯——裡面寫的是你的需求、你的旅程、你的站。
10 # 不必再改 install.sh/update.sh —— 這正是 manifest 的用意(加產物=加一行資料)。 # 來源檔名帶 .template 後綴、落地時去掉:來源是範本,落地就是你的文件了。
11 #
12 # 欄位定義見 common.tsv。
13 #
14 #src
15 T:profiles/orchestrator/CLAUDE.md
16 T:profiles/orchestrator/docs/root.md.template
17 T:profiles/orchestrator/docs/journeys.md.template
18 T:profiles/orchestrator/docs/sprint.md.template
19 T:profiles/orchestrator/docs/triage-map.md.template
20 T:profiles/orchestrator/docs/plugin-load-order.md
21 T:profiles/orchestrator/hooks/orchestrator-scope-guard.sh
22