Skip to content

fix(desktop): stabilize Windows root test gates - #2796

Open
zyaoii wants to merge 4 commits into
makecindy:mainfrom
zyaoii:codex/fix-windows-root-gate
Open

fix(desktop): stabilize Windows root test gates#2796
zyaoii wants to merge 4 commits into
makecindy:mainfrom
zyaoii:codex/fix-windows-root-gate

Conversation

@zyaoii

@zyaoii zyaoii commented Aug 15, 2026

Copy link
Copy Markdown
Contributor

这次改了什么

摘要

修复当前主干上会让无关 PR 的 Windows 根单测门禁不稳定的五类问题:

  • devCliFlags 的不可探测路径用例不再依赖宿主是否真实存在 C:\AppData,同时保持“同父目录、仅大小写不同”的回归约束。
  • strict security-boundary lock 在最终陈旧锁接管后允许一次有界的瞬时发布重试;第二次 busy 仍 fail closed。
  • Python 协议集成测试会枚举 Windows PATH 候选并要求 Python 3,不再把排在前面的 Python 2 或 Store stub 当成可用解释器。
  • crossProcessLock 的时间推进测试冻结真实时钟,避免全量套件负载消耗 500ms 接管期限。
  • Pi BYOM 与 persistent SSE 集成测试分别按本轮新建目录识别配置、给持久流设置明确且满足语义不等式的预算,消除全量 Windows 调度竞争。

这些问题会让 #2698#2699 等无关功能 PR 卡在 Windows 根门禁;修复集中在独立 PR,避免污染功能分支。

变更类型

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

范围

  • 关联 Issue / 需求:解除当前主干 Windows 根单测门禁的宿主状态、锁发布竞态、Python 版本选择、共享临时目录清理与 SSE 调度阻塞。
  • 本 PR 包含:strict lock 的一次有界发布重试,以及五组确定性回归测试/测试环境探测修复。
  • 明确不包含:业务功能、SQLite schema/migration、UI、依赖或 lockfile 变更。
  • 用户可见变化:无;仅提高 Windows 测试门禁与 strict lock 最终接管路径的稳定性。
  • 是否存在 breaking change:无。

UI 变化

不涉及:本 PR 只修改 Desktop main 进程锁实现及 Desktop/maker-core 测试,没有 Renderer、样式、交互或文案变化。

  • 引用的设计规范:不涉及。

怎么验证的

自动验证

最终提交:72f6824783b8b279bb12d69928001ded32410743
冻结 tree:73f3776c73d4c51e279cee51ba0b3c08662ee754

pnpm install --frozen-lockfile
结果:exit 0;pnpm 10.33.2,无新增下载,lockfile/依赖输入未变

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

pnpm --filter @cindy/maker-core run --if-present typecheck
结果:exit 0;该 package 当前无 typecheck script,按 --if-present 跳过

pnpm test:unit
结果:exit 0;同一 frozen tree 的干净 Windows checkout,Desktop/Mobile/全部适用 packages 通过

pnpm check:dco -- origin/main..HEAD
结果:exit 0;4 个 commit 均有与 author 匹配的 Signed-off-by

手工验证

Windows 10 x64、Node 22、pnpm 10.33.2。在 D 盘独立 clean checkout 物化同一 tree;确认 Python 协议测试会拒绝 PATH 首位的 Python 2 并选择后续 Python 3;确认 Pi BYOM 和 persistent SSE 用例在根全量套件内通过。

未执行的验证

未在本机执行 macOS/Linux 全量测试;由 GitHub Actions 的对应 runner 提供平台证据。未做 UI 手工验证,因为不涉及 UI。

风险

风险分类

  • 无已知风险
  • SQLite / migration
  • system prompt
  • 协议兼容
  • 权限 / 安全 / 用户数据
  • 存量插件兼容(批准状态 / 指纹 / manifest 校验 / 安装布局 / 包格式)
  • 原生层 / fingerprint / OTA
  • 跨平台差异
  • 其他:

影响与回滚

  • 影响范围:生产代码只触及 strict security-boundary lock 的“最终陈旧接管后首次发布仍瞬时 busy”路径;最多增加一次发布重试和一次 reclaim-gate 清理 tick。重复 busy 仍返回 { held: false, reason: "busy" },没有无限重试或放宽安全边界。其余新增改动均为测试稳定性修复。
  • 回滚 / 降级方式:可整体 revert 本 PR 的 4 个 signed commits;无数据迁移、配置迁移或用户状态清理。非 Windows 平台不会进入 Windows 文件删除 busy 的目标路径。

提交前检查

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

@zyaoii
zyaoii requested a review from a team as a code owner August 15, 2026 19:07
@greptile-apps

greptile-apps Bot commented Aug 15, 2026

Copy link
Copy Markdown

Greptile Summary

本 PR 提高 Windows 根单测门禁与 strict security-boundary lock 最终陈旧接管路径的稳定性。

  • devCliFlags 的不可探测路径用例放入唯一且保证缺失的同父目录,同时保留仅大小写不同的回归约束
  • 为最终陈旧锁接管后的瞬时发布冲突增加一次有界重试,重复 busy 时仍然 fail closed
  • 改进 Windows Python 3 候选探测,并降低 Pi 集成测试对异步清理和调度时序的敏感性

Confidence Score: 5/5

当前未发现仍需阻止合并的故障,PR 看起来可以安全合并。

未发现仍然存在的阻塞性故障。

Important Files Changed

Filename Overview
apps/desktop/src/main/tests/devCliFlags.test.ts 新测试数据正确恢复了上一线程要求的同父目录、仅大小写不同且不可探测的回归约束。
apps/desktop/src/main/device-link/crossProcessLock.ts 最终陈旧接管后仅允许一次额外发布重试,并在后续 busy 或残留 reclaim gate 情况下保持有界且 fail closed。
apps/desktop/src/main/device-link/tests/crossProcessLock.test.ts 使用受控时钟覆盖截止时间后的首次瞬时 busy 成功重试及第二次 busy 失败路径。
apps/desktop/src/main/scheduler-host/tests/scriptRunnerPythonProtocol.test.ts Windows 测试枚举 PATH 中的解释器候选并仅选择可执行的 Python 3。
packages/maker-core/src/agents/pi/tests/pi-agent.integration.test.ts 通过启动前目录快照精确识别当前会话创建的隔离配置目录。
packages/maker-core/src/agents/pi/tests/pi-mcp-bridge.integration.test.ts 扩大并显式表达 SSE 启动、工具响应、流保持和请求超时之间的时序关系。

Reviews (4): Last reviewed commit: "test: stabilize Windows root integration..." | Re-trigger Greptile

Comment thread apps/desktop/src/main/__tests__/devCliFlags.test.ts
@MagicLizi

Copy link
Copy Markdown
Contributor

@zyaoii 👋 这个 PR 还有 1 条 review conversation 没 resolve(apps/desktop/src/main/tests/devCliFlags.test.ts),auto-review 因此暂时跳过、没法继续审查 / 合并。

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

@MagicLizi MagicLizi added the status:awaiting-author 等作者修改(review-pr 自动维护,仅展示) label Aug 15, 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.

格式门:Description 不符合 PR 模板要求

Description 缺少必填段落:

  • 这次改了什么: 请用模板段落说明 Windows root 单测门禁这次具体改了什么
  • 怎么验证的: 请写明实际跑过的命令和结果
  • 风险: 请评估对其他平台 / 无关 PR 的影响

请参照 PR 模板 把三大段补全。当前正文是 What changed / Why,不能替代模板段落。

zyaoii commented Aug 15, 2026

Copy link
Copy Markdown
Contributor Author

已按 .github/PULL_REQUEST_TEMPLATE.md 补齐「这次改了什么 / 怎么验证的 / 风险」及全部子段;review thread 已在修复进入 head 5e21cf867 后回复并 resolve。当前 Greptile 对新 head 为 5/5、无 blocking failure,本地同一 frozen tree 的 Desktop typecheck 与根 pnpm test:unit 均 exit 0;GitHub 新 head CI 正在运行。请在 CI 收口后复核并解除原格式门 Request Changes。

@MagicLizi MagicLizi added awaiting-discussion 等待维护者讨论(review-pr) touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) and removed status:awaiting-author 等作者修改(review-pr 自动维护,仅展示) awaiting-discussion 等待维护者讨论(review-pr) labels Aug 15, 2026

zyaoii commented Aug 16, 2026

Copy link
Copy Markdown
Contributor Author

@MagicLizi PR 描述已按仓库模板补齐,当前代码与验证证据未变。烦请重新复审;该 PR 用于稳定 Windows 根门禁,后续冲突 PR 会在它进入 main 后重新同步并走新树门禁。

@MagicLizi MagicLizi added awaiting-discussion 等待维护者讨论(review-pr) and removed awaiting-discussion 等待维护者讨论(review-pr) labels Aug 16, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

维护者确认 · 本 PR 命中 arch 门(核心路径改动 179 行),需要维护者在 PR 上 Approve 后才能合并。

讨论 issue 已创建,详见上方链接。

讨论 issue:#2813

@MagicLizi MagicLizi added the awaiting-discussion 等待维护者讨论(review-pr) label Aug 16, 2026
zyaoii added 4 commits August 16, 2026 17:44
Signed-off-by: zyaoii <347929035@qq.com>
Signed-off-by: zyaoii <347929035@qq.com>
Signed-off-by: zyaoii <347929035@qq.com>
Signed-off-by: zyaoii <347929035@qq.com>
@zyaoii
zyaoii force-pushed the codex/fix-windows-root-gate branch from 44a7c00 to 72f6824 Compare August 16, 2026 12:04

zyaoii commented Aug 16, 2026

Copy link
Copy Markdown
Contributor Author

新 head 72f6824783b8b279bb12d69928001ded32410743 已完成收口:client-ci run 31946077799 与 pr-design-basis 均 success,唯一 inline thread 已回复并 resolve,PR 描述已按模板更新到最终 tree 73f3776c73d4c51e279cee51ba0b3c08662ee754 的 Windows typecheck/root unit/DCO 证据。当前只剩 #2813 的维护者 arch Approve;该修复已被后续 #2698 的 current-main 根门禁真实复现为必要依赖(Python 2.7 被误选导致 4 个协议用例失败)。请复核并在认可后 Approve。

@MagicLizi
MagicLizi dismissed their stale review August 17, 2026 01:38

脚本修正:当前 head 格式门/安全门已通过,自动化旧 CR 已在后续 commit 修复,dismiss 解除状态死锁,问题由本轮重新审查覆盖

@MagicLizi MagicLizi removed the awaiting-discussion 等待维护者讨论(review-pr) label Aug 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.

  • P1 apps/desktop/src/main/device-link/crossProcessLock.ts:246-253 — 新增的 finalTakeoverDeadlineGrace 分支(最终陈旧接管后发布重试期间,若 reclaim gate 仍活跃允许一次越过 deadline 的清理 tick)没有任何测试覆盖:本次新增的两个用例都只走到重试后 reclaimInProgress === false 的路径,grace 标志在两者中均未被消费。事实证据:该分支依赖 finalTakeoverDeadlineGrace = false 这行重置保证有界——若这行被删,每次 reclaim-busy 都越过 deadline 检查 sleep + continue,退化为挂在安全边界锁上的无界循环;而现有两个测试即使在该 bug 存在时也照样通过,没有任何断言能拦住这一回退;代码注释声称的「a gate that remains active on the next pass still fails closed」也未被验证。
    建议修复:仿照同文件既有 rm-spy 用例,在最终接管 busy 重试后让 gate 文件删除持续 EBUSY(reclaimInProgress 保持 true),断言 { held: false, reason: "busy" } 且迭代次数有界(如 rename 计数不增长)。这是 authBoundaryQuarantine / ghostOauthMutationLock 共用的安全边界锁新引入的 deadline 旁路错误路径,缺关键错误路径回归测试(engineering-conventions.md §3)。

@MagicLizi MagicLizi removed the touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) label Aug 17, 2026
@MagicLizi

Copy link
Copy Markdown
Contributor

@zyaoii 👋 这个 PR 目前与 main 有合并冲突,auto-review 因此暂时跳过、没法继续审查 / 合并。

请在本地 merge 最新的 origin/main 解决冲突后推送;冲突解除后,下一轮 auto-review 会自动重新处理这个 PR。

@MagicLizi MagicLizi added status:awaiting-author 等作者修改(review-pr 自动维护,仅展示) touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示) labels Aug 17, 2026
@MagicLizi
MagicLizi dismissed their stale review August 17, 2026 09:53

当前 head 已修复此前 CR 指出的问题(格式门/安全门已通过),自动 dismiss 以解除合并阻塞

@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.

自动审查发现 2 条 P1:

P1-1 新增 grace 分支缺关键错误路径测试(apps/desktop/src/main/device-link/crossProcessLock.ts:246-253):finalTakeoverDeadlineGrace 分支(最终陈旧接管后重试期间,reclaim gate 仍活跃时允许一次越过 deadline 的清理 tick)没有任何测试覆盖——现有两个用例里 gate 在重试前均已释放,注释声称的「a gate that remains active on the next pass still fails closed」未被断言。这是安全边界锁新引入的 deadline 旁路错误路径,违反 engineering-conventions.md §3「main 侧新/改业务逻辑必须带关键错误路径测试」。建议:仿照同文件 spy 用例,在最终接管 busy 重试后让 gate 文件删除持续 EBUSY,断言 { held: false, reason: 'busy' } 且 rename 计数有界。代码本身经推演是有界且 fail-closed 的,补上测试即可。

P1-2 与 main 冲突未解决:当前 mergeable=CONFLICTING / mergeStateStatus=DIRTY,维护者此前要求「本地 merge 最新 origin/main 解决冲突后推送」未落实。请 rebase 到最新 main 解冲突后 push。

@MagicLizi

Copy link
Copy Markdown
Contributor

@zyaoii 👋 这个 PR 目前与 main 有合并冲突,auto-review 因此暂时跳过、没法继续审查 / 合并。

请在本地 merge 最新的 origin/main 解决冲突后推送;冲突解除后,下一轮 auto-review 会自动重新处理这个 PR。

@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:安全边界锁新增的 finalTakeoverDeadlineGrace 路径没有回归测试。请按 thread 补测。与主干的冲突请另外 rebase/merge origin/main,不记进这条审查意见。

await recoverPendingOwnRecord(lockPath);
if (await reclaimInProgress(lockPath)) {
reason = 'busy';
if (finalTakeoverDeadlineGrace) {

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.

P1:finalTakeoverDeadlineGrace 在最终 stale takeover 之后允许一次越过 caller deadline 的 publication retry;现有新测只覆盖 reclaim gate 已消失后的 fsp.link EBUSY,这条 grace 路径从未被走到。若 finalTakeoverDeadlineGrace = false 被拿掉,reclaim-busy 会 sleep+continue 而不再看 deadline,安全边界锁可能挂死。请补测:额外 retry 之后 gate 仍不可删 / reclaimInProgress === true,断言 { held: false, reason: 'busy' } 且迭代/rename 次数有界。

@MagicLizi

Copy link
Copy Markdown
Contributor

@zyaoii 👋 这个 PR 还有 1 条 review conversation 没 resolve(apps/desktop/src/main/device-link/crossProcessLock.ts),auto-review 因此暂时跳过、没法继续审查 / 合并。

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

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

Labels

status:awaiting-author 等作者修改(review-pr 自动维护,仅展示) touches:core 改动碰到架构核心路径(review-pr 自动维护,仅展示)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants