lazyBoy/docs/plan/LAZYBOY_AGENT_COMPUTER_IMPL...

1228 lines
102 KiB
Markdown
Raw Normal View History

2026-09-10 14:42:17 +00:00
# LazyBoy共用私人 Computer、混合工具與可安裝連接器實作計劃
- 文件版本3.02026-09-10保留共用私人主機新增逐項優化、TigerVNC 與外部工具安裝)
- 對象:接手 LazyBoy 的 coding agent 與 reviewer。
- 審查基準:`igs170911/LazyBoy``e6afa324530e19922909d4692c28fb005cc05a7a`;沿用前次已核對的基準;本次另讀此 commit 的 display 啟動與 MCP 程式,未聲稱本機或最新遠端 HEAD 已改好。
- 文件性質:實作規格與驗收計劃;不是已套用的 patch、不是已通過的測試報告也沒有實測提速倍數。
- 建議在 repository 內保存於 `docs/agent-computer-implementation-plan.md`
> 最終目標:**共用主機Team Computer與私人主機Dedicated Computer都是正式、長期支援的產品模式。** 每個 agent 綁定自己獲准使用的持久 Computer 與工具;可以多個 agent 共用一台 Computer也可以一個 agent 使用私人 Computer。實際任務與檔案操作在綁定的 Computer 內完成,不必每步在桌面演出,但必須有操作紀錄與結果驗證。工具可安裝、授權、更新與移除。
> **取代舊版:不要執行 2.0 中「移除 Team 模式、所有 agent 強制獨立容器、全面遷移 shared → dedicated」的要求。** 本版已直接修正架構、資料約束、PR、測試與啟動指令不只是附加例外。不要刪除既有共用 Computer 或使用者資料。
本版閱讀順序:第 03 節為產品與執行邊界;第 15 節為實作依賴;第 18 節為 48 項改善清單;第 19 節是 TigerVNC第 2021 節是外掛安裝與 Outlook第 16 節含 64 個測試案例。
## 0. 給 coding agent 的執行指令
直接依本文件修改既有程式,不要只重新產生另一份計劃。先確認本地 HEAD、工作目錄與既有測試再依第 15 節的 PR 順序逐段實作。不得覆蓋使用者未提交的修改。每個階段均須附上實際 diff、測試結果、已知限制及回滾方式。
本文件優先於先前健檢文件中以下已變更的假設:
1. **不再要求所有動作在 VNC 或可見終端機演出。** 正確的結構化紀錄即可;桌面是需要時可觀看、可接管的執行介面。
2. **保留 shared 與 dedicated 兩種模式,禁止強制轉換或取消 Team Computer。** shared 允許多 agent 對一個 Computer沿用 per-agent workspacedisplayprofile 與 shared/dedicated 才要求獨立 Computer。共享資源與私人授權分開不能把不同資料夾DISPLAY 宣稱為惡意程式隔離。
3. 不把「用 APICLI 加速」解讀為在 LazyBoy API 主機上執行 agent 工作。連接器、MCP 子程序、檔案工具、命令與瀏覽器控制的實際執行端都在指定 Computer。
4. 保留現有 Rust harness、Cua、Supervisor、SandboxProvider、React/noVNC、Vault、記憶、排程及 checkpoint不做全面改寫。
5. 自動操作的範圍是使用者授權、該 Computer 能提供的能力。不得將「任何事情」翻譯成繞過 CAPTCHA2FA、任意取用其他 agent主機資料或免除高風險操作核准。
遇到外部 OAuth、GPU、GUI 或付費模型環境缺失時完成能完成的程式、fixture、mock 與單元測試;對受影響整合項目記錄 `BLOCKED_EXTERNAL` 和精確缺項。不得把 mock 成功寫成真實服務已驗證;也不得為完成測試而操作真實主信箱。
---
## 1. 必須成立的產品契約
### 1.1 不可違反的條件
| ID | 條件 | 必要驗收證據 |
|---|---|---|
| I01 | agent 的 shareddedicated 綁定正確;私人 Computer 不與其他 agent 隱式共用,共用 Computer 明確列 membership 與 per-agent 執行 scope | 兩模式建立恢復測試membership、slot、profile 與文件 scope 驗證 |
| I02 | 所有 agent 命令、任務檔案操作、連接器與本地 MCP 在該 Computer 執行 | API 與 Computer 放入不同 sentinel程序namespace 與 server-bound computer identity |
| I03 | agent 任意程式不能在 APISupervisor 主機執行 | 偽造 target、host fallback、MCP spawn 測試;只保留可信任管理操作 |
| I04 | 工具是否可用取決於 agent grant、Computer 健康、account、scope 與 resource policy | 未授權、已撤銷、錯帳號與跨 agent 測試 |
| I05 | 每次工具呼叫可追蹤,包含失敗、拒絕、取消與結果未知 | operation ledger、UI timeline、outbox 重播/斷線測試 |
| I06 | 原生檔案與命令不需要 screenshot 或 vision 模型 | text-only 模型與 screenshot counter 測試 |
| I07 | 同一資源的寫入不競爭;不同 agent 不被全域鎖拖住 | 兩 agent 併行、慢 MCP、同頁雙寫測試 |
| I08 | 不確定的副作用不盲目重播 | 逾時但伺服器已執行、重送相同 operation、取消競爭測試 |
| I09 | 最終成功必須有任務層驗證證據 | file hash、表單確認值、讀回 label工具 200 不足以完成 |
| I10 | 暫停、接管、取消與恢復涵蓋背景工具,不只涵蓋滑鼠 | barrier/fencing、background job、in-flight API 測試 |
| I11 | 密碼、token、broker key 不進一般 prompt、tool args、trace 或記憶 | secret canary、logcheckpoint錯誤回應掃描 |
| I12 | 失敗、重啟或升級不得默默換電腦、換帳號或遺失產物 | container recreation、binding generation、artifact checksum 測試 |
| I13 | shared 與 dedicated 都支援原生工具加速;共用模式不得被降級成 GUI-only 或待淘汰模式 | shared 原生 fileexecconnector 與雙 display 並行測試 |
| I14 | 安裝套件、授權工具、綁定帳號是三個不同動作 | 共用安裝一次,未授權 agent 仍不能透過 broker 使用別人的帳號 |
| I15 | 任務執行、agent 截圖、人類桌面串流各自可量測,不混為一種延遲 | noVNC 關閉時 native 任務仍成功VNC 與模型 critical path 分開 |
| I16 | 對「應用層 scope」與「OS 強隔離」誠實標示,不能用 prompt 承諾未知程式的安全 | 同 UID任意 shell第三方 MCP 的 threat-model 測試與限制說明 |
### 1.2 「檔案都在 Computer 內」的精確定義
**任務檔案**包含原始附件、下載檔、repo checkout、暫存檔、CSV、報表、程式輸出、完整工具輸出與任務執行產物。其讀寫、解析、壓縮、轉檔與掃描程序都必須在對應 Computer 執行。
允許持久 volume 的實體 bytes 由 Docker 管理並儲存在宿主機磁碟;這不等於 agent 可以直接讀寫宿主機路徑。不得把 API 主機的 `/`、任意 home 或 Docker socket 掛入 Computer。
**控制面資料**仍可保留在既有 PostgreSQLagent 設定、授權 metadata、run/checkpoint、經脫敏的工具摘要、artifact reference、hash、耗時與事件狀態。API 可串流附件進 Computer、串流工具結果下載給使用者、轉送模型需要的內容但不得在主機暫存並處理任務檔案。大型原始輸出與 artifact 正本留在 ComputerAPI 只保存有權限的 reference。
使用外部模型或 SaaS API 仍會傳送必要資料;「在 Computer 執行」不是離線或零資料外送的承諾。模型推論及編排可在控制面;對 Gmail 等目標服務的工具請求由 Computer 內的連接器發出。
### 1.3 能力與安全邊界
「能做各種電腦工作」以能力可擴充為目標,不限定 Gmail 或某個網站。但容器中的硬體、GPU、音訊、USB、kernel、特定 GUI 或企業 SSO 是否可用,必須由 capability probe 回報,不能偽造已支援。
一般命令以非 root 使用者執行。額外套件優先裝在使用者環境;需系統權限的安裝由受控、可稽核的管理流程核准。不可為了可操作性讓 LLM 自行取得 Docker daemon、host root 或修改 Runner 的權限設定。
---
## 2. 現況與重用範圍
下列 F01、F03 於本次再次讀取原始碼確認;其餘為同一 commit 的前次健檢發現coding agent 開始時仍須核對現行實作。來源見附錄 A。
| ID | 基準版本發現 | 修改方向 |
|---|---|---|
| F01 | `tools.rs::pack_observation()` 在 vision + 非 Identical 時回傳 None條件反轉 | 先補紅燈測試,修正截圖交付;區分捕獲與交付狀態 [R1] |
| F02 | agent-facing `shell/read_file/write_file/list_files` 透過可見終端機與截圖 | 改接真正原生工具GUI 終端機保留給 TUI協作 [R1] |
| F03 | `SandboxProvider` **已存在** `execute/list_files/read_file/write_file`Supervisor 已有容器內 exec 與檔案路徑 | 優先重用與強化,不必另造平行 sandbox 架構 [R2R4] |
| F04 | `runs.rs` 將 email 歸 browser-firstMCP 另列,優先級重疊 | capability-aware routingprompt 只是配套 [R5] |
| F05 | DOM browser 與 saved login 被 `vision_guard()` 一併限制 | 分 semantic、visual 與 credential capability [R1] |
| F06 | browser 宣稱 CSS selectorwaitMs但 adapter 能力與使用方式不一致 | 修契約、型別化錯誤、fixture不假設 driver 自動實作 [R6] |
| F07 | `policy.rs` 重複 wait/shell 可刷新進度,災難上限不能當短任務預算 | 驗證 milestone、時間預算、有限恢復 [R7] |
| F08 | API 的 `mcp.rs` 啟動 stdio 子程序hub 的全域鎖跨遠端 await | MCP runtime 搬進 Computer授權隔離、局部鎖 [R8] |
| F09 | `crates/sandbox/src/docker.rs` 部分檔案通道以文字 JSONlossy conversion 處理 bytes | 補 byte-safe 傳輸、大小限制、錯誤狀態與雜湊 [R3] |
| F10 | `lazyboy-screen` 已有 slot→displayVNCwebsockify 對應、per-display CuaDBus、獨立 profilex11vnc 使用 `-noxdamage` | 保留既有多 display 語意;以可切換 Xvnc backend 測試,不把 Team 視為單一桌面 [R9] |
| F11 | `lazyboy-screen` 已用 `xfwm4 --compositor=off`ensure_slot 會串行啟動桌面VNCCua終端機等 | 關 compositor 是現況,不是尚未做的新提速;按需拆 readiness 與修啟動 dependencies [R9] |
特別注意F03 代表原生執行「有底層基礎」,不代表既有實作已完整提供取消、持續 session、原子寫入、byte-safe 傳輸、授權隔離或任務稽核。不可只把 `shell()` 改呼叫 `execute()` 就宣布整個計劃完成。
### 2.1 檔案落點
| 現有位置 | 主要修改 |
|---|---|
| `crates/contracts/src/` | tool capability、operation、job、artifact、typed error 等可序列化契約 |
| `crates/control/src/sandbox.rs` | 重用擴充原生方法、job lifecycle、串流及限制 |
| `crates/controld/src/` | Computer 內 Tool Runner 的路由、job 管理、檔案、browser adapter、local MCPconnectors |
| `crates/sandbox/src/docker.rs` | Rust API 到指定 Computer 的 transport不得對錯誤回傳空成功 |
| `crates/supervisor/src/` | provisioning、Computer 身分綁定、受控 transport、資源lifecycle不執行 agent 任意主機程式 |
| `crates/api/src/tools.rs` | agent-facing schema、具 grant 的 dispatch、structured outcome拆出子模組避免繼續膨脹 |
| `crates/api/src/runs.rs` | tool discovery、執行路由、checkpoint、結果與驗證、operation ID |
| `crates/harness/src/policy.rs` | milestone預算loop guard 與 typed recovery |
| `crates/api/src/mcp.rs` | control-plane 設定與 runtime directory不再在 API spawn agent MCP |
| `crates/api/src/monitor.rs`、`apps/web/src/run-monitor.tsx` | activity timeline、耗時分解、jobartifact 狀態 |
| `crates/api/src/computer.rs`、`vault.rs`、`workspace.rs`、`attachments.rs` | 雙模式 Computer assignmentmembership、scope、safe streaming、credential broker 整合 |
| `image/computer/`、Compose、`migrations/`、`tests/` | runtime 啟動、版本固定、漸進遷移、測試與部署 |
新 module 名稱可依現有慣例調整;不得在 Rust 核心外再加一個完整 Python agent orchestrator。必要的 Node browser worker 可以是受控執行器,不是第二套總指揮。
---
## 3. 目標架構與責任分離
```text
LazyBoy API + Rust Harness [控制面]
├─ 任務模型工具路由grants驗證
├─ Computer assignments + memberships
└─ PostgreSQL操作紀錄、經脫敏 metadata、設定
↓ 受控 transport
Supervisor / SandboxProvider [管理面:生命週期、資源限制、身份驗證]
┌──────────┴────────────────┐
▼ ▼
Team Computer T [共用] Dedicated Computer P [私人]
├─ agent A context └─ agent C context
│ ├─ bots/A/ ├─ 私人持久 home/workspace
│ └─ display/profile A └─ 私人 display/profile C
├─ agent B context
│ ├─ bots/B/
│ └─ display/profile B
├─ shared/ [成員依 grant 存取]
└─ 版本化工具套件 [可共用程式,不隱含共用帳號]
│ │
└─ 各 Computer 內的 RunnerjobsfsMCPconnectorsCua
工具資料、下載、暫存、完整輸出與執行產物留在該 Computer
```
### 3.1 執行位置
擴充既有 `controld`SandboxProvider不重建另一套總指揮。API 只管編排、授權與紀錄Supervisor 可透過 Docker exec 啟動 Computer 內可信任 helper不能把 LLM 指令放到自己的 shell。附件與產物允許受控串流不在 API 主機暫存解析。remote SaaS 是獲准的目標服務,不是遠端檔案處理或遠端 code-interpreter fallback。
MCP連接器的本地 client、下載、解壓、SDK 與檔案程序皆在目標 Computer。遠端 MCP 的伺服器程式仍在遠端,不能宣稱都在本機;只有使用者准許的遠端 SaaS 存取可啟用,會代處理本機 task files代跑 shell 的遠端工具預設拒絕。
### 3.2 兩模式與資料約束
- `ComputerMode` 的既有 enum儲存值先核對並保持相容本文件用 shared/dedicated 表示產品語意,不要求隨意改資料庫字串。
- `computer_id` 為邏輯電腦provider_ref 可變。container 重建增加 `computer_generation`。displaybrowser 重啟另有 session generation不需連帶使所有原生 job 失效。
- 每個 agent 同時有一個 active assignment。**shared Computer 的 computer_id 可被多個 agent 參照**;不能替此欄位無條件加 UNIQUE。
- dedicated 的排他性用對應 owner部分約束transaction enforceshared 用明確 membership相同核准 space/team、display slot、workspace scope 與 grants。
- 保留使用者既有選擇和建立 agent 時的共用/私人選項;新的 hybrid executor 不應改變 ComputerMode 的預設或現有 assignment。
- provisioningscreen 啟動做 per-computerper-slot single-flight刪除 agent 只移除自己的 assignment 和資源。Team 仍有其他成員、job 或 viewer 時不得 stop/destroy 整台 Computer。
- Computer idle 由全部成員的 jobs、MCP、screens、writers、outbox 共同判斷;不能因 A 閒置就凍結 B。
- `runner_ready`、`browser_ready(profile)`、`desktop_ready(display)`、`viewer_ready(display)` 拆開。原生工作不等 XFCEVNC查看桌面也不能變成業務工作存活的必要條件。
### 3.3 共用的範圍,不等於什麼都共享
| 資源 | shared 模式預設 | dedicated 模式預設 |
|---|---|---|
| 容器與總 CPURAM | 同 Team Computer 共用、配額與公平排程 | 私人 Computer 的配額 |
| agent 工作目錄與 job 歸屬 | bots/<bot_id>/ 和 own jobstool API scope 分開 | 私人 workspace 和 own jobs |
| shared/ | 經 membershipread/write grant 分享 | 可保留本機 shared/ 名稱,但不自動跨 Computer |
| 瀏覽器、DISPLAY、DBusAT-SPI session | 沿用各 agent 的 slotprofile不能任意拿別人的 ref | 私人 slotprofile |
| 套件 bytes | 同版本可共用受保護唯讀 package store | 此 Computer 的 package store |
| 工具 instance設定OAuth | 依 agentgrantaccount 分開;明確允許才共用 instance | 私人 agent scope |
| 記憶run操作紀錄 | agent 身份不合併shared 檔案事件可依 membership 顯示 | agent scope |
`shared/` 路徑需依既有 `resolve_bot_workspace_path`scope 處理,不要直接重寫一套忽略舊路徑的 resolver。shared 寫入使用 canonical resource key 與版本衝突檢查,兩個 agent 看到的是同一份真正的檔案,不是各自副本卻叫 shared。
### 3.4 誠實的信任邊界
shared 是受信任團隊的協作 Computer。**同容器、同 UID、可執行任意 shell 時,資料夾 scope 與不同 DISPLAY 不構成對惡意程式的強隔離。** 不可宣稱 tool grant 能阻止所有自行寫腳本讀其他可讀檔案X11 session 的行為。
保留 shared 的原生能力,但敏感 brokerRunner metadata 必須與 task user 分離保護;僅向批准的 connector instance 提供 scoped credential。對需要跨 agent 機密性的工作,使用 private Computer 或新增經測試的 per-agent OS user工作沙盒此選項不能變成刪除 shared 的理由。
同一共用主機安裝未受信任套件等於引入可執行程式,必須顯示受影響 Team檔案session 範圍;沒有可驗證的 sandbox 就不能宣稱只影響某一 agent。強化模式僅在對應 OS 行為真的測過後才能標為安全隔離。容器對宿主機的邊界仍依 Docker 權限mountnetwork 實作 [E4]。
### 3.5 持久化與升級
兩模式都保留資料與 browser profile。user-space 工具使用版本化目錄與 lock manifestOS 套件採 image受控 recipe 重建,不承諾任意 apt 安裝跨 recreate 永久保留。
shared 和 private 都原地升級 schemaRunner不做強制模式遷移。使用者日後明確要求換模式時才啟動 dry-run、停止點、授權 copy、checksum、衝突處理與可回滾的 assignment 切換。
---
## 4. 契約:身份、工具結果與 operation ledger
以下為**建議新增契約**,不是現有 API。欄位命名可調整但語意不能消失。
### 4.1 可信任執行 context
```json
{
"space_id": "space-A",
"user_id": "user-A",
"bot_id": "bot-A",
"computer_id": "computer-A",
"computer_generation": 3,
"assignment_id": "assignment-A",
"computer_mode": "shared",
"display_session_id": "screen-A",
"workspace_scope_id": "scope-A-and-shared",
"run_id": "run-42",
"step_id": "step-3",
"operation_id": "op-17",
"attempt_id": "attempt-1",
"grant_id": "grant-9",
"control_epoch": 8,
"deadline_at": "2026-09-10T08:00:00Z"
}
```
這些身份由伺服器按登入 actor 與 run 綁定,**LLM 不得填寫或更換 computer_id、grant、account mapping 或 filesystem 根目錄**。工具參數只能是任務需要的業務參數。到 Runner 時再次驗證 token audience、agent、電腦 generation、grant、到期與 control epoch。
Supervisor shared token 不得進入 agent 的 env、home 或 prompt。每個 Computer 使用短效、限範圍認證;不要認為服務藏在 Docker 內網就等於有授權。
### 4.2 Capability descriptor
```yaml
name: gmail.labels.apply_plan
version: "1"
execution_plane: computer
requires_vision: false
required_grants: [gmail.labels.write]
required_scopes: ["https://www.googleapis.com/auth/gmail.modify"]
side_effect: reversible_write
supports_batch: true
retry_mode: verify_before_retry
resource_key_template: "gmail:{account_ref}:mailbox"
result_schema: ToolResultV1
```
capability 必須區分installed、runtime_connected、authenticated、authorized、healthy。MCP annotations、tool description、模型自評或網頁內容都不是可信任授權來源。registry 僅向模型暴露此 run 真正能用的少量工具。
### 4.3 Structured ToolResult
```json
{
"schema_version": 1,
"operation_id": "op-17",
"status": "succeeded",
"effect": "confirmed",
"execution": {
"computer_id": "computer-A",
"computer_generation": 3,
"executor": "native_process",
"job_id": "job-7"
},
"data": {
"stdout": "12 files processed\n",
"stderr": "",
"exit_code": 0,
"signal": null,
"truncated": false,
"output_artifact_id": null
},
"artifacts": [],
"evidence": [{"kind": "process_exit", "exit_code": 0}],
"timing": {"queue_ms": 4, "execution_ms": 31},
"error": null
}
```
- `status`accepted、running、succeeded、failed、cancelled、timed_out、needs_auth、needs_approval、needs_human、policy_denied、unknown。
- `effect`none、confirmed、partial、unknown。`succeeded` 只表示該工具契約完成,**不自動代表整個 task 完成**。
- `exit_code` 在未結束時為 null因 signal 結束另記 signal。不得把 timeout 或空輸出視為 exit 0。
- 所有結果共用 envelope不能再讓任意錯誤文字看起來像正常 `text_outcome`
- wrapper 外層 HTTP 非 2xx、解析失敗、schema mismatch 必須保留錯誤;不能回傳空 file list空 file contents 冒充成功。
### 4.4 Operation identity、重送與恢復
`operation_id` 代表一次具體意圖,由 harness 產生並在網路重送時保持相同。`attempt_id` 區分傳輸嘗試。不可只 hash 相同 args 作 dedupe使用者可能真的要求合法重做同一動作。
Runner 在副作用前,先將 accepted intent 寫入受保護的 durable journal其後記錄 started、結果與驗證。控制面先記錄 dispatch intent再傳送UI 訂閱中央事件。中央斷線時由本地 outbox 補送,透過唯一 event key 去重。journal 無法可靠寫入時,不開始新的有副作用工作。
同一 operation 重送running 回原 jobfinished 回既有結果never blindly rerun。Runner容器崩潰或外部 API 回應丟失時,狀態可為 unknown交給 verifier 做 read-back。沒有第三方 idempotency 或可觀察後置條件時,不可宣稱 exactly-once需人工判斷或停止。
同一 operation ID 搭配不同 payload hash、帳號或 grant 必須拒絕。舊 computer_generationcontrol_epoch 的動作不得在新容器或相應接管 scope 後繼續執行。shared 模式使用 computer、agent 與 display 的分層 epoch不能 A 接管就無條件使 B 的獨立工作失效。
---
## 5. 原生命令、檔案與背景工作
### 5.1 最小工具集合
| 工具群(建議名稱) | 行為 | 截圖需求 |
|---|---|---|
| `exec.run` | argv 或明確 shell mode短作業直接回結果長作業回 job_id | 無 |
| `exec.status/output/cancel` | 查工作狀態、依 cursor 取輸出、確認取消 | 無 |
| `terminal.start/interact` | 真正需要 PTYTUI持續互動的程序 | 文字優先,必要時 GUI |
| `fs.list/stat/read/write/patch/move` | 原生 file APIbyte-safe、有限讀取、原子變更 | 無 |
| `fs.search` | 在 Computer 搜尋binary巨大資料有界處理 | 無 |
| `artifact.list/export` | 回傳 Computer 內 artifact reference下載串流 | 無 |
| `browser.*` | 同一 Chromium 的 DOM語意操作 | 按需 |
| `computer.observe/act` | AT-SPI視覺桌面操作 | 視覺動作必需 |
| `account.*`、`gmail.*`、`mcp.*` | 受控 account handle 與 per-agent grant | 通常無 |
既有工具名稱可保留為 versioned alias以免破壞 skills。alias 亦須經同一 policy、audit 與 Computer dispatch不能留下可繞過的新舊兩套入口。
### 5.2 Exec 與 session 的正確語意
- 一般命令優先 argv array避免重新插入 host shell需要 pipeline 時顯式 `mode=shell`,只在 Computer 內解譯。
- `cwd`、HOME、PATH、locale、環境變數與 session scope 由 Computer runtime 管理。不自動繼承 API 的雲端金鑰、DB URL、Supervisor token。
- `exec.run` 的 stdout、stderr、exit status 來自實際程序,不從 screenshot 或文字 prompt 猜測。
- 預設 subprocess 非互動且不維持前次 `export/cd`。需要持續環境時顯式使用 scoped session不得讓 UI 宣稱持續,實際卻每次新 shell。
- PTY 可能合併 stdout/stderr需在 schema 註明。任意互動 shell 的 command completion 不可靠時回 `running/unknown`,不得用尾端 `$` 字元當完成證據。
- 背景 job 由 Runner 擁有 lifecycle。HTTP request 結束不是 job 結束;回傳 job_id保留 stdout cursor、deadline、PID/starttimeprocess group identity。
- 使用 bounded streaming、背壓與磁碟 quota。模型預設只收到摘要頭尾片段完整輸出放 Computer artifact。
- 取消必須處理 process groupsubprocess treeTERM → grace → KILL確認狀態後才回 cancelled。不要誤殺整個 desktop、其他 job 或 PID 回收後的新程序。
- request deadline 與 job runtime timeout 分離;達 runtime timeout 後依明確 policy 停止工作。transient network timeout 不等於工作已停止。
- API restart 可找回同一 Runner jobcontainer recreate 後原程序不再存在,要標記 interruptedunknown 並驗證產物,不得假裝還在 running。
- 對未知 arbitrary shell`changes_state=unknown`,不能因命令開頭是 `cat` 就假設無副作用shell、子程序、網路都可能改變狀態。
### 5.3 原生檔案與產物
檔案工具在 Computer 的 filesystem namespace 內執行,不能由 API 直接打開 volume 對應的主機路徑。
預設任務可寫 root 為 assignment 對應 workspace 與專屬 tmpshared 模式再加入明確授權的 shared/ 子樹。其他 Computer 內路徑依 OS 權限與 grant 開放,並遵守第 3.4 節的 shared 信任邊界。此限制不要求 agent 只能處理某個固定副檔名,也不禁止在自己的電腦使用已安裝的系統工具。
必要實作:
- Unicode、空白、引號、`$()`、反引號、換行檔名都須以資料而非 shell 程式碼處理。
- byte-safe 讀寫UTF-8 text API 與 binary API 分離。禁止 `from_utf8_lossy` 無聲毀損 binary。小 binary 可用受限 base64大型檔案用串流不要將整份內容放 argv。
- `fs.read` 支援 linebyte range、最大回傳量與 continuation二進位回 metadata/reference不交模型亂解碼。
- `fs.write/patch` 支援 expected version/hash、目標資源鎖、temporary file + same-filesystem atomic rename需要 durability 的操作同步資料與目錄,讀回核對 hash。
- 不存在檔案、權限不足、編碼錯誤、磁碟滿、大小超限必須各自回 typed error不得變空字串成功。
- 路徑驗證須處理 `..`、symlink、TOCTOU、mount boundary。不要只做字串 prefix 或先 canonicalize 再無鎖 open使用 descriptor-relativecapability-based 安全打開方式,依平台選受支援方案並測試。
- 對同一檔案的 read-modify-write要用該次讀取的 version/hash 做 optimistic check不同 run 並行修改會 conflict不可覆蓋人類更新。
- `artifact_id` server 產生並綁 creator_bot/computer、visibility_scope、相對路徑、media type、size、hash、來源 operation、retention記錄生成時 generation 作 provenance。持久檔案在重建後經重新核對 hashscope 可重新解析,不能永久因 generation 變動而失聯。下載 API 不接受任意 host path。
- 附件入站、UI 下載、connector attachment、browser download 都必須走 Computer 內串流路徑帶大小quota雜湊驗證。不得把 task bytes 放 API `/tmp` 再處理。
- destructive file operation 額外依風險核准;一般使用者已明確要求且可逆的本機整理可在 run grant 內批次執行,不必每個檔案再問一次。
### 5.4 保留 GUI 能力但不再把 GUI 當萬用資料通道
移除「所有 shell/file output 都一定是 screenshot」的 system prompt。原生工具結果直接進模型不為了視覺展示自動開 terminal、不重演指令、不額外截圖。
需要真正 TUI、GUI 終端機協作或使用者指定觀看時,才使用 `terminal.*`Cua。相同 job output 可另做 UI viewer不要求第一版將每個背景命令鏡像到桌面。
---
## 6. Capability-aware routing 與模型迴圈
### 6.1 工具選擇規則
在權限、資料位置與帳號已匹配的前提下,優先順序是:
```text
服務提供的結構化 API適用於該任務
→ Computer 內原生程式/檔案/已安裝 CLI
→ 同一 browser 的 DOMaccessibility
→ Cua 原生 accessibility
→ 新鮮截圖 + 視覺座標
→ 需要人類協助
```
這是依任務的偏好,不是要求每件事逐層嘗試。例如讀本機 CSV 直接 fs/exec無需先找 SaaS API登入後操作 canvas 可直接進視覺路徑。路由針對每個子任務重算,不能整個 run 一次選 browser 後鎖死。
**授權拒絕、帳號不符、缺少 capability scope 不是換另一工具繞過政策的理由。** 同一服務操作的 policy 必須套用到 connector、browser、shell HTTP 與 MCP 等路徑。無 API 但使用者確實授權該網站的 GUI 操作,可在明確 GUI grant 下執行;不可把 `POLICY_DENIED` 當成這種情況。
### 6.2 小任務不要多套一圈 planner
- 簡單明確的 fileexec 任務,用既有模型回合或 deterministic intent-to-tool route不再額外呼叫大模型做一份長計劃。
- 多步任務才持久化 `TaskPlan{goal,steps,dependencies,success_checks,budget}`
- 每一步保存 input references、採用 route、已驗證 milestone、產物與 blockers。checkpoint 不只是聊天文字摘要。
- 工具 discovery 依任務載入;不要把所有 agent 的所有 MCP schema 塞進每次 prompt。
- schema cache 依 versiongrant scope 快取;授權撤銷必須立即失效,不得因快取繼續使用。
- 分類、格式轉換、批次檔案處理在一次受控工具工作中完成;不是每一列、每個字、每個 click 都呼叫模型。
- 已知確定步驟可 executor-side macro但需有限步數、每步 evidencetrace 與失敗即停;不是任意舊座標重播。
### 6.3 Typed errors 與處理規則
| Error | 行為 |
|---|---|
| `AUTH_REQUIRED``TOKEN_REVOKED` | 進 NEEDS_AUTH保留 task停止有副作用請求 |
| `POLICY_DENIED``SCOPE_DENIED``ACCOUNT_MISMATCH` | 明確拒絕此路徑;不改用 UIshell 繞過 |
| `TARGET_STALE` | 重新 snapshot定位一次只對尚未執行的操作重建動作 |
| `TARGET_NOT_FOUND` | 有界重新觀察/定位;視覺 fallback 需新鮮截圖 |
| `SELECTOR_UNSUPPORTED` | 換成受支援語意 locator不再重送同一不支援 selector |
| `TARGET_DISABLED` | 檢查可觀察的前置條件;僅有已知等待條件才 wait |
| `RATE_LIMITED`/暫時服務錯誤 | 本地 bounded backoff + jitterRetry-After不由 LLM 空轉 |
| `TIMEOUT_EFFECT_UNKNOWN` | 先 read-back不能 blindly retry mutation |
| `COMPUTER_UNAVAILABLE` | 恢復原 Computer驗證 generation不換 host 或另一 bot |
| `CONFLICT` | 重新讀最新狀態,重規劃/重新核准差異 |
| `CAPABILITY_UNSUPPORTED` | 回報缺少套件/裝置/模型能力;不宣稱已操作 |
| `CANCELLED``STALE_CONTROL_EPOCH` | 不再派送;保留真實已發生效果 |
### 6.4 Model 使用策略
初版保留現有模型供應商與選模 UI不綁定特定商業模型。原生DOM 工具允許通過契約測試的 text-only 模型;視覺座標需要具有經驗證 vision 能力的模型。
優先減少模型回合與多餘圖片,再測模型速度。可選的高難度模型升級最多有界觸發;不能讓不同 agent 彼此委派形成無限 nested harness。
若模型不支援所需能力,誠實回 `MODEL_CAPABILITY_MISMATCH`;不得把 `vision=true` 假裝打開。prompt、schema 與 provider request 三者須有整合測試。
---
## 7. Browser 與 Cua保留、修正、再測另一 backend
### 7.1 預設決策
先保留 Cua driver 與既有 Cua semantic browser修好 screenshot、schema 與 stale refs。把 browser 操作抽成受控 `BrowserExecutor` 介面,供未來替換,不先承諾換 driver 一定更快。
可選對照方案固定為 **Computer 內的 Playwright worker連接該 Computer 現有 Chromium**,避免第一版同時引入 agent-browser、Browser Use、Hermes 三套。需要比較其他方案時另外開 ADR實驗不能耽誤核心原生工具交付。
Playwright 官方支援 CDP attach 到既有 Chromium但明確指出相較原生 Playwright protocol 功能完整度較低,必須對實際 browser launch flags、frames、downloads 與 input 做相容性測試 [E3]。若對照 backend 未通過 fixture繼續用修好的 Cua不擴大替換。
### 7.2 同一 browser/session 的規範
- 不要求使用者保持 VNC 開啟;但 agent 使用的 browser 必須屬於其 Computer之後能在該桌面檢查及接管。
- 優先 attach 現有 browser instance不得另啟程序同時占用同一份 profile。保存 computer-local session identity 與明確 tab/frame ref。
- Cua 與 Playwright **不得同時寫同一分頁/桌面**,必須共享 lease。driver 換手後清掉舊 references 並重新觀察。
- CDP 與 Runner 不對主機公網發布,不交 LLM 任意 URL由可信任 runtime 對指定 browser 建立連線。
- 不把 headlessremote browser 當作無提示替代登入狀態的方法。
- 登入、導航、frame 切換、人工接管與 browser restart 皆是 refs invalidation boundary。
### 7.3 修正截圖條件與交付狀態
基準版本 `pack_observation()` 修正為 vision 且畫面非 Identical 時才產生 image純文字模型永不接收 image [R1]。
進一步拆開 `last_captured_frame`、`last_delivered_frame`、model/history identity。首次需要視覺、人工接管恢復、換 vision model、圖片歷史壓縮後即使畫面 bytes 未變,也必須允許 force delivery。
只有圖片真正加入模型 request 後才更新 delivered 狀態。不可因背景監控抓過圖,就以為模型看過。沒有最新視覺依據時,不准猜座標。
### 7.4 語意與座標能力分開
DOMaccessibility 操作檢查有效語意 target、權限、origin、lease不要求 vision。pixel-only 操作檢查 vision、最新 observation identity、viewport 尺寸與 control epoch。
browser locator 使用 tagged type例如 `snapshot_ref`、`role_name`、`css`;只有 backend 真實支援的類型才暴露。不要在名稱相近時偷偷做模糊匹配。
`wait_until` 由 executor 觀察明確條件,設 deadline避免所有工具固定 sleep 一秒。元素 disabled 的原因可能是缺欄位,不是時間到了就好。
可新增 bounded `browser.fill_form`:每欄重新定位並驗證,按鈕提交前驗證前置條件,提交後讀回確認。不可把五個會失效的數字 id 一次盲送。
### 7.5 底層可擴充,不預設全面操作保證
支援 normal click、type、scroll、drag、key、window focus、file upload/download、dialogs以及 Cua 已提供的桌面能力。每一項提供 capability probe 與 fixture不支援的 widget 明確回 unsupported。GPU、硬體或系統管理另外加受控 capability不以一個 `run_anything_as_root` 代替設計。
---
## 8. Concurrency、Pause、Takeover 與 Cancel
### 8.1 按真實資源上鎖,不按整台共用主機一律上鎖
| 資源 | 建議 lock key規則 |
|---|---|
| GUInative input | `(computer_id, display_session_id)` 的 writer lease同 display 排他、不同 display 可並行 |
| Browser | profile/session 對應 writer lease涉及 OS focusclipboardupload dialog 時一併取 display lease |
| 檔案 | canonical resource identity重疊 subtreeshared/ 同檔必須命中同一 lock配合 expected hash |
| 信箱與連接器副作用 | provider + canonical account/tenant/mailbox跨 Computeragent 的同帳號亦要協調 |
| MCP client | instance + grant + account 的有限 semaphore不跨 network await 持有全域 hub lock |
| 套件安裝/升級 | Computer/package/version同包原子切換active instance pin 原版本 |
| container stoprecreate | Computer lifecycle barrier等待所有成員 writerjob 安全停下 |
同 display 的 Cua 與 DOM 不同時 mutation不同 display 的 DOM 可以並行,不能因同 Computer 就全部串行。browser context 不可共享 mutable singleton。多資源依固定順序取鎖、設 deadline、避免 deadlock長等待不占用無關 lease。
受控 file 工具與已驗證 scoped jobs 可按不重疊資源並行。**任意 shell 不能靠 LLM 宣稱的路徑或 read_only 取得並行保證**:有 OS sandbox 證據才降到 scope 鎖;無界且可能影響全 Computer 的腳本/系統安裝保守取得 Computer-wide lease。這是高權限工作例外不是讓所有 shared 工作都上全域鎖。
初始併發為可調試驗:每 agent native jobs 2、service reads 4、每 display GUI writer 1同時設定 per-Computerprovider 上限與公平排程。不可各 agent 自行放大到壓垮共用 Computer。
### 8.2 觀看、接管與暫停的不同 scope
- Watching 不暫停也不授予寫入noVNC 客戶端 viewOnly 只是 UI伺服器仍須依 lease 拒絕未授權鍵鼠resizeclipboard。
- **接管某 agent**:保守暫停該 agent 的新 mutation 與 jobs取得它的 display其他 agent 的獨立 display無衝突資源可繼續。
- **只接管某 display**:暫停所有正在寫該 display 的工作,不偷偷取得其他 display涉及相同帳號共享檔案時透過資源衝突顯示等待。
- **暫停整台 Computer**對所有成員、jobs、MCP 與 display 建立 barrierUI 顯示受影響 agents。只有具 Computer 管理權限的人能做。
- 人類若要在 shared Computer 任意改系統/全域檔案,應先選整台接管;不能保證其他 agent 不受無界人類 shell 影響。
### 8.3 Scope-aware pause barrier 與恢復
使用 `(computer_epoch, agent_epoch, display_epoch)` 的 scope-aware fencing 或等價機制API 和 Runner 各驗證。對該 scope 停派新 mutation、取消未執行項對 job 採已宣告且驗證過的 cancelsuspend policy。
已送出的 SaaS mutation 無法因斷線就撤銷;持續顯示 in-flightunknownread-back reconciliation 後才宣稱已完成接管。取消不是 rollback。不能 SIGSTOP 整台共用容器來模擬「暫停 A」。
恢復沿用原 run/step重新檢查 assignment、membership、grants、generation、session 與未知效果;只做未完成步驟。共享檔案與 browser state 可能已變,重新讀回,禁止沿用舊 refs 或覆蓋 B人類修改。
觀察、核准與安全 reconciliation 可走受限恢復路徑,不讓原模型繼續無界派工。
---
### 8.4 arbitrary code 與可觀察性的實際邊界
本計劃保證的是**經過 LazyBoy 工具閘道的每次呼叫、受控子動作及 job lifecycle 有紀錄**;不宣稱等同完整 kernel syscall 或每個應用內部操作稽核。任意 exec 內部腳本仍可能連網、啟動程序與寫檔。
因此 arbitrary exec 的 scope、網路與 OS 權限必須保守;需要逐 syscall所有子程序網路行為的強制稽核時另做 OS 級監控與測試。不能只改 prompt 就承諾「所有低階行為零漏記」。
---
## 9. 紀錄、Activity UI 與資料保護
### 9.1 必須記錄的事件
`run.started`、`step.routed`、`tool.accepted`、`tool.started`、`tool.progress`、`tool.completed`、`tool.failed`、`tool.cancel_requested`、`tool.cancelled`、`tool.effect_unknown`、`verification.completed`、`artifact.created`、`authorization.required`、`takeover.requested/acquired/released`、`run.completed/partial/failed`。
事件至少帶 server-bound identity、operationattempt ID、tool/version、route、開始結束時間、resource scope、經脫敏 args summary、outcome、typed error、output reference、驗證證據與重試理由。
不保存模型隱藏推理;只記可稽核的 route rationale例如「已有 Gmail labels scope採批次 API」不是整段思考鏈。
### 9.2 UI 顯示
在現有 run monitor 擴充,不重做整個前端:
```text
14:20:10 原生檔案 讀取 orders.csv 成功 18 ms
14:20:10 原生命令 依規則整理 500 列 執行中 job-7
14:20:11 結果驗證 輸出列數與檔案 hash 符合 通過
14:20:12 Gmail 標籤修改預覽 80 封 等待核准
```
以上僅為 UI 示例,不是效能實測。
每個項目可展開看脫敏輸入、輸出摘要、差異、執行電腦、job、產物與驗證不能只顯示「我正在努力」。背景 job 可取消artifact 可從該 Computer 串流下載。觀看紀錄不要求開桌面。
### 9.3 稽核安全與 durable outbox
- 中央 ledger 存 metadata原始 outputartifact 在 Computer。flush 有背壓、quota 和 retention避免無上限 screenshot、base64 或郵件內容進 DB。
- secret redaction 在寫入 trace、logger、exception、MCP debug、checkpoint、UI 之前執行。secret type 使用 opaque handle不靠事後 regex 當唯一防線。
- Runner 的 journal/outbox、broker keys 和管理憑證,必須置於 task shell 不可任意改寫的權限區域;中央 accepted intent 可協助查出本地結果缺口。
- 限制任務使用者對 brokerRunner proc env、memory、socket 與管理檔案存取;不能只因非 root 就假設同 UID 程序完全隔離。
- Browser 已登入狀態代表具有該帳號的存取權。若一般程式可以讀相同使用者的 browser profilesession 或控制 X11就不能聲稱能抵抗惡意程式對所有 session 資料的窺探。部署要明確記錄此 threat model更強隔離需 OS usersandbox 與實測,不得僅用文案保證。
- 不記錄原始密碼、OAuth token、Authorization header、secret query、剪貼簿 secret。密碼相關操作停用或遮蔽自動 screenshotrecording不可先拍下再只遮 log 字串。
- 檔案與郵件正文可能是敏感資料,依最小必要送模型,並提供 retentionsecret canary 要掃所有正常與錯誤路徑。
---
## 10. MCP、帳號與憑證
### 10.1 MCP 在 Computer 執行與隔離
API 的 MCP 模組僅保存設定/授權 metadata 和 UI 狀態stdio MCP 子程序與 remote MCP client 均由 Computer Runner 管理。兩模式都以 agentgrant 管理 MCP instance、env、working dir、account binding 與 capability set。shared 可重用唯讀套件 bytes有狀態且含私人憑證的 instance 預設分開,明確授權且支援 request-level scope 的服務才共用 instance。安裝流程見第 20 節。
runtime key 至少包含 `(space,user,bot,computer,generation,server_instance)`tool 名稱只是顯示名稱,不可只靠 slug 找工具而跨 agent 命中同名 server。
- 只讓授權工具進 registrydispatch 再檢查一次;`definitions()` 不合併全域所有人的工具。
- 在短臨界區取得 client handle釋放 hub lock 再 await。必要 semaphore 只限制該 server不堵住別的 agent。
- 持續連線與 schema cacherestartreconnect 清掉舊 generation 的 handles。
- stdio 套件及版本固定,不在每次 tool call 執行不固定版本的 `npx -y latest`。首次安裝是獨立、有紀錄的準備工作。
- raw MCP 結果要映射成共用 envelope保留 `isError`、typed output、截斷與 resource references不可只當 pretty JSON 文字認為成功。
- 處理跨 agent server alias 碰撞、404、401、timeout、schema 變動。拒絕 connector 自己要求開放更多權限或修改控制面設定。
- unknown未受稽核的 MCP 可執行任意程式時,視同 unknown exec scope不相信它宣稱 read-only。
### 10.2 Credential broker
保留 Vault 的加密儲存與管理介面,但新增 per-agentaccount grant。模型只取得 opaque handle。需要使用時由可信任 broker 透過受保護 channel 交給 Computer 的受控 connector欄位填入器token 不暴露給 generic exec 或其他 MCP 的 env。經審查的第三方 MCP 若只支援環境變數認證,需明確批准其讀取該 token以該 instance 的受保護 runtime 注入,記錄安全降級;無法阻止共用 task user 讀取時拒絕敏感 token 注入並回報原因,不假裝有 broker handle 即相容。
brokertrusted connector 應使用與 task shell 分離的 OS 權限(共享/私人皆適用),不放在任意工作程式可讀的 home、environment、debug output 或 task 可寫 journal。OAuth callback 可以由控制面接收與交換/安全保存授權憑證;之後真正的 Gmail 工具操作由 Computer connector 發出。不得為「全部在電腦內」而把長期 secret 塞給任意 shell。
原始密碼填入前檢查 HTTPS、精確核准 origin、frame、form target 與當前 control epoch導航之後重新驗證。不要自動放寬成任意 Google 子網域。欄位辨識可用 input typeautocompletelabel表單關聯不只中文字串搜尋。
登入狀態要區分 `ORIGIN_MISMATCH`、`FIELD_NOT_FOUND`、`AMBIGUOUS_FIELD`、`AUTH_REJECTED`、`NEEDS_HUMAN`。密碼被拒不連續重送2FAPasskeyCAPTCHA 進人工接管。此專案不實作驗證繞過服務。
### 10.3 授權與便利性
使用者明確要求的低風險工作可以取得 run-scope grant不要每個讀檔、click 都重新核准。敏感外送、寄信、付款、刪除、改帳號設定或大批外部寫入要有清楚 scope 與 policy可設定長期授權但必須有範圍、到期、撤銷與事件紀錄。
核准綁 plan hash、account、目標資源、允許的變更與期限修改內容變了必須重新核准。generic shell、browser 和 MCP 不得成為其他工具 policy 的繞過通道。
**重要實際限制:**對具任意本機程式、已登入 browser、直接網路權限的工作者只做工具層 allowlist 無法證明所有出站行為都受限。需以 OS 使用者、broker 隔離、網路 egressproxy policy 實際限制敏感服務憑證與目標;對無法強制的 generic browserexec 高權限能力明確標示並要求額外授權,不能虛稱與 narrow Gmail tool 同等安全。
---
## 11. Gmail第一個端到端業務驗收案例
### 11.1 範圍
Gmail 只是驗證新架構的第一個 connector不將 router 寫成 Gmail 特判,其他服務應能使用相同 grants、operation、audit 與 verifier。
第一版只做使用者自訂 labels 的預覽、核准、套用與讀回;不自動寄信、不刪除、不封存、不改已讀、不改系統分類分頁/企業 Classification Labels。Gmail labels 與 Inbox categories、Google Workspace 的 Classification Labels 是不同範圍。
使用使用者 OAuth不假設 browser cookie 等於 API token。優先實作必要範圍的授權使用 `gmail.modify` 時在產品層限制具體操作;該 scope 不只是標籤修改,`gmail.labels` 也不能替代套用郵件標籤所需權限 [E1E2]。不要要求個人 Gmail 使用 Workspace domain-wide delegation。
公開分發/多人部署前檢查 Google 對 restricted scope 與資料處理的要求;開發 fixture 不代表真實 OAuth 發布審核完成 [E2]。
### 11.2 正確流程
```text
確認 account 與 capability
→ search 指定 query時間範圍完整處理 pagination
→ 受限並行取得 headers必要時才取得 snippetbody
→ 確定規則先分類,模糊案例送模型分批輸出 label enum
→ schema validation + 固定測試集校準 + 待確認類別
→ 保存不可變 label plan顯示預覽
→ run grant 或使用者明確核准 plan hash
→ 依相同 add/remove label 組合分組
→ connector 在 Computer 內 batchModify
→ 逐筆 read-back 驗證,記錄 partialunknown
→ 回報真實完成數、未處理數、例外與可用撤銷範圍
```
Google 官方 `messages.batchModify` 單次最多 1,000 個 message IDs同一批使用同一組 add/remove label成功回應為空不帶每封郵件的完整結果因此仍須另行讀回驗證 [E1]。
範例驗收採 100 封 fixture mail不代表使用者授權處理整個真實信箱。生產查詢必須有明確範圍、結果上限、排除條件、pagination 與 preview。
### 11.3 權限、模型與準確度
郵件正文是**不可信任資料**。分類模型只回傳固定 schema 與允許 labels不可直接 dispatch tools正文要求轉寄改系統規則下載執行程式一律不構成授權。
不要只依 LLM 自報 confidence。建立含繁體中文、英文、帳單、廣告、工作與模糊內容的人工標註測試集報告 precision、recall、coverage、abstention避免把所有信放「待確認」就宣稱 100% 準確。
初始 target自動套用類別 precision ≥ 95%,同時公布 coveragerecall模型不達標時採 preview-only而不是偷偷降低正確性門檻。此為驗收目標不是目前已測結果。
### 11.4 Retry 與 Undo 的限制
每個 plan 包含 message IDs、account reference、原先 labels、requested delta、rule version、hash、到期與 grant。分批有 child operation ID保存實際套用驗證的狀態。
429暫時錯誤採有界 backoff回應丟失先 read-back只執行仍缺少的核准 delta。token 撤銷停在 NEEDS_AUTH不轉 GUI 硬闖。
撤銷只考慮本次實際新增/移除的 labels不覆寫整個 label set。若使用者並行修改同一 label 或狀態history 不清楚,標記 conflict顯示預覽再核准**沒有原子 compare-and-swap明確來源資訊時不能保證任意並行情況下完全無損的一鍵 undo**。
### 11.5 外部環境缺失
coding agent 使用本地 fake Gmail HTTP server 完成 pagination、batch、token revoked、rate limit、response lost、partial verification、concurrent change 與 prompt-injection tests。真實帳號測試單獨列為 opt-in integration不要求密碼token 貼到聊天,也不自行建立或刪除真實郵件。
---
## 12. Verifier、進度、有限恢復與預算
### 12.1 三層完成狀態
1. **Transport**:呼叫是否收到合法回應。
2. **Operation effect**:程序退出、欄位值改變、檔案 hash 符合、label 實際存在。
3. **Task success**:使用者要求的所有必要結果與限制是否達成。
只有第 3 層完成才回 run.completed。部分成果回 partial明確列已完成未完成阻礙不用最後一句自然語言假裝通過。
### 12.2 Evidence-based progress
- file輸入輸出 hash、筆數、schema、測試結果。
- browser特定欄位、URL目標記錄、確認頁中的對應值只有頁面換網址不足以驗證交易成功。
- GmailOutlook已讀回 verified 的 message 數、仍待處理/待確認數;不能混用兩者批次/標籤模型。
- build實際 job status、exit code、test summary仍在輸出 log 不等於任務持續前進。
- waitpollheartbeat 可表示 worker 活著,但不刷新 milestone progress。
像畫面時鐘、游標閃爍或工具 args 換了,也不算任務進展。對沒有 deterministic verifier 的模糊視覺任務,可使用受限視覺驗證或人類確認,但標示證據較弱,不能當確定完成。
### 12.3 起始預算(新設定,可調整)
```yaml
interactive:
max_llm_turns: 20
max_no_progress_seconds: 60
max_semantic_recovery_attempts: 2
max_route_switches_per_step: 2
wall_budget_seconds: 180
batch:
bounded_chunk_size: 100
max_semantic_recovery_attempts: 2
progress_source: verified_items
long_job:
lifecycle_owner: runner
completion_source: job_event
runtime_deadline: required
```
這些值是合理起始實驗,不是已測最佳設定。正式 task budget 與保險上限分離。長工作依 task 明確 deadline不用 180 秒把正常編譯截斷human_wait 另計。interactive 沒進度時重新路由一次,仍卡住就清楚暫停,不能把上限調回四小時當修復。
watchdog 必須能在慢模型/工具 await 期間運作不只在下一輪才檢查。等待已知條件採本地事件bounded polling不反覆付費請 LLM 決定再等一秒。
---
## 13. 效能與正確性量測
### 13.1 必要指標
- `run/step/operation/model/tool_version/backend/computer_generation/mode/assignment/display_session`
- coldwarmqueue、model TTFTtotal、tool execute、observation、recovery、human wait。
- model input/output tokensprovider 沒回則標 unavailable、schema 大小、LLM turns、tool calls、retryroute switches。
- screenshot countbytes、artifact bytes、verified itemsmilestones、successpartialfailure rate。
- native CPUmemorydisk、每 agentComputer 並行數、MCP server latency、display capture 與 VNC viewer latency。
並行存在時,不可把所有 span duration 相加當 run wall time同時報 wall time、exclusive spans 與 critical path避免重複計算 tool 與其內部 observe 的時間。
### 13.2 Benchmark gates
以下為**待實測驗收 target**,不是完成時間承諾。先固定 reference host、container quotas、CPU architecture、模型版本、網路條件及冷暖狀態提交 baseline再進行比較。
| Case | 正確性 gate | 效能/迴圈 gate |
|---|---|---|
| 1 MiB 本地讀寫hash | byte-for-byte 正確private 不跨 Computershared 按授權共享而非混用 | warm tool-only P95 target ≤ 500 ms0 screenshot |
| 短命令 `printf`/非零退出 | 真實 stdout/stderr/status | warm tool-only P95 target ≤ 1,000 ms0 screenshot |
| 500 列 CSV 整理 | deterministic expected outputschemahash 通過 | 不逐列 LLM同條件已驗證完成 median target ≤ baseline 50% |
| 本地五欄表單 | 每欄正確+提交確認 | bounded macro模型決策回合 target ≤ 3不含登入 |
| Gmail 100 封 fixture | requested label delta 逐筆驗證、不做額外修改 | 0 GUIlabel write call 按組合batch而非每封一次 |
| 兩 agent 同時工作 | 結果分離、沒有 credential 或 artifact 混用 | 慢 A MCP 不阻塞 B clientregistry非全域串行 |
| 長命令與 reconnect | 狀態可找回,取消不留未知子程序 | 無需 LLM 忙碌 polling模型次數不隨等待秒數增長 |
每一候選設定先固定種子fixture 重跑至少 30 次;正式以 P95 當門檻前建議至少 100 次並附樣本數。少量樣本只作探索;有延遲或 rate limit 不隱藏。舊路徑若無法完成並驗證該任務,其相對提速列為 N/A改報新路徑絕對耗時與成功率不捏造 baseline 倍數。
只比較成功且驗證過的同一工作,**同時列所有任務成功率與失敗耗時**,避免只挑成功樣本或「更快失敗」造成假提速。未達 target 就提交 profiling、差距與修正項不改 fixture 偷渡。
---
## 14. 持久化、設定與雙模式相容升級
### 14.1 資料模型
沿用既有表、ID 與 enummigration 採 repository 下一號。不重命名既有 shared/team mode 就讓舊資料無法載入。
- Computersmodeowner_teamgenerationprovider_refbackendreadiness。
- Assignments/memberships每 bot 一個 active assignmentshared computer 可多 botdedicated 有條件排他約束。保存 workspace scope、display slot、profile id。
- Grantsbotteam membershipComputeraccountoperationexpiry同 Computer 不等於同 grant。
- Package installationsComputer/package/version/digest/source/trust/status。Binding安裝包 → agent(s)server instanceaccountcapabilities套件與認證分表。
- Jobsoperationsevents保留第 4 節與原有 schema加入 assignment、display/resource scope 和版本 provenance。
- Artifactscreator bot、visibility、relative path、hash、source op重建後核對不讓永續檔案被 generation 永久孤立。
- Display sessions每 slot 的 display/backend/epoch、profile 和 lifecycle。MCP、package 與 desktop 各可單獨健康檢查和恢復。
### 14.2 設定
以下是新增設定的建議命名;必須實作 parservalidation`.env.example`,不是當成目前已可用的環境變數:
```text
LAZYBOY_EXECUTION_PROFILE=legacy|hybrid
LAZYBOY_DISPLAY_BACKEND=xvfb_x11vnc|tigervnc_xvnc
LAZYBOY_BROWSER_BACKEND=cua|playwright
LAZYBOY_TOOL_AUDIT_REQUIRED=true
LAZYBOY_NATIVE_JOB_CONCURRENCY=2
LAZYBOY_SERVICE_READ_CONCURRENCY=4
LAZYBOY_TOOL_INSTALL_ENABLED=true
LAZYBOY_TOOL_INSTALL_REQUIRE_APPROVAL=true
```
Computer mode 保留既有 UI/API 選擇與預設值;不加強制 dedicated 的 rollout。legacy/hybrid 是 executor 路徑版本,**不是 shared/private 的替代名稱**。
雙模式皆先 opt-in 測試,再 canary。不能用 feature flag 恢復截圖錯誤、secret 洩露或 host task fallback。
### 14.3 原地升級與可選模式切換
預設原地升級 shared 與 dedicated保留 bot assignment、shared/、private workspace、登入、skills、排程和群聊。既有 Team 不標為待淘汰、migration_required也不自動拆成多台私人電腦。
只對需要調整的 metadata工作檔路徑做有測試的相容 migration保留回滾資料。使用者明確要求換模式時才執行dry-run → manifest → 停止相關 writers → 在來源 Computer 匯出/目標 Computer 匯入 → hash/permissions check → 原子切換 assignment → 恢復。共享 profilecredential 歸屬不明時列衝突,不複製給所有人。
共用 package 更新或整台 image recreate 必須先列出所有受影響 members/jobs不要為單 agent 升級重啟別人的工作。移除一個 agent 不刪共享資料或共享安裝包;最後一個 reference 消失後仍需 retention管理政策決定 GC。
---
## 15. 實作順序:可分段提交的 PR
不做「一次替換全部底層」的大型 PR。核心正確性先落地TigerVNC 和第二 browser adapter 都有獨立開關,不把它們的相容性問題混入原生工具改動。
| PR | 實作與主要落點 | 依賴 | Gate產出 |
|---|---|---|---|
| PR-00 | 核對 HEADgit statusAGENTS.md工具鏈建立 shared/private baseline、紅燈 fixtures | 無 | 記錄原有失敗、可重現截圖/工具契約問題;不覆蓋未提交修改 |
| PR-01 | 修 `tools.rs` 截圖與 semantic/vision guard、browser contracts、typed result | 00 | 新圖交付、text-only DOM、unsupported/stale/disabled 正確區分 |
| PR-02 | 保留兩模式assignment/membershipRunner identityper-display contextprotected broker boundary | 01 | shared A/B 仍同 Computer、private C 獨立;不能偽造 scope沒強制模式轉換 |
| PR-03 | operation ledgerComputer outboxActivity UI事件與秘密脫敏 | 02 | 斷線補送去重、rejected/partial/unknown 可見;失去 audit 不開始 mutation |
| PR-04 | 原生 exec/files/jobsrange & binaryartifact streamingscope-aware cancel | 03 | 兩模式都能 text-only CSV 工作、0 screenshot、真 exit code、取消子程序第一個核心可交付階段 |
| PR-05 | 可安裝 Tool Manager、Computer 內 MCP連接器、版本 pingrantsOAuth brokerhot reload | 04 | 本機 sample MCP 實際安裝可用;共用套件不共享帳號;更新回滾不重啟整台 Computer |
| PR-06 | per-step capability router、少量 schemas、milestone verifierwatchdog有界恢復 | 05 | wait 不算進度、無 planner 套娃、policy denied 不繞路、未知副作用先讀回 |
| PR-07 | Browser sessionprofiledisplay leases、form macro、人類接管与恢復 | 06 | 同 display 排他、不同 display 可並行;接管 A 不凍結無衝突 Bresume 不重做 |
| PR-08A | Gmail labels adapter 作業務基準;沿用第 11 節 | 07 | fixture 預覽核准applyread-back衝突測試不操作主信箱 |
| PR-08B | **Outlook 外掛作擴充性驗收**;走第 20 節安裝契約與 Graph adapter | 05業務 E2E 需 07 | 不改核心 dispatch 也能載入外掛read/categories/分頁/batch/401/429/共用模式授權測試 |
| PR-09 | DisplayBackend 介面TigerVNC Xvnc 候選+舊 backend rollback第 19 節 | 02/03 可先開始;整合 gate 需 07 | Cua/AT-SPI/X11/中文/多 display/noVNC 相容benchmark 不退步才考慮 default |
| PR-10 | 雙模式原地升級、完整測試效能與部署文件rollout | 08A/08B/09 | 第 1 節契約與第 16 節測試有證據Outlook 真實帳號或 GUI 缺環境須明確 blocked |
| PR-11可選 | Playwright worker 對照SelkiesXpraWayland 分別另開 ADR | 核心不需等待 | 一次只換一層、無證據不採用;不能為完成清單全部安裝 |
每個 PR 可以拆小但不可依賴尚不存在的安全邊界就先打開高權限工具。PR-04 的必要 job cancelaudit 不拖到 PR-07。PR-05 即使外部 OAuth 不可用,也必須能安裝並執行本機測試 MCP證明「外部工具能加入」不是只有 UI。
### 15.1 Coding agent 執行方式
先建立進度檔,以 `NOT_STARTED / IMPLEMENTED / PARTIAL / BLOCKED_EXTERNAL / VERIFIED / DEFERRED` 表示真實狀態。先完成 PR-00/01 的程式與測試,再依 DAG 推進;不是再交一份更長的計劃。
逐項更新第 18 節的 O01O48採用保留現況實驗延期阻礙、實際 diff、測試命令與結果。標「已實作」不等於「已驗收」。有互斥候選時只實作滿足目標的最小方案不能同時把所有替代框架塞進主線。
---
## 16. 最小測試矩陣與 Definition of Done
| Test ID | 場景 | 必須證明 |
|---|---|---|
| T01 | vision × Changed/Similar/Identical | image 交付真值表正確 |
| T02 | 首次畫面換模型壓縮歷史takeover resume | 未變但模型沒看過的圖仍交付 |
| T03 | 純文字模型 DOMnative tool | 可用語意工具、不收到圖、不猜座標 |
| T04 | selector unsupportedstaledisabled | 正確錯誤、有限恢復、無盲點 |
| T05 | private A/B 同路徑與 shared A/B 相同相對路徑 | 私人互隔離;共用 own workspace 不誤取shared/ 依授權真共享 |
| T06 | 偽造 bot/computer/grant/generation | API 及 Runner 都拒絕 |
| T07 | host sentinelDocker socket管理 API | task 不可讀取或操作 |
| T08 | `..`symlink race奇異 Unicode 檔名 | 不逃逸/不 command injection |
| T09 | binary 含無效 UTF-8 與 1 MiB 檔案 | byte-for-byte 正確 |
| T10 | 權限不足磁碟滿HTTP 403解析失敗 | 不回空成功 |
| T11 | 同檔並寫、expected hash 不符 | conflict 而非覆蓋 |
| T12 | stdout/stderr非零退出signal | 真實程序狀態 |
| T13 | timeout子程序cancel 競爭 | 停止程序樹,誠實回 pending/unknown |
| T14 | API restartRunner reconnect | 原 job 不重做、output cursor 可續 |
| T15 | container recreation | generation 失效,舊 job 不假裝存活 |
| T16 | 同 operation 重送/相同 ID 不同 args | 去重;不同 payload 被拒絕 |
| T17 | central DB/網路中斷 | durable outbox 最終補送,不重做副作用 |
| T18 | journal 不可寫quota 用盡 | 不開始新的 untracked mutation |
| T19 | 同名 MCP慢 server | namespacing 正確,沒有全域 await lock |
| T20 | token revokedwrong accountgrant expiry | 停止並回 NEEDS_AUTHdenied |
| T21 | secret canary 在成功及 exception 路徑 | prompt/log/checkpoint/UI 無 secret |
| T22 | website/email/MCP prompt injection | 不把外部內容當授權與工具指令 |
| T23 | 同一 page 的 Cuabrowser worker | mutation 排他refs 不混用 |
| T24 | takeover 時 background jobHTTP in flight | barrier 真實,顯示未確定效果 |
| T25 | screenshot clock重複 wait | 不刷新 milestone、不無限 loop |
| T26 | fake Gmail paginationbatch limits | 沒漏信、label 組合分批正確 |
| T27 | Gmail response lost429partial verify | bounded retry、read-back、如實 partial |
| T28 | Gmail concurrent same-label changeundo | conflict-aware不宣稱無損無條件撤銷 |
| T29 | 兩模式原地升級;使用者要求模式切換的 dry-run | shared 不被強制拆開原資料profile排程保留 |
| T30 | noVNC 關閉desktop 未啟動 | native 工作仍完成且有紀錄 |
| T31 | 兩 agent多 run 壓力 | 可量測並行、資源受控、結果不交叉 |
| T32 | 分類測試集含模糊郵件 | precision/recall/coverage/abstention 全部報告 |
| T33 | arbitrary exec 讀 broker env/socket/journal | 保護區不可見,不靠 prompt 擋 |
| T34 | UI download/附件串流 | 不使用 API host 暫存任務檔案 |
| T35 | 取消後 resume | 已驗證操作不重播grant/ref 重新檢查 |
| T36 | 所有 aliasesnative/MCP/browser 入口 | 都經統一 policy、operation、audit |
| T37 | 建立/恢復 shared 與 private agent | 兩模式維持原選擇shared 允許多 assignment不誤套 UNIQUE |
| T38 | shared A/B own workspace 相同檔名 | 透過受控 fs/exec context 正確命中,不因 cwd singleton 混用 |
| T39 | shared/ 同一檔案協作與未授權會員 | 成員獲准則可見;同檔 CAS/conflict未授權工具請求被拒 |
| T40 | Team 不同 DISPLAY 的兩個 browser writer | 可並行profile、DBus、AT-SPI、Cua socket 與截圖不串台 |
| T41 | 同一 DISPLAYprofile 的 browser/Cua/人類 | 排他 writer 與 server-side control epoch有界排隊 |
| T42 | 暫停/接管 shared agent A | 無衝突 B 的 native/job/display 不被凍結A 不再派送 |
| T43 | 整台 Team pauserecreate | 所有 members/jobs 被追蹤;無假暫停/孤兒 writer |
| T44 | 兩 agent 同時首次 provisionensure screen | single-flight、slot 配置唯一、只有一個合法 instance |
| T45 | 刪除 Team 的一位成員 | 其他人的 Computershared filespackagejobs 不被刪 |
| T46 | 本機測試 MCP 匯入+實際安裝+執行 | 安裝程序和 bytes 在 Computer有版本hashaudit |
| T47 | 共用安裝包+不同 agent 帳號 grant | 只重用唯讀程式;未授權 agent 無 broker tokentool capability |
| T48 | 錯誤 digest路徑逃逸擴權 manifest | 啟用前拒絕existing tool 不受影響,套件 hooks 無無界權限 |
| T49 | 安裝新版本時有 active jobs | active pin 舊版、新 run 用驗證新版;可 rollback、不全機 restart |
| T50 | 移除/撤銷一個 connector binding | 只停止相應授權;共用套件/其他 agent bindings 仍運作 |
| T51 | Outlook fake messages/categories adapter | 安裝後能 read/preview/apply/verify未授權 send/delete 不可用 |
| T52 | Graph $batch HTTP 200 但子項 429/401/5xx | 逐子項結果Retry-After未知 read-back不全批重做 |
| T53 | Outlook nextLink/deltaLinktoken revoke | 完整分頁delta 依 folder 綁定,失效需安全重同步/授權 |
| T54 | Outlook categories 並行修改/未支援 If-Match | 不假稱 CAS偵測可見衝突、回報限制不盲覆蓋 |
| T55 | TigerVNC Xvnc × Cua × XFCE fixture | 截圖XTESTAT-SPI中文鍵鼠clipboard視窗辨識通過 |
| T56 | X server restartbackend 切換 | 舊 refs、display epoch 失效;既有 GUI sessions 不宣稱無縫存活 |
| T57 | slot 0/1 的 DISPLAY 與 VNC port | 明確保留 :1→5900:2→5901 對應,不依 Xvnc 預設推算 |
| T58 | noVNC CSS scalingresize高 DPI | 座標 transform實際尺寸正確、文字可讀不拿 viewer 有損畫面做驗證 |
| T59 | 未授權 VNC keyboard/resize/clipboard | 伺服器拒絕;不只靠客戶端 viewOnlyXauthority 配置驗證 |
| T60 | 無人觀看、VNC proxy 未啟動 | native 與必要 browser 工作仍可做;不被 viewer readiness 阻塞 |
| T61 | 第三方 MCP 僅能接受 env token | 明確 trust review保護 process env不能保護就拒絕敏感注入 |
| T62 | shared 同 UID 無界 shell 的 threat model | 不把目錄 scopetool annotations 宣稱強隔離core secrets 不可讀 |
| T63 | 慢 agent資源不足renderer crash | 公平隊列/總配額;不因 A 閒置或 OOM 自動破壞 B 狀態 |
| T64 | Computer recreation 後套件與 artifact | manifest 可重建persistent artifact 校驗後可取;不重用舊 jobs |
測試層次unit → fake Runnerfake modelfake SaaS → disposable real Computer integration → explicit opt-in external account/model E2E。fixture 真實 GUI 測試無 display 時標 blocked不改成假 assertions。
第一輪先從 repository 查實際工具鏈與 scripts。可用時執行
```bash
cargo fmt --all -- --check
cargo clippy --workspace --all-targets -- -D warnings
cargo test --workspace
```
前端依 `apps/web/package.json` 已存在 scripts 跑 typecheck/build/tests不要宣稱不存在的 npmMake target 已通過。需要的 `test-agent-computer`、`bench-agent-computer` 等新入口必須在此實作中真的加入。
### 16.1 全案完成的最低定義
- shared Computer 上 A/B 協作、private Computer 上 C 獨立,兩模式關閉桌面仍可做工具工作。
- 檔案、exec、MCP、connector 在正確 Computer不存在 host task fallback。
- API工具UI 的成功、失敗、partial、unknown、cancel、needs_auth 語意一致。
- Activity 看得到操作摘要、結果、耗時、電腦、jobartifact 與驗證。
- 原生檔案/命令能由 text-only 模型完成且不產生截圖。
- Cua 仍可處理必要桌面操作;語意和視覺工具的 boundary 正確。
- Gmail 與 Outlook fixture 預覽→核准→套用→驗證完成Outlook 走可安裝外掛契約;外部帳號測試誠實標示。
- 核准、secret、timeout、並行、接管、重啟與撤銷都有測試不以功能展示代替。
- TigerVNC 以候選 backend 通過兩模式相容性readinessnoVNC 測試;是否切為預設依結果,不宣稱保證提速。
- 外部 MCP 安裝、授權、更新、撤銷、移除可在 UI/API 操作active job 不被靜默換版本。
- O01O48 逐項有 disposition理由證據P2/P3 可有合理延期,不要求全部換掉。
- 實際 benchmark 附環境與成功率;沒有未測的速度倍數或「全網站皆可操作」宣稱。
---
## 17. Coding agent 的交付格式與停止點
每個 PR 更新 `docs/agent-computer-progress.md`
```markdown
## PR-XX名稱
狀態IMPLEMENTED / PARTIAL / BLOCKED_EXTERNAL
基準 commit...
修改檔案與設計差異:...
新增/修改測試:...
實際執行命令與結果:...
未執行測試及原因:...
效能結果與樣本數:...
安全相容性雙模式migration 影響:...
對應 OxxTxx 與 disposition...
回滾方式:...
下一個可執行步驟:...
```
不要把「已寫測試」與「已執行且通過」混為一談。不要透過刪測試、跳過 auth、放大 retry budget、強制 vision 或把未知效果標成功來完成 gate。
沒有外部憑證時完成內部必要範圍,精確列出 integration blocker不向聊天索取密碼。沒有使用者授權不對真實信箱做寫入、不刪除 legacy 資料、不正式部署或 force push。
需要決策但沒有資料時,選擇符合本文件不變條件的最小改動;只有不可逆資料遷移/真實帳號核准等真正需要使用者的步驟才暫停。不要因架構工作較大就只交另一份計劃。
---
## 18. 逐項改善清單48 項,不等於 48 項全部替換
P0正確性產品邊界P1核心交付P2量測後採用P3可選延後。以下是本案的待辦與候選沒有實測提速倍數。每項在進度檔有 disposition、證據和回滾已存在的優化要標「保留」不要再次算成新成果。
### A. 原生執行與工作流程
| ID | 項目 | 優先級 | 具體改動 | 要改善的問題 | 驗收/限制 |
|---|---|---|---|---|---|
| O01 | 修正新圖交付 | P0必做 | 修反轉條件,分 captured/delivered接管換模型強制交付 | 無圖硬做造成的錯誤與重試 | 真值表+模型 request fixture[R1] |
| O02 | 原生 exec | P1必做 | 命令在綁定 Computer 執行,直接取 stdout/stderr/exit | 消除終端機打字與讀圖 | 兩模式 text-only 命令 0 screenshot |
| O03 | 原生 files | P1必做 | 重用並強化 SandboxProvider不透過 sed 畫面讀檔 | 減少回合/避免 binary 毀損 | range、Unicode、binary、shared 路徑;[R2R4] |
| O04 | 持續 jobs 與 PTY | P1必做 | 短命令直接返回,長作業由 Runner 管理、事件通知/真取消 | 不請 LLM 反覆看是否做完 | API 重啟可追 jobprocess-tree cancel |
| O05 | 批次程序form macro | P1必做 | 已知步驟在受控 executor 內完成,有 pre/post checks | 不逐列/逐 click 呼叫模型 | 每個子動作有 trace失敗即停 |
| O06 | 套件/連線常駐 | P1必做 | 暖 MCP instance、HTTP pooling、版本化 cache | 降低啟動與重複連線成本 | warm/cold 分測;不共享私人 env |
| O07 | 穩定 Runner transport | P2量測 | 優先現有安全 transport高 overhead 才改持續 UDS/HTTP 通道 | 減少每次 docker exec 的啟動成本 | 實測 RPC 分解;不能公開 root socket |
| O08 | readiness 分層 | P1必做 | Runner、browser、desktop、viewer 各自 ready按需啟動 | 讀 CSV 不先等整個桌面 | no viewer/no desktop 的 native fixture |
### B. 模型與瀏覽器
| ID | 項目 | 優先級 | 具體改動 | 要改善的問題 | 驗收/限制 |
|---|---|---|---|---|---|
| O09 | 按能力路由 | P1必做 | 原生/已授權 API 優先DOM 次之,必要時視覺 | 避免 GmailOutlook 走慢 UI | route rationale權限拒絕不繞過 |
| O10 | 工具 schema 按需載入 | P1必做 | 僅帶此 run 可用能力版本grant cache | 縮短 context、避免選錯工具 | revoke 後立即失效;記 schema tokens |
| O11 | 簡單任務不加 planner | P1必做 | 用既有一輪決策,複雜任務才 TaskPlan | 避免多 agentplanner 套娃 | 記模型回合、TTFT、正確完成 |
| O12 | 條件等待 | P1必做 | wait_untiljob events 有 deadline替代固定 sleep | 消除空等與毫無進度輪詢 | 未知 disabled 原因不無限等 |
| O13 | DOM snapshot 限量與增量 | P2量測 | 聚焦相關區域revision 與失效 refs 完整處理 | 減少重傳巨大 page text | 錯 revision 回 full不能漏關鍵元素 |
| O14 | agent 圖片和 viewer 串流分離 | P1必做 | 高可讀截圖按需取,不把 VNC frame 全塞模型 | 減少模型圖片成本且維持辨識 | 縮放映射force image小字 fixture |
| O15 | 既有 browser/session 穩定 attach | P1必做 | profile/tab/frame 明確綁定,禁止亂開替代瀏覽器 | 減少重登入與 stale reference | 同 profile 不雙開;重啟正確失效 |
| O16 | 驗證、有限恢復與模型升級 | P1必做 | 進度看 milestone兩次同義錯誤換策略難題才升級模型 | 停止二十分鐘空轉 | 未知副作用先讀回;無固定提速保證 |
### C. 顯示與遠端桌面
| ID | 項目 | 優先級 | 具體改動 | 要改善的問題 | 驗收/限制 |
|---|---|---|---|---|---|
| O17 | Xvfb+x11vnc → TigerVNC Xvnc | P2必做候選測試 | 一個 backend 同時提供 X server 與 VNC保留 rollback | 可能減少顯示匯出層與維護負擔 | Cuaa11y中文字多 displayCPU/latency[E5] |
| O18 | Xvfb+x0vncserver 備選 | P3保留替代 | 只換 VNC 匯出層,不替換 X server | Xvnc 相容性卡住時較小改動 | 不能說已移除 Xvfb[E6] |
| O19 | 檢查 -noxdamage | P2對照 | 現有 x11vnc 關閉 XDamage測啟用是否有重繪瑕疵 | 判斷掃描負擔能否降低 | 靜態/捲動/遮擋/影片測試;不可直接刪旗標;[R9] |
| O20 | noVNC/websockify 與畫質檔 | P2調校 | 先保留viewer FPS/壓縮可調,無 viewer 減少服務負載 | 改善觀看/頻寬,不假稱模型更快 | 文字清晰、輸入延遲、resize、proxy auth[E7] |
| O21 | 精簡桌面而非先換 OS | P2調校 | 保留 XFCE/a11y已 compositor=off評估不必要 autostart | 降低多 slot CPU/RAM | 不重做既有優化;不破壞 DBus/a11y[R9] |
| O22 | Selkies 替代 viewer | P3可選 | 有高幀率/音訊需求才測;目前有 WebSocket 與選用 WebRTC | 影音觀看可能較適合 | 硬體 encoder 實測、網路與前端成本;[E8] |
| O23 | Xpra 替代 viewer | P3可選 | 需要單視窗發布session forwarding 時測 | 另一路 remote app 體驗 | 非 noVNC drop-in額外 client/輸入整合;[E9] |
| O24 | Wayland全面換桌面 | P3延後 | 保留 X11 driver 路徑,未有需求不全面搬遷 | 避免同時引入 capture/input 相容性變動 | 獨立 ADR/fixtures不是目前速度主解法 |
### D. 共用/私人與資源協調
| ID | 項目 | 優先級 | 具體改動 | 要改善的問題 | 驗收/限制 |
|---|---|---|---|---|---|
| O25 | 雙模式正式保留 | P0必做 | shared 多 bot→同 Computerprivate 排他;不強制遷移 | 符合產品且避免破壞資料 | assignment/member/slot/重建測試 |
| O26 | 按 display檔案account 鎖 | P1必做 | 同資源排他、不同 display 與受控 job 並行 | 避免共用主機整機串行 | Cua/DOM/human 同鎖canonical shared key |
| O27 | scope-aware pause | P1必做 | 接管 A、接管 display、暫停整機分開 | B 不被 A 的無關操作凍結 | 真 barrierfencingHTTP unknown 誠實顯示 |
| O28 | 共享 lifecyclesingle-flight | P1必做 | 啟動、刪除、idle reaper 看全部 member/jobs | 避免重複建立與誤停他人工作 | member refcount、job/viewer 活性聚合 |
| O29 | 程式共享與帳號授權分離 | P0必做 | 共享唯讀 packageper-agent runtime/bindings/grants | 省重複安裝、不共享私人帳號 | 未知程式不能靠 annotations 保證安全 |
| O30 | 公平排程與總配額 | P1必做 | 每 agentComputer 的 CPU/RAM/jobs/requests 有界 | 抑制單 agent 拖慢所有人 | 壓力/OOM/慢 MCP不無界並行 |
| O31 | Chromium /dev/shm 與程序回收 | P2量測 | 調 per-Computer shm、init/reaper、renderer 健康 | 減少可避免的崩潰與孤兒程序 | 不能盲開 ipc=host/SYS_ADMIN/no-sandbox[E10] |
| O32 | X11/DBus/profile 權限與 session | P1必做 | per-slot identity評估 Xauthority系統安裝有管理鎖 | 避免串台與共用 session 風險 | 同 UID 非強隔離Xvnc :1 port 對應測試 |
### E. 可安裝外部工具Outlook
| ID | 項目 | 優先級 | 具體改動 | 要改善的問題 | 驗收/限制 |
|---|---|---|---|---|---|
| O33 | Tool Manager 安裝入口 | P1必做 | catalog、manifest受控 package URL、本地上傳三種入口 | 新增工具不改核心 dispatch | 實際 sample MCP 安裝,不只是設定畫面 |
| O34 | 來源版本與完整性 | P1必做 | pin digest/version審核 hooks安全解壓與 quota | 更新可重現、防無界安裝 | 拒絕未審核 URL、路徑逃逸、錯 digest |
| O35 | 安裝/啟動/認證/授權分開 | P1必做 | 每階段顯示狀態、failure reason 和 scope | 不再「裝好了卻不能用」 | installed ≠ connected ≠ authenticated ≠ authorized |
| O36 | 熱啟用與 registry 更新 | P1必做 | health/schema 驗證原子登錄能力grant 撤銷失效 | 不為加工具重啟整個 LazyBoy | 正在執行 run 的能力版本與安全點更新 |
| O37 | 版本更新/回滾/移除 | P1必做 | 新版本旁置active job pin 舊版bindings/reference GC | 共用主機其他 agent 不受破壞 | 新增權限重新核准;共享套件引用仍存活 |
| O38 | OAuthtoken broker | P1必做 | Microsoft/Google 正規授權scoped token、refresh single-flight | 減少重登入與憑證混用 | MFA/admin policy 正常接管secret canary[E11] |
| O39 | Outlook Graph 外掛 | P1必做驗收 | 讀信→categories preview/apply/verify寄信另授權 | 驗證架構不只 Gmail 特判 | 個人/工作帳號對應 scopes[E12E14] |
| O40 | Outlook 批次/增量同步 | P1/P2 | Graph 20 子請求/逐項狀態;需要時 folder delta | 減少網路回合及每次全信箱掃描 | 429/Retry-After/分頁/ImmutableId[E15E18] |
### F. 正確性、紀錄與可維護性
| ID | 項目 | 優先級 | 具體改動 | 要改善的問題 | 驗收/限制 |
|---|---|---|---|---|---|
| O41 | operation journal/outbox | P0/P1 | 副作用前記 intent斷線 durable 補送與去重 | 避免掉紀錄與重做工作 | journal 故障不開始 mutation |
| O42 | 活動紀錄串流而非桌面演出 | P1必做 | 工具與 job 的結構化事件、實際耗時/結果 | 人可追查、不逼每步打字 | noVNC 關閉仍可看進度 |
| O43 | artifact 存 Computer脫敏 | P1必做 | 全文输出在 ComputerAPI 存摘要/reference限量保留 | 避免 DB/context 被圖片/日誌塞滿 | secret/大檔/retention/串流授權測試 |
| O44 | Task 驗證與郵件分類品質 | P1必做 | API 200 不等於任務完成;測 precision/coverage/abstention | 速度與正確性一起看 | read-back真實 fixture、失敗也計入 |
| O45 | 衝突與冪等/未知效果 | P1必做 | 同 operation 不重做same-file CAS未知 API 先回讀 | 降低重送/覆蓋/重複外部副作用 | 不假稱通用 exactly-once無損 undo |
| O46 | 部件健康與版本相容矩陣 | P1/P2 | Runner/display/Cua/browser/plugin 個別 probe/recover | 失敗不用重啟整台 Computer | 不影響其他成員pin 上游版本 |
| O47 | 已驗證 skill流程重用 | P2後續 | 將常用流程保存語意步驟與 checks環境變更可失效 | 降低每次從零探索 | 不保存密碼舊座標profile/版本變更重驗 |
| O48 | 端到端viewer 雙 benchmark | P1必做 | 分模型、工具、snapshot、queue、viewer固定環境兩模式 | 找真瓶頸,不憑工具名字換底層 | 成功率/median/P95/CPU/RAM/可讀性;一項一改 |
---
## 19. TigerVNC 與桌面後端:實作規格
### 19.1 明確的兩條路
**候選 AXvnc 取代 Xvfb+x11vnc。** TigerVNC 的 Xvnc 同時提供 X server 與 VNC server [E5]。此案希望減少虛擬顯示再由另一程序匯出的層次;收益是待測假設,不保證 agent 推理更快。
**候選 B保留 Xvfb只用 x0vncserver 取代 x11vnc。** x0vncserver 是匯出既有 X display不建立新的 display [E6]。它不是「Xvfb 一起換掉」。只有候選 A 遇相容性阻礙時再測 B避免一次三套都當主線。
noVNC 是 viewerwebsockify 是 WebSocket 到 VNC 的橋接。換 Xvnc 不代表可以直接刪掉這兩層;第一版保留既有 authenticated screen proxy 與 noVNC UI [E7]。
### 19.2 原始碼落點
- `image/computer/Dockerfile`:加入發行版可用且 pin 的 TigerVNC 套件,保留 baseline fallback。安裝後記錄實際 binary 名稱/版本(不同套件可能叫 Xvnc 或 Xtigervnc不是假設名字一定相同。
- `image/computer/lazyboy-screen`:將 start_xvfb/start_vnc 抽成 DisplayBackend沿用 ensure_slot 和 per-slot identitylocking。保留顏色、中文、DBusAT-SPI、Cua socket、profile、日誌。
- `image/computer/start.sh``crates/controld`:分 runner/display/viewer readiness按需啟動而非工具讀檔前全部 boot。
- `crates/control/src/screen.rs`supervisor保留 slot→display/view port 契約,增加 backend/session epoch 與 capabilities。实际檔案函式存在與否先核對不盲插模板。
- `screen_proxy.rs`noVNC UI保留 server-side authmembership/control lease、斷線恢復與鍵鼠權限不要只有 viewOnly 前端旗標。
### 19.3 最容易踩錯的地方
1. 基準 slot 0 是 DISPLAY `:1`、RFB `5900`、web `6080`slot 1 是 `:2`、`5901`、`6081`。Xvnc 常用預設是 5900+display-number**不得拿預設值默默改掉既有對應**;明確設定 rfbport寫契約測試 [R9][E5]。
2. 每 slot 的 X11、Cua、DBus、AT-SPI、XDG_RUNTIME_DIR 與 browser profile 一起綁定,不用全域可變 DISPLAY。不能以「共用主機」為由退回所有 agent 同一滑鼠。
3. Cua 的 X11 截圖輸入、XTEST、RANDR、clipboard、視窗 enumerations 需要在選定套件實際 probeAT-SPI 是桌面/應用和 bus 的能力,不是 Xvnc 自動提供。
4. 先固定現有 1280×80024-bit 並保持一致 DPIscale避免把 backend 差異和解析度差異混在 benchmark。viewer 可 CSS fit但座標需轉成實際 display pixelsresize 成功後 invalidate refs。
5. human viewer 的有損壓縮FPS 調整不能降低 agent 驗證圖的可讀性。模型 observation 仍由明確的高可讀 capture 路徑取得。
6. X11/RFB 僅在受控邊界可達;不裸露公網的 5900/6080/CDP。評估移除 `-ac` 需要同步實作 Xauthority/client credentials不能只删旗標導致 Cua 壞掉。
7. 現有 `-noxdamage` 可能是舊相容性 workaround只有在重繪 fixture 過關後才能改。`xfwm4 --compositor=off` 已經存在,不能重複列提速成果 [R9]。
8. Xvnc 是 X server殺掉它就會中斷使用它的 X clients無 viewer 時可以停/降頻 viewer bridge但不能因此殺死仍在工作的 display。stop/recreate/backend 切換需受控停止點,**不是無縫熱切 X server**。
9. 清理 stale pidfileX lockChromium SingletonLock 前先確認對應程序與 profile ownership不以 pgrep 字串近似或一律 rm lock 把活躍 session 搞壞。
10. 大版本更換仍可能影響 Unicode clipboard、快捷鍵、drag、輸入焦點測手機桌面 reconnect、human takeover、雙 viewer read-only 與 writer。
### 19.4 對照測試與採用門檻
固定模型、任務、容器資源、Cua/Chromium/noVNC 版本、screen size 與 LAN/WAN 條件。至少含空桌面、靜態網頁、捲動、輸入表單、對話框、影片、兩個 Team displays 同時操作。
分開量測:
- **Agent path**model time、工具時間、Cua snapshot latency、action→verified effect、完成率、重試數。
- **Viewer path**input-to-present latency、frame update interval、重繪完整性、小字可讀性、reconnect、網路 bytes。
- **資源**:每 display整台 Computer CPU、RSS、程序數有 viewer 與無 viewer 各測。
硬 gate 是既有 GUI輸入a11y 正確性不退步,不能用更模糊畫面換好看的 FPS。採用預設前提出量測理由只有 viewer 變順時,報告 viewer 改善,不宣稱整個 agent 任務提速。無 GUI 環境則標 BLOCKED_EXTERNAL 並保留 baseline default。
### 19.5 不建議同時改的東西
Selkies、Xpra、Wayland、換整個 Linux 發行版是不同級別的變更。Selkies 目前官方文件列 WebSocket 為預設、WebRTC 為選用,不能只照舊 README 說一定需要 WebRTC/TURN硬體編碼可用與否也要 probe [E8]。Xpra 有自己的 HTML5/session forwarding 架構,不是改一個 VNC executable 就完成 [E9]。沒有影音/單應用發布需求時,先保留 noVNC。
---
## 20. 可安裝外部工具Tool Manager 與擴充契約
### 20.1 三種形式與真正的執行位置
| 形式 | 實作方式 | 限制 |
|---|---|---|
| stdio MCP | Computer 內啟動經審查的 Node/Python/Rust executablegeneric MCP adapter 載入 schemas | MCP package 可執行程式;固定版本與 runtime grantsAPI 不 spawn |
| CLI自製本機工具 | 套件裝在 Computermanifest 把 argv/stdin/stdout/schema 接到受控 executor | 不能直接把任意 shell 字串當受信任 metadatabinary 必須在 scope 中 |
| HTTP MCPSaaS connector | client 在 Computer呼叫批准的外部服務artifact/download 落在 Computer | remote MCP server 仍在遠端不能外包本機任務檔案處理code execution |
普通 REST SDK 不會自動變成 agent tool需要一層 adapterMCP servermanifest wrapper。完成通用載入後新 MCP 不應每次修改 Rust 核心 dispatch新 provider 的特殊 API 語意仍可能需要寫 adapter。
先支援手動來源與小型內建 catalog不以「先蓋完整 marketplace」阻擋交付。來源可為受控 manifest URL、上傳套件、已知 catalog下載與解包在指定 Computer。公開 registry 只協助 discovery不等於套件已審核安全。
### 20.2 必須分開的四個層次
```text
Package程式、來源、版本、hash、相依
Installation安裝在哪個 Computer、狀態、可重建資料
Binding哪個 agent 可以看見/呼叫哪些 capabilities
Connection哪個真實帳號、OAuthsecret grant、允許操作
```
shared Computer 可以一份唯讀 package 供 A/B 用A 的 Outlook grant 不會因此授給 B。相同套件可有兩個私人 server instances設定。shared/ 是否可讀寫另外核准,不因已安裝就自動全開。
### 20.3 安裝與啟用流程
1. **選來源與目標**:顯示 shared/private Computer、受影響 agent、package publisher、版本、雜湊、平台CPU 架構需求。
2. **驗 manifest**schema version、entrypoint、dependency lock、network/service domains、filesystem scope、工具名衝突、requested permissions。
3. **核准安裝**:套件程式執行與資料存取風險分開。不能由模型、網頁、郵件或外掛自己的提示自動授權。
4. **Computer 內 staging install**versioned 目錄、受限網路CPU磁碟、safe archive extraction防 traversal/symlink/hardlink 逃逸和解壓炸彈package install hooks 同樣受控。
5. **健康/契約測試**啟動、tools/list、schema validation、read-only mock call、version/compatibility。不能在 healthcheck 時默默寄信或修改真實帳號。
6. **登錄 registry**:安裝及 schema 成功後原子啟用 binding。顯示 INSTALLEDCONNECTEDAUTH_REQUIREDREADYDEGRADED不用單一「成功」。
7. **使用者 OAuth**:核對 account/tenant/scopes同意後 token 保存在 broker 保護區,模型只見 opaque handle新增寫入權限再核准。
8. **實際測試與紀錄**:每次 tool call 綁 agent/computer/package version/account透過統一 policy/audit/result外掛失敗不讓整個 harness 崩潰。
工具入站權限、網路 egress 與 OS sandbox 由 host/runtime 強制;不能信 MCP annotations 的 `readOnlyHint` 就斷定沒有副作用 [E19E20]。支援標準 MCP 不等於支援任意 auth 形態HTTP OAuth discovery/PKCE 與 stdio 的本機憑證配置是不同流程;不把標示 SSE 的 server 當成一定可用 Streamable HTTP按 negotiated transport 實测 [E20]。
### 20.4 狀態、更新與安全點
安裝狀態與連線狀態分開:`PENDING_APPROVAL → INSTALLING → INSTALLED`instance 為 `STARTING → CONNECTED → AUTH_REQUIRED/AUTHENTICATED → READY/DEGRADED/DISABLED`。可用性是 installed + compatible + healthy + grant + account不只 process alive。
更新採 staging → contract tests → permission diff → atomic activation。當前 operation 和長 job pin `package_digest + schema_version + connection`;新 run 才用新版,或在明確安全點重取 registry。外掛的 scope 變大或 tool schema 有 breaking change 要重新核准,不能默默延用舊 grant。
移除先撤銷 binding、阻止新呼叫、drain/cancel 對應 instance其他 agent 使用的 package 不刪。若外掛持有 token僅停止 process 不代表遠端 token 已撤銷;提供 provider logout/revoke 流程和殘留風險說明。
一般 user-space plugin 安裝/更新不重建 API image、不重啟整台 Computer。系統 package顯示 driver需 root 的改動另外走管理核准和 maintenance barriershared 時顯示全部受影響成員。
### 20.5 範例 manifest設計範例不是已發佈 npm 套件)
以下示範的是 **要由 coding agent 實作/審查的本機 Outlook adapter**。空的 artifact/digest 必須拒絕安裝,不能填想像中的套件名稱或把此範例當已可直接安裝:
```yaml
manifest_version: 1
id: lazyboy.example.outlook
version: 0.0.0-example
source:
kind: reviewed_local_artifact
artifact_ref: null # 實作完成後填實際來源
sha256: null # 安裝器不可接受空 hash
runtime:
kind: stdio_mcp
execution_location: assigned_computer
entrypoint: [./outlook-adapter]
state_scope: agent_binding
installation:
supported_modes: [shared, dedicated]
share_immutable_package: true
permissions:
filesystem: [own_workspace]
shared_paths: []
network_services: [microsoft_graph, microsoft_identity]
needs_host_access: false
needs_root: false
connection:
provider: microsoft_graph
credential_delivery: broker
grant_scope: agent
capabilities:
- outlook.messages.list
- outlook.messages.read
- outlook.categories.preview
- outlook.categories.apply_plan
- outlook.categories.verify_plan
```
名稱、路徑與 manifest API 都是新設計Graph 的官方 APIOAuth 不等於存在官方同名 MCP package。第三方工具若僅接受 env token按第 10.2 節顯示權限與相容限制,不把未實作 broker 相容性藏起來。
### 20.6 MVP UI/API
UI 在 ComputerAgent 的 Tools 頁:新增來源、選安裝目標、分配 agent、連接帳號、權限摘要、測試、啟用停用、版本更新回滾移除、活動紀錄。流程可以跨頁引導不要求先設計大型商店。
建議的內部 API 職責validate manifest、install job、read installation status、create/revoke binding、start OAuth、list effective capabilities、update/rollback、remove。這些路由需新的 typed contractsauthidempotency不讓 LLM 呼叫安裝管理 API 自行批准。
Registry 改變以 event 通知 harness/UI授權撤銷立即阻止新 dispatch活躍 run 在下一安全點讀取版本化 registry。不要每回合重連全部 MCP也不要讓一次安裝把所有工具 schema 全塞入 prompt。
---
## 21. Outlook connector第一個外部擴充驗收案例
### 21.1 產品選擇與帳號範圍
建議以 **Microsoft Graph v1.0 + 使用者 delegated OAuth** 建立 Computer-local adapter將它包成通用 loader 能安裝的 MCP本機工具證明外掛模型不是只支援 built-in Gmail。個人 Outlook.com 與 Microsoft 365Exchange Online 工作/學校帳號各測;實際 tenant policy、admin consent、MFA 或授權限制正常顯示,不承諾公司帳號一定免審。
「Outlook connector」是泛稱。Power AutomateLogic Apps 的 Outlook connector 是其平台整合,不是通用 Linux binary 可直接下載進 LazyBoy [E21]。本計劃不採外部 Power Automate 作本機檔案處理或 workflow 執行的隱性替代。Outlook 桌面程式裡加入的任意 IMAP本機 Exchange 帳號,也不能由名稱就推定支援 Graph以 mailbox provider probe 為準。
### 21.2 權限逐步增加
| 階段 | 權限/範圍 | 可用行為與限制 |
|---|---|---|
| 基本郵件列表 | 評估 Mail.ReadBasic 是否足夠 | headers/基本資料不能假定包含分類所需正文preview [E14] |
| 需讀內容分類 | delegated Mail.Read 或較高已核准 scope | 只取必要欄位,必要正文才取,資料是 untrusted content |
| 修改 message categories | delegated Mail.ReadWrite | tool 層只開放 categories不因 broad scope 自動允許刪信draft 等 [E12] |
| 建立 master categories | MailboxSettings.ReadWrite | 額外權限;第一版可先用既有分類,避免未必要的 scope [E13] |
| 寄信/搬資料夾/日曆 | 另外定義 capability 與核准 | 不列為郵件分類預設權限,不自動打開 |
OAuth 採正式 authorization code + PKCE適用的受支援 auth library按 app 類型正確保護 client credentialstate/nonceredirect URI 核對;是否申請 offline_access 依 refresh 需求 [E11]。不從 browser cookie 抽 token、不讀使用者密碼、不略過 MFA。
### 21.3 端到端流程
```text
在指定 shared/private Computer 安裝 Outlook adapter
→ 對 agent 建 binding
→ 使用者授權 Microsoft 帳號
→ 檢查 mailbox/account identity 與 operation grant
→ 取指定範圍郵件、完整處理分頁
→ rule-first + model 批次分類、模糊結果留待確認
→ 產生只含 categories 變更的 immutable plan
→ 核准 plan hashaccountmessage 範圍
→ 執行 Graph 更新(有界批次)
→ 逐項讀回/驗證/記錄 changed/unchanged/failed/unknown
```
Graph 以 `PATCH /me/messages/{id}` 的 categories 屬性更新,這不是 Gmail label id 的 add/remove API [E12]。維持原有非本次變更分類,先讀當前 categories 計算目標;不要直接把固定分類陣列覆蓋其他人的分類。
對同 mailbox 使用 canonical account resource lock。若 API 支援可驗證的 conditional update需實測其 If-Match/etag 語意;**本計劃不預設 Graph message PATCH 支援通用 CAS**。若無原子比較交換,外部 Outlook 客戶端仍有競爭窗口,必須標示 best-effort、遇可見衝突停止重規劃本地 lock事後讀回不等於保證不丟失人類並行更新。
### 21.4 批次、分頁與常駐同步
- Graph JSON `$batch` **最多 20 個子請求**每個子項獨立狀態batch HTTP 200 不代表全部成功。按子項處理 401/429/5xx 與 Retry-After這與 Gmail 1,000 message IDs 的 batchModify 不同 [E15E16]。
- `$select` 僅取必要欄位;完整跟隨 server 的 `@odata.nextLink`,不自行拼接 skip把第一頁當全部 [E14]。驗證 continuation URL 仍是允許的 provider防 SSRFaccount confusion。
- 使用 `Prefer: IdType="ImmutableId"` 需在需要的每個 requestbatch 子 request 保持一致;它在同信箱移動 folder 時穩定,但跨 archive mailbox匯出再匯入仍有例外 [E17]。
- recurring sync 後續用 **每個 folder 的 message delta**,維護相應 nextLink/deltaLink不是任意 search 的全信箱通用增量游標。token 失效時有安全重同步流程 [E18]。
- pending/unknown write 先回讀,不能全批盲重送;分類 cache 需包含 mailbox/message/content version/taxonomy version不能拿另一帳號或舊內容結果套用。
- 附件下載到 Computer掃描解析資料轉換也在 Computer長期不需要的信件原文不存中央 DB。
### 21.5 必需交付
fake Graph HTTP provider、固定測試 mailbox data、範例 package build、可安裝 manifest、read/preview/apply/verify tests、shared A 有權 B 無權的測試、版本更新token 撤銷與恢復、完整 Activity 記錄。
真實 OAuth 不可用不阻擋上述內部實作,但必須將真實帳號 E2E 標 BLOCKED_EXTERNAL。不得把 fixture 的分類數字寫成真的已替使用者整理 Outlook。
---
## 附錄 A依據與查核來源
以下是本計劃使用的基準原始碼與官方規格。coding agent 必須以其開始實作時的 HEAD 核對,不盲套行號;新設計與 target 不是上游已具備的功能。
### Repository 與前次健檢
- 基準 repository`https://github.com/igs170911/LazyBoy`
- Commit`e6afa324530e19922909d4692c28fb005cc05a7a`
- [R1] 工具與截圖:`https://github.com/igs170911/LazyBoy/blob/e6afa324530e19922909d4692c28fb005cc05a7a/crates/api/src/tools.rs`
- [R2] SandboxProvider原生契約`https://github.com/igs170911/LazyBoy/blob/e6afa324530e19922909d4692c28fb005cc05a7a/crates/control/src/sandbox.rs`
- [R3] Sandbox transport檔案 bytes`https://github.com/igs170911/LazyBoy/blob/e6afa324530e19922909d4692c28fb005cc05a7a/crates/sandbox/src/docker.rs`
- [R4] Supervisor 容器內執行:`https://github.com/igs170911/LazyBoy/blob/e6afa324530e19922909d4692c28fb005cc05a7a/crates/supervisor/src/docker.rs`routes`https://github.com/igs170911/LazyBoy/blob/e6afa324530e19922909d4692c28fb005cc05a7a/crates/supervisor/src/main.rs`
- [R5] Harness loopprompt`https://github.com/igs170911/LazyBoy/blob/e6afa324530e19922909d4692c28fb005cc05a7a/crates/api/src/runs.rs`
- [R6] Browser adapter`https://github.com/igs170911/LazyBoy/blob/e6afa324530e19922909d4692c28fb005cc05a7a/crates/control/src/cua/browser.rs`
- [R7] Run policy`https://github.com/igs170911/LazyBoy/blob/e6afa324530e19922909d4692c28fb005cc05a7a/crates/harness/src/policy.rs`
- [R8] MCP`https://github.com/igs170911/LazyBoy/blob/e6afa324530e19922909d4692c28fb005cc05a7a/crates/api/src/mcp.rs`
- 前次本對話產物:`LazyBoy_Computer_Use_Healthcheck_2026-09-10.md`。本文件已包含必要內容,可獨立交付;若與舊文件的 GUI 可見性或 Team 共用假設不一致,以本文件第 01 節為準。
### 官方外部文件2026-09-10 查閱)
- [E1] Gmail batchModify最大 1,000 IDs空成功回應`https://developers.google.com/workspace/gmail/api/reference/rest/v1/users.messages/batchModify`
- [E2] Gmail OAuth scopes 與受限資料說明:`https://developers.google.com/workspace/gmail/api/auth/scopes`
- [E3] Playwright connectOverCDP現有 browser context相容性限制`https://playwright.dev/docs/api/class-browsertype`
- [E4] Docker isolation、安全邊界與 daemon 權限參考:`https://docs.docker.com/engine/security/`
Docker 容器隔離不是不需測試的安全保證應依威脅模型與官方指引配置權限、network、mounts、resource limits並以本文件的跨 Computer 測試驗證 [E4]。
### 本版新增來源2026-09-10 查閱;不是把官方支援當成 LazyBoy 已整合)
- [R9] LazyBoy display 啟動Team slotsXvfb/x11vnc/XFCE/Cua`https://github.com/igs170911/LazyBoy/blob/e6afa324530e19922909d4692c28fb005cc05a7a/image/computer/lazyboy-screen`
- [E5] TigerVNC Xvnc`https://tigervnc.org/doc/Xvnc.html`
- [E6] TigerVNC x0vncserver`https://tigervnc.org/doc/x0vncserver.html`
- [E7] noVNC 與 WebSocket proxy`https://novnc.com/info.html`
- [E8] Selkies 現行設計transportencoder`https://docs.selkies.io/design``https://selkies-project.github.io/selkies/component`
- [E9] Xpra 應用與桌面轉送HTML5`https://xpra.org/index.html`
- [E10] Playwright Docker 與 Chromium程序回收注意事項`https://playwright.dev/docs/docker`。本案不直接採測試容器常見的 host IPCSYS_ADMIN 放寬,保留產品隔離要求。
- [E11] Microsoft authorization codePKCE`https://learn.microsoft.com/en-us/entra/identity-platform/v2-oauth2-auth-code-flow`
- [E12] Graph message updatecategoriesMail.ReadWrite`https://learn.microsoft.com/en-us/graph/api/message-update?view=graph-rest-1.0`
- [E13] Graph master categories 建立MailboxSettings.ReadWrite`https://learn.microsoft.com/en-us/graph/api/outlookuser-post-mastercategories?view=graph-rest-1.0`
- [E14] Graph messages 列表/$select分頁permissions`https://learn.microsoft.com/en-us/graph/api/user-list-messages?view=graph-rest-1.0`
- [E15] Graph JSON batching20 子請求:`https://learn.microsoft.com/en-us/graph/json-batching`
- [E16] Graph throttling子請求失敗`https://learn.microsoft.com/en-us/graph/throttling`
- [E17] Outlook immutable IDs 的範圍與例外:`https://learn.microsoft.com/en-us/graph/outlook-immutable-id`
- [E18] Graph folder message delta`https://learn.microsoft.com/en-us/graph/api/message-delta?view=graph-rest-1.0`
- [E19] MCP toolsannotations 信任限制:`https://modelcontextprotocol.io/specification/2025-11-25/server/tools`
- [E20] MCP HTTP authorizationtransport`https://modelcontextprotocol.io/specification/2025-11-25/basic/authorization`
- [E21] Microsoft Office 365 Outlook 平台 connector`https://learn.microsoft.com/en-us/connectors/office365/`
研究只證明上游文件與基準程式呈現的行為;本機 Docker/GUI/企業帳號、實際效能及完整威脅邊界仍須 coding agent 按測試矩陣驗證。不存在單純換 VNC 就保證所有 agent 任務提速的證據。