Leo
|
3e92d4acf6
|
feat(data-exfil-warning): 資料外流警示 — 暴露動作需人類明示同意
新 SDD .agents/specs/data-exfil-warning/(richblack review 過)。
觸發策略:只在「資料變成可被外部呼叫」時警示(webhook 部署 / recipe push),
不管出站打別人 API(高頻低風險)。
- C 同意憑證(exposure-consent.ts):ExposureConsent{confirmed_by_human, understood,
confirmed_at, suppress_future};同意=法律憑證,存 record 可審
- A API 層:webhook 部署 + recipe push 首次需 consent,缺→403;首次問記住(server 端)
- B CLI(exposure-warning.ts):仿 GCP 刪 project,要打資源名確認(比 y/n 硬);
--confirm-exposure(非互動)/ --suppress-warning(不再警示,本選擇也 log);
非 TTY 無旗標→拒絕(AI 不替人類確認暴露);本機 config 記住已同意(不重問)
- H hook:pre-bash 偵測 acr push/recipe push 無旗標→exit 2(creds push/run 不誤擋)
- 警示是「保護措施入口」:提示 arcrun 可幫加認證/權限/限流(資安優勢)
驗收:非 TTY 拒絕未送出(exit1)、hook 精準擋放、tsc 雙邊綠。
⚠️ A+B 必須一起 deploy(API 層擋 + CLI 帶 consent),否則 push 中間狀態壞。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-05-30 14:45:43 +08:00 |
|
Leo
|
5178a6666f
|
merge: Phase 3 零件投稿把關(registry 靜態把關 + PR 方向)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-05-30 13:42:46 +08:00 |
|
Leo
|
7d8cbe4299
|
docs: Phase 3 收尾 — §8 釐清零件投稿走 PR、BACKLOG 記新需求
- DECISIONS §8 釐清:執行鏈路(高頻)不依賴 CI;零件投稿(稀有)走 PR/CI 是例外、不違反精神
(CF Workers 不能 runtime 編譯 wasm,CI 是唯一能跑 wasm 又執行者碰不到的 venue)
- BACKLOG 步驟 4 收尾(投稿改 PR,標已做/不做/未來搬 CI)
- BACKLOG 步驟 5 被 PR 方向取代;新增步驟 5b 資料外流警示(先做,需新 SDD)
- BACKLOG 待決策加:用戶 API 保護機制(入站認證,資安優勢)、recipe/part/function 架構釐清
- component-gatekeeping tasks.md 收尾狀態
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-05-30 13:42:46 +08:00 |
|
Leo
|
913ed79faa
|
docs(gatekeeping): 方向修正 — 零件投稿走 GitHub PR,廢 registry self-service
richblack 2026-05-30 決定:零件投稿管道 = GitHub PR(稀有低頻事件、人 review
merge、CI 跑驗收),不是 registry submit API self-service。
理由:primitive 極少、未來絕大部分是 recipe → 新增零件稀有,不需 self-service
自動化管道。PR 天然滿足每道閘門(merge=人類閘門、CI 跑 G1/G3/Gherkin/覆蓋檢查),
且 CI 能 runtime 跑 wasm,繞開 CF Workers 不能 runtime 編譯 wasm 的 venue 牆。
黃金向量(Claude.ai 建議):價值保留、實作降級為人工核對 + B 覆蓋檢查(純靜態),
不做機器自動重跑(為不存在的規模做的過度工程 + 撞 venue 牆)。
作廢:registry submit 當主投稿管道、四路 self-service、平台 sandbox 重跑、
acr parts publish 加人類閘門。保留搬 CI:G1/G3/G4/覆蓋檢查邏輯。
已 commit 的 registry G0/G1/G3 保留不刪(G1/G3 邏輯被 CI 複用)。
§8 釐清(待確認改 DECISIONS):§8 不依賴 CI 指執行鏈路(高頻);零件投稿稀有,
走 PR/CI 不違反。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-05-30 13:07:46 +08:00 |
|
Leo
|
93bb4d3327
|
feat(registry): Phase 3 G0 人類閘門(submit 端強制人類確認 + 舉證)
- submitComponent 加 SubmitOptions(human_confirmation + gherkin_evidence + skip_acceptance)
- G0 閘門:非 skip_acceptance 的新投稿,缺 human_confirmation(confirmed_by_human
+ 非空 reason_why_not_workflow)→ 退稿指回「先試工作流,需人類確認」
- human_confirmation + gherkin_evidence 寫進 KV metadata(軌跡可審)
- components route 從 multipart/JSON 解析這些欄位傳入
- backfill(skip_acceptance)不受閘門影響
design 命名修正:投稿走既有 acr parts publish(非另建指令,符合「修改現有不重建」)。
待續: G0-CLI(acr parts publish 互動式問人類)、G4-CLI(本地跑 Gherkin + evidence)、
R5(MVP_COMPONENTS.txt 白名單 + 本機 hook)。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-05-29 18:03:49 +08:00 |
|
Leo
|
202a5ab8d6
|
feat(registry): Phase 3 零件投稿靜態把關 + component-gatekeeping SDD
新 SDD .agents/specs/component-gatekeeping/(richblack 確認,含 venue 修訂 + 信任模型)。
registry 端靜態把關(CF Worker 可跑,不執行 wasm):
- G1 detectFakeComponent: 外部 URL/domain + http_request 子集偵測,硬擋退稿指回 recipe
- G3 wasmImports: 解析 wasm import section,只准 wasi_snapshot_preview1 + u6u 白名單
- G5/G6: unimplemented_steps 明列 gherkin/cold_start/runtime_compat,不假綠(§3c/§7)
- gherkin_evidence 一致性驗證(投稿者本地跑,registry 不重跑——CF 禁 runtime 編譯 wasm)
把關範圍:公共庫 + self-hosted 私人庫同一套(design §0.0)。
信任模型(design §4.5):Gherkin 全綠≠安全;純 WASI 沙箱框死能力才是發佈底氣;
第一期 evidence 可造假(誠實標明),平台重跑列未來。
hook: pre-write-guard 白名單加 component-gatekeeping / component-registry-canon SDD 目錄。
測試: sandboxAcceptance.test.ts 4 綠(含 G1 假零件被擋)。
待續(同 SDD): G4 CLI 投稿指令本地跑 Gherkin、G0 人類閘門、R5 白名單+本機 hook。
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-05-29 17:53:03 +08:00 |
|
Leo
|
fdb62e8b27
|
merge: Phase 2 降級假零件成 recipe + Phase 1 credential 修復
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-05-29 16:32:16 +08:00 |
|
Leo
|
17a076d35c
|
feat(arcrun): Phase 2 降級假零件成 recipe + credential 鏈路修復
Phase 1(credential 注入鏈路):
- 修 auth_static_key ENCRYPTION_KEY 漂移根因(見 docs/incidents)
- component-loader: readBodyOnce() 修 "Body has already been used"
Phase 2(降級假零件成 recipe,registry/components 33→22):
- 引擎: RecipeDefinition 加 auth_service(多 recipe 共用一把 auth)
auth-dispatcher 先查 recipe.auth_service 再 fallback componentId
- 引擎: auth_static_key inject.path + makeRecipeRunner {{auth.K}}
(endpoint 可插 secret,解 telegram 類 URL-path token)
- 引擎: makeRecipeRunner auto-body 剔除 _ 前綴內部欄位
- 降級並刪除: kbdb_{get,create_block,patch_block,delete,ingest}
gmail/telegram/line_notify/google_sheets(改建為 recipe)
- 刪除: ai_transform_{compile,run}(Arcrun 是 AI 呼叫的工具,
工作流不該內嵌 AI 節點回頭呼叫 AI)
- deferred(源碼暫留): claude_api/km_writer(交 Mira 收成工作流)、
kbdb_upsert_block(交 KBDB 出 upsert endpoint)
文件: DECISIONS.md(工作流是 default/建零件人類閘門/AI→工具)、
BACKLOG.md、auth-recipe.md §七、docs/incidents 加密 key 漂移
驗收: KBDB get/create/ingest/delete 2xx;telegram auth 注入綠;
gmail/sheets/line recipe 正確但缺 credential 未驗收;
kbdb patch 403 為 KBDB 端 bug(已交 kbdb/docs)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
|
2026-05-29 16:18:18 +08:00 |
|
Leo
|
8c1dedaa2f
|
chore(cypher-executor): 清除 KBDB-specific TS 邏輯與 WASM 白名單違規項
- 刪除 src/lib/kbdb-partner.ts(整檔)
- routes/auth.ts:移除 kbdb-partner import + 3 處 ensureKbdbPartner/revokeKbdbPartner 呼叫
- wrangler.toml:刪除 KBDB_BASE_URL 與 KBDB_INTERNAL_TOKEN 註解
- lib/component-loader.ts:WASM_HTTP_RUNNER_IDS 移除 claude_api + 6 個 kbdb_*;
doc comment / wasmWorkerUrl 範例 / 第 7 步註解全部清掉 Phase 3 與 kbdb 字樣
- types.ts:Bindings 移除 KBDB_BASE_URL 宣告
- graph-executor.ts:註解範例改為非 kbdb 等效描述
同捎(分開議題,一起進):
- .gitignore 刪除
- webhooks-named.ts:resumable-workflow ?async=1 分支(waitUntil + 202)
tsc --noEmit 通過。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-26 19:39:01 +08:00 |
|
Leo
|
3de4cff014
|
fix(mira/feed): soften wiki status badge — 30min 不算漏了
leo 反饋:『現在出現大量的漏了,是不是出錯?』
調查:watcher 一直在跑,但 cron 5min 一輪 × 一輪最多 20 raws,
21 個剛清的假處理 + 14 個歷史舊 raw 排隊處理需要多輪 cron。
舊邏輯 30 min 就標 ⚠️ 漏了 太兇,給用戶『系統壞了』錯覺。
新邏輯:
- < 6 min: ⏳ 處理中
- 6 min ~ 6h: ○ 等待(含 ↻ 立即優先) ← 新增
- > 6h: ⚠️ 漏了 ↻ (跟 wiki_giveup_scanner 6h 閾值對齊)
- wiki-give-up tag: 🚫 放棄 ↻
對齊 scanner 邏輯:6h 前 watcher 仍會自動重試,這時間內顯示等待。
過 6h 才算真卡。
|
2026-05-17 19:22:21 +08:00 |
|
Leo
|
c950778fdf
|
feat(mira/feed): WikiStatusBadge 加 🚫 放棄 狀態 + ↻ 重試
對應 wiki_giveup_scanner workflow (mira repo) 標 wiki-give-up tag 的 raw:
顯示 🚫 放棄 ↻ 按鈕,hover 解釋。點擊清 tag + 強制重 trigger。
leo 2026-05-17 反饋 C 落地:watcher 一直 fail 的 raw 不會無限重試了,
6h+ scanner 標給棄、UI 顯示給棄、用戶可手動修。
|
2026-05-17 11:36:54 +08:00 |
|
Leo
|
175a290730
|
feat(mira/feed): WikiStatusBadge 加手動重試按鈕
leo 2026-05-17 反饋:「漏了的要怎麼做?會自己慢慢完成還是要手動下令?」
自動行為解釋:
mira_feed_watcher cron 每 5 min 掃 tags=[] 的 raw 自動重試。
但若已被 mark wiki-processed (假處理),watcher 永遠跳過 → 需手動。
互動加:
- ⚠️ 漏了 變按鈕,click → 清 tag + 立即 trigger wiki_synthesis
- ✅ wiki 旁加小 ↻ icon,給「tag 標完成但實際沒 wiki」的情況用
- 點擊後 1 分鐘內顯示「⏳ 重試中」防 spam
UX 細節:
- title hover 解釋每個狀態跟動作
- retry 同時清 tag + 直接 trigger(不等下個 cron tick)
- 失敗 fail silently (catch all),1 min 後可再試
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-17 11:26:24 +08:00 |
|
Leo
|
475c95aaae
|
feat(kbdb_upsert_block): add create_only flag (#2 stub support)
leo 反饋 2026-05-17:「至少建一個 placeholder 給未來累積」
但 upsert 預設 PATCH 既有會把完整 wiki 覆寫成 stub。
新 input field:create_only (bool, default false)
- false (預設):既有 → PATCH (傳統 upsert 行為)
- true:既有 → return action='exists' 不動,避免 stub 覆寫 full wiki
用於 wiki_synthesis V3.1 referenced_entities → ensure_stub_wiki_page 場景。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-17 11:07:31 +08:00 |
|
Leo
|
7dae958dbe
|
feat(mira/wiki): backlinks section — 顯示提到此 entity 的 raw notes (#2 leo 反饋)
leo 2026-05-17 反饋:「從這本書的條目應該反向連到那篇筆記去,
如果在 Logseq 會放在下方列表提到這個條目的其他內容」
實作:
- 撈所有 content === entity 的 wiki-page (V3 一次寫入會建多個 wiki-page
per raw mention)
- 從每個 wiki-page tags_json 取 raw:XXX tag → unique raw_ids
- fetch 對應 raw blocks → render 「📎 提到此 entity 的筆記」section
每條 link 跳 /mira/feed#page=...
- 顯示前 100 字 preview,全文 hover title
- 樣式:左 border + 暗色背景 (區分於主內容)
對應 wiki_synthesis V3 (commit 63ac4c9 mira) 的 wiki-page tags raw:XXX
標記設計:每篇 raw 提到某 entity 時,create_wiki_page 都會寫一個新的
wiki-page (page_name 同名),tags 含 raw:{raw_id}。反查 wiki 對應 raw
不靠 KBDB graph 反向 index,純走客戶端 wiki-page list filter。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-17 10:40:40 +08:00 |
|
Leo
|
4fd2d3ba6c
|
fix(cypher-executor): FOREACH iter plural 變體 (entity → entities)
舊 getIterableFromContext 只試 'key+s',遇 irregular plural 不命中:
entity + s = entitys ≠ entities (Claude 真實 output)
加變體:
- key + 's' (paragraph → paragraphs)
- key.replace(/y$/, 'ies') (entity → entities)
- key.replace(/(s|x|z|ch|sh)$/, '$1es') (box → boxes)
- key (singular fallback)
對應 mira wiki_synthesis V3 multi-entity 升級需求。
|
2026-05-17 10:34:12 +08:00 |
|
Leo
|
efdd75cbdc
|
feat(mira/feed): WikiStatusBadge — 顯示貼文 wiki 合成狀態 (leo 2026-05-17 反饋)
leo 反饋:「沒有符號顯示是否已建立 wiki,不知道是出錯了還是要等下一批」
新 component WikiStatusBadge 顯示在 PostCard header 來源/時間旁邊:
- ✅ wiki — tags 含 wiki-processed
- ⏳ 處理中 — 貼 < 6 分鐘前(cron 5 分鐘一輪,可能還沒撈到)
- ○ 排隊 — 6-30 分鐘(等下一個 tick)
- ⚠️ 漏了? — > 30 分鐘還沒處理(可能 wiki_synthesis 失敗)
Mira 自己貼文(type=wiki-page from showMira)不顯示 — 它本身就是 wiki。
資料來源純 client-side:mainBlocksList[0].tags_json + doc.created_at。
未來可加 click → 跳對應 wiki page,或 hover 顯示 entity 預覽。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-17 09:53:19 +08:00 |
|
Leo
|
a7d36933e6
|
feat(cypher-executor): trigger_workflow status paused_awaiting_resume → running_async (LI roadmap 自評)
第一份 arcrun-roadmap (block e924c231) 提的建議:
「paused_awaiting_resume 容易被誤讀成掛起出問題,
考慮改成更清楚的 status(如 completed_with_checkpoint)」
我採折衷命名:running_async — 強調「workflow 已接受,正在背景跑」,
不像 completed_with_checkpoint 容易被誤讀為已完成。
範圍:
- trigger_workflow component-loader.ts status field rename
- AGENTS.md §6 common errors table 同步
- arcrun-mcp arcrun_run_workflow tool 回傳 status 同步
- error_code (telemetry classification) 仍保留 paused_awaiting_resume
(SDD §1.4 error_code enum '可加不可刪' 承諾)
向下相容性:status 是 user-facing field,前面 dogfood 只有 weekly_review
一個 consumer 用 trigger_workflow,已同步更新。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-16 21:54:41 +08:00 |
|
Leo
|
8b54ebb68a
|
feat(cypher-executor): step-level telemetry (LI roadmap 2026-W19 建議)
對應第一份 arcrun-roadmap (block id e924c231) 提的:
「mira_feed_watcher 執行時間偏長(~35秒),無 error 資訊
建議:加入 checkpoint/step-level telemetry,監測瓶頸」
新增 TelemetryEvent:
- node_success — 單一 Component node 跑完
- node_failure — 單一 Component node 失敗
寫入點:GraphExecutor.executeNode catch + 最終 trace.push 之後
- 只記 node.type === 'Component'(Input/Output 跳過避免噪音)
- 含 workflow_name + component_id + duration_ms + (error_code on fail)
- fire-and-forget, 不擋主流程
實測(wiki_synthesis trigger 後):
- 4 個 node_success blocks 寫入 KBDB (4 個 kbdb_get)
- duration 範圍 653ms-2003ms,立刻看到誰是瓶頸
- paused 的 classify (claude_api) 不算 success(trace 已記 paused 狀態)
下次 weekly_review compose_review 會看到 component-level breakdown,
能寫出「kbdb_get 平均 X ms、claude_api 平均 Y ms」等更細的分析。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-16 21:47:15 +08:00 |
|
Leo
|
8e985684f9
|
feat(cypher-executor): magic vars {{_today}} / {{_iso_week}} / {{_now}} 等
對應 LI SDD M2.x improvement,源自 Claude (我) 透過 arcrun_report_feedback
寫的 feedback block c47bf70b 提的「需要內建變數展開」需求。完整閉環:
AI 用 MCP tool 報 bug → KBDB 收 feedback → AI 自己看 → 自己修補 → deploy
新增 cypher-executor/src/lib/magic-vars.ts:
- _today / _yesterday / _now / _now_unix / _now_unix_s
- _iso_week (2026-W20) / _iso_week_num / _iso_year
- _yyyymm / _yyyymmdd
- _year / _month / _day / _hour / _minute / _second(zero-padded)
- _weekday (0-6, 0=日) / _iso_weekday (1-7, 1=一)
全部 UTC,避免 worker 跨時區誤判
GraphExecutor.execute() 入口注入:
ctxWithMagic = { ...initialContext, ...buildMagicVars() }
順序確保 magic vars 永遠 win(防 user 不小心用 _ prefix)
不違反 §2.2(cypher-executor TS 禁實作 secret/JWT 業務邏輯):
magic vars 是公開時間常數,跟既有 interpolateString 的 ctx 變數展開
同層,純 orchestrator routing 職責。
AGENTS.md §10.5 加 magic vars 完整表 + weekly archive 範例。
實測(commit 後 deploy + 觸發 weekly_review):
- KBDB 新建 roadmap-2026-W20 block 正確展開 page_name
- roadmap-latest 同步更新(雙寫 pattern)
- 證明 weekly archive 從此真能累積歷史,不再固定 latest 覆蓋
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-16 21:20:52 +08:00 |
|
Leo
|
ef406d714a
|
docs(llm-interface): tasks.md 進度更新 — M1/M2.1/M3/M4 主體完成
|
2026-05-16 17:37:43 +08:00 |
|
Leo
|
37379b71bc
|
feat(scripts): 本機 CI/CD + registry-to-KBDB 同步 (跳過 GH Actions)
對應 leo 2026-05-16 GH Actions 配額被停 + LI SDD M3.4。
scripts/local-deploy.sh — 本機 deploy 取代 GH Actions
- 複製 .github/workflows/deploy.yml 的 discover 邏輯
- git diff 過濾,只 deploy 改到的 worker
- 連動:registry/components/{X} 改了,重 build .component-builds/{X}/component.wasm
- 分 tier1 (components) / tier2 (orchestration),依序 deploy
- 支援:--all / --dry-run / --base <ref> / 指定 target 名稱
- 部署前 wrangler whoami 健康檢查
- 失敗清單彙整不中斷其他 deploy
scripts/sync-registry-to-kbdb.py — LI SDD M3.4
- registry/examples/ → KBDB type=workflow-example (page_name=example-{slug})
- registry/skills/ → KBDB type=agent-skill (page_name=skill-{slug})
- 走 kbdb-upsert-block.arcrun.dev (idempotent,page_name 為 key)
- 從 ARCRUN_API_KEY env var 或 polaris/mira/.env 取金鑰
- 支援:--dry-run / --examples-only / --skills-only
實測:
- sync 第一次:10 examples + 5 skills 全 created
- 第二次:全 updated (idempotent ✓)
- KBDB type=workflow-example / agent-skill 都看得到完整 content + tags
意義:
- 申訴 GH Actions 期間,leo / Claude Code 可本機 deploy 不卡
- 即使 GH 永久不通也能 ship
- sync script 之後也能加進 cron 或 git hook 自動化
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-16 17:28:16 +08:00 |
|
Leo
|
4e7880c1cb
|
fix(cypher-executor): /executions/paused 走 per-user index (強 consistent)
對應 LI SDD M2.1 修補。
問題:原 /executions/paused 走 EXEC_CONTEXT.list({prefix:'paused_run:'})。
CF KV list 是強 eventual consistent (30-60s 延遲),剛 paused 的 workflow
list 不會立刻看到。本機 wrangler kv list 也回 [],但 KV.get 同 task_id
能即時拿到 — 證實 list vs get 一致性層級不同。
修補:persistPausedRun 額外維護 per-user index `paused_idx:{api_key}`
(JSON Array),是單一 KV.get 拿全列表,**強 consistent 無延遲**。
consumePausedRun 同步從 index 移除。
新 helper:
- listPausedRunsByApiKey(kv, apiKey, limit) — 走 index
- PausedIndexEntry type — task_id / run_id / paused_node_id / workflow_name /
expires_at / persisted_at
實測:trigger 後立刻 list 即時看到 paused (commit 前是 0)
副作用:index 寫入 + delete 都是 fire-and-forget 在 consume path,失敗
不擋主流程。Index entries 上限 100 防無限長。每次 read 過濾 expired。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-16 17:15:16 +08:00 |
|
Leo
|
10834ef9bb
|
ci: 加 paths-ignore + landing concurrency cancel (省 GH Actions minutes)
對應 leo 2026-05-16 Actions 配額用爆 → 全面瘦身 CI trigger。
deploy.yml (Workers):
既有:worker-level git diff filter(只 deploy 改到的 worker)✅
新增:workflow-level paths-ignore — doc-only commit 完全不啟動 workflow
排除:**.md / AGENTS.md / .agents/** / docs/** / registry/examples/** /
registry/skills/** / .gitignore / LICENSE
之前每個 doc push 都觸發 discover job 吃 ~1 min。
本輪 LI 開發 ~10 doc-only commit = 省 ~10 min
deploy-landing.yml (Pages):
既有:paths filter ('landing/**') ✅
新增:concurrency cancel-in-progress (原 false → true)
landing build ~3 min 是大頭,連續 push 取消舊 build 省最多
|
2026-05-16 16:46:40 +08:00 |
|
Leo
|
3892dc3a9b
|
docs(AGENTS): 更新 LI M2.2 + M3 新 tool / examples / skills 引用
對應 LI SDD M2.2 + M3.3 + M3.1 完成。
- Step 1 加 arcrun_search_examples / arcrun_list_skills 用法
- Step 3/4/5/6 改用 arcrun_* tool prefix
- 新增 Step 7:報 feedback
- §7「不確定的時候」全部更新成 arcrun_* tool 名
- 新增「過渡期 tool 命名注意」說明:arcrun_* 主用、u6u_* 舊規範保留、
u6u_deploy_workflow 壞掉建議改 arcrun_push_workflow
|
2026-05-16 16:41:35 +08:00 |
|
Leo
|
ce693b4de1
|
ci: deploy.yml concurrency cancel-in-progress
leo 2026-05-16 帳號 Actions 用爆配額被 disable。連續 push 時舊跑會被
新跑取代,省 50%+ minutes。
代價:在中段 push 後 +30 秒內再 push 第三次,第二次跑被取消(不會部署)。
LI 開發階段可接受 — 開發頻率高、最終 push 才需要真實部署。
未來若需要每次都跑(例如生產穩定期),改回 false。
|
2026-05-16 16:39:59 +08:00 |
|
Leo
|
388c193ae7
|
docs(registry): seed 10 examples + 5 skills (LI SDD M3.1 + M3.3)
對應 .agents/specs/llm-interface/ Milestone 3.1 + 3.3。
registry/examples/ — 10 個可直接 push 的 workflow 範本:
starter: webhook-to-http
common: cron-watcher, llm-classify, rag-search-answer, daily-digest
external: email-summary (gmail+claude+telegram), pdf-to-blocks,
github-issue-bot
advanced: parallel-fanout (trigger_workflow fan-out),
error-retry (try_catch+wait pattern)
每個含:workflow.yaml(可直接 push)+ description.md(解決什麼問題 /
改成你自己的 / 學到什麼)+ tags.json(搜尋用)
registry/skills/ — 5 個 AI playbook(markdown):
build_watcher_workflow — cron + filter + trigger 模式
debug_paused_workflow — claude_api callback paused 怎麼追
migrate_http_to_trigger_workflow — 從 self-fetch 換 trigger_workflow
rag_with_arcrun — KBDB + claude_api 組裝 RAG
add_new_wasm_component — TinyGo 寫 + 部署全流程
兩者差異:
examples = 可直接拿來改的 YAML
skills = 面對 X 問題該怎麼想 + 該用哪個 example
兩者後續:CI 自動同步進 KBDB(type=workflow-example / type=agent-skill),
MCP arcrun_search_examples / arcrun_list_skills 走 KBDB semantic search。
(CI sync 是 M3.4 工作)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-16 16:33:54 +08:00 |
|
Leo
|
989fbeb9ac
|
feat(cypher-executor): /executions/* introspection (LI SDD M2.1)
對應 .agents/specs/llm-interface/ Milestone 2.1。給 AI debug 用的執行
狀態檢視端點。3 個新路由:
GET /executions/paused
- 列當前 api_key 下所有 paused workflow(等 callback resume)
- 走 EXEC_CONTEXT KV `paused_run:*` prefix scan,過濾 state.api_key
- 回 [{task_id, run_id, paused_node_id, workflow_name, expires_at}]
- 限 limit 100,避免 KV N+1 爆
GET /executions/:task_id
- 看單一 paused state 細節(trace_so_far / paused_context / pending_result)
- 隔離租戶(state.api_key !== 用戶 ak → 回 not_found 不洩漏存在性)
- 回完整 state JSON
GET /workflows/:name/executions
- 列某 workflow 最近 N 次執行 verdict(走 ANALYTICS_KV stats:{name}:* prefix)
- 先驗 workflow 屬該 api_key
- 按 timestamp 後綴 desc sort
統一 error contract(LI SDD §1.3 / §1.4 規範):
- ok: bool
- error_code: enum (auth_missing / not_found / internal_error)
- human_message: 描述
- next_actions: 陣列,給 AI 看的下一步
- hints: 成功時的 next-step 建議
不影響既有路由 contract。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-16 15:58:35 +08:00 |
|
Leo
|
04ed722591
|
chore: gitignore .swarm/ + ruvector.db (Claude Code local artifacts)
之前 M1.2 telemetry commit 不小心把 cypher-executor/src/.swarm/ 跟 ruvector.db
commit 進去。這些是 Claude Code 自己的本地工具產物,不該入庫。
- 加 .gitignore 樣式:.swarm/ / ruvector.db / **/.swarm/ / **/ruvector.db
- 撤回上次 commit 進去的 5 個檔案
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-16 15:35:55 +08:00 |
|
Leo
|
d04e34ea35
|
feat(cypher-executor): implicit telemetry (LI SDD M1.2)
對應 .agents/specs/llm-interface/ Milestone 1.2。
新增 lib/telemetry.ts:
- hashApiKey(): SHA-256 截 16 hex 字元(不可逆,可聚合)
- recordTelemetry(): fetch fire-and-forget 寫 KBDB type=agent-telemetry block
- 設計:不阻擋主流程,錯誤 console.warn 不 throw
- 用 ctx.waitUntil 確保即使主 request 已回,背景仍會跑完
寫入點 3 處:
1. routes/webhooks-named.ts POST /webhooks/named (deploy) → deploy_success
2. routes/webhooks-named.ts POST /webhooks/named/:name/trigger →
executeWebhookGraph 帶 ctx + userAgent,內部記 run_success / run_fail
3. routes/validate.ts POST /validate → validation_error (含 schema_failed / edge_node_missing)
executeWebhookGraph 簽名擴張:可選 ctx + userAgent,舊 caller (scheduled /
trigger_workflow / anonymous webhook) 不傳也 OK(telemetry 仍寫但無 ctx 加持)。
paused (workflow 因 claude_api 等等 callback resume) 算 run_success,
不污染 fail metric。
types.ts: 加 PLATFORM_API_KEY env (可選) + re-export ExecutionContext
不違反「業務邏輯走 WASM」鐵律:telemetry 是 orchestrator 觀測自身的能力,
跟 trigger_workflow / scheduled() 同類。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-16 15:33:35 +08:00 |
|
Leo
|
56973558e2
|
docs(arcrun): AGENTS.md v1 — AI onboarding (LI SDD M1.1)
對應 SDD .agents/specs/llm-interface/ M1.1。
LI (LLM Interface) 第一份文件:任何 AI agent 載入這份就能用 arcrun,
不用讀 SDD 內部架構、不用 grep codebase、不用問人。
包含:
- 30 秒「what is arcrun」
- MCP 連線配置(Claude Desktop / Cursor / 自製 agent 通用)
- 5 個核心概念(Component / Cypher binding / FOREACH / Paused-resume / api_key)
- 你的第一個 workflow(list → validate → push → run → trace 5 步)
- URL 慣例 + CF self-fetch 死鎖警示
- 常見錯誤 + error_code → 下一步 mapping
- 「不確定的時候」標準流程
- report_feedback 規範(**必做**)
- KBDB 速覽 + cron watcher 範例
- meta-規範:寫 workflow 的 AI 自己的習慣
901 words / 263 lines(控制在 5-8K tokens 內),純繁體中文。
CI 自動同步 KBDB block (type=agent-onboarding) 之後再做(M1.1 另一個 subtask)。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-16 15:28:05 +08:00 |
|
Leo
|
180cef26c7
|
docs: rename SDD folders u6u-* → arcrun-* + update cross-refs
對應 SDD arcrun/.agents/specs/llm-interface/ M5.6(之前列為 backlog 連動)。
leo 2026-05-16 拍板 u6u 整體退場後,順手把兩個 SDD 也改名。
- .agents/specs/u6u-core-mvp/ → arcrun-core-mvp/
- .agents/specs/u6u-platform-evolution/ → arcrun-platform-evolution/
- CLAUDE.md / .claude/rules/00-sdd-protocol.md / 04-current-progress.md /
llm-interface SDD 內所有跨 SDD 引用同步更新
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-16 15:24:22 +08:00 |
|
Leo
|
5d99302681
|
docs(llm-interface): apply leo's decisions — drop u6u + finally.click
leo 2026-05-16 拍板(除 dual-hostname 外照原設計):
1. MCP URL: 單一 mcp.arcrun.dev,mcp.finally.click 直接退場(不並存)
- 理由:finally.click 是還沒申請新網址的暫用,那是一個服務,arcrun 是底層
2. u6u branding 整體退場:
- u6u-mcp repo → arcrun-mcp
- u6u-gui repo → arcrun-gui
- u6u_* tool prefix → arcrun_*
- 一次切換,不留 alias,不留 deprecation 期
- 理由:u6u 不存在了
SDD 三件套同步更新:
- requirements.md: 開放問題章節改決策紀錄;移除「保留 15 tool deprecation」自相矛盾
- design.md: §1.1 命名 + §6 migration plan + §8 決策表全部改成「單一切換」
- tasks.md: M5 重組成 6 個 sub-step(準備 / repo rename / tool rename / 舊 URL 退場 / 文件 / 連動 SDD 追蹤)
連動但不在本 SDD 範圍:
- matrix/arcrun/.agents/specs/u6u-core-mvp/ 改名
- matrix/arcrun/.agents/specs/u6u-platform-evolution/ 改名
(M5.6 列出,另起 task 追蹤)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-16 15:09:48 +08:00 |
|
Leo
|
c2a2f82ade
|
docs(arcrun): SDD llm-interface — AI 操盤手使用體驗 first-class
設計動機:3 天 mira dogfood 累積 14 個痛點,7 個純粹是 LI 缺失。
arcrun 過去設計集中在「人」(u6u-gui / docs),AI 對 arcrun 的可用性
沒被當第一公民。
SDD 三件套(matrix/arcrun/.agents/specs/llm-interface/):
requirements.md
- personas(Claude Code 主力 / 用戶私人 agent / SDK 使用者)
- 範圍涵蓋 5 系統(cypher-executor / registry / u6u-mcp / u6u-gui / kbdb)
- 10 個 FR:onboarding / CRUD 對等 / dry-run / 結構化 trace /
可程式化 error / feedback tool / implicit telemetry /
skill blocks / examples / weekly closed loop
- 5 個 NFR:相容 / 多 transport / error contract 穩定 /
feedback exportable / coverage 量化
design.md
- 5 層 LI 模型:AGENTS.md / arcrun-mcp / Skills / Examples / Telemetry
- 25 個 MCP tool 完整清單分 5 類
- error_code enum v1
- coverage matrix(GUI 動作 vs MCP / 31 cypher-executor 路由 vs LI)
- 完整 AGENTS.md 模板
- u6u-mcp → arcrun-mcp migration plan(90 天 deprecation)
- weekly_review workflow YAML 範本
tasks.md
- 5 個 milestone(M1 收 data / M2 gap-fill / M3 skill+examples /
M4 closed loop / M5 rename)
- 估算 23 個工作日 (~5 週)
- M1 是硬前置(不收 data 改了也不知道對沒)
Audit 基準(用 4 個並行 Explore agent 整理):
- cypher-executor: 31 HTTP 路由,9 個 AI-essential
- u6u-mcp: 15 tool,缺 update/delete/history/validate/feedback
- u6u-gui: 8 個人類動作可對等 LI / 3 個視覺類不需
- kbdb: 50 路由 13 group,LI 走 abstracted tool 不直接 expose
同步更新 .claude/rules/04-current-progress.md SDD 索引。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-16 14:58:21 +08:00 |
|
Leo
|
521624261d
|
fix(cypher-executor): trigger_workflow paused 不算失敗
watcher 實測 8/8 raw 跑通後發現 wait=true 把 wiki_synthesis paused
(claude_api 等 callback resume 的正常狀態)回報成 success:false,造成
watcher 看起來「5/8 失敗」實際是「正在背景跑」。
改成:
- isPaused 偵測「workflow paused at node X」error 字串
- isPaused → success:true, status:'paused_awaiting_resume'
- 完整完成 → status:'completed'
- 真失敗 → status:'failed'
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-16 14:04:12 +08:00 |
|
Leo
|
b8ecef0b41
|
feat(cypher-executor): trigger_workflow 內建零件 — 繞 CF self-fetch
mira_feed_watcher 之前用 http_request 自打 cypher.arcrun.dev / 自身 workers.dev URL
都被 CF self-fetch 防護擋(Worker→自身的 subrequest 攔截)。
新增 `trigger_workflow` 內建 orchestration 零件:
- 在 createComponentLoader 最前面攔截 component_id === 'trigger_workflow'
- 從 WEBHOOKS KV 撈 `{api_key}:wf:{name}` 拿 graph
- 動態 import 避循環依賴
- in-process 呼叫 executeWebhookGraph,沒有任何外部 HTTP
- 預設 wait=true(claude_api paused 仍視為 success 回傳)
不違反「業務邏輯走 WASM」鐵律:trigger_workflow 是 orchestrator 自己的 routing
能力(像既有的 CALLS_SUBFLOW),不是業務邏輯。
對應 mira_feed_watcher.yaml 同步改用此零件(在 polaris/mira/ repo)。
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-16 13:54:26 +08:00 |
|
Leo
|
1084e0102a
|
fix(mira): wikilink autocomplete 5s cache + 開下拉時 refetch
leo 反饋:30s TTL 太久,wiki_synthesis 後台跑出新 entity,autocomplete 撈不到。
- TTL 30s → 5s
- WikilinkAutocomplete 在 matchInfo 從 null → 有值時主動 invalidate refetch
- 順手把 yaml-parser 對 FOREACH iterator relation 命名變體(「對每個 X」/「FOREACH X」)放行,graph-builder 早就支援,validate 卻擋掉
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
|
2026-05-16 13:37:03 +08:00 |
|
Leo
|
7da1eb6d65
|
feat(mira): [[entity]] wikilink — 顯式建檔 + autocomplete + render link
對應 tasks.md backlog #12 / design.md §3.6.2。leo 反饋:要像 Logseq 那樣
寫 [[X]] 立刻建檔,下次 [[X 自動補完,render 變連結。
helpers:
- parseWikilinks(text) → 抽 [[X]] entity list
- fetchAllEntityNames(apiKey) → 合 index-entry + wiki-page entity 名稱
- getEntityNamesCached → 30s session cache for autocomplete
- ensureEntitiesExist → 新 entity 立刻建 wiki-page placeholder
- tags 含 entity-type:book/url/concept(guessEntityType 推測:《》→ book / http → url)
- source: leo-explicit
- expandWikilinks(text) → render 時把 [[X]] 轉 markdown link to /mira/wiki/wiki-X
UI:
- <WikilinkAutocomplete>:textarea cursor 在 `[[query` 未閉合時,下拉顯示既存
entity(substring filter)+「⊕ 建立 [[query]]」option,↑↓選 / Enter 確認 /
Esc 取消。fixed-position below textarea bottom(cursor tracking 留下輪)
- PostComposer compact + popup 兩個 textarea 都掛 autocomplete
- EditingArea(PostEditor / BlockEditor / ReplyLine / PageReplyComposer 共用)
加 apiKey prop,內部 textarea + popup 都掛 autocomplete
submit hook:
- PostComposer.submit:postBlockId 建好後 ensureEntitiesExist(wikilinks)
- BlockEditor.submitReply / ReplyLine.submitReply 同樣建檔
- 在 wiki_synthesis trigger 前先建,避免 race
render:
- markdown.tsx expandWikilinks 取代 stripLogseqMeta 前處理(兩階段)
- 內部 wiki link(/mira/wiki/...)不開 _target=_blank(不離開頁面)
留下輪:metadata 補完 (作者/出版社) / cursor tracking / PostEditor.save 也建檔
|
2026-05-16 12:08:28 +08:00 |
|
Leo
|
d6bff9d551
|
fix(mira): reply @mira indicator + RAG match 寬鬆化
leo 試用反饋:
bug:reply 中 @mira 「看起來無效」
- 真正 root cause: trigger 確實 fire,但 thinking indicator 沒亮起 → leo 沒看到回應
以為失敗(其實 mira 後台跑 30s+ 才回)
- 修:MiraTriggerContext 把 thinking trigger 抽成 context callback
PostComposer / PostEditor / BlockEditor / ReplyLine 五個 @mira 觸發點
都呼叫 triggerThinking?.(docPageName) 啟動 5s polling
bug:RAG 抓不到 entity(leo 寫《李飛飛的視界之旅》沒被識別)
- 之前只看 type=index-entry,且嚴格 substring。新建 wiki 還沒 index-entry
時就漏;entity 名稱跟貼文文字稍微不同也漏
- 修 fetchRelevantWikiContext:
- 平行撈 index-entry + wiki-page 兩種,合併 entity set
- 雙向匹配:entity 完整 substring postContent(嚴格) OR
entity 內 3+ 字片段在 postContent 出現(寬鬆,中文友善)
- top 5(從 3 增加),給 mira 更多上下文
|
2026-05-16 11:43:28 +08:00 |
|
Leo
|
94368ec981
|
fix(mira): 4 bug — popup 在 edit / 思考 indicator 條件 / RAG / edit @mira
leo 試用 P0 後反饋的 4 個問題:
bug #1: popup 編輯時沒有,更擠
- EditingArea 元件加 ⇱ 放大 button + popup overlay(共用 PostComposer 的 popup pattern)
- 影響:所有 edit / reply 模式現在都有放大編輯
bug #2: Mira 思考中很久(即使沒 @mira)
- root cause: onAiTriggered(pageName) 在 PostComposer 永遠 fire,會在每篇貼文觸發
thinking indicator UI
- 修:移到 if (hasMiraMention) 分支內。沒 @mira → 不顯示 thinking
- wiki_synthesis 仍每篇都跑(背景靜默)但不顯示 thinking,避免 leo 誤會
bug #3: Mira reply 不知道有 wiki,無狀態
- 加 fetchRelevantWikiContext: 撈所有 type=index-entry blocks,用 entity 名稱
keyword match against post content,取 top 3 整篇 markdown 餵進 prompt
- prompt 加規則「如果 leo 提到的 entity 你已有 wiki 知識,請主動引用」
- 對應 leo「應該以擁有知識庫的專人來回覆」
bug #4: edit 時 @mira 沒反應
- PostEditor.save / BlockEditor.saveEdit / ReplyLine.save 三處都加 hasMiraMention 偵測
- 條件:新內容含 @mira 且舊版沒有 → 觸發(避免重複編輯重複 trigger)
placeholder 加 hint「@mira 呼叫 Mira 回覆」。
|
2026-05-16 11:07:34 +08:00 |
|
Leo
|
8d4c3a3464
|
feat(mira): P0 河道完善 3 task — Mira 頭像 / @mira 選擇性回覆 / 編輯器 popup
對應 tasks.md backlog #5a / #5b / #5c(leo 2026-05-16 P0),design.md §3.6.5。
#5a Mira 發文獨立頭像
- 新 MiraAvatar 元件(紫色漸層圓 + 🤖 emoji)
- isMiraSource() 判斷 post 來源是 leo(km-writer-direct/logseq/mobile/web/tg/rss)
還是 mira(ai-* / mira-* / 其他 test sources)
- PostCard header:showMira ? Mira 頭像 + 名「Mira」 : leo 頭像 + leo 名
#5b @mira 選擇性回覆(撤回每篇 auto-reply)
- 新 hasMiraMention() regex:偵測文字含 @mira(前後可有標點)
- PostComposer / BlockEditor / ReplyLine 三處 submit:只有 @mira 時 triggerAiReply
- triggerAiReply prompt 加 topic 抽取(@mira 後第一段到標點)+ scope hint
- wiki_synthesis trigger 跟 @mira 無關,每篇都跑(KB 副本同步)
- 不擋手動筆記(leo 隨手寫不需要 mira 每篇都回)
#5c 編輯器 popup 放大
- composer 加 ⇱ 放大按鈕 → 切到 fullscreen overlay popup
- popup 含大 textarea + 同 markdown toolbar + 同 submit 邏輯
- ⌘+Enter 發布、Esc 收起、外點 backdrop 收起
- 對應 leo「寫長文 textarea 太小」需求
CSS 加 .mira-avatar-mira / .mira-composer-popup-* 系列。
TS check pass。
|
2026-05-16 10:35:32 +08:00 |
|
Leo
|
0f2a00e0d5
|
ci(landing): auto-deploy to CF Pages on push to main
接好 leo 反饋的「Pages auto-deploy 沒接」坑。新增 .github/workflows/deploy-landing.yml:
- push 到 main 且 landing/ 有變動 → build + 部署
- workflow_dispatch 也可手動觸發
- 用既有的 CLOUDFLARE_API_TOKEN / CLOUDFLARE_ACCOUNT_ID secrets
- 用 cloudflare/wrangler-action@v3 標準 action
下次 leo 推 landing 改動就會自動 deploy,不用 wrangler pages deploy 手動跑。
|
2026-05-16 09:29:57 +08:00 |
|
Leo
|
3689f30409
|
fix(mira): [pageName] h1 顯示 entity 名 + listing dedupe by entity
兩個 leo 反饋的 UI bug:
1. wiki/[pageName] 對 index-entry 渲染時,h1 用 block.content(整篇 markdown)
會把整個內容塞進 h1。改:wiki-page 用 content 當 entity 名;其他類型
(index-entry/schema/log)用 page_name 剝 `wiki-` / `index-` prefix。
2. listing「Wiki Pages (21)」累積式設計造成同 entity 多版顯示為多張卡,雜亂。
改:用 useMemo dedupe by entity(content)— 每 entity 一張卡顯示最新版,
標題顯示「N 版累積」當 N>1。原始 21 筆 → 現在約 6-7 個 unique entity。
|
2026-05-16 09:03:45 +08:00 |
|
Leo
|
64193f2aa5
|
feat(mira): wiki listing 加 Index Entries section(CC navigation 入口)
leo 反饋:原本只看到 wiki-page 列表沒看到 per-entity index-entry,
不知道 CC 從哪入口。新增 section 列出所有 type=index-entry blocks,
標題用 entity 名稱(剝 `index-` prefix),點進去看完整 markdown 摘要。
對應 design.md §3.5.12.4.2 雙層 outliner(v1.6):
- 概覽層:index-entry markdown(含「段落 outline」/「涵蓋面向」等)
- 完整 outliner:wiki page 自身(7B.3g 已實現的樹狀渲染)
部署:arcrun-landing.pages.dev(手動 wrangler pages deploy)。
|
2026-05-14 18:01:55 +08:00 |
|
Leo
|
bc6360ccfc
|
feat(arcrun): http_request body_json + error heuristic; mira feed fire-and-forget
http_request 零件擴展(registry/components/http_request):
- 加 body_json 物件欄位(內部 JSON.stringify),yaml 端不用手組 JSON 字串
- 新增 JSON 回應的 error 欄位偵測 → 若 body 含 `{"error":"..."}` 則零件回 success=false
解 cascade bug:mira_feed_watcher 用 http_request trigger wiki_synthesis,
原本 4xx response 也被當 success,ON_SUCCESS 鏈會誤觸發
根因架構債:host fn 沒回 HTTP status code(arcrun.md 列為 P1 follow-up)
landing 河道 feed (landing/app/mira/feed/page.tsx):
- 加回 triggerWikiSynthesis fire-and-forget 對 cypher.arcrun.dev/webhooks/named/
wiki_synthesis/trigger 公開觸發 endpoint(arcrun-native,非 mira-specific route)
- 不走 watcher 是因為 cypher-executor 自己 fetch 自己 workers.dev URL = CF 1042
self-fetch 擋
watcher 仍存在當 cron backup,但目前因 self-fetch 1042 不會真正觸發下游
wiki_synthesis(arcrun.md 列為 P1 follow-up)。
|
2026-05-14 16:06:46 +08:00 |
|
Leo
|
8ab6f8a66b
|
fix(cypher): interpolateString single-ref array/object pass-through (P0 #11)
mira_feed_watcher 第一輪 cron tick 跑 264ms 完成但 0 raw 處理 — 挖到 root cause:
interpolateString 看到模板就 string.replace,非 string 值(如 kbdb_get 回的
blocks 陣列)一律 JSON.stringify。所以 `items: "{{list_raws.blocks}}"` 把
陣列轉成字串給 filter 零件,filter 收到字串 != array → items 被忽略 →
FOREACH 跑 0 次 → watcher 看似成功實則空跑。
修:interpolateString 加 single-ref pass-through —— 若整個值是純單一 `{{x}}`
引用,回 raw value(保留 array / object 型別)。多 ref / 混合文字仍 stringify。
對應 SDD: arcrun.md 三-A P0 #11。
下一輪 cron tick 應該真正處理 raws,加 wiki-processed tag。
|
2026-05-14 14:54:26 +08:00 |
|
Leo
|
711af5dbf2
|
feat(arcrun): kbdb_get 加 type/source/user_id filter
之前只支援 block_id / page_name,撈「source=km-writer-direct 的 note」這類
跨 page 查詢做不到。Wiki UI 7B.3g 跟 mira_feed_watcher 都要用 client-side
filter 繞,違反「邊用 arcrun 邊修」原則。
擴 contract:保留既有 block_id (mode A) + page_name (mode B),新增純 filter
mode C:type / source / user_id 任意組合。同時 page_name + filter 也允許組合。
驗證:source=km-writer-direct&type=note&limit=5 撈到 leo 5 筆未處理河道貼文。
對應 SDD: arcrun.md 三-B 新零件 checklist + tasks.md 7B.3h(mira_feed_watcher
正在組)。
|
2026-05-14 14:18:43 +08:00 |
|
Leo
|
9560485937
|
feat(cypher): add scheduled() handler — arcrun-native cron 排程基建
對應 arcrun.md 三-A P1 #3。
緣由:cron 零件存在但只做 expression validation,沒有真正的排程跑。leo 指出
「邊用 arcrun 邊修,不要 workaround」— 撤回前一輪的 /mira/wiki-from-raw
mira-specific route(違反 mira CLAUDE.md §1.5 一律 arcrun-native),改補
真正的 cron infra。
加入:
- src/lib/cron-match.ts — 5 欄位 cron matcher(* / N / */N / a-b / a,b 組合)
- src/scheduled.ts — handler:掃 KV cron-idx: prefix,比對 controller.scheduledTime
→ executeWebhookGraph 背景跑
- routes/webhooks-named.ts — acr push 時偵測首節點 cron → 存 cron_expr 到 record
+ 額外寫 cron-idx:{api_key}:{name} 輕量索引;DELETE 一併清理
- src/index.ts — export default 改 { fetch, scheduled }
- wrangler.toml — [triggers] crons = ["* * * * *"](每分鐘 tick)
- wrangler.toml — workers_dev = true 供 self-fetch self-trigger 用
- tests/arcrun-test/cron_heartbeat.yaml — 健康監控 workflow(每分鐘 fire + set 節點)
撤回:
- 刪 src/routes/mira.ts(mira-specific workaround)
- types.ts 拿掉 MIRA_CONFIG
- index.ts 拿掉 miraRouter wire
- landing/app/mira/feed/page.tsx 拿掉 triggerWikiSynthesis 呼叫
下一輪:mira_feed_watcher.yaml(mira side),可能要先補 kbdb_get filter +
CALLS_SUBFLOW wire(arcrun.md 列為跟進)。
|
2026-05-14 14:04:57 +08:00 |
|
Leo
|
660b32eafd
|
feat(mira): 河道 → wiki 自動化(fire-and-forget 觸發 wiki_synthesis)
對應 polaris/mira/.agents/specs/mira-app/tasks.md 7B.3h(簡化版)。
原計畫用 arcrun cron 零件 → cypher-executor scheduled() handler,但發現
cron 零件只是 validator,cypher-executor 還沒實作 scheduled()。為了不擋
「河道書寫 → 自動產 wiki」這條 UX,先做 fire-and-forget 版本:
- 新 cypher-executor route POST /mira/wiki-from-raw
- body: { raw_block_id }
- server 端從 MIRA_CONFIG secret 補 partner key / mira_token / 三個 block IDs
- waitUntil 背景跑 executeWebhookGraph,立刻回 202
- landing 河道 post composer 成功寫 raw 後 fire-and-forget triggerWikiSynthesis()
跟既有 triggerAiReply() 同範式
- types.ts 加 MIRA_CONFIG?: string
部署後需手動:
echo '{"service_api_key":"ak_...","data_api_key":"ak_...","schema_block_id":"...","skill_block_id":"...","entities_block_id":"...","mira_token":"..."}' \
| wrangler secret put MIRA_CONFIG
UX:河道貼一則 → AI reply 30s 內 → wiki 60-90s 內出現在 /mira/wiki。
arcrun.md 記 P1 #3:cypher-executor 加 scheduled() handler,那是真正的
cron 路線,封測前不擋。
|
2026-05-14 13:50:13 +08:00 |
|
Leo
|
933ae6cb13
|
feat(mira): 7B.3g wiki UI 樹狀渲染 + 跨 wiki 連結
對應 polaris/mira/.agents/specs/mira-app/design.md §5.2 + §3.5.12。
`/mira/wiki/[pageName]`:
- 抓 wiki-page 後平行撈所有 wiki-paragraph / triplet / wiki-page,client-side 用 parent_id filter
(KBDB 沒 parent_id server filter,且 tag filter 還有 KI-3 bug)
- 按 facet 分區渲染:facet 標題 + paragraph markdown + 該段的 triplets
- facet 預設展開(看一篇要看內容)/ triplets 預設折疊(leo Logseq outliner 習慣)
- **triplet A/B 拆字串 「A >> 關係 >> B」**,若 A 或 B 對得上既有 wiki entity → render 成 <Link>
跨 wiki 跳轉,是 Wikipedia-like 體驗的關鍵
- fallback:非 wiki-page block(schema/index/log 等)直接 render content
`/mira/wiki`:列表用 wiki-page 的 content (= entity 名稱) 當標題,不是 page_name slug。
mira.css 加 `.mira-wiki-detail` 不破版 + h2 底線,避免長 cypher 字串撐爆右邊界。
TS check pass。
|
2026-05-14 13:35:54 +08:00 |
|
Leo
|
d6d2cecfb5
|
fix(cypher): resumeFromPaused 漏 node-id namespace 導致下游模板找不到 paused 結果
mira 7B.3f PATCH 測試踩到:classify 跟 compose 都是 claude_api(兩次 paused/resumed),
upsert_index_entry config 寫 `{{compose_index_entry.data.text}}`,但 PATCH 跑出的
block content 是字面 `{{compose_index_entry.data.text}}` —— 模板沒被替換。
根因:resumeFromPaused 把 callback_result spread 到 top-level,但漏了
`[paused_node_id]: callback_result` 的 namespace 包裝。同步路徑的 propagateCtx
有做這件事,resume 路徑沒做,行為不一致。
修:mergedContext 加 [paused_node_id]: callback_result 一行,跟 propagateCtx 對齊。
arcrun.md 同步補三-B「新零件 checklist」+ 三-C「workers_dev=true 全 component
自動化」收尾紀錄。
|
2026-05-14 12:06:59 +08:00 |
|