Repository navigation
[Bug] Queued message row disappears between the inbox claim and transcript admission (0.2.1-alpha.1, with a locally verified patch) #9241
KouzakiUmi
started this conversation in
General
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
TL;DR
排队发送的消息会在 Host 把它从
inbox.next-turn领取(claim)的那一刻从界面上消失,直到下一个 step 开始、持久user/message追加进 transcript 才重新出现。QueueDock Steer必现;普通 claim 在步骤边界出现。实测窗口约 78 ms 起,上限取决于步骤边界何时到来。0.2.1-alpha.1(本机master,桌面壳dsh-desktop-next 2.0.17-next,Windows)。@deepseek-ai/dsh-api-session-controller(客户端提交回显的生命周期)、@deepseek-ai/dsh-client-ui-conversation(QueueDock 队列条)。CONTRIBUTING.md,外部 PR 目前不被接受,所以以 Discussion 形式报告;如政策变化,我可以随时转成 PR。用户侧体验
先说这个,因为它是问题真正贵的地方:不崩、不报错、可恢复,但会持续消耗"界面所见即真实"的信任。
一句话:一条消息曾经显示、然后消失、之后又出现——中间那段时间用户无法判断它的真实状态,界面也不给可判别的信号。
复现
证据:一次真实会话的事件时间线
来自本机会话日志(
session.v4.jsonl.zstd,多帧 zstd;时间为会话开始的毫秒数):agent/inbox/splicedtarget=next-turn inserted=[排队的消息]agent/inbox/splicedtarget=next-turnremovedCount: 1,outcome: "canceled"agent/inbox/splicedtarget=next-step inserted=[同一条消息]agent/inbox/splicedtarget=next-stepremovedCount: 1(claim)user/message追加进 transcriptseq 116 到 seq 122 之间,这条消息没有任何渲染归属。
技术定位
三个阶段、三个来源,交接处出现真空:
next-turnrpcId去重user/message入档三处代码:
packages/api/session-controller/src/client/sessions/session.ts:observeSubmissionMessage(..., admitted=false)在 Inbox 接受后一个动画帧就退休 queued 回显,默认此后由 Host 行接管;observeSubmissionInsertions跳过 queued 结算,因此 claim 不更新它的 receipt。packages/client/ui-conversation/src/client/queue/QueueDock.tsx:queue只读inbox['next-turn'],rowCount === 0时整块返回null。packages/client/ui-chat/src/client/chat/ChatView.tsx:对话内只融合placement !== 'queued'的本地回显,queued 回显不参与,因此也不兜底。QueueDock Steer让 (b) 成为确定事件:它在同一次通知里取消next-turn行,并把同一条消息提升到next-step。影响范围、边界与取舍
placement: queued)transcript)outcome: "canceled",必须由客户端区分"我请求的是哪一种"rpcId的 transcript 去重(Chat 有)影响面仅限客户端内存态的回显:不改事件、不改持久化、不改 Host 队列语义、不引入新的模型可见输入。
修复参考(本地已实现并验证)
分支(单个 commit):master...KouzakiUmi:deepseek-harness:fix/queued-echo-claim-handoff
index: null,入档交接照既有规则等待 Inbox 水位;updateQueue记录 Steer 请求的关联 id,canceled 分支据此区分"提升"与"拒绝"——未请求提升的取消立即按 failed 退休回显,不留幽灵行;observeSubmissionMessage不再因 Inbox 观察而退休:退休来源只剩入档、拒绝,以及既有的turn/end兜底;QueueDock的未入档回显过滤把next-step的用户行也视为已受理:提升期间让位于 Chat,claim 清空next-step后重新持有。补丁经过一次独立审查(异源模型),审查指出第一版会把"删除排队项"变成幽灵回显、并改变 dispose 的结算语义——这两点已在第 2、4 条修正。
验证
pnpm exec vitest run packages/api/session-controller packages/client/ui-conversation packages/client/ui-chat→ 2190 passed, 1 failed;唯一失败是media-references.host.spec.ts的symlink()EPERM(本机 Windows 权限限制,与改动无关)。pnpm run typecheck、pnpm run lint:contracts-ready→ 通过。pnpm run doc-sync→ 40/42 通过,两个失败均为同一 symlink 环境限制。keeps a queued echo through acceptance and claim until transcript admission、keeps a steered queued echo visible after its next-turn row is canceled、retires a canceled queued echo the client never asked to promote、settles an accepted queued echo as observed when disposed before admission,以及 QueueDock 的"提升期间让位"用例。.agents/notes/implemented/bug-fix/2026-10-09-queued-echo-claim-handoff.md。结语
写这份报告只是希望排队这个能力在长任务里可以放心使用——现在的行为会让人不敢依赖它。如果维护者认为该用别的方案(例如让 Host 在 claim 的同时追加持久消息,从源头消除窗口),我完全接受;这里的补丁只是本地已验证的一种实现。
All reactions