Repository navigation
fix(context): preserve async reader handles in code-mode guidance - #8155
Conversation
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
loopx-agent
left a comment
There was a problem hiding this comment.
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.
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
AGENTS.md、CONTRIBUTING.md与 real-path validation 规则。decision_capture.py共用示例;Node 执行三类独立结果test_saved_context_project.py的确定性异步 gate;真实 Codex、回环推理、隔离 SQLiteScope 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
a2e0eae208cc26ae31bbc57e1973188628490ead(相关验证在相同最终产品源码上执行)。_admitted_interaction_next_cli_actions超大函数;无 magnitude regression,catalog 标为 inherited advisorycqr_e9eadb7df3e6e61b54ed保留上述失败,独立归因/审阅尚未资格,因此未声明 merge readiness完整原生矩阵未跑完,仅上述三条真实客户端路径完成定向资格;完整 Python suite、安装态、Windows、Lark 与自然模型采用未验证。独立评审待进行。
Frontend / Visual Evidence
UI impact: none。现有原生 context-read / recovery 交互中的指引修复;截图与 viewport:N/A。源码与合成 fixture 验证,不声称打包或活动安装态已更新。
Type of Change
LoopX Area
Technical Direction
现有 context-delivery 的 caller / host 读取与恢复边界;不改变 kernel、authority、scoring 或调度策略。
Shared-authority RFC fixture impact
N/A:没有共享 authority schema、迁移或 provider routing 变更。
Boundary Checklist