Skip to content

fix(chat): keep context-limit failures in the pending queue - #8164

Merged
loopx-agent merged 1 commit into
mainfrom
codex/pending-context-limit-20261106
Nov 6, 2026
Merged

loopx-agent merged 1 commit into
mainfrom
codex/pending-context-limit-20261106

Conversation

@loopx-agent

Copy link
Copy Markdown
Collaborator

上下文超过模型限制后,原请求已经失败、失败提示也已送达,但连接设置的“待处理或回复”计数会把它漏掉。本改动让这类原请求继续保留为待处理;停止与会话关闭仍按原生命周期结清,恢复执行仍需通过既有准入。

复用现有 TypeScript pending observation 和两组失败恢复回归,没有增加状态、消费者或执行入口。同时修复该文件历史 native thread 读取的 unknown 类型检查失败:先核实字符串,再匹配已有原生线程来源。

验证:

  • 新增上下文超限用例在原实现失败,修复后 56 项 TS 回归通过。
  • 6 项真实 Core/传输集成用例通过,覆盖失败提示送达、重启、只读健康检查,以及 /stop、/new 后不重放。
  • TypeScript control-plane 类型检查、RFC 中英配对检查和改动文件公开边界扫描通过。

这次交付补齐遗漏请求的待处理投影。旧失败请求的实质业务和结果回传需要沿原服务分别验收。

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; GPT-6 family; OpenAI; self_reported.

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

动机 / Motivation

使用原飞书私聊与连接设置查看积压消息的用户会遇到这一问题。模型上下文超限后,失败提示已经送达,原问题却从待处理计数中消失;修复后同一失败请求仍显示待处理。让未完成问题持续可见,并由原恢复流程决定能否继续执行。本次修复待处理投影,不宣告旧问题业务完成。原请求后续实质处理、直接答案及原渠道读回仍需沿既有负责人验收。同一原问题已经有持久失败记录,因此让用户重新描述问题或手动制造另一个请求,会增加重复执行和漏追踪风险。这里的收益是修复现有状态的可信度,完整补办仍依赖原服务逐项处理。

改动思路 / Approach

失败生命周期由现有 TypeScript 规则派生;传输、恢复准入和停止仍由各自现有 owner 执行,无需增加状态或消费者。当前 PR 只补齐上下文超限的待处理语义,并为相邻历史线程来源判断补足字符串类型检查。先比较了不改、在飞书适配器另维护一个计数,以及扩展共享投影三条路:不改会继续漏记,独立计数会复制状态,当前规则修复可以同时进入已有健康检查和设置读模型。恢复是否能执行仍需独立核验原来源、原生执行效果和预算,不能从一个待处理数字推导出来。这个变化用现有契约和回归即可说明,无需新增状态图或配置界面。

具体改动 / Changes

关键代码讲解

  1. planBoundConversationRequest 的 pending_observation 分支,在既有接受状态、Session/Turn 精确关联、停止和关闭检查后,将已知 context_window_exceeded 失败保留为待处理。它返回投影结果,没有调用接续或模型执行。
  2. planExhaustedStewardAnswer 对历史与实际原生 thread_id 先做字符串判断,保留已知来源的成员匹配。原实现存在 unknown 参数导致的类型检查失败;这里用实际类型收窄修复,未用类型断言放过未知证明。空值、数字和外国线程都仍不能取得恢复资格。
  3. 既有 LarkPrivateConversations.health 继续读取原请求与 Core 的相关性,通过同一批量 TS 规则生成计数;private-conversation-panel.tsx 继续展示这一个原生计数。没有第二份状态,也不需要用户额外授权或录入。

规范依据:docs/architecture/rfcs/app-conversation-and-async-inbox-v0.md,revision 927d0b389096a9ca8702c4da14a43836063ed29b 的“Native history migration and unfinished-request continuation”段。FAILURE-LIFETIME:失败送达不能结清业务,由新旧实现同例对照与集成用例证明。ORIGINAL-QUEUE:保留原失败、原源与既有同 Session 队列,集成检查核对原持久记录和启动次数。STOP-PROOF:停止、关闭、未知原生证明继续阻止恢复;TS 负例和 /stop、/new 场景验证。此次未改写规范来迎合实现。

对主干的风险 / Risks

未发现阻断性问题。最强反例是“计数正确但健康检查又执行了一次业务”:6 项真实 Core/传输集成检查禁止 enqueue_turn 和恢复调用,比较原消息、持久失败和 provider 写入,验证重建 transport 后仍只有一次模型启动。模型和外部 provider IO 为合成边界,未把它说成用户的真实消息已经完成。相同 TS 用例放到不可变 base 后为55通过、1项预期失败,唯一失败就是上下文超限被算为无待办;当前 head 56项通过。另5项 conversation scope 回归通过。

首次类型检查失败保留,最终以字符串收窄后通过;RFC 双语差分、diff hygiene 和3个变更文件公开边界检查通过。全局检查仍有两个既有本地 authority 诊断,未迁移其状态,也没有把整体命令称为通过。完整路由回归另有374项通过、114项按所选范围未运行;quick premerge gate 通过,保留工具报告的一项既有可维护性 advisory,未把它改写成全树无债务。按当前配置不查询、不等待 CI。此次只复用已有错误值和状态 owner,没有增加公共协议、状态存储、消费者或重试预算。

我的整体评价 / Verdict

long_horizon 与 user_experience 均为 improved:已接受但未完成的问题不会因为失败提示送达而失去可见性,原有停止、关闭和防重放约束仍生效。代码量和维护成本与这个已复现的问题相称,复用现有 owner 比 provider 特判更合适。已检查 private-conversation-panel.tsx 的计数消费与 HTTP 数据契约;本次没有渲染布局、控件或文案改动。本评审不认证安装后的完整原生 App 体验或所有旧业务已补办。尚余业务及运行采用不能由56项测试或一个正确计数替代。当前精确 head 为 ed53ff7156b673e29fb1ce9e58918870c07c4a9e;在远端版本再次核对不变、全部必要本地检查和既有合并授权成立后,可进入正常合并路径。

English verdict: APPROVE — ed53ff7; retain context-limit failure visibility, preserve original stop/replay boundaries; 56 TS and 6 Core/transport integration cases plus typecheck pass.

@loopx-agent
loopx-agent merged commit 24027a3 into main Nov 6, 2026
7 of 8 checks passed
@loopx-agent
loopx-agent deleted the codex/pending-context-limit-20261106 branch November 6, 2026 03:09
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