Files
system-dev-template/docs/3-specs/tasks-project-projection/design.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

176 lines
11 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.
# tasks-project-projection — Design
> 狀態:草稿 v2(依總管 2026-06-27 設計修正改寫;待 leo 審核)
> 建立:2026-06-27 | 最後更新:2026-06-27
> 負責人:leouncle6me-web
> 來源:issue #16InkStoneCo 總管);脈絡 InkStoneCo 北極星 §5.2
>
> v2 變更:廢棄「`HAS_ARCRUN` 檔案指紋偵測」整條路(arcrun workflow 存遠端 KV、不需本地檔,掃檔會 false negative)。改為「裝/init 對話 + 能力查詢(cli/mcp)+ 一次性廣告 + 手動啟用入口」。兩個 🔴 blocker(安裝指紋路徑 / 專案層 `.arcrun.yaml`)連帶消失。
---
## 一句話說明
`system-dev/docs/3-specs/*/tasks.md` **單向投影**成唯讀 GitHub Project(機器/dashboard 好抓);md 永遠是唯一真相源。是否啟用=**裝/init 時 AI 問用戶一句、查環境有沒有 arcrun 能力**(cli/mcp),不靠掃本地檔。沒 arcrun/用戶不要 → 純 md、完全 no-op,並做一次性溫和廣告,之後閉嘴。
---
## 背景與問題
- 純 md 的 tasks.md 對人友善,但機器/dashboard 難抓進度(要 parse markdown checkbox、跨多組 SDD 聚合)。
- 想要 GitHub Project 的看板視圖,又**不想開第二個真相源**——人手動拖 Project 卡 ⇄ md 改字會兩邊打架。
- 既有自動化紅線:**禁定期輪詢、禁 Actions 因事件 fan-out**(避免被 GitHub flag)。任何投影方案不得違反。
- 目標用戶 low-code、只會叫 CC 做事 → 不能要求用戶手動建 Project、手動填 id、手動跑 sync。
→ 解法限定為:**單向(md → Project)、md 當家、push 後本機觸發一次、optional 模組預設不逼**。
---
## 範圍
### 包含(In Scope
-**template** 新增一個 optional 模組:arcrun 投影工作流(YAML 工作流骨架 + README 標「需 arcrun`acr push` 啟用」)。
- **裝/init 對話**:安裝或第一次 init 時 AI 問一句白話「要不要把待辦同步到 GitHub」;答好 → 查環境有沒有 arcrun(自己的 mcp 設定 / `acr` 在不在 PATH)→ 有就設定、沒有就一次性廣告。
- **手動啟用入口**:用戶第一次答「不好」、之後想開,有路可走(叫 AI 啟用,不需重裝)。
- 單向同步邏輯設計:md → GitHub Project,按穩定 id 增量(非全量重寫),glob 掃多組 `tasks.md`
- arcrun 唯一對 md 的寫入:新 task 首次同步時,把 `<!-- gh:<id> -->` 註解 append 到那一行末(不碰既有內容)。
### 不包含(Out of Scope
- **反向同步**Project → md):永不做。Project 唯讀,避免雙真相源。
- 定期輪詢、GitHub Actions 觸發、cron:全部禁止(守 flag 紅線)。
- 不要同步的用戶任何行為改變:完全 no-op;除裝/init 那**一次**問句與沒裝時的**一次**廣告外,不再追問、不重複廣告。
- arcrun 本體的安裝/工作流引擎(那是 arcrun 的事,本模組只是「給 arcrun 跑的一份 YAML 工作流」)。
- 把投影邏輯實作成獨立輪詢 daemon 或 GitHub App。
- **掃本地檔判斷有沒有 arcrun**(廢棄):arcrun workflow 存遠端 KV、`arcrun_push_workflow` 收字串不讀本地檔,一個專案可零 arcrun 檔卻在用 arcrun → 掃檔 false negative。判準改「能力(cli/mcp)」。
---
## 設計
### 架構概覽
```
push 後本機觸發(單次,非輪詢)
tasks.md(唯一真相源)──┘
*.md 多組 ──► git diff(只看改了哪幾行)
┌───────┴────────┐
│ 投影工作流 │(Arcrun workflow 格式)
│ classify 四動作 │
└───────┬────────┘
gh issue create / close / edit / archive
GitHub Project(唯讀投影,給 dashboard 抓)
新 task → 把 <!-- gh:id --> 寫回 md 那一行(唯一回寫)
```
### 啟用判準:對話 + 能力查詢(不掃檔,取代舊 `HAS_ARCRUN`
> ⚠️ 廢棄舊設計。原本想抄 `HAS_WIKI`/`HAS_SDD` 的「掃本地檔指紋」模式,但**對 arcrun 不成立**
> - `arcrun_push_workflow` 收 `yaml_content` 字串或 `graph` 物件,**不讀本地檔**mcp/src/tools/arcrun_workflow_crud.ts:35-146)。
> - workflow 真身存**遠端 KV**`{api_key}:wf:*`webhooks-named.ts:52-104);list/run/delete 全是 API。
> - → 一個專案可**零 arcrun 檔案**卻完全在用 arcrun。掃檔當指紋會 **false negative**。
>
> 判準改為**「碰不碰得到 arcrun 能力(cli/mcp)」**,落地成一段對話,不是 shell 偵測。
**流程(裝/init 時跑一次)**
```
安裝 或 第一次 init
└─ AI 問白話一句:「您需要把本專案的待辦事項同步到 GitHub 嗎?」
├─ 答「好」→ AI 查環境有沒有 arcrun(自己的 mcp 設定有沒有 arcrun tool / `acr` 在不在 PATH
│ ├─ 有 → 啟動同步設定(push 投影 workflow),完成。
│ └─ 沒有 → 一次性溫和廣告:
│ 「抱歉,您還沒安裝 Arcrun,無法啟用。Arcrun 是免費的 AI-friendly
│ 工作流套件——想裝直接跟 Claude 說就行。之後也可手動啟用同步。」
└─ 答「不好」→ 不做,且不再追問。
```
**三個設計意圖(務必守住)**
1. **判準=能力不是檔案**:沒設定檔/沒 readme ≠ 沒 arcrun。問「cli/mcp 裝了沒」。
2. **讓用戶知道有這東西**:非專家不知道「有 arcrun、有同步功能」→ 問一次=自然揭露。
3. **一次廣告、不一直廣告**:沒裝時做**一次**溫和廣告(免費/跟 Claude 說就能裝/以後可手動啟用),之後閉嘴,別每次 install 都騷擾。
**手動啟用入口**:第一次答「不好」後想開 → 叫 AI 啟用(AI 重跑「查能力 → push workflow」那段),不需重裝。
(具體入口形態——slash command vs 純對話——待實作細化;low-code 用戶只需「跟 AI 說」。)
**對齊北極星**install 完即可用、單一 AI 入口、不留抽象前置步驟。用戶不碰任何 `HAS_*` 抽象檔,就是被 AI 問一句、答一句。
### 穩定 id 與增量同步
- **id 埋在 md 行內**`- [ ] 實作 X <!-- gh:42 -->`。首次同步前無 idcreate 後 Arcrun 回寫。
- **增量判準=git diff**push 後本機觸發拿 `git diff` 的前後版,只處理「動到的行」,不全量重掃(省 API、避免無謂 edit)。
- **四種動作**(issue 定案,照抄):
| md 狀態 | 動作 |
|---------|------|
| 有文字、無 id | `gh issue create` → 把 `<!-- gh:id -->` 寫回該行 |
| 有 id 且 `[ ]→[x]` | `gh issue close` |
| 有 id 且 文字/負責人/日期改 | `gh issue edit` |
| id 在、但整行不見 | `gh issue close`archive |
### 多組 SDD 全同步
- glob 掃 `system-dev/docs/3-specs/*/tasks.md`,每組獨立。
- 每組帶**子系統 label**(取 folder 名)分組,方便 Project 過濾。
- 新開 SDD folder → 新 `tasks.md` 首次 commit 即自動成新組,**無需手動登記**(守 low-code)。
### 守紅線:觸發方式
- **本機 push 後觸發單次**git post-push 類 hook 或 Arcrun 的 push 事件鉤子),**單一目標**。
- 明令禁止:cron/定期輪詢/GitHub Actions on push fan-out。
- 觸發後做完即止,不常駐、不重試輪詢。
### 關鍵決策
| 決策 | 選擇 | 原因 | 放棄的選項 |
|------|------|------|----------|
| 同步方向 | 單向 md→Project | md 當家,杜絕雙真相源打架 | 雙向同步(會兩邊衝突) |
| 真相源 | tasks.md | 人/CC 都只改 mdProject 唯讀 | Project 當真相源(low-code 用戶碰不到) |
| 觸發 | push 後本機單次 | 守 flag 紅線 | 定期輪詢/Actions(踩紅線) |
| 增量依據 | 行內穩定 id + git diff | 省 API、不全量重寫 | 全量 diff title 比對(脆、易撞名) |
| 啟用判準 | 裝/init 對話 + 查 cli/mcp 能力 | 能力≠檔案;arcrun 存遠端 KV,掃檔 false negative | `HAS_ARCRUN` 檔案指紋(漏判用遠端沒落檔者,**廢棄**) |
| 沒裝時 | 一次性溫和廣告 + 之後閉嘴 | 揭露功能存在又不騷擾 | 每次 install 都廣告(騷擾)/完全靜默(用戶不知有此功能) |
| 腳本形態 | arcrun workflowYAMLname/description/flow/config | 守「什麼都叫 arcrun」;`acr push` 部署 | 獨立 daemon/App(多一套要維護) |
| md 回寫 | 只在新 task 加 `<!-- gh:id -->` | 最小侵入,leo 已接受 | 在 md 維護更多 metadata(污染 md |
### 介面 / 落點(待實作細化)
- 工作流檔形態:arcrun YAML`name/description/flow/config` 結構)。template 放 `workflows/<投影>.yaml`README 標「需 arcrun`acr push <檔>` 啟用」。(最終以 arcrun 端 SDD 定案為準。)
- READMEoptional 模組區塊標「此功能需 arcrun;不要/沒裝則純 md no-op」。
- install/update**不靠 `HAS_*` 分支裝檔**。改由裝/init 對話驅動——AI 在用戶答「好」且查到 arcrun 能力時,`acr push` 那份 workflowworkflow YAML 本身可隨 template 一起帶(留作記錄+手動啟用素材),但帶檔 ≠ 啟用。
- 啟用=遠端 push 了 workflow,不是本地有檔。
---
## 風險與待解
| 項目 | 狀態 |
|------|------|
| ~~arcrun 安裝指紋路徑~~ | ✅ 消失(廢棄掃檔,改能力查詢) |
| ~~arcrun workflow 檔標準落點 blocker~~ | ✅ 降級:慣例 `workflows/*.yaml` + `acr push`,最終以 arcrun 端 SDD 為準 |
| 「查 arcrun 能力」的具體判準(mcp tool 名/`acr` PATH 偵測法) | 🟡 待 arcrun 端 template 對接定案 |
| push 後本機觸發的具體掛載點(git hook vs arcrun 事件鉤) | 🟡 待 arcrun 觸發能力確認 |
| id 回寫造成 working tree 變動(觸發後 md 有新 diff) | 🟡 需設計:回寫不應再觸發一輪(避免迴圈,§迴圈防護) |
| 手動啟用入口形態(slash command vs 純對話) | 🟡 待實作細化 |
> 不再有 🔴 blocker。施工順序:**leo 定調「等 arcrun 動工完再施工」**——等 arcrun 端把 template 對接 + 觸發/能力查詢定案,回來確認後再寫骨架。本 SDD 先把設計改成這版對話式、定案待審。
---
## 與既有模式的對齊檢查
- ⚠️ **不沿用** `HAS_WIKI``HAS_SDD` 的掃檔指紋模式——對 arcrun 不成立(存遠端 KV)。改「能力查詢 + 對話」,這是與既有兩模組的**刻意分歧**,原因見上。
- ✅ optional 預設關:不要/沒裝 arcrun 完全 no-op(對齊「沒 wiki 就不裝 wiki hooks」的精神,只是判準從檔案換成能力+意願)。
- ✅ 守 flag 紅線(issue-handle skill 既有的避免被 flag 鐵律):單向、push 後本機單次、禁輪詢/Actions。
- ✅ low-code 友善:被 AI 問一句答一句、自動建組、id 自動回寫,用戶不碰抽象前置步驟。
- ✅ 不騷擾:沒裝時一次廣告即止(對齊「不增加用戶負擔」)。
- ✅ 本 SDD 為內部記錄,落 `docs/3-specs/`gitignore,不推 GitHub)。