2026 年 1 月 26 日,OpenHuman 的 main 分支有了第一筆 commit,訊息是「Initialize Tauri application with React and TypeScript setup」。GitHub 上這個 repo 的建立時間卻是 2 月 18 日,晚了 23 天。為什麼 commit 比 repo 還早,我沒有查證。

八個多月後,它變成一個會住在你電腦裡、能讀信、能跑 shell 的個人 agent。你要裝之前,第一個想問的大概是:它要動手跑指令之前,會不會先問我?

這題的答案在 9 月 23 日換過一次。而且原始碼裡有兩個都跟「審核」有關的開關,你得先講清楚問的是哪一個,答案才有意義。

一個核心,外面套四種殼

OpenHuman 的 GitHub 簡介寫得很滿:「the fastest, cheapest, most efficient open-source agent harness. Written in Rust」。這是它自己說的。README 對架構的描述是這樣寫的:

OpenHuman is a Rust core with a desktop app, a browser UI, a terminal client, and a Rust library wrapped around it. The same core runs all four.

核心在 crates/openhuman-core,按領域切成 agent、memory、channels、tools、security。外面那四種殼分別是 Tauri v2 的桌面 App、瀏覽器 SPA、ratatui 寫的終端介面,以及給開發者嵌進自己程式的 openhuman-embed。桌面版的核心其實是 App 裡的一個 tokio task,前端每次啟動拿一組新的 bearer token,用 JSON-RPC 打本機 loopback。

核心用 GPL-3.0 開源,LLM 代理、搜尋、OAuth 代管這些託管服務走 TinyHumans 的訂閱和點數。開發組織是 TinyHumans,README 列的 Creator 是 @senamakel。

春天:先把東西堆上去

早期的 commit 標題看得出順序。2 月 1 日,PR #11「Adopt supermemory patterns into AI memory system」;2 月 3 日,PR #26「Feat/javscript skills」(拼字照原樣)。記憶系統和用 JavaScript 寫的 skills,在第一個月就進來了。這兩筆我只讀到標題,沒讀內容。

3 月 31 日,Releases 列表裡最早的一個 v0.49.32 出來。列表裡看得到的第一個版號就是 0.49,不是 0.1。

4 月 17 日這筆,四個月後會被拆掉。PR #641 把 CEF 設成預設的 webview runtime,commit 訊息寫的是 default = ["cef"],原本的 wry 變成 opt-in,打包也改用 vendored 的 tauri-cef 分支 CLI。預設的 webview 從 wry 換成 CEF,連打包都得靠一份 vendored 進來的分支。

八月:拆掉自己裝上去的東西

8 月 7 日,同一天發了 v0.63.11、v0.63.12、v0.63.7 三個版本,版號跟發佈時間的順序對不起來,原因我沒查到。

隔天,8 月 8 日,一筆 commit 叫「refactor(tauri): replace CEF runtime with upstream Wry」。8 月 9 日以 PR #5456 合併,branch 名稱直接叫 remove-custom-cef。

從 4 月 17 日把 CEF 設成預設,到 8 月 8 日換回上游的 Wry,113 天。這是一條真的走到底又退回來的路:預設改成 CEF、打包靠一份 vendored 的 tauri-cef 分支,撐不過四個月。9 月 13 日還補了一筆 docs commit,把 CEF 相關文件標成 historical。

八月之後,release 停了 49 天。8 月 7 日那批之後,下一個是 9 月 25 日的 v0.64.0。這段時間 main 還是有 commit,8/8、9/13、9/19、9/23 都有,所以不是停擺,只是沒發版。

9 月 19 日,feat(runtime): add configurable backend transport to RuntimeBuilder。現在後端呼叫走一個 BackendTransport 介面,依 repo 裡的 CLAUDE.md,沒接這個實作的時候,agent、記憶、工具照樣跑,後端呼叫會回 BACKEND_UNAVAILABLE:。實際少掉哪些功能,我沒驗證。

拆 CEF、抽後端,都是在減法。四天後那一筆,減到了權限。

9 月 23 日上午

UTC 08:50,commit fb98e78c,標題「feat(config): add enabled flag to AutonomyConfig」。commit 訊息把理由寫得很完整,我照抄:

defaults to false, making the autonomy policy opt-in rather than opt-out. This change was made because the existing in-process policy is redundant with the container and sandbox isolation already provided, and a shell tool that rejects standard shell syntax is not usable. When enabled is false, all policy fields such as command classification, allowlists, and approval gates are inert, while the security policy’s is_always_forbidden still applies to protect credential stores and system roots.

這段話裡藏著兩個理由,分量不一樣。

第一個是「跟容器、沙盒的隔離重複了」。這是架構上的說法,成不成立,要看你的 OpenHuman 是不是真的跑在容器或沙盒裡。

第二個是「一個會拒絕標準 shell 語法的 shell 工具根本不能用」。這句比較誠實,也比較痛。它承認原本的政策讓 shell 工具連標準語法都不收,agent 等於拿到一個用不了的工具。安全政策跟可用性打架,可用性贏了,而且輸贏直接寫在 commit 訊息裡。

57 分鐘後,09:47,commit f98c6c63「fix(scripts): correct autonomy gate default and remove redundant env var」,把腳本裡的 autonomy 也明確寫成 enabled = false。

現在的 autonomy.rs 第 195 行就是 enabled: false,註解寫「So the policy is opt-in rather than opt-out.」,要恢復就設 [autonomy] enabled = true。關掉之後還留著的底線,commit 訊息說是 is_always_forbidden,保護憑證庫和系統根目錄。repo 裡的 CLAUDE.md 寫得細一點:~/.ssh、~/.gnupg、~/.aws 和系統根目錄碰不到,路徑裡的 .. 穿越和 null byte 會被擋。

讀到這裡,答案看起來是「預設不會問你」。

另一個也叫 gate 的東西

bootstrap.rs 裡另外裝了一個 ApprovalGate,註解寫的是「ON by default; opt out with OPENHUMAN_APPROVAL_GATE=0 (or false).」。同一段註解還寫了兩件事:triage 和 cron 這類不帶聊天上下文的回合直接放行(「autonomous automation is never blocked」);在桌面殼底下,這個環境變數會被忽略,並發出 ApprovalGateOverrideIgnored 事件。

這就像配電盤上有兩個開關,標籤都寫著「客廳」。你把其中一個扳下來,燈還亮著,你也不知道是因為另一個開關,還是因為這兩個根本接的不是同一盞燈。

autonomy 政策 ApprovalGate
位置 config/schema/autonomy.rs core/runtime/bootstrap.rs
預設 關(enabled: false,9/23 起) 開(「ON by default」)
怎麼改 [autonomy] enabled = true OPENHUMAN_APPROVAL_GATE=0 關掉;桌面殼下忽略這個變數
註解寫的例外 關閉時 is_always_forbidden 仍有效 triage/cron 回合直接放行

commit fb98e78c 說 autonomy 關掉時「approval gates are inert」,bootstrap.rs 又說 ApprovalGate 預設開。這兩句講的是不是同一個東西、出貨的桌面 App 實際會不會在跑指令前問你,我沒有查證。我讀的是 main 分支三個檔案用 grep 抓出來的片段,沒有逐行讀完,也沒有安裝或執行過 OpenHuman。官方 gitbook 那頁「Approval Gate」據說寫著「It’s on by default」,我沒讀原文,也不知道它的修改日期在 9/23 之前還是之後。

我的立場是:在你確認自己的安裝方式真的跑在容器或沙盒裡之前,把 autonomy 的預設關閉當成「沒有這層政策」來看。確定還在的只有 is_always_forbidden 那條底線;ApprovalGate 這時候還攔不攔,上面說了,我不知道,就算它還在,cron 回合也是直接放行。用 brew 裝桌面版的話,它有沒有跑在沙盒裡,我沒有查到。哪天官方文件寫明哪些安裝路徑有隔離、gitbook 也把 enabled 這個旗標講清楚,我會改口。

同一批原始碼裡還有一件事順便記下來:observability.rs 的 analytics_enabled、share_usage_data、capture_content 三個預設都是 true,註解寫「Users can disable via settings or CLI.」。出貨版有沒有另外覆寫、實際送出什麼,我同樣沒查。

走到 10 月

OpenHuman 的八個月

2026-01-26

main 分支第一筆 commit,Tauri+React+TypeScript。

2026-02-18

GitHub repo 建立。

2026-03-31

第一個 release v0.49.32。

2026-04-17

PR #641,CEF 成為預設 webview runtime。

2026-08-08

CEF 換回上游 Wry,8/9 以 PR #5456 合併。

2026-09-19

後端改走可設定的 backend transport。

2026-09-23

autonomy 政策改為 opt-in(fb98e78c、f98c6c63)。

2026-09-30

v0.64.10 發佈。

停了 49 天之後,發版又快起來。9 月 25 日 v0.64.0 和 v0.64.3,26 日 v0.64.4,29 日 v0.64.7「The Intelligence Upgrade」,release notes 寫「v0.64.4 to v0.64.7 brings 12 PRs across 12 commits」,內容有任務板、持久化執行狀態、更安全的委派、integrations 介面和會議 agent 串接。30 日又出了 v0.64.10。

以 2026-10-02 用 GitHub API 查到的數字,它有 40,449 顆星、3,997 個 fork,Releases 共 61 個,contributors 依分頁推算是一百七十多位。官方自己標的狀態是 Early Beta,README 原話是「Under active development. Expect rough edges.」。已知問題裡有 AppImage 在 Wayland 啟動崩潰(#2463)、Apple Silicon 的本機 TTS 套件裡放的是 x86_64 執行檔(#5760),這些我只看了標題。

今天 UTC 12:39,main 最新一筆是合併 PR #6924,把 tinymemory 升到 1.22.4。我查的時候,當天還有人在 push。

照 commit 訊息的說法,9 月 23 日之前 autonomy 政策是 opt-out,之後變成 opt-in。哪一個 release 是第一個帶著這個改動出貨的,我沒有對過。9 月 23 日之後發的第一個 release 是 25 日的 v0.64.0,它有沒有帶上 fb98e78c,要去翻那個 tag 才知道。

兩個「審核」開關之後會不會被併成一個,現在說不準。10 月 2 日讀到的 main 分支上,bootstrap.rs 那段註解還寫著「ON by default」。

參考來源