fix(desktop): stabilize Windows root test gates - #2796
Conversation
|
| 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
|
@zyaoii 👋 这个 PR 还有 1 条 review conversation 没 resolve(apps/desktop/src/main/tests/devCliFlags.test.ts),auto-review 因此暂时跳过、没法继续审查 / 合并。 如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。 |
|
已按 |
|
@MagicLizi PR 描述已按仓库模板补齐,当前代码与验证证据未变。烦请重新复审;该 PR 用于稳定 Windows 根门禁,后续冲突 PR 会在它进入 main 后重新同步并走新树门禁。 |
|
⏸ 维护者确认 · 本 PR 命中 讨论 issue 已创建,详见上方链接。 讨论 issue:#2813 |
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>
44a7c00 to
72f6824
Compare
|
新 head |
脚本修正:当前 head 格式门/安全门已通过,自动化旧 CR 已在后续 commit 修复,dismiss 解除状态死锁,问题由本轮重新审查覆盖
MagicLizi
left a comment
There was a problem hiding this comment.
- 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)。
|
@zyaoii 👋 这个 PR 目前与 请在本地 merge 最新的 |
当前 head 已修复此前 CR 指出的问题(格式门/安全门已通过),自动 dismiss 以解除合并阻塞
MagicLizi
left a comment
There was a problem hiding this comment.
自动审查发现 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。
|
@zyaoii 👋 这个 PR 目前与 请在本地 merge 最新的 |
MagicLizi
left a comment
There was a problem hiding this comment.
审查有 1 条 P1:安全边界锁新增的 finalTakeoverDeadlineGrace 路径没有回归测试。请按 thread 补测。与主干的冲突请另外 rebase/merge origin/main,不记进这条审查意见。
| await recoverPendingOwnRecord(lockPath); | ||
| if (await reclaimInProgress(lockPath)) { | ||
| reason = 'busy'; | ||
| if (finalTakeoverDeadlineGrace) { |
There was a problem hiding this comment.
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 次数有界。
|
@zyaoii 👋 这个 PR 还有 1 条 review conversation 没 resolve(apps/desktop/src/main/device-link/crossProcessLock.ts),auto-review 因此暂时跳过、没法继续审查 / 合并。 如果你已经按评论改完或回应了,请到对应 thread 上点 Resolve conversation;全部 resolve 后,下一轮 auto-review 会自动重新审查这个 PR。 |
这次改了什么
摘要
修复当前主干上会让无关 PR 的 Windows 根单测门禁不稳定的五类问题:
devCliFlags的不可探测路径用例不再依赖宿主是否真实存在C:\AppData,同时保持“同父目录、仅大小写不同”的回归约束。crossProcessLock的时间推进测试冻结真实时钟,避免全量套件负载消耗 500ms 接管期限。这些问题会让 #2698、#2699 等无关功能 PR 卡在 Windows 根门禁;修复集中在独立 PR,避免污染功能分支。
变更类型
feat新功能fix缺陷修复refactor/perf重构或性能优化docs/test/chore文档、测试或工程维护范围
UI 变化
不涉及:本 PR 只修改 Desktop main 进程锁实现及 Desktop/maker-core 测试,没有 Renderer、样式、交互或文案变化。
怎么验证的
自动验证
最终提交:
72f6824783b8b279bb12d69928001ded32410743冻结 tree:
73f3776c73d4c51e279cee51ba0b3c08662ee754手工验证
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。
风险
风险分类
影响与回滚
{ held: false, reason: "busy" },没有无限重试或放宽安全边界。其余新增改动均为测试稳定性修复。提交前检查
git commit -s,见 DCO)