Codex 任务机制迁移与演化方案
目标是得到可通过 Python 源码演化、且基线行为有原生对照的 Codex 任务核心。 固定参考仍为 rust-v0.147.0 / be6e8eac029b183056b7e4402879f15d2c85f61b。 本文保留阶段划分并随实施更新,不代表表中的待迁移能力已经实现;当前实现范围以源码和测试为准。
保留现有执行边界
- 固定版本文档作为版本基线;Python 候选直接在 Snapshot 中执行。
- Snapshot 包含实际执行的 Python 核心、提示词、工具定义、配置和初始 memory 资源。
- 采样、压缩、子代理、预算、记忆抽取与整合等会影响解题的决策属于核心,可以演化。
- 固定适配器负责配置映射、目录、进程、状态搬运和 Trajectory,不放入解题策略。
- 运行中产生的会话、记忆、日志和凭据放在 Snapshot 外;训练得到的记忆可在实验明确选择后成为新的版本资源。
当前 _python.py / _entry.py 已从选中副本导入核心,没有宿主核心回退。 沿用这一边界,不新增平行 Agent 层,也不改变现有 Agent/Snapshot/Trajectory 公共契约。 “精简”以移除产品入口和减少理解成本为准,不以压低代码行数或关闭原生机制为准。 Code Mode 的 JS worker 属于工具执行依赖,由 Python 核心调度;不必为了全 Python 删除这条原生路径。
实施顺序与验收
| 阶段 | 内容 | 原因与完成标准 |
|---|---|---|
| 0:固定实验条件 | 列出任务路径、feature、provider、平台、权限、初始 memory、依赖版本及各自验证状态 | 单任务与持久会话分别说明;原生默认开启但未支持的项不能隐去;相同候选重复评估从相同状态开始 |
| 1:普通任务默认路径 | shell snapshot;目标执行平台的 shell/PTY/权限行为;使用 rules 时补 execpolicy | shell snapshot 已恢复上游默认开启,后台捕获、失败回退与父子共享已迁移;平台行为需分别验证,execpolicy 仍待迁移 |
| 2:长任务与协作 | 父子代理共享 rollout budget;压缩、rollover、子代理并发/取消的组合路径 | 预算计费、提醒注入、超限终止、清理与原生一致;默认关闭的开关实现后仍沿用原生默认值 |
| 3:持久会话 | rollout 事件与状态存储、跨进程恢复、fork/rollback、旧压缩事件重放 | 重启后下一次模型输入和可观察状态与不中断执行一致;不把不可恢复的活进程或 PTY 宣称为已恢复 |
| 4:自动 memory | 原生 extraction/consolidation、任务筛选、调度与并发控制、summary 注入 | 依赖持久会话记录;对照触发及跳过条件、模型请求、读写产物和失败恢复;不能用显式笔记替代 |
| 5:扩展覆盖 | zsh fork、剩余平台、图像转换及其预算等 | 每项沿用固定上游规则并增加对照;MCP/OAuth、apps、账号与 UI 按实际实验需求安排 |
阶段 1 中应先固定实际跑 benchmark 的平台。仓库已有的 Terminal-Bench 是 Linux 任务, 因此其 Linux/Docker 真工具验收应早于长期 memory。Linux 容器内显式使用 danger-full-access 可以作为一种实验条件,但不能据此宣称 Linux 受限沙箱等价。 如果实验需要 workspace-write,对应平台的受限执行后端就是前置条件。
上游默认值可直接核对 runtime/features/src/lib.rs:shell snapshot 默认开启; memories、rollout budget、token budget 和两种 zsh fork 默认关闭。 这些能力都可以迁移,但不应为了“完整”强行同时开启,改变原生基线。 自动 memory 的生产入口位于上游 app-server,仍应追踪入口后的机制和依赖并移植到核心, 无需连同 app-server 协议和前端迁入。当前 runtime 参考闭包不含完整 writer, 实施前需在固定版本文档中补齐 writer 机制和迁移边界。 原生 writer 会跳过 ephemeral、关闭 memories 和非 root 会话,不能自行替换成每题结束后总结。
保证演化结果可比较
普通 run 可配置 memory_dir 跨运行积累显式笔记,只按 Snapshot ID 分目录不能保证公平评估。 rollout 已隔离该目录,每题从所选 Snapshot 的初始 memory 开始; 这避免了候选因评估次数更多而拥有额外记忆,混入代码演化的收益。
普通 harness 演化应让每个候选、每次重复评估使用相同的初始 memory 和任务环境。 任务内保留原生读写行为,完成后的记忆只保存为该次实验产物,不自动成为下一题的输入。 跨任务学习另设明确协议:训练阶段允许累积,测试阶段从同一冻结的训练状态派生独立副本, 不让前一测试任务产生的笔记进入下一测试任务。需要持续在线学习时,单独报告该实验结果。
除 Snapshot ID 和脱敏配置外,在实验产物中记录初始状态内容哈希、数据划分、 模型/provider/effort、预算、feature、Python/Node/shell/依赖版本、平台和权限。 这些记录留在现有实验目录,不把依赖环境和运行状态塞进 Snapshot,也不增加公共类。
验证不能只累计通过数
每项迁移先让原生行为用例在旧 Python 实现上失败,再补实现和固定源码映射。 验收分别报告:
- 版本一致性:固定 commit、资源和迁移范围在版本文档中明确记录。
- 行为对照:同一 localhost 响应序列下,比较完整模型请求、工具返回、文件、状态、用量及错误路径;仅归一化非语义字段。并发路径比较允许的顺序和因果关系。
- 实际任务效果:原生与未演化 Python 基线使用相同模型、任务、初始状态和预算,重复运行并报告逐题成功率、成本和耗时;预先约定可接受的差异与不确定性。
- 演化可执行性:修改候选核心会改变行为;save/load、rollout、update 后仍执行该候选,损坏时失败而不回退;独立 wheel 复验。
前三项用于评估未演化基线的保真程度。后代 Snapshot 的目的就是改变行为, 不要求它继续逐项等同原生;对后代保留框架契约、执行隔离和任务质量检查。 现有 localhost 回放覆盖第 2 项的部分路径,尚不能替代第 3 项,也不构成所有任务等价证明。 真实模型实验应使用明确的模型调用预算。
当前已包含任务机制清单、评估状态记录和 shell snapshot。后续依次推进父子共享预算、持久会话和自动 memory, 逐项保留来源和行为对照,便于定位机制差异。