Skip to content

feat(mobile): mark task rows with the teammate looking after them - #7066

Merged
MagicLizi merged 3 commits into
mainfrom
cindy/task-row-teammate-mark
Oct 24, 2026
Merged

MagicLizi merged 3 commits into
mainfrom
cindy/task-row-teammate-mark

Conversation

@zqchris

@zqchris zqchris commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor

这次改了什么

摘要

手机任务列表补上桌面侧栏已有的「在跟进」标记:伙伴开的后台任务、或伙伴明确接手的任务,任务行标题右侧显示这位伙伴的 16pt 小头像,一眼看出这件事有谁在管。紧接 #7032(首页伙伴段)之后的单独一步。

  • 数据来自桌面:伙伴名册的每个伙伴行在原「打开聊天」链接后,追加 rel following 的任务链接。口径和桌面 useSessionFollowers 相同:委派子任务 ∪ 明确接手 − 解除;只列在用伙伴、未归档、本机、普通来源、非 Orca worker 的任务,按最近更新取前 200 条。
  • 随变化刷新:创建回执、接手/解除、委派建出子任务、任务归档或恢复时都会让相关伙伴的名册失效重读;伙伴行 revision 带这组任务的摘要。手机端电脑详情页也保持读取伙伴名册;本机保存的名册从磁盘读回后会通知已渲染的任务行。
  • 手机呈现:首页与电脑页任务行,标题后、时间/状态前放第一位伙伴的头像(多位时按名字排序取第一位,与桌面一致);读屏标签在「打开任务 X」后列出全部跟进伙伴。只认同一台电脑的伙伴,归档任务不标;自动化分组行不标。

变更类型

  • feat 新功能
  • docs / test / chore 文档、测试或工程维护

范围

  • 关联 Issue / 需求:Chris 2026-10-24「先交伙伴段,标记紧接着单独做」(feat(mobile): 伙伴并入任务首页,退役独立的任务/伙伴模式 #7032 的后续)。
  • 本 PR 包含:
    • Desktop:bots.ts 读跟进任务;botRemoteResourceProjection.ts 输出 following 链接与 revision 摘要;botWorkbenchTools.ts、register.ts、botRemoteResourceInvalidation.ts 失效广播。
    • Desktop(review 修复):sessions.ts 任务状态变化通知一个由 register.ts 安装的监听,botRemoteResourceInvalidation.scheduleBotRemoteResourceChangedForFollowedSession 找出开启或接手该任务的伙伴并广播(sessions 模块不加载伙伴依赖)。
    • Mobile:remoteResources.ts 链接上限 64→256;remoteResourceCache.cachedTaskFollowers;新 TaskFollowMark;HomeSurface 任务行接入;devices/[deviceId] 电脑详情页保持名册刷新;名册冷启动从磁盘读回后通知订阅者;5 语读屏文案;--mock 伙伴数据带跟进链接。
    • 设计清单:重新生成 docs/design-rules/design-inventory.md。
    • 文档:protocol-compatibility「伙伴名册的跟进任务链接」、cindy-bots-runtime 手机标记说明。
  • 明确不包含:任务页顶部「<伙伴> 的后台任务」小标(手机任务页尚无,另做);桌面收起头像 28→40。
  • 用户可见变化:手机任务列表里被伙伴跟进的任务多一个小头像。
  • 是否存在 breaking change:无。

UI 变化

iOS(iPhone 18 Pro 模拟器)浅色 / 深色:

Android(API 36 模拟器)浅色 / 深色:

左:iOS 置顶任务(Cindy);右:Android 英文任务(LiZi):

4 倍放大,头像与转圈、时间垂直居中:

  • 引用的设计规范:
    • DESIGN.md §5 圆角清单:头像用 9999 圆形,沿用 RemoteCompanionAvatar framed 样式(与伙伴段/桌面侧栏同一组件语言)。
    • DESIGN.md §3 / mobile tokens:尺寸用 iconSize.md(16),与同一行的置顶、自动化图标等大,间距沿用标题行既有 gap 8。
    • DESIGN.md §2 颜色:标记只是身份,不带状态色;在线状态沿用头像组件自身表达。
    • 双模式:只用主题 token,浅/深已在 iOS 与 Android 实机目检。

怎么验证的

自动验证

apps/desktop  vitest botRemoteResourceProjection.test.ts botTaskResponsibilityAuthority.test.ts
结果:2 files / 19 tests passed,1.14s
apps/desktop  相关伙伴测试(canonical session、责任范围、provider/memory 投影)
结果:全部通过
apps/mobile   vitest remoteResourceCache.test.ts
结果:1 file / 9 tests passed,0.70s
apps/mobile   HomeSurface 相关 19 个测试文件
结果:367 tests passed
apps/desktop  vitest botRemoteResourceInvalidation.test.ts(review 修复)
结果:1 file / 4 tests passed,1.28s
apps/mobile   vitest remoteResourceCache.test.ts(review 修复后)
结果:1 file / 10 tests passed,0.63s
pnpm --filter <desktop> typecheck / pnpm --filter <mobile> typecheck
结果:通过
pnpm check:i18n-glossary   结果:无新增违规
pnpm check:test-hygiene    结果:PASS
pnpm check:dco             结果:passed

测试价值(engineering-conventions §3.2):

  • botRemoteResourceProjection.test.ts 新增 1 例:经投影入口验证伙伴行带 following 链接、conversation 仍在首位、集合变化时 revision 改变(新协议字段与失效依据,原无覆盖)。
  • botTaskResponsibilityAuthority.test.ts 在已有用例加 1 条断言:接手责任后同时广播远程名册变化(漏广播 = 手机标记不刷新)。
  • remoteResourceCache.test.ts 新增 1 例:同电脑匹配、跨电脑不串、按名字排序、链接撤回后消失。
  • botRemoteResourceInvalidation.test.ts 新增 1 例(review):任务归档/恢复后只刷新开启它和接手它的伙伴,跳过暂停、记录损坏与无关伙伴(漏刷新 = 恢复的任务不显示标记)。
  • remoteResourceCache.test.ts 再增 1 例(review):任务行先于本机名册读取时,名册读回后会收到通知(冷启动标记缺失)。

手工验证

本 worktree 的 Metro(apps/mobile,--mock 视觉数据)同时连 iOS 模拟器(iPhone 18 Pro)与 Android 模拟器(cindy-api36):

  • 三条被跟进任务均显示正确伙伴:「登录页窄窗口错位排查」(置顶,Cindy)、「重构登录页布局」(Cindy;读屏「Cindy、LiZi在跟进」)、「Investigate flaky upload test」(LiZi);其他任务无标记。
  • 浅色 / 深色两端都核对;4 倍放大核对与时间、运行转圈垂直对齐。
  • 读屏标签:zh-CN「打开任务 …,Cindy、LiZi在跟进」,en「Open session …, looked after by Cindy, LiZi」。
  • 电脑页(标题切到具体电脑)同样显示;下拉刷新后标记保留。
  • 独立电脑详情页(设备管理 → 电脑 → 显示任务,devices/[deviceId]):Android 截图核对三条标记;iOS 被系统「在 Cindy 中打开?」弹窗遮住置顶行(无模拟器窗口可点),以该页列表实际渲染的三条标记与读屏文本为证。

未执行的验证

  • 真实账号与真实委派后标记实时出现:本次只用 mock 数据;失效链路由单测覆盖。
  • 归档视图:mock 无归档任务,归档不标由单测覆盖。
  • 新手机连旧桌面 / 旧手机连新桌面:未实机,按协议说明旧端忽略未知 rel。
  • 本地 sessionsRestoreIfArchived.test.ts 在未改动的提交上同样失败(electron app mock 缺失,既有问题),CI 分片通过。
  • ja / ko / zh-TW 读屏未实听(文案已加);宽屏抽屉内嵌任务列表未单独截图(共用同一行组件)。

风险

风险分类

  • 协议兼容
  • 无已知风险

影响与回滚

  • 影响范围:伙伴名册远程资源多一组可选链接;手机任务行多一个只读头像。不改 IPC channel、请求参数、数据库、push 或 Mobile 原生配置(无冷更)。
  • 回滚 / 降级方式:直接 revert;旧客户端本就忽略该 rel,回滚后手机仅不再显示标记。

提交前检查

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

The teammate roster row now links the open local tasks the teammate started
or took over (rel 'following', same scope as the desktop sidebar mark, at
most 200). Mobile task rows show the first follower's 16pt avatar beside the
title and read every follower's name to screen readers. Responsibility and
delegation changes invalidate the roster so the mark stays current.

Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
@zqchris
zqchris requested a review from a team as a code owner October 24, 2026 14:15
@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-24T15:10:32.544722Z c9fff29 New commits
🔒 Security Review ⚠️ Failed 2026-10-24T15:07:53.801162Z
We couldn’t complete this review. Comment @codex security review to try again.
c9fff29 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.

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

ℹ️ 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/localDb/ipc/bots.ts
@greptile-apps

greptile-apps Bot commented Oct 24, 2026 •

Copy link
Copy Markdown

RetriggerView in GreptileConfidence Score: 4/5

[Medium impact] The changes reach teammate roster updates and mobile task lists.

可以合并,但建议修复跟进头像在电脑页、冷启动和任务恢复后的更新问题。

Findings

  1. P2 电脑页头像不刷新 ▶
  2. P2 缓存加载后头像仍缺失 ▶
  3. P2 恢复任务后缺少头像 ▶
Fix with agent prompt
### Issue 1
apps/mobile/src/session/TaskFollowMark.tsx:19-20
`useTaskFollowers` 只读缓存,但电脑详情页没有加载或刷新伙伴名册。直接打开电脑页时,空缓存会让跟进头像缺失。即使先访问过首页,进入电脑页后发生的接手或解除也不会刷新头像,因为首页的名册订阅只在首页获得焦点时运行。

建议让电脑页也读取名册并订阅变化,或把读取放到两个页面共享的位置。

### Issue 2
apps/mobile/src/device-link/remoteResourceCache.ts:188-190
`followIndex` 只按账号和 `revision` 重建,但从磁盘加载名册时不会增加 `revision`。冷启动时,任务行可以先把空名册建成索引,随后 `readRemoteResourceSnapshot` 才加载已有的 `following` 链接。如果后续写入内容没有变化,也不会发通知,头像就要等其他缓存内容变化后才会出现。

建议在磁盘数据首次装入后使索引失效并通知订阅者,并补上先查询、后加载磁盘缓存的测试。

### Issue 3
apps/desktop/src/main/localDb/ipc/bots.ts:1451-1452
`following` 链接现在取决于任务是否为 `active`,但归档和恢复任务只广播任务变化,不会让负责伙伴的名册重读。先在任务已归档时读取名册,再恢复任务,手机就会显示恢复后的任务,却仍缺少跟进头像,直到其他事件触发名册重读。

现有 `scheduleBotRemoteResourceChangedForSession` 只查 `botSessionLinks`,不能覆盖普通任务的明确接手关系。建议在归档和恢复时通知负责该任务的伙伴名册重读。

---

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

Summary

桌面把伙伴跟进的任务作为 following 链接发给手机,手机在任务标题旁显示头像,并在读屏标签中列出伙伴名字。

  • Teammate rows share links to the tasks each teammate follows.
  • Mobile task rows show the first teammate looking after each task.

Diagram

%%{init: {'theme': 'neutral'}}%%
flowchart LR
  A[委派任务与接手记录] --> B[桌面伙伴名册]
  B --> C[following 链接与 revision]
  C --> D[手机名册缓存]
  D --> E[按电脑与任务查找伙伴]
  E --> F[任务行头像与读屏标签]
Loading

Reviews (1) · Last reviewed commit: "feat(mobile): mark task rows with the te..." · Reviewed by Greptile

Comment thread apps/mobile/src/session/TaskFollowMark.tsx
Comment thread apps/mobile/src/device-link/remoteResourceCache.ts
Comment thread apps/desktop/src/main/localDb/ipc/bots.ts
…r pages and cold start

- Refresh the teammates following a task when it is archived or restored
- Keep the teammate roster current on the standalone computer task page
- Notify rows that read before the saved roster loaded from disk
- Regenerate the design inventory

Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
@chatgpt-codex-connector

Copy link
Copy Markdown

The account paying for this security review has reached its Codex usage limits. The payer can check the Codex usage dashboard. For personal accounts, using credits requires enabling “Use credits for security reviews” in Code review settings. If you do not manage the paying account, contact this repository's admins.

…mate-mark

Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
@chatgpt-codex-connector

Copy link
Copy Markdown

The account paying for this security review has reached its Codex usage limits. The payer can check the Codex usage dashboard. For personal accounts, using credits requires enabling “Use credits for security reviews” in Code review settings. If you do not manage the paying account, contact this repository's admins.

@MagicLizi MagicLizi added touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) touches:rules 改动碰到规则 / 规范文档(review-pr 自动维护,仅展示) labels Oct 24, 2026

@MagicLizi MagicLizi left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

PR #7066 独立代码审查报告(standard 档)

PR: #7066
head=c9fff2960db8013c36ee1e3fe3bac8d5faa0fb0a,base=4af715d21fbe5a031f6d4d37310a784327527967(main),diffHash=3c92ab8c4cdbd9cff892b3c40b03f81d89b23cd89b0f36b3b0edb8c8cd2a10b5

Findings

没有 P0/P1。以下为不阻断的观察(P2,仅记录):

  • scheduleBotRemoteResourceChangedForFollowedSession 对已解除(responsible:false)的责任记录也会广播一次名册失效(Object.hasOwn 不区分 responsible),属于过量失效,多一次无害重读,不影响正确性。
  • 每次任务状态 patch 都会读一遍全部在用伙伴的责任记录文件;归档/恢复是低频操作、在用伙伴数量有限,量级可接受。

Rule coverage

  • AGENTS.md / docs/dev-rules/development-workflow.md:只做一件事(手机任务行「在跟进」标记);PR 描述、diff、测试一致;DCO 三 commit 均签名(git log 逐一核过)。
  • docs/dev-rules/protocol-compatibility.md(PR head 原文,含本次新增「伙伴名册的跟进任务链接」节):wire 协议只在既有 Remote Resource links 上新增可选 rel following,旧端按未知 rel 忽略、conversation 仍是首条链接;降级与发布顺序在正文写明;未在 packages/device-link 之外造协议;未改 relay / IPC allowlist。合规。
  • docs/dev-rules/mobile-development.md「冷更边界」:未触碰 app.json / app.config.js / eas.json / apps/mobile/package.json / plugins/ / modules/ 等任何 fingerprint 输入(diff 文件清单逐一核对),不触发冷更。合规。
  • docs/dev-rules/remote-and-mobile-adaptation.md:无新增 IPC channel、push 类型、请求参数;失效沿用既有 maker:remote-resources:changed 名册失效链路;恢复路径(归档/恢复后标记刷新)的失效广播只多不少、失败关闭。合规。
  • docs/dev-rules/architecture-invariants.md:无 package 依赖方向变化(sessions.ts 通过 setSessionStatusPatchedListener 注入,避免 sessions 模块加载伙伴依赖)、无运行时动态 import、布局树未动。合规。
  • docs/dev-rules/engineering-conventions.md:无 console.log(createLogger);无新 IPC handler;main 侧新逻辑(readFollowedTaskIds、schedule…ForDelegation/ForFollowedSession)带主路径与错误路径测试;测试无外网/固定端口;改动平台无关;UI 文案走 t()、5 语齐全、pnpm check:i18n 与 pnpm check:i18n-glossary 通过;新函数均有职责注释。合规。
  • DESIGN.md / docs/design-rules/cindy-design-system.md:TaskFollowMark 复用设计系统组件 RemoteCompanionAvatar(framed + radius.pill 圆形),尺寸走 iconSize.md(16),不自造组件、无硬编码颜色、纯主题 token(双模式安全;浅/深实机截图已附)。合规。
  • docs/product-rules/cindy-bots-runtime.md(PR head 原文 6.3.5):手机标记与桌面侧栏「在跟进」同一口径(委派子任务 ∪ 明确接手 − 解除;在用、未归档、本机、普通来源、非 Orca worker),并与桌面 useSessionFollowers / isWorkbenchTaskSource 逐条比对一致(DB source notNull,无 null 分歧;remoteHostId IS NULL 与桌面「本机」判据一致)。多伙伴取名字排序第一位、读屏列出全部、归档不标、自动化分组行不标,均已落实。
  • docs/dev-rules/database-and-migrations.md:无 schema / migration 改动,只读查询(inArray 500 分批)。合规。
  • .github/PULL_REQUEST_TEMPLATE.md:三大段齐、验证区分已跑/未跑、风险分类与回滚写明(协议兼容 + revert)。合规。

Verification

在审查 worktree(PR head)实际执行,均完整落盘并保留命令退出码:

命令 结果
pnpm --filter desktop exec vitest run botRemoteResourceProjection / botTaskResponsibilityAuthority / botRemoteResourceInvalidation EXIT=0,3 files / 23 tests passed
pnpm --filter mobile exec vitest run src/__tests__/remoteResourceCache.test.ts EXIT=0,10 tests passed
pnpm --filter mobile test(全量) EXIT=0,769 files / 10770 tests passed
pnpm --filter desktop exec vitest run src/main/localDb/ipc/__tests__ src/main/maker-ipc/__tests__ EXIT=1:322/325 files、8681 tests 全过;3 个文件收集期失败(sessionAutoTitlePersist / sessionsHiddenTasks / sessionsRestoreIfArchived,electron mock 缺 app 导出,报错栈在 worktree/WorktreeManager.ts → workdir-probe-host)。该 import 链在 base 已存在、本 PR 未改这些文件的 import,属既有问题(PR 描述亦已如实注明),CI 双源全绿
pnpm --filter desktop run typecheck / pnpm --filter mobile run typecheck 均 EXIT=0
node scripts/check-i18n.mjs / check-i18n-glossary.mjs / check-test-hygiene.mjs 均 EXIT=0(无新增违规;待裁决术语告警为存量)

未执行:真实设备双模式目检(以作者 iOS/Android 浅深截图代);真实账号委派链路端到端(由单测覆盖失效链路)。机器人静默期超时放行:copilot-pull-request-reviewer 与 chatgpt-codex-connector 在 20 分钟上限内未表态(Codex 安全审查因用量额度耗尽未完成,非发现问题),这两个机器人的意见可能在合并后才到。

Intent alignment

  • 描述来源:PR 标题与 body(2026-10-24 拉取),关联 Chris「先交伙伴段,标记紧接着单独做」(#7032 后续)。
  • 初始实现:c796d9dc52(父基线 d795c6db6f)——手机任务行按伙伴名册 following 链接显示跟进头像 + 桌面投影输出该组链接。
  • 待合并 head:c9fff2960d = 初始实现 + review 修复 79e7965257 + 同步 upstream/main 的 merge commit(base 同步,非扩范围)。
原目标/初始行为 最终行为与影响 证据 变化依据
手机任务行标题旁显示跟进伙伴头像(首页/电脑页) 不变,新增 TaskFollowMark、useTaskFollowers 接入 HomeSurface c796d9dc52 + head apps/mobile/src/session/HomeSurface.tsx 原目标本体
名册 following 链接 + revision 摘要 不变 botRemoteResourceProjection.ts 原目标本体
标记随变化刷新 补齐:任务归档/恢复、电脑页名册刷新、冷启动磁盘读回通知 79e7965257(sessions 监听 + scheduleBotRemoteResourceChangedForFollowedSession + useTeammateRoster(screenFocused) + cache emit()) Codex/Greptile 4 条已 Resolve 意见的缺陷修复,仍在原目标内,未改产品方向

结论:一致。多轮修复只补失效与刷新,无功能删除/削弱/替换、无无关扩范围;已 Resolve 的 bot 意见均为 P2 级刷新缺陷且已核实落实。无待裁定的核心方向问题。

Overall

pass —— 没有 P0/P1,原意一致性复核通过,可进入 guarded Approve 与合并。

@MagicLizi
MagicLizi merged commit 5da68bb into main Oct 24, 2026
23 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants