feat(i18n): session 中文改称「任务」,并厘清任务/对话/消息的边界 - #1171
Conversation
There was a problem hiding this comment.
Pull request overview
本 PR 将面向用户的中文术语体系做了裁决与落地:把 session 的中文译名从「对话」调整为「任务」,并明确「任务 / 对话 / 消息」三层概念边界,同时同步更新术语表门禁、产品规则文档,以及 Desktop/Mobile 的多语言文案与相关测试断言。
Changes:
- 更新
i18n/glossary.json与生成的i18n/GLOSSARY.md,新增/调整session/chat/task/message/turn/working-directory等条目与豁免/禁用规则。 - 新增权威产品规则文档
docs/product-rules/task-and-conversation-naming.md并在索引与 Agent 入口规则中挂载。 - 批量更新 Desktop/Mobile 的 zh-CN/en 文案与测试断言,匹配新的术语分层与歧义消解口径。
Reviewed changes
Copilot reviewed 26 out of 27 changed files in this pull request and generated 2 comments.
Show a summary per file
| File | Description |
|---|---|
| i18n/GLOSSARY.md | 术语表文档(由 glossary.json 生成)的裁决结果更新,反映新的 session/task/message 等口径与禁用项。 |
| i18n/glossary.json | 术语门禁规则更新:Session→「任务」,补充 alsoAllowed 与新增 task/message/turn/working-directory 条目。 |
| docs/product-rules/task-and-conversation-naming.md | 新增权威产品规则,定义「任务/对话/消息」分层与判定规则,并记录落地方法与边界案例。 |
| docs/product-rules/README.md | 产品规则索引新增 task/conversation 命名规则入口。 |
| apps/mobile/src/i18n/locales/zh-CN/settings.json | Mobile 设置页相关文案将「对话」调整为「任务」语义。 |
| apps/mobile/src/i18n/locales/zh-CN/session.json | Mobile 会话流程、菜单、错误提示等大范围从「对话」迁移到「任务」,并将 message 相关表述改为「消息」。 |
| apps/mobile/src/i18n/locales/zh-CN/models.json | Mobile 模型切换确认文案按「任务」口径更新。 |
| apps/mobile/src/i18n/locales/zh-CN/message.json | Mobile 消息级 UI 文案中 automation/会话 chip/fork 等用词更新为「任务/自动化」。 |
| apps/mobile/src/i18n/locales/zh-CN/interaction.json | Mobile 权限确认与交互错误文案按「任务」口径更新。 |
| apps/mobile/src/i18n/locales/zh-CN/files.json | Mobile 文件浏览空态等从「对话」改为「任务」。 |
| apps/mobile/src/i18n/locales/zh-CN/devices.json | Mobile 设备与远程会话列表文案从 conversation 改为 session,对应中文从「对话」改为「任务」。 |
| apps/mobile/src/i18n/locales/en/session.json | Mobile 英文文案收敛:将 conversation 表述改为 session。 |
| apps/mobile/src/i18n/locales/en/message.json | Mobile 英文消息菜单从 “Fork conversation” 收敛为 “Fork session”。 |
| apps/mobile/src/i18n/locales/en/interaction.json | Mobile 英文 rewind/截断相关文案将 conversation 更精确区分为 chat。 |
| apps/mobile/src/i18n/locales/en/devices.json | Mobile 英文设备页从 conversation 收敛为 session。 |
| apps/mobile/src/tests/sessionTailBannerModel.test.ts | 更新断言以匹配「新建任务」等新文案。 |
| apps/mobile/src/tests/sessionSwipe.test.ts | 更新 action menu 的中文 label 断言(删除对话→删除任务)。 |
| apps/mobile/src/tests/sessionMenu.test.ts | 更新菜单 header 与 copy link label 的中文断言(远程对话→远程任务等)。 |
| apps/mobile/src/tests/newSession.test.ts | 更新源码锚点注释与新建确认文案断言以匹配「任务」口径。 |
| apps/mobile/app/sessions/new.tsx | 更新用于测试锚点的中文注释(新建对话→新建任务)。 |
| apps/desktop/src/renderer/i18n/locales/zh-CN/common.json | Desktop zh-CN 大范围术语落地:session→任务、task 歧义消解、automation 去“任务”等。 |
| apps/desktop/src/renderer/i18n/locales/en/common.json | Desktop en 大范围收敛:conversation→session;并在部分语境中使用 chat 表示交流内容。 |
| apps/desktop/src/renderer/tests/PermissionPrompt.i18n.test.tsx | 更新权限提示的 zh-CN 断言(本对话总是允许→本任务总是允许)。 |
| apps/desktop/src/renderer/tests/builtinToolsCollabDescriptionI18n.test.ts | 更新协同模式描述的 zh-CN 断言(新建对话→新建任务)。 |
| apps/desktop/src/renderer/tests/automationGeneratedSessions.test.ts | 更新自动化运行历史相关的 zh-CN 断言(对话开销/价值→任务开销/价值;持续对话→持续任务)。 |
| apps/desktop/src/main/agent-island/tests/service.test.ts | 更新 Agent Island 发布数据的 zh-CN 标题断言(未命名对话→未命名任务)。 |
| AGENTS.md | Agent 工作入口规则索引补充:遇到「任务/对话/消息」文案变更需先读对应产品规则。 |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 0f30fd9e0f
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
| Filename | Overview |
|---|---|
| docs/product-rules/task-and-conversation-naming.md | 新增任务、对话和消息的分层定义、跨语言裁决及迁移方法。 |
| i18n/glossary.json | 更新 session、chat、thread 的裁决,并新增 task、message、turn 与 working-directory 条目。 |
| apps/desktop/src/renderer/i18n/locales/zh-CN/common.json | 按新术语边界更新桌面端中文界面文案。 |
| apps/mobile/src/i18n/locales/zh-CN/session.json | 按新术语边界更新移动端任务相关中文文案。 |
Reviews (33): Last reviewed commit: "docs: 修正 Orca 协作任务命名指引" | Re-trigger Greptile
|
@dashhuang 👋 这个 PR 还有 7 条 review conversation 没 resolve(docs/product-rules/task-and-conversation-naming.md / i18n/glossary.json / apps/desktop/src/renderer/i18n/locales/en/common.json / apps/desktop/src/renderer/i18n/locales/zh-CN/common.json),auto-review 因此暂时跳过、没法继续审查 / 合并。 如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。 |
|
@dashhuang 👋 这个 PR 目前与 请在本地 merge 最新的 |
|
💡 本 PR 改动涉及 UI 代码路径,但 description 未附界面效果证据(截图/录屏/HTML 预览)。建议补充改动后效果,便于确认界面符合 DESIGN.md 设计规范。 这不是阻断性问题,审查会正常进行。 |
0f30fd9 to
b04d001
Compare
|
本轮反馈已全部处理,6 条 review thread 均已回复并 resolve,push 到 逐条按底层不变量归了 3 族,一族一并修,避免逐条打补丁: 族 A — 英文侧把「指内容的词」改成了「指条目的词」(@chatgpt-codex-connector ×2)
顺这条不变量扫全仓,又查出一处同类残留一并修: 族 B — 中文侧同句歧义没消解干净(@chatgpt-codex-connector ×2)
族 C — 文档自身准确性(@copilot-pull-request-reviewer ×2、@greptile-apps ×1)
统计数字更正说明@greptile-apps 指出的数字问题里有一层它没看到的原因:这个 PR 期间
本轮 rebase 也按同一套规则处理了新进来的 2 条文案: 验证首轮门禁有 2 个失败,都已定位并修掉:mobile 关于 UI 证据改动是纯文案(无布局/颜色/组件/动效),已在 macOS 沙箱实例( |
|
To use Codex here, create an environment for this repo. |
|
整理得很清晰,三族归并处理是正确的思路,避免了逐条打补丁导致的规则漂移。 几个具体确认: 族 A — 族 B — 族 C — 门禁说明改成「子串匹配,前缀变体一条拦下」比列冗余条目更干净,后来者能直接理解而不是靠猜。 统计数字随 rebase 基数变动是正常现象,重跑脚本按当前 HEAD 实测更新是正确的,不应该去对齐一个历史快照。 所有 gate 通过,逻辑自洽,文档与实现对齐。这个 PR 可以合。 |
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 27 out of 28 changed files in this pull request and generated no new comments.
Suppressed comments (1)
apps/mobile/src/i18n/locales/zh-CN/devices.json:152
- 这里的文案位于 automationScope(上方 eyebrow/title 都是「自动化」),但 emptyTitle 仍写「这个任务」,在本 PR 将 session 译为「任务」后会产生歧义(读起来像在说某条会话)。建议改为指代自动化本身。
"emptyTitle": "这个任务还没有运行记录"
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b04d00195c
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
b04d001 to
6698c0b
Compare
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 6698c0b2a2
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 27 out of 28 changed files in this pull request and generated no new comments.
Suppressed comments (1)
apps/mobile/src/i18n/locales/zh-CN/devices.json:103
- 这里的无障碍提示文案仍使用“自动化任务”,与本文件其它位置已将可见标签统一为“自动化”且刻意移除“自动化任务”用词的方向不一致;对读屏用户也更容易把它误解为“自动化实体”而不是“自动化生成的条目”。建议改为“筛选自动化生成的任务”以保持一致。
"automationA11y": "筛选自动化任务"
|
@dashhuang 👋 这个 PR 还有 4 条 review conversation 没 resolve(apps/desktop/src/renderer/i18n/locales/en/common.json / apps/desktop/src/renderer/i18n/locales/zh-CN/common.json / apps/mobile/src/i18n/locales/zh-CN/devices.json),auto-review 因此暂时跳过、没法继续审查 / 合并。 如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。 |
6698c0b to
272634f
Compare
There was a problem hiding this comment.
Pull request overview
Copilot reviewed 27 out of 28 changed files in this pull request and generated no new comments.
Suppressed comments (2)
apps/mobile/src/i18n/locales/zh-CN/devices.json:103
- 这里的无障碍文案仍使用「自动化任务」,但本 PR 的命名规则里已明确
automation中文统一为「自动化」(避免与 Session=「任务」同句撞词)。建议改成不含「自动化任务」这一说法,避免与新规则冲突。
"waiting": "待处理",
"automation": "自动化",
"activeA11y": "筛选活跃任务",
"waitingA11y": "筛选待处理任务",
"automationA11y": "筛选自动化任务"
apps/mobile/src/i18n/locales/zh-CN/files.json:11
sendToSession仍是「发送到对话」,但其它语言为 “Send to Session”,且本 PR 已将 Session 的中文统一为「任务」。这里会导致同一概念在移动端出现「任务/对话」混用;另外preview.sendToSession也建议同步改为「发送到任务」。
"noWorkdir": "该任务没有工作目录,无法浏览文件。",
"rootDir": "(根目录)",
"copyPath": "复制路径",
"sendToSession": "发送到对话",
`session` 原先中文译作「对话」,这个词表达不出 Cindy 最重要的能力——同时跑
多个互不干扰的工作。用户看不出左侧列表里的每一条其实是一个有自己空间、可以
并行推进的独立工作。
但这不是全局替换。概念分三层,各有明确所指:
任务 (Session) —— 左侧列表里可打开 / 删除 / 分享的条目
对话 (Chat) —— 任务内人与 AI 交流的过程与内容
消息 (Message) —— 对话里的一条往来
「轮次」刻意不作为界面术语:AI 在一轮里的思考与工具调用最终折叠成一条消息,
所以消息与轮次是同粒度的两种切法、不是包含关系——现有删除行为就是这个口径
(「AI 消息会删除上一次用户输入之后产生的整轮输出」)。弹窗 (Dialog) 与本次
改名无关,未动。
英文侧一并收敛。改名前同一个东西有五种写法,只改中文治不了根——写文案的人看到
`Dialogue` 仍会译成「对话」:`conversation`(124) 与 `dialogue`(16) 全部改为
`session`,指容器的 `chat`(53) 同样改为 `session`,`chat` 仅保留 12 处指交流
过程与内容(chat history / chat panel / chat text)。
「任务」与 `task` 的歧义是落地最大的坑:"This session is currently running a
task" 直译会变成「当前任务正在执行任务」。原则是**同句出现时 task 一侧必须
改写**(优先动词化,确需名词用「执行」/「作业」),不同句且语境清晰时沿用
「任务」(104 处未动,「后台任务」「定时任务」本身不歧义)。`automation` 原先
叫「自动化任务」,与 session 同句会出现「删除任务和任务」这种读不通的文案,
中文统一为「自动化」——英文侧本来就以 `automation`(38) 为主、只有 4 处叫
`automation task`。
顺带修掉两批既有译名错误(与改名无关,本来就该修):42 处英文是 `message` 却
译成「对话」("Delete this message" → 「删除本条对话」)、7 处英文是 `turn`
同样译成「对话」。
未改:代码标识符与内部字段;ja / ko 文案(セッション / 세션 是音译,不存在中文
这种一词多义);SSH 远程会话 / Agent 进程会话 / 登录绑定会话 / 操作系统桌面
会话(那是另一类 session,与产品概念无关)。
门禁不能笼统禁「对话」——那会把「对话区」「对话正文」这些合法用法一并拦下。
`session` 用 alsoAllowed + when 按语境豁免;`message` 的 forbidden 收窄到精确
的错译形式「条对话」,因为一句话里可能既有 message 又有合法的「对话X」,机器
分不清对应关系。
验证:pnpm test:unit 全绿(desktop 16537 / mobile 2660 / 根 316,零失败);
desktop 与 mobile typecheck 通过;pnpm check:i18n-glossary 通过。
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Signed-off-by: Dash <dashhuang@gmail.com>
review 第 8 轮。两条反馈同一不变量: IM 的 `/new` 走 resetSessionToDefaults, 只 UPDATE 原 session 行、不产生可单独打开的条目,所以描述这条路径的文案不能 说「新任务」。按落库行为(INSERT / UPDATE)重新判定了整族触点: - settings.wechatBot.workingDir.* 与 toasts.workingDir*: 四语回 origin/main 的 conversation 口径(该设置同时管首次私聊与 /new,只有「新对话」两边都成立) - settings.telegramBot.commandMenu.new: zh 回「开启新对话」;en/ja/ko 一并按 §4.2 成对改成 chat / 会話 / 대화(原文 session 同样不准确) - settings.telegramBot.commandMenu.stop: 「停止当前任务」→「中止当前执行」。 /stop 只中止执行、条目保留,而本 PR 让「任务」专指条目;en/ja/ko 的 task/タスク/작업 不与 session 撞车,保持不动 同时做收敛检查点(同族第 3 轮返工): 上轮只改了 telegram/uiText.ts,而 discord / feishu / wechat 是同形近亲文案包。本轮四个包一起过完,「会话」在这四个文件清零 ——接管流程指桌面条目的改「任务」,同句含 task 的按 §3.1 消歧,引用设置项名字的 改成「新对话配置」,🤖 自动任务 → 🤖 自动化。刻意保留三个渠道的「存档 / 上号」 (feishu/uiText.ts 文件头写明的渠道语气,非错译)。 另修 copilot 指出的两处: - sessionActionStrip 的 filesDisabledReason 判据只是 !!workingDir,不能断言 「因为不绑项目」(同文件测试 fixture 恰好是有 worktreePath 的 Orca Worker), 改成只陈述状态;测试断言同步 - codex agent 的 memory description: 「从聊天中」→「从对话中」(聊天是 chat 条目的 forbidden 译法) 规则落进 task-and-conversation-naming.md §6.0.3 / §6.0.4,并按读者把全仓 102 处 硬编码「会话」分了改与不改。 Signed-off-by: Dash <dashhuang@gmail.com>
review 第 9 轮。copilot 连两轮列出不同实例,做检查点后归成一族: 注释或测试常量 里**断言「用户看到的是 X」**的地方,X 已被本 PR 改掉,注释就变成了错的 —— 比不改 更坏,后来人会照注释把代码往反方向"修正"。 - 「未命名对话」→「未命名任务」41 处 / 20 个文件: 兜底文案实际值已是「未命名任务」 (ccAgent.common.unnamedSession / sessionHeader.untitled / mobile devices.list.untitled 实测)。含 test 里 `const UNNAMED = '未命名对话'` 这类替身 常量 —— 值是注入的、不影响行为,但留着会变成下一个人改代码的依据 - hook-control/__tests__/interactions.test.ts: 「注:按钮文案用「对话」」而按钮已是 「本任务总是允许」 - sessionList.ts / sessionTitleProjection.test.ts: 同段注释里「会话」与「任务」混用 泛指 session 的普通注释仍按 §8 不动(「idle 会话直接显示」这类)。 另把 im/shared/__tests__/threadUiFixture.ts 整体回退到 origin/main: 它保存的是 2026-07-17 退役的 SlackIM 文案包原件(文件头写明不进产品包),价值就是忠实副本; 上轮误改 4 句,反而让「开一个新会话」与「同一个任务」并列进同一句。三个引用它的 测试只按结构使用,不断言这些字面量。 copilot 另提的 shared 层硬编码中文(remoteSessionListTitle / deviceSessionEmptyState / mobile messageActionMenu)是 origin/main 既有状态, 下沉到 i18n 属独立重构,已记进 §8 遗留。规则落进 §6.0.5。 Signed-off-by: Dash <dashhuang@gmail.com>
review 第 10 轮。三条反馈都指向同一件事: 判据不能按文件目录归类,只能按
**这句话会不会原样出现在用户眼前**。
- maker-ipc/sessionReferenceResolver.ts(14 处): SessionReferenceError 经
agent-input-coordinator::resolveReferenceContexts 落进 projection.error,
CCAgentSessionView 的 ErrorBanner **原样展示**(同文件测试
`error).toContain('snapshot is missing')` 钉着这条链)。所以粘贴「任务链接」
失败时用户看到的是「找不到本机会话」「最多引用 N 个会话」。全部改「任务」;
「无效的会话历史」按 §2 改「无效的对话记录」
- maker-ipc/register.ts: renameSessionsConfirmBridge 把「批量重命名会话」的确认卡
交给 desktopConfirmImNotifier,飞书通知原文即此串,而桌面卡片已是「确认批量
重命名任务」—— 同一次确认两套术语
- commands/builtins.ts: /clear 描述引用了侧栏「New Chat」按钮,该标签已不存在
(现为 New / 新建)。改成不引用标签的说法;顺带 /jump-session 的「跳转到该会话」
- help-knowledge/collaboration.md 同样引用 "New Chat",改后跑 pnpm gen:help-kb
重新生成 helpKnowledge.generated.ts(help-kb-guard PASS)
顺带修掉一处 origin/main 既有乱码: sessionReferenceResolver.ts 有两句
`来源设备返回了无效的会话历史` 存成了 UTF-8 字节按 GBK 解过一遍的形态
(鏉ユ簮璁惧杩斿洖浜嗘棤鏁堢殑浼氳瘇鍘嗗彶),真触发时用户看到乱码。
文档侧把 §6.0.4 那条过宽的规则改掉(原文把「main 抛给 renderer 的 Error」整类判成
不改,只对 fork / rewind 那种按 code 映射 i18n 的成立),并补上连续四轮返工的路径
清单 —— 每轮漏的都是一条**展示路径**,不是一个目录。
Signed-off-by: Dash <dashhuang@gmail.com>
review 第 11 轮,同族第 5 次返工 —— 触发收敛检查点,这轮不再逐条等 reviewer 点,
把 main 侧的出口(sink)一次枚举干净。判据不是文件在哪个目录,而是这个函数把
字符串送去了哪里。
codex 点到的:
- notificationService.buildFeishuText(): 飞书完成/失败/需回复通知实际发的是
`Cindy · 会话「X」…`,而设置页已是「任务完成或需要回复时发送飞书消息」——
同一条通知两套术语。改「任务「X」」,3 条测试断言同步
- 同文件 showDesktopSessionEvent 的 safeTitle 兜底 '会话' → '任务'(标题为空时
直接显示在系统 toast 上),两条描述 toast 内容的 jsdoc 一并跟改(§6.0.5)
检查点顺带查出的同族两处(reviewer 未点):
- device-link/ipc.ts ×3: throwIpcError('SESSION_REFERENCE_UNSUPPORTED' /
'..._UNAVAILABLE', '…会话引用…')。确认 ipcError.* 里没有这两个 code 的 i18n
条目,所以 message 原样展示 —— 与上一轮改的 sessionReferenceResolver 同一功能、
同一展示路径
- ORCA_WORKER_READY_MESSAGE: 注入 worker 对话流的系统消息,「Orca Worker 会话已
就绪」→「Orca Worker 已就绪」(去掉冗余名词,不动 Orca 自己的 Worker/Lead 术语);
测试断言同步
文档新增「main 侧直接送到用户眼前的出口清单」(12 行表 + 两条可复现的 grep),
连续五轮的返工路径表补上第 5 行。
门禁:GATE_EXIT=1,唯一失败是 voice-input/ElevenLabsScribeProvider 的 WS 握手撞
HTTP 403(单文件复跑 7/7 通过,与本轮 diff 无代码路径交集),其余 17137 passed。
Signed-off-by: Dash <dashhuang@gmail.com>
codex 指出 §4 那张表自相矛盾: 表里写「Conversation 已全部改为 Session、英文侧不再 使用」,而同文档 §4.1 明确要求保留 IM 平台 / conversation lane / 隐私文案三类,en catalog 里也确实还有 New Feishu conversations 这类合法实例;`Chat` 的「改了 12 处」 又和 §6 的 11 处冲突。这份文档是后续改术语的权威入口,这种表会让维护者去删掉刻意 保留的表达 —— 属实。 三张表全部按当前 HEAD 重新实测,并写清口径: - §4 英文侧: Session 365→476 / Conversation 136→**19** / Dialogue 16→**0** / Chat 131→144 / Thread 11→11。去向拆开写(conversation: 101→Session、12→Chat、 4 改写、19 保留),并加了一条醒目提示「不要读成 Conversation 已清零」 - §5.1 ja/ko: 原表的 271/16、277/11 用当前口径复现不出来(它们来自会话早期一次 针对旧 origin/main 的测量)。换成「key 名含 session 的条目」这个可复现口径: ja セッション 124→143 / 会話 23→4;ko 세션 127→143 / 대화 25→8 - §6 落地记录: chat→Session 11→14;新增「conversation 改写成别的说法 4」一行; conversation 保留 16→19;ja/ko 收敛数改成实测并注明两种口径的差别 (全部 key 残留 60/96 里多数与 session 无关,如 会話コンテキスト) - zh 侧 478/87 → 466/99: review 期间的多次回退(imBot.defaults、wechatBot .workingDir、commandMenu.new 等)把条目从「改动」挪回了「原样保留」 §4 末尾附了可复现的统计脚本(口径 = 值里含该词的 key 数,不看 key 名、不数出现 次数),并在 §6 开头写明数字会随 rebase 漂移、重跑脚本而不是拿旧数字对账。 上一轮报告的 ElevenLabs WS 握手失败本轮未复现,GATE_EXIT=0。 Signed-off-by: Dash <dashhuang@gmail.com>
copilot 第 4 次提 messageActionMenu.ts 硬编码中文,这次给了个之前被我忽略的证据:
同目录 sessionMenu.ts 的注释明写「文案走 i18n:本模块四语言都在用 i18n.t,不能塞
硬编码中文(mobile 支持 en / ja / ko)」——也就是说这个目录本来就有规则,
messageActionMenu.ts 是唯一的例外。原判「pre-existing、属独立重构」不成立:改法
就是照抄隔壁,5 个 label 而已。
- apps/mobile/src/i18n/locales/{zh-CN,en,ja,ko}/session.json 新增 messageMenu 段
(fork / addToChat / copyLink / rewind / deleteOne),措辞与 desktop 的
chat.messageActionBar.* 对齐;四语各 235 key,手工核对一致
- messageActionMenu.ts 改为 i18n.t('session.messageMenu.*'),并把「为什么必须走
i18n」写进文件头注释
- 测试按 sessionMenu.test.ts 的先例加 beforeAll(changeLanguage('zh-CN')),让字面量
断言与语言环境解耦
顺手修一处同源漏改:desktop 的 chat.messageActionBar.copyLink 在 ja/ko 仍是
「現在の会話リンクをコピー」/「현재 대화 링크 복사」,而该操作复制的是带
messageClientId 的**消息**深链 —— zh/en 早先已按此改过,ja/ko 漏了。
文档 §8 两条遗留更新:messageActionMenu 移出「仍硬编码」清单;新增一条记录
pnpm check:i18n 只覆盖 desktop common.json、mobile 的 15 个 locale json 没有 key
对齐门禁(本次靠手工核对),扩门禁属独立改动。
Signed-off-by: Dash <dashhuang@gmail.com>
## 上一轮我自己引入的回归(codex 指出) messageActionMenu 改走 i18n.t 之后,MessageRenderer.tsx:1648 那个 useMemo 只依赖 5 个 capability,于是 label 只在首次计算时取值 —— 用户在任务页挂载期间切显示语言, 菜单会一直停在切换前的语言。把 i18nInstance.language 加进依赖(同目录 SessionMenuSheet 的做法是不 memo,这里是热路径、保留 memo 更合适)。 ## 映射竞态守卫(codex 指出) - hook-control/dispatcher.ts:1142:「这个对话所在的目录已不在工作目录映射里…」经 outcome.errorMessage → turn.end.errorMessage 原样发给渠道用户 - hook-control/session-runner.ts:520:复用运行中实例的守卫,「这个对话正在一个…」 且让用户「关掉这个对话」 两处都指条目,改「任务」。同目录另两条 IM 通知上轮已改,这两条是同一流程的守卫分支。 ## 补扫「对话」查出的两处同源漏改 上一轮枚举 main 侧出口时只反向扫了「会话」,没扫「对话」—— 补扫 35 处后逐条判过: - im/wechat/WechatIM.ts:1210 的 /help:「/stop 停止当前任务;/stop all 停止全部任务」 → 「中止当前执行 / 中止全部执行」。核过实现:/stop 走 stopActiveTurn,/stop all 走 disposeAllSessions + stopActiveTurn,都不删任务条目;原文会让人以为任务被停掉 - maker-core codex 的 memory description:「在新任务中召回」→「在新会话中召回」。 按 §6.0.2 判据(会不会让用户做多余动作)——说「新任务」会让人以为必须新建任务才能 用上记忆;同款的 claude-code/index.ts:563 本来就写「新会话」,两条现已一致 其余 33 处判为正确保留(IM 的 /new 语义、§2.3 归属分类、对话记录/对话压缩等)。 ## 文档 §6.0.4 出口清单补两条方法论:①「按出口函数名 grep」看不见文案当返回值逐层传出的 情形(dispatcher/session-runner 就是),必须配反向扫描;②反向扫描要同时搜「会话」 和「对话」。返工路径表补第 6 行。 Signed-off-by: Dash <dashhuang@gmail.com>
rebase 到最新 origin/main(带进 Lark 接入 #1133、钉钉连接器一整串、侧栏 mod+1..9 快速切换 #1184 等 20+ 提交),按 task-and-conversation-naming.md 逐条过了新增文案。 冲突 1 处(zh-CN/common.json 的 settings.notifications):main 把飞书改成 「飞书 / Lark」,本 PR 把「对话」改成「任务」—— 取两者合并。 新带进的 21 条含术语词文案,逐条判断后改 19 条: - settings.shortcuts.items.switch-session-1..9 的 label + description(18 条): zh 写「切换到第 N 个对话」「跳转到侧边栏第 N 个可见对话」,而 en 是 `Go to session N` / `…visible session in the sidebar`,ja/ko 也已是 セッション / 세션 —— 典型的中英不成对(§4.2),且指的就是侧栏条目(§2.2)。 只改 zh,其余三语本就正确 - im/dingtalk/uiText.ts 的 `/stop 停止当前任务,并撤掉排队消息` →「中止当前执行」。 新渠道的文案包重复了同一个坑:/stop 只中止执行、任务条目保留(§3.1、与 telegram / wechat 已改的同款) 判为正确保留的: - channelDescriptions.dingtalk「钉钉新对话会使用…已有对话发送 /new 后应用」—— 与其它渠道同款,且 /new 不产生新任务(§6.0.3) - dingtalk 的 `/new 开个新对话(清掉当前上下文)`——同上 - imBot.tips.personalFeishuOnly 里的「新对话配置」——设置项真名 - 新增的 hook-control LLM 指令串(「当前是 Slack 会话」「飞书 / Lark session」等) ——给模型读的,不是 UI 文案(§6.0.4) 门禁:GATE_EXIT=0;desktop / mobile / maker-shared / maker-core typecheck 全 0; check:i18n ✅ 6168 key 四语一致;check:i18n-glossary ✅。 Signed-off-by: Dash <dashhuang@gmail.com>
本轮两位 reviewer 给了**相反**的建议,核过之后各取其正确的一半。 ## codex:computerUse 三处 toggleHint 句中换了概念(对) 「这个开关只对之后新建的 **Agent 会话**生效;已在运行的**任务**不受影响。」——前半句 说运行时、后半句跳到产品条目,用户读完不知道该重启当前任务还是新建一个。对照三语: en `does not affect a session that is already running`、ja「実行中のセッション」、 ko「진행 중인 세션」,两个半句都用同一个 session,只有 zh 在句中换了概念。而且这三个 key 本来就登记在 glossary 的 session.exempt 里,改一半更不自洽。改回「已在运行的 Agent 会话不受影响」,en/ja/ko 本就正确、不动。 顺手把 exempt 列表里 desktop: 前缀的条目全打出来自查了一遍同句混用:另外 5 处 (stopBashTitle、forkErrors.unsupportedHistory、collaboration 两条、subagentModels.hint) 都是两个词各指其物、句意清晰,刻意保留 —— 要看的是「同一个所指被换了两种叫法」。 ## copilot:maker-core 的 memory description 该用「新任务」(与 codex 口径冲突) copilot 说「新会话」是禁用译法、应写「新任务」;而按 §6.0.2,写「新任务」会让用户以为 必须新建任务才能用上记忆(rewind / 重启同一任务也生效)。两边都对,说明是**这个名词本身 选错了**:该 capability 描述的是「记忆之后会被自动召回」,且它落在 maker-core、不是 locale 文件、没法登记 exempt。所以两个 agent 的描述统一改成「从对话中生成新记忆并在 **后续对话**中召回」——用户视角真实、不含禁用词、也不暗示任何多余动作。 ## 文档 §6.0.2 从一条判据扩成三条:①会不会让用户做多余动作;②同句前后两半必须在同一个概念上 (附 exempt 自查办法,并说明同句混用不等于错);③两个词都不合适时把名词绕开——遇到 reviewer 意见相反,先怀疑名词选错了。 Signed-off-by: Dash <dashhuang@gmail.com>
## MCP 生效范围(codex,对) 「保存后新建的**任务**即可调用,已在进行中的任务不受影响」会让用户为用上 MCP 白开一条 新任务。核过代码:claude-code/index.ts:1935 的 buildMcpServers() 在 buildQuery 里求值, 而同文件 :982 注释写明「一次性 buildQuery + buildMcpServers」——/clear、rewind 等重启 同一任务的 Agent runtime 时会重新执行,所以同一任务的下一个 Agent 会话就生效。 zh 两条改成与兄弟文案 settings.builtinTools.toggleHint 同款措辞: 「新建或重启的 Agent 会话即可调用,正在运行的 Agent 会话不受影响」;deleteConfirm .message 同步。en/ja/ko 与 origin 一致、本就用 session/セッション/세션,不动。 两个 key 现在含「会话」,已登记进 glossary session.exempt(共 37 条),并重跑 pnpm i18n:glossary-doc 同步 GLOSSARY.md(门禁的「文档过期」分支会拦)。 ## 帮助文档(codex,对)—— 这次扫全 24 篇 sidebar.md 的任务菜单说明仍写 **Copy conversation link**,而界面已是 `Copy session link`,帮助把用户指向一个不存在的菜单项。这是同一目录第 3 次被点 (前两次是 collaboration.md 的 "New Chat"),所以这轮不再只改被点的行,把 24 篇扫完: - sidebar.md ×2:Copy conversation link → Copy session link - import-sessions.md:「by dialogue」→「by chat」(位置筛选的真实标签是 `Chat`, 见 settings.sessionImport.filters.dialogue) - sessions-and-chat.md:小标题 **Conversation controls:** → **Chat controls:** 判为内容义、保持不动的 9 处:conversation history / Memory across conversations / rewinds the conversation / Codex and Claude conversations(CLI 磁盘上的)等。 改完跑 gen:help-kb 重新生成 helpKnowledge.generated.ts,gen:help-kb:check PASS。 ## 文档 §6.0.4 返工路径表补第 7 行,并新增一节:帮助内容要单独扫,判据是「引用的是界面标签 还是交流内容」,附 grep 与「改完必须 gen:help-kb + gen:help-kb:check」。 Signed-off-by: Dash <dashhuang@gmail.com>
## /clear 的描述与实现不符(copilot,对)
上一轮我为了去掉过时的「New Chat」标签引用重写了这条描述,但**沿用了 origin 里本来
就错的行为声明**。核过实现:renderer 收到 DESKTOP_COMMAND_TRIGGERED 后调
clearSession() → clearSessionAfterGuard,注释写明「把窗口清空、从最新重新拉起」,
是**原地**清空当前任务的对话上下文,不新建草稿、也不切走。
而 help-knowledge/{commands,sessions-and-chat}.md 写的才是对的(「resets the
conversation in place without creating a new session」),两边一直互相矛盾。改成与
实现和帮助一致的说法,并把判据写进代码注释。
## mobile fork 确认弹窗硬编码中文(copilot,对)
同页其它 Alert 已走 t('session.screen.*'),这个弹窗是唯一例外 —— 与上一轮
messageActionMenu 同一类缺陷、同一个论据(en/ja/ko 环境下显示中文)。
- 四语 session.json 的 screen 段新增 forkConfirmTitle / forkConfirmDescription /
forkConfirm / forkCancel,措辞与 desktop 的 chat.messageActionBar.fork* 逐条对齐
- [sessionId].tsx 改为 t(...),并把「为什么必须走 i18n」写进注释
## rebase 到最新 origin/main(X hook / device-link 协同入口 / scheduler 阶段机等 6 提交)
冲突 1 处(settings.tina.chat.description):main 把平台清单加了 X,本 PR 把
「独立复用 session」改成「独立对应一个任务」—— 取两者合并。
新带进 2 条含术语词文案,处理 1 条:
- newChat.collaboration.remoteContinueNotice(新):四语都与**同流程的兄弟 key**
startFailedContinue 不一致 —— 后者已是「单任务 / a single session / 単一セッション /
단일 세션」,前者却写「单对话 / a single conversation / 単一の対話 / 단일 대화」。
同一功能两种叫法,四语一并对齐
- 硬编码新增的「当前是 X (Twitter) 会话」是给模型读的指令串,不改(§6.0.4)
门禁:GATE_EXIT=0;mobile / desktop typecheck 双 0;check:i18n ✅ 6195 key;
check:i18n-glossary ✅。
Signed-off-by: Dash <dashhuang@gmail.com>
codex 指出:agentIsland.native.newConversationTitle 改成 New Session 后,Agent Island 的**冷启动 / 回退态**仍会露出旧名 —— 该 helper 是独立进程,拿到 main 的本地化状态之前 用自带默认值。核实并改了两处: - apps/desktop/src/shared/agentIsland.ts 的 DEFAULT_AGENT_ISLAND_STRINGS: 'New Chat' / 'Start a new conversation' → 'New Session' / 'Start a new session' - native/agent-island/macos-agent-island-helper.swift 的 AgentIslandStrings.fallback: "New Maker" / "Start a new conversation" → "New Session" / "Start a new session" (前者是更早的品牌名,比 locale 落后两代) 两处都与 en locale 逐字对齐。该目录只有 .swift 源、无签入产物,改源即生效。 ## 顺手穷尽了「影子 catalog」这一类 §6.0.1 早把影子 catalog 列为一类,但我只找过 applicationMenuLabels.ts。这次换成 **在 locale 之外搜英文旧标签**(而不是搜代码里的中文),确认本仓只有这两处;命中的其余 结果全是数据库默认标题哨兵 'New Maker'(deviceLinkCreateArgs 写入、 isDefaultDraftSessionTitle 判定、swift 侧 normalized != "new maker"),**绝对不能改** ——projectDraftSessionTitle 那套机制存在的意义就是把哨兵挡在用户视线外。 文档把这两处 + 搜法 + 哨兵红线写成了表。 ## copilot:glossary note 里的韩文错字 session 条目 note 里同一句写了「대話」(末字误用汉字)又写了正确的「대화」,已统一; 重跑 pnpm i18n:glossary-doc 同步 GLOSSARY.md。 门禁:GATE_EXIT=0(首轮 SIGSEGV,是与另一 worktree 门禁并发跑时崩的,非断言失败; 另一门禁结束后重跑通过);desktop typecheck 0;check:i18n ✅ 6195 key; check:i18n-glossary ✅;定向跑 agent-island 6 文件 243 tests 全过。 Signed-off-by: Dash <dashhuang@gmail.com>
codex:这两条报的都是「Codex 运行时状态 / live Query 不可用」,产品任务本身没坏, 说「任务」会让用户以为任务损坏。对照 en/ja/ko —— 三语说的都是 runtime (`The Codex session state` / `Codex セッションの状態` / `Codex 세션 상태`; `Session is inactive` / `セッションが非アクティブ` / `세션이 비활성 상태`),又是只有 zh 被我改坏。 - chat.userMessage.forkErrors.codexStateUnavailable:「Codex 任务状态不可用,无法开启 新任务」→「Codex **Agent 会话**状态不可用,无法开启新任务」。前半句指 runtime、 后半句指 fork 真的产出一条新任务,两半各指其物(§6.0.2 第二条允许的那种混用) - chat.rewind.errors.noLiveQuery:「任务未激活」→「Agent 会话未激活」。抛错条件就是 SDK live Query 没起来,提示也正是「先发一条消息把 SDK 唤起来」 两个 key 登记进 glossary session.exempt(共 39 条),重跑 i18n:glossary-doc 同步 GLOSSARY.md。en/ja/ko 与 origin 一致,不动。 ## 文档:把共享层 i18n 缺口的清单记全 copilot 已就这一类点了 4 轮,每轮多报一个函数。§8 那条从「两个函数」扩成完整表: sessionList 的 remoteSessionListTitle / deviceSessionEmptyState、sessionSelection 的 summarizeMobileSessionBulkAction、scheduleModel 的 summarizeRun,并写明各自被哪个 mobile 页面直接渲染。 同时点明**修法不是改用词、而是让共享层不产出文案**(调用方传 t/strings,或只返回结构化 数据),要动 3 个模块 + 调用点 + 测试,属独立重构;并区分它与本 PR 内已迁 i18n 的 messageActionMenu / fork 弹窗——后者是页面自己的文案,改法就是照抄同目录既有写法。 门禁:GATE_EXIT=0;desktop typecheck 0;check:i18n ✅ 6195 key;check:i18n-glossary ✅。 Signed-off-by: Dash <dashhuang@gmail.com>
这条不是 reviewer 提的,是我复盘 20+ 轮反馈后认定的**根因修复**。 ## 问题 本 PR 的反馈里有 4 轮是同一类错误:把 Agent 运行时会话译成了「任务」 (memory toast / computerUse toggleHint / MCP 生效范围 / forkErrors 与 rewind)。 每一次 en/ja/ko 都是对的 —— 因为它们一词通用、没有可错的空间;**只有中文被迫二分**。 而术语表把这件事表达成了「一个 session 条目 + 39 条路径白名单」。白名单只说明 「这里允许出现『会话』」,没说明「这里指的是哪一种 session」—— 逐条判断时没有可对照的 名字,于是同一个错反复犯。实际上那 39 条覆盖了**五个**不同概念: 产品条目 / Agent 运行时会话(22 条) / 登录校验会话(2) / SSH 远程与传输(5) / 操作系统桌面与 mobile 语音连接(6) ## 改动 新增 **agent-session** 条目(decided): - 译法:zh「Agent 会话」/ ja「Agent セッション」/ ko「Agent 세션」——把最容易译错、 且唯一「译错会改变用户行为」的那一类给了名字,可正向查 - forbidden: zh 禁「任务」when 英文源含 agent session。精确、当前零误报;唯一的合法 混用 forkErrors.unsupportedHistory(前半指运行时、后半指条目)已登记 exempt - note 写明**门禁拦不住哪一半**:英文只写 session 的那批(`The Codex session state` / `Session is inactive` / `in-flight sessions`)机器判不出来 —— 英语本身不区分,同句 两个所指并存也合法。与其加个会误伤的词形规则,不如把「为什么不能加」写清楚 实测:把 computerUse 三处 toggleHint 改回犯错时的写法,门禁报 3 处违规并阻断; 回滚后恢复绿。 session 条目的 note 从散述改成明确交叉引用 agent-session。 ## 文档 §6.0.2 从「Agent 进程会话不跟改」改写成「英文的 session 在本仓是五个概念」,开头给 五语义对照表 + 术语表条目归属,再给三条人工判据(多余动作 / 同句同概念 / 绕开名词), 并说明门禁能拦与不能拦的边界。文档抬头加了「动手前先读 §6.0.2」。 门禁:GATE_EXIT=0;check:i18n-glossary ✅ 32 条已裁决;GLOSSARY.md 已重新生成(60 条)。 Signed-off-by: Dash <dashhuang@gmail.com>
codex 指出被过滤掉的不是产品任务。核实 maker-host/codex-local-sessions.ts 的 isInternalSourceValue:过滤的是 source / originator 为 exec、codex_exec、subagent 的 底层 thread —— 即 Codex 的非交互运行与子代理线程,用户在侧栏里根本没有对应条目。 说「已跳过的内部任务」会让用户以为自己有一批任务被藏起来了。 en/ja/ko 也都是 runtime 口径(`skipped internal sessions` /「内部セッション」/ 「내부 세션」),又是只有 zh 被我改坏: - settings.sessionImport.description:「已跳过的内部任务」→「已跳过的内部 Agent 会话」。 同句前半「只有列表里勾选的任务会被导入」保持不变 —— 那些确实会变成产品任务,属 §6.0.2 判据二允许的「两个词各指其物」 - settings.sessionImport.summary.filteredHint:「内部任务或已在应用内」→ 「内部 Agent 会话或已在应用内」 两个 key 登记进 glossary session.exempt(共 41 条),重跑 i18n:glossary-doc 同步。 顺带说明:这一条的判断直接来自上一轮新建的 agent-session 条目与 §6.0.2 的五语义表 (「Agent / 引擎运行时会话 → Agent 会话」),不再需要临时权衡 —— 那个术语条目开始起作用了。 另本轮 rebase 到最新 origin/main(auto-review 基础设施、SkillHub 本地导入、插件基座 revert 等 12 提交)。冲突 1 处 × 四语:main 给 issueTracker 加了 emptyTitleUnverified, 本 PR 改了同段 startIssueChat —— 取两者合并。按规则检查 rebase 带进的新文案:locale 侧 0 条含术语词,硬编码侧 0 条,无需跟改。 门禁:GATE_EXIT=0;四包 typecheck 全 0;check:i18n ✅ 6204 key;check:i18n-glossary ✅。 Signed-off-by: Dash <dashhuang@gmail.com>
Co-Authored-By: Claude <noreply@anthropic.com> Signed-off-by: Dash <dashhuang@gmail.com>
Co-Authored-By: Claude <noreply@anthropic.com> Signed-off-by: Dash <dashhuang@gmail.com>
Co-Authored-By: Claude <noreply@anthropic.com> Signed-off-by: Dash <dashhuang@gmail.com>
Co-Authored-By: Claude <noreply@anthropic.com> Signed-off-by: Dash <dashhuang@gmail.com>
Co-Authored-By: Claude <noreply@anthropic.com> Signed-off-by: Dash <dashhuang@gmail.com>
Co-Authored-By: Claude <noreply@anthropic.com> Signed-off-by: Dash <dashhuang@gmail.com>
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: e0183f2380
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Co-Authored-By: Claude <noreply@anthropic.com> Signed-off-by: Dash <dashhuang@gmail.com>
|
术语体系梳理得很到位——「任务/对话/消息」三层对应清晰,IM 四端同步改动也毫无遗漏,glossary 的豁免注释写得很细心。🎯 |
这次改了什么
摘要
把
session的中文译名从「对话」改成「任务」,并把「任务 / 对话 / 消息」三个词的边界一次定清楚。改名前中文把
session译作「对话」,这个词表达不了 Cindy 最重要的一个能力:同时跑多个互不干扰的工作。「对话」听起来是一次问答,用户看不出左侧列表里每一条其实是一个有独立空间、可以并行推进的工作。但这不是把所有「对话」替换成「任务」——用户在每个任务里做的事确实是在跟 AI 对话。所以先定分层:
「轮次」不是第四层:AI 在一轮里的思考、工具调用、多次输出最终折叠成一条消息,所以面向用户一律说「消息」。现有删除行为就是这个口径(AI 消息删除的是上次用户输入之后的整轮输出)。
权威规则落在新增的
docs/product-rules/task-and-conversation-naming.md,机器口径落在i18n/glossary.json。变更类型
feat新功能docs/test/chore文档、测试或工程维护范围
session中文译名),承接 feat(desktop): 「新任务」上下文快捷入口与一键启动 #951 引出的译名问题conversation/dialogue收敛:110 处 →session、26 处 →chat(指交流过程或归属分类的)、16 处保留不动(IM 平台概念、复合词、隐私文案);chat只按白名单改 11 处明确指条目的task歧义消解:与session同句时改写 task 一侧(「当前任务正在运行」而非「当前任务正在执行任务」)automation去掉「任务」二字(23 处):原「自动化任务」与 session 同句会出现「删除任务和任务」message误译成「对话」、7 处turn误译成「对话」,以及 1 处Copy current conversation link—— 该链接实际带messageClientId,指向单条消息,英文原文写错了session改译 +alsoAllowed语境豁免、chat、thread),新增 4 个(task/message/turn/working-directory)。working-directory是把散落在worktree条目 note 里的既有裁决提为独立条目并加上门禁ja/ko收敛到音译:ja 136 条 / ko 130 条(逐条人工判断,7 条刻意保留;韩语助词随之交替가→이/를→을/로→으로/는→은)session/sessionId/SessionView/ IPC channel / DB 字段 / 协议字段一律不动:已改为一并收敛(产品决策,见 review 讨论)。ja 136 条 / ko 130 条共 266 条,理由与取舍见新增的ja/ko文案docs/product-rules/task-and-conversation-naming.md§5.1 —— 简言之 ja/ko 改名前就在混用(音译 271/277 处 vs会話・대화16/11 处),英文侧收敛后不一致放大到 133 处,所以向既有主流(音译)靠回去。タスク/작업(task)不动ccAgent.layout.new仍是「新建」/New,改成「新任务」由 feat(desktop): 「新任务」上下文快捷入口与一键启动 #951 承担(它同时重构该入口的快捷卡片与一键启动),本 PR 不抢那个 keytask未全量改写:不同句、语境清晰时仍用「任务」(104 处)。「后台任务」「定时任务」这类有限定词的说法本身不歧义,强行统一反而生硬UI 变化
纯文案改动,不动布局、颜色、组件与动效。已在 macOS 实机目检(沙箱实例,见「手工验证」)。
automation去「任务」时保持了「正在统计由这条自动化生成的任务…」的形态pnpm check:i18n通过);ja/ko按术语表既定口径不跟改中文裁决Start a new session)、正文 sentence case怎么验证的
自动验证
术语表门禁做过反向验证:把
独立任务空间/Independent Task Space注入ccAgent.layout.taskWorkspaceLabel,门禁按预期报错并指回Working directory条目,随后回滚该注入。手工验证
macOS,
pnpm restart:desktop:remote -- --isolated=tasknaming沙箱实例,desktop:whoami校验 root + commit 均 MATCH。逐处目检并按反馈修正了 3 轮:···菜单:「在新任务中继续」→「开启一个新任务」;「复制当前任务链接」→「复制当前消息链接」<编号>」(编号用于区分同时开着的多条任务),未改成「工作目录」未执行的验证
pnpm --filter desktop test(全 tier,比提交门禁范围大)有 3 个失败:makerSendToSessionOrdering.test.ts,断言是expected -1 to be greater than or equal to 0(源码字符串锚点找不到)。已在干净的主 checkout(无本地改动)上跑同一文件,同样 3 个失败,与本 PR 无关,且不在pnpm test:unit范围内ja/ko界面未目检:本 PR 对这两个 locale 文件零差异风险
风险分类
纯 i18n 文案 + 文档 + 术语表,无源码逻辑改动(
git diff --stat里唯一的非 locale/测试/文档改动是apps/mobile/app/sessions/new.tsx的一行中文注释——它被newSession.test.ts当作indexOf源码锚点,术语不同步会让锚点返回 -1)。影响与回滚
i18n/glossary.json、docs/product-rules/。不涉及 main 进程、SQLite、system prompt、协议、原生层、fingerprint已知代价(需要产品承担,已确认接受)
两个月内第二次大规模改名。
glossary.json里session条目原先记录着上一次裁决:落地时把 440 处「会话」+ 22 处「聊天」统一改为「对话」(2026-07)。再改一次,已发布的截图、教程、帮助内容,以及用户已形成的认知都要跟着变。落地方法(写进了文档 §6.0,后来者别再踩)
最初让脚本按正则自动判断并批量替换、人工事后 review。结果改坏了:代码标识符(
buildDialogueWorkspaceDir,靠 typecheck 才暴露)、OpenAI 协议名(Chat Completions)、动词(you chat from here→you session from here)、飞书的群/单聊、以及 5 条同类文案改得互相不一致。抽查命中率约 9%。正确流程:脚本只负责列出候选(key + 英文原文 + 当前中文),逐条人工判断要不要转、转成什么,只写入确认的那些,默认不转。 最终 565 条里 87 条判定保持「对话」——这 36 条正是自动规则最容易改错的地方。
chat尤其不能批量替换,它同时承载至少五种互不相干的含义(协议名 / 模型类型 / 外部平台概念 / 动词 / 界面区域 / 那个条目);conversation也不能——IM 集成里的conversation指的是飞书、微信、Telegram 自己的会话。提交前检查
git commit -s,见 DCO)术语不变量清单(给后续 review 当锚点)
改名类 PR 逐条打补丁容易发散,这里把判据固定下来。三条不变量,全部细则见
docs/product-rules/task-and-conversation-naming.md:I1 — 指条目就说「任务」。 「那个能单独打开/删除/归档/重命名的东西」= 任务;
任务内人与 AI 交流的过程或内容 = 对话;单条 = 消息。「会话」是 forbidden 译法,只在
指 Agent 进程 / runtime session 时保留(§2、§6.0.2,门禁靠
glossary.json的exempt白名单登记)。I2 — 「新 X」按落库行为定名,不按命令名字。(§6.0.3)
INSERT/newUPDATE原行INSERT/ctr→ ➕ 新建INSERT前两条共用同一份设置和同一句文案 → 必须取两者都成立的「新对话」。
I3 — 同形副本要成组改。(§6.0.4)
im/{telegram,discord,feishu,wechat}/uiText.ts是四份近亲文案包;改任一渠道必须同轮把四个一起过。判据是「这句话在别的包里有没有
同形副本」,不是「reviewer 点了哪个」。
按读者划的改动边界(全仓 102 处硬编码「会话」已逐条归类,§6.0.4):
uiText.ts)Errormessagefork.ts→chat.userMessage.forkErrors.*、rewind.ts→chat.rewind.errors.*),这串只进日志orca-team-architecture.md刻意保留:discord / feishu / wechat 的「存档 / 上号」是渠道语气(
feishu/uiText.ts文件头写明「偶尔带点游戏味的隐喻(上号、存档、副本、AFK 之类)」),非错译。要不要统一
成「任务」是产品语气取舍,记在 §8 遗留。