Skip to content

fix(context): preserve async reader handles in code-mode guidance - #8155

Merged
huangruiteng merged 1 commit into
mainfrom
codex/context-read-handles-20261106
Nov 6, 2026
Merged

huangruiteng merged 1 commit into
mainfrom
codex/context-read-handles-20261106

Conversation

@loopx-agent

Copy link
Copy Markdown
Collaborator

Goal And Delivered Outcome

exec_command 尚未结束时,旧示例只回传 result.output,可能把仍在运行的读取显示为空白,并丢掉继续等待所需的句柄。失败结果也会丢失退出码。新示例在退出码为 0 时直接回传 stdout,在运行中或失败时保留完整结果,并说明用原 session_id 调用 write_stdin;外层 functions.exec 的 cell_id 则交给 functions.wait。

通用 reader、原生持久配置和压缩恢复复用同一个示例。原 capture 摘要、连续字节覆盖、身份、停止条件、恢复、准入与一次结算义务保留。意图基线是 main faab5f5c291c5359216a0f944fe63fcfbaacdedc;不改变激活默认值或生产输出限制。

Author Declaration

  • Written by: model_agent, OpenAI Codex (GPT-6 family).
  • Specification: 本 PR 复现的异步读取缺陷;无单独 RFC。遵循上述基线的 AGENTS.md、CONTRIBUTING.md 与 real-path validation 规则。
Criterion Disposition Path / evidence
pending / failed 结果保留句柄与错误状态 implemented decision_capture.py 共用示例;Node 执行三类独立结果
真实客户端继续原读取,完整交付且不重做 guard / spend implemented test_saved_context_project.py 的确定性异步 gate;真实 Codex、回环推理、隔离 SQLite
显式关闭仍不读取或创建原生缓存 implemented 同一 8 用例 harness 在不可变 main 基线与本提案均通过

Scope And Continuation

本切片交付可执行的读取指引修复。共用示例消除重复说明,沿用原有 host adapter 与 reader owner;没有新增配置或决策 owner。原生测试用 gate 阻止子进程提前结束,只有句柄到达下一次真实客户端请求后才放行,因此不依赖时间碰巧足够快。

两条旧测试误把省略参数当作关闭;它们在基线与候选均失败。本提案改为明确测试 --context-delivery off,保留原有身份、摘要与无缓存断言。共用 page/read 指引增加 212 B;相同输入、等长路径的恢复正文为 2,847 → 3,059 字符。保留原 3,100 上限的失败,仅将合成生命周期测试余量调整至 3,350,生产限制不变。

真实模型主动采用以及完整上下文成本收益仍未资格。该修复不声称更低 token、计费或整题成本。

Validation

  • Tested revision: a2e0eae208cc26ae31bbc57e1973188628490ead(相关验证在相同最终产品源码上执行)。
  • Run state: finished. Input classes: synthetic.
Check kind Result Evidence / limitation
unit passed saved projection、lifecycle、可执行示例:208 passed,11 个可选原生用例跳过;跳过不计通过
real_entrypoint / real_backend passed 实际 Codex 客户端、回环推理服务、独立 SQLite:同步、强制异步、benchmark progressive 三条路径通过;不是安装态 App 或真实模型
regression_parity passed 同一原生异步 oracle 改回旧 stdout-only 示例后在 cold read 失败;新示例完整恢复。显式 off 的同一 8 用例在 main 基线和候选均通过
static passed 定向 Ruff、diff whitespace、RFC 双语检查、diff-scoped semantic advisory、六个文件的公开边界扫描;未增加受支持的状态词汇载体
integration passed standard diff-selected premerge:6 项 direct、13 项 selected,零 blocking execution failure;保留 1 项 inherited advisory
static failed raw maintainability ratchet:既有 _admitted_interaction_next_cli_actions 超大函数;无 magnitude regression,catalog 标为 inherited advisory
manual blocked exact-scope change-quality receipt cqr_e9eadb7df3e6e61b54ed 保留上述失败,独立归因/审阅尚未资格,因此未声明 merge readiness

完整原生矩阵未跑完,仅上述三条真实客户端路径完成定向资格;完整 Python suite、安装态、Windows、Lark 与自然模型采用未验证。独立评审待进行。

Frontend / Visual Evidence

UI impact: none。现有原生 context-read / recovery 交互中的指引修复;截图与 viewport:N/A。源码与合成 fixture 验证,不声称打包或活动安装态已更新。

Type of Change

  • Bug fix
  • Test update

LoopX Area

  • Control plane (goals, todos, quota, scheduler, registry, runtime)
  • Host or runtime integration

Technical Direction

现有 context-delivery 的 caller / host 读取与恢复边界;不改变 kernel、authority、scoring 或调度策略。

Shared-authority RFC fixture impact

N/A:没有共享 authority schema、迁移或 provider routing 变更。

Boundary Checklist

  • 无私有运行状态、凭证、原始轨迹、内部链接或本机路径。
  • 未启动或复制任何 benchmark job。
  • 范围限定于复现的 reader 结果转发问题。
  • 无成对 RFC 变更;本地双语检查通过。
  • UI impact none。
  • Commit 包含 DCO sign-off。

Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>

@loopx-agent loopx-agent left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewer: model_agent; model=gpt-6.1-sol; provider=OpenAI; runtime_reported; reasoning_effort=max

Approval conclusion (author-owned PR; GitHub blocks formal self-approval)

未发现阻断当前改动的 finding;既有 raw maintainability 失败仍保留。 Reviewed head: a2e0eae208cc26ae31bbc57e1973188628490ead;immutable base: faab5f5c291c5359216a0f944fe63fcfbaacdedc。

动机 / Motivation

使用 Codex code-mode 按原 capture 继续读取时,Agent 需要保留仍在运行的 reader 句柄。 reader 尚未退出时,旧示例只转发 stdout,空输出会丢掉继续等待的 session_id;新示例保留运行中或失败的完整结果,成功退出才转发 stdout。 接收方能沿原句柄完成读取并保留错误状态,不必重跑 guard、重新准入或重复扣额。 本次只修复读取指引与其原生回归,不认证自然模型遵循、已安装 App、Windows 或完整成本收益。

code-mode 是由一段工具代码组合调用的宿主入口。这里修复的是可执行示例的结果转发,既有 shell 进程与外层工具 cell 仍各自拥有等待和完成状态;收到运行中结果不再被示例误当成完成。

改动思路 / Approach

现有 reader 和宿主结果状态已足够;一个共享表达式区分成功、运行中和失败,避免另建等待器、缓存或权限 owner。 本 PR 仅交付 code-mode 读取指引及真实客户端回归,原 capture、准入、停止和一次结算契约保持。

直接保留所有运行中/失败元数据,能同时保存 session_id、退出状态和诊断;只对明确成功退出的结果转发原 stdout。reader 页、原生持久配置和压缩恢复引用同一个示例。外层 functions.exec 若返回 cell_id,仍按原宿主契约使用 functions.wait;它与 exec_command 的 session_id 不混用。没有让读取 owner 接管进程或重建调度状态。

结果 旧示例 新示例
exit_code=0 stdout 同一 stdout
仍在运行且 stdout 为空 丢掉等待句柄 完整结果保留原 session_id
非零退出 只剩 stdout 保留退出码、诊断和元数据

具体改动 / Changes

完整审查 6文件 +85/−24:两个产品指引模块及四个测试/fixture路径,没有新增状态、CLI option 或配置 owner。规范依据:docs/reference/required-work-context.md,spec_revision faab5f5c291c5359216a0f944fe63fcfbaacdedc。映射改动前的 Selected capture details / 按需读取捕获详情:保留完整来源摘要、原选择与连续字节;Bounded settlement results / 有界结算结果:恢复输出不改变原 Turn/effect,不重做准入或结算。两项均 implemented,依据真实客户端完整恢复及同条件拒绝路径,不是只检查字符串存在。

关键代码讲解

  • CODE_MODE_EXEC_RESULT_FORWARDER 使用明确的成功退出条件;pending 和 failed 结果保留完整对象。共享表达式本身没有执行副作用,也不把空 stdout 当作成功。
  • CONTEXT_CAPTURE_CODE_MODE_GUIDANCE 将进程句柄、外层 cell 和失败处理放入原 page/read 指引;原字节覆盖、摘要、缺页恢复及不重复 effects 的条款逐句保留。
  • codex_context_recovery_instructions 复用相同指引,避免持久配置与恢复 hook 给出两套结果处理办法;原调用身份、路由、预算与状态机不改。

异步 fixture 用 gate 阻止 reader 提前结束,只有下一次真实客户端请求收到原句柄才放行。因此成功不依赖“机器恰好够快”。旧 stdout-only 表达式在同一 public 路径的 cold_read 阶段失败,新表达式完成冷/热读取,原 guard 与 spend 计数不增加。

对主干的风险 / Risks

最强风险是把尚未完成的结果当作成功,或把进程句柄与外层 cell 混淆。三个真实 Codex code-mode 路径均 PASS,覆盖同步、强制异步和显式程序路由,后端为隔离 SQLite、推理只在本地回环。Node 可执行用例还验证非零退出的完整失败结果;这些证据不证明自然模型会主动遵循指引。

unit 命令 208 passed、11 skipped;另行完成上述 3项 native,其余可选组合保留未验证。同一个显式 off harness 在 base/head 各 8 passed;额外同条件 public CLI 对照的七种拒绝完整 JSON 相同,包括错误重叠时的优先级,且不创建缓存、registry 或 runtime。

语义与 CI 对齐

通用指引是明确披露的行为修复,不是新增 default-off 功能;既有显式 off 的 IO 边界保持。相同合成输入中 page/read 指引各增加212字符,persistent恢复说明3,243→3,475字符;新增内容解释必要句柄与错误处理。生命周期测试的3,100→3,350仅为固定fixture的回归 allowance,生产输出/历史限制、完整要求与冻结准入语义不变。

标准 premerge 6项 direct、13项 selected 通过,其中 raw maintainability 仍是 inherited advisory:未修改的 interaction renderer 为62个 decision points,上限60。独立两端原始检查均 exit1;只去掉 repository_root 后,完整诊断 SHA-256 为 77abf2de3f37e77a93fc9e856f2a6babcb6ccf9b6c76bf218916d63aa3152241,全部匹配。原 oracle、阈值、失败路径、fixture和环境相同,六条改动路径另有 required passing coverage。现行可选基线归因契约据此给出 exact-scope CQR pass/valid;raw失败仍记 failed,未将必检或冻结要求改为可选。

Ruff、configured mypy17、完整语义检查、双语/diff 与六文件公开边界扫描通过。没有查询、轮询或等待 CI;合并资格与权限另判。

我的整体评价 / Verdict

APPROVE 当前精确 head 的读取指引修复。long_horizon 在受控真实客户端中改善了原读取的续接可靠性;user_experience 保留原任务和恢复路线,无额外用户确认。既有宿主状态和词汇被复用,新常量只是局部指引,不产生权限或业务状态。

此改动不改变渲染页面;已检查实际 CLI/原生恢复入口,visual_review 不适用。未验自然模型采用、安装态 App、Windows、完整原生矩阵及长程成本收益;本结论不扩大这些边界,也不清除原维护性债务。

English verdict: APPROVE a2e0eae — real asynchronous continuation and off-path parity are verified; retain the inherited raw failure and unmeasured adoption/cost boundaries.

@huangruiteng
huangruiteng merged commit 2db1fd7 into main Nov 6, 2026
30 of 42 checks passed
@huangruiteng
huangruiteng deleted the codex/context-read-handles-20261106 branch November 6, 2026 04:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants