Skip to content

fix(vision): report budget violations in one recovery response - #8051

Merged
huangruiteng merged 3 commits into
mainfrom
codex/vision-budget-feedback-20261104
Nov 4, 2026
Merged

huangruiteng merged 3 commits into
mainfrom
codex/vision-budget-feedback-20261104

Conversation

@loopx-agent

@loopx-agent loopx-agent commented Nov 4, 2026 •

Copy link
Copy Markdown
Collaborator

refresh-state 逐条暴露 Vision 超限问题,会让调用者反复修正同一份包。此改动在现有 TypeScript prepare owner 中集中报告可独立发现的文本/列表预算问题,经共享 request-error 的可选有界 details 传到 Python CLI。原限制、原包内容、写前拒绝和预算类首错的 code/message/suggestion 保持;超数量列表先拒绝数量,部分用量不会冒充整包总量。

原始失败机制已用公开安全的合成输入复现:三个文本超限、两个列表超限。固定调用者根据实际返回诊断作明确修正;最终包和独立状态回读一致。基线 d29ec8bf2a105aac24629bcbf3dfb7c97aea51fe,候选 607b02d9134755ed765086a36be597d2117c88b3:

恢复段观测 File main → head SQLite main → head
CLI 提交次数(含成功) 6 → 2 6 → 2
累计 stdout UTF-8 bytes 12,850 → 10,678 12,926 → 10,738
RPC 26 → 22 26 → 22
实际 framed wire bytes 75,801 → 70,515 75,865 → 70,579
观测 Python 文件读取 bytes 33,551 → 19,514 33,739 → 19,630
观测 Python 文件写入 bytes 18,007 → 18,025 18,063 → 18,081

首条拒绝输出增加约 231 bytes,完整恢复段输出减少约 17%,RPC 减少 15.4%,wire 减少约 7%。这是固定调用者的恢复段,排除两臂相同的 fixture 初始化和独立回读;Python IO 只覆盖可观测文件调用,provider 原生 IO 未据此推断。主控制上下文的同 capture F/BODY 不变;模型采纳、token/cache、账单、已安装行为和持续长程净收益仍分别待验收。

验证:

  • TypeScript 29 项、control-plane typecheck、Ruff 通过;新增诊断 oracle 在基线失败。
  • 实际 File/SQLite CLI 拒绝前无 run/state 写入,修正后完整 Vision 独立回读一致;两臂最后包 SHA-256 相同。
  • 初稿 a3b 的源验证六模块 139 passed / 5 failed;这 5 项已在原始 main 复现:4 个结算指引文案断言、1 个 Stride 默认继承断言。保持失败,不改写为通过。
  • 共享 transport 源测试 111 passed / 1 Linux-only skipped;修正607b的预算源模块42项通过;实际 wheel 隔离验证153个唯一案例通过 / 1 Linux-only skipped。使用原 conftest、默认根隔离及原 helper;初始缺失 helper 的环境失败已保留并补齐重测。四个产品模块与该 head 字节一致。
  • standard premerge:18 selected / 0 failures,双语 RFC、diff/compile/public boundary 通过;DCO 完整。

结构/私有内容校验在归一化中仍直接拒绝,可能先于已收集的预算诊断。其他 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项再次通过。

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 loopx-agent left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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.

@huangruiteng
huangruiteng merged commit 6b92eed into main Nov 4, 2026
14 of 37 checks passed
@huangruiteng
huangruiteng deleted the codex/vision-budget-feedback-20261104 branch November 4, 2026 17:25
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants