这是“远程智能体工作流”系列的第五篇。
最初搭建这套远程 AI 开发环境时,我想解决一个很实际的问题:
离开 Mac 以后,怎样让本地 Codex 继续干活?
于是有了第一层方案:
手机 -> Tailscale -> SSH -> Mac -> tmux -> Codex
后来我发现,手机上的 SSH 不适合充当日常操作入口,于是又搭了一个 Telegram 控制面:
手机 -> Telegram Bot -> 本地 Codex 运行时 -> 指定代码仓库
再往后,我意识到背后还有一条更根本的原则:
放在代码仓库里,不要放在聊天里。
代码仓库必须保存持久的项目记忆。
更准确地说,它应该承载项目记忆、运行约定和反馈机制。
走到这一步,一个很自然的问题随之而来:
既然官方已经推出 Codex Mobile,自定义远程智能体工作流还有必要吗?
我的答案是:有。但理由变了。
它的价值不再只是让人远程接入 Codex。
更重要的是让 Codex 按照项目自己的方式工作。
Codex Mobile 解决了什么 链接到标题
2026 年 5 月 14 日,OpenAI 宣布在 ChatGPT 移动应用中以预览形式推出 Codex。
通过官方移动端,用户可以随时在手机上接入 Codex。按照 OpenAI 的介绍,你可以跨线程处理任务、检查输出、批准命令、切换模型、发起新任务,还能实时收到终端输出、差异内容、测试结果、截图和审批请求等更新。
OpenAI 还介绍了 Codex Relay 层:不同设备可以借此访问受信任的机器,而不必把机器直接暴露在公网中。
这一点很重要。
这意味着,远程控制中的大部分通用问题,官方产品已经解决了。
我此前试图用下面这套结构实现近似的效果:
Telegram 移动端
-> Telegram 服务器
-> 本地轮询机器人
-> Codex 运行时
现在,官方提供的架构是:
ChatGPT 移动端
-> Codex Relay
-> 受信任的机器
-> Codex 应用或运行时
对很多人来说,这才是合适的答案。
它是一体化的。
它理解 Codex 线程。
它支持审批。
它能呈现 Codex 所在机器上的实时上下文。
它还省去了大量串联各个环节的代码。
这是好事。
Telegram 机器人真正教会了我什么 链接到标题
现在回头看,Telegram 机器人不只是一件工具。
它还是控制面的原型。
为了把它做出来,我不得不拆开不同层次的问题:
- 移动端界面
- 授权
- 代码仓库选择
- 任务执行
- 运行时日志
- 会话绑定
- 审批转发
- 项目记忆
其中有些层次,显然更适合交给官方 Codex 移动端。
比如:
- 接入正在进行的 Codex 工作
- 查看线程的实时上下文
- 检查输出
- 批准命令
- 在不同线程或主机之间切换
- 让移动端界面始终贴合 Codex 的内部机制
如果官方工具能把这些事做好,我就没必要再做一遍。
不过,这个机器人也暴露了另一组问题。官方提供远程控制,并不会自动解决这些问题。
因为它们属于我为代码仓库建立的 Agent Harness。
官方应用是 Codex 的操作界面 链接到标题
Codex Mobile 为 Codex 提供了更好的操作界面。
这是它的长处。
它回答的是这些问题:
- 怎样随时接入活跃的 Codex 线程?
- 怎样用手机批准一项操作?
- 离开办公桌后,怎样检查输出?
- 怎样在受信任的机器上启动或继续工作?
对于一款通用的 Codex 移动应用,这些正是它应该解决的产品问题。
但我的工作流还要回答另一组问题:
- 每个新的智能体会话开始工作前,应该先读什么?
- 新需求怎样才能沉淀下来?
- 怎样避免智能体把聊天记录当成项目记忆?
- 怎样把工作对应到稳定的功能 ID?
- 怎样记录验证证据?
- 哪条命令可以判定代码仓库是否健康?
- 一项功能满足什么条件,才可以标记为完成?
- 一次运行中断后,怎样恢复?
这些不只是 Codex 界面需要考虑的问题。
它们属于项目自身的工作流与 Agent Harness。
自定义层变成了工作流适配层 链接到标题
我真正看重的区别在这里:
官方 Codex Mobile 是操作界面。
我的自定义系统是项目侧的工作流适配层。
操作界面帮助我使用 Codex。
工作流适配层则帮助 Codex 按照正确的方式参与项目。
也可以把它称为 Harness 适配层:它负责向 Codex 提供这个代码仓库特有的规则、记忆、检查方法和反馈闭环。
对我来说,这意味着代码仓库里仍然要保留这些文件和记录:
AGENTS.mdSPEC.mdfeature_list.jsonprogress.mdtest_plan.mdinit.shorchestrator.py- git 历史
它们规定了长期运行的智能体工作该怎样展开。
它们不是 Codex Mobile 的替代品。
它们构成了 Codex 在项目侧应当遵循的协议,也构成了 Agent Harness。
代码仓库的记忆与 Agent Harness 仍然重要 链接到标题
官方移动端控制不会改变那条核心原则:
聊天用于下达指令。
代码仓库用于保存记忆。
即使手机端体验非常出色,我也不希望项目事实只存在于某个聊天线程里。
代码仓库仍然需要承载智能体的记忆、运行约定和反馈机制。
它仍然应该回答这些问题:
- 产品原本应该做什么
- 哪些工作已经完成
- 哪些工作遇到了阻碍
- 以前失败过什么
- 哪些测试覆盖了已完成的工作
- 下一个智能体应该先读什么
- 哪条命令能够证明项目处于健康状态
移动控制越方便,这些问题反而越重要。
如果无论身在何处都能轻易发起任务,也就同样容易制造出四处分散、定义不清的工作。
代码仓库里的持久记忆和运行规则,恰好能抵消这种倾向。
它们能防止移动端的便利慢慢把工作流带偏。
我的机器人可能不再那么重要 链接到标题
Telegram 机器人以后可能不再占据中心位置。
这没什么问题。
它之所以有用,是因为它给了我这些能力:
- 无须开放公网入站访问的轮询机制
- 受约束的命令入口
- 从代码仓库白名单中选择项目
- 任务记录
- 本地日志
- Codex 会话绑定实验
- 审批转发实验
但如果官方 Codex Mobile 能更好地处理远程访问、实时上下文、审批和线程控制,我就应该把这些事交给官方工具。
我不是为了保住自定义基础设施而强行维护它。
真正应该留下的,是搭建这些基础设施时发现的工作流原则。
我会保留什么 链接到标题
即使有了 Codex Mobile,我仍然会保留:
- 代码仓库级别的智能体规则
- 能够长期留存的规格说明
- 结构化的功能清单
- 进度记录
- 验证计划
- 一条命令即可执行的健康检查
- 自动化无法覆盖实际行为时使用的人工验证清单
- 运行时状态与项目状态之间清晰的界线
- 把失败转化为更完善的代码仓库规则、脚本和检查项的反馈闭环
我还会保留这种边界明确的执行循环:
读取项目状态
选择一个工作单元
完成实现
独立验证
记录结果
提交变更
这套循环究竟由终端、Telegram、Codex Mobile 还是桌面应用触发,并没有那么重要。
重要的是,中断之后能够恢复。
哪些事情我不再想自己维护 链接到标题
下面这些东西,我更愿意不再自行维护:
- 通用移动端界面
- Codex 线程的实时呈现
- 命令审批交互
- Codex Relay
- 主机连接管理
- 模型切换界面
- 原始终端输出或差异内容的实时传输
这些属于产品界面层的问题。
由 OpenAI 在 Codex 内部解决更合适。
我的自定义层应该贴近项目本身,回答的是:
这个代码仓库应该怎样引导智能体工作?
而不是:
我该怎样重新做一个 Codex 移动客户端?
界线就在这里。
我现在如何理解这套技术栈 链接到标题
现在,我这样理解这套技术栈:
Codex 官方入口
-> 移动端、桌面端、CLI、IDE
项目工作流与 Harness 适配层
-> AGENTS.md、SPEC.md、feature_list.json、progress.md、test_plan.md、init.sh
执行循环
-> Codex、编排器、评估器、测试
持久记忆
-> 代码仓库文件与 git 历史
官方入口让人更容易接入 Codex。
工作流适配层让项目更容易接着做下去。
Agent Harness 让工作更容易验证,也更容易在实践中不断改进。
它们彼此互补。
这不是要和 Codex 竞争 链接到标题
如果得出下面这个结论,就理解错了:
既然有了官方 Codex Mobile,自定义工作流就过时了。
反过来,下面这个结论也不对:
我已经做了 Telegram 机器人,所以不需要官方应用。
更合理的理解是:
通用操作界面交给官方工具。
项目特有的连续性,交给代码仓库级别的工作流规则。
官方产品可以显著改善 Codex 的远程控制体验。
我的代码仓库工作流,则能让长期运行的智能体任务在中断后更容易恢复。
代码仓库里的 Agent Harness 还能把智能体的失败转化为更完善的项目规则、工具和检查项。
它们解决的是不同的问题。
最终形态 链接到标题
这个系列最初要解决的是终端问题。
但它没有停在那里。
整个演变过程其实是:
远程终端
-> 远程运行时
-> 移动控制面
-> 代码仓库记忆
-> Agent Harness
-> 工作流适配层
有了 Codex Mobile 以后,我最在意的依然是最后这一层。
不是因为我想重新打造一个 Codex。
而是因为我希望 Codex 在一套符合我软件开发方式的工作流里运行。
手机端可以由官方提供。
智能体可以是 Codex。
操作界面也可以不断进步。
但项目仍然需要自己的记忆、规则、验证方式和历史。
这些都应该留在代码仓库里。