Repository navigation
fix(control-plane): bound large quota planning requests - #7616
Conversation
loopx-agent
left a comment
There was a problem hiding this comment.
Reviewer: model_agent; OpenAI; gpt-6.1-sol; runtime_reported; reasoning_effort=max
REQUEST_CHANGES at 7a71effae23ef03425fb06dc3947259969e16015。大历史传输修复有效,但同一传输重构引入了两处可复现的兼容/可变对象回归。
动机 / Motivation
维护长历史 Goal 的 CLI 调用者,在 quota 规划输入超过 inline RPC 上限时会遇到状态读取和后续工作受阻。
原先完整规划事实可能超过 2 MiB 而直接失败;本次改为去重重复记录,必要时使用已有私有 snapshot transport,保留全部输入。
合成大历史在旧版失败、当前 head 通过;另有两项对照显示 frontier 身份和返回对象隔离尚未保真。
本 PR 应只修传输,保留原选择、gate、依赖、时钟、来源和零业务写入边界,不承担 controller 全量迁移或长期模型收益验收。
改动思路 / Approach
复用现有私有 snapshot 和 TypeScript 规划 owner 是合适边界;Python 仅去重、编码和恢复展示 payload,不应取得第二份规划决定。
当前 PR 应交付完整规划输入的可用传输及原语义保真;最小修复是补齐实际消费者需要的身份字段,并恢复每次返回记录的深复制隔离。
新 v1 resume request 将相同规范化记录保存一次,各 lane 用整数引用它;TypeScript 恢复 lane 后仍执行原诊断和选择。Python 保留完整 compact payload,再将结果中的引用恢复为原展示内容。唯一大历史仍超出 inline 时,调用现有 same-UID、私有权限、字节数和 SHA-256 校验的 snapshot 通道。这个方案保持 2 MiB wire 和 64 MiB snapshot 限制,不新增持久缓存或状态 authority。最强反例是“恢复后的最终 JSON 看起来一样,但中途决定或对象所有权已改变”;下面两项正是沿该真实边界验证。
具体改动 / Changes
先于 diff 阅读的规格为 docs/architecture/rfcs/typescript-control-plane-migration-v0.md,spec_revision=544aa0fee5dad33e3b70496dadfb3ffd36400e13;同时核对 quota planning horizon 和 canonical snapshot pagination 的现行边界。以下标识定位已有要求,不增加新标准:
| 要求定位 | 当前 head |
|---|---|
QP-complete-source |
implemented:2500 条独立历史加尾部工作通过真实 runtime;旧版同输入因 request oversized 失败。 |
QP-one-owner |
implemented:去重不是语义合并,TS 继续拥有诊断、gate、选择与完整来源判断。 |
QP-observable-parity |
not_met:兼容行丢失 frontier 身份输入;恢复对象的部分可变字段也失去原复制隔离。 |
QP-private-bounds |
implemented:复用原私有 snapshot 约束,未提高 transport 限制;既有异常和摘要校验测试通过。 |
关键代码讲解
build_referenced_todo_resume_planning_request按完整规范化 JSON 去重,避免只按 Todo id 合并冲突事实。其白名单却只考虑 resume evaluator,遗漏了后续 frontier consumer 的 identity fallback。projectTodoResumePlanning保留 v0 调用者,并解码 v1 records/source references;越界或错误类型仍拒绝。现有 agent_scope 和历史计数读取仍调用 v0,因此这个兼容分支有实际 caller。project_quota_planning打开现有 snapshot transport,并在 TS 整体规划完成后 rehydrate。TS 的projectTodoFrontier已在此前计算 identity,事后补回字段无法修复该决定。rehydrate_todo_resume_planning_result的外层字典合并只作浅复制。被留在 Python 的列表仍来自原 payload,会绕过_decode_quota_planning_wire原有的独立记录复制。
全 diff 为七个文件、218 增加/12 删除,production 128/9、测试 90/3。两个 runtime allowlist 成员使用同一通道;没有新 CLI、安装、数据库 schema 或共享权限 owner。Python 编码器增加的维护成本主要是必须持续核对所有 TS 消费者,而非只核对 resume 文件。
对主干的风险 / Risks
[P2] 在 TS frontier 决定前保留兼容身份字段
_REFERENCE_PAYLOAD_FIELDS 丢掉 target_key、action_kind 和 title,但 quota_selection.ts 的 identity() 依次读取这些字段。对现有兼容 summary 中没有 todo_id、保留 target_key=recovery:legacy-target 的 pending 行,原 summarize_user_todos_for_quota 返回 frontier_deadline.identity=recovery:legacy-target;当前 head 返回 Synthetic work。同一固定时钟、due、来源和输入下,只有这项身份改变。最终展示行的 target_key 虽已恢复,frontier 仍是错误身份,会使后续按该身份读取/比较的截止事实偏离原目标。该反例限定为支持的兼容 summary 输入,没有声称当前 canonical Todo 缺少 id。
最小修复是按实际整条 TS consumer 链补齐 identity 所需字段,并加入无 todo_id 时 target_key、action_kind、title fallback 的 base/head 对照。不要将事后 rehydration 当作中途决定的保真证明。
[P2] 恢复返回记录与原输入的可变对象隔离
payloads.append(dict(...)) 和第 173 行的字典展开都只有浅复制。对带 required_capabilities=["shell"] 的普通 typed pending Todo,真实公开 summary 调用本身返回成功;随后给 result["resume_blocked_items"][0]["required_capabilities"] 追加合成标记,会同时修改原 source["items"][0]["required_capabilities"]。不可变 base 的同一操作不会修改来源。相同来源出现在多个结果 lane 时也会共享这类恢复字段。调用结束时一次 source == before 不能捕捉这种延迟别名,当前新增测试正好只检查字段存在。
最小修复是在每次恢复记录时深复制保留 payload,再叠加本次 TS 输出,保持原 JSON 往返产生的独立记录。回归应分别修改一个结果 lane 的列表/嵌套对象,确认来源和其它 lane 不变;同样覆盖直接 quota planning 和公开 summary 入口。
PASS:精确 head 的 quota selection、resume projection 和 Effect runtime integration 共 150 项通过、零跳过;标准 premerge 六项直接检查及十八项 catalog/risk-profile 检查通过。额外同 harness 的 base/head 各八种输入,普通选择、typed wait、capacity、冲突来源及两个 gate scope 的 JSON 相等;大历史旧失败/新通过。两种生产入口的对照均复现了以上回归,未使用 mock 填入待验证决定。没有查询或等待 CI。
UNVERIFIED:另做了 2500 条长历史加两项当前记录的完整 quota should-run 验证,File 与 SQLite 均未通过。不可变 base 在 todo.quota_planning.project 的约 4.63 MB 输入拒绝;本 head 通过该步骤后,又在 goal.vision_wait.project 的约 4.72 MB 输入拒绝。这里记录的是同一完整场景仍未恢复,不把较早一层通过写成全 CLI 成功,也不把两边都 exit 1 当作同一原因。初次诊断 harness 未传播 CLI exit code,已修正后重跑并保留旧失败;上述结果来自修正后的真实子进程。重新评审需要给出这条完整路径的可用结果,或依据原任务明确尚未交付的 Vision-wait 边界与后续 owner。
语义与 CI 对齐
v1 是同部署的内部 transport 扩展,原 v0 为实际调用者保留。新增引用 vocabulary 不授予执行权,snapshot 可用性也不是任务准入。当前问题是无意的可观察漂移,不是新政策;机械检查通过不能豁免 QP-observable-parity。修复无需改 gate、放宽预算、取消断言或引入 controller 框架。
我的整体评价 / Verdict
交付判断为 not_yet_proven,缺口限于上述保真修复。大历史恢复提供了实际价值,结构上也复用了正确 owner;long_horizon 仍有 frontier 关联回归,user_experience 的大输入可用性有所改善,但兼容读取和来源对象隔离还需修正。
本次改变内部 transport 和 CLI 读取,没有渲染页面变化,visual_review 为 not_applicable。未验证实际安装采用、长期模型行为和完整净成本收益;这些没有被当作本次有界修复的新门禁。
当前 PR 应交付完整规划输入的可用传输及原语义保真;最小修复是补齐实际消费者需要的身份字段,并恢复每次返回记录的深复制隔离。保留 v0 的现行调用者有依据,暂不需要新增兼容框架;修复后仍应审整份 PR,而非只追最后一个断言。没有执行合并、安装或活动 Goal 更改。
English verdict: REQUEST_CHANGES at 7a71eff. Large-history transport works, but real base/head comparisons reproduce lost legacy frontier identity and mutable payload aliasing; preserve both contracts before approval.
Signed-off-by: huangruiteng <huangrt01@163.com>
Signed-off-by: huangruiteng <huangrt01@163.com>
Signed-off-by: huangruiteng <huangrt01@163.com>
7a71eff to
eda2947
Compare
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)
最终 head:eda29472f2cc69ca99161651d463415491f8ea20。无未解决的阻塞项;这份自审以 COMMENTED 发布,后续仍单独检查合并资格。
动机 / Motivation
长期维护 Goal 的用户和 Agent 在读取 quota、准备下一步工作时会遇到这个问题。同一份含 2500 条长历史和一项尾部待办的 Goal,主干读请求因超过 2 MiB 失败;修复版在 File 和 SQLite 上均能返回结果并选中尾部待办。已验证的改善是大历史下完整 quota 读取恢复可用,同时保持普通输入的完整摘要、身份和返回值隔离。本 PR 不改变任务准入、租约、预算、默认 provider 或持久化格式,也不宣称已完成安装升级及长程效果实验。
历史越多越容易卡住入口,修一次入口后又在下一层报相同超限,并没有恢复用户的实际任务。此次不仅复核原有两个评审发现,也把同一次公开读取的后续路径走完。
改动思路 / Approach
字段裁剪把对下游消费者的知识放进了传输层;改为完整记录引用并复用现有响应 codec,减少重复知识且保留同一个 TS 决策 owner。本 PR 的交付边界是 quota planning 加后续 Vision-wait 的完整读取,以及原有可观察语义保真。
Python 只编码既有规范化事实;TS 仍负责诊断、选择、gate 和截止时间。重复记录按完整 JSON 去重,不按 Todo id 合并;独立长历史超出 inline 边界后走既有私有快照。响应继续由原 v4 codec 还原,不再把保留在 Python 的列表浅合并回来。
相比只打开快照通道,完整记录表还能消除多个来源 lane 的重复正文;相比逐个补白名单字段,它避免下一位消费者再次丢输入。没有增加用户配置、权限确认或第二套业务规则。采用文字说明,未新增需要依赖渲染器理解的图。
具体改动 / Changes
本轮按原评审的四项准则复核,参考版本为 7a71effae23ef03425fb06dc3947259969e16015;独立核对的已接受规范是 docs/architecture/rfcs/typescript-control-plane-migration-v0.md 在 5d7f0a61b0b79876801c05e1d26352687f270794 的完整事实、单 TS owner 和有界响应约定。新补的中英文段落只记录交付边界,不被用作证明自身正确的 oracle。
| 准则 | 本 head 的结果 |
|---|---|
| QP-complete-source | implemented:完整记录进入 TS;2500 条长历史和尾部工作在 File/SQLite 的真实公开 quota 调用通过,来源未改。 |
| QP-one-owner | implemented:复用原 quota/resume/Vision-wait 决策 owner,Python 仅保留输入 codec 和传输。 |
| QP-observable-parity | implemented:三个无 id 身份 fallback、两个返回值修改隔离反例通过;9 组公开完整摘要与主干相等。 |
| QP-private-bounds | implemented:私有文件权限、摘要、字节数、symlink 和 method 限制仍验证;2 MiB/64 MiB 界限未提高。 |
关键代码讲解
build_referenced_todo_resume_planning_request保存完整的 v0 规范化记录,source 仅改为有序引用。相同 id、不同事实不会被合并;这不是保存任意未知 Todo 字段的新承诺。projectTodoResumePlanning先严格校验版本,再校验 record 和整数索引,随后仍执行原诊断和选择。已有实际 v0 调用者保留,数组不能靠字符串转换冒充版本。project_quota_planning使用原私有快照和 v4 响应解码器。所有 payload 在 frontier 决定前就完整存在,返回的嵌套记录也不会再与原输入共享可变对象。build_goal_vision_wait_state同样复用完整记录与快照通道,避免第一层 quota 通过后又被后一层大输入阻断。
全 diff 为 11 个文件,production +78/-11、tests +189/-5、docs +18/-0。与最初 PR 相比删除了约 50 行裁剪和恢复机制;新增测试保护公开行为和失败边界,不引入新测试框架。
对主干的风险 / Risks
最强反例是“外层测试成功但中途决策已错”或“第一层恢复后下一层仍失败”。本轮先在未修复代码复现身份漂移和延迟修改来源;不可变主干的同 harness 为 5 项语义通过、2 项大历史失败,修复版保留前者并修复后者。9 组固定时钟公开摘要逐字段相等,不靠删字段或宽泛归一化消除差异;完整 source 顺序、scope、claim、空输入与冲突事实均覆盖。
PASS:quota/resume/Vision-wait/Effect runtime 首轮 186 passed、1 个现有 Linux-only skip;最终 schema 和引用合同组 37 passed;另 129 项 CLI/等待/恢复通过。最终 TS typecheck、两项私有 snapshot 测试、双语检查及标准 premerge 均通过。premerge 为 6 项直接检查加 19 项选中检查、零失败、零 manual hold,精确 scope 的质量回执有效。37 项最终用例独立覆盖最后的严格 schema 修正;没有把早先失败记录改写为通过。
保留限制:macOS 上没有执行 Linux thread-group 用例,也未验证 Windows、安装态 App 或真实模型长期效果。没有改存储事务,因此不声称重新完成 PostgreSQL authority 验证。按 Goal 配置未查询或等待 CI;这不等于远端 CI 被认定为通过。
语义与 CI 对齐
v1 是协同部署的内部传输扩展;v0 因真实调用者继续保留,政策仍只有一份。新的 method opt-in 复用现有只读方法词汇,未知方法、错误引用、文件不安全和超硬上限继续拒绝。没有放松预算、跳过当前必需本地检查或把可读快照变成任务权限。
我的整体评价 / Verdict
当前有界任务判定为 goal_achieved:大历史下可完成公开读取,原两个 correctness finding 已有反例和真实路径验证。long_horizon 的改善限定在累积状态不再卡住下一次读取;user_experience 的改善是无需新增操作、设置或确认即可继续原任务,未把它写成已证明的自主工作效果提升。
字段裁剪把对下游消费者的知识放进了传输层;改为完整记录引用并复用现有响应 codec,减少重复知识且保留同一个 TS 决策 owner。本 PR 的交付边界是 quota planning 加后续 Vision-wait 的完整读取,以及原有可观察语义保真。保留 v0 有实际 caller 和删除条件;业务规则没有双实现。完整框架或强制继续迁移其它 Python 调用者在本 PR 中不必要。
检查了 quota/Goal Vision-wait 的调用链;本次没有渲染页面改动,不以截图代替读取语义验证。未验证安装态 App、Windows 和原生窄屏;它们没有被声称为本次 UI 交付。当前无阻塞 finding;应继续保留 64 MiB 上限,并将自审结论、旧 review closeout 和最终 merge-readiness 分别记录。
English verdict: APPROVE at eda2947. Complete-record transport fixes frontier identity and mutable isolation, and real File/SQLite large-history quota reads now finish through Vision-wait. Focused, continuation, typecheck and premerge validation passed; platform and installed-runtime limits remain explicit.
在维护者明确授权修复并自合并本 PR 的范围内,撤销已解决的旧阻塞,保留原讨论。eda29472f2cc69ca99161651d463415491f8ea20 删除字段白名单及浅恢复:三种 frontier fallback、两个延迟修改隔离回归通过;9 组完整摘要与不可变主干相等;真实 File/SQLite 的 2500 长历史 quota 调用也通过后续 Vision-wait。最终版本自审和验证记录:#7616 (review)
长期 Goal 的 Todo 历史会让 quota 读取超过 2 MiB inline RPC 上限,阻断下一步工作。本 PR 让完整读取通过既有私有快照通道完成,同时保留原规划事实和决策语义。
resume_planning用完整规范化记录表消除 lane 间的重复正文,TS 保留唯一的诊断、选择和截止时间 owner。修复版移除了最初的字段白名单与 Python 二次恢复,避免丢失 frontier 身份、返回结果与原输入共享可变对象;后续 Vision-wait 同样复用现有通道,避免把大输入失败推迟到下一步。没有提高 2 MiB inline 或 64 MiB snapshot/响应展开上限,也没有增加用户配置、权限或持久化格式。验证版本:
eda29472f2cc69ca99161651d463415491f8ea20,基于main的5d7f0a61b0b79876801c05e1d26352687f270794。quota should-run返回成功、数量与选中项正确,canonical 来源和 Goal 正文未改。不可变主干的同一用例在两个 provider 上均超限失败。仅改变内部读取传输,没有渲染页面变更。未声称完成安装态 App、Windows 或长期模型效果验证;按 Goal 配置没有查询或等待远端 CI。没有活动 Goal 迁移或写入。TS 迁移 RFC 的中英文 checkpoint 同步说明了交付边界。