work-ally 0.2.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +110 -0
- package/DASHBOARD.md +160 -0
- package/PRODUCT.md +113 -0
- package/README.md +403 -0
- package/ally.sh +171 -0
- package/bridge/src/approval-rules.ts +360 -0
- package/bridge/src/channel-delivery.ts +207 -0
- package/bridge/src/channel-types.ts +22 -0
- package/bridge/src/channels/fake/adapter.ts +31 -0
- package/bridge/src/channels/feishu/adapter.ts +411 -0
- package/bridge/src/channels/feishu/approvals.ts +6 -0
- package/bridge/src/channels/feishu/formatter.ts +276 -0
- package/bridge/src/channels/feishu/normalize.ts +368 -0
- package/bridge/src/codex-config.ts +52 -0
- package/bridge/src/config.ts +240 -0
- package/bridge/src/fake-runtime-client.ts +505 -0
- package/bridge/src/handoff-service.ts +494 -0
- package/bridge/src/logger.ts +194 -0
- package/bridge/src/memory-digest.ts +186 -0
- package/bridge/src/receiver-approval-autonomy.ts +158 -0
- package/bridge/src/receiver-control-core.ts +140 -0
- package/bridge/src/receiver-control-work-session.ts +218 -0
- package/bridge/src/receiver-control.ts +83 -0
- package/bridge/src/receiver-delivery.ts +136 -0
- package/bridge/src/receiver-helpers.ts +96 -0
- package/bridge/src/receiver-human-gate.ts +333 -0
- package/bridge/src/receiver-inbound-preflight.ts +162 -0
- package/bridge/src/receiver-recovery.ts +236 -0
- package/bridge/src/receiver-runtime-callbacks.ts +367 -0
- package/bridge/src/receiver-runtime-policy.ts +132 -0
- package/bridge/src/receiver-runtime-state.ts +124 -0
- package/bridge/src/receiver-support-actions.ts +189 -0
- package/bridge/src/receiver-thread-start.ts +57 -0
- package/bridge/src/receiver-turn-coordination.ts +94 -0
- package/bridge/src/receiver-turn-execution.ts +257 -0
- package/bridge/src/receiver-turn-failure.ts +143 -0
- package/bridge/src/receiver-turn-result.ts +185 -0
- package/bridge/src/receiver-turn-steer.ts +70 -0
- package/bridge/src/receiver-work-session.ts +76 -0
- package/bridge/src/receiver.ts +329 -0
- package/bridge/src/router.ts +62 -0
- package/bridge/src/runtime-client-agent-messages.ts +150 -0
- package/bridge/src/runtime-client-message-dispatch.ts +176 -0
- package/bridge/src/runtime-client-protocol.ts +411 -0
- package/bridge/src/runtime-client-request-ops.ts +56 -0
- package/bridge/src/runtime-client-run-turn.ts +158 -0
- package/bridge/src/runtime-client-thread-ops.ts +270 -0
- package/bridge/src/runtime-client-transport.ts +309 -0
- package/bridge/src/runtime-client-turn-poll.ts +224 -0
- package/bridge/src/runtime-client-turn-read.ts +185 -0
- package/bridge/src/runtime-client-turn-state.ts +105 -0
- package/bridge/src/runtime-client.ts +344 -0
- package/bridge/src/runtime-user-input.ts +403 -0
- package/bridge/src/scheduler.ts +239 -0
- package/bridge/src/server-handoff-command.ts +364 -0
- package/bridge/src/server-main.ts +80 -0
- package/bridge/src/server-routine-command.ts +60 -0
- package/bridge/src/server-routine-execution.ts +222 -0
- package/bridge/src/server-runtime-app-support.ts +107 -0
- package/bridge/src/server-runtime-app.ts +238 -0
- package/bridge/src/server-thread-sync-command.ts +63 -0
- package/bridge/src/server.ts +17 -0
- package/bridge/src/session-store-delivery.ts +220 -0
- package/bridge/src/session-store-human-gate.ts +380 -0
- package/bridge/src/session-store-inbound-acceptance.ts +66 -0
- package/bridge/src/session-store-meta.ts +134 -0
- package/bridge/src/session-store-turn-ledger.ts +272 -0
- package/bridge/src/session-store.ts +380 -0
- package/bridge/src/system-notify.ts +220 -0
- package/bridge/src/thread-sync.ts +200 -0
- package/bridge/src/translator.ts +494 -0
- package/bridge/src/types.ts +289 -0
- package/bridge/src/utils.ts +104 -0
- package/bridge/src/work-session-store.ts +471 -0
- package/docs/.gitkeep +0 -0
- package/docs/architecture/codex-feishu-bridge-proposal.md +2742 -0
- package/docs/completed/FEATURE-feishu-markdown-and-reply-support.md +327 -0
- package/docs/completed/README.md +21 -0
- package/docs/completed/SPEC-approval-autonomy-and-safe-defaults.md +205 -0
- package/docs/completed/SPEC-approval-batch-and-strict-reply-shortcuts.md +153 -0
- package/docs/completed/SPEC-conversation-noise-reduction-and-busy-input-gate.md +538 -0
- package/docs/completed/SPEC-engineering-sop-skillization.md +190 -0
- package/docs/completed/SPEC-faithful-bridge-core-thinning-v2.md +376 -0
- package/docs/completed/SPEC-faithful-bridge-core-thinning.md +1071 -0
- package/docs/completed/SPEC-group-chat-sender-identity.md +301 -0
- package/docs/completed/SPEC-middleware-exception-visibility.md +227 -0
- package/docs/completed/SPEC-nightly-memory-digest-visibility.md +121 -0
- package/docs/completed/SPEC-project-group-chat-human-centered-conversation-mapping.md +326 -0
- package/docs/completed/SPEC-remove-cli-persona-bootstrap.md +201 -0
- package/docs/developer-workflow.md +49 -0
- package/docs/implementation/SPEC-codex-same-machine-session-handoff-implementation.md +239 -0
- package/docs/implementation/test-coverage-map.md +363 -0
- package/docs/implementation/work-ally-implementation-guide.md +790 -0
- package/docs/issues/README.md +10 -0
- package/docs/issues/pending/ANALYSIS-ally-premature-recovery-notice-and-task-state-semantics-2026-03-18.md +295 -0
- package/docs/issues/resolved/ANALYSIS-approval-waiting-visible-but-approval-artifact-missing-2026-03-16.md +466 -0
- package/docs/issues/resolved/ANALYSIS-blocking-state-visible-without-user-actionable-artifact-2026-03-16.md +261 -0
- package/docs/issues/resolved/ANALYSIS-codex-app-server-transport-disconnect-semantics-2026-03-14.md +606 -0
- package/docs/issues/resolved/ANALYSIS-premature-terminalization-on-fresh-thread-poll-and-object-error-leak-2026-03-16.md +348 -0
- package/docs/issues/resolved/ANALYSIS-runtime-turn-delivery-and-recovery-2026-03-14.md +603 -0
- package/docs/issues/resolved/ANALYSIS-self-test-gap-approval-waiting-visible-but-approval-artifact-missing-2026-03-16.md +166 -0
- package/docs/issues/resolved/ANALYSIS-self-test-gap-blocking-state-visible-without-user-actionable-artifact-2026-03-16.md +186 -0
- package/docs/issues/resolved/ANALYSIS-self-test-gap-premature-terminalization-on-fresh-thread-poll-and-object-error-leak-2026-03-16.md +166 -0
- package/docs/issues/resolved/REPORT-ally-runtime-turn-delivery-3b42fb8-2026-03-15.md +373 -0
- package/docs/manual-acceptance.md +127 -0
- package/docs/ops-runbook.md +44 -0
- package/docs/planning/FEATURE-memory-system.md +748 -0
- package/docs/planning/SPEC-active-turn-steer-and-context-compaction-visibility.md +269 -0
- package/docs/planning/SPEC-approval-rules-inheritance-and-local-validation-lane.md +450 -0
- package/docs/planning/SPEC-assistant-persona-bootstrap.md +199 -0
- package/docs/planning/SPEC-assistant-rename.md +610 -0
- package/docs/planning/SPEC-bridge-app-server-protocol-alignment.md +667 -0
- package/docs/planning/SPEC-claude-runtime-host-for-work-ally.md +434 -0
- package/docs/planning/SPEC-cli-feishu-codex-session-unification.md +236 -0
- package/docs/planning/SPEC-codex-same-machine-session-handoff.md +873 -0
- package/docs/planning/SPEC-feishu-reaction-shortcuts.md +282 -0
- package/docs/planning/SPEC-local-stable-release-boundary.md +166 -0
- package/docs/planning/SPEC-managed-thread-entry-and-surface-mobility.md +862 -0
- package/docs/planning/SPEC-minimal-bridge-semantics-and-user-visible-surface.md +362 -0
- package/docs/planning/SPEC-npm-alpha-distribution-and-install-first-release.md +222 -0
- package/docs/planning/SPEC-remove-websocket-runtime-transport.md +364 -0
- package/docs/planning/SPEC-runtime-abstraction-phase-1.md +424 -0
- package/docs/planning/SPEC-runtime-connection-and-turn-recovery-semantics.md +274 -0
- package/docs/planning/SPEC-session-presence-and-state-visibility.md +397 -0
- package/docs/planning/SPEC-skill-first-capability-packaging.md +338 -0
- package/docs/planning/SPEC-stable-archive-contract.md +456 -0
- package/docs/planning/SPEC-supervised-start-boundary.md +127 -0
- package/docs/planning/SPEC-user-barrier-reduction-and-activation.md +832 -0
- package/docs/planning/ally-next.md +1278 -0
- package/docs/planning/assistant-workbench-spec.md +725 -0
- package/docs/planning/product-workbench.md +283 -0
- package/docs/product-onboarding.md +227 -0
- package/docs/product-spec-standard.md +528 -0
- package/docs/troubleshooting.md +45 -0
- package/docs/user-quickstart.md +46 -0
- package/internal/dispatch.sh +95 -0
- package/internal/lib/common.sh +1450 -0
- package/internal/modules/assistant/manage.sh +1312 -0
- package/internal/modules/bootstrap/setup.sh +144 -0
- package/internal/modules/config/init-env.sh +10 -0
- package/internal/modules/global/manage.sh +154 -0
- package/internal/modules/handoff/manage.sh +54 -0
- package/internal/modules/mcp/manage.sh +83 -0
- package/internal/modules/ops/logs.sh +76 -0
- package/internal/modules/routines/manage.sh +55 -0
- package/internal/modules/runtime/assistant-autosave.sh +26 -0
- package/internal/modules/runtime/restart.sh +6 -0
- package/internal/modules/runtime/start.sh +283 -0
- package/internal/modules/runtime/status.sh +194 -0
- package/internal/modules/runtime/stop.sh +55 -0
- package/internal/modules/runtime/supervisor.sh +216 -0
- package/internal/modules/runtime/update.sh +26 -0
- package/package.json +41 -0
- package/runtime/config/.gitkeep +0 -0
- package/runtime/host/.gitkeep +0 -0
- package/runtime/host/healthcheck-codex-app-server.ts +22 -0
- package/runtime/host/ping-pong-codex-app-server.ts +66 -0
- package/runtime/host/probe-codex-app-server.ts +115 -0
- package/skills/archive-reader/SKILL.md +9 -0
- package/skills/feishu-production-debug/SKILL.md +37 -0
- package/skills/feishu-production-debug/references/feishu-debug-order.md +49 -0
- package/skills/feishu-production-debug/references/platform-permission-baseline.md +23 -0
- package/skills/issue-to-spec-triage/SKILL.md +44 -0
- package/skills/issue-to-spec-triage/references/triage-rules.md +66 -0
- package/skills/memory-digest/SKILL.md +9 -0
- package/skills/post-implementation-closure/SKILL.md +39 -0
- package/skills/post-implementation-closure/references/closure-checklist.md +45 -0
- package/skills/post-implementation-closure/references/doc-drift-map.md +49 -0
- package/skills/product-spec/SKILL.md +244 -0
- package/templates/env.example +5 -0
- package/templates/routines/nightly-memory-digest.yaml +10 -0
- package/templates/workspace/AGENTS.md +26 -0
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
# SPEC: Approval Batch And Strict Reply Shortcuts
|
|
2
|
+
|
|
3
|
+
更新时间:2026-03-18
|
|
4
|
+
状态:Completed / Shipped
|
|
5
|
+
Owner:work-ally product / engineering
|
|
6
|
+
相关文档:
|
|
7
|
+
- `docs/completed/SPEC-approval-autonomy-and-safe-defaults.md`
|
|
8
|
+
- `docs/completed/SPEC-conversation-noise-reduction-and-busy-input-gate.md`
|
|
9
|
+
- `docs/manual-acceptance.md`
|
|
10
|
+
- `bridge/src/router.ts`
|
|
11
|
+
- `bridge/src/receiver.ts`
|
|
12
|
+
- `bridge/src/translator.ts`
|
|
13
|
+
|
|
14
|
+
## 1. Summary
|
|
15
|
+
|
|
16
|
+
当前审批体验在 Feishu 里过于碎:一轮 turn 内如果连续出现多条审批,用户需要逐条 approve;而且审批卡之间还会夹杂状态提示,导致操作路径别扭。
|
|
17
|
+
|
|
18
|
+
本专题做两件小事:
|
|
19
|
+
|
|
20
|
+
1. 当会话处于 `waiting approval` 时,中间层接管用户下一条消息;只接受严格约定字符串:`OK` / `同意` / `NO` / `拒绝`。
|
|
21
|
+
2. 同一轮 / 同一会话内出现多条待审批时,前台默认合并成一张审批卡;用户一次回复即可全部通过或全部拒绝。
|
|
22
|
+
|
|
23
|
+
不做自然语言理解,不要求 reply 某一张审批卡,不引入额外面板或厚重审批队列。
|
|
24
|
+
|
|
25
|
+
## 2. 目标
|
|
26
|
+
|
|
27
|
+
1. 减少 Feishu 中逐条审批的摩擦。
|
|
28
|
+
2. 保持审批语义明确、可预测、可审计。
|
|
29
|
+
3. 只在 `waiting approval` 阻塞态下启用严格字符串快捷回复;其他场景下 `OK` / `NO` 继续透传给 Codex。
|
|
30
|
+
4. 保持中间层简单,不引入新的复杂审批状态机。
|
|
31
|
+
|
|
32
|
+
## 3. 非目标
|
|
33
|
+
|
|
34
|
+
1. 不做自然语言审批理解。
|
|
35
|
+
2. 不做“回复任意历史消息都算审批”的宽松语义。
|
|
36
|
+
3. 不做审批队列面板、审批模式配置项、审批别名扩展。
|
|
37
|
+
4. 不改变 runtime 原生 approval request / resolveApproval 合同。
|
|
38
|
+
|
|
39
|
+
## 4. 产品定义
|
|
40
|
+
|
|
41
|
+
### 4.1 严格快捷回复
|
|
42
|
+
|
|
43
|
+
仅当当前会话存在可见待审批项时,bridge 才拦截用户下一条消息并按以下规则处理:
|
|
44
|
+
|
|
45
|
+
- `trim` 后严格等于 `OK` 或 `同意` -> 视为批准当前待审批
|
|
46
|
+
- `trim` 后严格等于 `NO` 或 `拒绝` -> 视为拒绝当前待审批
|
|
47
|
+
- 其他文本 -> 不转给 Codex,直接提示用户回复约定值
|
|
48
|
+
|
|
49
|
+
注意:
|
|
50
|
+
|
|
51
|
+
- 这里不做大小写模糊、相似语义、表情或自然语言扩展。
|
|
52
|
+
- 只做字符串 equals。
|
|
53
|
+
- 不要求 reply 审批卡。
|
|
54
|
+
|
|
55
|
+
### 4.2 多审批默认合并
|
|
56
|
+
|
|
57
|
+
同一会话在 `pendingApprovalIds.length > 1` 时:
|
|
58
|
+
|
|
59
|
+
- 前台不再逐条发多张审批卡
|
|
60
|
+
- 默认发送一张合并审批卡
|
|
61
|
+
- 卡片中明确列出审批数量与简要条目
|
|
62
|
+
- 用户回复一次 `OK` / `同意` -> 全部批准
|
|
63
|
+
- 用户回复一次 `NO` / `拒绝` -> 全部拒绝
|
|
64
|
+
|
|
65
|
+
### 4.3 非 waiting approval 场景
|
|
66
|
+
|
|
67
|
+
如果当前会话没有可见待审批项:
|
|
68
|
+
|
|
69
|
+
- `OK` / `同意` / `NO` / `拒绝` 一律按普通用户消息处理
|
|
70
|
+
- 不做审批拦截
|
|
71
|
+
|
|
72
|
+
## 5. 前台文案
|
|
73
|
+
|
|
74
|
+
### 5.1 单审批卡
|
|
75
|
+
|
|
76
|
+
保留审批边界说明,但收紧操作提示:
|
|
77
|
+
|
|
78
|
+
- 不再强调“直接回复这张审批卡”
|
|
79
|
+
- 改为强调:`当前会话正在等审批;你可以直接回复 OK / 同意,或 NO / 拒绝。`
|
|
80
|
+
|
|
81
|
+
### 5.2 多审批合并卡
|
|
82
|
+
|
|
83
|
+
建议文案:
|
|
84
|
+
|
|
85
|
+
- 标题:`审批请求(共 N 项)`
|
|
86
|
+
- 说明:`这一轮有多项审批待处理。回复 OK / 同意 可全部通过;回复 NO / 拒绝 可全部拒绝。`
|
|
87
|
+
- 条目:每项保留最小必要信息,如类型、动作、影响范围、工作目录
|
|
88
|
+
|
|
89
|
+
### 5.3 waiting approval follow-up
|
|
90
|
+
|
|
91
|
+
当用户在 waiting approval 期间发来非约定字符串:
|
|
92
|
+
|
|
93
|
+
- 不把消息转给 Codex
|
|
94
|
+
- 返回:`当前有待处理审批。请回复 OK / 同意,或 NO / 拒绝。`
|
|
95
|
+
|
|
96
|
+
## 6. 机制设计
|
|
97
|
+
|
|
98
|
+
### 6.1 Router
|
|
99
|
+
|
|
100
|
+
- 保留当前 `/approve <id>` 与 `/deny <id>` 显式命令
|
|
101
|
+
- 保留“reply 审批卡 + 同意/拒绝”的兼容路径
|
|
102
|
+
- 新增严格快捷回复解析,但只在 receiver 判断当前会话处于 waiting approval 时启用,不在 router 层无条件把 `OK` / `NO` 解析成控制命令
|
|
103
|
+
|
|
104
|
+
### 6.2 Receiver
|
|
105
|
+
|
|
106
|
+
- 在 `waiting approval` follow-up 分支优先处理严格快捷回复
|
|
107
|
+
- 单审批时,对当前唯一 pending approval 调用 `runtime.resolveApproval`
|
|
108
|
+
- 多审批时,按当前 `pendingApprovalIds` 顺序逐个 resolve
|
|
109
|
+
- 任一审批 resolve 失败时,停止后续处理,并向用户回报失败
|
|
110
|
+
- 全部成功后,统一回一条结果说明
|
|
111
|
+
|
|
112
|
+
### 6.3 Session Store
|
|
113
|
+
|
|
114
|
+
- 继续复用当前 `pendingApprovalIds` 与 approval records
|
|
115
|
+
- 不新增独立 batch object
|
|
116
|
+
- 前台合并卡通过扫描当前会话下的 pending approvals 生成,不要求新增 durable 批对象
|
|
117
|
+
- 合并审批只是前台展示与 follow-up 解析语义,不新增新的 durable 审批实体
|
|
118
|
+
|
|
119
|
+
### 6.4 Feishu 前台
|
|
120
|
+
|
|
121
|
+
- `approval_requested` 会在一个很短的合并窗口内聚合当前 turn 的 pending approvals,再决定发单卡还是合并卡
|
|
122
|
+
- 同一批待审批项只保留一张可操作卡
|
|
123
|
+
- 仍保持 archive / session-store 中每个 approval 独立存在,便于审计
|
|
124
|
+
|
|
125
|
+
## 7. 验收标准
|
|
126
|
+
|
|
127
|
+
1. 单审批出现后,用户直接发送 `OK` / `同意`,无需 reply 卡片,也能完成审批。
|
|
128
|
+
2. 单审批出现后,用户直接发送 `NO` / `拒绝`,无需 reply 卡片,也能拒绝审批。
|
|
129
|
+
3. waiting approval 期间用户发送其他文本时,不转给 Codex,并收到固定提示:`当前有待处理审批。请回复 OK / 同意,或 NO / 拒绝。`
|
|
130
|
+
4. 没有 pending approval 时,`OK` / `NO` 会正常透传到 Codex。
|
|
131
|
+
5. 同一会话出现多项 pending approval 时,前台只看到一张合并审批卡。
|
|
132
|
+
6. 多审批场景下,用户一次 `OK` / `同意` 可全部通过;一次 `NO` / `拒绝` 可全部拒绝。
|
|
133
|
+
7. `/approve <id>` / `/deny <id>` 旧路径仍可用。
|
|
134
|
+
|
|
135
|
+
## 8. 验收结果
|
|
136
|
+
|
|
137
|
+
- unit:router strict shortcut / adapter outbound card 渲染已覆盖
|
|
138
|
+
- integration:单审批快捷通过 / 拒绝、非法 follow-up 拦截、无 pending approval 时 `OK` 透传、多审批合并卡与批量 resolve 已覆盖
|
|
139
|
+
- 当前聚焦自动化验证:`/opt/homebrew/bin/node --test tests/unit/session/router.test.mjs tests/integration/session/approval-flow.test.mjs tests/unit/channel/feishu-adapter-outbound.test.mjs tests/integration/session/waiting-and-redelivery.test.mjs tests/integration/session/control-commands.test.mjs tests/integration/session/mcp-tool-approval-flow.test.mjs` -> `47/47` 通过
|
|
140
|
+
|
|
141
|
+
## 9. 测试要求
|
|
142
|
+
|
|
143
|
+
- unit:router 严格快捷回复 / reply 审批卡兼容
|
|
144
|
+
- integration:单审批快捷通过 / 拒绝
|
|
145
|
+
- integration:waiting approval 非法 follow-up 拦截
|
|
146
|
+
- integration:无 pending approval 时 `OK` 透传
|
|
147
|
+
- integration:多审批合并卡与批量 resolve
|
|
148
|
+
|
|
149
|
+
## 10. 风险与边界
|
|
150
|
+
|
|
151
|
+
- 合并审批只适合“当前会话 pending approval 集合”这一层,不做跨会话合并。
|
|
152
|
+
- 批量 resolve 时若中途失败,前台需要明确告诉用户“本批审批未全部完成”,避免误以为全部已通过。
|
|
153
|
+
- 这次优化的核心是减少 IM 摩擦,不是重做审批系统;因此坚持不引入新面板和复杂配置。
|
|
@@ -0,0 +1,538 @@
|
|
|
1
|
+
# Conversation Noise Reduction And Busy Input Gate
|
|
2
|
+
|
|
3
|
+
更新时间:2026-03-14
|
|
4
|
+
状态:Shipped / 2026-03-15 shipped baseline
|
|
5
|
+
|
|
6
|
+
## 1. 这份 spec 在解决什么
|
|
7
|
+
|
|
8
|
+
这份 spec 解决的是一个真实使用中已经反复暴露出来的体验问题:
|
|
9
|
+
|
|
10
|
+
> Feishu 对话窗口里,中间层“正在处理”“正在思考中”“旧任务已停止”等工作状态提示过多,正在侵蚀真正的人机对话本身。
|
|
11
|
+
|
|
12
|
+
如果继续沿着当前默认行为走,产品会越来越像一个会不断插嘴的中间件,而不是一个可信、克制、低打扰的 assistant。
|
|
13
|
+
|
|
14
|
+
所以这条专题的重点不是“删几条文案”,而是重写一条更成熟的对话合同:
|
|
15
|
+
|
|
16
|
+
1. 正常路径尽量安静
|
|
17
|
+
2. 真正需要用户知道时再说话
|
|
18
|
+
3. assistant 忙的时候,不再默认打断旧任务改做新任务
|
|
19
|
+
4. 用户依然保有明确的控制权,尤其是 `Stop`
|
|
20
|
+
|
|
21
|
+
## 2. 背景
|
|
22
|
+
|
|
23
|
+
当前系统已经具备一部分状态可见性能力:
|
|
24
|
+
|
|
25
|
+
- 收到消息后会有 ack reaction
|
|
26
|
+
- 长耗时 turn 期间会发送 running / heartbeat 文案
|
|
27
|
+
- 等审批、等补充信息、runtime 异常时会发送不同系统消息
|
|
28
|
+
- 如果用户在上一轮未结束时继续发消息,系统会默认停止旧 turn,改做新 turn
|
|
29
|
+
|
|
30
|
+
这些能力从“工程上补可见性”角度看是合理的,但从真实 IM 产品体验看,问题已经很明显:
|
|
31
|
+
|
|
32
|
+
### 2.1 正常路径噪音过多
|
|
33
|
+
|
|
34
|
+
用户本来只想和 assistant 对话,但窗口里会频繁出现:
|
|
35
|
+
|
|
36
|
+
- `正在处理,请稍候。`
|
|
37
|
+
- `正在思考中,请稍候…`
|
|
38
|
+
- `上一轮仍在处理中;已停止旧任务,改为处理你刚发的新消息。`
|
|
39
|
+
|
|
40
|
+
这些提示很多不是异常,也不是需要用户立刻决策的时刻。
|
|
41
|
+
|
|
42
|
+
### 2.2 当前默认的“自动抢占”不够产品化
|
|
43
|
+
|
|
44
|
+
当 assistant 还在忙时,用户再发一条自然语言消息,系统当前会默认:
|
|
45
|
+
|
|
46
|
+
- 打断上一轮
|
|
47
|
+
- 清理旧 active turn
|
|
48
|
+
- 直接处理新消息
|
|
49
|
+
- 再回告用户“旧任务已停止”
|
|
50
|
+
|
|
51
|
+
这在实现层是一个简单选择,但在产品层问题很大:
|
|
52
|
+
|
|
53
|
+
- 它把“是否打断当前工作”这个决定替用户做掉了
|
|
54
|
+
- 它让对话结果变得不稳定,用户不容易建立预期
|
|
55
|
+
- 它制造额外系统文案噪音
|
|
56
|
+
- 它会让用户误以为“连续发几句 = 正常多轮聊天”,但系统其实是在隐式抢占
|
|
57
|
+
|
|
58
|
+
### 2.3 “可见性”被误用成“持续出声”
|
|
59
|
+
|
|
60
|
+
状态可见性的本意是降低不确定性。
|
|
61
|
+
|
|
62
|
+
但在 IM 场景里,降低不确定性不等于不断发“我还在忙”。
|
|
63
|
+
|
|
64
|
+
如果中间层把每一个内部阶段都翻译成文字冒泡,它虽然更“可见”,却不一定更“好用”。
|
|
65
|
+
|
|
66
|
+
## 3. 产品判断
|
|
67
|
+
|
|
68
|
+
先给判断。
|
|
69
|
+
|
|
70
|
+
### 3.1 这条方向是对的
|
|
71
|
+
|
|
72
|
+
你的方向是对的,而且不是小优化,而是一个应该单独立 spec 的产品决策。
|
|
73
|
+
|
|
74
|
+
更准确的产品定义不是“少发几条工作中文案”,而是:
|
|
75
|
+
|
|
76
|
+
> 让飞书会话默认回到“人和 assistant 的主对话”,而不是“人、assistant 和中间层三方混聊”。
|
|
77
|
+
|
|
78
|
+
### 3.2 正常路径要降噪,异常路径要显式
|
|
79
|
+
|
|
80
|
+
我们不应该走两个极端:
|
|
81
|
+
|
|
82
|
+
- 不是继续保持现在这种高频工作状态输出
|
|
83
|
+
- 也不是把所有状态都静默掉
|
|
84
|
+
|
|
85
|
+
正确方向是:
|
|
86
|
+
|
|
87
|
+
- 正常路径安静
|
|
88
|
+
- 等用户动作时明确
|
|
89
|
+
- 出问题时明确
|
|
90
|
+
- 用户尝试在忙时插入新需求时明确
|
|
91
|
+
|
|
92
|
+
### 3.3 V1 应该“拦截,不排队,不默认抢占”
|
|
93
|
+
|
|
94
|
+
如果 assistant 还在处理上一轮,V1 最合理的产品语义不是:
|
|
95
|
+
|
|
96
|
+
- 自动打断旧任务
|
|
97
|
+
- 把新消息悄悄排队
|
|
98
|
+
- 或同时维护一个隐藏堆栈
|
|
99
|
+
|
|
100
|
+
而是:
|
|
101
|
+
|
|
102
|
+
- 直接拦截新的自然语言消息
|
|
103
|
+
- 明确告诉用户当前仍在忙
|
|
104
|
+
- 告诉用户如需打断可以发送 `/stop`
|
|
105
|
+
- 让用户在“等待”与“打断”之间显式做决定
|
|
106
|
+
|
|
107
|
+
这样模型最简单,用户心智也最稳定。
|
|
108
|
+
|
|
109
|
+
## 4. 目标
|
|
110
|
+
|
|
111
|
+
这条 feature 的目标有四个。
|
|
112
|
+
|
|
113
|
+
1. 保持 Feishu 会话窗口尽可能纯净,减少中间层日常噪音
|
|
114
|
+
2. 阻止 assistant 忙时的自然语言消息默认抢占当前 turn
|
|
115
|
+
3. 保留用户对当前轮的最终决定权,尤其是 `Stop`
|
|
116
|
+
4. 不牺牲异常透明化与等待用户状态的明确性
|
|
117
|
+
|
|
118
|
+
## 5. 非目标
|
|
119
|
+
|
|
120
|
+
本次不做:
|
|
121
|
+
|
|
122
|
+
- 不做隐藏消息队列
|
|
123
|
+
- 不做复杂的多消息堆栈管理
|
|
124
|
+
- 不做“边忙边继续收后续需求”的后台编排
|
|
125
|
+
- 不做独立会话工作流引擎
|
|
126
|
+
- 不把所有状态都搬去新的 dashboard 才看得见
|
|
127
|
+
|
|
128
|
+
V1 的重点是先把默认合同收正,而不是增加复杂度。
|
|
129
|
+
|
|
130
|
+
## 6. 核心概念
|
|
131
|
+
|
|
132
|
+
### 6.1 `Idle`
|
|
133
|
+
|
|
134
|
+
含义:当前会话没有活跃 turn,也没有等待用户才能继续的挂起状态。
|
|
135
|
+
|
|
136
|
+
此时:
|
|
137
|
+
|
|
138
|
+
- 用户自然语言消息可以正常进入
|
|
139
|
+
- `/new`、`/status`、`/stop` 等控制命令按既有语义处理
|
|
140
|
+
|
|
141
|
+
### 6.2 `Busy`
|
|
142
|
+
|
|
143
|
+
含义:当前会话存在活跃 turn,assistant 仍在推进本轮工作,且现在不是用户动作回合。
|
|
144
|
+
|
|
145
|
+
典型包括:
|
|
146
|
+
|
|
147
|
+
- runtime 正在执行
|
|
148
|
+
- bridge 正在等待本轮最终结果
|
|
149
|
+
- recovery 正在确认上一轮结果
|
|
150
|
+
|
|
151
|
+
此时:
|
|
152
|
+
|
|
153
|
+
- 普通自然语言消息不应再默认进入
|
|
154
|
+
- 不应默认打断旧任务
|
|
155
|
+
- 用户如果要终止当前轮,应明确发送 `/stop`
|
|
156
|
+
|
|
157
|
+
### 6.3 `WaitingUser`
|
|
158
|
+
|
|
159
|
+
含义:当前轮已经暂停,后续推进明确依赖用户动作。
|
|
160
|
+
|
|
161
|
+
典型包括:
|
|
162
|
+
|
|
163
|
+
- 等审批
|
|
164
|
+
- 等补充信息
|
|
165
|
+
- 等 MCP tool confirmation
|
|
166
|
+
|
|
167
|
+
此时:
|
|
168
|
+
|
|
169
|
+
- 用户下一条回复应被允许进入
|
|
170
|
+
- 这不是“忙时阻塞”,而是“轮到用户”
|
|
171
|
+
|
|
172
|
+
### 6.4 `Problem`
|
|
173
|
+
|
|
174
|
+
这条 spec 里的“问题”不是泛指一切运行状态,而是指以下几类用户必须被明确告知的异常或阻塞:
|
|
175
|
+
|
|
176
|
+
1. runtime / channel / recovery 异常,导致当前轮状态不可可靠确认
|
|
177
|
+
2. 中间层无法稳定处理当前消息
|
|
178
|
+
3. 用户当前输入因为 assistant 忙而被拦截
|
|
179
|
+
4. 当前轮已经进入等待用户动作,但用户可能不知道该轮到自己了
|
|
180
|
+
|
|
181
|
+
也就是说:
|
|
182
|
+
|
|
183
|
+
- `assistant 正在正常工作` 不算问题
|
|
184
|
+
- `系统无法继续推进或用户当前不能推进` 才算问题
|
|
185
|
+
|
|
186
|
+
## 7. 产品定义
|
|
187
|
+
|
|
188
|
+
## 7.1 对话纯净度原则
|
|
189
|
+
|
|
190
|
+
飞书窗口里的系统文案应只承担三种职责:
|
|
191
|
+
|
|
192
|
+
1. 明确要求用户动作
|
|
193
|
+
2. 明确告知用户当前动作被阻塞
|
|
194
|
+
3. 明确告知用户系统出现异常或恢复失败
|
|
195
|
+
|
|
196
|
+
除此之外,中间层应尽量不插话。
|
|
197
|
+
|
|
198
|
+
### 7.2 正常路径默认降噪
|
|
199
|
+
|
|
200
|
+
在默认正常路径里,应抑制这类常规工作中文案:
|
|
201
|
+
|
|
202
|
+
- `正在处理,请稍候。`
|
|
203
|
+
- `正在思考中,请稍候…`
|
|
204
|
+
- 仅仅为了说明“我还在工作”的重复 heartbeat
|
|
205
|
+
|
|
206
|
+
保留:
|
|
207
|
+
|
|
208
|
+
- reaction ack 这类轻量、非正文干扰的收到反馈
|
|
209
|
+
- assistant 最终真正要给用户的答复
|
|
210
|
+
|
|
211
|
+
### 7.2.1 系统消息不应伪装成 assistant 正文
|
|
212
|
+
|
|
213
|
+
即使某些系统消息仍然需要出现,它们也不应继续长得像“assistant 又回了一句自然语言”。
|
|
214
|
+
|
|
215
|
+
这是当前体验里另一个明显问题:
|
|
216
|
+
|
|
217
|
+
- 文案内容本来只是工作状态
|
|
218
|
+
- 但视觉上却很像 assistant 正式在对人说话
|
|
219
|
+
- 用户会感到窗口被“很多不像正式回复的回复”占满
|
|
220
|
+
|
|
221
|
+
所以这条专题除了控制“发不发”,还必须控制“长什么样”。
|
|
222
|
+
|
|
223
|
+
产品上应把飞书里的消息至少分成三层:
|
|
224
|
+
|
|
225
|
+
1. `最终回复`
|
|
226
|
+
- assistant 真正对用户的答复
|
|
227
|
+
- 这是对话主内容,视觉权重最高
|
|
228
|
+
2. `动作型系统消息`
|
|
229
|
+
- 等审批、等补充信息、恢复失败、明确阻塞
|
|
230
|
+
- 这是要求用户理解并采取动作的消息,权重中等偏高
|
|
231
|
+
3. `状态型系统消息`
|
|
232
|
+
- 工作进展、处理中提示、轻量告知
|
|
233
|
+
- 这是被动状态,不应与最终回复争抢注意力,权重最低
|
|
234
|
+
|
|
235
|
+
### 7.2.2 状态型系统消息应改成“弱提示卡”,而不是正文口吻
|
|
236
|
+
|
|
237
|
+
像下面这类消息:
|
|
238
|
+
|
|
239
|
+
- `⏳ 工作中 准备落文档了...`
|
|
240
|
+
- `⏳ 工作中 方向已经收住了...`
|
|
241
|
+
|
|
242
|
+
它们的价值是存在的:
|
|
243
|
+
|
|
244
|
+
- 能让用户知道 assistant 还在推进
|
|
245
|
+
- 能让用户感受到阶段性进展
|
|
246
|
+
|
|
247
|
+
但它们不属于 assistant 的最终回复,也不属于必须立刻处理的阻塞消息。
|
|
248
|
+
|
|
249
|
+
因此更合适的产品形态不是普通正文,而是:
|
|
250
|
+
|
|
251
|
+
> 一种弱存在感的飞书状态卡。
|
|
252
|
+
|
|
253
|
+
这类卡片的目标不是“解释很多”,而是“轻量露出、明确分层、不打断主对话”。
|
|
254
|
+
|
|
255
|
+
### 7.2.3 飞书呈现合同
|
|
256
|
+
|
|
257
|
+
在当前飞书能力下,这类消息应优先使用 card 类承载,而不是继续伪装成普通回复正文。
|
|
258
|
+
|
|
259
|
+
产品合同建议如下:
|
|
260
|
+
|
|
261
|
+
1. `最终回复`
|
|
262
|
+
- 继续使用当前普通回复富文本路径
|
|
263
|
+
- 不额外包系统壳
|
|
264
|
+
2. `动作型系统消息`
|
|
265
|
+
- 使用清晰、可识别的系统卡
|
|
266
|
+
- 标题明确说明:等待你操作 / 需要审批 / 恢复失败 / 请重发
|
|
267
|
+
3. `状态型系统消息`
|
|
268
|
+
- 使用更轻的 card
|
|
269
|
+
- 首版标题固定为 `工作进展`,不再继续把 `⏳ 工作中` 当作主标题
|
|
270
|
+
- 正文只保留一小段短句,不再在正文里重复 `⏳ 工作中`
|
|
271
|
+
- 不放审批按钮、操作按钮或长解释,只保留状态本体
|
|
272
|
+
- 使用中性、弱强调的视觉风格,不与最终回复争夺主视觉层级
|
|
273
|
+
|
|
274
|
+
### 7.2.4 状态型系统消息的样式原则
|
|
275
|
+
|
|
276
|
+
状态型系统消息应遵守下面四条原则:
|
|
277
|
+
|
|
278
|
+
1. `像状态,不像答复`
|
|
279
|
+
- 用户一眼就能分辨:这不是 assistant 对我问题的最终回答
|
|
280
|
+
2. `弱提示,不抢戏`
|
|
281
|
+
- 允许存在,但不应成为会话里最显眼的内容
|
|
282
|
+
3. `短句,不展开`
|
|
283
|
+
- 只给阶段性进展,不在这里长篇解释背景
|
|
284
|
+
4. `可连续出现,但不能形成视觉疲劳`
|
|
285
|
+
- 如果出现多次,用户也应感觉是在看一个稳定的状态层,而不是被很多“伪回复”刷屏
|
|
286
|
+
|
|
287
|
+
### 7.3 忙时输入门控
|
|
288
|
+
|
|
289
|
+
当系统判断当前会话为 `Busy` 时:
|
|
290
|
+
|
|
291
|
+
- 新的普通自然语言消息不进入 runtime
|
|
292
|
+
- 不再默认 interrupt 当前 turn
|
|
293
|
+
- 不建立隐藏队列
|
|
294
|
+
- 由中间层直接拦截并短文案提示用户
|
|
295
|
+
|
|
296
|
+
建议默认文案:
|
|
297
|
+
|
|
298
|
+
`我还在处理上一条,请稍后再发一次;如需打断,请发送 /stop。`
|
|
299
|
+
|
|
300
|
+
这句话要同时完成三件事:
|
|
301
|
+
|
|
302
|
+
- 说明为什么这条消息没进
|
|
303
|
+
- 告诉用户下一步怎么做
|
|
304
|
+
- 保留用户对当前轮的决定权
|
|
305
|
+
|
|
306
|
+
### 7.4 忙时门控不是无限刷屏
|
|
307
|
+
|
|
308
|
+
如果用户在同一个 `Busy` 窗口里连续发送多条自然语言消息,中间层不应每条都重复刷同一句拦截提示。
|
|
309
|
+
|
|
310
|
+
V1 应采用“同一忙碌窗口内限频提示”的策略:
|
|
311
|
+
|
|
312
|
+
- 第一次被拦截时明确提示
|
|
313
|
+
- 同一忙碌窗口内后续重复拦截尽量不重复刷屏,或至少明显限频
|
|
314
|
+
- 当前轮结束后,下一次进入新的 `Busy` 窗口时再重新允许提示
|
|
315
|
+
|
|
316
|
+
否则“为降噪而拦截”,最后会再次制造新的噪音。
|
|
317
|
+
|
|
318
|
+
### 7.5 `WaitingUser` 不受忙时门控影响
|
|
319
|
+
|
|
320
|
+
当系统处于 `WaitingUser` 时,用户回复必须继续放行。
|
|
321
|
+
|
|
322
|
+
原因很简单:
|
|
323
|
+
|
|
324
|
+
- 这时不是 assistant 在占用对话
|
|
325
|
+
- 而是当前轮已经明确交棒给用户
|
|
326
|
+
|
|
327
|
+
所以这类输入不应被误判成“打断忙碌中的 assistant”。
|
|
328
|
+
|
|
329
|
+
### 7.6 控制命令例外
|
|
330
|
+
|
|
331
|
+
即使系统处于 `Busy`,以下显式控制动作仍应允许:
|
|
332
|
+
|
|
333
|
+
- `/stop`
|
|
334
|
+
- `/status`
|
|
335
|
+
- 与当前 pending approval 相关的 `/approve`、`/deny`
|
|
336
|
+
- 针对当前 pending user input 的直接回复
|
|
337
|
+
|
|
338
|
+
V1 对 `/new` 的建议是保守处理:
|
|
339
|
+
|
|
340
|
+
- 不把 `/new` 设计成忙时的隐式抢占捷径
|
|
341
|
+
- 如果当前轮仍在忙,应优先要求用户先 `/stop`,再决定是否开启新会话
|
|
342
|
+
|
|
343
|
+
这样可以避免控制语义重新滑回“隐式打断当前轮”。
|
|
344
|
+
|
|
345
|
+
## 8. 用户路径
|
|
346
|
+
|
|
347
|
+
### 8.1 正常单轮
|
|
348
|
+
|
|
349
|
+
1. 用户发消息
|
|
350
|
+
2. 系统用轻量 ack 表示已收到
|
|
351
|
+
3. assistant 在后台工作
|
|
352
|
+
4. 中途不再反复冒“正在处理”类文案
|
|
353
|
+
5. assistant 给出最终答复
|
|
354
|
+
|
|
355
|
+
用户感受应当是:
|
|
356
|
+
|
|
357
|
+
- 对话是连贯的
|
|
358
|
+
- 中间层没有抢戏
|
|
359
|
+
|
|
360
|
+
### 8.2 assistant 忙时,用户又发自然语言消息
|
|
361
|
+
|
|
362
|
+
1. 用户发出新消息
|
|
363
|
+
2. 系统识别当前会话仍为 `Busy`
|
|
364
|
+
3. 中间层拦截该消息,不送入 runtime
|
|
365
|
+
4. 系统短文案提示:请稍后重发;如需打断请 `/stop`
|
|
366
|
+
5. 当前轮继续,不被默认打断
|
|
367
|
+
|
|
368
|
+
用户感受应当是:
|
|
369
|
+
|
|
370
|
+
- 当前轮仍然稳定
|
|
371
|
+
- 没有发生系统替我做决定的隐式抢占
|
|
372
|
+
|
|
373
|
+
### 8.3 assistant 等审批 / 等补充信息
|
|
374
|
+
|
|
375
|
+
1. 系统明确告诉用户当前已暂停,等待你操作
|
|
376
|
+
2. 用户直接回复或发审批命令
|
|
377
|
+
3. 输入被正常放行
|
|
378
|
+
4. 当前轮继续
|
|
379
|
+
|
|
380
|
+
用户感受应当是:
|
|
381
|
+
|
|
382
|
+
- 现在轮到我了
|
|
383
|
+
- 这不是“被 busy gate 拦住”的场景
|
|
384
|
+
|
|
385
|
+
### 8.4 assistant 卡住或恢复失败
|
|
386
|
+
|
|
387
|
+
1. 系统明确告诉用户这是异常 / 恢复中的状态
|
|
388
|
+
2. 若恢复失败,系统明确提示用户重发上一条消息
|
|
389
|
+
3. 不再继续发送误导性的“正在思考中”文案
|
|
390
|
+
|
|
391
|
+
用户感受应当是:
|
|
392
|
+
|
|
393
|
+
- 我知道这是系统问题
|
|
394
|
+
- 我知道下一步该怎么做
|
|
395
|
+
|
|
396
|
+
## 9. 与现有专题的关系
|
|
397
|
+
|
|
398
|
+
### 9.1 它不是否定“状态可见性”
|
|
399
|
+
|
|
400
|
+
这条 spec 不是在推翻 `session presence / state visibility`。
|
|
401
|
+
|
|
402
|
+
它是在把那条专题继续产品化:
|
|
403
|
+
|
|
404
|
+
- 可见性要保留
|
|
405
|
+
- 但不能把“可见”误做成“高频冒泡”
|
|
406
|
+
|
|
407
|
+
更准确的判断是:
|
|
408
|
+
|
|
409
|
+
> 状态可见性应从“持续播报工作中”收敛为“只在状态切换真的影响用户时发声”。
|
|
410
|
+
|
|
411
|
+
### 9.2 它和“异常透明化”是互补关系
|
|
412
|
+
|
|
413
|
+
这条 spec 不允许中间层在正常路径里刷存在感。
|
|
414
|
+
|
|
415
|
+
但它同样不允许中间层在异常路径里静默。
|
|
416
|
+
|
|
417
|
+
所以两条专题必须同时成立:
|
|
418
|
+
|
|
419
|
+
- 正常路径降噪
|
|
420
|
+
- 异常路径显式
|
|
421
|
+
|
|
422
|
+
### 9.3 它和“恢复语义”必须对齐
|
|
423
|
+
|
|
424
|
+
当 runtime 断连、recovery 进行中时,产品上仍应把该会话视为 `Busy` 或 `Problem`,而不是 `Idle`。
|
|
425
|
+
|
|
426
|
+
因此:
|
|
427
|
+
|
|
428
|
+
- 这时新的自然语言消息仍不应默认放行
|
|
429
|
+
- 系统应优先给出恢复或重发语义,而不是切回普通对话模式
|
|
430
|
+
|
|
431
|
+
## 10. V1 范围
|
|
432
|
+
|
|
433
|
+
V1 必做:
|
|
434
|
+
|
|
435
|
+
1. 默认抑制常规 `working` / `heartbeat` 类正文提示
|
|
436
|
+
2. 默认不再因为新自然语言消息而自动 interrupt 当前 active turn
|
|
437
|
+
3. assistant `Busy` 时,对新自然语言消息做门控拦截
|
|
438
|
+
4. 拦截文案明确提示“稍后重发”与 `/stop`
|
|
439
|
+
5. `WaitingUser` 状态下继续允许用户回复进入
|
|
440
|
+
6. 异常 / 恢复失败 / 等用户动作等关键状态继续显式可见
|
|
441
|
+
7. 忙碌窗口内的拦截提示要限频,避免二次刷屏
|
|
442
|
+
|
|
443
|
+
V1 不做:
|
|
444
|
+
|
|
445
|
+
- 忙时消息排队
|
|
446
|
+
- 复杂草稿箱或消息暂存
|
|
447
|
+
- 自动合并用户在忙时发来的多条需求
|
|
448
|
+
- 基于消息堆栈的多轮编排
|
|
449
|
+
|
|
450
|
+
## 11. 标准文案方向
|
|
451
|
+
|
|
452
|
+
### 11.1 忙时拦截
|
|
453
|
+
|
|
454
|
+
主文案建议:
|
|
455
|
+
|
|
456
|
+
`我还在处理上一条,请稍后再发一次;如需打断,请发送 /stop。`
|
|
457
|
+
|
|
458
|
+
要求:
|
|
459
|
+
|
|
460
|
+
- 口语化
|
|
461
|
+
- 不带内部术语
|
|
462
|
+
- 不出现 thread / turn / runtime 等实现概念
|
|
463
|
+
|
|
464
|
+
### 11.2 等待用户
|
|
465
|
+
|
|
466
|
+
继续保持类似语义:
|
|
467
|
+
|
|
468
|
+
- `当前已暂停,等待你审批后继续。`
|
|
469
|
+
- `当前已暂停,等待你回复后继续。`
|
|
470
|
+
|
|
471
|
+
### 11.3 异常 / 恢复失败
|
|
472
|
+
|
|
473
|
+
继续保持类似语义:
|
|
474
|
+
|
|
475
|
+
- 系统正在确认当前轮结果
|
|
476
|
+
- 若未能确认,明确要求用户重发
|
|
477
|
+
|
|
478
|
+
## 12. 验收标准
|
|
479
|
+
|
|
480
|
+
### 12.1 对话纯净度
|
|
481
|
+
|
|
482
|
+
在一条正常长耗时 turn 中,用户不再看到连续的:
|
|
483
|
+
|
|
484
|
+
- `正在处理,请稍候。`
|
|
485
|
+
- `正在思考中,请稍候…`
|
|
486
|
+
|
|
487
|
+
除非该轮进入真正需要用户知道的异常或等待状态。
|
|
488
|
+
|
|
489
|
+
### 12.2 默认不再自动抢占
|
|
490
|
+
|
|
491
|
+
当 assistant 正在忙时,用户再发普通自然语言消息:
|
|
492
|
+
|
|
493
|
+
- 当前 turn 不会被默认中断
|
|
494
|
+
- 新消息不会被直接送入 runtime
|
|
495
|
+
- 用户会收到清晰的忙时拦截提示
|
|
496
|
+
|
|
497
|
+
### 12.3 用户控制权保留
|
|
498
|
+
|
|
499
|
+
当 assistant 正在忙时:
|
|
500
|
+
|
|
501
|
+
- `/stop` 仍然可用
|
|
502
|
+
- 用户可以显式终止当前轮
|
|
503
|
+
- 系统不会替用户默认做打断决定
|
|
504
|
+
|
|
505
|
+
### 12.4 `WaitingUser` 路径不受伤
|
|
506
|
+
|
|
507
|
+
当系统处于等待审批或等待补充信息时:
|
|
508
|
+
|
|
509
|
+
- 用户回复仍能继续进入
|
|
510
|
+
- 不会被误拦截为“assistant 还在忙”
|
|
511
|
+
|
|
512
|
+
### 12.5 异常透明化不退化
|
|
513
|
+
|
|
514
|
+
runtime 异常、恢复失败、消息无法稳定处理等问题仍然会对用户可见。
|
|
515
|
+
|
|
516
|
+
也就是说:
|
|
517
|
+
|
|
518
|
+
- 正常路径更安静了
|
|
519
|
+
- 异常路径没有被一起静默掉
|
|
520
|
+
|
|
521
|
+
## 13. 开放问题
|
|
522
|
+
|
|
523
|
+
1. 同一忙碌窗口内,拦截提示的限频粒度具体如何定义最合适
|
|
524
|
+
2. `/new` 在 `Busy` 状态下是否完全阻止,还是给一个“先 `/stop` 再 `/new`”的提示
|
|
525
|
+
3. 降噪后的状态可见性,是否需要更多由桌面控制面或 `/status` 来承接
|
|
526
|
+
4. 某些真实 progress commentary 是否应允许透传,还是也应默认收敛到更安静的合同里
|
|
527
|
+
|
|
528
|
+
## 14. 最终判断
|
|
529
|
+
|
|
530
|
+
这条 feature 的本质不是“文案优化”,而是一次明确的产品取舍:
|
|
531
|
+
|
|
532
|
+
> 我们要把 Feishu 会话从“中间层不断解释自己在干什么”,收回到“只在真的影响用户时才开口”。
|
|
533
|
+
|
|
534
|
+
这会直接改善三件事:
|
|
535
|
+
|
|
536
|
+
1. 对话纯净度
|
|
537
|
+
2. 用户预期稳定性
|
|
538
|
+
3. 中间层作为产品而不是噪音源的可信度
|