Repository navigation
fix(vision): report budget violations in one recovery response - #8051
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>
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-astra; provider=OpenAI; reasoning_effort=xhigh; runtime_reported.
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
动机 / Motivation
执行 refresh-state 的 Agent 可能交来一份包含数项预算错误的 Vision。过去每次只看到第一项,读完错误并修改后才能发现下一项。独立重放中,File 和 SQLite 上同一份五处超限的输入,都从六次 CLI 调用降到两次,含最后一次成功。两种后端在拒绝时保持原文和 Goal 状态,修正后读回同一份补丁。对正式任务总成本及评分的影响仍待实际运行检验。
改动思路 / Approach
基准合同是 docs/reference/protocols/goal-vision-replan-contract-v0.md,版本 d29ec8bf2a105aac24629bcbf3dfb7c97aea51fe。其中 B1 要求明确指出超限字段和限额,已知字段应提供紧凑建议;B2 要求保留作者原意,不默默裁剪后写入。两项均由原有 TypeScript prepare owner 判断。当前改动一次收集可独立诊断的预算问题,借助现有 Effect 请求错误跨语言返回。对格式和私有文本的拒绝仍然发生在写前。用额外 CLI 预检来完成同样工作会维护第二套规则,客户端也可能在写入前得到过期结果。
具体改动 / Changes
关键代码讲解
VisionBudgetDiagnostics暂存本次准备操作中的问题。列表超过项数上限时,仅报告数量;因此输入未完整检查时不会拿部分长度推断整包总量。收集器随一次调用销毁。诊断收集与结算prepareVisionRefresh复用已有文本、路径、步幅和回退声明校验。对单独的超长advancement_policy保留预算首错及建议,对短非法值保留枚举拒绝。测试实际区分了这两个分支;原先暴露该问题的提交确实会返回错误的错误类别。准备入口effectRuntimeErrorPayload只在请求拒绝且存在补充诊断时传递可选明细。Python 边界验证数组的类型、数量和每项长度;无明细的原有请求仍能解码。Vision 的_raise_rejection从首条诊断解析旧建议,再显示其他可修正项。TypeScript 边界 · Python 拒绝处理
双语迁移 RFC 与协议文档记录了责任归属和拒绝顺序。Python 的真实 CLI 用例和 TypeScript 用例分别保护文件状态、合法输入、错误信封和私有内容边界。没有新增持久化状态、配置项或调度入口。
对主干的风险 / Risks
最容易漏掉的回归是收集到预算错误后继续走枚举校验,把调用方原来能处理的预算错误变成通用错误。对比基准、初始候选与修订版,长度 41、限额 32 的同一字段已恢复原错误类别与建议,短非法值仍直接拒绝。另一项风险是过长列表的内部明细和总预算被误报,当前实现先检查项数,回归也覆盖了对不完整数据的处理。
独立调用公开 CLI,验证每次拒绝后原输入和 Goal 状态文件字节保持一致,修正后 File、SQLite 得到相同的已存 Vision 字段。精确提交的 Python 套件 153 项通过,1 项 Linux 专属用例在 macOS 跳过;TypeScript 定向套件 29 项通过;标准 premerge 18 项通过。未据此声称安装客户端、所有后端和线上任务均已验证。
我的整体评价 / Verdict
当前实现交付了可测量的恢复效率改进。长程任务能减少同一次错误写回占用的往返,用户和 Agent 可以一次看到多个可修正问题。合法写入、实际限额、权限和结算规则保持一致。变更复用既有请求错误,额外信息属于诊断提示;公共接口增量、双语文档和测试与问题规模相称。此处改变 CLI/RPC 错误展示,没有新渲染界面。没有发现阻塞项。
English verdict: APPROVE 607b02d. Paired CLI recovery takes two calls instead of six on both File and SQLite. The single-field compatibility regression is fixed.
refresh-state逐条暴露 Vision 超限问题,会让调用者反复修正同一份包。此改动在现有 TypeScript prepare owner 中集中报告可独立发现的文本/列表预算问题,经共享 request-error 的可选有界details传到 Python CLI。原限制、原包内容、写前拒绝和预算类首错的 code/message/suggestion 保持;超数量列表先拒绝数量,部分用量不会冒充整包总量。原始失败机制已用公开安全的合成输入复现:三个文本超限、两个列表超限。固定调用者根据实际返回诊断作明确修正;最终包和独立状态回读一致。基线
d29ec8bf2a105aac24629bcbf3dfb7c97aea51fe,候选607b02d9134755ed765086a36be597d2117c88b3:首条拒绝输出增加约 231 bytes,完整恢复段输出减少约 17%,RPC 减少 15.4%,wire 减少约 7%。这是固定调用者的恢复段,排除两臂相同的 fixture 初始化和独立回读;Python IO 只覆盖可观测文件调用,provider 原生 IO 未据此推断。主控制上下文的同 capture F/BODY 不变;模型采纳、token/cache、账单、已安装行为和持续长程净收益仍分别待验收。
验证:
结构/私有内容校验在归一化中仍直接拒绝,可能先于已收集的预算诊断。其他 path-delta 消费者保持 fail-fast;旧客户端仍能读取兼容首错。明细仅由显式 typed request error 携带,每条 240 字符、最多 128 条,超出明确标记;Vision 固定字段范围可完整容纳。该扩展复用现有错误合同,无新状态枚举。重构范围为现有 owner 内的预算诊断收集与共享传输接缝。
作者切片完成并进入正常评审;整体结算/模型效果资格、独立 review/readiness 与安装仍保持各自边界。
补充独立探针在 a3b 发现单字段
advancement_policy超长时,枚举校验抢先把旧vision_budget_exceeded/GoalVisionBudgetError换成invalid_request/ValueError。已在607b修正同字段预算优先级;保留 a3b 源/wheel 的失败证据。真实 TS/Python base/head 对照确认41/32错误、原 suggestion、短非法枚举与合法包完整指纹一致;跨字段结构/私有内容仍直接拒绝。上述五错误恢复表在607b重跑,全部数值与初稿一致;standard premerge18项再次通过。