Repository navigation
fix(chat): share endpoint observations within capability responses - #7951
Conversation
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; model=GPT-6 (Codex); provider=OpenAI; self_reported (host execution observation unavailable).
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
动机 / Motivation
没有发现阻塞问题。读取管家能力与执行器状态的 Chat 用户。端点在一次读取期间变动时,旧响应可能选中一个同时被标为不可用的执行器;新响应在同一次读取中使用同一份观测。真实 HTTP 入口的连续三次读取保持选择与状态一致,并且每次只探测一次。本次不修改会话权限、持久化格式、模型请求、消息重放或前端布局。本 PR 尚未验证已安装服务的间歇超时和完整原消息闭环。
旧实现每次读取都会重复执行端点探测,即使端点稳定,也平白承担两次 provider IO。只缩短超时不能消除同一响应的矛盾;引入全局缓存又会把过期状态带到后续操作。因此,这次修复是已有故障的一段可独立使用、测试和回退的改进,不代表所有管家问题已经解决。
改动思路 / Approach
复用既有端点目录和分配 owner,在 HTTP 组合处传递短生命周期观测,避免新增缓存、状态表或另一套选择规则。当前 PR 只交付单次能力响应的一致性,以及包含进程枚举的有界只读探测;实际执行继续独立发现。能力读取继续调用现有端点目录,选择策略仍由 manager allocation 决定;只读响应不会建立 Session、提交模型请求或授予权限。省略观测参数的真实分配调用仍会重新读取,传入空列表则明确保持未知,避免隐式再试一次。状态展示与执行的生命期在这里有明确区别,不能将展示结果缓存为执行许可。
Antigravity 的探测把进程枚举与随后发现放到同一观察时限中。实际执行及结果读取不传此新参数,保留原阶段时限;这是有意保留的不同用途,而非第二套选择规则。
具体改动 / Changes
按 docs/reference/operator-model-credential.md 的现有约定判断,spec_revision 为 d94202c55f3f80f0939e4e953bfeee0d3a079655。原文没有编号,下列是评审标识:same-readback 已实现,同一能力响应的选择和状态使用相同观测;persisted-allocation 已实现,本次不改写当前会话的端点、模型、effort、pool 或来源,后续操作仍走现有分配与权限检查。
关键代码讲解
- ChatRequestHandler.do_GET 在一次请求中取得 adapters,再交给管家投影并直接返回这份列表。真实 HTTP 测试覆盖安装 provider 和普通组合两种入口,连续可用、消失、恢复时都要求选择与返回状态一致。
- manager_capabilities_projection 沿现有凭据和模型 owner 传递观测;_controller_endpoint_availability 用
is None区分未提供与明确空观测。空列表不会悄悄触发重新探测。 - manager_executor_allocation 保留既有 preferred、pinned、flexible 规则。真实打开会话及模型采用调用不传 HTTP 观测,测试确认下一次仍分别读到 False、True,既有 Session 未改变。
- discover_antigravity_language_server 接收可选 deadline;仅就绪探测传入它。慢 ps/lsof 的回归在原基线上失败,在当前提交停止观察后,下一次正常发现仍成功。
六个文件共增加 138 行、删除 20 行,其中生产代码 +45/-20、测试 +93;未增加模块、CLI、后台服务或持久化状态。现有大模块的规模问题留作既有 advisory,本次没有靠扩大门槛获得通过。
对主干的风险 / Risks
最强反例是端点在展示之后变化,旧观测错误地支配后续执行。实际调用搜索与无缓存回归证明快照仅在当前 HTTP 组合中使用;原生模型、忙碌会话、撤销 transport、超时保留部分响应等负路径也在当前套件内。慢发现现在可能更早显示不可用,随后候选选择仍受原机器 pool 约束;操作本身会重新发现。4 秒指共享发现 allowance,并非涵盖操作系统调度或子进程清理的硬墙钟承诺。
PASS:当前提交的三个针对性模块 92 项通过;premerge 的 6 项直接检查与 2 项选择检查通过,保留一项既有 maintainability advisory。真实 HTTP 入口使用隔离 store 与受控 provider,未运行生产消费者或付费模型。相同当前测试在不可变基线重现三个缺陷失败。扩大回归 95 项通过、2 项 FAIL:配置目录对 stride_strategy 和端点选项的旧断言,在同一基线分别以相同字段详情失败;本次不改变它们的因果路径,不把这些失败改称通过。
语义与 CI 对齐
复用现有能力 schema、分配理由和术语,没有新增权限或义务词汇。稳定输入下完整响应 SHA 均为 a0869c72fc0056dddb08e60ffae0befc18df54af858d8a5c498f3a17b24c2000;有意差异仅为一次请求共享观测和只读发现的时间分配。按当前 Goal 的 wait_for_ci=false,未查询、轮询或等待远端 CI;结论依据本地当前提交证据。
我的整体评价 / Verdict
本次属于 justified_increment:long_horizon improved,重复读取的成本下降且没有跨请求缓存;user_experience improved,同一读取的显示与选择更可信,原有意图和授权下无需新增交互。检查 chat_server.py 的能力响应、chat_manager.py 投影与现有客户端消费路径;没有布局、文案、样式或字段结构改动,故视觉审查不适用。unverified_scope:none for rendered changes;已安装服务和完整消息回传仍待独立验收。
现有 owner 的复用与一次性观测相称,保留可选参数是为了真实操作重新发现,未引入版本分叉或数据迁移。在受控 120ms provider 的三次样本中,handler 从约 0.250–0.255 秒、两次探测变为 0.121–0.131 秒、一次探测;这不是浏览器/网络或生产 p95 测量。该改进可合入,再由普通安装流程验证原服务;不能仅凭这些数字宣告现场全部间歇超时或未回复消息已经闭环。
English verdict: APPROVE — head 3626eb5; no blocking finding. Real HTTP coherence, fresh subsequent allocation and bounded advisory discovery are covered; 92 focused tests and required premerge checks pass. Two inherited configuration assertion failures and pending installed-service qualification remain disclosed.
一次能力读取会重复探测同一端点;端点在两次探测之间变化时,执行器选择与适配器状态还可能互相矛盾。现在一次 HTTP 响应共享一次新鲜观测,后续请求及实际执行继续独立探测。
Antigravity 的只读就绪探测同时把进程枚举纳入原有 4 秒总预算,避免枚举耗时后重新获得完整探测预算。慢发现会更早返回不可用;实际执行的发现路径保持原有阶段时限。没有跨请求缓存或权限放宽。
验证:真实 HTTP 入口与两种 provider 组合、状态变化、空观测以及执行时重新探测等针对性测试共 92 项通过;premerge 的 6 项直接检查与 2 项选择检查通过。扩大回归 95 项通过、2 项配置断言失败;相同测试在原基线也失败,保留为既有问题。隔离的受控延迟观测确认探测次数从两次降到一次,完整响应内容保持一致。
这里验证的是响应一致性与有界的就绪观察。安装后服务、原会话与界面验收仍待执行;隔离测量没有证明所有现场间歇超时都来自该缺陷。