Repository navigation
fix(chat): review retained project results without replaying work - #8234
Conversation
Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>
There was a problem hiding this comment.
Reviewer: model_agent | GPT-6 | OpenAI | self_reported
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
动机 / Motivation
使用飞书私聊的项目助手时,用户可能已收到一份部分答复,随后需要知道已经完成了什么、还缺什么。一次工作已生成本地产物,但原命令以 130 退出;旧机制无法证明重跑安全,于是连核对产物和回答原问题也停下。新机制允许原助手只读核对证据,沿原请求把补答送回原飞书会话;用户无需重发问题。这个改动不重新执行原命令、不代办剩余业务,也不把补答当作结清。缺少结构化未完记录的旧消息、执行效果不明的业务和安装后的真实回复仍需各自核验。
改动思路 / Approach
沿用原 worker、请求账本、Session、队列和飞书投递,把能否回答与能否继续执行分开。原来可以证明写入安全时仍走旧续办规则;证明不足时,闭合的原生结果可以作为只读复核的输入。原生读取层负责取证,TypeScript 请求规则决定准入,宿主执行原来的只读配置,飞书原投递阶段负责去重和读回。现有队列和投递已处理排队、崩溃与回传;增加的边界只区分结果证据与执行证据。当前改动只覆盖已有结构化未完声明的普通项目私聊,不增加 API、消费者、权限或调度器。
具体改动 / Changes
依据 docs/architecture/rfcs/app-conversation-and-async-inbox-v0.md 在 ac62962255322cd80a5b701a4187c6f47bc17d8c 的约定,保留三个要求:original source and current grant(复核准入及出发前检查)、same reservation after a crash(崩溃后采用原预约)、answer restoration does not certify business complete(补答后仍保留未完工作)。另有 GQ07–09 的停止和恢复要求,本次覆盖此路径上的停止、保持原回合、恢复时不重复执行。基线文档中的管家结果采用和配额续办另有条件;这次没有移植它们的权限。双语 RFC 记录默认路径的新分支。
关键代码讲解
completed_result_review_readback两次读回原生回合摘要和目标条目,要求终态、唯一输入和最终答复、可关联的后续回合以及相同未完声明。失败命令是可核对的记录,返回值没有效果结清凭证;不认识的条目或变化的读回留待后续核验。planCompletedResultReview只为同源、同回合、同消息且空闲的普通项目预约一次复核;停止、撤权、活动队列或附带写权限的伪证明均不能通过。已入队但未写回的预约采用原客户端标识。_checked_completed_result_review出发前核对原回合、授权、队列和取证快照;结束后再次检查来源,拒绝动作元数据。宿主沿用工作区只读、无网络的配置,替换适配器前确认没有它持有的后台工作。模型提示用原提问时间前的上下文,不会把后来的问题当成原始意图。planBoundConversationRequest从预约中冻结的原回合和未完声明保留待办;正常复核完成和复核失败都不能把业务义务消掉。独立的飞书投递阶段沿用原收件人和现有幂等回执。普通私聊消息回原私聊;已有话题沿原话题路由。三个测试文件分别覆盖原生取证、状态规则和原队列;没有改飞书布局或添加新的消息消费者。
对主干的风险 / Risks
最大的风险是只读复核被误当作工作续办,或者排队过程中启动新输入后仍投出旧答案。正例在同一原生协议和飞书队列上,基线留在旧回合,本提交只补一次且旧回合、旧投递和产物字节不变;负例验证信号退出仍不给写权限,后台工作不被关闭,停止、撤权、新输入排队和源消息变化时不启动复核。复核返回未完元数据会失败,原待办仍在。普通写入、消息绑定和撤权对照在基线和当前提交各通过三项。现有兼容边界是同一发布物里的 Python worker 与 TypeScript 规则;降级时原记录和禁止重放标识仍保留,旧版待办投影不认识新增复核后的欠办状态,需等恢复新版读回。
当前提交的 237 项相关 Python 用例(含新增 20 项)、61 项 TypeScript binding 用例、TypeScript 类型检查、Ruff、配置内 strict mypy、双语 RFC 和标准 premerge 通过。额外将三个非配置入口直接交给 mypy 的探查在基线也失败,按文件和错误明细比较无新增诊断;保留原失败。依本次 Goal 的验证配置未查询或等待 GitHub CI。合成原生宿主与飞书 provider 覆盖协议、状态和重复投递,真实模型答复及外部读回在安装后验收。
语义与 CI 对齐
复用现有只读复核、队列和投递术语;新增的结果证据字段留在内部,不能冒充写入或完成凭证。相同源和授予条件仍由既有规则决定,新的原生取证和状态用例核验了这条界线。
我的整体评价 / Verdict
可交付的一步是把已有结果带回原用户,同时保持原业务在待办里。长期连续性有所改善:预约崩溃采用原回合,已完成的复核不会不断重试或把原命令当成可重跑。用户可在原飞书私聊收到与原消息对应的补答,原问题之外无需追加操作;后端复用既有飞书呈现,没有改版式或组件。当前没有待修的合并阻塞项,旧版降级后的待办投影和真实安装验收仍有上述边界。所审提交为 14753402e99d22977e44cfc4dcf9276c5a636cf2。
英文简短结论
English verdict: APPROVE. At 1475340, the original queue can return one restricted review while preserving the original work and denying replay authority. Baseline/head comparison, negative protocol tests, and repository premerge checks passed. Live delivery remains a separate adoption check.
普通项目助手可能已经留下部分答复和本地产物,但原命令被中断,无法证明重跑安全。此前这也挡住了核对已有结果并回复原问题;原消息会停在部分答复。
现在,原有 worker 在读回对应的稳定原生终态、确认来源和授权仍有效后,可以沿同一 Session 和队列做一次工作区只读复核。它能检查已有产物,使用原提问时的上下文回答,并通过原飞书会话的独立投递阶段补回。原回合和旧投递保持不变,原未完工作继续留在待办。只读证据不会赋予执行权限;停止、撤权、新输入或已有后台工作仍会挡住复核。
验证:同一原生协议与飞书队列用例在基线停在原回合,在本提交只补答一次。新增 20 项原生读回和队列回归通过,覆盖未知效果、后台工作、授权变化、停止、排队、异常元数据和预约崩溃。相关会话回归、TypeScript 规则测试和类型检查通过。合成 provider 验证了协议与投递幂等性;部署后的真实模型答复及原消息读回另验。