Repository navigation
fix(context): publish prepared reads in the hook event session - #8092
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; gpt-6.1-sol; OpenAI; runtime_reported; reasoning_effort=max.
Approval conclusion (author-owned PR; GitHub blocks formal self-approval).
动机 / Motivation
使用 Codex 原生生命周期 hook 准备任务的操作者,会遇到 hook 事件身份与 shell 环境身份不同的情况。同一个任务已领取并通过守卫后,旧版在发布可读上下文时重新读取环境变量;缺少变量会返回不可用视图,冲突变量会多建一个会话目录。新版沿用事件中的会话身份,直接交付这次任务的完整可读来源。已验证的改善是:原任务、原 Turn、原领取凭据和完整要求能够通过首次读取到达后续进度操作,重复 hook 不追加领取或守卫。本次范围不包含安装、调度策略、额度规则或模型效果评估。
改动思路 / Approach
沿用已有会话日志、保存快照及 TypeScript 决策所有者;Python 只传递 Host 事件身份,不增加另一套状态或授权规则。本次只修复已有原生身份传递路径,不改变 activation、quota 或持久化策略。处理顺序仍是检查主会话事件、在原始 authority route 上领取并重新守卫一次、保存 ready 决策,最后发布读取命令。补丁把已有身份沿调用链带到底,避免发布阶段另猜一个身份。原始保存快照、完整读取和后续当前凭据进度操作构成可使用的闭环;可选传输失败继续指向原文件,不能通过传输重试重新准入。单独只改目录选择会在后面的投影或登记校验处失败,因此这几个参数传播点属于同一个最小修复。
具体改动 / Changes
规范依据:docs/heartbeat-automation-prompt.md,接受前固定版本 be17d4ff30eb00ef739710961d223ce81fb1b5e9。原文没有条款编号,以下使用描述性名称:native-session-isolation → implemented,事件身份、私有日志和 pending target 保持同一作用域;saved-original-no-readmission → implemented,继续使用已保存原决策、原 Turn 和原领取凭据,不增加准入操作。完整 diff 为 3 文件 +39/-19;测试扩展已有实际入口 fixture,没有引入另一套流程。
关键代码讲解
handle_native_context_command在排除子 Agent、核对工作目录并完成准备后,才把event["session_id"]交给保存投影;它没有为普通 shell 增加可伪造的授权参数。project_saved_context_capture先验证原文件、SHA、Goal/Agent/Turn,再把该身份传到目录、投影和页登记。显式 off 仍直接提供原文件引用。project_codex_context沿用锁内 journal/session/epoch 校验。未传事件参数的普通命令仍使用进程身份;身份不匹配不会借用别的会话。register_native_context_view同时核对会话和当前 pending target,再登记完整页读取要求;文件存在没有变成模型保留证明。
对主干的风险 / Risks
最强反例是“领取已成功,但发布端进入另一个会话”。冻结同一组六个真实 hook subprocess 用例后,base 为 4 PASS / 2 FAIL,恰好失败于缺少环境身份导致视图不可用、冲突身份导致额外目录;head 为 6 PASS。通过路径还验证了完整中文请求和 Goal 原文、原 Turn/领取凭据的实际进度更新、重复事件不追加守卫/领取,以及篡改原文件被拒绝。这六例包含于下列 27 例中,未重复计数。
独立验证共 271 PASS、56 SKIP、2 个已归因的既有 FAIL:执行准备 27 PASS;生命周期/捕获/reference 208 PASS、46 SKIP;保存投影 36 PASS、10 SKIP。两个失败在相同 base/head 命令及临时目录下的完整诊断一致,仅规范化 Python 对象地址:省略 activation 时意外创建 runtime,以及默认视图缺少 mode;没有声称修复它们。显式 off 另用相同 fixture 对照实际 hook、projection 和返回的 reader,三个完整输出仅替换临时根后完全相同,journal/原文件不变且没有新建 registry/runtime/cache。
Ruff、配置范围 mypy(17 文件)、双语 RFC/语法/diff/模块增长检查通过;quick premerge 通过并保留一个 inherited maintainability advisory:未改动的 _admitted_interaction_next_cli_actions 过大,base/head 完整输出相同。未查询、轮询或等待 CI。原生 Codex binary 用例明确跳过,真实安装和自然模型采用仍未验证;没有用本地绿色替代这些边界。
我的整体评价 / Verdict
该缺陷的独立入口结果已达成:long_horizon 在本次准备→读取→进度→重试路径上 improved,用户无需再输入已知身份或增加确认轮次,user_experience improved;整体长期收益及完整成本仍未知。沿用已有会话日志、保存快照及 TypeScript 决策所有者;Python 只传递 Host 事件身份,不增加另一套状态或授权规则。代码量和维护成本与确定性故障匹配,复用既有所有者已经完成本域简化,无需扩大重构。
检查的是 CLI hook、保存的上下文及其读取命令,没有改变任何渲染页面,因此不适用截图评审。未验证范围:实际安装的 Host 和自然模型采用情况。当前保留的两个默认 activation 缺陷、maintainability advisory 及 native-binary 跳过均公开记录。没有新建共享语义词汇或重复决策状态;本结论仅针对 e0763d1a3d09c0232da7876b9542ffa12aede0a0,头部变化须重新评审,合并与安装仍需各自权限和就绪条件。
English verdict: APPROVE e0763d1a3d09c0232da7876b9542ffa12aede0a0 — event-session publication is fixed with base/head sensitivity, original-identity replay checks and explicit-off parity; existing failures and installed-host limits remain disclosed.
When a lifecycle hook prepares a Todo, the event identifies the native session that owns the claim and the ready capture. The publication step performed a second session lookup using the shell environment. An unset thread ID made the ready view unreadable through the normal first-read path. A different thread ID could create a second session directory.
Pass the event session through saved projection, recovery publication and page registration. Each step checks the existing journal and capture target. Ordinary shell reads continue to use their process identity. This patch has no installation, scheduler, quota or scoring change.
The regression runs the real hook in a separate process against an isolated SQLite Goal with both a missing and a conflicting thread ID. Both cases failed on the base. Both now return the selected Todo, original Turn and settlement identity. The test verifies the full request, the normal progress update, a rejected corrupted source, and that a repeated hook adds no guard or claim. Existing explicit-directory File and SQLite cases remain covered.
Across the three affected Python modules, 63 passed, 34 skipped and 2 failed. Both failures also reproduce on the unmodified base: saved projection with omitted activation can create an absent runtime and can return a different default view. These remain open. Ruff and the bilingual diff check passed. The standard premerge passed its 18 selected checks after installing the repository dev dependencies. Two additional opt-in native Codex loopback cases passed using progressive and code-mode readers.