docs(i18n): align turn and step terminology

This commit is contained in:
Tianyi Cui
2026-07-23 14:37:01 +08:00
parent 8e3fcbe3b5
commit a4d6c302f6
46 changed files with 66 additions and 66 deletions

View File

@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write
2026-06-20-collapse-trace-only-session-events.md: fce5c48ef6fcb1abc6e2fbb95dc7e83d22956660
2026-06-20-collapse-trace-only-session-events.zh.md: 4302646b78ea0b22b479c7068f0f6259bf79edec
2026-06-20-collapse-trace-only-session-events.zh.md: 48a63cdae1217e8244b66603db8b5501239cb9f4

View File

@@ -6,7 +6,7 @@ Status: implemented
## 问题
会话事件词汇中包含一些一等事件,它们不属于可回放的对话历史,在生产环境中几乎没有消费方。`usage` 已经作为模型流分片存在,之后循环又追加了一个独立的 `usage` 事件。`error``turn/end { kind: 'error', message, code }` 中的循环失败原因重复ACPAgent Client Protocol结算读取 turn-end 原因ACP 渲染忽略 `error` 事件,`deriveMessages()` 也跳过它。
会话事件词汇中包含一些一等事件,它们不属于可回放的对话历史,在生产环境中几乎没有消费方。`usage` 已经作为模型流分片存在,之后循环又追加了一个独立的 `usage` 事件。`error``turn/end { kind: 'error', message, code }` 中的循环失败原因重复ACPAgent Client Protocol结算读取轮次结束原因ACP 渲染忽略 `error` 事件,`deriveMessages()` 也跳过它。
这些事件让规范的 transcript文本记录看起来比实际更像遥测数据。它们增加了事件变体、不变式、测试、快照和持久化用例但作为独立记录并不承载实际功能。它们携带的事实仍然有用token 用量应当保留以供计费,错误的步骤编号也不应悄然消失。简化的方式是将这些事实折叠进消费方本已必须理解的邻近事件,而非减少记录的信息量。

View File

@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write
2026-06-20-public-agent-stop-surface.md: 81a21de30bfbc25688069efbffb21647889b1bdb
2026-06-20-public-agent-stop-surface.zh.md: 4ad4b6b0beb01bc55f10c046023c7851558ecb20
2026-06-20-public-agent-stop-surface.zh.md: 78fd2e5f0392b2632671311420eca8f5ad96c501

View File

@@ -8,15 +8,15 @@ Status: implemented
## 问题
公共 `Agent` handle 暴露了两种相互重叠的在途工作停止方式:仅针对 step `abort()` 和感知队列的 `cancel()`。前者保留已排队输入,后者则清除已排队和 steering中途引导工作并中止活动 turn。在生产中ACPAgent Client Protocol`session/cancel` 使用 `cancel()`,生命周期拥有者则通过 `AgentHandle.dispose()` 拆除 agent智能体。没有生产调用方需要一个裸的、仅针对 step 的 abort。
公共 `Agent` handle 暴露了两种相互重叠的在途工作停止方式:仅针对步骤`abort()` 和感知队列的 `cancel()`。前者保留已排队输入,后者则清除已排队和 steering中途引导工作并中止活动轮次。在生产中ACPAgent Client Protocol`session/cancel` 使用 `cancel()`,生命周期拥有者则通过 `AgentHandle.dispose()` 拆除 agent智能体。没有生产调用方需要一个裸的、仅针对步骤的 abort。
行为差异确实存在但已发布代码不需要较窄的操作。AgentLoop 改为为整个 turn 拥有一个私有取消 holder。`cancel(cause?)` 携带类型化的 `user``parent` 原因,默认为 `user`,并丢弃待处理输入;释放仍是单独的生命周期中断。完整的归属与传播契约位于[显式 turn 取消 Agent Noteagent 决策记录)](../architecture/2026-07-16-explicit-turn-cancellation.md)。
行为差异确实存在但已发布代码不需要较窄的操作。AgentLoop 改为为整个轮次拥有一个私有取消 holder。`cancel(cause?)` 携带类型化的 `user``parent` 原因,默认为 `user`,并丢弃待处理输入;释放仍是单独的生命周期中断。完整的归属与传播契约位于[显式轮次取消 Agent Noteagent 决策记录)](../architecture/2026-07-16-explicit-turn-cancellation.md)。
多余的公开接口使得循环不得不承载一个本质上属于内部拆卸的公开动词:`abort()` 必须被文档描述为有别于队列感知的取消,尽管 UI 取消几乎总是需要更广泛的操作。
## 决策
`cancel()``Agent` 上唯一的公共*停止*原语。生命周期拥有者使用 `AgentHandle.dispose()` 停止并注销 agent非拥有者使用 `cancel()` 放弃当前和已排队工作。实现保留一个私有 turn 取消 holder但它不属于面向插件的 `Agent` 契约。
`cancel()``Agent` 上唯一的公共*停止*原语。生命周期拥有者使用 `AgentHandle.dispose()` 停止并注销 agent非拥有者使用 `cancel()` 放弃当前和已排队工作。实现保留一个私有轮次取消 holder但它不属于面向插件的 `Agent` 契约。
`whenIdle()` **保留**为公开的静默观测原语agent 从 `running` 状态稳定后 resolve已处于 idle 时立即 resolvedispose 后等待循环退出)。它不是停止动词;它是非所有者在不 dispose agent 的前提下观测停止*完成*的方式。它的活跃消费方是 ACP 和通过此公开 seam 等待结算的 agent 测试(`packages/ui/acp/tests``packages/core/agent-loop/tests`);生产环境的 ACP 桥接层拥有其 agent 并通过 `AgentHandle.dispose()` 销毁它们,因此 `packages/ui/acp/src` 本身没有 `whenIdle()` 调用。
@@ -36,4 +36,4 @@ Status: implemented
## 相关
本 Agent Note 只移除冗余的停止动词。turn 中途 steering 仍是一条有意保留的消息路径;静止观察仍通过 `whenIdle()` 完成。最终公共表面包括 `send()``steer()``inject()``cancel()``whenIdle()`、status、options、session 和 identity。
本 Agent Note 只移除冗余的停止动词。轮次中途 steering 仍是一条有意保留的消息路径;静止观察仍通过 `whenIdle()` 完成。最终公共表面包括 `send()``steer()``inject()``cancel()``whenIdle()`、status、options、session 和 identity。

View File

@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write
2026-06-20-remove-agent-boundary-mirror-events.md: 8c5bb74f2347fe0269cbb9c6504137de761ab919
2026-06-20-remove-agent-boundary-mirror-events.zh.md: feed8239b6a07c2e27866f72954cfb95830541f4
2026-06-20-remove-agent-boundary-mirror-events.zh.md: 3d130a68eccaaf2996cd80bc003f6b7fb16efa51

View File

@@ -15,7 +15,7 @@ Status: implemented
## 问题
循环在 `SessionEvent` 中记录规范 transcript文本记录同时还发出一组并行的实时 `agent/*` 边界镜像事件:`agent/turn-start``agent/turn-end``agent/step-start``agent/step-end`。这些镜像迫使消费者在同一持久事实的两个事实来源之间做选择。ACPAgent Client Protocol已经为面向编辑器的 transcript 选择 session log因为它是唯一持久、可重放的记录消费实时镜像需要把它的时序与日志中已经存储的边界进行调和。stdio UI 是唯一仍从镜像事件渲染 turn 边界的生产消费者;它已经从 `session/event` 渲染工具调用和结果。
循环在 `SessionEvent` 中记录规范 transcript文本记录同时还发出一组并行的实时 `agent/*` 边界镜像事件:`agent/turn-start``agent/turn-end``agent/step-start``agent/step-end`。这些镜像迫使消费者在同一持久事实的两个事实来源之间做选择。ACPAgent Client Protocol已经为面向编辑器的 transcript 选择 session log因为它是唯一持久、可重放的记录消费实时镜像需要把它的时序与日志中已经存储的边界进行调和。stdio UI 是唯一仍从镜像事件渲染轮次边界的生产消费者;它已经从 `session/event` 渲染工具调用和结果。
这种重复并非零成本。每次生命周期变更都需要同时更新会话事件、镜像事件、文档、不变式、测试和快照预期。重复的边界事件还使失败排序变得微妙:一个轮次可能在实时 `agent/turn-end` 监听器运行之前就已被持久化关闭,因此边界之后的监听器失败在日志中已没有合法位置可以插入,只能带外上报。
@@ -25,7 +25,7 @@ Status: implemented
四个持久边界镜像——`agent/turn-start``agent/turn-end``agent/step-start``agent/step-end`——已从 agent智能体事件分类中移除。希望在边界处取得 agent handle 的 UI 会保留来自 `agent/created`/`agent/disposed` 的实时目标对象,并直接比较其 session`dsh-ui-stdio` 据此为应用拥有的 agent 标记 `[main turn N]` 头部,其他 session 则渲染其持久 id。规范记录仍是事件溯源 session log。
step 镜像(完全没有消费者)最先在[事件域语义 Agent Noteagent 决策记录)](../architecture/2026-06-30-event-domain-semantics.md) 中移除;该 Agent Note 当时以 stdio UI 需要在 turn 边界取得 `Agent` handle 为由,保留了 turn 镜像。本 Agent Note 完成余下工作:`dsh-ui-stdio` 是可随时丢弃的测试 REPL其渲染可以自由变化因此“ui-stdio 需要它”并不是保留镜像的理由——它读取 `session/event`,只保留自己的实时目标对象。
步骤镜像(完全没有消费者)最先在[事件域语义 Agent Noteagent 决策记录)](../architecture/2026-06-30-event-domain-semantics.md) 中移除;该 Agent Note 当时以 stdio UI 需要在轮次边界取得 `Agent` handle 为由,保留了轮次镜像。本 Agent Note 完成余下工作:`dsh-ui-stdio` 是可随时丢弃的测试 REPL其渲染可以自由变化因此“ui-stdio 需要它”并不是保留镜像的理由——它读取 `session/event`,只保留自己的实时目标对象。
## 范围:移除什么、不移除什么
@@ -40,8 +40,8 @@ step 镜像(完全没有消费者)最先在[事件域语义 Agent Noteage
## 曾考虑的替代方案
- **将 `agent/steering` 一并移除**——原始提案的形状;作为范围蔓延被排除:它镜像持久的 `steering/message` 控制记录,而非边界,后来由[自己的决策](2026-07-04-remove-agent-steering-mirror.md)移除(`agent/stream-chunk` 也由 [stream chunk 镜像 Agent Note](2026-07-02-remove-stream-chunk-mirror.md) 移除)。
- **为 stdio UI 保留 turn 镜像**——[事件域语义 Agent Note](../architecture/2026-06-30-event-domain-semantics.md) 的原始立场;在此否决,因为 `dsh-ui-stdio` 是可随时丢弃的测试 REPL而非承载关键约束的消费者并且它改为根据 `session/event` 加自己的实时目标对象渲染边界。
- **为 stdio UI 保留轮次镜像**——[事件域语义 Agent Note](../architecture/2026-06-30-event-domain-semantics.md) 的原始立场;在此否决,因为 `dsh-ui-stdio` 是可随时丢弃的测试 REPL而非承载关键约束的消费者并且它改为根据 `session/event` 加自己的实时目标对象渲染边界。
## 后果
插件不能再从便捷的 `Agent` 优先事件观察 turn/step 边界。它需要订阅 `session/event`;如果需要实时对象,则通过 `ctx.agents` 解析共享 id或保留自己已经拥有的对象。这是可以接受的取舍边界消费者不应依赖可能与持久日志发生漂移的第二条事件 feed。
插件不能再从便捷的 `Agent` 优先事件观察轮次/步骤边界。它需要订阅 `session/event`;如果需要实时对象,则通过 `ctx.agents` 解析共享 id或保留自己已经拥有的对象。这是可以接受的取舍边界消费者不应依赖可能与持久日志发生漂移的第二条事件 feed。

View File

@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write
2026-07-02-remove-stream-chunk-mirror.md: 5dd816940a4b2c2b63980e01f1bd4e0aac53a3e2
2026-07-02-remove-stream-chunk-mirror.zh.md: d4bfe540ecb3f938721f2b387f302caf163b0f94
2026-07-02-remove-stream-chunk-mirror.zh.md: a474238f19d58e261afba30227e5b1eaa25fcf7a

View File

@@ -19,13 +19,13 @@ ctx.emit('agent/stream-chunk', agent, turn, step, chunk) // ← the mirror
实时发射相比会话事件唯一多出的东西是实时的 `Agent` 句柄,而唯一的消费方直接丢弃了它(其处理函数签名为 `(_agent, _turn, _step, chunk)`)。
这与[移除边界镜像](2026-06-20-remove-agent-boundary-mirror-events.md)为 turn/step 边界消除的重复相同:消费者面对同一持久事实的两个事实来源,每次变更都必须同时触及两者。该 Agent Noteagent 决策记录)没有把 chunk 流一并纳入,而是推迟处理(“`assistant/chunk` 持久化仍承载关键约束,所以以后可以将 chunk 流作为镜像评估,但那是一项独立决策”)。本 Agent Note 就是那项独立决策。
这与[移除边界镜像](2026-06-20-remove-agent-boundary-mirror-events.md)为轮次/步骤边界消除的重复相同:消费者面对同一持久事实的两个事实来源,每次变更都必须同时触及两者。该 Agent Noteagent 决策记录)没有把 chunk 流一并纳入,而是推迟处理(“`assistant/chunk` 持久化仍承载关键约束,所以以后可以将 chunk 流作为镜像评估,但那是一项独立决策”)。本 Agent Note 就是那项独立决策。
推迟所依赖的前提已经明确chunk 持久化是权威的,且将保留。停止持久化 chunk、仅保留瞬态实时流事件的提案已被[否决](../../rejected/simplification/2026-06-20-assembled-assistant-messages-only.md)——高保真回放、部分失败的流以及快照回放都依赖持久化的 `assistant/chunk` 序列。因此 `session/event` 上的 `assistant/chunk` 是持久的、承重的 token 流,而 `agent/stream-chunk` 是它的纯冗余镜像。
## 决策
从 agent 事件分类体系中移除 `agent/stream-chunk`。token 流通过 `session/event` 以 `assistant/chunk` 的形式读取——持久化与回放已经使用的正是同一个序列。`session/event` 是唯一的实时 transcript文本记录assistant chunk、turn/step 边界、工具活动、todo
从 agent 事件分类体系中移除 `agent/stream-chunk`。token 流通过 `session/event` 以 `assistant/chunk` 的形式读取——持久化与回放已经使用的正是同一个序列。`session/event` 是唯一的实时 transcript文本记录assistant chunk、轮次/步骤边界、工具活动、todo
**消费方。** 唯一重要的生产消费方——ACPAgent Client Protocol桥接`dsh-acp`,面向编辑器的真实流式输出接口)——已经从 `session/event` 渲染 `assistant/chunk`,从未使用 `agent/stream-chunk`因此不受影响。stdio UI`dsh-ui-stdio`,一个一次性的测试 REPL是唯一的实时消费方它在边界迁移时已经有了 `session/event` 监听器,因此其 chunk 渲染被折叠进该监听器作为 `assistant/chunk` 分支。合并为一个监听器还消除了一个潜在隐患:`inReasoning` dim-SGR 标志此前在两个独立监听器(`agent/stream-chunk` 和 `session/event`之间共享chunk 与边界在该标志上竞争时没有确定的顺序;单一监听器按追加顺序处理,使交错变为确定性的。

View File

@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write
2026-07-04-prune-producerless-vocabulary-variants.md: 34492e6906cd2d795f880310b1bcd120e3953fcf
2026-07-04-prune-producerless-vocabulary-variants.zh.md: 710f64d7e848bcabb8a1bc0c0c8be9af7b2ca1b0
2026-07-04-prune-producerless-vocabulary-variants.zh.md: c564b3052719cc7e9aef60775a1801f3e214d4cc

View File

@@ -14,7 +14,7 @@ Status: implemented
## 决策
`CacheHint`、其 `cache?` 块字段、`agent` 消息来源变体和 `continuation` turn 触发器变体均已删除已发布词汇不再携带它们。llm-replay fixture 使用 `injection` 触发器(任何非 `message` 触发器都能满足其用途)。[core.md](../../../../docs/core-data-structures/core.md) 和 [session.md](../../../../docs/core-data-structures/session.md) 中的 type-equiv 粘贴与裁剪后的 map 匹配——两个符号仍保留在 `scripts/type-equiv.manifest.json` 中的行,因为每个 map 都只是少了一个成员而继续存在——并且[内容块词汇 Agent Note](../architecture/2026-06-11-content-block-vocabulary.md)的后果按照 [implemented/AGENTS.md](../AGENTS.md),将 cache hint 记录为由生产者门控,而不是已有归属。
`CacheHint`、其 `cache?` 块字段、`agent` 消息来源变体和 `continuation` 轮次触发器变体均已删除已发布词汇不再携带它们。llm-replay fixture 使用 `injection` 触发器(任何非 `message` 触发器都能满足其用途)。[core.md](../../../../docs/core-data-structures/core.md) 和 [session.md](../../../../docs/core-data-structures/session.md) 中的 type-equiv 粘贴与裁剪后的 map 匹配——两个符号仍保留在 `scripts/type-equiv.manifest.json` 中的行,因为每个 map 都只是少了一个成员而继续存在——并且[内容块词汇 Agent Note](../architecture/2026-06-11-content-block-vocabulary.md)的后果按照 [implemented/AGENTS.md](../AGENTS.md),将 cache hint 记录为由生产者门控,而不是已有归属。
每个变体在获得真正的生产者之日回归,这正是映射表设计的增长方式:缓存功能连同传输它的适配器一起重新添加 `cache`subagent 归属连同打标的后端和路由它的消费方一起重新添加 `agent`;真正启动新轮次的自动续行功能连同发出它的插件一起重新添加 `continuation`

View File

@@ -3,4 +3,4 @@
# after editing either side, bring the other along and re-record with:
# pnpm run verify-translation-pairing --write
2026-07-04-remove-agent-steering-mirror.md: 9f7cd5abe968ff216cbd7012163ea1c04dc00599
2026-07-04-remove-agent-steering-mirror.zh.md: b498f473941b69eb5eab66e2e3034976da75e62c
2026-07-04-remove-agent-steering-mirror.zh.md: 2650dbd142288458afc429fd87c564fed01e1493

View File

@@ -10,7 +10,7 @@ Status: implemented
`agent/steering` 以相同的 payload 重复了紧接其前的持久事件 `steering/message``agent/queued` 仍保留为纯瞬态信号,因为它在持久化之前触发,覆盖了可能在进入日志前被取消的工作。
Steering 承载真实生产流量——hook bridge 的 turn 延续决策通过 `inbox.steer()` 注入其理由,最终成为由 hook 矩阵预期输出固定的持久 `steering/message` 事件——而这些消费者无一例外都观察持久事件。没有任何内容观察镜像。
Steering 承载真实生产流量——hook bridge 的轮次延续决策通过 `inbox.steer()` 注入其理由,最终成为由 hook 矩阵预期输出固定的持久 `steering/message` 事件——而这些消费者无一例外都观察持久事件。没有任何内容观察镜像。
## 决策
@@ -22,7 +22,7 @@ Steering 承载真实生产流量——hook bridge 的 turn 延续决策通过 `
### 为什么不保留?
“它是控制信号,不是边界”——但该分类的实际区分是镜像/仅实时,而非控制/边界,并且该事件确实是镜像。希望在入队时收到通知的消费者可以使用 `agent/queued`(及其 steering 标记);希望在排空时收到通知的消费者,本质上是在要求获知 `steering/message` 被追加的时刻,而 `session/event` 会交付相同 payload 并附带持久性。遭拒绝的[退役 turn 中途 steering Agent Note](../../rejected/simplification/2026-06-20-retire-mid-turn-steering.md)所捍卫的是 steering *功能*——`steer()`、持久事件、强制延续——本次移除不会触及其中任何一项。
“它是控制信号,不是边界”——但该分类的实际区分是镜像/仅实时,而非控制/边界,并且该事件确实是镜像。希望在入队时收到通知的消费者可以使用 `agent/queued`(及其 steering 标记);希望在排空时收到通知的消费者,本质上是在要求获知 `steering/message` 被追加的时刻,而 `session/event` 会交付相同 payload 并附带持久性。遭拒绝的[退役轮次中途 steering Agent Note](../../rejected/simplification/2026-06-20-retire-mid-turn-steering.md)所捍卫的是 steering *功能*——`steer()`、持久事件、强制延续——本次移除不会触及其中任何一项。
## 验证