| 1 | # Windows 启动、退出与升级恢复 |
| 2 | |
| 3 | 本次处理服务退出后 Electron 壳残留并持续持有原数据目录单实例锁的问题。保持严格构建握手、单实例身份、Studio 共存、配置和会话格式不变,不修改已发布包。 |
| 4 | |
| 5 | ## 实现约定 |
| 6 | |
| 7 | - `QuitSequencer` 统一退出检查、服务终止、逐项资源清理及最终退出。清理异常不跳过后续步骤;仅在服务已结束后设置 5 秒壳退出兜底。启动、重启异步完成结果在退出时失效。 |
| 8 | - 首次启动前 1 秒保持隐藏;服务仍在启动时显示简洁的 Reasonix 启动提示,不展示诊断信息或重试按钮。快速启动直接进入主界面。重复点击只聚焦已有窗口,不打开页面、不重置计时。成功后在原生边框兼容时复用提示窗口并应用保存的尺寸,边框不兼容时重建;不设置最短展示时间。失败或现有的 30 秒就绪超时仍显示恢复页。成功、失败、退出及新一轮启动都会取消提示计时并使旧回调失效。应用就绪后再次启动恢复现有窗口(含最小化/托盘)。正常托盘隐藏仍由业务关闭策略决定。构建不匹配提示安装完整包,不提供无效重试。 |
| 9 | - 壳拥有按 PID 命名的本机管道,返回 schema 1、单条最多 16 KiB 的只读状态。Go 服务死亡后仍可识别壳;消费者核对实际管道服务端 PID、用户、可执行路径和进程句柄。未知协议不能当作进程不存在。 |
| 10 | - 根模块 `internal/desktopinstance` 为稳定启动器、安装包内激活器、版本化更新助手提供共享协调。按规范化安装目录与用户 SID 加锁,先协调锁、后激活锁。普通启动限定当前数据目录;安装检查同一安装的受影响实例。跨安装同数据目录冲突只报告,不跨目录结束进程。 |
| 11 | - 先正常退出并等待 20 秒,再由用户确认是否结束列出的旧进程,默认取消。用句柄与创建时间防止 PID 复用;确认期间新增进程需要重新检查。结束后最多等待 10 秒,并重新检查占用。静默模式不自动确认、不弹出恢复对话框。 |
| 12 | - 激活沿用 `ActivateVersion` 与 `current.json` 原子事务,在文件替换前和提交指针前复查进程。失败时保留原指针;已安装但启动失败单独报告,不自动降级、不提前清理回退材料。 |
| 13 | - 就绪验证覆盖实际目标壳、严格握手、同发行目录的存活服务、可见窗口、渲染器调用 `Version` 和后续健康心跳。普通双击可以显示健康状态无法验证的旧窗口;更新验收仍要求目标版本严格就绪。 |
| 14 | |
| 15 | 本机恢复日志位于 `desktop-shell/logs/recovery.log`,约 1 MiB 加一份轮转备份,不自动上传。静默安装返回 1602(取消)、1618(恢复/归属/冲突/退出阻塞),其他激活错误为 1。自动更新日志区分安装完成与启动完成;后台模式不显示阻塞通知。详细协议和实现边界见 [英文实现说明](WINDOWS_STARTUP_RECOVERY.md)。 |
| 16 | |
| 17 | ## 已得到的原生证据 |
| 18 | |
| 19 | 2026-09-11,在 Windows 11 26200.9445 ARM64 虚拟机,通过原便携启动器运行未修改的官方 `desktop-v1.38.5` x64 包。严格握手出现 `1.38.5` 与 `v1.38.5` 不匹配;正常关闭错误窗口后,窗口消失但壳仍存活,再次启动向旧壳投递 `secondInstance`,服务状态为 exited。已复现用户报告的故障形态,未注入故障。此结果属于 ARM64 上的 x64 兼容运行,不能记为 x64 原生验收,也尚未证明旧二进制内部具体哪条异常路径导致残留。 |
| 20 | |
| 21 | 官方基线 SHA-256:`9c9be1e44a0d8e8b7511eba43f8b74f34ba80221b6d9b832a7cead30e4a4f132`。新版协调模块已在原生环境正确识别该旧壳的数据目录。实际进程句柄、创建时间防护与互斥锁测试已通过。初始本地未签名候选 `v1.38.7-recovery.1` 从稳定便携启动器启动并通过目标版本就绪验证。 |
| 22 | |
| 23 | 最终 Windows ARM64 安装/恢复/正常退出矩阵、Windows x64 原生、macOS/Linux 包回归及签名发行包验收仍需完成。当前不能宣称整个问题已经完成发行验收。具体平台状态见英文说明中的验证表。用户提供的视频、日志不进入仓库,强制清理测试进程不计为正常退出通过。 |
| 24 | |
| 25 | ## 后续补丁版本发布说明草案 |
| 26 | |
| 27 | Windows 启动与安装现在可以识别并恢复旧版 Reasonix 残留进程,无需清理配置或卸载 Studio。结束未响应进程前会请求确认,因为可能丢失未保存内容。使用后续补丁版本交付,不覆盖 1.38.5/1.38.6;正式发布仍单独走既有流程。 |
| 28 |