Skip to content

fix(bots): 保留工作中的进度文字,完成后折叠过程 - #7081

Merged
MagicLizi merged 3 commits into
mainfrom
dash/companion-progress-visible
Oct 24, 2026
Merged

MagicLizi merged 3 commits into
mainfrom
dash/companion-progress-visible

Conversation

@dashhuang

@dashhuang dashhuang commented Oct 24, 2026 •

Copy link
Copy Markdown
Member

这次改了什么

摘要

伙伴工作时,进度正文可能短暂出现后被过滤,只剩工具活动,用户无法持续了解工作进展。桌面和手机现在保留普通任务分组产生的进度正文,不再因 commentary 元数据、单条文本流结束或后续工具调用而隐藏。最终答复到来后,复用普通任务的工作过程折叠规则;桌面同时恢复完成后可展开的过程记录。

进度文字是用户理解当前行动、已有发现和下一步的主要入口,优先级高于工具名、命令等执行细节。此原则已写入伙伴产品规范。

明确标为 commentary 的进度不会被误并入紧邻的最终答复,即使中间没有工具或 thinking,也会在完成后进入可展开过程;未标 phase 的多段最终答复仍保持完整。Desktop、Mobile 原始消息分组与宿主历史投影共用这个边界,伙伴回复提升时也在该边界停止回扫。

变更类型

  • feat 新功能
  • fix 缺陷修复
  • refactor / perf 重构或性能优化
  • docs / test / chore 文档、测试或工程维护
  • 其他:

范围

  • 关联 Issue / 需求:用户反馈手机伙伴进度文字一闪而过,要求两端与普通任务一致。
  • 本 PR 包含:Desktop / Mobile 伙伴正文过滤、完成后工作组保留、共享分组与历史投影的 commentary/最终答复边界、回归测试、产品规范。
  • 明确不包含:模型输出策略、工具执行、群聊、消息存储、协议、原生依赖和布局改版。
  • 用户可见变化:工作中的进度说明持续可见;完成后可展开查看过程。附件或任务结果卡本身不会提前隐藏进度说明。
  • 是否存在 breaking change:无。

UI 变化

  • 引用的设计规范:docs/design-rules/DESIGN.md §1 内容优先、§2 语义颜色、§10 主题系统。复用现有正文和工作折叠组件,不新增颜色、尺寸或样式;Light / Dark 共用同一投影逻辑。
  • 初次提交时 pnpm ui:check --changed --theme all 返回 nothing-to-run,当时 pnpm ui:check:publish 因未生成 artifacts/ui-check 返回 ENOENT。
  • Review 补充共享分组边界后重新执行 pnpm ui:check --changed --theme all:362/362 页面变体通过(212.8s,包含 Light/Dark),已查看 overview.png。本地证据在 artifacts/ui-check/changed-FkAFFi/,未公开上传截图。
  • MessageStream.tsx、messageWorkGroups.ts、botConversationPresentation.ts 仍为 UNCOVERED;上述页面验证不等于真实伙伴消息流的视觉验收,本次时序行为由定向回归测试覆盖。

怎么验证的

自动验证

已通过:

pnpm --dir apps/desktop exec vitest run src/renderer/features/bots/__tests__/botConversationPresentation.test.ts src/renderer/features/bots/__tests__/botConversationTimeline.test.ts src/renderer/__tests__/workGroupBlockLivePreview.test.tsx
结果:68 项通过
pnpm --dir apps/mobile exec vitest run src/__tests__/companionConversationPresentation.test.ts src/__tests__/mobileHistoryRender.test.ts src/__tests__/pluginAttachmentBubble.test.tsx
结果:70 项通过;随后为 history takeover 增加 commentary 分支并单独重跑 mobileHistoryRender.test.ts,30 项通过。
pnpm --dir apps/desktop exec vitest run src/renderer/__tests__/buildRenderItemsKeyStability.test.ts src/renderer/__tests__/workGroupHistoryGap.test.ts src/renderer/__tests__/makerChatStoreAroundClientId.test.ts src/renderer/__tests__/botGeneratedArtifactsCard.test.tsx
结果:152 项通过;相关用例合计 291 项。下表四个文件也分别单独运行通过。
pnpm --filter desktop typecheck
pnpm --filter mobile typecheck
pnpm check:test-hygiene
pnpm check:dev-docs
git diff --check
结果:全部通过

Review 补充验证(最终行为):

pnpm --dir packages/maker-shared exec vitest run
结果:同步最新 main 后 102 文件、1872 项通过。
Desktop 上述 7 个相关文件:220 项最终均通过(首次联跑有 3 条旧断言要求完成后的 commentary 仍外露,已调整并单独重跑 workGroupBlockLivePreview.test.tsx,25 项通过)。
Mobile 上述 3 个相关文件:75 项通过。
最终相关用例合计 295 项;公共包全量另有 1872 项通过。
pnpm --filter @cindy/maker-shared build
pnpm --filter mobile typecheck
pnpm --filter desktop typecheck
pnpm check:test-hygiene
结果:全部通过。同步 main 后也重跑公共包类型检查与手机历史渲染(32 项),均通过。

无工具间隔回归先红后绿:Desktop 最小断言 1 项、Mobile 原始消息与历史接管 4 项均在修复前复现,修复后通过。没有再次重跑已确认会在本机基线崩溃的整仓门禁,完整 CI 继续核验。

整仓验证另经 Git workflow 的 run-unit-gate.sh 执行根 pnpm test:unit:

  • 首轮桌面有 3708 个测试文件通过;唯一失败文件在测试启动后才更新旧的隐藏断言,该文件最终版本已单独运行 120 项全部通过。
  • 对最终提交完整复跑时,桌面 Vitest 进程以 SIGSEGV 退出,没有断言失败;runner 自动重试一次仍出现同类崩溃,因此不宣称本机整仓全绿。
  • 基线对照:首次验证时干净且最新的 origin/main(c335ab98fb09f4152bde1b26e1e4af9f627633f2,与 PR 最初起点一致)补齐本地 workspace 依赖后,执行 env -u NODE_ENV -u NODE_DEBUG -u CLAUDE_CODE_IDE_SKIP_AUTO_INSTALL -u CINDY_INPUT_HANDOFF_ROUTE pnpm exec node scripts/test-workspaces.mjs --tier unit --workspace apps/desktop,139.2s 同样以 SIGSEGV 退出,没有断言失败。此前未补齐依赖的基线运行有 missing-package 收集错误,不计作同类崩溃证据。该全量 runner 故障在不含 PR 改动的基线也存在,交由 CI 继续核验,不混入无关 runner 修改。后续 review 修复已同步到 main 325a1a8520,并完成上述定向验证。
  • 上述全量运行的脚本、headless、mobile、maker-core 及其余 workspace 均通过。两端类型检查和本 PR 的 291 项定向测试通过;完整桌面检查仍需 CI 核验。

测试价值(均为 unit,经真实生产投影入口验证;无新测试文件):

文件 可观察结果与旧覆盖缺口 最小失败输入 单文件实测
Desktop botConversationPresentation.test.ts 运行中保留进度;完成后即使无工具间隔也折叠 commentary,最终答复不变 用户 + commentary + 紧邻的 turnCompleted 最终正文;旧代码已复现失败 0.42s
Mobile companionConversationPresentation.test.ts normalize → group → companion 在迟到运行状态下也正确折叠已完成 commentary,保持失败采样、显式投递与去重覆盖 用户 + commentary + 紧邻最终正文,运行状态 true/false;旧代码已复现失败 1.93s
Mobile mobileHistoryRender.test.ts commentary 运行中可见,完成后在原始消息与宿主历史接管两条路径一致折叠 用户 + commentary + final,eager/lazy HistoryViewController;旧代码已复现失败 2.39s
Desktop workGroupBlockLivePreview.test.tsx 完成后 commentary 进入 summary,失败采样仍可通过真实展开交互回看,最终正文保持可见 失败采样 → commentary → final;含手动恢复与 steer 分段 3.48s
Desktop buildRenderItemsKeyStability.test.ts Claude / Pi / Codex 的真实流事件均保留进度,封口后折叠且消息 key 稳定 text → metadata / tool → final seal 6.34s(既有文件;测试 39ms,其余为模块加载)
Desktop workGroupHistoryGap.test.ts 保留完成组,同时维持历史空洞两侧不合并 空洞前后两轮正文与工具 5.91s(既有文件;测试 9ms,其余为模块加载)
Desktop makerChatStoreAroundClientId.test.ts 历史定位接管后仍保留运行中进度,显式回复及脱敏规则不变 around-message hydration + 显式回复前后进度 2.66s
Desktop botGeneratedArtifactsCard.test.tsx 文件确认、移出视口、候选替换均不提前隐藏进度 无最终答复的生成过程 + 异步 stat 确认 3.27s

手工验证

已审查完整 diff,并对照历史提交核实原过滤逻辑;尚未进行实际客户端目检。

未执行的验证

  • 未进行 iPhone 真机、Android 或桌面 Light / Dark 视觉测试。本地仅在 dash/companion-progress-visible worktree 运行测试,没有启动 Metro,因此没有 Metro 归属或 __DEV__ build label 证据。
  • 视觉单页没有覆盖此消息流,见上方实际执行结果。

风险

风险分类

  • 无已知风险
  • SQLite / migration
  • system prompt
  • 协议兼容
  • 权限 / 安全 / 用户数据
  • 存量插件兼容(批准状态 / 指纹 / manifest 校验 / 安装布局 / 包格式)
  • 原生层 / fingerprint / OTA
  • 跨平台差异
  • 其他:有意调整伙伴过程可见性。

影响与回滚

  • 影响范围:桌面与手机伙伴私聊的显示投影;运行中的可见正文增加,桌面完成后恢复折叠入口。共享分组对普通任务与历史投影也避免将明确 commentary 误认作相邻最终答复的一部分。失败采样仍留在工作折叠内,合成触发消息仍隐藏,显式回复和结果绑定保持原有规则。
  • 回滚 / 降级方式:回退本 PR 即恢复旧展示,无存储迁移。未修改 native / fingerprint 输入,存量插件影响:无。

提交前检查

  • 已 review 完整 diff
  • 每个 commit 都带 DCO 签名(git commit -s)
  • UI 改动已在「UI 变化」注明引用的设计规范章节
  • 未提交凭证、令牌或授权文件
  • 已核对受影响的文档,行为变化涉及的旧结论已同步修订
  • 已确认测试结果或说明未执行原因

@dashhuang
dashhuang requested a review from a team as a code owner October 24, 2026 21:11
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 24, 2026 •

Copy link
Copy Markdown

Codex Review Summary

This comment shows the latest Codex review activity on this pull request.

Review Status Commit Review trigger
📝 Code Review ✅ Completed 2026-10-24T21:33:02.647765Z b6d92e2 New commits
🔒 Security Review ✅ Completed 2026-10-24T21:34:55.236682Z b6d92e2 New commits
ℹ️ 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" or "@codex security review".

Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.

@greptile-apps

greptile-apps Bot commented Oct 24, 2026 •

Copy link
Copy Markdown

RetriggerView in GreptileConfidence Score: 5/5

[Medium impact] 未发现阻止合并的问题,展示逻辑与本次保留进度及完成过程的目标一致。

Summary

本 PR 调整桌面和手机伙伴聊天,让工作中的进度正文持续可见,并保留完成后可展开的过程。

  • Companion progress stays visible until the final answer folds its work history.

未发现需要报告的问题。本次未运行测试或进行客户端视觉验证。

Diagram

%%{init: {'theme': 'neutral'}}%%
flowchart LR
  A[实时消息或历史消息] --> B[普通任务分组]
  B --> C[伙伴展示投影]
  C --> D[运行中保留进度正文]
  C --> E[完成后保留可展开过程]
  C --> F[明确投递的回复留在外层]
Loading

Reviews (1) · Last reviewed commit: "test(bots): 对齐流式历史和成果卡的进度可见性断言" · Reviewed by Greptile

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: fd06cc1680

ℹ️ 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".

Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
@dashhuang
dashhuang force-pushed the dash/companion-progress-visible branch from fd06cc1 to b6d92e2 Compare October 24, 2026 21:29
@MagicLizi MagicLizi added touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) touches:rules 改动碰到规则 / 规范文档(review-pr 自动维护,仅展示) labels Oct 24, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

PR #7081 审查报告(auto / standard 档)

PR: #7081
head=b6d92e2c167eb61a336f8e5af37ca51b6ed76cec base=325a1a8520eab7157b67441c6a4725e2f54960f5 baseRef=main diffHash=2b7c8fd3c47c7ff619414313b2e1f9e6daf88b83f5038ccb356c32e32b362d1b

Findings

没有 P0/P1。逐块核对了 Desktop 伙伴投影(botConversationPresentation.ts)、Mobile 伙伴投影(companionConversationPresentation.ts)、共享分组(packages/maker-shared/src/workRunGrouping.ts / messageRender.ts / historyViewProjection.ts)与全部测试改动:

  • 共享分组只新增可选 adapter 钩子 canPrependToAnswer,未提供时保持旧语义(!== false 判定),不破坏其他调用方;两个回扫循环(sealed run 与无 seal 回退)同步接入,commentary 不会被并入紧邻最终答复的 answer run,完成后落进 createCompletedGroup 折叠。
  • 伙伴投影的删减仅移除「完成后丢弃工作过程 / 过滤进度正文」的展示过滤,thinking、synthetic trigger、failedSamplingAttempt、空正文、重复成果回执等原有抑制规则保留;liftRepliesFromWorkGroup 的显式回复提升与历史空洞边界不变。
  • 跨端一致:Desktop / Mobile / 宿主历史投影共用同一 commentary↔最终答复边界;mobileHistoryRender.test.ts 验证原始消息与历史接管两条路径投影一致。
  • 错误与回滚路径:纯展示投影、不改持久化数据,回滚即回退本 PR;无存储迁移、无协议/权限/凭证面改动。

Rule coverage

规则 结论
AGENTS.md、docs/dev-rules/development-workflow.md、.github/PULL_REQUEST_TEMPLATE.md 三大段(改了什么/怎么验证的/风险)完整且与 diff 一致;3 个 commit 均带 Signed-off-by(git commit -s 口径);未含凭证/密钥
docs/design-rules/DESIGN.md、cindy-design-system.md 复用既有正文与 WorkGroupBlock 折叠组件,无新增颜色/尺寸/样式/组件,无硬编码绕过 token;Light/Dark 共用同一投影逻辑,无单模式条件补丁
docs/product-rules/cindy-bots-runtime.md(本 PR 修订) 新增「信息优先级」段与 2026-10-25 裁决,明确取代 2026-10-20「完成后整块不再出现」;rules/product 触发由维护者 zqchris GitHub Approve 放行,全文与实现一致(含「工作中的正文不因 commentary 元数据/单条文本流结束/后续工具调用而消失」「完成后保留展开入口」)
docs/product-rules/core-product-principles.md 属体验缺陷修正(进度可见性优先于执行细节),未把流程塞进 Core、未重复实现 Agent 能力
docs/dev-rules/architecture-invariants.md 无 package 依赖方向变化;maker-shared 仅新增可选接口字段,导出面兼容
docs/dev-rules/mobile-development.md 冷更边界 仅 TS/MD 改动,未触碰 app.json/app.config.js/eas.json/原生依赖/插件,无 runtime fingerprint 变化
docs/dev-rules/remote-and-mobile-adaptation.md 无 IPC/推送事件/协议改动;历史接管与 eager/lazy 详情加载有回归覆盖
docs/dev-rules/engineering-conventions.md 无 UI 文案/i18n 键新增(仅代码注释与规则文档中文正文)

Verification

本 worktree 内实际执行(退出码均为 0):

pnpm install --frozen-lockfile --prefer-offline --prod=false          通过(依赖准备)
pnpm --dir apps/desktop exec vitest run botConversationPresentation.test.ts
  botConversationTimeline.test.ts workGroupBlockLivePreview.test.tsx
  buildRenderItemsKeyStability.test.ts workGroupHistoryGap.test.ts
  makerChatStoreAroundClientId.test.ts botGeneratedArtifactsCard.test.tsx
                                                                    220/220 通过
pnpm --dir apps/mobile exec vitest run companionConversationPresentation.test.ts
  mobileHistoryRender.test.ts pluginAttachmentBubble.test.tsx        75/75 通过
pnpm --dir packages/maker-shared exec vitest run                      102 文件 1872/1872 通过
pnpm --filter desktop run --if-present typecheck                      通过
pnpm --filter mobile run --if-present typecheck                       通过
pnpm check:test-hygiene                                               PASS(361 files)
pnpm check:dev-docs                                                   通过
git diff --check                                                      干净

与 PR 描述声称的验证一致(295 项相关用例 + 公共包 1872 项 + 两端 typecheck)。

未执行项(如实):

  • pnpm test:unit 全量未在本机复跑(PR 描述已说明本机 runner SIGSEGV 基线问题),由 CI client-ci 全绿核验(当前 pr-design-basis / client-ci / PR fix(bots): 保留工作中的进度文字,完成后折叠过程 #7081 均 success)。
  • heavy 档专项与 security-scan.mjs 未跑(standard 档不适用;context security.scanned=true、hardHits=0、softHits=0)。
  • 真机/桌面 Light/Dark 目检未做;format.uiEvidenceMissing=true(PR 附 pnpm ui:check 362/362 页面变体与 overview.png,但消息流未覆盖)——按非阻断提醒处理,请作者后续补消息流截图/录屏或 HTML 证据。
  • bot 静默期超时放行:copilot-pull-request-reviewer 未对当前 head 表态,其意见可能合并后到达(Codex 与 Greptile 均已审完、0 findings)。

Intent alignment

  • 描述来源:PR 标题与当前 body(https://github.com/makecindy/cindy/pull/7081,读取于 2026-10-24T22:16Z),关联需求为「用户反馈手机伙伴进度文字一闪而过,要求两端与普通任务一致」。
  • 原目标:伙伴工作中的进度正文持续可见,不因 metadata/文本流结束/后续工具而消失;最终答复后按普通任务规则折叠过程,Desktop/Mobile 一致。
  • 初始实现:e981b6175c82c99cd306b227cb73f39a84e12342(基线 325a1a8…,主 diff 为取消伙伴投影正文过滤、保留完成组、改测试与规则文档)→ 7297756(测试断言对齐)→ 当前 head b6d92e2(按 Codex P2 增加 canPrependToAnswer 边界)。
  • 多轮意见回看:Codex thread(PRRT_kwDOTgdRUs6v7xBJ,已 Resolve)指出 commentary 会被误并入紧邻最终答复;b6d92e2c 修复后 commentary 完成后进入可展开过程,未标 phase 的多段最终答复仍完整——修复在原目标范围内,未替换或削弱核心功能;Greptile 5/5 无 findings。
原目标/初始行为 最终行为与影响 代码/提交证据 变化依据
运行中进度正文持续可见 保持:不再因 commentary 元数据、文本流结束或后续工具隐藏 b6d92e2 botConversationPresentation.ts / companionConversationPresentation.ts PR 描述与用户反馈,一致
完成后折叠过程、保留展开入口 保持:完成组保留(取代 2026-10-20「做完了,去掉」) workRunGrouping.ts createCompletedGroup 路径 + 各回归测试 规则修订 docs/product-rules/cindy-bots-runtime.md:277(2026-10-25 Dash 裁决)由维护者 zqchris 2026-10-24T21:12:19Z Approve 放行 product+rules 触发;zqchris 同为 2026-10-20 裁决人,属已获明确同意的调整
commentary 不并入紧邻最终答复 新增边界(Codex P2 后补充),纯进度仍可见、完成后进折叠 workRunGrouping.ts canPrependToAnswer(b6d92e2c) Codex review thread + 规则「工作过程在这类回复前后分段」,一致

结论:一致 / 已获明确同意的调整,无原意偏离;核心目标(进度可见、完成折叠、两端一致、历史接管一致)均有本轮复跑通过的回归测试佐证。

Overall

pass —— 没有 P0/P1,原意一致性复核完成,无待裁定的核心方向问题。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) touches:rules 改动碰到规则 / 规范文档(review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants