Repository navigation
fix(chat): resume verified remaining work after result review - #8329
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: model_agent; self_reported; GPT-6; OpenAI. 当前宿主未提供可验证的执行归属记录,使用已知模型家族,不声称精确构建。
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
结论:APPROVE。没有发现阻断项;这是可验证的恢复路径增量,生产采用与历史消息补回尚未完成。审查完整六文件相对主干的差异,目标提交为 f048d4a,基线为 df67371。
动机 / Motivation
使用普通私聊项目助手、已有部分结果并等待剩余工作的用户。 旧请求完成只读复核后,服务只看到复核答复,原生运行进程恢复也无法续办。新版本取得原运行进程的新鲜效果证明后,沿原请求只做一次剩余工作。 在原消息处收到剩余工作的结果,既有产物不重复写入,原答复和复核历史保留。 这里“原生运行进程”指原来执行该请求、仍关联同一线程的可写进程。只读复核已经能返回报告,既有未完成工作却被当前复核答复遮住,用户继续发送别的问题也无法恢复旧事。
本次范围限于已完成复核后的既有一次接续,不新增消费者、权限或第二次重试。 真实服务升级和历史原消息的补回仍待独立验收,未知效果和失去原运行进程所有权的请求继续保留。 这些限定意味着测试证明的是接续入口修复,不能据此宣布全部历史请求完成。维持原状会让合法工作持续等待;直接重放整条原消息则没有保留已完成效果的依据。
改动思路 / Approach
派生关联留在 Python IO 边界,接续资格与一次预算复用 TypeScript 原有规则,避免形成第二份业务判定。 本 PR 只恢复已完成只读复核后、原可写运行进程自然返回的既有单次接续;不改变冷读取授权和效果不明的失败处理。 输入依次经过原 Lark reconcile、原请求日志与实际 Turn 读取、原生效果独立核对、既有队列和原消息投递。新 helper 从现有记录派生复核关联,不让模型文本或人工标签决定权限。live_work_owner 是当前原 adapter 的瞬时事实,真正的效果证明仍来自既有原生核对。
比较两条现有路径:没有复核的请求继续进入原 planUnfinishedWork;已经复核的请求先验证原结果、复核、binding 和同一 native thread,再调用同一个 planUnfinishedWork。仅删除 TS 的只读拒绝会错误接纳冷复核进程,仅调整 pending 展示则仍不能到达真实执行。因此保留三个必要边界:发现原 intent、typed 资格判定、实际发送前重核。既有 work-1 是一次剩余工作 reservation,不是新的重试额度。
| 实际前态 | 修复前 | 此提交 |
|---|---|---|
| 复核完成且原可写进程自然恢复、效果已结清 | 原请求继续挂起 | 原请求只接续剩余工作一次 |
| 冷复核进程、未知效果、来源变化或 Stop | 不允许工作 | 继续拒绝并保留未完成 |
| 已预约或已入队时崩溃 | 没有该复核后接续入口 | 采用同一预约与队列身份 |
该表来自源码和隔离入口回放;不表示真实生产已经升级。无新增消费者、CLI、配置开关、权限或工作预算,也不改变原 continuation instruction。
具体改动 / Changes
六个文件共 +223/-12:两个生产文件修复状态关联和准入,两个现有测试文件增加恢复、拒绝及崩溃场景,双语 RFC 增加17行说明。Accepted 依据为 docs/architecture/rfcs/app-conversation-and-async-inbox-v0.md,固定修订 df67371c374a5ece11c1f6ceddae11b51e0f0330,使用修改前文本独立审查。原规范
规范条款 explicit-unfinished-work-after-a-completed-turn 已实现:沿原 work-1、原来源授权和已结清效果只做剩余工作;32个恢复场景及两个崩溃窗口覆盖它。条款 completed-private-project-result-reviews 已实现:复核仍只读,不能自己产生写权限;cold-native、unknown、failed-effect、Stop 与撤销负例继续拒绝。本次文档是披露两者关系,没有将新写的说明反过来当独立验收依据。
关键代码讲解
_retained_result_review从当前 reservation 或 work-1 的历史末项取得原只读复核,再读取实际 review Turn。它只恢复因果关联,不能单凭 unfinished_work 判为可执行;answer/history review 被排除,缺失记录返回无关联。代码planWorkAfterResultReview集中检查原 Turn、已完成复核、绑定快照、确定性 client ID 与单次预算。新工作必须有真正的 live writer;原生效果证明还须通过原 planUnfinishedWork。已存在的 enqueue receipt 可在重启后关联,不能创建第二 work attempt。代码recover_failed_request在原请求上保留原工作和复核快照,提交前重新读取当前二者,避免复核覆盖掉原 intent。两个故障注入点分别覆盖预约和入队窗口;最后恢复同一个工作身份,原产物不再次写入。代码prepare_continuation_input在实际发送前重核原结果、复核、绑定与停止状态,再使用既有 native inventory/queue 检查。此前发现的资格不会越过中途 source 编辑、撤销或 Stop。代码
对主干的风险 / Risks
最强反例是冷只读复核被误当原 writer,或把旧“效果已结清”文字当新证据,从而重复外部写入。当前实现同时检查原 adapter 身份、原 native thread、只读标志与独立原生效果,并重核 source、binding、Stop、真实重复输入和实际发送条件。错误状态仍留 pending;失败或不完整的 work-1 不获得第二次预算。回滚该提交可恢复保守拒绝,但不能丢弃已入队工作身份后再重放。
PASS:在真实 Lark reconcile -> Core/File -> TypeScript -> native subprocess 协议路径上,同一测试 oracle(SHA-256 b4ad9e3aa97c271a34f3c2e432f309f1dc7f459b4f860987190a3b9865d524fd)对基线运行得到3 failed、5 passed;失败分别为正向接续和两个崩溃窗口根本未准入。最终 head 为8 passed。源码来源插件断言两侧实际导入各自产品模块,纠正并保留了首轮因 conftest 误引 head 的无效比较。外部 Lark 与模型仍是合成替身,不能用这些结果证明生产效果。
PASS:恢复矩阵32项;扩展 Python 503项;完整 TypeScript 6,242项通过、78项既有跳过、0失败。最终源码与测试 blob 在补文档前后相同,证据可复用。typecheck、仓库配置 mypy(17文件)、Ruff、双语校验,以及最终6项直接检查加11项选定 premerge 检查通过。早期缺失 pyright、误用 mypy 路径和旧主干注解错误均保留;正式当前配置验证已经独立通过,注解修复来自上游 #8319。未把一次绿色结果隐藏或归因历史失败。
语义与验证对齐
复用既有 unfinished_work、效果结清及 work-1 词义;没有为这个分支创建公共角色、状态或授权协议。diff 语义 advisory 没有受支持载体,只能作为有限扫描结果,另用上述原规范映射和完整检查确认行为。默认变化已在双语 RFC 披露。PR 不宣称 opt-in/default-off,不伪造开关关闭实验;对相同来源变更、Stop、撤销、真正重复和未知效果做了基线/提交成对验证。根据当前 policy,远端 CI 未读取、轮询或等待,审查依据为仓库本地检查。
我的整体评价 / Verdict
long_horizon 与 user_experience 均 improved:已完成复核不再永久遮住合法剩余工作,原结果及复核保留,源码集成回放通过原请求投递并只写剩余效果一次。机制与问题相称,沿现有状态、预算和执行 owner 完成一个必要增量;没有理由另建重试服务、手工同步台账或 reset 版本清除旧历史。
没有修改渲染组件、布局或用户可展开内容;原消息投递继续使用既有路径。 真实飞书客户端呈现及升级后的历史原消息补回未在本次源码审查中验收。 最强尚缺验收是生产原版本采用后,由原消费者自然执行并在原受众独立读回。真实服务升级和历史原消息的补回仍待独立验收,未知效果和失去原运行进程所有权的请求继续保留。 本审查没有将代码通过等同于这些事实,父目标保持未完成。没有发现阻断项,可在现有独立合并与安装权限下继续;这条作者自审 COMMENTED 结论本身不授予合并或部署权限。
English verdict: APPROVE — verified bounded recovery fix; live adoption and historical delivery remain unverified.
原项目请求返回部分结果后,Core 会保留 unfinished_work,并允许一次只读结果复核。复核送达后,请求指针移到不含 unfinished_work 的复核回合。恢复发现入口随后跳过该请求,原生运行进程恢复后也无法进入已有的剩余工作接续。
此修改让 Core 从已保存的复核预约读回原回合,交给现有 TypeScript 会话规则核验。只有原项目、原消息、原授权及复核关系一致,且原可写运行进程重新证明工具效果已结算时,才允许使用已有的一次 work-1 接续。接续保留原报告与复核答复,崩溃恢复使用同一预约和队列回执。接续失败时,原未完义务继续显示。
已覆盖原消息变更、撤权、停止、同文不同请求、未知效果和入队前后崩溃。合成飞书与原生进程验收验证原路送达一次,并检查结果文件没有重复追加。32 项定向恢复场景、503 项 Python 集成回归、完整 TypeScript 套件(6,242 通过、78 跳过)、TypeScript 编译、仓库配置内 mypy、Ruff 和 10 项提交前检查通过。中英文 RFC 补充了复核完成后重新取得效果证明的边界,配对检查通过。
生产采用和历史请求的实际补回仍需沿原服务独立验收。