Repository navigation
fix(chat): restore recovery and reuse native Session monitoring - #7261
Conversation
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
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 · max
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
动机
需要由原 Bot 自动恢复请求、并在已绑定 Agent 会话中持续观察原生任务的使用者。
此前故障恢复会调用已移走的方法而报错,普通受管会话即使有明确监控任务也没有到期执行入口;现在恢复复用共享校验器,显式监控通过原唤醒服务完成一次原生观察。
真实 Core 和原生任务验收证明,到期观察推进原任务期限,原模型调用记录不变;失败请求恢复的既有测试重新通过。
本 PR 不完成自然语言周期配置、Agent 工作台界面、报告生成或生产积压业务,也不新增调度器、任务库或消息消费者。
完整 Agent 界面、自然语言配置、通用周期报告和生产原消息最终回传仍需沿既有接收任务独立验收。
我的判断是 justified_increment:这次把“有明确任务但没有执行入口”的缺口接到了现有生产唤醒路径,同时修复上一轮共享上下文重构遗漏的自动恢复调用者。仅仅增加一个观察函数或让调用者手动补发,都不能解决持续运行的问题。本 PR 仍不是完整周期任务产品的完成声明。
改动思路
复用既有原生任务、Core worker、观察适配器及 monitor-poll,把身份和观察判定留在现有类型层,把原生读取及调用留在聊天适配层。
当前交付显式原生监控的真实到期闭环与自动恢复回归修复;完整产品入口和报告组合仍由既有工作接续。
原生 Todo(任务记录)继续决定启用、暂停、到期和结果;Core 继续保存原会话中的操作身份。新增分支只负责把一个已明确授权的到期观察交给现有执行者,不创建第二个定时器、任务库、模型 worker 或消费者。私聊管家的组合来源与普通 Agent 的原生任务来源权限不同,保留独立来源读取,但共享哈希规范化、观察适配器和原生结算规则。另一处修复直接复用共享 Codex 上下文校验器,没有增加兼容别名或第二个认证决策。
以下表格由精确版本 3b14164693583779e0a68524c82b20237f3182b7 的控制流整理,属于解释性对照;执行证据另列。
| 触发 | 原先 | 当前 |
|---|---|---|
| 原会话有显式到期监控,无私聊绑定 | 没有本地观察入口 | 原唤醒服务接入同一 Core worker,原生 poll 更新期限 |
| 只有注册和会话,没有监控任务 | 没有观察执行 | 仍没有观察执行;不猜测订阅意图 |
| 原恢复扫描器处理可继续的失败 | 调用已移走方法并报错 | 使用现有共享校验,保留原来源与无效果证明 |
| 一个会话元数据损坏 | 新扫描可能中断全轮 | 枚举跳过损坏元数据;直接排队请求读取仍严格失败 |
具体改动
pump_managed_session_monitors从已有DelegationWakeService被调用。读取当前 Core 会话和完整原生任务,要求唯一匹配的显式目标;忙碌、排队、暂停、停止、已撤销注册或身份不符均不接纳观察。一分钟缓存只是读取提示,重启或丢失缓存不会改写期限。ManagedSessionTurn.submit使用原生任务期限和租约代际形成原操作见证,同一请求仍由现有 Core 保存。只有内部原生监控分支使用观察适配器;普通有限任务保留原模型及独立验证路径。已接受但失败或未知的操作只能读回,不能因为服务重启而重放。公开 HTTP 参数白名单没有增加监控期限或任意执行命令。admitManagedSessionTurn对齐原 Agent、Session、Goal 生命周期、任务目标、动作、所属者和期限,提交观察前再次核对。observeManagedWork读取完整原生工作字段,排序后哈希,并排除所有连续监控的自身时钟、哈希和回执,避免观察自身制造工作进展。私聊组合仍核验原授权来源,没有授予本地会话组合访问权。recover_failed_request改用checked_session_home;原 profile、来源、无效果证明、保留失败 Turn、确定性继续和原受众回传机制保持。chat_store.py仅在会话枚举中隔离 UTF-8 损坏;曾尝试在公共读取器吞掉异常,回归测试证明那会把损坏队列误当空闲,该尝试已撤回。直接 Session/Turn 读取继续严格,损坏字节不改写。
规范来源为 docs/product/periodic-reports.md,不可变基准 55dea1408acfeb0bea416f1c3e372d5c1b480d5c 的 Managed Agent execution boundary(基准正文)。该节没有编号,用原文短语作为 criterion_id:original Session 和 registered Agent 已由原身份及恢复测试覆盖;second scheduler 通过复用原生 owner 满足;managed and attached 的完整页面留给既有 Agent 工作台任务;recurring task composition 在基准中明确尚未完成,本 PR 保持这一说明。新增文档只是具体原生监控作者入口,不用本次改写后的文字反向定义验收。实际 CLI 审计发现示例原先多写了不支持的 todo add --agent-id,已在最终提交删除;赋予执行者继续使用现有 --claimed-by。
对主干的风险
最强风险是“函数测试通过,但原生产者没有调用它”,以及把损坏来源当成没有任务。独立审计使用同一合成来源和原生 Core/SQLite 后端,通过实际 DelegationWakeService 比较不可变基准生产函数与当前版本:显式到期监控从接纳 0 次变为 1 次,并完成原生 poll、推进期限,模型调用记录保持不变。故意只移除本地交接后,同一独立接纳/完成断言失败,退出码为 1;这验证了生产连接的回归敏感性。它是有界生产函数对照,未声称整个基准二进制或所有外部部署完全等价。关闭状态对照均为 0 次执行、历史与原生工作不变;仍有便宜的元数据发现读取,不能写成零 IO。
完整来源审计经真实原生 CLI 创建超过显示窗口的 25 个工作任务,反转完整读取顺序后仍全部观察;启用后加入第 26 个任务,下一独立期限的观察产生真实哈希变化。完整来源不可用时不接纳 Core 操作,不能把失败解释为空集合。File/SQLite 覆盖重启、未到期、忙/排队优先、失败操作不重放、错误身份、观察后暂停/撤销/停止,以及损坏会话不阻塞另一监控。模型、app-server 和消息 provider 是合成边界;Core 与原生 Task authority 为真实路径。这些结果不等于生产消息已补办或用户收到了最终回复。
验证合计 230 项 Python 测试通过(168 项原生监控/host/report/context,另 62 项原自动恢复),18 项 TypeScript 测试通过,控制面类型检查及打包前端兼容构建通过。精确提交 premerge 的 6 项直接检查和 15 项选中检查通过,0 自动失败、0 人工 hold,未修改任何预算或扫描范围。最终第二提交只修正文档的 CLI 选项,生产与测试代码与已测版本字节一致;对照和原生作者入口按最终版本再次执行。wait_for_ci=false,没有查询、轮询或等待远端 CI。
先前失败保留:完整回归暴露缺失恢复方法;新发现扫描暴露损坏 UTF-8;测试暂停调用缺原因,带微秒“当前时间”偶尔未到期,且不同原生 poll 的同秒时间违反已有严格排序。最终测试使用正确原生生命周期,并等到下一真实秒再构造独立窗口,没有放宽原生时钟、租约或未知效果门禁。实际作者审计的 CLI 选项错误也保留并修正。失败结果没有被重新标记为自动业务完成。
语义与 CI 对齐
这次复用已有 continuous_monitor、work_kind=monitor、原 Session 及 native poll 生命周期,没有新增通用结算义务或 Agent 提示词。观察结果只描述当前工作状态,不能证明 Task 或 Goal 已完成。共享层的纯判定和主机 IO 仍分属原 owner,观察与业务执行分开。维护性、公开边界、语义/监控 canary 与类型门禁均通过;有界语义扫描只提供其实际检查范围的证据,不被当作穷尽性证明。
我的整体评价
APPROVE,属于有真实默认入口和独立恢复验收的 bounded increment。long_horizon 为 improved:原 worker 中完成观察、下一窗口续办、未来原生工作被完整观察、未知操作不重放,并且原自动恢复重新可用。user_experience 为 improved,范围是减少恢复故障和已授权监控的人工介入;原生 CLI 是可选技术入口,不能冒称已实现自然语言产品。复用既有原生任务、Core worker、观察适配器及 monitor-poll,把身份和观察判定留在现有类型层,把原生读取及调用留在聊天适配层。
当前交付显式原生监控的真实到期闭环与自动恢复回归修复;完整产品入口和报告组合仍由既有工作接续。
已检查现有聊天服务、Session 投影及前端调用:本次没有渲染组件、布局或样式变更,视觉检查不适用。
未证明完整 Agent 页面、手机体验、自然语言模型理解或任何生产积压已完成。
因此没有新增截图或视觉质量通过声明,打包构建只证明现有前端兼容。额外维护成本是一个原生观察变体及便宜的发现读取,数据、时钟、租约和执行者仍由既有组件拥有;两个附带修复是同一无人值守路径上经回归验证的实际故障,没有引入新框架。保留已发表的主报告与原操作,不靠人工代答或重放改善数字。
残余风险是完整 UI/NL/报告组合尚未验收、真实模型与生产回传不由本合成旅程证明,以及大量空闲受管会话的发现 IO 尚未作性能基准。当前没有证明性能回归,也没有用延长超时或扩大权限隐去问题。本评审仅对 3b14164693583779e0a68524c82b20237f3182b7 有效;发布的作者自评不等于 GitHub 正式自批准,合并仍须当前精确版本 readiness 和既有用户授权,不能开启原生自动合并。
English verdict: APPROVE 3b14164693583779e0a68524c82b20237f3182b7. The original wake/Core/native-poll path and guarded recovery pass 230 Python tests, 18 typed tests and local exact-head premerge checks. Baseline/head, default-off, full-source and deliberate handoff-removal checks support this bounded increment. No blocking finding; full UI/NL/report acceptance and production backlog completion remain unverified.
Bot failure recovery still called the Codex-home method removed by the managed-Session refactor. Route that caller through the existing shared context verifier, retaining original profile, source, no-effects and retry fences.
Also connect an explicitly authored local managed-Session watch to the existing idle wake service, Core worker, observation adapter and native monitor-poll. The canonical Todo owns its cadence, deadline and pause state; registration alone enables nothing, and observing native Goal work starts no model and spends no delivery slot. Corrupt metadata discovery is isolated while direct queued-work reads remain strict.
Validation: 230 Python tests (168 native/monitor/host/report/context tests plus 62 original automatic-recovery tests), 18 TypeScript tests, control-plane typecheck and packaged frontend build pass. Exact-head premerge passes 6 direct and 15 selected checks with no manual holds. A real wake/Core baseline-head comparison and removed-handoff mutation check the production producer. No remote CI was queried (
wait_for_ci=false). Earlier failures exposed the missed recovery caller and corrupt discovery; both are repaired. Test timing also now respects the existing second-resolution clock and strictly ordered native observations.This is native work-state observation and recovery repair. Agent workspace UI, natural-language recurring configuration, report generation and production backlog completion are separate acceptance items. No second scheduler, task store or consumer is introduced.