feat(mobile): 补齐伙伴与跨电脑远程控制 - #3912
Conversation
伙伴是永久 Profile + 可替换物理 Session 的两层结构:SOUL/记忆/自有技能落在 账号隔离的 Bot Home,canonical 卷每日 04:00 CAS 换代并归档,模型走 1-5 项 候选链,只有「候选不可用」才推进。运行时按 allowlist 装配能力:不继承 Cindy 全局 Skill/MCP/项目上下文;pi 关闭原生 subagent 扩展并传 --no-context-files,codex 置 project_doc_max_bytes=0,显式挂载 docs 工具集 时 cindy_docs 才进入 MCP allowlist —— 提示词承诺与工具面同进同退。 数据库为 6 张只增量新表(migration 0101)。 Signed-off-by: zqchris <chrisz83@gmail.com>
协作只有一个直接入口 collaborate_with_bot:status 查空闲,notify 发不追踪 的消息,delegate 委派给另一个伙伴,start_task 把大活开成一条真正的 Cindy 任务(出现在主任务列表、走自己的权限门)。两种委派共用同一张 bot_delegations 表(target_bot_id 为空即 Cindy 任务)、同一张实时协作卡与同一条完成信号。 完成信号重做:不再往时间线落机读文本,改为 synthetic-trigger 隐藏行 —— 对模型是接手指令,对用户不可见,可见终态由协作卡承载;发起方父卷被每日 换卷归档时改投该伙伴当前 canonical 卷,不静默丢失。委派服务不再依赖 automation 上下文、token 预算层、投递 outbox 与 IM 路由。 Signed-off-by: zqchris <chrisz83@gmail.com>
左侧伙伴名册(IM 式未读)、复用真实任务与 ChatInput 的聊天面、@伙伴结构化 引用,以及只剩三页的设置(成长/模型/维护)。创建收敛成「名字 + 自动色相 头像 + 人设文本」,不暴露 Session、压缩、fallback 等工程概念;记忆与自学 技能在设置页可见、可删。五语言 i18n 同步。 Signed-off-by: zqchris <chrisz83@gmail.com>
《Cindy 伙伴运行时》契约与工程完成矩阵按 v1 范围重写:Bot Home 权威边界、 每日换卷、模型候选链、能力 allowlist、委派与完成信号的呈现契约;设计规范 登记伙伴头像色相与未读徽章的窄作用域 token,并把头像图收敛为保留命名空间。 Signed-off-by: zqchris <chrisz83@gmail.com>
worktree 回收器与通用任务生命周期入口跳过 source='bot' 的会话 —— 伙伴卷的 归档与替换只归 Bot Renew 管;崩溃恢复快照剥离 Bot 宿主瞬态引用。 Signed-off-by: zqchris <chrisz83@gmail.com>
术语表移除已退出 v1 的「作品」「日程」两条,Teammate 描述收敛到当前范围; botPersona 不再引用已删除的模板文件。 Signed-off-by: zqchris <chrisz83@gmail.com>
Signed-off-by: zqchris <chrisz83@gmail.com>
Signed-off-by: zqchris <chrisz83@gmail.com>
Signed-off-by: zqchris <chrisz83@gmail.com>
Signed-off-by: zqchris <chrisz83@gmail.com>
Signed-off-by: zqchris <chrisz83@gmail.com>
# Conflicts: # apps/desktop/src/main/localDb/ipc/sessions.ts # docs/design-rules/design-inventory.md # packages/maker-core/src/agents/claude-code/index.ts
Signed-off-by: zqchris <chrisz83@gmail.com>
Signed-off-by: zqchris <chrisz83@gmail.com>
Signed-off-by: zqchris <chrisz83@gmail.com>
Signed-off-by: zqchris <chrisz83@gmail.com>
Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
Signed-off-by: zqchris <chrisz83@gmail.com>
Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com> # Conflicts: # apps/desktop/drizzle/meta/0101_snapshot.json # apps/desktop/drizzle/meta/_journal.json # docs/design-rules/design-inventory.md # i18n/GLOSSARY.md
4d5d3b6 to
fc2279e
Compare
Signed-off-by: zqchris <chrisz83@gmail.com>
Signed-off-by: zqchris <chrisz83@gmail.com>
Signed-off-by: zqchris <chrisz83@gmail.com>
Signed-off-by: zqchris <chrisz83@gmail.com>
Signed-off-by: zqchris <chrisz83@gmail.com>
Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
Signed-off-by: zqchris <chrisz83@gmail.com>
Signed-off-by: zqchris <chrisz83@gmail.com> # Conflicts: # apps/desktop/drizzle/meta/0101_snapshot.json # apps/desktop/drizzle/meta/_journal.json # apps/desktop/src/main/localDb/client/tx/types.ts # apps/desktop/src/main/localDb/worker/opHandlers/tx.ts # apps/desktop/src/main/maker-ipc/register.ts # apps/desktop/src/renderer/themes/__tests__/fixtures/desktop-color-defaults.json # docs/design-rules/design-inventory.md # i18n/GLOSSARY.md # packages/maker-core/src/agents/codex/index.ts
Signed-off-by: zqchris <chrisz83@gmail.com>
Signed-off-by: zqchris <chrisz83@gmail.com> # Conflicts: # apps/desktop/src/renderer/components/new-chat/UnifiedModelPanel.tsx # apps/desktop/src/renderer/components/new-chat/UnifiedModelRow.tsx # docs/design-rules/design-inventory.md
Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
|
已核实并同步遗漏修复,推送 删除请求现在先执行 验证:129 项定向回归、Desktop typecheck、本地 受保护 |
|
@zqchris 👋 这个 PR 目前与 请在本地 merge 最新的 |
Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
|
已推送 合并后:完整 用户对提示词范围的确认已公开同步至 #2829 (comment) ,本 PR 正文也已引用。删除并发竞态与当前版本缓存对照仍不能标为完成;共享历史预检只解决已存在共享历史时的前置副作用。保留受保护路径人工审核门,不删减需求、不提前解除未完成项。 |
… full Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
|
已在当前分支独立复现并同步 PC 伙伴 owner 转交的活动推送遗漏,提交
本次为跨分支补丁同步,没有新增可 Resolve 的 review thread;不代替维护者解除整体 CHANGES_REQUESTED。删除并发竞态、当前版本缓存命中率对照及受保护 CI 路径人工处理仍按各自证据跟进。本轮提交后的 CI 交给已有 PR 跟踪员,尚未合并发布。 |
Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
|
已推送删除/私聊写入竞态修复 已核实并同步 PC 伙伴分支转交的删除/私聊写入竞态修复。 删除预检通过后,晚到私聊曾可继续写入共享记录,导致最终删除失败而伙伴已暂停、归档。本轮将现有去重生命周期动作和私聊写入纳入同一组按 Bot ID 排序的锁;私聊取得双方锁后重新读取 active/canonical/unarchived 状态再写入。保留提前检查及最终数据库 guard,不新增 schema、migration 或 wire,不调整或删减伙伴定稿。 真实 SQLite 与两个服务的双顺序回归:旧实现 delete-first 失败;修复后删除先开始时晚到私聊拒绝、没有共享记录写入;私聊先写入时删除拒绝,Profile/Session/link 不变,没有关闭副作用,仍可 pause/resume。 验证:真实数据库/私聊/生命周期 154 项(115 + 24 + 15)通过,Desktop typecheck 通过, 当前版本缓存命中率对照仍未完成;提示词范围继续沿用 Chris 已公开确认。此转交对应 PC 的 review,没有本 PR 独立线程可 Resolve;不代替维护者解除整体审查状态。新 head CI 交由现有跟踪员跟进,受保护 CI 路径人工门保留,尚未合并发布。 |
Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
PC 伙伴合入主干后的冲突处置当前 head 手机源码、活动背压、DB 远程可见性与删除/私聊共享锁相对合并前未变;主干 Library 合同与键帽规范原样接入,设计清单从合并结果重新生成。没有调整或删减伙伴定稿。 验证: 本次为合并冲突处理,没有对应的独立 review thread 可 Resolve;不代替维护者解除整体审查状态。后续交由已有跟踪员按新 head 继续。 |
|
命中 UI 路径(apps/desktop/src/renderer/components/chat/SystemCard.tsx / apps/desktop/src/renderer/features/bots/BotCollaborationCard.tsx / apps/desktop/src/renderer/features/bots/BotDirectMessageCard.tsx 等)但 description 未附界面效果证据——建议补充改动后效果:截图/录屏,或改动后界面的 HTML 页面(```html 代码块、.html 附件或在线预览链接),便于确认界面符合 DESIGN.md 设计规范 |
|
已按这条意见补充 PR description 的「界面效果证据」:内附可直接复制保存的完整自包含 HTML,覆盖手机伙伴名册、后台任务/私聊卡片,以及远程 Mac 的任务卡和只读私聊详情,含 Light/Dark 与 390px 窄屏展示。 已在独立无头浏览器目检,明确标注为当前 本轮只补公开界面证据,未更改代码、产品需求或 CI;head 不变。原意见为 issue comment,没有可 Resolve 的 inline thread,不代替维护者作视觉通过结论。 |
Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
|
已在 验证:根 本条冲突通知是 issue comment,没有对应 inline thread 可 Resolve。当前 head 的 CI 和人工审查交由既有跟进处理,受保护 CI 路径的人工门不变。 |
MagicLizi
left a comment
There was a problem hiding this comment.
???? head 9f93cef06442fae302910dae4d829fa7cc573df7 ???? 2 ?????????? P1?
-
[P1]
apps/mobile/app/sessions/[sessionId].tsx:2104? ???? ACK ???????????????????
??canMarkRead?????????readAckSyncedKey????? loading/hold?????????session:<id>?? ACK ???contentKeyAtStart??null????????? 3400 ???readAckSyncedKey??contentSyncedKey??null???apps/mobile/src/session/useRemoteResourceSession.ts:33-46????????????lastReplyAt????????? 3433-3440 ?? post-ACK ???????????????????????
???????????????contentRecoveryKey/contentSyncedKey???????????????????????????????pre-ACK snapshot ? gap reply ? ACK ? recovery ??? mark read?? -
[P1]
packages/device-link/src/allowlist.ts:438/apps/desktop/src/main/maker-ipc/register.ts:9006? ?????????????? ID ?????????
???????[threadId, viewerBotId]??apps/desktop/src/main/device-link/remoteBotSessionBoundary.ts:18-25???????threadId? Session ID ?????????? Bot ID????apps/desktop/src/main/maker-ipc/botDirectMessageService.ts:329-378??? viewer ? thread participant????? Profile ??hiddenAt/status??????? delivered ???????? lookup ?hidden-bot??hidden??????ALLOWED?
?????/?? handler ???? viewer ??????????? opaque thread ID ?????????????/?????????????/?? participant ???????????
?? CI?DCO???????????????????????????
Signed-off-by: Chris <4436110+zqchris@users.noreply.github.com>
|
针对 review https://github.com/makecindy/cindy/pull/3912#pullrequestreview-5125634447,两条均确认属于原目标内缺陷,已在
验证:根 已核对本轮为整体 review,没有对应新 inline thread 可 Resolve;此前唯一 inline thread 已解决,未重复操作。请按当前 head 复审以上两项。 |
MagicLizi
left a comment
There was a problem hiding this comment.
Final re-review of head 02402586: no remaining P0/P1.
The previous Mobile pre-ACK companion read-cursor race and hidden/archived private-thread viewer authorization gap are both fixed. Verified the production paths, targeted Mobile/Desktop regressions, both typechecks, current CI/DCO, and resolved review threads. The dynamic-eval scanner hit is confined to a test harness over repository-controlled source and does not enter the product runtime.
这次改了什么
摘要
手机可以在“所有伙伴”中查看多台电脑托管的伙伴,并打开其长期任务继续工作;另一台 Mac 也能从伙伴任务卡读取状态、打开子任务、停止任务和回看只读私聊。原先这些卡片操作会直接调用控制端本机接口,本次改为始终携带来源电脑,并接上对应状态推送。
Desktop 伙伴依赖 #2829 已通过主干提交
f045326f1合入,本分支已合并该主干;依赖先后条件已满足。手机与跨电脑能力继续由本 PR 交付,PR Ready 不代表安装版或 OTA 已发布。变更类型
feat新功能fix缺陷修复docs/test/chore文档、测试或工程维护范围
UI 变化
docs/design-rules/DESIGN.md§2 Color Palette & Roles、§5 Layout Principles、§8 Mobile、§10 Light / Dark Dual-Mode Delivery Gate、§11 Voice & Content。颜色与圆角使用既有语义 token,手机操作触控高度至少 44;Light/Dark 均实现,但本批没有实机目检证据。界面效果证据(伙伴界面源码基准 e4e4ca5)
按本次实际组件结构与文案制作的自包含 HTML 效果稿,覆盖:手机多电脑伙伴名册(在线/离线/未读)、任务内后台任务卡及私聊入口、手机只读私聊、另一台 Mac 的任务卡/私聊留痕和只读详情。包含 Light/Dark 切换和窄屏适配;手机色值及尺寸来自当前
apps/mobile/src/theme/tokens.ts。源码对应链接也在 HTML 内。已用独立无头浏览器目检 Light/Dark 桌面展示宽度和 390px 窄屏。这是演示数据的静态组件效果稿,非安装版截图、React Native 实机渲染或两设备联网验收。 只展示本次相关组件区域,头像用首字占位,外围审查说明不进入产品;业务按钮不调用设备。没有启动 Cindy DEV、改变产品功能或生成新代码提交。
展开完整 HTML:复制保存为 cindy-3912-ui-evidence.html,即可离线打开
怎么验证的
自动验证
pnpm test:unit:related:共享 package exports 变化触发完整单测,最后一轮完整通过(含 Desktop、Mobile 与 maker-core)。pnpm --filter desktop run --if-present typecheck、pnpm --filter mobile run --if-present typecheck:通过。其余涉及 package 按约定执行--if-present typecheck,未定义脚本的自动跳过。pnpm --filter @cindy/device-link run build:通过。pnpm --filter mobile run test:scope、pnpm --filter mobile run test:smoke(2 项)、pnpm check:i18n-glossary、设计清单生成与 diff 检查:通过。ci-fingerprint.mjs compute:与 Desktop 依赖基线比较,iOS 均为96e76c9f4cb4fd4c990fb09e631e8ab42d61583e,Android 均为20a7dee6fb588f451c59b37deec3faf7e37a8b41;原生配置文件与 main 无差异。pnpm --filter @cindy/maker-shared run build有基线既存错误(composerPalette fixture 的 name 字段与 workRunGrouping 的 ES lib 配置);在未改的 Desktop 依赖 worktree 复现同样错误,相关文件与 main 一致。本次没有改这些范围来制造绿灯;Desktop/Mobile 消费者类型检查通过。手工验证
本批没有启动 Desktop DEV、Mobile DEV、Metro 或正式版,也没有连接真实 iPhone。工作分支
mobile-remote-resources,worktree 为同名独立目录;无 Metro 归属与 DEV build label,因此没有手机实机验收结论。未执行的验证
两台安装版 Mac 的实际联网控制、iPhone Light/Dark 实机与商店/OTA 发布未执行。Windows 数据库回归已在上一 head
3bd1572e的 CI 重跑通过;当前新 head 等待本轮 CI。模拟传输集成测试不代表安装版本已经端到端联通;电脑与手机需包含对应接口后才可交付该能力。本轮审查修复(2026-09-06)
3bd1572e的重跑 job101451325869中数据库回归步骤 SUCCESS;新 head 仍需本轮 CI。风险
风险分类
影响与回滚
提交前检查
git commit -s)受保护 CI 路径的人工处理
本 PR 修改了
.github/workflows/ci.yml,auto-review 已通知停止自动审查与自动合并,需 Lizi / 维护者人工处理。这处改动仅在现有 Linux、Windows 单测矩阵的首个分片追加
botCanonicalSession.test.ts和botRemoteResourceProvider.test.ts两个数据库回归套件,补足常规 unit tier 排除 localDb 的覆盖缺口。保留现有 required checks 与测试断言;不移除覆盖来绕过受保护路径门禁。伙伴定稿和跨设备功能范围保持不变。本地全量单测、Desktop/Mobile typecheck 及定向回归已通过;本机未运行 Windows,Windows 执行结果以当前 head 的 CI 为准。请求人工核对该 CI 改动并完成本轮复审。
与最新主干同步后的冲突处置
已将
d36a78ddc合入当前 head3bd1572e70cfe43aa4c5b9a7bb8b0a283959ae5d,解决 Desktop dispatch 与 device-link allowlist 冲突。保留伙伴定稿、资源通道与主干手机弱网正文恢复;新增的订阅及延迟正文快照也经过既有 DB 伙伴可见性检查及每个控制端的发送队列,维持旧增量 → 快照 → 新增量顺序,异步发送失败沿既有恢复路径重试。故障半径:处理单个控制端的队列背压或快照发送失败,只暂存该控制端对应任务的恢复;不重建共享 relay。保留主干多控制端拥塞隔离回归,并新增异步可见性检查、隐藏伙伴的订阅/恢复快照拒绝和异步发送失败恢复用例。
验证:
pnpm test:unit:related(自动退回全量)通过;Desktop/Mobile typecheck、手机 scope、设计清单与 DCO 通过。推送定向 38 项、伙伴数据库 114 项通过。未启动客户端或在本机执行 Windows;Windows 以当前 head CI 为准。受保护.github/workflows/ci.yml的人工审核门继续保留,尚未合并发布。删除失败的状态保护补齐
当前 head
797de0c2e5ad8703a94895289a06358e564b6b14同步 PC 分支019d212b9a6b6afeb769b0e2b8f20d1c0e682411的四文件修复:删除前调用bots.assertNoSharedHistory,已有共享委派或私聊历史时,在暂停、归档、关闭和取消任务之前拒绝。最终删除事务继续复用相同检查,保护检查期间新增的引用。没有删改伙伴定稿。服务层四种共享历史回归验证被拒后 Profile、canonical Session、link 完全不变,没有 close/cancel/delete 副作用,仍能正常暂停和恢复。129 项定向回归、Desktop typecheck、
pnpm test:unit:related(全量回退)及 DCO 通过。Windows 验证记录已核实更新:上一 head
3bd1572e的重跑 job101451325869中Run companion database regressions确实 SUCCESS;不再视为 Windows DB 未执行。本次新 head 的 CI 尚待运行结果。受保护 CI 路径仍需维护者人工处理,尚未合并发布。最新主干合并与提示词确认记录
当前 head
26aab5c53eedfcdb07b39f8c0436dca4cda8bc52已合入主干5fc588110,保留删除预检修复797de0c2e、伙伴记忆/权限配置与主干模型窗口配置,并重新生成设计清单。合并后本地完整pnpm test:unit:related、Desktop/Mobile typecheck、129 项伙伴/数据库回归、手机 scope、设计清单及 DCO 全部通过。依赖安装仅按现有锁文件补齐工作区连接,无客户端启动。维护者明确确认“伙伴专属提示词不会注入普通任务或 Reviewer 任务”,已同步为 PC 伙伴 PR 的公开记录。该确认仅覆盖提示词注入范围。删除与私聊写入竞态已在下述共享锁修复中补齐;当前版本缓存命中率对照仍需独立实测证据,不能用旧 usage 记录代替。受保护 CI 路径及人工复审门继续保留,尚未合并发布。
活动推送背压遗漏同步修复
当前 head
ab6ee936bd7e41efe241899951e5e5124d3d4f3c已核实并同步 PC 伙伴分支转交的最小修复:异步伙伴可见性检查队列满时,同步 BACKPRESSURE 不再删除尚未发送的活动状态,保留暂存并沿现有按控制端重试。异步失败仍不覆盖同一任务较新的暂存状态;权限校验、账号/连接代际、队列上限与断线清理保持不变。真实 dispatch 回归挂起 DB lookup,连续发送 65 个不同任务的 completed 活动,再释放 lookup:修复前稳定只有 64 条,修复后 65 条全部送达且最后一条正确。整套 dispatch 回归 39 项、Desktop typecheck、
pnpm test:unit:related(完整单测回退)、DCO 与 diff 检查通过。本轮仅两文件变更,未调整或删减伙伴定稿;未启动客户端。新 head 的外部 CI 与人工复审待处理,受保护 CI 路径的人工门继续保留。删除与私聊写入竞态补齐
当前 head
00b032dd8f6a57422ace6ef016f023f89a8e0898,对应 PC 修复提交d137fb77a82f5027afeab7b8f8e5a03f0b1a2e85;三个产品文件逐一比对一致。已核实并同步 PC 伙伴分支转交的删除/私聊写入竞态修复。
删除预检通过后,晚到私聊曾可继续写入共享记录,导致最终删除失败而伙伴已暂停、归档。本轮将现有去重生命周期动作和私聊写入纳入同一组按 Bot ID 排序的锁;私聊取得双方锁后重新读取 active/canonical/unarchived 状态再写入。保留提前检查及最终数据库 guard,不新增 schema、migration 或 wire,不调整或删减伙伴定稿。
真实 SQLite 与两个服务的双顺序回归:旧实现 delete-first 失败;修复后删除先开始时晚到私聊拒绝、没有共享记录写入;私聊先写入时删除拒绝,Profile/Session/link 不变,没有关闭副作用,仍可 pause/resume。
验证:真实数据库/私聊/生命周期 154 项(115 + 24 + 15)通过,Desktop typecheck 通过,
pnpm test:unit:related完整复跑通过,DCO 与 diff 检查通过。首次完整单测曾出现未改动的codexAuthBindingClaim.test.ts5 秒超时和cindySubagentForeground.test.ts提前停止时序失败;分别原样复跑 9 项、4 项通过,随后重新运行完整门禁通过。没有提高超时、跳过或弱化测试;未启动客户端。新 head 的 Windows/Linux CI 与人工复审仍需各自结果;
.github/workflows/ci.yml受保护路径人工门继续保留。伙伴提示词范围沿用已公开确认,缓存命中率对照尚未完成。本轮没有新增可 Resolve 的独立讨论线程,不代替维护者解除整体 CHANGES_REQUESTED;尚未合并发布。PC 伙伴合入主干后的冲突处置
此前 head
e4e4ca5721d5fa2d02c032b2c57818de531bb182已合并主干f045326f1(包含 Desktop 伙伴 #2829)。此次冲突来自共享伙伴文件在主干以 squash 方式新增;逐项比对双方后,保留手机分支的来源电脑路由、远程停止/子任务/只读私聊、离线缓存、独立未读位置、共享类型出口与安全投影。主干新增的已发现伙伴 ID 隐藏/归档后拒绝访问、暂停后 Skill 写入拒绝及 paused-main 私聊拒绝回归同时保留。手机源码、活动背压、DB 远程可见性与删除/私聊共享锁相对合并前未变;主干 Library 合同与键帽规范原样接入,设计清单从合并结果重新生成。没有调整或删减伙伴定稿。
验证:
pnpm test:unit:related(完整回退)全部通过;Desktop/Mobile typecheck、156 项伙伴数据库/资源/私聊/生命周期回归、手机 scope、设计清单及 DCO 通过。未启动客户端或改手机原生配置。新 head 外部 CI 与人工复审仍待结果;受保护 CI 路径人工门继续保留,手机 PR 尚未合并发布。再次同步主干后的冲突处置(2026-09-06)
此前 head
9f93cef06442fae302910dae4d829fa7cc573df7已合并主干ea5f9d1b4c83f7adb92e1f021ae709a6cce4d608。唯一文本冲突是自动生成的设计清单,已保留双方一致的人工维护部分,按合并后源码重新生成;register.ts中主干的插件任务权限审查接线及空草稿保护自动合入并逐项复核。其他传入文件与主干一致。手机伙伴、来源电脑路由、在线/离线缓存、远程控制、伙伴界面及共享安全修复与此前 head 保持一致,没有增删或调整定稿需求。上方 HTML 的伙伴界面源码基准仍为
e4e4ca57,此次合并没有改动其展示的伙伴组件,因此效果证据继续适用;它仍仅是静态界面证据,不能替代真机或双 Mac 联调。验证:根
pnpm test:unit:related(自动回退全量)通过;Desktop/Mobile typecheck 通过;伙伴数据库与生命周期/私聊定向 156 项通过;移动端 scope、设计清单、diff 与 DCO 检查通过。maker-core无 typecheck script,不把--if-present跳过记作类型检查通过。当前 head 的外部 CI 与人工审核继续由既有跟进处理;受保护 CI 路径的人工门保持不变。已读恢复时序与远程私聊查看者检查(2026-09-06)
当前 head
02402586e0c26853fb3ab7572369e5e657abe414处理 review5125634447的两项原目标内缺陷:contentRecoveryKey === contentSyncedKey检查。订阅 ACK 前的旧快照、ACK 已到但补拉尚未落地、旧 ACK 的快照均不能清伙伴未读;当前 ACK 对应的内容同步完成后才恢复原有已读流程。maker:bot-direct-message-thread:get在现有远程边界按第二个参数viewerBotId查询 Bot 可见性,不再把 opaque thread ID 当成 Session ID。隐藏、归档或已删除的查看者被拒;既有参与者校验保留,正常可见伙伴和本地 Desktop 阅读规则不变。该边界复用于调用前后及缓存/排队响应投递,避免隐藏后重放旧私聊响应。先在旧代码上复现未读提前清除、不可见查看者被放行和缓存重放泄漏,再验证修复。定向测试:Mobile 39 项、Desktop 分发/私聊 56 项、真实 SQLite 伙伴库 115 项通过;根
pnpm test:unit:related全量通过,Desktop/Mobile typecheck、移动端 scope、diff 与 DCO 检查通过。不新增 schema、wire 字段、allowlist 能力或界面,不调整定稿需求。恢复动作只约束当前任务的伙伴已读时点,不改变重试、link 或 relay 生命周期,不扩大其它控制端的故障范围。界面效果证据保持适用,仍未启动 DEV 或做真机/双 Mac 联调。受保护 CI 路径的人工审查门保持不变。