Files
Arcrun/docs/HANDOFF-mira-repair.md
T
uncle6me-web 5d00e71275 chore: D22 落地——docs/SDD/wiki/CLAUDE.md 進 repo(Gitea private 預設全 push)
頂層 D22 決策(leo 2026-07-03 拍板):推什麼由開發環境歸屬決定,
Gitea private=除機敏值/build 產物/.github 外全 push。
解 T1.5 卡點:雲端工人 clone 拿得到 credential-store-migration.md,可就地改寫 SDD。
機敏掃描兩輪通過(新增 189 檔約 2.1MB,node_modules/dist/wasm 照舊排除)。

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-03 07:13:33 +08:00

121 lines
6.5 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.
# 交辦文件:修復 Mira 的 arcrun workflow(給 Mira 的 CC
> 建立:2026-06-03(由 arcrun 端的 CC 撰寫)
> 對象:接手修復 mira 的 CC
> 位置:`/Users/youlinhsieh/Documents/tech_projects/InkStoneCo/polaris/mira/arcrun/*.yaml`
>
> **這份文件已把調查做完**:每個 workflow 用的 component 都對照過 arcrun prod 現況,
> 標清楚「哪些不用改、哪些要改、哪些要降級」。你照著改即可,不必重跑調查。
---
## 0. 為什麼 mira 壞了(一句話)
arcrun 做了大整修:把「打固定 endpoint 卻被做成零件」的**假零件降級成 recipe + 刪掉零件目錄**
33 → 22 個零件,DECISIONS §1:零件 = endpoint 薄殼,打固定 API 的是 recipe 不是零件)。
mira 當初**自己把一堆東西錯做成假零件**,整修後那些零件名的解析方式變了,所以 mira workflow 斷了。
好消息:**arcrun prodcypher.arcrun.dev)活著、降級後的 recipe 都在 KV**(已驗證),
mira 大部分 workflow 只需小改,不需重寫。
---
## 1. 前提(已驗證,你不用重查)
- ✅ cypher-executor prod 活著(`cypher.arcrun.dev`
- ✅ 降級 recipe 在 prod KV`kbdb_get` / `kbdb_create_block` / `kbdb_patch_block` /
`kbdb_ingest` / `kbdb_delete` / `telegram_send` / `gmail_send` / `google_sheets_*` / `line_notify_send`
- mira 跑在你(richblack)的 prod 帳號上,**不依賴 self-host installer**(那是給外部工程師的另一條線)
---
## 2. 逐 component 分類(mira 6 個 workflow 全部掃過)
| component | 狀態 | 動作 |
|---|---|---|
| `kbdb_get` | ✅ prod recipe 存在 | **不用改**`component: kbdb_get` 走解析鏈 step 6 查 `recipe:kbdb_get`,正確)|
| `kbdb_create_block` | ✅ prod recipe 存在 | **不用改** |
| `kbdb_patch_block` | ✅ prod recipe 存在 | **不用改** |
| `cron` | ✅ 引擎能力 | **不用改** |
| `http_request` | ✅ primitive | **不用改** |
| `if_control` / `set` / `filter` | ✅ primitive | **不用改** |
| `trigger_workflow` | ✅ 平台 orchestration | **不用改** |
| `comp_passthrough` | ✅ 引擎內建純函式(constants.ts:43 `(ctx)=>ctx`| **不用改** |
| **`telegram`** | ⚠️ prod **沒有** `telegram` recipe,只有 `telegram_send` | **要改**`component: telegram``component: telegram_send`(見 §3|
| **`claude_api`** | ❌ 錯做成零件(非薄殼)| **要降級**(見 §4|
| **`kbdb_upsert_block`** | ❌ 錯做成零件(非薄殼)| **要降級**(見 §4|
---
## 3. 要改:`telegram` → `telegram_send`
**影響的檔**4 個用到 `component: telegram`):
- `project_detector.yaml`
- `agent_feedback_weekly_review.yaml`
- `wiki_synthesis.yaml`
- `wiki_giveup_scanner.yaml`
**改法**:把 `component: telegram` 改成 `component: telegram_send`
⚠️ **不只是改名**——`telegram_send` recipe 的介面:endpoint 是
`https://api.telegram.org/bot{{auth.bot_token}}/sendMessage`body 帶 `chat_id` + `text`
auth 走 `auth_service: telegram`static_key path 注入)。確認 mira 的節點 config 傳的是
`chat_id` / `text`,且有設好 telegram 的 credential`acr creds push`)。
---
## 4. 要降級:`claude_api` / `kbdb_upsert_block`(錯做成零件)
> ⚠️ **這兩個不是「待刪」,是「做錯了」**richblack 2026-06-03 定性):
> 它們**不是 endpoint 薄殼,是把工作流硬塞進零件**(違反 DECISIONS §1)。
> arcrun 已把這兩個 wasm 排除在 self-host 部署來源外(不 commit 進 repo)。
> mira 要把它們**還原成本來該有的樣子**:工作流 / recipe。
### 4.1 `claude_api`(影響:agent_feedback_weekly_review / project_detector / wiki_synthesis
**問題**:arcrun 是「AI 呼叫的工具」,**工作流裡不該有零件回頭呼叫 LLM**mindset §2 /
DECISIONSn8n 需要 AI 節點是因為它沒大腦,arcrun 的大腦就是操盤的 CC)。
`claude_api` 把「呼叫 Claude」做成零件,方向就錯了。
**正解**mira 要自己設計,arcrun 端只給方向):
- 需要 AI 判斷/轉換的步驟,應該是**操盤的 CC(mira 自己)做**,再呼叫 workflow 做確定性的下一步。
- 若真的需要在 workflow 內打 Claude API(例如非同步 cron 場景無 CC 在場),那它是**打一個固定外部
endpointapi.anthropic.com= recipe**,不是零件 → 建一個 `claude_api`**API recipe**
http_request + endpoint + auth_service),不是零件目錄。
- 哪條對,mira 的 CC 要依 mira 的實際場景判斷(這是 mira 的設計決策,不是 arcrun 能替決的)。
### 4.2 `kbdb_upsert_block`(影響:agent_feedback_weekly_review / wiki_synthesis
**問題**upsert 的邏輯(找到則 PATCH、沒找到則 POST)被整段塞進零件。
按 DECISIONS §1upsert 應該是 **KBDB API 那邊提供的 endpoint**,零件/recipe 只該「驅動它」。
**正解(兩條,mira/KBDB 端決定)**
- **首選**KBDB API 出一個 `POST /blocks/upsert` endpointrichblack 已交 KBDB feature request
→ 然後在 arcrun 建一個 `kbdb_upsert` **recipe**(打那個 endpoint),mira workflow 用 recipe。
- **過渡**:若 KBDB 還沒出 upsert endpoint,把「GET 找 → 有則 kbdb_patch_block、無則 kbdb_create_block」
這段**用 workflow 表達**mira workflow 層用 if/branch 串現有的 kbdb_get + patch + create recipe),
而不是塞進一個零件。
---
## 5. 修復順序建議
1. **先改 telegram**(§3)——機械改名 + 確認介面,最快,4 個檔。
2. **驗證 kbdb_* / 其他不用改的 workflow 真的跑通**——`acr run <workflow>` 或 trigger
確認 §2 標「不用改」的真的 2xx(誠實驗證,不假設)。
3. **再處理 claude_api / kbdb_upsert_block 降級**(§4)——這兩個要 mira 依場景做設計決策,較花時間。
## 6. 驗收(客觀證據,mindset §7)
- 改完的 workflow `acr run` / trigger → HTTP 2xx + execution trace 證明跑通,不是口頭宣布。
- claude_api / kbdb_upsert_block 降級後:workflow 不再引用這兩個零件名(grep 確認)。
- 缺 credential 打不通就誠實標「未驗收:缺 X」,不 mock 充綠燈。
---
## 7. 參考
- arcrun 決策:`matrix/arcrun/DECISIONS.md`(§1 零件 vs recipe、§3b credential
- arcrun mindset`matrix/arcrun/.claude/rules/06-mindset.md`(§1 工作流是 default、§2 AI→工具)
- arcrun 故障/整修脈絡:`matrix/arcrun/docs/HANDOFF-self-host-harness.md`