Skip to content

fix(companion): 保留后台回报后的进度文字,明确本轮结束语义 - #7085

Merged
MagicLizi merged 2 commits into
mainfrom
dash/companion-coordination-progress
Oct 25, 2026
Merged

MagicLizi merged 2 commits into
mainfrom
dash/companion-coordination-progress

Conversation

@dashhuang

@dashhuang dashhuang commented Oct 25, 2026 •

Copy link
Copy Markdown
Member

这次改了什么

摘要

伙伴收到委派任务的内部回报后,宿主原先会过滤这一轮的文字、思考,并清空结束事件的答复。于是即使 #7081 已恢复前端的进度展示,这条路径仍只留下工具记录,用户看不到伙伴整理后的进展。

这次只隐藏原始协调来信,伙伴回复恢复普通消息的保存和分发:运行中进度持续可见,最终答复后沿用普通任务的过程折叠。同步去掉“通过 send_to_session 给自己发消息才能汇报”的提示;不扩大工具授权。

finished 继续只表示所查任务本轮结束。后台委派任务可以继续执行,用户的下一条消息按现有运行状态与队列正常派发。摘要同时跳过隐藏协调/续跑输入,并在原有 2KB 预算内保留最新助手回复的首尾片段;总预算进一步收紧时也保留末尾结果或阻塞说明。

变更类型

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

范围

  • 关联 Issue / 需求:fix(bots): 保留工作中的进度文字,完成后折叠过程 #7081 后续修复,补齐后台协调回报触发的进度可见性。
  • 本 PR 包含:删除整轮输出过滤;修正协调输入提示和工具说明;修正短摘要取值;同步规则与回归。
  • 明确不包含:新的完成状态机、任务写权限、通知机制、数据库迁移、客户端协议或界面组件。
  • 用户可见变化:后台回报后的伙伴进度与结果可读、可回看;轮次结束后仍能正常发送下一条消息。
  • 是否存在 breaking change:无。复用已有消息和元数据通道;此前已经丢弃的正文无法补回。

UI 变化

没有新增或修改界面布局、样式、组件或 UI 文案。宿主恢复给现有桌面/手机消息列表提供文字,显示与折叠继续复用普通任务逻辑。

  • 引用的设计规范:不涉及:未改 renderer/mobile 的界面代码;本次验证的是宿主输出与既有两端呈现的衔接。

怎么验证的

自动验证

先红后绿:修改生产管线和摘要用例后,旧代码复现两处失败——协调文字没有送入持久化/广播、隐藏回报覆盖最近用户消息;修复后通过。

# apps/desktop:核心链路,5 文件 772 项通过(13.00s)
pnpm exec vitest run src/main/maker-ipc/__tests__/sessionEventPipeline.test.ts src/main/maker-ipc/__tests__/botWorkbenchTranscripts.test.ts src/main/maker-ipc/__tests__/agent-input-coordinator.test.ts src/main/mcp-integrations/__tests__/taskDigest.test.ts src/main/maker-ipc/__tests__/botTaskCoordination.test.ts --maxWorkers=2

# apps/desktop:现有呈现与通知边界,36 + 1 项通过
pnpm exec vitest run src/renderer/features/bots/__tests__/botConversationPresentation.test.ts
pnpm exec vitest run src/main/agent-island/__tests__/service.test.ts -t 'does not sound or mark attention for internal coordination completion'

# apps/mobile:既有进度保留与最终答复折叠,27 项通过
pnpm exec vitest run src/__tests__/companionConversationPresentation.test.ts

# packages/lizi-mcps:摘要输出预算、长回复首尾与权限边界,6 项通过
pnpm exec vitest run src/__tests__/getTaskDigestTool.test.ts

# 仓库根
pnpm --filter desktop run typecheck
pnpm --filter @cindy/mcps build
pnpm check:dev-docs
pnpm check:test-hygiene
pnpm check:dco
git diff --check

初始版本 840 项相关测试通过,另有文档合同 10 项通过;桌面与 MCP 包类型检查通过。本轮摘要修复定向运行 6 项工具测试(含新增 2 项),累计覆盖 842 项相关回归,并通过 MCP 类型检查、文档合同与测试规范检查。同步主干 784e8c477e 后,逐文件重跑四个修改过的 maker-ipc 测试文件并再次运行桌面类型检查。

测试价值(均为已有文件,未新增测试文件;耗时为单文件 Vitest 总耗时):

文件 生产入口/可观察结果、缺口与最小输入 tier/耗时
sessionEventPipeline.test.ts 真实 handleSessionEvent 管线;一个协调输入的 commentary、独立文字、工具及 done 应保留持久化与广播的正文。原用例反而要求丢弃正文,现改为本次回归。 unit/4.73s
agent-input-coordinator.test.ts 真实输入协调器;协调轮次运行中排队一条用户消息,本轮 done 即派发,随后再发一条正常消息。保护“回复结束不等于后台事情完成”,无需等待子任务完成回报。 unit/12.48s
botWorkbenchTranscripts.test.ts 真实 lastExchange;用户要求后追加隐藏协调消息、助手回复含两行,仍取真实用户消息和完整回复。原覆盖缺少隐藏输入,只取末行丢失结论。 unit/0.716s
botTaskCoordination.test.ts 继续验证真实来源核验、入队恢复与已注册发送入口;删除随输出过滤 helper 一起失效的 6 项旧断言,输出行为集中由真实管线回归覆盖,来源/权限断言保留。 unit/2.65s
agent-island/service.test.ts 现有协调成功静默/失败提示用例改用公开回复元数据,确认 botPrivateReply=false 后仍不产生成功提醒。仅定向运行该项,其余 164 项未运行。 unit/3.70s
getTaskDigestTool.test.ts 真实 registry.call 输出;超过 300 字、末尾才写失败结论的回复,分别验证正常预算和多字段挤占预算;旧代码两项均丢失结论,修复后首尾保留且仍 ≤2KB。 unit/0.295s(6 项)

输入协调器文件已有 589 项用例,本次增加 1 项无真实等待的内存时序回归;12.48s 包含原有大文件加载和用例矩阵,本次未增加模块重置或外部 I/O。

手工验证

已自审完整 diff,核对来源核验、私聊/群专线、成功通知静默、输入放行及摘要输出预算的现有边界。未将开发版装入当前运行的 Cindy。

未执行的验证

未启动桌面开发版、Metro、模拟器或 iPhone 真机,因此没有本轮界面截图或实机验收结论。分支为 dash/companion-coordination-progress,worktree 为 cindy-src-companion-coordination-progress。

未重复执行整仓单测:按当前仓库风险匹配的提交规则完成定向回归,完整检查由 CI 执行。此前 #7081 已记录本机全量桌面 Vitest 在干净主干也出现 SIGSEGV 的证据;本次没有修改 runner 或依赖。

风险

风险分类

  • 无已知风险
  • SQLite / migration
  • system prompt
  • 协议兼容
  • 权限 / 安全 / 用户数据
  • 存量插件兼容(批准状态 / 指纹 / manifest 校验 / 安装布局 / 包格式)
  • 原生层 / fingerprint / OTA
  • 跨平台差异
  • 其他:协调轮次的消息可见性、单条协调输入提示与工具说明。

影响与回滚

  • 影响范围:经宿主核验的委派子任务来信触发的伙伴回复。原始来信继续隐藏;已发表的普通回复按既有规则参与历史、未读与同步。保留 botTaskCoordination 来源标记及既有成功完成通知静默,私聊/群专线的 botPrivateReply 判据不变。
  • 全局 system prompt、输入状态机与任务授权实现未改。摘要仍有界查询、输出 ≤2KB;若最近窗口内没有用户消息则返回空,不把内部回报补成用户指令。
  • 回滚 / 降级方式:回退本提交恢复旧过滤;已有可见回复保留,不删除历史。需升级实际执行伙伴的桌面宿主才能修复此路径,仅更新手机界面无效。

提交前检查

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

Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
@dashhuang
dashhuang requested a review from a team as a code owner October 25, 2026 00:01
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 25, 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-25T00:17:38.782346Z 4a852f3 New commits
🔒 Security Review ✅ Completed 2026-10-25T00:18:52.328823Z 4a852f3 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 25, 2026 •

Copy link
Copy Markdown

RetriggerView in GreptileConfidence Score: 4/5

[Medium impact] The change reaches delegated-task conversations and their summaries.

本次改动可以合并;建议补上长回复摘要保留末尾结论的处理和测试。

Findings

  1. P2 长回复摘要丢失结论 ▶
Fix with agent prompt
### Issue 1
apps/desktop/src/main/maker-ipc/botWorkbenchTranscripts.ts:120
`lastExchange` 改为返回整段助手回复,但 `boundTaskDigest` 仍只保留前 300 字,超过总预算时还会继续从尾部截短。对于先解释过程、最后说明失败或阻塞的长回复,`get_task_digest` 现在会丢掉原先能保留的末行结论。

建议为助手回复保留开头和结尾,并补一个结论位于 300 字之后的回归用例。

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Summary

本次将内部协调来信与伙伴回复分开:来信继续隐藏,回复恢复普通消息的保存和分发。

  • Owner tasks show progress after hidden coordination reports.
  • Task summaries keep the real request and full latest reply.

Diagram

%%{init: {'theme': 'neutral'}}%%
flowchart TD
  A["已核验的协调来信"] --> B["隐藏原始输入"]
  B --> C["伙伴处理来信"]
  C --> D["回复按普通消息保存和广播"]
  C --> E["本轮结束"]
  E --> F["保留成功通知静默"]
  E --> G["按现有队列派发下一条输入"]
Loading

Reviews (1) · Last reviewed commit: "fix(companion): 保留后台回报触发的进度文字并明确轮次状态" · Reviewed by Greptile

Comment thread apps/desktop/src/main/maker-ipc/botWorkbenchTranscripts.ts

@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: b03ce8d778

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

Comment thread apps/desktop/src/main/maker-ipc/botWorkbenchTranscripts.ts
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>
@MagicLizi MagicLizi added status:ci-running CI 还在跑(review-pr 自动维护,仅展示) touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:rules 改动碰到规则 / 规范文档(review-pr 自动维护,仅展示) labels Oct 25, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

Code Review: PR #7085 fix(companion): 保留后台回报后的进度文字,明确本轮结束语义

  • 仓库:makecindy/cindy
  • head:4a852f3591396986271a5979b6c24b4bdd46e7f4(2 commits,b03ce8d778 + 4a852f3)
  • base:784e8c477e13ebf5cc9fb40874310e8b49366fff(main)
  • 审查深度:standard(rule-map 分档),凭证/隐私门 hardHits=0、softHits=0,格式门通过
  • 结论:0 条可证实 P0/P1,审查干净,可进入受保护 Approve 与合并

改动概述

删除宿主侧 coordinationOutput.ts 的整轮输出过滤:委派子任务的内部协调来信继续隐藏,
但伙伴处理后的文字、思考与结束事件答复恢复走普通助手消息的落库、广播、历史与同步;
botPrivateReply 改回只由 isBotPrivateInput(bot DM / 群专线)判定,botTaskCoordination
来源标记保留以维持既有「协调轮次成功完成通知静默」策略。摘要链路同步修正:
lastExchange 跳过隐藏协调/续跑输入并保留最新助手回复全文,get_task_digest 长回复
保留首尾片段(预算收紧时仍保尾部结论),finished 明确为「本轮结束」。三份产品规则
(agent-user-parity / cindy-bots-runtime / message-source)与 send_to_session 工具说明同步修订。

逐项核验

  1. 输出过滤删除的收口完整:全仓已无 projectCoordinationOutput / coordinationOutput
    残留引用(文件已删除,import 全部清理);sessionEventPipeline 只剩 projectQuietScheduledOutput
    投影,prepareSessionEvent 返回值中被移除的 taskCoordination 字段无其它消费方。
  2. 通知静默不回归:agent-island/service.ts isCompletionEventSilenced 以
    agentMeta.botTaskCoordination === true 判定静默,与 botPrivateReply 解耦;
    对应测试改为 botPrivateReply: false 后仍断言不发声、不点亮 attention,覆盖到位。
  3. 权限边界未扩大:本次未改任何工具授权;coordinationModelPrefix 新提示词明确
    「结束本轮≠后台完成、不新增请求来源」,send_to_session 说明改为「coordination 不改变操作权限」。
    私聊/群专线 botPrivateReply 判据(isBotPrivateInput)保持原实现未动。
  4. 摘要合同仍成立:clip(..., keepEnd) 首尾各半(含省略号共 ≤ max 字符),收缩循环只对
    last_assistant_line 保尾,极端兜底清空可选字段的顺序未变;新增用例同时覆盖普通预算与
    多字段挤占预算两种模式,断言输出 ≤2KB 且首尾结论均保留、逐段 ≤300 字。
  5. 隐藏输入不冒充用户要求:lastExchange 复用共享判据 isSyntheticTriggerText
    (@cindy/maker-shared/synthetic-trigger,与 messageSourceNote / sessionList 同一实现),
    隐藏协调与续跑触发输入不再覆盖 lastUserAsk,回归用例覆盖「仅内部协调输入」场景。
  6. 规则文档与实现一致:三份 product rules 的修订(原始来信隐藏、回复按普通消息走、
    本轮结束只释放输入通道、旧宿主需升级)与代码行为逐条对得上,未夹带规则语义再解释;
    rules 触发已由最终维护者 zqchris 于 2026-10-25T00:01:48Z GitHub Approve 放行。
  7. 既有边界抽查:botLearningFeedback / botNightlyLearning / companion-cloud/mirror 等
    消费 botPrivateReply 的路径随「回复成为普通消息」语义自然纳入历史、学习与同步,与
    PR 描述「已发表的普通回复按既有规则参与历史、未读与同步」一致,无双重派发或重复回传证据。

意见与讨论处置

  • 2 条 review conversation(botWorkbenchTranscripts.ts:120)均已 Resolve,指向 Greptile
    「长回复摘要丢失结论」意见,head 已在第二个 commit(4a852f3591)以首尾保留 + 回归用例修复。
  • Codex code/security review(对当前 head 4a852f3):has_any_findings=false,无意见。
  • Greptile 唯一 Medium 意见(针对旧 commit b03ce8d)已被修复并验证(见下)。

验证记录(本轮实测,均保留命令退出码)

命令 结果 退出码
apps/desktop 下 vitest run sessionEventPipeline / botWorkbenchTranscripts / agent-input-coordinator / taskDigest / botTaskCoordination(5 文件) 772 passed 0
apps/desktop 下 vitest run src/renderer/features/bots/tests/botConversationPresentation.test.ts 36 passed 0
apps/desktop 下 vitest run src/main/agent-island/tests/service.test.ts -t 'does not sound or mark attention for internal coordination completion' 1 passed / 164 skipped 0
apps/mobile 下 vitest run src/tests/companionConversationPresentation.test.ts 27 passed 0
packages/lizi-mcps 下 vitest run src/tests/getTaskDigestTool.test.ts 6 passed(含新增 2 项首尾保留用例) 0
pnpm --filter @cindy/mcps test(全包) 76 文件 1194 passed 0
pnpm --filter desktop run typecheck 通过 0
pnpm check:dev-docs / pnpm check:test-hygiene 10 passed / PASS(361 文件) 0 / 0
git diff --check 干净 0
pnpm check:dco(本地区间) 见说明 1

说明 1:首次在 worktree 根目录跑 vitest 时 electron stub 别名未生效(app.getPath 报错),
属调用目录错误而非代码问题;改在 apps/desktop 目录按 PR 所述命令重跑后 772 项全部通过。

说明 2(DCO):本地 check:dco 的失败对象是上游已合入 commit 345d719f(#7072,作者
xuzini-xzn)不在本 PR 提交范围内;本 PR 两个 commit 均带与 author/committer 一致的
Signed-off-by: Dash <125997726+dashhuang@users.noreply.github.com>,GitHub DCO App check = pass,
不构成本 PR 缺签证据。

Intent alignment

对照初始提交(b03ce8d778)与当前 head(4a852f3591)逐项复核:

  • 用户原目标(PR 描述):后台回报后保留伙伴进度文字、明确「本轮结束」语义、不扩大工具授权。
    初始提交即围绕该目标:删除整轮输出过滤、botPrivateReply 回归专线判据、协调输入提示与
    工具说明改写、规则文档同步、输入放行回归。当前 head 未改变任何一项方向。
  • 第二个 commit 仅修正 get_task_digest 长回复截短丢尾部结论(Greptile 意见),属对摘要
    取值的同一目标内补强,并补 2 项回归用例;未顺带引入新功能、权限或协议变化。
  • 多轮 bot 意见(Codex 无 findings;Greptile 1 条已修并 Resolve)未诱导出目标偏移;
    「finished 只表示本轮结束、后台委派可继续、下一条消息按现有队列派发」在代码
    (输入放行仍走实时运行状态与队列)、工具描述和三份规则文档中表述一致。
  • 结论:无原意偏离;核心目标(进度可见 + 本轮结束语义)在当前 diff 中可核实达成。

风险与遗留(非阻断)

  • bot 静默期按超时放行(copilot-pull-request-reviewer 未表态、chatgpt-codex-connector
    已留无意见摘要),这两个机器人的补充意见可能在合并后到达。
  • 协调回复成为普通消息后会进入学习/镜像等「普通回复」消费路径,属本 PR 明示语义
    (文档已写明「通知静默不等于隐藏聊天记录」),未见越权或重复派发证据。
  • 未跑整仓全量单测(作者已说明桌面全量 Vitest 在干净主干有 SIGSEGV 史),风险由 CI 全绿
    (含 Windows/Linux 全部分片)覆盖。

无 P0/P1 findings,无 review thread 需创建。

@MagicLizi
MagicLizi merged commit 08d1788 into main Oct 25, 2026
23 of 24 checks passed
@MagicLizi MagicLizi removed the status:ci-running CI 还在跑(review-pr 自动维护,仅展示) label Oct 25, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:rules 改动碰到规则 / 规范文档(review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants