Skip to content

fix(chat): retain pending partial results after quota recovery - #7840

Merged
loopx-agent merged 1 commit into
mainfrom
codex/retained-pending-work-20261101
Nov 1, 2026
Merged

loopx-agent merged 1 commit into
mainfrom
codex/retained-pending-work-20261101

Conversation

@loopx-agent

Copy link
Copy Markdown
Collaborator

Delivered replies could leave authorized work unfinished while the connection panel reported zero pending requests. Retain explicit unfinished work and unresolved gates from the original quota continuation in the existing Core-backed pending count. Reuse the strict unfinished-work parser; execution eligibility, retry limits, source/grant checks, native effect readback and stop handling remain unchanged.

Validation: 352 Python tests and 36 typed-owner tests passed, including original-worker quota recovery, verified partial replies, scanner restart, read-only observation, and stop/new retirement. The final four native regressions fail on the unmodified base because pending_count is zero, and pass with this change. Ruff, diff hygiene, semantic advisory and the standard risk-based premerge gate passed. All model/provider journeys are synthetic; live adoption is a separate check.

Signed-off-by: LoopX Agent <337587101+loopx-agent@users.noreply.github.com>

@loopx-agent loopx-agent left a comment

Copy link
Copy Markdown
Collaborator Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Reviewer: model_agent; model=gpt-6.1-sol; provider=OpenAI; runtime_reported; reasoning_effort=max.

Approval conclusion (author-owned PR; GitHub blocks formal self-approval).

未发现阻塞性问题。此结论针对 c656e063497ca03e306f7097b26c7e4b24fce15f,允许这个有用的状态修复增量;不代表历史业务全部补办完成。

动机 / Motivation

使用原生私聊助手、等待剩余工作完成的用户会遇到这个问题。例如助手已送达部分结果并明确说明还有未完成工作,旧版连接面板却显示待处理为零;本次保留该待处理状态,避免用户误以为请求已经办完。

原服务送达答复后,明确的未完成工作和原额度恢复仍受阻塞的请求继续计入待处理;停止或新会话仍能清除对应旧请求。本次不增加重试、执行权限、消息消费者或队列,也不把历史业务标成完成。未带结构化标记的旧部分答复,以及因后续原生消息或授权限制无法继续的业务,仍需原 Bot 按原请求完成和回传。

改动思路 / Approach

未完成声明的解释继续由现有 typed owner 负责;pending 是从 Core 原始事实导出的只读投影,重试和权限判断仍归原 worker。本 PR 只修正已知未闭请求的状态可见性,复用现有持久化数据与调用链;不新增业务执行或人工接管流程。保留旧做法会继续产生已复现的假零值;另建持久队列或在 Python 再写一套资格规则,会引入第二份事实来源。这次从原请求、原 Turn 和已有声明派生状态,复用既有 health、API 与面板调用链,用户无需再填信息或确认一次。

读取状态与执行接续继续分开:观察只返回一个布尔值;执行仍经过原 worker 的 source、grant、stop 与最新原生效果核验。一个暂时不能执行的请求依然可以是尚未办完的请求。

具体改动 / Changes

规范依据是 docs/architecture/rfcs/app-conversation-and-async-inbox-v0.md,spec_revision=a098263f4fba407f4ee9c9b6f4c3b3d8bfe1c377 的 “Explicit unfinished work after a completed Turn” 节。该节没有原生条款编号,下列标识对应其具体要求:unfinished-work-report 已实现,明确声明仍有工作就保留状态但不授权;original-worker-reservation 已实现,接续依旧归原 worker 与既有确定性预约;stop-correction-holds 已实现,停止、新消息、未知效果与撤权限制均保留。规范没有被此 PR 改写。

关键代码讲解

planBoundConversationRequest 的观察分支要求原请求和 Turn 的 Session/Turn 关联一致。完成结果只有严格的未完成声明,或与原额度接续预约、client Turn 一致的 gate 才继续计数;普通成功结果、控制命令、错误关联与已停止请求不增加计数。该分支只返回 pending,不会返回执行计划。

unfinishedProjectWork 把原先内联在执行准入中的解析提成同文件共享函数:仍只接受 remaining、dependency、effects_settled 三字段,要求 settled 为真、字符串非空且有界,并排除 gate、proposal、protected action 与 handoff 混合声明。执行路径继续调用它,后面的准入条件保持原样,避免观察和执行各自解释一份声明。

LarkPrivateConversations.health 仍先对 transport 与 Core 的 binding/source/Session/Turn 做关联核对,再读取 typed owner。原有 API 和连接面板直接消费该计数,没有新增消费者、存储字段或 UI 控件。五文件共 +179/-17,其中 141 行是两类回归测试,Python 生产文件只改注释。

对主干的风险 / Risks

最强反例是“状态观察触发重试”或“停止后仍显示欠账”。新增原生测试从原消息入队、真实 Core/adapter 完成、原 worker 验证送达一路走到 health,然后重建 scanner,比较模型调用、provider 写入和原 Turn 字节;观察不会增加执行或发送,/stop 与 /new 都使旧请求归零。typed 测试覆盖非法声明、未 settled、混合提案、错误 Session/Turn/client 和无效额度预约。已有原 worker 用例继续覆盖撤权、改源、未知 native item、后续 native Turn、排队新输入以及预约前后崩溃。

PASS:352 项 Python 测试、36 项 typed owner 测试、Ruff、diff hygiene、semantic advisory 和 standard premerge(6 个直接检查加 10 个选中检查,零失败)。相同最终 fixture 在未修改基线生产代码上有 4 个原生用例精确失败为 pending_count 0 对期望 1,typed 基线为 35 通过/1 失败;最终 head 全部通过。早期 fake fixture 的响应转义、scanner 单调时钟与毫秒时间精度问题已单独保留,未用它们充当产品回归证据,也没有放宽生产安全限制。远程 CI 未查询、轮询或等待,按当前 review policy 使用本地验证。

语义与 CI 对齐

本次复用既有 unfinished_work、context_recovery 和 pending_count 语义,没有新建协议或状态权威。semantic advisory 仅能识别受支持的静态词汇载体,其零候选不构成语义证明;实际依据是上述规范、调用链及基线/新版本行为比较。主干后续提交未触碰这五个文件,当前 exact head 与已验证源文件一致。

我的整体评价 / Verdict

long_horizon=improved:已送达但未完成的业务在重启后继续可见,不消耗额外尝试也不产生重复效果。user_experience=improved:既有面板的“待处理或回复”更符合事实,不增加用户交互轮次。只改变现有待处理整数的后端取值;已检查 private-conversation-panel.tsx:153 的原有显示及 private_conversation_api.py 的透传,未修改渲染、布局或交互。未核验范围:完整安装后的 App 画面、真实模型补办结果及所有历史未闭业务未由这些合成用例证明。

复用与架构判断为 retain,改动比例适当;提取共享解析已经消除最有价值的重复规则,没有迁移、独立部署或兼容分支的新增成本。残余风险是旧非结构化部分答复与后续消息/授权阻塞仍需原服务逐条完成和回传,不能根据计数或 Turn completed 推断完成。安装采用和原消息独立读回继续作为交付验收。

English verdict: APPROVE this exact-head status repair; live adoption and historical business completion remain separate checks.

@loopx-agent
loopx-agent merged commit afb15e6 into main Nov 1, 2026
7 of 10 checks passed
@loopx-agent
loopx-agent deleted the codex/retained-pending-work-20261101 branch November 1, 2026 18:23
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant