Repository navigation
fix(chat): retain partial handoff scope in steward evidence reads - #8056
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 (Codex); provider=OpenAI; self_reported (host execution observation unavailable).
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
精确 head 2ba8d250b7979fe70e421c389a4009f2ddfbac48 无阻塞发现。本次完整审查四文件和原生结果 owner,修复既有证据读取遗漏;业务完成、实际模型采用和安装送达仍按各自证据判断。
动机 / Motivation
通过管家查询既有交办进度、等待原问题答复的用户与原接收 Agent。 同一交办先送达阶段性结果,再排队补充结论:旧查询只见 conclusion/delivered,容易被误当作已经答完;新查询同时给出原生剩余范围或待投递续接项。 原生 Inbox 的结果范围现在通过同一管家读取入口返回,部分答复、排队补答和不可读证据继续可见。 不自动完成业务,不重放请求,不增加消费者、调度器、授权或可编辑的完成状态。 收据上的结果范围不证明原问题获得了完整、准确的实质答案;实际模型采用、安装与原受众送达仍需分别验收。
改动思路 / Approach
复用现有 Inbox 的 receipt_states 与 agenda;Python 只做已授权页面的身份绑定、只读收集和展示脱敏,不另写 pending/final 判断。 只有缺失的读取适配需要修复:原生 Inbox 已经拥有结果范围和续接规则,复用它比给 Python 增加完成判断、同步字段或新队列更小。 本 PR 只补齐既有管家读取与报告来源的结果范围,原结果发布、执行和回传 owner 均不改。 如果只给 Python 加“存在已送达 conclusion”判断,旧结果会再次遮蔽最新剩余范围;如果维护另一份 pending 列表,则需要额外同步,且无法正确处理源修订和损坏结果。当前实现读取原已授权页的原始身份,随后在一次既有原生批读中派生结果。观察失败保留未知,不启动恢复执行,也不靠猜测正文中的“完成”字样作结论。
具体改动 / Changes
关键代码讲解
handoff_receipt_readbacks(loopx/capabilities/manager_context/inspection.py:332)在原受众筛选后按现有 Goal-instance 路径读回原请求,核对 request/Goal/Agent/source 身份及修订,再调用原 read_inbox_transaction(receipt_states, include_agenda=True)。只投影 native inbox_state、remaining_work 和 agenda,清掉旧的派生 remainder,复用路径脱敏。没有写结果、已读、消费或调度操作。ManagerInspection.read(同文件:559)继续使用原有分页、来源范围和末尾 live scope 检查,损坏结果显式保持 unknown;report_source.py 通过既有 reader 自动取得同样的信息。
test_handoff_reader_retains_partial_scope_after_delivery_and_later_results 和 test_handoff_scope_is_independent_of_page_size_and_stale_projection_annotations(tests/test_manager_context_roundtrip.py:270、354)使用真实临时 request/result/delivery 文件和原 report/drain 路径,比较部分结果、排队补答、送达、后来新增缺口与重启后的读回。13 个请求跨 3/12 大小分页保持相同义务;陈旧标注不能覆盖最终结果。外部 provider ACK 为合成边界,不冒充真实飞书验收。
规范 loopx/capabilities/manager_context/README.md,不可变 revision ce4cfc1ce74a2ffe0d685758b8d6e9233b467f41:partial-result-retention 对应部分结果仍留原 Inbox/agenda;queued-is-not-delivered 对应最终正文排队前后不同续接项;unavailable-is-not-absence 对应损坏回执保留 recover_evidence;receipt-is-not-acceptance 对应只读、无业务重放且 null agenda 不证明完整回答。相关目标基线已推进到 85d88e4394ee44dee9122c09dd883a35857deb2f,涉及的 reader、Inbox、agenda 和 report caller 与原基线逐文件字节一致,故这些比较仍适用。
对主干的风险 / Risks
最强反例是修复漏报时泄漏另一原受众,或把旧派生字段当成新权威。真实公共入口的另一 channel 得到空页;读取过程中撤权返回 authorization_changed;畸形 remaining_work 保留原生不可读状态和 recover_evidence。读取前后原 JSON 字节完全一致。当前修订不一致会拒绝本次查询;不把不完整读取当成空队列,也不另发或重跑旧结果。额外读取按原页有界,持久化和执行 owner 均未改变。
语义与 CI 对齐
本次复用既有语义词汇,没有新状态机或默认关闭特性。四项最终 fixture 在不可变旧 reader 上均失败,在此 head 所属的同一 fixture 上通过;另外发现并修复了首版的陈旧 remainder 遗留。222 项相关测试通过,最终提交的标准 premerge 通过 6 项直接检查和 18 项选定检查,没有失败、跳过或人工 hold。wait_for_ci=false,未查询或等待远端 CI。本次变更文件的公开边界扫描通过。无需收据迁移或抬高模块预算。
我的整体评价 / Verdict
long_horizon 与 user_experience 均改善:已有承诺在重复读取、分阶段交付及重启后继续可见,没有新增用户输入、确认或恢复轮次。本 PR 只补齐既有管家读取与报告来源的结果范围,原结果发布、执行和回传 owner 均不改。 实现是现有 owner 的读取接入,成本与真实遗漏相称,未来策略仍只由原生 Inbox 修改。loopx/capabilities/manager_context/inspection.py 仅改变模型读取的证据字段和工具说明;App/Lark 渲染组件未变,没有新增视觉界面;实际模型理解和业务履行不由字段测试证明。收据上的结果范围不证明原问题获得了完整、准确的实质答案;实际模型采用、安装与原受众送达仍需分别验收。
English verdict: APPROVE 2ba8d25; the existing scoped reader now preserves native partial-result and return obligations without adding execution, authority, or mutable completion state.
管家查询交办状态时只看到投递收据,已经送达的阶段性 conclusion 会掩盖接收者明确保留的工作范围。现在
view=handoffs在原受众筛选后复用原生 Inbox 的 receipt_states/agenda,保留最新修订的 remaining_work、后续待投递结果和不可读证据;不新增任务状态、调度器或消息消费者。最终结果会清除陈旧的派生 remainder。验证使用实际 report → drain → scoped read 路径,覆盖部分结果送达、最终结果排队与送达、后来重新声明缺口、重启、授权撤回、受众隔离、损坏结果范围、13 个请求的 3/12 大小分页与陈旧标注。相同最终 fixture 在不可变旧 reader 上 4 项失败,在最终提交上 222 项相关测试通过;标准 premerge 通过 6 项直接检查和 18 项选定检查,未查询或等待远端 CI。
这只修复结果范围的读取,未证明任何具体业务已完成,也不会重放原请求或修改原始收据。