Skip to content

fix(desktop): preserve fresh remote Orca Lead startup - #3926

Merged
MagicLizi merged 1 commit into
mainfrom
codex/issue-3330-remote-collab-start
Sep 4, 2026
Merged

fix(desktop): preserve fresh remote Orca Lead startup#3926
MagicLizi merged 1 commit into
mainfrom
codex/issue-3330-remote-collab-start

Conversation

@fmfsaisai

@fmfsaisai fmfsaisai commented Sep 4, 2026

Copy link
Copy Markdown
Collaborator

这次改了什么

摘要

修复远程 device-link 新建 Codex Orca Lead 时,刚由 thread/start 产生且尚未接受 turn 的 sdk_session_id 被错当成可 resume 历史线程,导致首条消息 no-rollout 失败。main 侧盖章 device-link provenance;active Orca rehydrate 仅在可证明 fresh evidence=false 时清除 DB id;Codex 只对精确 app-server no-rollout 错误执行一次 thread/start fallback,并保留 preflight fail-closed。

根因由多个时序共同形成:PR #1212(b7c098250)引入 remote draft→pending→SessionView enableOrca→first input;PR #2882(3f39190ad)与 #3818(ab805af81)扩展 DB reconcile/rehydrate,使 fresh sdk_session_id 在尚未接受 turn 时进入 resume。不是单个 PR 独立引入全部问题。

变更类型

  • fix 缺陷修复
  • test 测试维护

范围

  • 关联 Issue / 需求:issue-3330
  • 本 PR 包含:main-owned fromDeviceLinkClient provenance(IPC/coordinator 到 send transaction)、active Orca fresh Codex Lead 判定、Codex exact no-rollout fallback 与 resume preparation fail-closed、相关 Desktop/maker-core Vitest 回归测试。
  • 明确不包含:独立 E2E runner/文档基建、本地 Worker 跨 provider 切模、服务端、远程 retry/timeout/reconnect recovery、远程协议大改。
  • 用户可见变化:远程 device-link 新建并开启 Orca 的 Codex Lead 首条消息正常启动新 thread 并接受首个 turn;历史会话继续 resume。
  • 是否存在 breaking change:无

UI 变化

  • 不涉及:仅修改 Desktop main/IPC、maker-core 与既有 Vitest 测试,没有 renderer UI 视觉或交互改动。
  • 引用的设计规范:不涉及 UI。

怎么验证的

自动验证

pnpm --filter desktop exec vitest run src/main/maker-ipc/__tests__/makerSendTransaction.test.ts src/main/maker-ipc/__tests__/agent-input-coordinator.test.ts src/main/__tests__/mobileClientPromptNote.test.ts
结果:480/480 通过(3 files)。

pnpm --filter @cindy/maker-core exec vitest run src/agents/codex/index.test.ts --testNamePattern "no rollout|resume preparation|fresh thread|fallback"
结果:25 通过,575 跳过。

pnpm --filter desktop run --if-present typecheck
结果:通过。

pnpm test:unit:related
结果:退出 1。lizi-mcps 与 orca-workflow 通过;Desktop 有 3 个既有 sidebarSettingsStore 测试失败;maker-core 有 1 个既有 Pi symlink 集成测试失败。相关本次改动 focused tests 通过,失败未包装为通过。

pnpm --filter @cindy/maker-core run build
结果:退出 2;maker-core 无 typecheck script,按可用 tsc --noEmit 执行。失败项为既有 claude MCP approval、Codex/PI、maker/session 测试类型错误,未见本次生产代码错误。

pnpm check:dco
结果:通过;单 commit signed off,author/committer/trailer 均为 fmfsaisai <fmfsaisai@gmail.com>。

git diff --check
结果:通过。

手工验证

2026-09-04,CN,隔离双 worktree/userData 的两实例人工验证;无仓库自动化 E2E runner:

  • main baseline:9222 controller + 9223 controlled;复现 S1→错误 resume(S1)→no-rollout。
  • candidate:9223 controlled + 9222 controller;正向 S1→S2,resumeCount=0,首条 turn accepted,无 error toast。
  • candidate historical regression:隔离 controlled app 重建后保留 S2,第二条消息 thread/resume(S2) 成功,无 S3、无错误。
  • candidate remote Lead without collaboration:PASS。
  • historical Worker resume:PASS。
  • 细粒度证据来自脱敏 DB/UI/log 里程碑;未记录正文、token 或完整 ID。

未执行的验证

negative live fault injection、SSH/local/evidence 矩阵、精确原始 RPC trace:BLOCKED/未覆盖;不声称完成真实 live fault injection 或 raw RPC 观测。手机端未额外适配验证;本 PR 未修改 device-link retry/timeout/reconnect recovery。

风险

风险分类

  • 权限 / 安全 / 用户数据(provenance 由 main IPC 盖章,renderer/wire 自填值被覆盖或删除;日志无正文/token/完整 ID)
  • 协议兼容(仅增加本地 main/coordinator 队列元数据,不改服务端 wire 协议)
  • 跨平台差异

影响与回滚

  • 影响范围:device-link + Codex + Orca Lead 的 active rehydrate fresh 分支;SSH、本机普通 Lead、Worker、非-Orca、evidence=true/undefined 与历史会话继续原有 resume。Codex 仅对精确 app-server -32600 canonical message、空 error.data 且 thread id 精确一致时 fallback;普通/包装 resume 错误不 fallback,preflight blocked 仍 fail-closed。
  • 回滚 / 降级方式:回滚本 commit 即恢复原有行为;不涉及数据库 migration 或用户数据格式变更。

Device-link / remote adaptation

本 PR 未修改 retry、timeout、reconnect recovery,因此故障半径三问不适用。device-link provenance 与 fresh Lead 行为已按人工双实例验证;SSH/手机没有额外 live 适配覆盖,另行跟踪即可。

提交前检查

  • 已 review 完整 diff
  • 每个 commit 都带 DCO 签名(git commit -s,见 DCO)
  • UI 改动已在「UI 变化」注明引用的设计规范章节(不涉及 UI 则跳过)
  • 未提交凭证、令牌或授权文件
  • 已补充必要文档(本次无新增 E2E 基建文档)
  • 已确认测试结果或说明未执行原因

后续工作

fault injection harness、exact raw RPC trace、完整 SSH/local/evidence 兼容矩阵另开 follow-up;不把未执行内容视为本 PR 的 PASS。

@fmfsaisai
fmfsaisai requested a review from a team as a code owner September 4, 2026 15:18
@greptile-apps

greptile-apps Bot commented Sep 4, 2026

Copy link
Copy Markdown

Greptile Summary

本 PR 为远程 device-link 新建 Codex Orca Lead 的首次发送补充 main-owned 来源标记,并依据 live Codex turn evidence 在 active rehydrate 时避免 resume 尚无 rollout 的初始 thread;Codex adapter 也增加了 no-rollout 后的一次 fresh start fallback。同时新增双实例 E2E runner、测试和操作文档。

  • device-link 来源从可信 IPC 入队边界随队列项传至发送事务。
  • Codex handle 暴露 thread 是否可能已有 rollout 的证据。
  • active Orca rehydrate 可清除已证明 fresh 的 DB resume id。
  • Codex resume 失败可在 no-rollout 情况下创建替代 thread。
  • 新增 CN 双实例 trace 校验与脱敏输出工具。

当前主要问题是 no-rollout 分类仍是宽泛字符串匹配,可能把其他历史 resume 错误错误降级为 fresh thread;此外 regression runner 可在未覆盖文档声明矩阵时返回成功。

Confidence Score: 4/5

该 PR 暂不宜合并,因为宽泛的 no-rollout 错误匹配可能让历史 Codex 会话错误启动新线程并失去上下文连续性。

device-link provenance 与 live rollout evidence 的主链路整体保持了可信边界和历史 resume 分支,但 Codex fallback 未实现其声明的精确错误分类;E2E regression runner 还可能在回归矩阵未完整执行时报告成功。

Files Needing Attention: packages/maker-core/src/agents/codex/index.ts, scripts/device-link-orca-e2e.mjs

Important Files Changed

Filename Overview
apps/desktop/src/main/maker-ipc/makerSendTransaction.ts 新增可信 device-link 队列来源标记,并在 active Codex Orca Lead rehydrate 时依据 live rollout evidence 决定是否丢弃 DB resume id。
apps/desktop/src/main/maker-ipc/agent-input-coordinator.ts 在内部队列 drain 时透传 device-link provenance,同时从对外投影中删除该 main-only 字段。
apps/desktop/src/main/maker-ipc/register.ts 在 enqueue 与 steer 两个可信 IPC 边界为 device-link 输入盖章,避免客户端伪造来源。
packages/maker-core/src/agents/codex/index.ts 抽取 fresh thread/start 并为 resume 增加 no-rollout fallback,但回退分类使用过宽的错误字符串子串匹配。
packages/maker-core/src/session.ts 将 Codex thread rollout evidence 从 provider handle 暴露给 desktop session transaction。
scripts/device-link-orca-e2e.mjs 新增双实例 CDP runner、trace 脱敏与场景断言,但 regression 的简化 events 输入可绕过完整场景矩阵。
docs/testing/device-link-orca-e2e.md 记录 CN 双实例启动、配对、场景 trace 合同及脱敏输出流程。

Sequence Diagram

sequenceDiagram
  participant C as Device-link Controller
  participant M as Desktop Main
  participant Q as Input Coordinator
  participant T as Send Transaction
  participant DB as Session DB
  participant X as Codex Adapter
  participant P as Codex Provider

  C->>M: input.enqueue
  M->>M: 校验调用来源并盖章 provenance
  M->>Q: 入队(携带 fromDeviceLinkClient)
  Q->>T: drain / sendToAgentAccepted
  T->>DB: reconcile resumeSessionId
  T->>T: 检查 Orca Lead 与 rollout evidence
  alt 已证明 fresh
    T->>T: 清除 resumeSessionId
    T->>X: bootstrap fresh session
    X->>P: thread/start
  else 保留历史身份
    T->>X: bootstrap resumed session
    X->>P: thread/resume
    alt 精确 no-rollout
      X->>P: thread/start fallback
    end
  end
  X->>P: 首次 turn
Loading
Prompt To Fix All With AI
### Issue 1
packages/maker-core/src/agents/codex/index.ts:5734
**回退条件匹配过宽**

这里并没有像注释所说的那样识别“精确的 provider 错误”,而是对整个包装后的错误字符串进行无边界的子串匹配。app-server 会把服务端的任意 `error.message` 原样拼入该字符串;如果其他 resume 错误的原因链或包装文本包含 `no rollout found`,历史会话就会被误判为全新线程并执行 `thread/start`,导致后续消息脱离原有历史上下文。请结合结构化错误码、错误数据和精确消息形状进行分类,而不是匹配任意子串。

### Issue 2
scripts/device-link-orca-e2e.mjs:224-225
**回归断言可被绕过**

只有提供非空 `cases` 对象时,runner 才要求 SSH、local、Worker、non-Orca、evidence true/unknown 和 retry 八组场景。否则,仅含一次 `thread/resume` 的普通 `events` trace 也会通过并被标记为 asserted,即使文档声明的回归矩阵根本没有执行。这会产生假阳性的验证结果;请始终要求完整场景集合,或将简化输入拆分为明确的较弱模式。

---

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

Reviews (1): Last reviewed commit: "fix(desktop): preserve fresh remote Orca..." | Re-trigger Greptile

Comment thread packages/maker-core/src/agents/codex/index.ts Outdated
Comment thread scripts/device-link-orca-e2e.mjs Outdated
@MagicLizi

Copy link
Copy Markdown
Contributor

@fmfsaisai 👋 这个 PR 还有 2 条 review conversation 没 resolve(packages/maker-core/src/agents/codex/index.ts / scripts/device-link-orca-e2e.mjs),auto-review 因此暂时跳过、没法继续审查 / 合并。

如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。

@MagicLizi MagicLizi added status:ci-running CI 还在跑(review-pr 自动维护,仅展示) touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) labels Sep 4, 2026
@fmfsaisai
fmfsaisai force-pushed the codex/issue-3330-remote-collab-start branch from 9388a42 to 6f3b7a7 Compare September 4, 2026 15:47
Signed-off-by: fmfsaisai <fmfsaisai@gmail.com>
@fmfsaisai
fmfsaisai force-pushed the codex/issue-3330-remote-collab-start branch from 6f3b7a7 to a81bab1 Compare September 4, 2026 16:14
@MagicLizi MagicLizi removed the status:ci-running CI 还在跑(review-pr 自动维护,仅展示) label Sep 4, 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.

独立审查(standard)通过:当前 head a81bab1 未发现 P0/P1。device-link 入队由 main 按 isDeviceLinkInvoke 盖章,wire 侧 sendOpts 已剥离;Orca Lead 仅在 fresh Codex 且无 rollout 时清 DB id;no-rollout fallback 走精确结构化错误。conversation 已 resolve。

@MagicLizi
MagicLizi merged commit 296e558 into main Sep 4, 2026
20 checks passed
@MagicLizi
MagicLizi deleted the codex/issue-3330-remote-collab-start branch September 4, 2026 17:43
@MagicLizi

Copy link
Copy Markdown
Contributor

远程 Orca Lead 这次终于不会把「刚建起来、还没 rollout」的会话当成旧线程硬 resume 了——device-link 盖章也收在 main 侧,控制端没法自己报身份。谢谢。

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

Labels

touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants