運作原理

九件事,按發生的順序

每一章講一個概念,用一般人的話:它是什麼、不是什麼、KernelHub 拿它做什麼。這一頁上的每一段動畫和每一張表,都是 v1.0.2 今天就有的。

關係圖:你指揮一位 AI 員工;它的 Agent 與技能經過 KernelHub 治理層(工作區、權限、環境、記憶、Runtime Router)到達 Runtime,再到你 Mac 或 Windows 上的執行體,執行體交回 diff、產物和結果。另一條通道裡,iPhone 和 Android 向 KernelHub 送任務、做核准、讀結果 —— 手機從來不是執行體。 AI 員工 Agent / 技能 KernelHub 治理層 工作區 權限 環境 記憶 Runtime Router Runtime 執行體 你的 Mac / Windows Diff · 產物 · Result iPhone / Android 任務 · 核准 · 結果 手機不是執行體。它送任務、做核准、讀結果。 圖上每一個框在 v1.0.2 裡都存在,沒有一個是佔位。 KERNELHUB v1.0.2 · CONCEPT MAP
01

AI 員工

你雇的那一位。一個有名字的角色 —— 例如 AI 開發者 —— 有定義、它宣告的技能、這些技能需要的環境、被指派的工作區、它在其下工作的權限,以及隨著做事累積起來的任務、記憶和結果。

它不是

它不是一段聊天,也不是模型。雇一位員工不會擴大你機器上能做的事 —— 那仍然由權限決定。

KernelHub

KernelHub 把員工放在帳戶這一層:它的角色和技能在被指派的每個工作區裡都一樣,管理台會如實回報它的環境是不是真的就緒。

EMPLOYEE FLOW
動畫:雇一位 AI 開發者,指派到一個工作區,它讀取、修改、建置;跑建置之前在手機上跳出核准卡;產出一個產物;帶著證據回報結果。 KERNELHUB v1.0.2 · EMPLOYEE FLOW 01 HIRE 雇用 AI 開發者 02 ASSIGN 指派 到一個工作區 03 WORK 做事 讀 · 改 · 建置 04 APPROVAL 核准 在你手機上 05 ARTIFACT 產物 app-debug.apk 06 RESULT 結果 完成,附證據 AI 開發者 kotlin · gradle · git ~/projects/app read PermToggle.kt edit DateUtils.kt +8 −3 exec ./gradlew → ? 9:41 PERMISSION · EXEC 要跑 Gradle 建置嗎? 只允許這一次 app-debug.apk 12.4 MB · sha256 ✓ +8 −3 · BUILD OK 建置在跑之前停下來,在你手裡的裝置上問一句。產物和結果之所以存在,是因為執行體真的把事做了。

橫向滑動看完整條鏈 →

02

Agent

員工做事時用的智慧:理解任務、規劃、推理、呼叫工具、決定下一步做什麼。

它不是

決定了,不等於被允許。Agent 可以提議寫一個檔案,但它寫不了。

KernelHub

KernelHub 不造自己的 Agent,也從不親自呼叫模型。它治理你已經在用的那些 Agent:它們想做的每一個動作都要經過工作區、權限契約和執行體。

AGENT GOVERNANCE
動畫:AI 員工的 Agent 決定寫一個檔案;請求經過 KernelHub 治理層到 Runtime,再到執行體;在 WRITE 與 EXEC 的邊界上權限閘擋住它,手機上出現核准卡,你放行之後,執行體才把變更落到本機。 INTELLIGENCE ≠ AUTHORITY AI 員工 Agent KernelHub 治理層 工作區 權限 環境 記憶 Runtime Router Runtime PERMISSION GATE 執行體 你的機器 src/Auth.kt read ✓ 已寫到你的機器上 +3 −1 READ src/Auth.kt WRITE src/Auth.kt 9:41 PERMISSION · WRITE 允許這條任務 WRITE 嗎? 允許 READ 自己就過。你還沒批的 WRITE 或 EXEC 在閘前停下,去你手機上問。Runtime 從不碰磁碟;碰磁碟的是執行體,而且只在閘開了之後。

橫向滑動看完整條鏈 →

03

Runtime

承載 Agent 智慧的模型(Runtime)—— Claude Code、Codex、Qwen Code、Antigravity(agy)、MiMo 等,由你自己安裝、自己登入。

它不是

Runtime 不是員工。換掉它不會改變你雇了誰、他們被允許做什麼、在哪個工作區做事。

KernelHub

Runtime Router 會挑一個在這臺機器上真接得了這條任務的 Runtime。不管跑的是哪一家,它的寫、改、執行都經過同一個內建 Tool Server,對照你的授權核過 —— 不是一句請模型自律的提示詞。

Runtime執行聯網推送刪除狀態
claudeKernelHubRuntime 原生Runtime 原生KernelHubKernelHubKernelHub正式支援
codexKernelHubRuntime 原生Runtime 原生KernelHubKernelHubKernelHub正式支援
mimoKernelHubKernelHubKernelHubKernelHubKernelHubKernelHub正式支援
opencodeKernelHubKernelHubKernelHubKernelHubKernelHubKernelHub正式支援
qwenKernelHubKernelHubRuntime 原生KernelHubKernelHubKernelHub正式支援
acpKernelHubKernelHubKernelHubKernelHubKernelHub未就緒
agyKernelHubKernelHubKernelHubKernelHubKernelHubKernelHub未就緒
codebuddyKernelHubKernelHubRuntime 原生KernelHubKernelHubKernelHub未就緒
geminiKernelHubRuntime 原生Runtime 原生KernelHubKernelHubKernelHub未就緒
kimiKernelHubKernelHubKernelHubKernelHubKernelHubKernelHub未就緒
mcpKernelHubKernelHubKernelHubKernelHubKernelHub未就緒
ohmypiKernelHubKernelHubKernelHubKernelHubKernelHub未就緒
piKernelHubKernelHubKernelHubKernelHubKernelHubKernelHub未就緒
Runtime 原生

這家 Runtime 自己有可驗證的開關,KernelHub 把授權落到它的引數上。驗證方式是真把命令列拼出來看,不是讀它的文件。

KernelHub

這家 Runtime 自己沒有這一檔的開關,這一格由 KernelHub 在它程序外面加的那道 OS 外層邊界守著 —— macOS 上是 seatbelt、Linux 上是 Landlock,這兩個平台預設開啟;Windows 上這一版預設關閉,那樣的機器上這一格印成「—」。它是可選的加固層,不是做事的前提;不管這一格是什麼,寫、改、執行照樣先經 Tool Server 按你的授權和工作區邊界核過。

這臺機器上證不出有誰守住這一檔。這一家會標 NOT_READY —— 那是記帳,不是攔路:它照樣接活,每一次寫、改、執行照樣要過你的授權、工作區邊界和執行規則。

04

執行體

你自己機器上的受控執行層:icloser 這個行程。它落實被授權的動作 —— 讀、寫、執行、建置、測試、git、產物、裝置 —— 並回報發生了什麼。

它不是

它不是 Agent。它自己沒有智慧,也沒有自己的權力;它受權限契約和工作區契約約束。

KernelHub

執行體有一道自己的閘:一條指令到了它這裡、卻沒有所需的授權,就在跑之前被拒掉,不管是哪家模型要跑它 —— 而且它做的每一步都記帳。

AI 員工

你雇的那一位

不是一個聊天視窗,也不是 Runtime。
Agent

它做事時用的智慧

會想,不等於有權碰你的機器。
Runtime

承載智慧的模型

不是員工,也不是動手執行的那個。
執行體

你機器上受管的那雙手

它不是 Agent。它自己沒有智慧,服從權限契約和工作區契約。
05

工作區

你機器上的一個目錄,任務綁定在它上面。任務、權限、記憶和結果都按工作區記錄。

它不是

工作區不擁有員工;它是員工被指派去做事的地方。工作區之間互不伸手。

KernelHub

任務只在它被送到的那個工作區裡跑,別處不跑。目錄搬家身分不變;任務、記憶和檔案一起跟過去。

工作區隔離

工作區之間不互通

任務在被下達的那個工作區裡跑。權限按裝置、按工作區記錄,沒有全域性開關。

原始碼留在本地

你的倉庫不會被上傳

執行發生在你的機器上。過網路的是任務原話、進度、你要看的 diff,以及核准。

06

權限

六檔 —— 讀、寫、執行、網路、推送、刪除/遷移 —— 按裝置、按工作區分別授予。六檔之下還有兩類任何授權都打不開:碰你的憑據,和寫到工作區外面。

它不是

權限不是給模型的建議。它由 Tool Server 和執行體的閘在動作發生之前核過。

KernelHub

需要一檔它沒有的權限時,任務在動手之前停下來問你。給一條任務的授權,在那條任務結束的那一刻過期。

動畫:五檔權限依次點亮,第六檔「刪除 / 遷移」保持熄滅,下方是一條「憑據永遠拒絕」的橫條。 執行 聯網 推送 刪除 CREDENTIALS · ALWAYS DENIED 憑據路徑不因為你給了哪一檔而解封。 刪除 / 遷移預設永遠不給——你不為某一條任務單獨授權,它就一直是暗的。
憑據

任何授權都打不開的憑據路徑

憑據路徑 —— SSH 私鑰、雲配置、.env、鑰匙串 —— 以及高風險動作,與你批了什麼無關地被拒絕。你批一檔權限,這份清單一條都不會少。

任務級授權

「就這一次」真的只有一次

為某條任務批的權限只對那條任務、那個工作區生效,任務一進終態立刻失效 —— 靠讀時判定,不靠定時清掃。

管不住的邊界

守不住的時候,它會告訴你

當一條任務會碰到刪除 / 遷移這條邊界,而接手的 Runtime 表達不了拒絕清單時,KernelHub 會在動手之前停住,請你明確放行這一趟。點頭不批出任何一檔權限

權限契約

六檔權限,動手之前先核

讀檔案、寫入檔案、執行、聯網、推送、刪除 / 遷移資料分開授權,按裝置、按工作區。不管哪一家 Runtime 在做事,它的寫、改、執行都要經過 KernelHub 內建的 Tool Server,先對照這些授權和工作區邊界核過再跑 —— 不是一句「請你守規矩」的提示詞。

07

本機執行

工作在已經放著你程式碼的那台機器上做。什麼都不上傳;過網路的是任務原話、進度、你選擇看的 diff,以及你的核准。

它不是

它不是遠端終端機。沒有人往你機器裡敲字;執行體只落實被允許的動作。

KernelHub

下面就是 v1.0.2 裡一條任務真實走過的路 —— 每一個節點在正式產品裡都有。

01你的裝置iPhone · Android · Desktop
02任務一句話,用你自己的說法
03KernelHub 服務端排隊、保管權限
04Runtime 路由挑一家裝著、接得了活
05執行體你機器上的 icloser 程序
06你的 Mac 或 Windows你的程式碼本來就在那兒
讀取中 修改中 測試中
07即時工作區證據流,發生一件記一件
08改動真實 hunk,歸到這條任務名下
09核准卡片出現在你手裡那塊屏上
10結果做完、要改、或停下 —— 絕不假報「已完成」
已關閉動效 —— 所有步驟同時顯示。
即時演示
動畫:手機上打出的一句任務由 KernelHub 服務端排隊,你自己機器上的 執行體 接手,讀取、修改並測試程式碼;改動回到手機成為一張核准卡,你就這一次放行,任務隨即完成。 WORKSPACE 1/1 · POLL 3s · NO UPLOAD KERNELHUB v1.0.2 · LOCAL EXECUTION T+00:02 T+00:05 T+00:09 T+00:13 9:41 即時工作區 修改中 DateUtils.kt +8 −3 read PermToggle.kt edit DateUtils.kt exec ./gradlew test BUILD OK 發一條任務… 把標籤提成常量 權限 · 執行 執行 Gradle 構建? + LABEL_TODAY = "Today" + LABEL_YESTERDAY = … − "Today" 就這一次放行 任務完成 · +8 −3 你的裝置 QUEUE · PERMISSIONS KernelHub 服務端 排隊、保管權限 ~/android-app · DateUtils.kt 050607 080910 1112 +8 −3 讀取中 修改中 測試中 $ ./gradlew :app:assembleDebug BUILD SUCCESSFUL in 41s 你自己的機器

橫向滑動看完整條鏈 →

每一幀對應的都是 v1.0.2 真會做的一步。檔名、增刪行數和那行構建輸出,取自一條真跑過的任務。

本機執行

Agent 在你的程式碼本來所在的地方跑

一個 執行體(icloser)守著你自己機器上的工作區,驅動你本來就裝著的 CLI Runtime —— Claude Code、Codex、Antigravity(agy)等。沒有雲端沙箱,不上傳倉庫,不做原始碼映像。

為非互動而設計

不留一個沒人能答的提示

Runtime 通常會停下來問一個沒人在的終端。KernelHub 把那次決定搬到你手裡真的拿著的那塊螢幕上。

08

手機核准

任務碰到它沒有的 WRITE、EXEC 或其他邊界時,你手裡的裝置上會出現一張卡:帶著到目前為止的 diff,以及它要求的一字不差的原話。

它不是

手機不是執行體,也不是 Runtime。它送任務、做核准、讀結果。

KernelHub

核准一次,同一條任務接著跑 —— 不重跑,你在決定的時候什麼也沒被做。

手機上核准

要你拿主意的事會來找你

任務缺一檔權限時,它會在開工前停下來掛一張卡,帶著到目前為止的 diff,以及它到底在申請什麼的逐字說明。點一次頭,同一條任務接著跑。

iPhone / Android

任務 · 核准 · 結果

手機不是執行體。它送任務、做核准、讀結果。

「PermToggle.kt 裡那三句文案是寫死的,提成常量。然後構建一次確認沒壞。」

  1. 從手機發出在輸入框裡打出來,進這個工作區的佇列
  2. 執行體 接單放著 Android 倉的那臺機器認領了它
  3. 讀 PermToggle.kt證據流裡能看到它開啟的每一個檔案
  4. 改它它還在幹活時,即時 diff 就出來了
  5. 跑構建Gradle 在本機跑,輸出即時回傳
  6. 手機上的核准卡帶著 diff —— +8 −3,連 hunk 一起
  7. 結果你點頭,同一條任務接著跑完

「給 README.md 加一段安裝說明,語氣跟全文保持一致。」

  1. 讀取動手寫之前它先把檔案讀一遍
  2. 修改改動落在你機器的磁碟上
  3. 即時 Diff你看著那幾段一行行出現
  4. 結果不需要核准 —— 寫入這一檔本來就批過了
09

證據:Diff · 產物 · 結果

「完成」是一句話,證據才讓它成立。每條任務結束時都有歸屬於它的 diff、它產出的產物,以及一個「完成 / 待修 / 已停」的結果 —— 從不謊報「完成」。

它不是

結果不是聊天摘要。中途有指令被拒過,結果會寫出來。

KernelHub

Live Diff 在任務還在跑的時候就從執行體流上來;檔案清單歸屬到這條任務,同一工作區裡其他的變更不會混進去。

動畫:DateUtils.kt 裡一段真實的改動逐行寫出來——刪兩行、加六行——右上角 +8 −3 的計數條同時長滿。 LIVE DIFF · 1 FILE DateUtils.kt +8 −3 050607 080910 1112 @@ -5,4 +5,9 @@ import java.time.ZoneId import java.time.format.DateTimeFormatter - fun label(d: LocalDate) = "Today" - // FIXME hard-coded + private const val LABEL_TODAY = "Today" + private const val LABEL_YESTERDAY = "Yesterday" + fun label(d: LocalDate) = when { + d == today -> LABEL_TODAY 任務還在跑的時候,由 執行體 即時送上來的。 歸屬於這條任務

手機上發的一條任務、在筆記本上執行時的真實輸出。

歸到這條任務名下

任務開始前就已經改過的檔案、以及執行期間被別的程序改的檔案,單獨計數,不進這條任務的 diff。

證據,不是敘述

讀 / 跑命令 / 改檔案,發生一件記一件。來自檔案系統監視的那幾行會壓暗並用被動語態 —— 它只說檔案變了,說不出是誰改的。

事後可回放

每條任務都留著自己的時間線與改動。跑完之後開啟它,按順序讀它做了什麼。

一口氣說完
我雇的是 AI 員工;Agent 提供智慧;Runtime 提供模型;執行體在我電腦上執行被允許的動作;KernelHub 組織、治理並留下證據。

拿你自己的儲存庫試一試

先裝好 Node.js LTS(自帶 npm),再在放著你程式碼的那台機器上敲一條指令。演示在瀏覽器裡跑,不需要帳號。