Repository navigation
fix(context): keep replan recovery progressive and settlement guidance consistent - #7726
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: actor_kind=model_agent; model=gpt-6.1-sol; provider=OpenAI; declaration_source=runtime_reported; reasoning_effort=max
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
Exact head: ea0a77dca447f0292d1af1ef660f9ce52e037606;整项 PR 的不可变 base:e8f4c6f8125e3cc0ef912afac653d5542671392f。
动机 / Motivation
在周期复盘中提交判断、随后需要修正过期评审依据的 Agent。
旧拒绝响应直接内联完整依据,还要求整包重读;新入口保留完整私有快照,返回按需读取命令,重新判断后继续原 Turn。
File/SQLite 的恢复、重新判断、原身份写回和幂等单次扣额已独立验证;预算诊断和重规划提示由原 owner 补齐。
不完成 C1/C2 整体切换,不认证已安装宿主、真实模型采用、持续延迟或完整成本净收益,不扩展 checkpoint 时机。
C1 unified producer/consumer cutover and C2 actual adoption/full-cost qualification remain with existing #7430 and the accepted controller/executor RFC.
有用结果是读到改变后的要求、重新判断,再继续原有工作。文件存在或换一个 context ID 都不能代替这个过程。本轮检查了真实拒绝、恢复、一次结算以及后续工作,没有把传输字节减少当成模型费用或目标收益。
改动思路 / Approach
TypeScript 继续决定依据失配、预算和结算;Python 仅复用既有私有根、原子 capture 和通用 reader 做文件 IO,没有新增状态或授权 owner。
当前切片只交付重规划拒绝的 CLI 恢复与原结算/预算说明;现有普通、stride-off、非 POSIX 和底层完整语义路径分别保留。
只修改提示仍会把完整历史先塞入工具响应;另造恢复状态或配置开关也没有必要。当前实现保存写入时 owner 返回的完整对象,从该文件生成 SHA 和已有 reader 命令。新 current_context_id 是同一依据的派生诊断值,没有手工同步的新事实。
正常路径不增加用户确认或重新填写:Agent 自行按需读取、修正判断并重试原操作。文件不可用时明确返回不可用状态,修复传输后仍重试原操作;不会用旧快照替代当前依据,也不重新准入。非 POSIX 与底层语义响应保留完整内联形式,是明确的传输兼容边界。
具体改动 / Changes
完整读取 12 个路径、+143/-24:六个既有生产文件、五个测试文件和一份中英协议说明。没有新增存储、RPC、CLI 选项、设置或权限 owner;既有前端机器开关仍由原 preview/apply/readback 流程管理,本次错误恢复不会开启它。
关键代码讲解
capture_context_recovery复用私有根和原子 capture,完整写入一次拒绝所依据的对象,再返回索引与选择命令。目录或权限不安全时返回available=false,不替用户修改权限、不制造旧依据,也不提交 native baseline。handle_refresh_state_command仅在已有 typed context 拒绝、POSIX 和 JSON 条件下替换展示。TS 的拒绝、原 obligation 和原结算身份不变;外层原有 refinement receipt 保留逻辑仍在异常处理后执行。turnScopedCliSettlementPlan根据已有 autonomous 标记或结算 binding 纠正说明,要求重规划使用semantic_closeout。普通和 in-flight 的完整 plan 在 base/head 上逐项相等;Python 的原自主重规划命令也带上这个明确边界。prepareVisionRefresh保留原字段限制、1800 总限制及拒绝顺序,只在总超额错误中增加 vision/path/stride/fallback 的实际计数。现有 CLI 测试验证 1800 可写、1801 拒绝且没有部分写入。
spec_ref:docs/reference/protocols/quota-replan-planning-selection-v0.md;spec_revision:e8f4c6f8125e3cc0ef912afac653d5542671392f。判断采用修改前的契约,未以新说明自证正确:
Existing-owner flow / 现有权威下的流程:implemented,显式选择、原身份与原结算 owner 保留。Review context changes before writeback / 写回前的评审上下文变化:implemented,完整写入时依据保留,必须重读必要事实并重新判断;拒绝不写回、不扣额,依据再变仍会拒绝。Boundaries and verification / 边界与验证:implemented,真实 File/SQLite 恢复与幂等结算成立,源码资格与安装、模型及完整统一契约的资格分开。
内联改为文件引用、整包重读改为按需读取,是本次明确披露的行为变化,包含关闭 native context delivery 时的 POSIX JSON 拒绝响应。它不被冒充为该错误分支的逐字 off parity;完整原文仍可读取,相关来源与停止条件没有被裁剪。
对主干的风险 / Risks
未发现当前阻塞性问题。 最强反例是短响应隐藏了改变后的要求,或者传输修复后无法继续原事务。独立 File/SQLite 用例实际改变 Goal objective,读取写入时快照中的新要求并修改验证计划,再以原 Goal/Agent/Turn/obligation 写回;两次 spend 请求只产生一次 debit,随后真实负结果仍可影响下一次选择。
另一组独立故障注入令私有目录不可用,观察拒绝无新 guard 或 debit、无伪造路径;仅修复隔离夹具目录后,原操作取得当前快照并完成同一恢复链。完整大对象、摘要和不可变旧快照由新增 helper 用例覆盖;JSON 引用与直接语义响应的分离有实际现行 caller。未把不相关的 chat recovery 同名字段当成此协议消费者。
验证均固定 source checkout、Python/Node 来源和隔离合成状态:
| 范围 | 独立结果 |
|---|---|
| 三个完整相关 Python 模块 | PASS,67 passed,初次 5 个可选 native skipped |
| 相同完整恢复用例 | base 四项在内联 11738/11765 字节处失败;head 四项 PASS,语义与后续工作另行核验 |
| 私有传输拒绝、修复和原事务恢复 | PASS,2 passed / 0 failed / 0 errors / 0 skipped |
| 原 machine/native 用例,开启实际 native loopback | base/head 各38 passed、零skip,覆盖原先五个可选 native/off 用例 |
| 原11项 vision 对照 | 树外复制导致来源定位失败;仅修正实验的示例定位后,base/head各11 passed,原断言未改 |
| shared TS 与静态检查 | PASS,62 TS;typecheck、声明的完整 Ruff scope、配置内 mypy 通过 |
| 标准 premerge | PASS,6 direct + 19 selected 全部通过,零 failed/skip/manual hold;CLI 输出项 78.26s,原 120s 限制未改 |
作者记录的历史输出预算超时仍保留;当前独立整轮通过没有把旧失败改写为通过,也不建立持续延迟资格。普通/in-flight 的完整 plan 比较不做归一化;真实 CLI 对照保留完整诊断、目标变化、身份与副作用。没有查询、轮询或等待 GitHub CI。
两轮树外 vision 对照最初各有11项 FileNotFoundError,发生于测试按复制后的位置寻找示例,尚未进入产品路径。该设置错误及原整轮 exit1 均保留;仅将示例定位回已固定的源码根,并加载仓库原有隔离 fixtures 后,这11项在两版本分别通过。没有删除断言、缩小输入或将失败改成 skip。
语义与 CI 对齐
共享 replan、stride、settlement 和 budget 词汇复用原 owner;不按 prose 或 substring 猜测状态,不将强制新鲜度检查称为可选提示。此次是 agent-facing 指令修正,已比较 actor、触发、先后顺序、必要来源、权限、停止与一次结算条款。语义检查和公共边界检查通过;静态扫描对动态值、producer 及跨 runtime 的已知分析限制仍保留。
本次没有 PostgreSQL store、事务或 authority 修改。非 POSIX 原生运行、与先行 Goal refinement 组合的完整重放、已安装宿主和真实模型没有新增执行资格;这些路径的未改分支按源码说明,不能写成已实测。
我的整体评价 / Verdict
APPROVE,限定 ea0a77dca447f0292d1af1ef660f9ce52e037606 的有界恢复修复;delivery 判断为 justified_increment。long_horizon 为 preserved,原承诺、判断顺序、身份和一次结算没有变化;user_experience 为 improved,必要事实可以直接恢复,且不增加用户决策回合。此判断来自真实 CLI 恢复和反例,不等于长期净收益。
机制与问题相称,已经复用原有 capture/reader;没有需要扩成新框架的理由。小上下文可能多一次文件/详情读取,完整 IO、工具和模型成本仍须由原 C1/C2 工作验证;本 PR 不据此宣告整个迁移完成。
检查了实际 CLI 恢复、既有设置入口和协议文本;本 PR 没有渲染页面或视口变化。 已安装宿主、真实模型采用和长期完整成本收益未验证;没有需要补图的渲染表面。
English verdict: APPROVE — ea0a77dca447f0292d1af1ef660f9ce52e037606. Real File/SQLite stale-basis and transport-failure recovery preserve reassessment, original identity and one debit; ordinary plans and native-off paths retain parity. Independent source checks pass; installed adoption and sustained full-cost benefit remain unqualified.
重规划评审依据在投递后变化时,CLI 原先把完整历史上下文塞进拒绝响应,并要求整包重读;同一评审的结算提示还会推荐最终会被 validator 拒绝的 in-flight 边界。本变更将 POSIX JSON CLI 的恢复依据完整保存为私有不可变文件,返回摘要绑定的索引/选读引用,并让重规划提示使用 semantic_closeout。
保留同一 Goal/Agent/Turn/obligation、原结算身份、重新判断要求及拒绝写回/扣额的边界。底层语义响应和非 POSIX CLI 继续返回完整依据;普通工作、stride-off、原生差分基线、checkpoint 时机与实验协议没有改变。1800 字符总预算及原校验保持,超额错误额外报告 vision/path/stride/fallback 用量。
验证:真实 File/SQLite CLI 覆盖依据变更→拒绝→摘要绑定选读→重新判断→接受写回→幂等单次扣额;新增私有目录、符号链接拒绝、不可变旧快照与大量可选材料覆盖。最终聚焦 9 项通过,TypeScript 32 项通过;较广开发检查 48 项通过、5 项 opt-in native 环境未启用,另有 outcome/replan 组合 6 项通过。标准 premerge 的其余 23 项通过;CLI 输出预算 smoke 两次超时后,在相同精确 head/base 和原 120 秒限制下独立重跑通过(80.83 秒)。原超时保留,未改阈值或断言;尚未安装或纳入实验,也不据传输字节宣称模型费用或目标收益。
边界与范围:复用现有私有 transport root、原子 capture 和通用 reader;Python 仅做 CLI 文件 IO,TypeScript 继续持有重规划、预算与结算语义。没有新增配置、RPC、状态账本或前端独立能力;现有 CLI 错误恢复旅程是本次消费入口。公共扫描完成,唯一词法提示为既有凭证分类说明,不含密钥。未修改 RFC 配对。
基线 e8f4c6f;提交 ea0a77d。需指定独立评审、要求验证和该精确 head 的 merge readiness,才可集成。
最终 TypeScript typecheck 通过。仅作定位的分段测量约 80.3 秒:长路径 3.1 秒、创建工作树 8.2 秒、base 36.9 秒、head 26.5 秒、清理 5.4 秒;该测量不替代正式 smoke,也不能证明持续延迟达标。