- 文档
- 提示工程
- 人工智能
【免费下载链接】claude-code-system-prompts
All parts of Claude Code's system prompt, 27 builtin tool descriptions, sub agent prompts (Plan/Explore/Task), utility prompts (CLAUDE.md, compact, statusline, magic docs, WebFetch, Bash cmd, security review, agent creation). Updated for each Claude Code version.
本文基于 Claude Code 系统提示词仓库中的 Data: Query result pending command count 文档,并结合仓库内中断(interrupt)系列与 SDK 帧时间戳系列文档,系统讲解 Claude Code 查询结果(query result)中
pending command count字段的准确定义、取值语义、缺失条件及其在客户端宿主中的实际应用场景。读完本文,你将理解如何正确判断"是否还有用户轮次会自动到来",避免把"计数为 0"误当成"会话已经结束"。
一、字段定位:查询结果携带的"队列回执"
Claude Code 在与宿主(host)应用、SDK 客户端交互时,会以结构化结果(query result)的形式返回每一次模型调用(turn)的产物。pending command count正是这类查询结果上携带的一个字段,其官方定义为:
User-initiated sends still waiting in the command queue when this result was produced.
即:在当前结果产生的那一刻,仍然停留在命令队列中、由用户发起但尚未被消费的发送(send)数量。它本质上是"命令队列快照",回答了一个宿主界面非常关心的问题:当这一轮结果送达用户后,是否还会在没有用户再次输入的情况下,自动产生下一轮对话。
该文档条目在仓库中收录于 system-prompts/data-query-result-pending-command-count.md,其 front matter 标注了ccVersion: "2.1.242",属于 Claude Code 2.1 系列版本的协议描述。仓库的 CHANGELOG.md 中也记录了该字段文档随版本新增(与 Rate limit unified windows、Upload device hook template request 一同发布),并在 README.md 的 Data 分类下列出(167 tokens)。
二、取值语义:大于 0 与等于 0 意味着什么
大于 0:还有轮次会自动到来
当该字段取值大于 0 时,意味着至少还有一个用户轮次(以及对应的结果)会在没有进一步输入的情况下紧随其后。这里有一个前提限定:"barring cancellation"——除非中间发生取消。也就是说,排队中的用户消息仍然可能被中断请求(interrupt)取消,因此"大于 0"并不构成"必然还会有一轮"的硬保证,而是"在没有取消动作的前提下会有一轮"。
等于 0:两种可能
取值 0 时存在两种语义:
- 确实没有待处理的用户发送——队列已清空,当前这一轮就是最后一轮(直到用户再次输入);
- 会话正在结束——会话通过
end_session显式收尾,或一个关闭(shutdown)在轮次中途被闩锁(latched),此时积压的命令队列会被直接丢弃,因此计数为 0。
第二点非常关键:0 并不必然意味着"会话自然结束",也可能意味着"会话被强制收尾并丢弃了队列"。宿主应用在渲染"会话是否结束"的状态时,不应把 0 当作唯一的判定依据,而应结合会话生命周期信号(如end_session、关闭闩锁)综合判断。
三、计数粒度:统计的是"待处理发送",不是"剩余结果数"
该字段最容易被误读的一点在于其计数粒度:
Queued sends may coalesce into fewer turns, so this counts pending sends, not remaining results.
Claude Code 的命令队列允许将多个排队中的用户发送合并(coalesce)进更少的轮次。因此:
- 队列中可能有 3 条待处理的用户发送,但经过合并后只会产生 1 个或 2 个后续轮次;
- 该字段报告的数值是待处理的发送条数(pending sends),而不是即将到来的剩余结果数(remaining results)。
这一点与仓库中 Data: Interrupt receipt still queued field 文档描述的队列行为互相印证:一旦一批命令被出队并合并进单个轮次,代表该批次的 UUID 就成了该轮的"代表成员",取消非代表成员的 UUID 不会改变其内容仍然运行的事实。也就是说,合并发生在出队与轮次装配阶段,而pending command count是在结果产生时对"仍停留在队列中"的发送所做的快照统计,因此它反映的是队列入口状态,而非下游轮次数。
四、计数范围:仅限用户发起的发送
字段语义明确排除了一类条目:
System-generated queue entries are not counted.
命令队列并非只承载用户消息。从仓库内相关文档可以推断,队列中还会出现系统生成的条目,例如:
- 定时触发器(cron triggers)投递的自动唤醒提示;
- 会话恢复(auto-resume)产生的延续指令;
- 后台任务通知等其他由 harness 内部入队的命令。
这些系统生成的队列条目不计入pending command count。因此,该字段是"用户发起、且仍在等待的发送数"的专用指标,宿主界面可以据此判断"用户还有多少输入在路上",而不会被系统内部活动干扰。
这一点与 Data: Interrupt receipt still queued field 中"仅列出带 UUID 戳记的主线程消息、内部入队的 UUID 可能出现"的覆盖性说明形成呼应——中断回执still_queued覆盖的范围是"UUID 戳记的主线程命令",而pending command count覆盖的范围是"用户发起的发送",两者的口径并不完全一致,使用时需要区分。
五、缺失条件:什么情况下字段不出现
该字段并非在所有查询结果上都存在,官方文档明确了两种缺失场景:
Absent on fatal startup results and on surfaces without a command queue.
- 致命启动错误结果(fatal startup results):当会话在启动阶段发生致命错误、连正常轮次都无法执行时,其结果上不携带该字段——此时队列状态本身已无意义;
- 没有命令队列的表面(surfaces without a command queue):并非所有宿主表面都实现了命令队列机制。在没有命令队列的表面上运行的结果,自然不会有该字段。
据此,宿主在解析查询结果时应将"字段缺失"与"字段为 0"视为两种不同状态:缺失说明该表面/该结果不提供队列信息,0 则说明队列当前为空或会话正在收尾。
六、与其他队列相关字段的协作关系
与中断回执字段的关系
命令队列的取消与存活语义,由中断(interrupt)协议侧的三个字段承载,与pending command count构成"队列生命周期"的完整视图:
- Data: Interrupt receipt still queued field:列出在一次中断后仍然存活(将运行)的 UUID。它详细描述了"首个命令 prewait 窗口"内的闩锁(latch)行为、合并批次的取消粒度,以及"列表为空不代表没有命令会运行"等覆盖性注意事项;
- Data: Interrupt receipt cancelled field:仅当请求设置了
cancel_queued:true时出现,列出被这次中断取消的 UUID,每个 UUID 会同步发出终态cancelled生命周期; - Data: Interrupt cancel queued parameter:定义
cancel_queued请求参数——置为 true 时,中断会取消队列中(及 prewait 窗口内)的全部 UUID 戳记主线程命令。
从源码结构看,pending command count与上述三个字段都源自同一个命令队列状态机:still_queued/cancelled是中断瞬间对队列的逐 UUID 快照,而pending command count是查询结果产生瞬间对"用户发起发送"的计数快照。两者互补:中断回执回答"哪些命令会/不会运行",计数字段回答"还有多少用户输入在排队"。
与 SDK 帧时间戳字段的关系
仓库中另外两个 SDK 时序字段也间接描绘了命令队列的存在:
- Data: SDK frame_received_wall_ms field:记录触发发送的帧到达会话的时刻,配合
frame_enqueued_wall_ms与turn_started_wall_ms,可将服务器持久化到轮次开始之间的时段拆分为传输(transit)、输入循环处理、在命令队列上的等待以及轮次自身工作四段; - Data: SDK frame_intake_phases_ms field:将帧从接收到入队的耗时按步骤拆解,其中
user_frames_ahead表示输入循环花在处理更早用户帧上的时间。
这些字段的存在证实了"命令队列 + 用户帧排队"确实是 Claude Code 会话主循环的标准结构,也是pending command count语义成立的基础设施前提。
七、实际应用:宿主如何正确使用该字段
综合以上语义,宿主应用、thin client 或 SDK 集成方在使用该字段时,应遵循以下判断准则:
| 场景 | 字段状态 | 正确解读 |
|---|---|---|
| 正常轮次结束,后续无输入 | 0 | 队列为空,等待用户下一次输入 |
| 用户连发多条消息 | > 0 | 无需用户再输入,至少还会自动产生一轮(除非被取消) |
| 会话正在收尾(end_session / shutdown 闩锁) | 0 | 队列被丢弃,不应期待后续轮次 |
| 致命启动错误结果 | 缺失 | 无队列信息可用 |
| 无命令队列的表面 | 缺失 | 该表面不提供该指标 |
三个易错点:
- 不要把 0 当作"会话结束"的唯一信号——0 也可能是队列清空后的正常空闲状态,必须结合会话生命周期信号区分;
- 不要用该字段预测剩余轮次数——由于发送可能合并进更少轮次,该字段只反映待处理发送数;
- 不要把它当作系统活动指示器——系统生成的队列条目(cron 触发、自动恢复延续等)不计入该字段。
八、小结
pending command count是 Claude Code 查询结果协议中一个精确定义的队列快照字段:统计用户发起的、仍在命令队列中等待轮次的发送数量。它大于 0 预示后续轮次自动到来,等于 0 则可能是队列清空或会话收尾,在致命启动结果与无命令队列的表面上缺失,且不统计系统生成的条目、不以"剩余结果数"为粒度。对于构建 Claude Code 宿主界面、SDK 客户端或自动化编排工具的开发者而言,正确理解该字段的取值边界,是准确呈现会话进行状态、避免误判会话结束的前提。
如需进一步探究相关协议细节,可继续阅读仓库中的 Data: Interrupt cancel queued parameter、Data: Interrupt receipt still queued field、Data: Interrupt receipt cancelled field 三篇中断协议文档,以及 Data: SDK frame_received_wall_ms field 与 Data: SDK frame_intake_phases_ms field 两篇队列时序文档,它们共同勾勒出 Claude Code 会话命令队列的完整面貌。
- 文档
- 提示工程
- 人工智能
【免费下载链接】claude-code-system-prompts
All parts of Claude Code's system prompt, 27 builtin tool descriptions, sub agent prompts (Plan/Explore/Task), utility prompts (CLAUDE.md, compact, statusline, magic docs, WebFetch, Bash cmd, security review, agent creation). Updated for each Claude Code version.
相关推荐
Claude Code 中断回执 cancelled 字段全解析:批量取消排队命令的同步清单与生命周期语义
Claude Code 中断回执 cancelled 字段全解析:批量取消排队命令的同步清单与生命周期语义 本文基于 Claude Code 系统提示词仓库(
文档提示工程人工智能OpenClaw 命令队列(Command Queue)深入解析:多会话并发、队列模式与消息转向机制
OpenClaw 命令队列(Command Queue)深入解析:多会话并发、队列模式与消息转向机制 本文系统讲解 OpenClaw 进程内的命令队列(Comm
AI 应用AI Agent交互助手后端即时通讯网关Claude Code rewindFiles 的 skippedLinks 字段:链接安全拒绝的计数语义与 dry-run 行为解析
Claude Code rewindFiles 的 skippedLinks 字段:链接安全拒绝的计数语义与 dry run 行为解析 本文深入解析 Claud
文档提示工程人工智能
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考