Repository navigation
fix(chat): return legacy same-question answers per original source - #8341
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 · GPT-6 · OpenAI · self_reported
Approval conclusion (author-owned PR; GitHub blocks formal self-approval)
动机 / Motivation
普通项目私聊中再次提交同一问题的用户。旧消息只有普通的未完成答复时,即使另一条原消息已有结果复核,它仍不能收到自己的补答;新路径为它单独核验并返回结果。每条原消息保留独立身份,并经原回复 worker 获得一次只读结果补答。不重新执行业务、不推断未知效果,也不关闭原未完义务或整个历史积压。真实安装采用、线上原消息送达及其余历史消息仍需分别验收。不修会让用户反复重发仍收不到对应答案;直接把另一条消息的投递记到本条,会掩盖真实缺口。
改动思路 / Approach
原回复 worker、Core 决策和 Codex 读取各守现有职责,没有第二个准入或发送 owner。本 PR 只补齐有规范同文结果证据的独立旧消息复核。更小的合法选择是复用已有结果复核,而非再造 provider、消息消费者或通用重放器。原生元数据只证明可以读旧答复,Core 再核对独立来源、前后时间、当前绑定和一次预算;原回复 worker 负责回到本条消息。
| 路径 | 结果 |
|---|---|
| 无合格同文证据、跨来源或时序不符 | 保持原请求,不准入 |
| 证据完整且原队列空闲 | 本条独立只读复核,核验当前产物后补答 |
| 停止、撤权、证据变化或已有尝试 | 保持等待或认回同一预约,不增加次数 |
此表解释精确 head 7b44c18 的控制流,测试证据另列。新增关联来自完整规范日志,并在预约后固定、执行前重查,不要求用户填写状态;扫描内索引不是准入 authority。
具体改动 / Changes
规范依据为 docs/architecture/rfcs/app-conversation-and-async-inbox-v0.md,读取的是修改前提交 15467f25c322caf9c1ec6218d7315471a17a7d85 的已完成私聊结果复核合同。这里保留原安全不变量,明确新增旧请求范围,不用本 PR 改写后的规范反证自身正确。original-source-identity 已实现并由独立原消息/旧投递不变断言验证;restricted-result-review 已实现并由文件只读、禁网及未知原生效果用例验证;single-review-recovery 已实现并由预约与入队两处崩溃的同一回执采用验证。
关键代码讲解
_related_result_review只收集同 Session、完整问题及来源的规范 peer 复核;不是业务已完成判断,也不会借另一条投递核销本条。planRelatedResultReview要求更早的 typed 原请求和晚于旧答复的已投递结果复核。跨 binding、来源、问题、时序或证据变化均拒绝;复用现有planCompletedResultReview的只读预算、队列及崩溃采用。completed_result_review_readback默认仍拒绝无声明答复,仅在 Core 明确请求受限证明时读回完整最终响应。稳定性、后续 Turn 关联、未知/活动效果检查仍在;返回值不具备 effects-settled 权限。_checked_completed_result_review在实际复核前重新读取原请求、授权、停止、队列及固定 peer 证据。新增提示把 peer 答复标作数据,仍禁止写入、发送、委派、提出保护动作或制造未完声明。
三个生产文件承载同一恢复切片,三个测试文件覆盖规范决策、原生协议及原 worker;双语 RFC 同步。共 416 行增加、26 行删除,主体测试不是新的运行时框架。新测试采用真实文件状态/队列/stdio 协议边界和合成模型/飞书 peer;原 worker 自行发现、执行、投递。旧 Turn、旧终态消息和产物字节均被独立断言保护。
对主干的风险 / Risks
最强反例是同文问题其实是不同请求,或只读补答被误当成可写重放。当前实现按独立原身份投递,时间关系、精确旧 final、只读配置和一处预算共同防止这两类错误。已有可写 owner 不会被新的复核替换;普通 typed 续办及失败命令的旧语义继续保留。恢复失败可以认回原预约,不能由本 PR 重新发业务或清次数。
PASS:精确 head 63 项 Python、62 项 TypeScript、control-plane typecheck,标准 premerge 的 6 个直接门与 11 项选择检查、双语和公开边界。相同合成输入在 base 15467f25c322caf9c1ec6218d7315471a17a7d85 的原 worker 路径会因独立旧源未补答而失败;head 通过,且产物内容与原投递不变。停止、撤权、原文变化和两类崩溃均通过。完整 fixture SHA-256 为 0ef3f735dd2872ecf6235f94bd453a97c8018ecc70690d75b829ca602a1a985f;只规范化随机 id、临时目录和时刻,不规范化结果、权限、身份关系或副作用。
补充 mypy 并未全库通过:两个修改文件的 45 项既有诊断按路径与完整错误详情逐项相同,无新增;全量传递检查仍有其他错误。它不替代已通过的必需检查,也不把旧错误称为本修复已解决。按 Goal 的 wait_for_ci=false 未查询或等待远端 CI。
语义与 CI 对齐
这是现有结果复核词汇的受限扩展。内部预约新增旧请求关联,producer 是既有 Core 准入,consumer 是同一队列与 worker;不增加人的业务意图、Actor、能力开关或 effects 权限。双语 RFC 明确新默认;未命中资格的普通来源、typed 工作及未知效果保持原合同。测试中的合成回复不能证明真实模型已经理解或线上已经送达。
我的整体评价 / Verdict
没有发现阻断问题,APPROVE 此精确 head 的完整切片。原回复 worker、Core 决策和 Codex 读取各守现有职责,没有第二个准入或发送 owner。本 PR 只补齐有规范同文结果证据的独立旧消息复核。一次预算、原身份与崩溃采用保持,原 worker 能自行接续,不要求用户重新发送问题。用户沿原私聊收到独立补答,既有渲染器和页面布局没有变化。没有新页面或渲染层修改,视觉复核不适用;线上安装采用及实际用户补答在本 PR 审阅时尚未验证。与不修、复制另条答复或直接重放相比,新增范围及维护成本有依据;保留旧预约和派发 owner,后续上线失败沿正常管理器回滚,历史未完和其他消息继续逐条验收。
English verdict: APPROVE 7b44c18; independent legacy source recovery is read-only, bounded and covered by the default-worker counterfactual, negative cases and required local checks. Real installation and delivery remain separate acceptance.
旧消息只有普通的“未完成”答复、没有 typed
unfinished_work时,即使同一问题的另一条原消息已经核验了当前结果,原回复 worker 也无法为这条独立消息补答。本修改在现有 native-chat / Codex provider 和 Core conversation-binding owner 中补齐一次受限结果复核:必须是同一 Session、binding、受众和完整问题文本,更早的独立请求已在旧答复之后完成并投递合格复核;Core 固定其规范记录,并独立读回旧请求的原生最终答复。每条消息使用自己的队列身份、次数与投递阶段。执行前复核来源、权限、停止、steering、队列和证据;复核仅能读取本地工作区,禁用网络,不能写入、发送、委派或重放业务。
同文消息不会相互核销,不推断缺失的业务意图或执行效果;旧复核不能继续派生旧复核。原 Turn、旧答复和未完声明保持原样。沿用现有 provider、权限配置和回复 worker,未增加 capability、监听进程或配置开关;发现阶段的同文索引仅在一次扫描内复用,实际准入和执行重新读取规范状态。配套更新双语 RFC。
验证:独立协议进程 + 原 Lark worker 用例中,base 漏补答,修复后每条原消息单独收到结果,现有产物字节不变。停止、撤权、原文变更及预约/入队崩溃恢复均通过;原恢复路径 55 项、发现与健康检查 2 项、TypeScript 62 项及 control-plane typecheck 已通过。最终提交回归 63 项和标准 premerge 均通过(11 项选择检查及全部直接门)。额外 mypy 检查存在既有错误;两个修改文件 base/head 均为相同 45 项,无新增,不宣称全库 mypy 通过。