Skip to content
所有標籤

#rivumi

44 篇文章

跟成熟 coding agent 學設計(4):Approval 分級與 audit trail

Rivumi 的 effect 已有 read/modify/modify_execute/execute 四級,未分類工具 fail closed;native MCP tool 預設 execute,只有可信 read-only annotation 才降級。審批仍先進 events.jsonl,grant 可精確到同一組變更或 backend;一般化 command 規則與全 runtime sandbox coupling 仍未完成。

跟成熟 coding agent 學設計(37):Code mode——把工具呼叫編譯成程式碼批次執行

rivumi 已先做 bounded tool-program DSL:唯讀程式支援 list/read/search/diff、repeat 與 if_contains;modify/check transaction 會經整體 approval,失敗時回滾 touched paths。它還不是任意 JavaScript/Python code mode,也沒有平行 transaction execution。

跟成熟 coding agent 學設計(26):Context 壓縮與 compaction——從缺口到可審計 baseline

五家成熟 agent 的 compaction 都要處理觸發、完整 turn 切點與失敗恢復。rivumi 已補上 85% high-watermark、自動 compaction、原生 loop 的 deterministic fallback summary、checkpoint 落盤與 workspace context 重新注入;目前仍缺跨 runtime 等價 fallback、模型品質摘要,以及真實 provider 的長 session 驗證。

跟成熟 coding agent 學設計(27):跨 session 記憶——從 explicit remember 到 semantic recall

omp 與 claude-code 都有跨 session 記憶,其他參考專案主要靠 instruction files。rivumi 已落地明確的 remember/list/inject baseline:型別化 JSONL 記憶可跨 session 注入 prompt,但目前只按 scope 與近期排序,還沒有語意檢索、去重、遺忘指令或自動萃取。

跟成熟 coding agent 學設計(28):危險指令攔截與 shell escalation——在白名單和每次都問之間

五家對自由 shell 的風險處理都包含放行/詢問/拒絕、複合指令檢查與 fail-closed。rivumi 已補上 deny-first command classifier、critical floor、複合 shell 分段、timeout-deny、設定式 allow/deny rule 與可見的 policy reason;仍需擴大語法涵蓋與真實互動流程驗證。

跟成熟 coding agent 學設計:系列總覽——拆五個專案的原始碼,蓋自己的 agent

我在寫自己的 Python coding agent「rivumi」,這個系列把 pi、oh-my-pi、opencode、codex、claude-code 五個成熟專案的原始碼逐題對照,也對照 Rivumi 現在已經落地的 TUI、外部 CLI runtime、local gateway、usage/OTel/session 工具與 Cloudflare 切片。每篇固定走「設計問題→五家做法→rivumi 選擇→學術依據→改善路線」五段,證據一律給到 file#symbol 層級。

Hooks/Skills/Plugins:成熟 coding agent 的三層擴展機制

Hooks 管控制流、skills 注入知識、plugins 負責打包。rivumi 已有 opt-in deny-only project hooks、bounded SKILL.md loader、exact enabled_skills 選擇、plugin manifest/install/list 與 external runtime projection;仍缺 hook input rewrite、完整 lifecycle、遠端 registry 與成熟 marketplace。

跟成熟 coding agent 學設計(36):LSP 整合——把編譯器診斷推進 agent context

rivumi 已能把 repo 內 diagnostics 與 open-file 狀態注入下一個 model turn,也有 typed WebSocket IDE context push、可封裝的 VS Code bridge,以及管理長駐 LSP subprocess 的 ManagedLspServer。剩下的是各語言 initialize/didOpen/didChange adapter 的打磨與 live editor 驗證。

跟成熟 coding agent 學設計(30):MCP 整合——工具生態的標準插座

MCP client 要同時處理 transport、工具刷新、approval 與 credential 邊界。rivumi 已支援 allowlisted stdio、Streamable HTTP/SSE、tools/resources/prompts、tools/list_changed、OAuth metadata/PKCE 與 0600 credential store;尚缺真實 authorization server E2E 與 MCP 專用確認 UX。

跟成熟 coding agent 學設計(35):Model catalog 與 per-role 多 provider 路由——rivumi 的 role alias 與 reviewer lane

rivumi 已有 ModelRole/ModelRoute 靜態候選表、--model @cheap 等 opt-in alias、跨 provider fallback,以及驗證完成後才啟動的 no-tool reviewer lane;下一步是補 role inheritance/override 規則,並決定 summarizer、parser、scout 是否自動路由。

跟成熟 coding agent 學設計(33):Session 錄製與 replay——從事件檔走到可重播、可分叉

rivumi 已把 events.jsonl 接成 deterministic reducer、CLI timeline、canonical JSON、SDK replay 與安全分叉;分叉不會重跑舊工具或模型呼叫。剩下的是 provider/live runtime 驗證、redaction 與更完整的 replay hook。

跟成熟 coding agent 學設計(32):Subagent 與 worktree 隔離——讓主 loop 學會分工

成熟 subagent 需要角色、fan-out 上限、權限收窄與成果回傳契約。rivumi 已有 native named-role schedule、平行 fan-out、子 task allowed_paths 不得超出 parent、預設禁用 unsafe exec,以及 parent-approved transaction proposal baseline;常駐 background lifecycle、遞迴深度管理與自動 worktree merge 仍未完成。

跟成熟 coding agent 學設計(34):Telemetry 與成本追蹤——token 記了,然後呢

rivumi 已加入 CostBreakdown、明確標示 estimated 的 GPT-5 家族靜態價目表、per-lane usage/cost 與 OTel cost 欄位;未知模型仍只顯示 token,不硬算美元。價目覆蓋、外部 CLI 權威帳單與 live billing 對帳仍待補。

跟成熟 coding agent 學設計(18):工具集設計哲學——tool surface 的邊界劃分

Rivumi 的核心 surface 已從七個長到九個:新增 read-only `tool_program` 與可 rollback 的 `tool_transaction`,搜尋優先走 ripgrep,仍不開任意 shell;native MCP 只從 allowlist 動態加入,缺少可信 read-only metadata 就按 execute 審批。

跟成熟 coding agent 學設計(38):Agent as a Service——把 loop 包成別的程式可以呼叫的服務

rivumi 已有 Cloudflare Durable Object run resource:非同步建立、狀態/取消/artifact、live NDJSON 與支援 Last-Event-ID 的 SSE;遠端 approval 走獨立短效 capability。Python 另有 attach client 與 stateful conversation WebSocket。production deploy、跨 runtime parity 與完整多租戶 hardening 尚未驗證。

Rivumi 的 Cloudflare 遠端執行:Worker、Sandbox、Capability DO 與 durable RunSession

Rivumi 的舊同步 M6 路徑曾完成一次真實 deployed coding run;目前已擴成帶 RunSession、SSE、approval、cancel 與 artifact 的 async control plane,但新增路徑尚未 live revalidate。Sandbox 只拿分 audience 的短效 HMAC capability,provider credential 留在 Worker;現有證據不等於 production traffic 或 SLO。

Rivumi 的 disposable workspace 與 run bundle:原始 repo 為什麼不會被直接修改

Rivumi 先把指定的完整 Git commit 複製到 run directory 裡的 detached-HEAD workspace,再讓 runtime 修改與驗證。原始 repo、執行 workspace 與 run artifacts 因此有清楚邊界;這能提供 source isolation 與 audit bundle,但不等於 OS sandbox。

Rivumi 的 ExternalCodingRunner:為什麼 Codex/Claude Code CLI 是外部 runtime,不是 ModelProvider

`ExternalCodingRunner` 是 Rivumi 的第二條 runtime lane:外部 coding CLI 擁有自己的 model loop 與 credential,Rivumi 只交付任務與 disposable clone,再把回傳 patch 當成不受信任輸入,重跑 path audit、verification 與 source invariant。它是有明確 capability boundary 的 handoff,不是另一種 `ModelProvider`。

Rivumi 的 ModelProvider 多閘道:多個 protocol 共用一個 canonical contract

Rivumi 把 OpenAI-compatible、Responses、Anthropic、Gemini、Workers AI、scripted 與 experimental Codex OAuth adapter 收斂成同一個 `ModelProvider` contract。Codex OAuth transport 讀 SSE,但仍在 adapter 內累積成一次性的 canonical `ModelTurn`;AgentRunner 不直接消費 token delta。

Rivumi 的 provider-neutral native loop:一次 model turn 如何走到驗證終態

Rivumi 的 native lane 由 AgentRunner 掌握狀態轉移:準備 workspace、送出 model request、執行 tool calls、寫回 observations,模型沒有再呼叫工具時才進入 verification。step、wall time、重複動作、token 與取消條件都能先於模型宣告終止 run;provider adapter 的協定翻譯留給下一篇。

Rivumi 的 state-first event journaling:為什麼 manifest commit 跟 JSONL append 之間的 crash 要靠 state 修

Rivumi 同時維護 append-only 的 `events.jsonl` 與原子替換的 `session.json`,用 sequence reconciliation 判斷 crash 後能否安全續跑。這份 event contract 現在也支援 deterministic replay、JSON replay、從指定 sequence 建立 fork seed,以及在不重放副作用的前提下建立新 workspace;遇到停在 `tool.started` 或 `verification.started` 的不確定狀態仍然 hard fail。

Rivumi 的工具隔離:path allowlist、argv 嚴格化、process group 與 credential-free subprocess

這篇只拆 Rivumi 的 tool executor 如何把一次呼叫安全落地:`SafePathPolicy` 限制 path 並阻擋 symlink escape,`VerificationCommand` 固定 argv 且使用 `shell=False`,subprocess 只拿清理過的 env,寫入走 read-version hash 與 atomic replace,timeout 會終止整個 process group。權限決策、OS sandbox 與 tool program 各留給後續專篇。

Rivumi 的 TUI 與 CLI:一次 run 在終端機上怎麼被看見

Rivumi 的 TUI 與 plain CLI 是同一套 runtime 的兩種使用者介面。CLI 先依 TTY 與旗標選擇呈現方式,runner 再送出事件;TUI 把事件投影成 thinking、tool、approval、verification 與終態。使用者能從畫面分辨 native 與 external runtime,但 UI 不替底層能力背書。

Rivumi 架構地圖:一次 coding-agent 任務如何穿過 workspace、runtime、tools 與 events

Rivumi 把 coding-agent 任務拆成可追蹤的邊界:native runtime 的副作用經過 Rivumi tools、permission 與 sandbox;external runtime 保留自己的 loop 與工具,再把 patch 交回 Rivumi 稽核。這篇是規劃中 20 篇系列的入口地圖。

Rivumi 的 context pressure、compaction 與 workspace reinjection

Rivumi 在 85% context pressure 附近啟動兩種不同流程:native loop 可做一次 bounded deterministic summary fallback;支援原生 compaction 的 conversation runtime 則在完成 turn 後壓縮並回報 lifecycle。兩條路徑都會在下一次請求重新注入 workspace snapshot。

Rivumi 的 IDE/LSP Context:Diagnostics、Open Files 與 VS Code Bridge

Rivumi 將最多 200 筆 diagnostics 與 32 個 visible files 正規化成有界、repository-local、且不受信任的 context;VS Code 與 managed LSP 目前只提供訊號,沒有 completion、rename、code action 或完整 IDE RPC。

Rivumi 的 local OS sandbox:macOS、bubblewrap 與 Landlock 如何 fail closed

Rivumi 可把指定的 local command/verification 包進 macOS sandbox-exec、Linux bubblewrap 或 Landlock/seccomp。需要的 backend 不存在時以 exit 126 停止,不直接裸跑;但這個範圍不涵蓋 external CLI、MCP/LSP 或整個 Rivumi process。

Rivumi 的 model roles、fallback、cache hints 與 estimated cost

Rivumi 用靜態 model role catalog 提供候選順序,只對 retryable provider error 重試與 fallback;cache 是 provider hint 加 trace,cost 是靜態價表估算。三者都留下訊號,但都不是即時營運路由或帳單。

Rivumi 的 Native MCP:transport、authorization 與 approval 邊界

Rivumi 只有在明確 allowlist 後才載入專案 MCP server,將 stdio 或 Streamable HTTP 能力投影到既有 ToolExecutor,再沿用 hook、approval、timeout 與 cleanup 邊界。

Rivumi 的 permission layering:危險命令如何落到 allow、ask 或 deny

Rivumi 先套不可繞過的 critical floor,再評估 user/org/project deny,最後才看 allow。dangerous mode 只自動放行 read/modify,execute 仍經過命令分類與 approval;這是 authority policy,不是 OS sandbox。

Rivumi 的 prompt、instruction precedence 與 explicit memory:模型最後看見了什麼

Rivumi 先在應用程式層解析 user 與 root-to-leaf 專案 instructions,再把 runtime、skills、workspace 與最近 20 筆 explicit memory 放進具名 prompt sections。這套流程可追蹤、可 reload,但不是 semantic memory,也不會把 repo 文字升格成 system authority。

Embedding Rivumi:SDK、ConversationController 與 WebSocket Boundary

Rivumi 用 0.x typed SDK facade 暴露 bounded run 與 conversation contracts;WebSocket attach 只包住一個預先建立、由 controller 擁有的 runtime session,沒有 conversation-ID resume 或多 client routing。

Rivumi 的 Skills、Blocking Hooks 與 Plugin Packages

Rivumi 把 skills 當成有界的 repository-local guidance、把 hooks 當成 opt-in 且只能否決的 host commands,再用 local plugin manifest 封裝 skill 與 hook;三者的權限完全不同。

Rivumi 的 Subagent Scheduling 與 Parent-owned Transactions

Rivumi 把每次 subagent dispatch 正規化成最多四個節點的 dependency waves,讓同 wave 的唯讀 child 在隔離 workspace 平行分析,再由 parent 重新走 hook、approval 與 transaction 執行修改。

Rivumi 的 tool programs、transactions 與 safe concurrency

Rivumi 只平行執行同時標成 read-only、concurrency-safe 與 READ effect 的 tool call;tool_program 提供有界的 read-only repeat/branch,tool_transaction 則對可能碰到的 workspace files 做 snapshot 與失敗 rollback。它不是外部副作用的通用交易系統。

跟成熟 coding agent 學設計(2):Agent loop 的形狀——事件流、checkpoint、resume

pi 的 loop 是雙層 while 加 EventStream;claude-code 明講 stop_reason 不可靠、改以串流中收到的 tool_use block 當唯一續跑訊號;codex 把 turn 做成可取消的 SessionTask 再靠 rollout crate 錄 JSONL;rivumi 選了「manifest 先落盤、JSONL 跟上」的寫入順序,讓 Ctrl-C 之後能做驗證式續跑而非重跑。這篇全部附 file#symbol 級證據。

跟成熟 coding agent 學設計(13):CLI 人體工學——讓新工具長得像使用者已經會用的工具

成熟的 coding agent CLI 都收斂到同一套慣例:positional prompt、-p 是 print、exec 是 headless、resume 是一級指令、-C 換目錄;rivumi 直接繼承這套詞彙,把學習成本壓到接近零。

跟成熟 coding agent 學設計(9):外部 CLI 當 backend——包別人的 loop,安全邊界畫在哪

每家成熟 coding agent 都有 headless 機器介面:codex 有 `exec --json` 和更完整的 app-server JSON-RPC,claude-code 有 `-p` 加 stream-json,pi/opencode/omp 各有一種 JSON 事件流。直接把這些 CLI 當 backend 是最快的路,但代價是:它們自帶 agent loop、自己的權限模型、自己的登入。rivumi 的答案是讓外來 CLI 完整擁有它的 loop,自己只守住三件事——隔離副本、patch audit、最終驗證——並且一條 runtime 永遠不偽裝成另一條。

跟成熟 coding agent 學設計(21):Headless 模式與 CI 使用——沒有人可以按 approve 的時候

agent 進 CI 後最大的問題是審批:沒有終端機、沒有人可以按 approve。五家的解法收斂成兩條路——把權限決策外包給呼叫端(claude-code 的 control protocol),或直接換掉審批語意(codex 預設 Never 配沙箱、opencode 預設自動拒絕)。rivumi 用同一個 AgentRunner loop 注入不同的 ApprovalPolicy:headless 下用 HeadlessApprovalPolicy,不讀 stdin 所以不可能卡住 pipeline,EXECUTE 預設 fail closed。

跟成熟 coding agent 學設計(20):Run artifacts 契約——跑完之後憑什麼審計?

agent 跑完之後,「模型說它做完了」不是證據。codex 把 trace 拆成 manifest + JSONL + payloads 的 bundle、omp 用 SQLite 鏡像磁碟上的固定檔案、pi 用 runs.jsonl 索引原生 session 檔。rivumi 選了最硬的一條:每個 run 固定六個檔案,缺一個就不算完成,patch 審計看 changes.patch 不看口頭宣稱。

跟成熟 coding agent 學設計(19):Session 持久化與 crash recovery——agent 死掉之後,狀態怎麼救

五家 agent 的 session 儲存幾乎都是 append-only JSONL 加上某種單寫者保護,但 crash recovery 的差別在細節:pi 會修 torn tail、codex 寫失敗會重開檔重試、rivumi 選了「manifest 先落盤」讓唯一的 crash window 變成可修復的一格。這篇拆解每家的寫入順序與 fail-closed 條件,全部附 file#symbol 證據。

跟成熟 coding agent 學設計(17):啟動效能與工程紀律——慢的從來不是語言

CLI 工具每次叫用都要付一次啟動成本,而沒有 baseline 的效能優化等於沒有回歸保護。codex 用 daemon 重用與 skill snapshot 快取、claude-code 把入口切成七十個動態 import 加上內建啟動 profiler、opencode/omp 各有 lazy 載入紀律;pi 則什麼都沒做,靠 Bun 的速度快撐著。rivumi 是 Python,天生慢,所以把紀律做滿:lazy import、單飛磁碟快取、背景預熱 controller、hyperfine paired benchmark 加上 CI 大於 10% 退步就擋 merge。

跟成熟 coding agent 學設計(24):測試一個會動的 agent——fake-CLI 合約、錄製串流、TUI pilot

agent 的兩個依賴——LLM 和外部 CLI——都不是決定性的,但成熟專案的招式是把「會動的部分」與「邊界的形狀」切開:codex 用 wiremock 假 Responses API 加腳本化 SSE server,TUI 用 insta 快照;opencode 乾脆做了 VCR 式的 http-recorder 錄放套件;pi 把 eval 與 unit test 分成兩份 vitest config;omp 把 edit benchmark 本身用 unit test 圍起來。rivumi 對外部 CLI 做了四層:單元測試、fake-CLI 合約、錄製串流整合、Textual pilot TUI 測試。核心方法論一句話:錄下真實的非決定性輸出,對它做決定性的斷言。

跟成熟 coding agent 學設計(15):從全螢幕 TUI 到 semantic transcript

成熟的 coding agent TUI 都不是把事件流印出來,而是先做一層 typed projection 再渲染;rivumi 走了全螢幕組合、runtime-first 雙模式、移除 Ask/Agent 分離三步,才把 non-streaming 和 resume 不能 replay 兩個舊限制真正解除。