Skip to content

fix(desktop): 后台落库的错误提示关闭后正确标记已处置 - #6251

Merged
MagicLizi merged 8 commits into
mainfrom
fix/orca-worker-error-dismiss
Oct 17, 2026
Merged

MagicLizi merged 8 commits into
mainfrom
fix/orca-worker-error-dismiss

Conversation

@fmfsaisai

@fmfsaisai fmfsaisai commented Oct 16, 2026 •

Copy link
Copy Markdown
Collaborator

这次改了什么

摘要

现象:任务出错后,点输入框上方错误提示的「关闭」,切走再切回或刷新,错误提示又出现了;数据库里那条错误行没有被标记 dismissed。协同模式下的 Worker 最常碰到(Worker 出错时用户通常停在 Lead 视图),普通任务在后台出错同样会中招,device-link 远程任务也一样。

根因(apps/desktop/src/renderer/lib/makerChatStore.ts):

  1. 错误落库后,applyErrorPersistedDirtySignal 在任务不在视图时(或在视图时延到 leaveView)把 live 横幅交给历史错误卡显示,并清空 errorPersistId(这条横幅对应的错误行 id)。
  2. main 的输入投影仍带着这次错误(还没人处置),之后任何一次投影(打开任务、队列变化、协同派活等)都会经 applyInputProjection 把 live 横幅重新点亮——此时它没有对应的错误行 id。
  3. live 横幅与尾部错误提示互斥显示;点关闭走 clearError → disposeLiveErrorPersist,既无 errorPersistId 也无在途补写,于是只清界面、不写 dismissed。刷新后尾部错误行仍未处置,尾部错误提示复现。

修复:在 disposeLiveErrorPersist 里补一个兜底(persistedTailRowIdForLiveError):没有绑定、也没有在途补写时,按已加载历史的最后一条认领——它是未处置的 role='error' 行,且文案与 live 横幅一致,才标记 dismissed;对不上(历史未加载、尾部不是 error、文案不同)就只清界面,退回修复前的行为,不会标到无关行。

  • 文案口径:把 error 事件写横幅的规则抽成 liveErrorBannerText(reducer 改为调用它,行为不变),比较时用行的 message / reason 重算横幅文案;事件附带的「(HTTP nnn)」后缀不落库,比较前去掉。投影点亮的横幅是 coordinator 记录的同一条 message 原文,直接等于行 message。
  • 三个调用方一起获得兜底:clearError、retryLastError、continueAfterSilentStop,与原来「点重试或关闭即算已处置」同义。
  • 远程任务:兜底拿到 clientId 后照旧走 dismissErrorTailMessage → dismissErrorMessageFor,按来源设备走隧道写,一并修好。
  • 关闭的错误还没落库时(人工 review P1):旧错误 A 已交给历史后,投影点亮同文案的新错误 B(无绑定),B 落库前用户关闭——兜底只能看到尾部的 A。为此关闭 / 重试走兜底时登记一个意图(横幅文案 + 当时的队列快照),之后第一条不属于当前横幅的错误落库信号到达时,读权威历史(本机 messageService.list / 远程隧道 local-db:messages:list)找到该行,未处置且文案一致就标 dismissed,用一次即作废。A 被顺带标记没有可见影响:dismissed 只对尾部错误行生效(MessageStream 尾行、CCAgentSessionView.errorTailMsg、sessionActiveTurn 尾行告警查询)。
  • 重亮横幅不抢绑定(review):关闭请求返回前,在途的同文案投影可能把刚关掉的横幅重新点亮;意图有效期内,落库信号不绑到这种同文案横幅(disposedIntentCoversLiveError),交给补标处理,避免横幅随后被清掉而该行仍未处置。
  • 落库失败回滚(review P2):markLiveErrorRowDisposed 在 dismiss 写入失败时把 disposedErrorPersistId 清回 null(errorDismissed 原本已回滚),尾部错误提示重新出现、可再关一次;有绑定 / 兜底 / 补标三处调用一并受益。
  • 意图作废:新一轮启动、队列出现关闭时没有的新项(覆盖 scheduler / IM / 其它设备入队与发送前失败)、本窗口发送 / 插话被受理、UI 触发(发送在过完本端拒绝点、交给 coordinator / 远程 outbox 之前作废;本机插话在主进程受理或物化进队列后作废、远程插话在 outbox 收下时作废;被拒的发送 / 插话不作废,本端乐观排进队列、主进程还没收下的项也不算队列增长,review P2 / P1)、投影出现文案不同的新错误、/clear / 删除 / 归档 / LRU 驱逐。不设时间上限:新错误都要经过上面某一条,远程落库慢时也不该漏标。

为什么不在交接时保留绑定(前两版的做法,已撤回):投影只有错误文案、没有错误代次。远程断线期间漏收的新一轮、scheduler 发送前失败直接把错误换掉等情况下,新错误可能不经过新一轮启动就顶替旧错误,保留的绑定会被错用,关闭标掉的是旧行(review 两条 P1)。改为关闭那一刻按数据库里真实的尾部行认领,不依赖长期保留的状态。交接逻辑恢复为修复前写法。

变更类型

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

范围

  • 关联 Issue / 需求:feat(desktop): Orca Worker 出错和等确认汇总到 Lead 行并单独通知 #6247 实测时发现(协同面板里关闭 Worker 错误提示后又出现,Lead 行红点随之回来)。与 feat(desktop): Orca Worker 出错和等确认汇总到 Lead 行并单独通知 #6247 无代码依赖,可独立合入。
  • 本 PR 包含:makerChatStore.ts(liveErrorBannerText 抽取、disposeLiveErrorPersist 兜底与 persistedTailRowIdForLiveError / markLiveErrorRowDisposed、关闭意图 _disposedLiveErrorIntents 与 claimDisposedLiveErrorRow 补标及作废);makerChatStoreTextDeltaBatching.test.ts、deviceLinkControllerScenarios.test.ts(回归用例)。
  • 明确不包含:
    • 已知另一问题:Worker 首轮失败(就绪占位回合 + 派活回合)在数据库里落了两条错误行,普通任务同场景只有一条,会显示重复错误卡。与本问题无关,后续单独排查。
  • 用户可见变化:后台出错(或出错后离开过)的任务,关闭错误提示后不再在切换 / 刷新后复现;对所有任务生效(本机与 device-link 远程)。
  • 是否存在 breaking change:无

UI 变化

不涉及:纯状态逻辑修复(错误提示关闭时的落库标记),无视觉、交互或文案变化。

  • 引用的设计规范:不涉及:纯状态逻辑修复(错误提示关闭时的落库标记),无视觉、交互或文案变化

怎么验证的

自动验证

pnpm --filter desktop run --if-present typecheck
结果:EXIT 0

pnpm test:unit:related
结果:PASS apps/desktop unit

pnpm check:dco
结果:通过(8 个 commit)

makerChatStoreTextDeltaBatching.test.ts + deviceLinkControllerScenarios.test.ts
结果:304 条通过;关掉兜底后 6 条核心用例失败;关掉补标后本机与远程「B 落库前关闭」用例失败;分别关掉三种作废后对应用例失败;修复前「已有暂停队列时发送被拒」「插话被主进程拒绝且未物化」两条用例失败
新增 / 调整用例:
- 后台落库后被投影重新点亮,关闭标记尾部同一行(main 落库与 renderer 延迟落库各一条)
- 看过后离开视图、再被投影点亮,关闭标记同一行
- 事件带「(HTTP nnn)」后缀,仍能认出同一行
- scheduler 发送前失败用 B 换掉 A(无 turn-start / 无 error:null 投影):B 已落库只标 B 不标 A;B 未落库且文案不同则不标 A
- 历史未加载 / 尾部不是 error / 尾部已处置:都不标
- device-link 远程重连带回 B(FakeHost,走真实 local-db:messages:list 链路):尾部已是 B 只 dismiss B(带 deviceId);尾部仍是文案不同的 A 则不 dismiss
- 前两版「保留绑定」相关的 3 条用例随做法撤回而删除;交接时 errorPersistId 断言恢复为 null
- 人工 review P1 时序(本机 + FakeHost 远程):A 已交给历史 → 投影点亮同文案 B → B 落库前关闭(A 被标)→ B 落库信号到达 → B 被标 dismissed → 历史重载后尾部不再出提示;之后再有行落库不再读、不再标
- 关闭后同文案投影重亮横幅:落库信号不绑定、该行被补标,投影清空后重载尾部无提示(去掉修复时失败)
- 发送 / 插话未被受理(sendMessage 被 beforeEnqueue 拒、已有暂停队列时 sendMessage 被 beforeEnqueue 拒、steerMessage 被在飞插话 / beforeEnqueue 拒、steerMessage 被主进程拒绝且未物化进队列):意图保留、同文案行落库后仍补标;发送被接受(直接派发、队列不增长)、插话被主进程受理:意图作废、不再补标
- dismiss 落库失败:`disposedErrorPersistId` 清回 null、尾部行仍未处置(去掉修复时失败)
- 意图作废(it.each):新一轮启动 / 投影带来文案不同的新错误 / 队列出现新项 → 之后同文案行落库不再补标

手工验证

本 worktree 独立 dev app(macOS,企业 SSO 账号,热更新到本版代码)。用本机假 Anthropic 接口(列模型正常、发消息一律 401 authentication_error)作自定义供应商,稳定造出由 main 落库的终态错误;用 window.electronAPI.localDb.messages.list(<sessionId>) 核对错误行 dismissed。

  • 对照组(修复前代码):普通任务后台出错 → 回来点关闭 → 错误行无 dismissed → 切走切回出现尾部错误提示,复现成功。
  • Worker 严格后台出错(Worker 首次打开在出错之后)→ 关闭:错误行 dismissed: true,重载不复现。
  • 看着 Worker 出错 → 切走 → 回来关闭:回来时为 live 横幅;关闭后 dismissed: true,切换与重载不复现。
  • 普通任务后台出错 → 回来关闭:回来时为 live 横幅;关闭后 dismissed: true,切换与重载不复现。
  • 普通任务一直看着出错 → 关闭:dismissed: true,原有路径不受影响。
  • 不串行:第一次出错 A 不关闭、离开再回来,再发消息出错 B 后关闭 → 只有 B 被标记,A 未被标记。
  • 第三轮后回归「普通任务后台出错 → 回来关闭」:dismissed: true,切换与重载不复现。

未执行的验证

  • Cindy AI 凭据失效(401 由 renderer 延迟补写错误行)路径未实机验证:Cindy AI 当前不再返回 401,仅单测覆盖。
  • device-link 远程重连带回新错误:仅 FakeHost 单测,未在两台电脑上实测。
  • scheduler 发送前失败换错误:仅单测。
  • 「同文案 B 落库前关闭」时序:本机 fake provider 的错误事件自带 persistId 会直接绑定、走不到兜底,只有漏收事件、仅靠投影点亮时(主要是远程重连)才出现,且落库信号几乎即时到达,实机无法稳定制造,以单测(本机 + 远程)为准。
  • 本窗口 sendMessage / steerMessage / sendUiTrigger 的主动作废未单独写用例,由「队列出现新项」「新一轮启动」间接覆盖。
  • 重试 / 继续发起的新一轮会作废关闭意图(review 曾建议保留,评估后未采纳:保留会把重试自身同文案的新错误错标为已处置;重试 / 继续推进历史,原错误行不再是尾部)。
  • 远程任务在 relay 重连窗口(session→device 映射暂时清空、粘滞归属仍在)内关闭错误:补标读历史与 dismiss 写入沿用现有 listMessagesFor / dismissErrorMessageFor 的易失映射路由(与现有所有错误关闭写入一致),可能漏标,关掉的错误重新打开后复现;读不到时不写任何行,不会标错。按粘滞归属统一路由所有错误关闭的读写另开处理(review 曾建议本 PR 内修,评估后未采纳:只改本路径会与其余关闭路径不一致、扩大改动面)。
  • Worker 严格后台场景关闭那一刻的横幅类型未截图(数据库与重载结果已核对)。
  • Windows 未实测:只改 renderer 状态逻辑,无平台分支。

风险

风险分类

  • 无已知风险
  • SQLite / migration
  • system prompt
  • 协议兼容
  • 权限 / 安全 / 用户数据
  • 存量插件兼容(批准状态 / 指纹 / manifest 校验 / 安装布局 / 包格式)
  • 原生层 / fingerprint / OTA
  • 跨平台差异
  • 其他:关闭 / 重试错误提示时可能额外写一次 dismiss(仅在尾部行与横幅文案一致时)

影响与回滚

  • 影响范围:renderer 关闭 / 重试 live 错误横幅时的落库标记。只在「无绑定、无在途补写、历史已加载、尾部是未处置 error 行且文案一致」时新增一次 dismiss 写入;其余情况行为与修复前完全相同。关闭后在意图作废前落库的同文案错误会被补标(它正是用户刚关掉的那种错误);同文案旧尾行被顺带标记不在尾部后无可见影响。补标需要额外读一次最新一页历史(每次关闭最多一次)。
  • 回滚 / 降级方式:直接 revert 本 PR 即恢复原状(无数据迁移)。

提交前检查

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

错误落库时任务不在视图里(或之后离开过视图),live 横幅转为历史错误卡时
连 errorPersistId 一起清掉了;main 输入投影随后把同一错误重新点亮,横幅
已没有对应的错误行 id,点关闭只清界面、不写 dismissed,切走切回或刷新后
尾部错误提示又出现。Orca Worker 出错时用户多停在 Lead 视图,最常碰到;
普通任务后台出错同样中招。

hand-off 到历史时保留 errorPersistId,被重新点亮的横幅沿用同一行 id,
关闭即可标记 dismissed。绑定照旧由新一轮启动、投影清空错误或新的
persistId 收掉;不改 main、不改落库,不产生新的错误行。

Signed-off-by: fmfsaisai <fmfsaisai@gmail.com>
@fmfsaisai
fmfsaisai requested a review from a team as a code owner October 16, 2026 14:12
@chatgpt-codex-connector

chatgpt-codex-connector Bot commented Oct 16, 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-17T14:36:25.966014Z 16ef75c Manual request
ℹ️ 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: 052f7c4d6e

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread apps/desktop/src/renderer/lib/makerChatStore.ts Outdated
@greptile-apps

greptile-apps Bot commented Oct 16, 2026 •

Copy link
Copy Markdown

RetriggerView in GreptileConfidence Score: 5/5

[Medium impact] 本次修改未发现阻碍合并的问题。

Summary

本 PR 修复错误横幅关闭后,错误行未标记已处置、刷新后再次出现的问题。

  • Closing a background error now dismisses its matching saved row.

Diagram

%%{init: {'theme': 'neutral'}}%%
flowchart TD
  A[用户关闭错误横幅] --> B{已有绑定或在途补写?}
  B -->|有| C[标记对应错误行已处置]
  B -->|无| D[匹配历史尾部错误并记录关闭意图]
  D --> E{后续发生什么?}
  E -->|对应错误落库| F[读取历史并匹配文案后补标]
  E -->|发送被拒| G[保留关闭意图]
  E -->|输入被受理或新一轮启动| H[作废关闭意图]
Loading

Reviews (6) · Last reviewed commit: "fix(desktop): 发送/插话未被受理时不作废关闭错误的待补标意图" · Reviewed by Greptile

Comment thread apps/desktop/src/renderer/__tests__/makerChatStoreTextDeltaBatching.test.ts Outdated
device-link 控制端断线期间会漏收被控端的新一轮启动、新错误与落库信号,
重连投影只带错误文案;保留旧 errorPersistId 会让关闭新错误时标记旧行。
远程任务交给历史时照旧清掉绑定(与修复前一致),本机任务仍保留。
远程判定取会话来源设备的粘滞值,覆盖 relay 重连时来源映射暂空的窗口。

补测试:交给历史后保留的旧绑定在新一轮启动时清掉;远程任务重连投影
带来的新错误不沿用旧行;修正一条标题与内容不符的用例。

Signed-off-by: fmfsaisai <fmfsaisai@gmail.com>

@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: 18981b7d8a

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread apps/desktop/src/renderer/lib/makerChatStore.ts Outdated
前两版在交给历史时保留 errorPersistId,但投影只有错误文案、没有错误
代次:远程断线期间漏收的新一轮、scheduler 发送前失败直接换掉错误等,
新错误可能不经过新一轮启动就顶替旧错误,保留的绑定会被错用,关闭标掉
的是旧行(review P1 ×2)。

改为不保留绑定(交接逻辑恢复为修复前),在 disposeLiveErrorPersist
没有绑定、也没有在途补写时,按已加载历史的最后一条认领:未处置的
error 行且文案与 live 横幅一致才标记 dismissed;对不上就只清界面。
文案口径抽成 liveErrorBannerText,与 error 事件写横幅同源,HTTP 状态
后缀不落库故比较前去掉。远程任务经 dismissErrorMessageFor 走隧道写,
一并修好。

Signed-off-by: fmfsaisai <fmfsaisai@gmail.com>
@fmfsaisai

Copy link
Copy Markdown
Collaborator Author

@codex review

@fmfsaisai

Copy link
Copy Markdown
Collaborator Author

@greptileai review

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Delightful!

Reviewed commit: 993de49fff

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

@MagicLizi MagicLizi added status:ci-failed CI 失败(review-pr 自动维护,仅展示) touches:product-ui 改动碰到产品 / UI 面(review-pr 自动维护,仅展示) and removed status:ci-failed CI 失败(review-pr 自动维护,仅展示) labels Oct 16, 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.

复审发现 1 条 P1,需修复后再合并:

  • apps/desktop/src/renderer/lib/makerChatStore.ts:15849-15867:当前兜底只按“已加载历史的最后一条 error 行 + 文案匹配”来认领落库行。若旧错误 A 已交给历史,随后新错误 B 与 A 的 message/reason 相同,且 B 的持久化通知尚未到达,用户关闭 B 时会把 A 标记为 dismissed;B 随后落库但未被标记,刷新后仍会再次出现。PR 描述已承认这个边界,但用户可见结果并不等价。请改为使用明确的错误代次/行身份,或等匹配的 B 完成落库后再执行 dismiss,并补覆盖该时序的回归测试。

当前 CI 已通过,现有讨论已处理;修复后请重新请求 review。

review P1:旧错误 A 已交给历史后,投影点亮同文案的新错误 B(无绑定),
B 落库前用户关闭,兜底只能看到尾部的 A,B 落库后未处置,刷新复现。

关闭/重试走兜底时登记意图(横幅文案 + 当时的队列快照);之后第一条
不属于当前横幅的错误落库信号到达时,读权威历史找到该行,未处置且
文案一致就标 dismissed(远程经隧道写),用一次即作废。新一轮启动、
新队列项、本窗口发送/插话/UI 触发、投影出现文案不同的新错误、
/clear/删除/归档/驱逐时作废。有绑定或在途补写的路径不变。

Signed-off-by: fmfsaisai <fmfsaisai@gmail.com>
@fmfsaisai

Copy link
Copy Markdown
Collaborator Author

@MagicLizi 感谢复审,P1 已在 6ecf389 处理,采用「等匹配的 B 完成落库后再执行 dismiss」(仅 renderer,不改 main / 投影 / device-link 协议):

  • 关闭 / 重试走兜底(无绑定、无在途补写)时,照旧标记尾部同文案行,同时登记一个关闭意图(横幅文案 + 当时的队列快照)。
  • 之后第一条不属于当前横幅的错误落库信号到达时(applyErrorPersistedDirtySignal → claimDisposedLiveErrorRow),读权威历史(本机 messageService.list / 远程隧道 local-db:messages:list)按 clientId 找到该行,未处置且文案一致就标 dismissed,用一次即作废。你描述的时序里 A 先被标、B 落库后再被标,刷新后不再出现;A 不在尾部后 dismissed 无可见影响(只对尾部错误行生效)。
  • 意图作废:新一轮启动、队列出现关闭时没有的新项、本窗口发送 / 插话 / UI 触发、投影出现文案不同的新错误、/clear / 删除 / 归档 / 驱逐,避免误标后来真正的新错误。
  • 回归测试:makerChatStoreTextDeltaBatching.test.ts 新增该时序用例(A 已交给历史 → 投影点亮同文案 B → B 落库前关闭 → B 落库 → B 被标、重载不出提示)与三种作废用例;deviceLinkControllerScenarios.test.ts 新增远程同时序(经隧道 dismiss err-a 后再 dismiss err-b)。去掉补标或任一作废逻辑时对应用例失败。

PR 描述的修复、测试、未验证项与风险已同步更新,麻烦再看一下。

@fmfsaisai
fmfsaisai requested a review from MagicLizi October 17, 2026 13:05
@fmfsaisai

Copy link
Copy Markdown
Collaborator Author

@greptileai review

@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: 6ecf389293

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread apps/desktop/src/renderer/lib/makerChatStore.ts
Comment thread apps/desktop/src/renderer/lib/makerChatStore.ts
dismissErrorTailMessage 失败时只回滚 errorDismissed,disposedErrorPersistId 仍让尾部错误提示被跳过,用户无处再关、重启后复现(review P2)。失败且标记仍是这一行时清回 null,尾部提示重新出现;会话已清掉或已换行时不动。

Signed-off-by: fmfsaisai <fmfsaisai@gmail.com>

@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: 4e998aad66

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread apps/desktop/src/renderer/lib/makerChatStore.ts
关闭请求返回前,在途的同文案投影会把刚关掉的横幅重新点亮;落库信号若绑到它就走不到补标,横幅随后被清掉而该行仍未处置(review)。意图有效期内同文案横幅只可能是重亮,此时不绑定,交给 claimDisposedLiveErrorRow 补标。

Signed-off-by: fmfsaisai <fmfsaisai@gmail.com>
@fmfsaisai

Copy link
Copy Markdown
Collaborator Author

@greptileai review

@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: 2f90bc63cb

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread apps/desktop/src/renderer/lib/makerChatStore.ts Outdated
sendMessage / steerMessage / sendUiTrigger 原在入口就作废意图,随后若被 remoteClearInFlight、远程 scope、canStartComposerSteer、beforeEnqueue 或 Agent 切换在途拒绝,不产生新一轮却已丢了意图,关掉的错误落库后补标不了(review P2)。改到各 core 过完本端拒绝点、确定交给 coordinator / 远程 outbox 的位置再作废;仍在 enqueue 之前,避免直接派发的同文案新错误先落库被错标。

Signed-off-by: fmfsaisai <fmfsaisai@gmail.com>

@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: 419e5e5185

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread apps/desktop/src/renderer/lib/makerChatStore.ts
@MagicLizi MagicLizi added the status:awaiting-bot-review 等外部审查机器人表态(review-pr 自动维护,仅展示) label Oct 17, 2026
@fmfsaisai

Copy link
Copy Markdown
Collaborator Author

@codex review

@fmfsaisai

Copy link
Copy Markdown
Collaborator Author

@greptileai review

@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: 419e5e5185

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread apps/desktop/src/renderer/lib/makerChatStore.ts Outdated
Comment thread apps/desktop/src/renderer/lib/makerChatStore.ts
@MagicLizi MagicLizi added status:awaiting-author 等作者修改(review-pr 自动维护,仅展示) and removed status:awaiting-bot-review 等外部审查机器人表态(review-pr 自动维护,仅展示) labels Oct 17, 2026
- 本端乐观排进队列、主进程还没收下的项不算「队列增长」,已有暂停队列时发送被
  beforeEnqueue 拒绝也保留意图(Greptile review)。
- 本机插话改为主进程受理或物化进队列后才作废意图,主进程拒绝且未物化时保留;
  远程插话仍在本端 outbox 收下时作废(Codex review)。

Signed-off-by: fmfsaisai <fmfsaisai@gmail.com>
@fmfsaisai

Copy link
Copy Markdown
Collaborator Author

@codex review

@fmfsaisai

Copy link
Copy Markdown
Collaborator Author

@greptileai review

@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: 16ef75ca40

ℹ️ About Codex in GitHub

Codex has been enabled to automatically 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 👍.

When you sign up for Codex through ChatGPT, Codex can also answer questions or update the PR, like "@codex address that feedback".

Comment thread apps/desktop/src/renderer/lib/makerChatStore.ts
@MagicLizi MagicLizi added touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) and removed status:awaiting-author 等作者修改(review-pr 自动维护,仅展示) labels Oct 17, 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 #6251 审查报告(head 16ef75c / base 3110cfd / main)

改动面:apps/desktop/src/renderer/lib/makerChatStore.ts(+217/-24)、
apps/desktop/src/renderer/__tests__/makerChatStoreTextDeltaBatching.test.ts(+483)、
apps/desktop/src/renderer/__tests__/deviceLinkControllerScenarios.test.ts(+86)。

Findings

  • 无 P0/P1。
  • 未阻断观察(P2 级,不作为打回依据,仅记录):
    1. claimDisposedLiveErrorRow 一次性消费关闭意图:若在补标目标落库前先读到另一条
      error 行(文案对不上),意图即作废,真正那一行可能漏标。属「用一次即作废」的既定
      取舍(makerChatStore.ts claimDisposedLiveErrorRow 注释与 PR 描述均已写明)。
    2. 意图有效期内落库的同文案新错误会被补标(用户刚关掉的就是这种错误);该行的 live
      横幅仍会显示,历史错误卡不受 dismissed 影响,可见影响有限。PR 描述「影响与回滚」
      已如实写明。
    3. relay 重连窗口(session→device 映射暂空)内关闭错误,补标读写沿用现有
      listMessagesFor / dismissErrorMessageFor 易失映射路由,可能漏标但不会标错行;
      与其余错误关闭路径口径一致,PR 已注明另开处理。

Rule coverage

按 rule-map 命中路径读取并逐项核对(只对照本次新增/修改代码,不追溯历史代码):

  • docs/dev-rules/development-workflow.md(P0/P1/P2 口径、PR 模板事实):Description 三大段
    (这次改了什么 / 怎么验证的 / 风险)齐全、与 diff 一致;「变更类型=fix」「范围」列明包含与
    明确不包含项(Worker 双错误行为已知问题另开);风险段写明额外 dismiss 写入与回滚方式。
    验证命令与本次实测一致。严重度按 §3 口径判定,未发现 P0/P1。
  • docs/dev-rules/engineering-conventions.md Review 清单:
    1. 无裸 console.log,日志走 log.warn;2) 无新/改 IPC handler;3) 无 main 侧逻辑,
      renderer 状态逻辑随 483 行回归用例覆盖主路径+失败路径(dismiss 落库失败回滚、认领读取失败
      吞错告警);4) 新测试全部走 mock/FakeHost,无外网、无固定端口、无真实子进程;5) 无路径/
      子进程/FS/快捷键改动,无平台分支,PR 已注明 Windows 未实测及理由;6) UI 文案无新增:
      liveErrorBannerText 只是把既有 reason→i18n 映射抽成函数(empty-response/turn-failed/
      silent-stop-exhausted/codex-auto-review-unavailable 四个既有 key,行为不变);
      pnpm check:i18n、pnpm check:i18n-glossary 通过(存量告警与本 PR 无关);7) 新增函数均带
      职责注释;8) 无动画改动。
  • docs/dev-rules/electron-security-and-process-boundaries.md §8 清单:Renderer 未获得新特权
    数据/能力(仅 store 内状态与既有 IPC 读写);无 preload/BrowserWindow/WebView/IPC/CSP/Fuses
    改动;无新增安全边界。落库读写复用既有 listMessagesFor、dismissErrorTailMessage→
    dismissErrorMessageFor(远程走既有 local-db:messages:* 隧道 allowlist 通道),无新 wire
    protocol。
  • docs/dev-rules/remote-and-mobile-adaptation.md Review 清单:会话数据读写经既有远程通道
    (local-db:messages:list / local-db:messages:dismiss-error),SSH 远程不落本机 fs;
    无新 IPC/push、无 allowlist 变更;不触碰 device-link 重试/超时/断链恢复路径(重连窗口路由
    为既有行为,PR 已说明并注明另开处理);移动端不消费 makerChatStore,无需适配,理由已写在
    描述与未执行验证中。
  • docs/dev-rules/credentials-and-local-storage.md 清单:无新增落盘/临时文件/fixture,仅复用
    既有 dismissed 字段;测试无凭证;不涉及秘密外泄边界。
  • DESIGN.md / docs/design-rules/cindy-design-system.md:无视觉、交互、布局或文案变化
    (横幅文案函数抽取前后逐字符等价),无硬编码颜色/自造组件问题;uiEvidenceMissing(store
    文件被标为 UI 路径但描述未附截图)按非阻断规则记入 warnings,不打回。
  • rule-map 固定问题:1) 单一目的(关闭错误提示后正确标记 dismissed),描述与 diff/测试一致;
    2) 共享状态读方已核(disposedErrorPersistId 三个消费方、errorDismissed 回滚、尾部告警
    查询不受非尾行标记影响);3) 无权限/凭证/跨平台边界变化;4) 未放松安全边界、无新依赖、无新
    数据流向(远程写仍走既有 dismiss 通道);5) 测试覆盖本机/远程(FakeHost)、成功/失败回滚、
    时序边界;6) 未把流程塞进 Core;7) 无 UI 证据需核对;8) 不涉及 mobile 原生配置;9) 无 P0/P1。

关键代码核验(逐处对照 diff 与调用方):

  • disposeLiveErrorPersist 兜底:仅在「无绑定、无在途补写、state.error 存在」时按已加载历史
    尾行认领(persistedTailRowIdForLiveError + isUndisposedErrorRowFor:role=error、未处置、
    文案匹配才标),对不上只清界面,不会标到无关行;同时登记关闭意图供补标。
  • markLiveErrorRowDisposed:dismiss 写入失败时把 disposedErrorPersistId 清回
    null(dismissErrorTailMessage 已回滚 errorDismissed),尾部提示可再次关闭——三处调用方
    (绑定 / 兜底 / 补标)一致受益。
  • applyErrorPersistedDirtySignal:补标只走「persistId 不属于当前横幅」分支,当前横幅自己的
    行不会被自动标掉;disposedIntentCoversLiveError(双向按行口径比文案)阻止关闭后重亮横幅
    抢绑定,交给补标——对应已 Resolve 的 P1 thread(PRRT_kwDOTgdRUs6tgXs2)
    的要求,最终 diff 已落实。
  • 意图作废点与描述一致:新一轮启动 / 队列新增真实项(isPendingEnqueue !== true,本端乐观项
    不算,对应 P1 thread PRRT_kwDOTgdRUs6tg7_9 的要求,16ef75ca 落实)/ 发送、插话被受理、UI
    触发 / 投影带来文案不同的新错误 / /clear、删除、归档、LRU 驱逐(bumpRendererClearGeneration);
    被拒的发送/插话不作废。
  • claimDisposedLiveErrorRow:按 persistId 读权威历史(本机 messageService.list / 远程隧道
    local-db:messages:list),确认为未处置 error 行且文案一致才补标;读失败/读不到不写任何行。
  • 测试为真实断言(含「去掉修复时失败」的反证用例),304 条通过。

11 条历史 review thread(含 4 条 P1)全部 isResolved=true,P1 要求在最终 diff 中逐条可验
(保留绑定做法已撤回、关闭意图覆盖重亮横幅、乐观队列项不作废意图);两条评估后未采纳的 P2
(重试保留意图、粘滞归属路由)在 PR 描述中给了不采纳理由,按 P2 不阻断。

Verification

  • pnpm install --frozen-lockfile --prefer-offline:worktree 初始无 node_modules,按
    docs/dev-rules/environment-setup.md 安装(postinstall 补齐 Electron 二进制),退出 0。
  • pnpm --filter desktop run --if-present typecheck:EXIT 0(tsc --noEmit)。
  • pnpm test:unit:related:PASS apps/desktop unit(103.4s;vitest related 命中
    deviceLinkControllerScenarios.test.ts、makerChatStoreTextDeltaBatching.test.ts、
    makerChatStore.ts)。
  • pnpm check:dco:通过,8 个 commit 全部 Signed-off-by(3110cfde..16ef75c)。
  • pnpm check:i18n / pnpm check:i18n-glossary:通过(1317/18 处均为存量告警,无新增违规)。
  • 未执行:heavy 档恶意代码/数据外发专项与 security-scan.mjs(本 PR 为 standard 档,按分档
    规则不跑;security 门 scanned=true、hardHits/softHits 均为空);PR 描述中的实机手工验证
    (假 Anthropic 接口造错、localDb.messages.list 核对 dismissed)未由本审查复跑,作为作者
    自证记录,不计为已验证项。

Intent alignment

  • 描述来源:PR #6251 当前 body(读取时间 2026-10-17T16:32Z)+ 关联 issue #6247(协同面板关闭
    Worker 错误提示后复现,声明无代码依赖、可独立合入)。原目标:任务错误提示被「关闭」后要把
    对应错误行标记 dismissed,切走切回 / 刷新不再复现(本机、Orca Worker 后台出错、device-link
    远程任务同一口径)。
  • 初始实现:052f7c4d6e3d169e13e9f3328ef59f15269c47dc(2026-10-16,已实际读取该 revision 的
    makerChatStore.ts:handOffPersistedLiveErrorToHistory 在交给历史时保留 errorPersistId
    绑定,配合投影沿用绑定)。初始基线即本 PR base 的祖先,历史未改写,8 个 commit 时间线完整。
  • 待合并 head:16ef75ca40cc53ab3ffc899d3b7cf202b0fd02ef(diffHash
    f7f97afcd8d105131ad901582c2ada34585789dd48560d63a1dfab0e924688ee)。
原目标/初始行为 最终行为与影响 代码/提交证据 变化依据
关闭后台落库的错误提示后标记 dismissed,不复现 保留:关闭/重试按绑定行或已加载历史尾行认领后写 dismissed,远程走隧道写被控端 disposeLiveErrorPersist / persistedTailRowIdForLiveError(makerChatStore.ts:15851-15922) 同一目标,实现加强
初始:交接历史时保留 errorPersistId 绑定 撤回:绑定随横幅清掉,改为关闭时按真实尾行认领 18981b7→993de49f;persistedTailRowIdForLiveError 注释 两条已 Resolve 的 P1 thread(远程断线新错误顶替、scheduler 发送前失败换错)证明保留绑定会被错用到新错误、标掉旧行——缺陷证据充分,属目标内实现替换
(修复过程中新增)关闭时行尚未落库的时序 关闭意图 + 落库信号补标,用一次即作废 _disposedLiveErrorIntents / claimDisposedLiveErrorRow(makerChatStore.ts:15932-16001) 人工 review P1 时序(A 已交历史→投影点亮同文案 B→B 落库前关闭);仍服务同一原目标
(review 收紧)被拒发送/插话、重亮横幅不丢意图 16ef75c/2f90bc63/419e5e51 收紧作废与绑定条件 invalidateDisposedLiveErrorIntentOnTransition、disposedIntentCoversLiveError 已 Resolve 的 P1 thread 要求,最终 diff 已落实
  • 结论:一致。三版实现(保留绑定 → 尾部兜底 → 补标意图)都围绕「关闭即处置、不复现」这一
    原目标;撤回保留绑定有明确缺陷证据(会把新错误的行标成已处置 = 误标数据),不是无关扩范围;
    新增机制全部收敛在 renderer store 内,无功能外扩、无协议/权限/持久化边界变化。多轮 Codex /
    Greptile 意见与修复未改变用户原目标;两条评估后未采纳的 P2 建议有书面理由,属实现取舍,
    不构成原意偏离。核心目标可核实(本机/远程回归用例 + 反证用例),无疑点需要用户裁定。

Overall — pass

没有 P0/P1;原意一致性复核结论为「一致」,可以进入 guarded Approve 与合并。

@MagicLizi
MagicLizi merged commit 54f8ac6 into main Oct 17, 2026
26 of 27 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 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants