Files
reporting-governance-plugin/plugins/continuity/AGENT_GUIDE.zh-TW.md

680 lines
17 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.
# Continuity Plugin MVPAgent 安裝與操作手冊
> 目標讀者OpenClaw agent / 實作者
>
> 這份文件不是概念介紹,而是可直接照做的 runbook / checklist。
> 若你只想知道「要不要裝、怎麼接、怎麼驗證」,先看本文,不必先讀完整 README。
## 0. 這個 plugin 什麼時候要裝
### 應安裝的情況
如果你的 workspace 符合以下任一條件,建議安裝:
- 你有 **approved-plan** 類型的長任務 / 多步驟任務。
- 你不希望 agent 在某個 task 做完後,直接把整件事當成「已完成」結案。
- 你需要 agent 在同一個 approved plan 內,判斷是否還有 **下一個要派發的 task**
- 你需要用 **dispatch receipt** 證明「真的有派出下一步」,而不是只在回覆裡口頭說會繼續。
- 你已經在用 `hooks/force-recall/handler.ts`,希望把 approved-plan continuity gate 注入 agent prompt。
- 你沒有 `force-recall` hook但有自己的 preflight / planner / orchestrator想直接呼叫通用 continuity adapter。
### 可先不裝的情況
以下情況可先不裝,或只當參考:
- 你的 workspace 沒有 approved-plan / auto-chain / dispatch 這類流程。
- 你只需要一般單回合聊天,不需要 continuity hard gate。
- 你沒有 `force-recall` hook且也不打算在自己的 host / orchestrator 補 generic glue code。
---
## 1. 安裝目標與預期結果
安裝完成後,應達到這個最小結果:
- 你的 host例如 `force-recall` hook 或自家 preflight能載入 `plugins/continuity/src/index.mjs`
- host 在 preflight 時會呼叫 `runForceRecallContinuityAdapter(...)``runGenericPreflightContinuityAdapter(...)``runManualContinuityPreflight(...)` 其中之一
- agent prompt 內可看到 `[APPROVED_PLAN_CONTINUITY_GATE] ... [/APPROVED_PLAN_CONTINUITY_GATE]`
- 當 approved plan 任務完成,但沒有真實下一步 dispatch receipt 時gate 會擋下錯誤結案
- plugin 自身測試與對應 host smoke test 可通過
---
## 2. 應放到哪裡
### 標準位置
把 plugin 放在 workspace 內這個位置:
```text
<workspace>/plugins/continuity
```
建議 layout可依宿主調整
```text
<workspace>/
hooks/
force-recall/
handler.ts
HOOK.md
plugins/
continuity/
AGENT_GUIDE.zh-TW.md
README.zh-TW.md
README.md
HOOK.md
package.json
examples/
src/
test/
scripts/
test_force_recall_long_task_preflight.mjs
```
### 本次文件對應的實際路徑
```text
/home/alice/.openclaw/workspace/plugins/continuity
```
---
## 3. 安裝前 checklist
在開始前,先確認:
- [ ] 你的 workspace 有 `hooks/force-recall/handler.ts`
- [ ] 你的 workspace 有 `scripts/test_force_recall_long_task_preflight.mjs`
- [ ] 你的 workspace 願意採用 approved-plan continuity hard gate
- [ ] 你接受目前 `force-recall` 是最成熟 adapter但不是唯一宿主
- [ ] 你知道 receipt 只是「最小 contract」不是完整 workflow engine
可先用以下命令確認:
```bash
cd <workspace>
ls hooks/force-recall/handler.ts
ls scripts/test_force_recall_long_task_preflight.mjs
ls plugins/continuity/package.json
```
---
## 4. 需要哪些檔案
### 必要檔案
至少要有以下檔案:
```text
plugins/continuity/
package.json
src/index.mjs
src/adapters/force-recall.mjs
src/config/defaults.mjs
src/config/schema.mjs
src/continuity/evaluator.mjs
src/continuity/receipt-validator.mjs
src/continuity/receipt-store.mjs
examples/openclaw.continuity.example.json
examples/approved-plan-receipt.example.json
```
### 建議一起帶走的檔案
```text
plugins/continuity/
README.zh-TW.md
README.md
HOOK.md
AGENT_GUIDE.zh-TW.md
test/continuity.config.test.mjs
test/continuity.receipt-validator.test.mjs
test/continuity.receipt-store.test.mjs
test/continuity.evaluator.test.mjs
test/continuity.plugin.test.mjs
test/continuity.smoke.test.mjs
```
### 如果缺檔,先補哪些
優先順序:
1. `src/index.mjs`
2. `src/adapters/force-recall.mjs`
3. `src/continuity/evaluator.mjs`
4. `src/continuity/receipt-validator.mjs`
5. `src/continuity/receipt-store.mjs`
6. `examples/openclaw.continuity.example.json`
7. `test/continuity.smoke.test.mjs`
---
## 5. 直接安裝步驟
### 路徑 A你已經在同一個 repo / workspace 內
- [ ] 確認 `plugins/continuity` 目錄存在
- [ ] 確認 `package.json``src/index.mjs` 存在
- [ ] 確認 `hooks/force-recall/handler.ts` 存在
驗證命令:
```bash
cd <workspace>
find plugins/continuity -maxdepth 3 -type f | sort
```
### 路徑 B你要複製到另一個 OpenClaw workspace
在來源 workspace
```bash
cd <source-workspace>
rsync -av plugins/continuity/ <target-workspace>/plugins/continuity/
```
複製後在目標 workspace 驗證:
```bash
cd <target-workspace>
find plugins/continuity -maxdepth 3 -type f | sort
```
---
## 6. example config 怎麼套
### Step 1從 example 複製一份你的 continuity config
來源範例:
```text
plugins/continuity/examples/openclaw.continuity.example.json
```
範例內容:
```json
{
"enabled": true,
"planMatchers": ["approved-plan"],
"legalTerminalStates": [
"waiting_user",
"blocked",
"pending_verification"
],
"receiptDir": "state/approved-plan-continuity",
"requireRealDispatchReceipt": true,
"allowReplyClosureWithoutDispatch": false,
"debug": false,
"adapter": {
"forceRecall": {
"enabled": true,
"injectBlockLabel": "APPROVED_PLAN_CONTINUITY_GATE"
}
}
}
```
### Step 2先只改最少必要欄位
通常只需要先確認這幾個欄位:
- [ ] `enabled`
- [ ] `planMatchers`
- [ ] `legalTerminalStates`
- [ ] `receiptDir`
- [ ] `requireRealDispatchReceipt`
- [ ] `allowReplyClosureWithoutDispatch`
- [ ] `adapter.forceRecall.enabled`
- [ ] `adapter.forceRecall.injectBlockLabel`
### Step 3建議的最小套用策略
#### 情境 A你就是要沿用目前 approved-plan MVP 行為
直接照 example 使用,通常不用改:
- `planMatchers = ["approved-plan"]`
- `legalTerminalStates = ["waiting_user", "blocked", "pending_verification"]`
- `requireRealDispatchReceipt = true`
- `allowReplyClosureWithoutDispatch = false`
#### 情境 B你有自己的 plan 名稱
如果你的 wrapper / planner 用的是別的 plan 名稱,調整:
```json
{
"planMatchers": ["your-approved-plan-name"]
}
```
#### 情境 C你想改 injected block label
如果你不想使用預設 label
```json
{
"adapter": {
"forceRecall": {
"enabled": true,
"injectBlockLabel": "YOUR_CONTINUITY_GATE"
}
}
}
```
### Step 4receiptDir 先建起來
```bash
cd <workspace>
mkdir -p state/approved-plan-continuity
```
---
## 7. 如何接 host / hook`force-recall` 只是其中一種)
## 7.1 你要確認的整合點
目前最成熟的整合點仍是:
```text
hooks/force-recall/handler.ts
```
目前 hook 端流程應該是:
1. 跑 long-task preflight / wrapper
2. 跑 gate lock
3. 跑 auto-chain planner
4. 載入 continuity plugin
5. 呼叫 `runForceRecallContinuityAdapter(...)`
6. 把 continuity block prepend 到 `bodyForAgent`
### 你至少要看到這些關鍵符號
- `plugins/continuity/src/index.mjs`
- `runForceRecallContinuityAdapter`
- `APPROVED_PLAN_CONTINUITY_GATE`
檢查命令:
```bash
cd <workspace>
grep -n "runForceRecallContinuityAdapter" hooks/force-recall/handler.ts
grep -n "APPROVED_PLAN_CONTINUITY_GATE" hooks/force-recall/handler.ts
grep -n "plugins\", \"continuity\", \"src\", \"index.mjs" hooks/force-recall/handler.ts
```
## 7.2 最小接法範例force-recall
如果你走既有 `force-recall` 路徑,最小概念如下:
```js
import plugin from './plugins/continuity/src/index.mjs';
const out = plugin.runForceRecallContinuityAdapter({
config: plugin.defaultConfig,
wrapperResult,
autoChainPlanResult,
});
if (out?.block) {
context.bodyForAgent = `${out.block}\n${context.bodyForAgent}`;
}
```
## 7.3 Generic/manual 最小接法範例
如果你沒有 `force-recall`,也可直接把自己的 preflight 結果餵給 generic adapter
```js
import plugin from './plugins/continuity/src/index.mjs';
const out = plugin.runGenericPreflightContinuityAdapter({
config: plugin.defaultConfig,
source: {
planId: 'approved-plan-1',
currentTask: 'task-3',
taskState: 'complete',
nextTaskKnown: true,
sameApprovedPlan: true,
taskBoundaryStop: true,
nextTaskId: 'task-4',
nextDerivedAction: { type: 'message_subagent', task: 'continue' },
replyClosureState: 'completed',
dispatchReceipt: null,
},
});
```
若你只是手動做一次 continuity preflight也可直接呼叫
```js
const out = plugin.runManualContinuityPreflight({
config: plugin.defaultConfig,
planId: 'approved-plan-1',
currentTask: 'task-3',
taskState: 'complete',
nextDerivedAction: { type: 'message_subagent', task: 'continue' },
replyClosureState: 'waiting_user',
});
```
## 7.4 實作者要檢查的實際條件
- [ ] hook 能動態 import `plugins/continuity/src/index.mjs`
- [ ] `runForceRecallContinuityAdapter` 是 function
- [ ] 傳入 `wrapperResult`
- [ ] 傳入 `autoChainPlanResult`
- [ ] 有傳 `config`(至少先用 `defaultConfig`
- [ ] `out.block` 非空時有 prepend 到 `bodyForAgent`
- [ ] agent prompt 最終可見 continuity gate block
## 7.5 receipt 與 continuity input 的關係
如果你的流程真的有派發下一步,請不要只在字串裡描述「已派發」,而要產出真實 `dispatchReceipt`
最小 receipt shape
- `planId`
- `currentTask`
- `nextDerivedAction`
- `dispatchedAt`
- `dispatchRunId`
- `childSessionKey`
- `replyClosureState`
範例:`plugins/continuity/examples/approved-plan-receipt.example.json`
---
## 8. 實作時建議直接照抄的操作流程
### Checklist第一次把 plugin 接進現有 workspace
- [ ] 建立 / 複製 `plugins/continuity`
- [ ] 確認 `src/index.mjs` 可被 host 載入
- [ ] 確認 continuity example config 可讀
- [ ] 建立 `state/approved-plan-continuity/`
- [ ] 確認你的 host例如 `hooks/force-recall/handler.ts` 或自家 preflight有 continuity adapter 接點
- [ ] 確認有 prepend continuity block 到 `bodyForAgent` 或對應 prompt/body
- [ ] 若 dispatch 真的發生,補上 receipt 寫檔
- [ ] 跑 plugin test
- [ ] 跑對應 host 的 smoke test
- [ ] 檢查 injected prompt block 是否存在
### Checklist第一次加 receipt 落盤
- [ ] 準備合法 receipt object
- [ ] 先用 `validateReceipt()` / `isValidReceipt()` 驗證
- [ ]`writeReceipt({ receiptDir, receipt })` 落盤
- [ ] 確認 receipt 寫到 `state/approved-plan-continuity/`
- [ ] 再跑 continuity smoke test避免只是「看起來有 receipt」
---
## 9. 安裝後怎麼跑 smoke test
### 最小 smoke test
先跑 plugin 自己的測試:
```bash
cd <workspace>/plugins/continuity
npm test
```
如果你只想快速驗證 plugin 主體:
```bash
cd <workspace>/plugins/continuity
node test/continuity.smoke.test.mjs
```
### Hook 整合 smoke test
```bash
cd <workspace>
node scripts/test_force_recall_long_task_preflight.mjs
node --check hooks/force-recall/handler.ts
```
### 建議的完整 smoke test 順序
照這個順序最容易定位問題:
1. plugin 單體測試
```bash
cd <workspace>/plugins/continuity
npm test
```
2. hook 檔案語法檢查
```bash
cd <workspace>
node --check hooks/force-recall/handler.ts
```
3. hook preflight smoke test
```bash
cd <workspace>
node scripts/test_force_recall_long_task_preflight.mjs
```
4. 人工檢查 block 是否真的被 inject
建議檢查測試輸出或 debug prompt確認有出現
```text
[APPROVED_PLAN_CONTINUITY_GATE]
```
---
## 10. Smoke test 通過標準
以下條件都成立,才算最小安裝成功:
- [ ] `npm test` 全通過
- [ ] `node --check hooks/force-recall/handler.ts` 通過
- [ ] `node scripts/test_force_recall_long_task_preflight.mjs` 通過
- [ ] 測試 / 輸出中可看到 continuity gate block
- [ ] 沒有 receipt 時gate 會對缺少 dispatch 的情境做 fail / hard-gate
- [ ] 有合法 terminal state例如 `waiting_user` / `blocked` / `pending_verification`)時,不會誤判
---
## 11. 失敗時先檢查什麼
請依這個順序排查,不要一開始就到處改 code。
### 第一層:路徑 / 檔案是否存在
- [ ] `plugins/continuity/src/index.mjs` 存在
- [ ] `hooks/force-recall/handler.ts` 存在
- [ ] `plugins/continuity/examples/openclaw.continuity.example.json` 存在
- [ ] `plugins/continuity/examples/approved-plan-receipt.example.json` 存在
命令:
```bash
cd <workspace>
ls plugins/continuity/src/index.mjs
ls hooks/force-recall/handler.ts
ls plugins/continuity/examples/openclaw.continuity.example.json
ls plugins/continuity/examples/approved-plan-receipt.example.json
```
### 第二層hook 是否真的有接到 plugin
- [ ] `handler.ts` 有 import / dynamic import continuity plugin
- [ ] `handler.ts` 有呼叫 `runForceRecallContinuityAdapter(...)`
- [ ] `handler.ts` 有把 `out.block` prepend 到 `bodyForAgent`
### 第三層config 是否合理
優先檢查:
- [ ] `enabled` 是否為 `true`
- [ ] `adapter.forceRecall.enabled` 是否為 `true`
- [ ] `planMatchers` 是否對得上你的 approved plan 名稱
- [ ] `receiptDir` 是否可寫
- [ ] `requireRealDispatchReceipt` 是否符合你預期
- [ ] `allowReplyClosureWithoutDispatch` 是否不小心放寬了 gate
### 第四層receipt 是否是真的、不是假資料
最常見問題:
- 只有「打算 dispatch」但沒有真實 receipt
- receipt shape 不完整
- `dispatchRunId` / `childSessionKey` 空字串
- `replyClosureState` 不在合法狀態
- 寫到了錯誤資料夾
### 第五層hook 前置資料是否足夠
因為 continuity adapter 會吃:
- `wrapperResult`
- `autoChainPlanResult`
所以要檢查:
- [ ] wrapper 是否真的把 long-task / approved-plan 狀態帶進來
- [ ] planner 是否真的產出 `derivedAction`
- [ ] `nextDerivedAction` 是否能被 continuity input 建出來
- [ ] closure state 是否被正確推導
---
## 12. 快速除錯命令
### 看 plugin 測試是否全過
```bash
cd <workspace>/plugins/continuity
npm test
```
### 看 hook 語法有沒有壞
```bash
cd <workspace>
node --check hooks/force-recall/handler.ts
```
### 看 handler 裡 continuity 關鍵字是否存在
```bash
cd <workspace>
grep -n "runForceRecallContinuityAdapter" hooks/force-recall/handler.ts
grep -n "APPROVED_PLAN_CONTINUITY_GATE" hooks/force-recall/handler.ts
```
### 看 receipt 資料夾有沒有東西
```bash
cd <workspace>
find state/approved-plan-continuity -maxdepth 2 -type f | sort
```
---
## 13. 目前限制
這個 plugin 目前有以下限制,安裝前要先接受:
- 它是 **approved-plan continuity hard gate** 的抽離版,不是通用 workflow engine。
- `force-recall` 是目前最成熟的 adapter但不是唯一 adapter。
- 若你的 workspace 沒有 `force-recall`,仍需自己把 host 資料接到 generic/manual path。
- config 目前是模組預設值 + 呼叫端傳入,不是完整 plugin installer / registry 流程。
- receipt store 目前只負責寫檔,不管 retention、cleanup、indexing。
- receipt validator 目前只驗證最小 contract不會深入驗證每種 `nextDerivedAction` 的完整語意。
- 若你只做 dry-run planning、沒有真實 dispatch receiptgate 仍可能視為未通過;這是設計目標,不是 bug。
---
## 14. 建議的交付標準什麼叫「agent 可照做」
若你要把這個 plugin 交給另一位 agent / 實作者,至少應滿足:
- [ ] 他不需要回頭爬整段對話,也知道 plugin 的用途
- [ ] 他知道檔案應放在哪裡
- [ ] 他知道要帶哪些檔案
- [ ] 他知道怎麼接 `force-recall` hook
- [ ] 他知道 example config 先改哪些欄位
- [ ] 他知道怎麼跑 smoke test
- [ ] 他知道失敗先查哪幾層
- [ ] 他知道目前限制,不會誤以為這是完整 workflow framework
如果以上 8 點都回答得出來才算達到「agent 可照做」。
---
## 15. 一頁版執行摘要(超短版)
如果你趕時間,只做下面這些:
1. 把 plugin 放到:
```text
<workspace>/plugins/continuity
```
2. 確認 hook 有接:
- `plugins/continuity/src/index.mjs`
- `runForceRecallContinuityAdapter(...)`
- prepend `out.block``bodyForAgent`
3. 套 example config
```text
plugins/continuity/examples/openclaw.continuity.example.json
```
4. 建 receipt 目錄:
```bash
mkdir -p <workspace>/state/approved-plan-continuity
```
5. 跑測試:
```bash
cd <workspace>/plugins/continuity && npm test
cd <workspace> && node --check hooks/force-recall/handler.ts
cd <workspace> && node scripts/test_force_recall_long_task_preflight.mjs
```
6. 確認 prompt 裡有:
```text
[APPROVED_PLAN_CONTINUITY_GATE]
```
7. 確認沒有真實 dispatch receipt 時,不會被錯誤判定為已完成。
---
## 16. 參考文件
- `plugins/continuity/README.zh-TW.md`
- `plugins/continuity/README.md`
- `plugins/continuity/HOOK.md`
- `plugins/continuity/examples/openclaw.continuity.example.json`
- `plugins/continuity/examples/approved-plan-receipt.example.json`
- `hooks/force-recall/handler.ts`
- `scripts/test_force_recall_long_task_preflight.mjs`
如需英文版,可再從本文翻成 `AGENT_GUIDE.md`MVP 階段中文版優先即可。