Files
ISEP/commands/cp-write.md
T
Leo c2638668e3 ISEP 0.1.0:環境設定收成一個 plugin,本機與雲端共用一份
leo 2026-08-20:「同一個 plugin 你用,薄殼也用,保證兩邊同步」
              「我要你幫雲端做薄殼,永遠都有問題,你要做的就是這組設定
                你自己可以 dogfooding」

搬進來:41 支 hook(51 條註冊)/7 支 command/2 支 skill/23 支腳本。
不搬 .env、wiki、docs——那些是知識不是環境。

51 條 hook 路徑全部從 $CLAUDE_PROJECT_DIR/.claude/hooks/ 改成 ${CLAUDE_PLUGIN_ROOT}/hooks/,
零漏網。那正是薄殼一直壞掉的根:雲端 cwd 不是真身,寫死路徑就斷。

尚未驗證:Claude Code 能不能從私有 Gitea repo 裝 marketplace(要憑證)。
下一步就是在本機實際裝一次,通了才動雲端 bootstrap.sh。

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-20 11:41:46 +08:00

307 lines
19 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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: cp-write
description: |
要寫或改任何 CPCritical Path)檔案之前必讀——動 system-dev/docs/3-specs/critical-paths/
底下任何檔案、標記某關卡 ✅/◐/❌、或新增一條 CP 時自動載入。
leo 2026-07-30:「上次已經跟你討論一次並且寫了正確範本,立刻全部忘光了」。
三條鐵律:寫目的不寫功能/每步交出 deliverable/code 寫完沒部署不准標 ✅。
另含 Logseq outliner 格式(給 leo 讀的 md 一律巢狀 bullet、禁表格平攤)。
---
# /cp-write — 寫或改一條 CPCritical Path
**要動 `system-dev/docs/3-specs/critical-paths/` 底下任何檔案之前,先跑這個。**
---
## 為什麼有這支 skill
leo 2026-07-30:「你去把寫 cp 的方法寫成 skill,**上次已經跟你討論一次並且寫了正確範本,立刻全部忘光了**。」
- **忘光的機制**(結構問題,不是記性問題)
- 規範住在 `TEMPLATE-critical-path.md`209 行)
- CC 不會在動筆前主動讀 209 行文件 → 憑印象寫 → 寫成功能清單
- 「該讀的文件存在」≠「會被讀到」
- **同一天內 leo 糾正四次**
- 「不是有定義 CP 的寫法?outliner,步驟,有關任務」
- 「你不要再去寫一個個功能,**要寫的是目的**,每次交出 deliverable」
- 「上次說過,CP 有順序的跟無序的兩種」
- 「CP 每個步驟要拉哪些任務,**不是自己編一堆新任務**…你去搜尋先前的你寫的範本」
- ⇒ 規範要在**動筆那一刻**被載入,不是躺在檔案裡等人想起來
---
## 六條鐵律
違反就是寫錯,不是風格問題。
### 1. 寫目的,不寫功能
> leo:「你不要再去寫一個個功能,要寫的是目的,達成那個目的,**每次交出 deliverable**,而不是交出一個程式碼打勾就完成了。」
- ❌ 錯:「`/cypher/search` 接 registry」
- ✅ 對:
- **目的**:AI 拿到的答案必須是真的——假信號比沒答案更糟
- **交付物**:查詢回應含 found/missing/unknownfound 附 input_schema
- **檢查法**:每步唸出來,聽起來像「我要改哪個檔案」→ 重寫成「達成什麼、交出什麼」
### 2. 從 tasks 池子撈任務,不在 CP 裡編新任務
> leo 2026-07-30:「**如果在這裡編任務,不就是廢掉了原本的 SDD,那到底要照 SDD 做事還是照 CP?**」
🔴 **2026-08-10 leo 定調:CP 只標編號,不重抄條目。原話——**
> 「CP 寫大計劃,加上描述,然後在 issues 寫明,**在 CP 標示 issue 編號**
> 如果是在 issue 的內部 MD,一樣寫 `issue #2, task #?`,在 issue 從**標題層級**來找,
> 只要能 mapping 某 task。CP 一向就是寫計劃,把所需的 task 標示,**避免同一條目重抄一次**。」
> leo 2026-08-10(同日補充,這句是骨架):
> 「**SDD 的 tasks 指向 issuesCP 的 tasks 指向 issues,永遠管理 issues。**」
- **三層,只有一層可寫**
```
SDD tasks ──指向──┐
├──▶ issue ← 唯一管理處(勾選/s/* 狀態/執行細節/往返對話)
CP tasks ──指向──┘
```
- **issue=任務池子**`issue-handle` 2026-08-09 定調):任務本體、勾選、狀態都只住這裡
- **SDD=規格與設計**(為什麼要做、怎麼做);它的 tasks 是**指向 issue 的清單**,不自己養 checkbox
- **CP=大計劃+排序**(現在先做哪些);寫目的與描述,任務只放**編號 pointer**`w=`
- **⇒ 兩邊都只是視角,動狀態一律回 issue。**
- 🔴 **CP 裡不准出現 `- [ ]` / `- [x]`**——checkbox 就是「在發號」,而 CP 不發號
- 要知道做到哪 → 去看票。CP 只回答「這一步通不通」(三態)
- **同一條目寫兩次 = 兩份真相 = 必然漂移**(2026-08-10 實錯:CP 四筆停在事發前的世界,
issue 那邊才是對的;總管花一整輪在對帳)
- **定址:指到「一張票」,不指票裡的某一行**(D58leo 2026-08-10
> leo:「**充分利用 gitea 的機制,不要硬做個不支援的機制,容易出錯。**」
Gitea 原生就會把 issue 引用自動變成可點連結 ⇒ **CP 不必手貼網址、不必造錨點。**
```markdown
- `w=9` Leo/arcrun-rag#52 — 重裝到已有資料的帳號,登入與資料庫一起壞
```
- 🔴 **最好用的判準**:**需要指到票裡的某一行 = 那張票該拆了。**
這個限制反而**強迫出正確的顆粒度**
- **票的刀口不是「大小」,是「狀態」**:問「它會不會需要跟隔壁那條不同的狀態?」
會 → 獨立成執行票;不會 → 留在該票裡當 checkbox
- **討論票 vs 執行票**:討論票是脈絡(不當工單追),執行票才是 CP 該指的東西
- ⚠️ **已作廢:隱形錨點 `<a id="tNNN">`**(D53,同日上線同日推翻)——**不要撿回去**。
它整段推理嚴謹,**但沒有先問「這個平台原生支援嗎」**。
造任何機制前先問:「原生支援嗎?」「不支援是不是在說我方向錯了?」
- **自檢**:CP 上任何一行任務,拿它的編號去票裡找得到唯一一條嗎?
- 找不到 → 你違規了。要嘛去票裡補,要嘛從 CP 刪掉
- **絕不能留在 CP 裡當「CP 專屬任務」**
- **`w=` 的正確用法**leo 原話)
- 「從**很多任務**中找到跟現在目的**最近**的是誰,**把它排序到前面**」
- 「**w 是標在 task 裡,這個任務原本在 SDD 的 tasks 中,跟現在的優先級有關,我把它拉出來到前面**」
- ⇒ `w=` 的意思=**這個 task 原本躺在 SDD 池子裡,因為跟當前目的相關,被拉到前面**
- ⇒ 是池子任務**互相比較**後的排序,**不是對單一任務憑感覺打分**
- ⇒ 同一步內的任務**依 `w=` 由高到低列**,高的先做
- 🔴 **`w=` 只能標在任務表的任務上,不能標在步驟標題上**
- leo 2026-07-30:「這個只是標題,不是從 SDD 拉出來的,**它的 w 是跟誰比是 9?**」
- 【有序】卷的每步都是必經 ⇒ **不需要排序** ⇒ 標了就是假數字
- 【無序】卷的並列項才需要 `w=`(那時它們互相比較,有意義)
- 🔴 **`w=` 只排順序,不決定誰進 CP**——進 CP 的門檻是鐵律 5 的反事實測試(最小待辦)
> leo:「**tasks 是一個任務池子,CP 是編訂 sprint 的原則。**」
- **動筆前先做兩件事**
- 看先前範本:`system-dev/docs/3-specs/autonomy-dispatch/sprint-2026-07a.md`
(里程碑表 `P1>P2>P3` 任務板,做法一致,別重新發明)
- 撈池子=撈 issue(不是 grep `tasks.md` 的 checkbox,那份已經只是 pointer 了):
```bash
TOKEN=$(git remote get-url gitea | sed -E 's|.*//[^:]+:([^@]+)@.*|\1|')
curl -s -H "Authorization: token $TOKEN" \
"https://git.uncle6.me/api/v1/repos/Leo/<repo>/issues?state=open&labels=s/todo"
```
- 🔴 **不帶 token 打私有 repo 回 `{"message":"not found"}`**,長得像「這裡沒東西」
2026-08-09 實錯:據此把 24 個 open issue 宣告成不存在)
- **怎麼列**:一律 outliner 清單(鐵律 6),**必要資訊是「編號 + 一句話 + w + 執行者」**:
```markdown
- `w=9` #2 task 3 — 讓 notify_leo 重新發得出訊息
- `w=7` #2 task 7 — 👤 leo:拿你知道答案的東西查一次
```
- 🔴 **沒有 checkbox**(鐵律 2leo 08-10)——要看做到哪去點那張票
- 🔴 **一句話是「指路」不是「複製」**:只寫到足以認出是哪一條,
細節、實測輸出、踩到的坑**一律留在票上**
- 🔴 **不用表格**leo 07-31 拍板,見鐵律 6)——07-30 曾說「寫表格也可以」,已被此裁定取代
- **撈不到才是真缺口** → **去開票**(或在既有票裡加一條 task),然後 CP 標它的編號
- 在**票**裡加,**不在 CP 裡加**
- **為什麼特別容易忘**:CP 看起來像 todo list,很自然就在裡面寫「我要做 A、B、C」
- 那樣做 → 同一任務在票與 CP 各一份 → 必然漂移 → 兩邊都不可信
- 2026-08-10 實錯:CP 四筆停在事發前的世界(已完成的還空著、已解除的還標危險),
而票那邊是對的。總管花一整輪對帳,leo 當場問「**我到底要看什麼?**」
### 3. 每步有可執行的驗法
- 沒有驗法的步驟不算數——那是「宣告完成」的溫床
- 驗法要是**可執行的動作**(跑什麼指令、看什麼回應),不是「檢查是否完成」
- **考試三要素必須定義**leo 2026-07-31:「誰主動、誰被動、正確答案是什麼,這些角色你沒有定義」)
- **考生(主動)/受測物(被動)/正確答案**——三者寫在每步的「考試角色」行
- **考不過=迭代受測物**,不改題目、不怪考生
- 受測物是環境(指引/引導)→ 考不過改環境(例:步驟 1「我給它一個環境它考不過,就是我的環境要迭代」)
- 受測物是系統 → 回應不正確改系統(例:「haiku 給它一個需求回應不正確,就是系統要迭代」)
- **有前端的關,`HTTP 200` 不算驗過**
- 要抓實際畫面內容:`curl <網址> | grep <該出現的字串>`
### 4. 用 PM 的態度定狀態:**deliver 才算通,不是我實測過就算**
> leo 2026-07-30:「最終不是要實測,**是要 deliver**,你在本地實測完沒推沒 deploy 也用不了,
> **最後要讓收的人可以實測**,你要抱着 **PM 的態度**,不是開發者的態度。」
- **判準只有一句**:**收的人現在能不能自己驗到?** 不能 → 沒通
- 「收的人」=leo/封測者/下一個 AI,看這條 CP 服務誰
- 三種狀態
- `✅ 通` — **收的人已經驗到了**(貼他驗到的證據,不是我的)
- `◐ 半通` — 我這端做完且驗過,但**還沒到收的人手上**;必須標明「卡在哪一段運送」
- `❌ 斷` — 沒接上/沒發佈/沒人能用
- 🔴 **開發者態度 vs PM 態度**(開發者會說 → PM 要追問)
- 「`tsc` 零錯誤、測試綠」→ 部署了嗎?
- 「commit 了」→ push 了嗎?
- 「push 了」→ 收的人拿得到嗎?(要不要重裝/解保險)
- 「部署成功」→ 他點下去看到對的東西嗎?
- **運送鏈缺一段就不算通**:改完 → commit → push → 打包 → 部署 → **收的人重裝/重連** → 他驗到
- 反覆的失敗模式:registry 機制完整但沒觸發/`acr search` 寫好沒發佈/
ingest 通了沒人餵/daemon 修好但 leo 手上還是舊版
- 每件都「做完了」,**收的人手上沒有**
### 5. 拉的是「最小待辦」(MVP),不是「相關任務清單」
> leo 2026-07-31:「CP 是要達成這個目標而**從池子裡拉出的最小待辦**,
> 如果不做這些也通過,就表示這些任務不屬於最小待辦。」
> 「最小待辦類似 **MVP** 概念——如果有 500 個任務,全部做完要很久,但現在要的是最小待辦。」
- **成員資格測試(反事實)**:拉任務進 CP 前問一句——
「**不做這個,該步的驗法(考試)會不會掛?**」會掛才進。
只是「跟目的相關」不夠:**相關 ≠ 必要**。
- **步驟驗法通過時,逐筆對帳還沒完成的**,三選一(leo 原話給的處置):
1. **評估出錯** → 檢討選任務的方法(寫進 mistakes.md
2. **移出 CP,以後完成**(票留著照常排,CP 刪掉那行 pointer)
3. **已無需要** → 回票上結案
- 🔴 非必要任務掛在 CP 上會**稀釋整個儀表板的訊號**——leo 看 CP 判「還差多遠」
- 🔴 **勾選一律回票上做,不在 CP**(鐵律 2,leo 08-10
- 舊版寫「做完就勾」(leo 08-01),指的是**別把做完的事留白**——那個意圖沒變,
只是**勾的地方換了**:從 CP 換到票
- CP 這一側對應的動作=**該步的三態現況要更新**(✅/◐/❌),那才是 CP 的本職
- **要 leo 做的也是待辦**(leo:「如果有要我做什麼,這也是待辦,但**執行者是我**」)
- 🔴 **它必須是一張撈得到的票,不能只住 CP**(leo 08-10:「執行到要我 input 時要標示 Stage
我去完成,**但 CP 的無法標示**」)
- CP 是 markdown**沒有 label 可掛 ⇒ leo 的看板撈不到 ⇒ 對他等於不存在**
- ⇒ 人閘動作(arm/confirm/真機驗)一律**掛 `s/stage`**(規格見 `issue-handle`),
CP 這邊只留一行 `👤 leo` 的 pointer
- 標 `s/stage` **不等於交棒完成**——回覆裡要帶「打開什麼/該看到什麼/什麼算失敗」三件,
且指令自己先打過(`issue-handle` 有全文)
- 並同步 status「待 leo」清單+每日催辦——不是只寫在對話裡
- 🚚 「合主線/發版/部署/等 arm」=**運送殘項**,另起一行標 🚚,不佔任務位
- 🔴 **一筆待辦只准一個執行者**(leo 07-31:「這不是一個任務,是 2 個,
兩個主詞不同怎麼寫在一起?」)——主詞不同就拆成多筆,各自標執行者;
有先後依賴用「A 之後」寫在後筆開頭,不用「→」把兩人的事串成一筆
- **踩雷實例(2026-07-31 arcrun-usable 步驟 1**:掛了 4 筆 `w=` 高的任務,
一筆都沒做完、考試照樣 10/10 =全非最小待辦;而真擋 ✅ 的那筆
(安裝器 seed skills**反而不在清單上**。
病根=用「關鍵字相關度」順撈池子(語意相近的多半是同 SDD 的鄰居工單),
但真最小待辦常在**別的環節**(交付鏈/安裝器/人閘)
⇒ **從驗法反推需要什麼,不從池子順撈相關的**。
### 6. 格式=Logseq outliner,不用表格
> leo 2026-07-31:「我是個 Logseq 用戶……表格 + header 對閱讀不利,我看不出記錄彼此的層級,
> 全部平攤。**全部用 logseq outliner,可以用 outline + header,不要太花,保持乾淨簡潔。**」
> 「skill 寫明用 outliner**不要一改版整個跑掉**。」
- **層級用巢狀 bullet 呈現**,不用表格——表格把層級平攤掉,Logseq 讀不出結構
- header 可以用,但只切大段(卷名/成功標準/六步/總驗收),不要每小節都開 header
- 不要太花:emoji/粗體節制,狀態記號(✅◐❌/👤)保留因為有功能
- 適用範圍:**CP、給 leo 讀的一切 md**(wiki、報告、交棒文件同此)
- 🔴 此條取代 07-30「寫表格也可以」——**改版時不准把格式改回表格**,本鐵律就是防跑掉的錨
---
## 執行流程
### 第一步 — 確認這是哪一條 CP
```bash
ls system-dev/docs/3-specs/critical-paths/
cat system-dev/docs/3-specs/critical-paths/README.md
```
- **新主題要另立一卷**,不塞進既有卷(leo:「你只有一個,這樣太大了」)
- **行數門檻**(07-30 實測後修正)
- 目標 **100 行內**;**上限 200 行**(六步以上的卷,池子任務表格本身就佔百餘行)
- 超過先問:**多出來的是「池子任務表格」還是「執行細節」?**
- 池子任務表格 → **留著**,那是 CP 的核心(拉任務+距離)
- 執行細節/實測全文/糾正史 → 搬 `_evidence/`CP 只留一行結論+指針
### 第二步 — 判斷【有序】還是【無序】,標在標題上
- **【有序】** — 前步不通,後步沒意義
- 寫法:步驟 1→N 鏈狀;斷點按順序列、標「前置」
- 例:安裝→萃取→查詢→MCP/AI 想到→查詢→替換→執行
- **【無序】** — 並列能力,各自算分
- 寫法:每項獨立標 `w=`/狀態;**不寫「前置」**
- 例:「知識可收集、可查、可追」=三種能力並列
- **判斷法**:把第 2 步拿掉,第 3 步還有意義嗎?
- 沒意義 → 有序
- 還有意義 → 無序
- **可混合**:有序主鏈 + 無序支線(支線另開一段標【無序】,別硬塞進鏈裡)
### 第三步 — 每步寫四件事
```markdown
### 步驟 N<一句話目的> `w=9` ◐ 半通
**目的**:<達成什麼。沒參與的人也看得懂>
**交付物**:<交出什麼可驗的東西。不是「改好某個檔案」>
**驗法**:<可執行的動作。有前端要抓畫面內容>
**現況**<實測到什麼。附證據>
**最小待辦**(鐵律 5:過反事實測試才進;要 leo 做的標 👤 leo)
- [ ] <任務——出處 SDD>
- [ ] 👤 leo<人閘動作>
**移回 SDD 池**(曾拉進來但驗證非必要的,留一行去向)
```
### 第四步 — 斷點與「不在 CP 上」
- 🔴 斷點段(outliner,一行一斷點):`- 步 N <斷點>——前置:<步><為什麼卡>`
- ⚪ 不在 CP 上:`- <項目><為什麼不阻斷>`
- **一定要寫**——不寫下來就會反覆被它吸走注意力
### 第五步 — 進度數字
- 卷尾一行:`**進度:N 完成/M 進行中/K 未做(共 T)**`
- 有機械驗收(如 `verify.sh`)→ **以它為準**,並註明「此清單是人看的」
---
## 收工檢查
逐條自問,答不出來就是沒寫完。
1. 每步都是「目的+交付物」,不是「改哪個檔案」?
2. 子項是**從池子撈的**(有「出處」欄)?撈不到的標了 ` 待加 <SDD>`
3. 動筆前**看過先前範本**`autonomy-dispatch/sprint-2026-07a.md`)?
4. 標了【有序】/【無序】?
5. 每步驗法**可執行**?有前端的抓了畫面內容?
6. **有 `` 的,是「收的人驗到」的證據,不是我自己測過?**
- 運送鏈走完了嗎:改完 → commit → push → 打包 → 部署 → **收的人重裝** → 他驗到
- 缺任一段 → 最多 ``,且要標「卡在哪一段」
7. 寫了「不在 CP 上」?
8. 這一卷在 200 行內?超過的部分是「池子任務表格」(可留)還是「執行細節」(要搬)?
9. **CP 檔真的改了**?(leo 07-26:「我看 CP 也沒用,因為你執行時沒去更新」)
10. **每筆任務都過了反事實測試**(不做它驗法會掛)?要 leo 做的標了 👤 並進催辦?
驗法通過的步驟,空 checkbox 對帳完了(檢討/移回池子/標完成或刪)?
11. **全卷 Logseq outliner、零表格**(鐵律 6)?層級縮排看得出來?沒有太花?
---
## 相關
- 完整規範(含踩雷案例):`system-dev/docs/3-specs/TEMPLATE-critical-path.md`
- 分卷規則:`system-dev/docs/3-specs/critical-paths/README.md`
- 先前範本(拉任務+標距離):`system-dev/docs/3-specs/autonomy-dispatch/sprint-2026-07a.md`
- 執行細節該放哪:`system-dev/docs/3-specs/critical-paths/_evidence/`