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

8.2 KiB
Raw Blame History

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-EGI7QCKWindows 10 build 19044,微信 4.1.13.63Session 1,窗口 DPI 96100%)。

  • Linux Core49/49 通过;Release 全量构建 0 警告、0 错误;Windows self-contained 发布通过。
  • Windows 8 个命令均 exit 0recover、doctor、inspect、smoke、recovery-smoke、listener-smoke、30 秒 stability-smoke、diagnose。
  • listenerMatchingEvents=1、EventsAfterRestart=0、Snapshots=5、CheckpointSaved=true。
  • 基线对比:Added/Removed/MissingRequiredControls 均为空。
  • 30 秒短测:ObservedSeconds=30.0794228、CompletedDuration=true、7 个样本、有效监听快照持续更新、Findings 为空。
  • 这仅证明上述 30 秒 样本,不证明长时间无泄漏。

本次发布包 SHA-2565899FD7A07E85B9C20679E06012CB0ED494F96916A8C58F81ACFC533286CA009

脱敏摘要见 evidence/M6-20260905/;完整本地证据位于 artifacts/m6-final-validation/m6-validation-20260905T143832/。历史失败证据不作为通过依据。

已撤销的 72 小时候选运行(不得作为验收)

报告可靠性修复 e0d1ea1Core 56/56 通过,Windows 8 项验证全部 exit 0。阶段报告与最终报告共用完整性/心跳/异常检查;最终采样失败仍保留失败报告,报告使用临时文件原子替换。

  • 固定产物:releases/e0d1ea1/WxAgent.Host.exe
  • SHA-256AB02B373EDCF76F8A4D392B55F3CF0464D37474ED4214D1C1E3F5FA0E67CED65
  • 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 集中维护;这不是未经验证的跨版本兼容声明。

  • 产物提交:7e29041SHA-2568175C97346E2C2B45D6C6E86EBA1A7CF5A309858B00F72D6BF7940DC6AE3A68E
  • Linux Core65/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 运行。

.\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 自动重发测试消息;后续任务仅手动触发,不配置未来重复触发器。