Files
wx-win-agent/docs/validation/M6-Stability-2026-09-05.md
T

99 lines
8.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# M6 稳定性与兼容性——进行中
**M6 尚未完成。** 短时测试不能替代开发计划 §11.3 的 8/24/72 小时测试,也不能替代 Windows 11 和不同 DPI 的真机验收。每项未验证内容继续保留,不按“接口存在/编译通过”结项。
## 已实现并验证
- `recover-ui`:恢复原有微信实例,不启动 `Weixin.exe`、不模拟登录。
- 优先使用 FlaUI UIA3 的通知区域按钮。
- Windows 10 通知区域未通过 UIA3 暴露图标时,使用公开 MSAA 接口定位,再按真实图标边界双击。不读写 Explorer 内存、不猜测托盘回调消息。
- 不再使用 `ShowWindow` 显示灰色 Qt 外壳;不对主窗口盲按 Esc(这会再次隐藏到托盘)。
- 最小化、正常关闭到托盘两种状态均验证了:状态实际发生、恢复同一 HWND 和 PID、`MainView/session_list/chat_message_list` 存在。
- 共享窗口绑定采用以上恢复路径,供普通业务调用与监听复用。
- 监听在统一命令队列内校验目标会话,再获取快照;避免将其他会话内容标成文件传输助手消息。
- `listener-smoke`:仅向文件传输助手发送一条唯一测试消息;收到一次事件,加载 checkpoint 重启监听后不重复上报。
- UI 树遍历有深度、节点数和 runtime ID 去重保护。截断/重复节点会明确失败,保存部分快照而非栈溢出或假报完整。
- `diagnose --output <dir> --baseline <ui-tree.json>`:脱敏快照、操作系统/微信版本、会话、DPI/窗口边界、进程资源、必需控件及基线差异、关联 ID。
- `endurance`:JSONL 持续落盘;统计微信及 Agent 的内存/句柄/线程、消息事件、重连事件、最近有效快照。记录请求/实测时长;未跑满、监听提前退出、快照停滞、最终错误均不算健康。输出目录禁止覆盖。
## 当前已取得的证据
环境:`DESKTOP-EGI7QCK`,Windows 10 build 19044,微信 4.1.13.63,Session 1,窗口 DPI 96(100%)。
- Linux Core:49/49 通过;Release 全量构建 0 警告、0 错误;Windows self-contained 发布通过。
- Windows 8 个命令均 exit 0:recover、doctor、inspect、smoke、recovery-smoke、listener-smoke、30 秒 stability-smoke、diagnose。
- listener:MatchingEvents=1、EventsAfterRestart=0、Snapshots=5、CheckpointSaved=true。
- 基线对比:Added/Removed/MissingRequiredControls 均为空。
- 30 秒短测:ObservedSeconds=30.0794228、CompletedDuration=true、7 个样本、有效监听快照持续更新、Findings 为空。
- 这仅证明上述 **30 秒** 样本,不证明长时间无泄漏。
本次发布包 SHA-256:`5899FD7A07E85B9C20679E06012CB0ED494F96916A8C58F81ACFC533286CA009`。
脱敏摘要见 `evidence/M6-20260905/`;完整本地证据位于 `artifacts/m6-final-validation/m6-validation-20260905T143832/`。历史失败证据不作为通过依据。
## 已撤销的 72 小时候选运行(不得作为验收)
报告可靠性修复 `e0d1ea1`:Core 56/56 通过,Windows 8 项验证全部 exit 0。阶段报告与最终报告共用完整性/心跳/异常检查;最终采样失败仍保留失败报告,报告使用临时文件原子替换。
- 固定产物:`releases/e0d1ea1/WxAgent.Host.exe`。
- SHA-256:`AB02B373EDCF76F8A4D392B55F3CF0464D37474ED4214D1C1E3F5FA0E67CED65`。
- Windows 任务:`WxAgentM6Endurance-e0d1ea1`,仅手动启动,75 小时上限,无定时触发器。
- 实际开始:2026-09-05 14:59:02 UTC;预期结束:2026-09-08 14:59:02 UTC。
- 输出:`C:\Users\Rogee\wx-agent\m6-e0d1ea1-endurance72`。
- 已检查到 15:03:05 UTC 的第 5 个样本;最后有效快照为 15:03:03 UTC,窗口可用、Errors 为空。这只证明启动成功和当时心跳正常。
- 2026-09-05 15:18:00 UTC 主动停止该候选,确认旧进程数为 0;`aborted.json` 明确记录 `Accepted=false`、未完成请求时长。旧的 8/24/72 小时唤醒已删除。
- 原因:审计发现原队列仅在单进程内互斥,旧 `ListenAsync` 也未复用新监听入口。修复与新候选验证完成前,不能继续用旧产物做最终长测。
- Windows 11 环境尚未提供,仍保留未验收状态。
## 跨进程队列补强
- 同一 Windows 用户会话的 CLI 实例通过同一独占文件句柄串行执行 UI 操作;句柄由操作系统在进程退出时释放,不留下永久锁死的命名信号量计数。
- 会话读取/定位(可能隐式恢复窗口)和关闭子窗口也纳入队列。
- 旧 `ListenAsync` 复用 `ListenEventsAsync` 的会话校验与去重;等待队列时仍遵守监听时长。
- 托盘激活和等待真实主控件的恢复过程遵守调用方取消令牌。
- Linux 59/59 通过;完整 Release 构建 0 警告、0 错误。新增独立队列实例互斥、取消后可再次使用、非争用 I/O 异常不盲重试等回归。
- Windows 跨进程门禁验证脚本:`scripts/windows/Test-CommandGate.ps1`,由 M6 验证脚本统一调用。其结果必须单独检查,不能仅凭 Linux 通过认定 Windows 通过。
## 托盘名称不可用与跨进程真机回归(7e29041)
候选 `786932e` 在正常关闭到托盘后,MSAA 按名称匹配得到 0 个微信图标,恢复失败;该失败目录完整保留,没有当作通过。
使用公开 `Shell_NotifyIconGetRect` 验证了当前微信进程的 `Qt51514WxTrayIconMessageWindowClass` 窗口及图标 ID 0,随后加入共享定位回退。只对唯一候选、且坐标命中可见通知区域根窗口的情况双击;不读写 Explorer 内存、不发送猜测的托盘回调消息、不启动微信新实例。类名/图标 ID 集中维护;这不是未经验证的跨版本兼容声明。
- 产物提交:`7e29041`;SHA-256:`8175C97346E2C2B45D6C6E86EBA1A7CF5A309858B00F72D6BF7940DC6AE3A68E`。
- Linux Core:65/65 通过;全量 Release 构建 0 警告、0 错误。
- Windows 9 项验证均通过,包括新增跨进程门禁检查。
- 外部 PowerShell 独占同一个锁文件时:恢复命令按预期返回 `Timeout`/124;旧监听命令按自身 1 秒时长正常返回、0 条消息;释放锁后恢复命令 exit 0。
- 最小化、关闭到托盘均恢复同一 HWND/PID,三个关键 UI 控件全部可用。
- 30 秒稳定性样本实测 30.1091299 秒、CompletedDuration=true、Healthy=true;依然不构成长时证据。
- 完整本地证据:`artifacts/m6-7e29041/m6-7e29041-validation/`;脱敏摘要随仓库保存。
两次独立审计子进程因宿主缺少 `@earendil-works/pi-tui` 启动失败,未产生审计结论;不能算作独立审查通过。其余功能矩阵由主进程继续核对。
## 尚待完成的验收
- [ ] 8/24/72 小时真实监听及长时资源趋势。
- [ ] 网络中断/恢复、20 次微信重启后的恢复(不能绕过登录或锁屏)。
- [ ] 常见弹窗、会话切换的专门恢复回归。
- [ ] 多会话/多子窗口消息归属与去重、长列表滚动场景。
- [ ] M2 连续 500 条发送无重复。
- 开发计划记录了用户取消早期 M3 的单项 8 小时测试;不把它重新作为 M3 单项阻塞,但 M6 §11.3 独立要求的 8/24/72 小时仍待验证。
- [ ] Windows 10 多 DPI 与 Windows 11 兼容矩阵。目前仅证明 Windows 10 / 96 DPI。
- [ ] 汇总此前阶段尚未真机覆盖的回归项;M4/M5 中仅编译/门禁验证的写操作不冒充端到端验收。
- [ ] 全部要求通过后更新阶段结论,并提交、PUSH 阶段验收记录。
用户明确跳过无麦克风环境下的 SendAudio;不扩展该豁免到其他功能。
## 重复执行
在已登录且未锁定、微信所在的用户会话执行;不要在 Session 0 运行。
```powershell
.\Invoke-M6Validation.ps1 -Executable .\WxAgent.Host.exe -OutputDirectory C:\Users\Rogee\wx-agent\validation-new
.\Invoke-Endurance.ps1 -Executable .\WxAgent.Host.exe -OutputDirectory C:\Users\Rogee\wx-agent\endurance-new -Hours 72 -SampleSeconds 60
```
脚本位于 `scripts/windows/`。每次使用新输出目录并保留 BinarySha256、请求/实测时长、退出码及全部样本。72 小时运行会在经过 8/24 小时时保存阶段快照,最终 `metrics/report.json` 才是最终结果。
所有早期调试用 `WxAgent*` 一次性定时任务已禁用,防止它们在 23:59 自动重发测试消息;后续任务仅手动触发,不配置未来重复触发器。