E3|Cloud / Remote:云端任务不在这棵树里跑;Remote 是看本机 host
先别把 codex cloud 当成另一套 run_turn
A1 已经切开两套运行时。读到 cloud-tasks/ 的人,仍会以为这里有云端 kernel:搜 run_turn、沙箱、rollout,找不到就补一个。
判断先说清楚:chatgpt.com/codex 的 agent 在 OpenAI 隔离环境里跑,本仓库没有那份循环。 这里只有:用 ChatGPT 后端提交/查询任务、把 diff git apply 进本地、以及把 本机 app-server 暴露给手机(Remote)。额度可以跟本地共享(同一账号),Session 和沙箱政策 不能 共享。
E2 的 worktree 是本机第二份 checkout。云端沙箱是另一台 VM。Remote 更不是云——手机看的是你电脑上那条本地 Session。
1. 云端产品面:Web、GitHub、并行任务
用户看见的入口:
- 浏览器 chatgpt.com/codex:丢任务、看并行云端作业、在隔离环境里改 GitHub 仓库
- GitHub:
@codex评论、issue / PR 上的云端任务(编排 不在本仓库) - 桌面/IDE 里的 Cloud 模式(壳不在这棵树,连的是同一套云端 API)
本仓库能对上 GitHub 的,是 按 git remote 找云端 environment。env_detect.rs 从 origin 解析 owner/repo,打 .../environments/by-repo/github/{owner}/{repo}(:50-64)。注释写明:GitHub only, like VSCode。其它 host 的 git remote 不会自动变成 Codex Cloud 环境。
云端并行任务是云端调度器的事,不是本机 AgentRegistry 的并发槽(D5)。不要把 max_concurrent_threads_per_session 套到 chatgpt.com 的任务列表上。
没有「云端不在这棵树」会怎样?你会给 cloud-tasks 补 Seatbelt,或把云端 task id 拿去 codex resume。resume 读的是 CODEX_HOME/sessions 的 JSONL(B4),云端 id 对不上。
2. CLI 只做提交、查看、把 diff 带回家
codex cloud 标成 EXPERIMENTAL(cli/src/main.rs:225-227,别名 cloud-tasks)。子命令(cloud-tasks/src/cli.rs:16-27):
| 命令 | 做什么 |
|---|---|
Exec | 提交任务:prompt、--env、--attempts、--branch |
Status / List | 查云端任务 |
Diff | 看 unified diff |
Apply | 把该任务的 diff 应用到本地 |
另有顶层 codex apply <task_id>(main.rs:200-202):「把 Codex agent 产出的最新 diff 当 git apply 打进工作区」。实现:get_task → 找 PR 的 output_diff → apply_git_patch(chatgpt/src/apply_command.rs:22-74)。apply_git_patch 本身在 git-utils crate(E6 的 /diff、B5 的信任根解析用的是同一个 crate,不是三份各写各的 git 封装)。失败看 git 的 applied/skipped/conflicts。成功只打印 Successfully applied diff。
不在本地重放那次 turn,不把云端 VM 政策拷进 AskForApproval,不把云端 rollout 写入 sessions/。缝是 git diff。本地随后的审查、测试、commit,走你本机 harness。
所有云端 HTTP 都要 uses_codex_backend() 且有 account id(chatgpt_client.rs:74-81)。API Key 走不通(A1)。codex exec --ephemeral 仍是本地 runtime,只是不落盘。
没有这条缝会怎样?两种隔离模型焊在一个 Session 里:云端以为有完整 VM,本地以为你会点 Allow。只搬 diff,就是拒绝混写。
3. Remote:手机看的是本机 app-server,不是云端 kernel
codex remote-control(cli/src/main.rs:174-175)启动 带远程控制的 app-server:前台、daemon start / stop、pair 配对码(remote_control_cmd.rs:53-88)。E1 的 TUI 也可以连 RemoteAppServerEndpoint。进程模型见 G3。
这是把 已经在你机器上跑的 Session 暴露给 ChatGPT 手机端(或另一台 Codex App)。仓库、命令、插件、MCP 都在 host 上(官方 remote-connections 文档)。它不是把 turn 丢到云端沙箱。
硬前提(测试名即文档):
- ChatGPT 登录(
connect_remote_control_websocket_requires_chatgpt_auth) - sqlite StateDb(缺库直接 fail:
remote control requires sqlite state db)
API Key、ephemeral 无索引会话,配不了这条。企业托管可能禁远程控制,以当时产品为准。
E2 已拒绝在远程 workspace 上建 managed worktree:Remote 连的是 host 的 Local/worktree,不能在手机上再 git worktree add 一份假装隔离。
没有「Remote ≠ Cloud」会怎样?手机点的任务被理解成 codex cloud exec,diff 从云端 VM 回来,host 上正在编辑的文件对不上。Remote 的真相源仍是 host 的 rollout。
4. 额度共享,能力不共享
同一 ChatGPT 账号:本地 TUI 和云端任务抽同一套额度(A1)。实现完全分开:
| 本地 harness(本仓库) | 云端(闭源) | Remote | |
|---|---|---|---|
| 循环 | run_turn | 不在这棵树 | 还是 host 上的 run_turn |
| 隔离 | Seatbelt / bwrap / worktree | 云端 VM | host 的沙箱 |
| 历史 | CODEX_HOME JSONL | 云端任务存储 | host JSONL |
| 人在回路 | TUI overlay / IDE | 任务级;运行中通常不在 | 手机 UI 投 host 事件 |
| GitHub @codex | 无 | 产品编排 | 无 |
不在本仓库、不要假装能抄的: 云端 kernel、chatgpt.com UI、GitHub App 编排、云端并行队列、云端环境镜像。本仓库只有 HTTP 客户端、git apply、environment-by-repo 探测、remote-control 把 app-server 挂出去。这只 HTTP 客户端也不是 cloud-tasks 自己攒的:任务详情、状态轮询走 cloud-tasks-client,底层类型(CodeTaskDetailsResponseExt 等)来自 codex-backend-client——同一个 crate 也给 B5 的 EnterpriseManaged 配置包、C2 memories 的额度检查供数据,云端任务只是它的一种消费者。
Apps / 远程插件市场同样要 Codex 后端(A1、D2)。云端任务能用的模型档,API Key 本地路径看不见。
5. 结语:带走一句话
Cloud 是另一套闭源 runtime,本仓库只负责提交任务和把 git diff 带回家;Remote 是手机插头插在本机 app-server 上——两者都认 ChatGPT 账号,但都不是第二条 run_turn,也不是本机 worktree 的替代品。