Files
wx-win-agent/docs/validation/Normal-Functional-Acceptance-2026-09-29.md
T
rogee e8abb15f68
Build web service image / build (push) Successful in 1m6s
fix: authorize verified offline data sync
2026-09-30 13:30:48 +08:00

10 KiB
Raw Blame History

Normal 功能复核与验收记录 — 2026-09-29

范围与非目标

本轮按 docs/PENDING.md、开发计划及 M4–M6 验收记录复核;不把短时 smoke 当成长期稳定性证据。

  • 纳入正常功能:保留 TaskNotFound 结果报告修复;长文本分段;同一调用发送多个附件;提及成员的重名保护;合并聊天混合附件/嵌套元数据解析;只读联系人/群数据边界。
  • 本轮明确不做:压力或批量消息发送、连续 500 条发送、8/24/72 小时长稳、20 次重启/网络恢复压力验证、Win10 DPI 矩阵及不可用的 Windows 11/麦克风验证。
  • 好友增删、群成员变更、朋友圈发布/点赞/评论等写操作仍需单独授权,本轮未执行。没有进行登录或风控绕过、协议/CDN/AES 破解、DLL 注入、数据库写入,也没有实现 Windows Service、授权或自动升级。

代码与自动化检查

  • Core:193/193 测试通过。覆盖长文本 4,000 字符分段、组合字符边界、20,000 字符总上限、附件路径预校验、同名提及候选拒绝、重复 fingerprint 的新增出现计数、合并聊天图片/视频/文件/嵌套元数据,以及离线账号身份/活动 UI 账号选择规则。
  • Service:26/26 测试通过。新增验证长 send-text 可进入分段发送路径,同时 broadcast-text 仍保持单条消息上限。
  • Control plane:gofmt、go test ./...、go vet ./... 通过。发送文本按最多 20,000 UTF-16 code units 校验,并拒绝无效控制字符。
  • WebUI:7/7 测试通过;npm run build 成功。Vite 对大 bundle 的提示不是构建失败。
  • 完整 Release solution build(含 Windows targeting):0 warnings、0 errors。
  • 未对多附件发送执行 UI/真机调用;无压力或批量消息发送。

Windows 部署与验收结果

  • 部署位置:C:\Users\Rogee\wx-agent01。Host SHA-256:942CDE7F424D4A7158904F79F1D172330E769419E0AF8AB3BDB910C383031AB0;Tray SHA-256:C60A82C69F009A6C8A3C1ADFABE7D3D0C87CA88BDE2CCFEC514DCFC594C1D998。
  • service.json SHA-256 部署前后均为 5F4F40E040A7D69060CC09F1A390277286FA982D6EFBEF3D825DBCF29B6A56BB,文件未修改。回滚备份:C:\Users\Rogee\wx-agent01\backup-functional-20260929-163843。
  • Tray 已在交互式 Session 1 重启。通过 Session 1 临时验证任务运行了项目要求的 doctor、inspect-ui、smoke:inspect-ui exit 0;doctor 和 smoke exit 2,错误码 WechatNotLoggedIn。UserInteractive=true、InputDesktopAvailable=true、WindowFound=true,但 MainView、session_list、chat_message_page、chat_message_list、chat_input_field、tool_bar_accessible 均未找到。
  • 因缺少可用的微信聊天控件,本轮没有发送消息、文件或提及成员,也没有继续对登录界面进行交互。UI 树仅保存于 Windows 主机的 artifacts/ui-tree.json,未读取或附入本记录。
  • 在关闭 Weixin 进程的情况下,使用 Windows Host 只读 db group-members 查询批准的“消息测试专用群组”:返回 2 个成员、2 个非空且唯一显示名、hasMore=false。脚本仅输出聚合计数,没有记录成员姓名或账号标识。
  • Windows Host CLI chat send-files 用两条随机不存在的路径做无发送预校验:重复 --path 解析成功,按预期返回 InvalidArgument(附件文件不存在);此分支在进入 UI 自动化前拒绝输入,没有发送文件。
  • Windows 只读 schema 探针发现 contact 表有 22 列,contact_label 有 label_id_/label_name_/sort_order_ 三列;未确认联系人与标签的关联。alias、description、extra_buffer 的业务语义也未验证;探针仅读 schema,没有读取联系人行值,不映射字段、不解析不透明 BLOB。

Weixin 关闭后的数据库与离线收集复核

  • Weixin 进程在检查前后均为 0。Windows Host db status 成功,识别到 1 个账号及 20 个数据库(7 个消息库、1 个会话库);db messages --chat filehelper --limit 20 返回 20 条记录,命令输出未包含消息正文。只读联系人查询 Hao 豪 返回 1 条精确匹配;批准测试群成员读取见上方。
  • 临时、自包含 Windows x64 探针调用生产 DatabaseMessageSyncCollector,读取 service.json 中已授权的 filehelper 私聊范围,并从持久化检查点继续:序列 4,223、427 个会话游标、coverage complete、0 个 unavailable source。采集结果为 1 个会话、1 条新消息,hasNewItems=true、complete、正文仅以 messageTextPresent=true 布尔值确认。探针未输出消息正文或密钥;Weixin 进程前后均为 0,检查点文件和 service.json 的哈希均未改变。
  • **范围限制:**这证明关闭客户端时数据库读取及增量收集可运行,不证明控制面已收到数据。本次没有发起远程上传;已存检查点仍是序列 4,223/427 个游标,采集/确认时间约早 22.7 小时,待发送队列为空。因此不把本地采集结果表述为新一轮远程同步完成。

补充复核 — 2026-09-30

  • 离线同步授权修复:Core/Windows 仅用持久化 binding 与 page-1 HMAC 已验证数据库身份确认只读同步账号;没有 UI 会话时 ActiveAccountId 为空,消息/管理写任务仍要求 live UI binding。控制面 nodeHasAccount 继续要求 Active && Verified,仅 sync-status 使用 nodeHasVerifiedAccount。新增 Go 集成测试确认 inactive + verified 账号可读 sync status,但仍不符合 UI 任务活动账号门禁。go test ./...、go vet ./... 通过。
  • 新的 Windows Host/Tray 自包含单文件构建已部署:Host SHA-256 3C7A5628C37CA33AF96944A950E7B81002437010AE34AC9BC81461EFFE7373CA;Tray SHA-256 CFABF0BFB3AAB595DF240E75481F51A5DC96B8E9A6A0094A047F83B2BB35CC6D。备份目录 C:\Users\Rogee\wx-agent01\backup-offline-sync-20260930-122015。控制面 E2E 进程以更新二进制重启,SHA-256 1cb05554056256f12d5ce5a8c6824095d7ca37dbbff282e4661d71b854e24b87,/healthz HTTP 200;原有控制面数据文件和凭据文件未替换。service.json 部署前后 SHA-256 一致:5F4F40E040A7D69060CC09F1A390277286FA982D6EFBEF3D825DBCF29B6A56BB。
  • 远端 node details 为 WechatNotRunning,一条本地 verified 账号已登记但无活动 UI;修复后消息 sync-status 返回 HTTP 200、complete、确认序列 4,223,generation 与本地相同。contacts stream 仍为 unknown,没有联系人快照 ACK。此前的 403 authorization-revoked 警告在控制面更新后记录一次授权恢复。
  • Weixin 关闭时完整 wildcard 生产 collector 返回 460 个会话、426 条消息,complete、0 unavailable、hasNewItems=false;本地消息检查点 4,223/427 游标,队列为空。显式 filehelper 探针曾返回 1 条候选消息,但全范围 collector 未将其判为新增;该结果不视为已排队、上传或 ACK。远端最后成功仍约 25 小时前,因此本轮没有可证明的新批次上传/确认。
  • Windows MCP 桌面窗口列表只有任务栏、dummyLayeredWnd 和 Program Manager,未发现 Weixin;进程保持 0。部署后的 doctor/inspect-ui/read-only smoke 通过 SSH 启动且未形成有效交互式 UI 验收;没有发送消息或执行 UI 写操作。长文本/附件/提及、管理、朋友圈等真机验收仍 blocked/pending,需用户在 Session 1 手动登录后进行受限验证。

项目待办状态(不得视为通过)

项目 代码检查 真机/样本验收
长文本分段与部分发送错误码 已实现并有 Core/Service/Go 测试 Blocked:聊天输入控件缺失;未发送测试文本
2–10 个附件的单次命令及全路径预校验 已实现并有 Core 测试;Windows CLI 重复 --path 预校验通过;每个附件逐一确认,失败不盲目重试 Blocked:UI 不可用;且本轮禁止批量/压力发送,未发送附件
群成员只读分页 Windows Host 在批准的测试群读出 2 个成员,无空/重复显示名且无续页;只记录聚合数 通过:只读 DB 查询;不代表 mention UI 已验收
提及成员长列表/重名候选 数据库显示名唯一性和可见选项唯一性均采用 fail-closed 逻辑,有 Core 测试 Blocked:当前没有 mention/chat 控件;长列表搜索行为未真机验证,不做 UI 滚动分页
合并聊天混合与嵌套内容 增加离线混合元数据测试 Blocked:没有对应的受限测试样本;历史 16 条纯文本样本不等于混合/嵌套真机验收
合并聊天附件原文件下载 未实现 Blocked / 未实现:不能以解析元数据冒充原文件下载;不通过协议/CDN/AES 路径实现
独立 OCR 窗口、版本差异转文字 保留无法归属时 ResultUnconfirmed 的保守行为 Blocked:本轮无可用 UI 与样本,不把结果归属不明的文本当作成功
管理弹窗、会话切换、多窗口归属/去重 未做真机回归 Blocked:缺少聊天控件;涉及写操作的验证另需授权
联系人详情额外字段(WechatId、标签、签名、来源、共同群) Windows schema 已检查;GetFriendDetailsAsync 无仓库内调用/CLI/REST 暴露;没有验证字段语义或标签关联 Blocked:不猜 alias/description/extra_buffer 语义,不解析未知 BLOB;见 docs/PENDING.md
最近群活动排序 当前 C# 计划/源代码没有 GetRecentGroupsAsync API;不要求 wxautox4 Python API 兼容 Out of scope:现有群目录不承诺按活动排序;若需排序须先确认 C# 产品契约和已验证活动源
跨页事务快照 页内有稳定排序及 hasMore;跨页是独立只读查询 Known limitation:不承诺事务快照;本轮不做并发变更/压力测试,且未将结果描述为快照
语音发送 Beta 未验收 Blocked:环境无麦克风
M4/M5 可见写操作及 M6 长稳/兼容矩阵 未执行 Blocked 或明确非目标:见范围与非目标;M6 保持未完成

先前经授权完成的消息同步任务(sequence 783、100 conversations)及 TaskNotFound 修复回归证据保留在既有记录中;本次没有恢复其他等待任务。

后续所需输入

在 Windows 主机的已登录、未锁定交互式 Session 1 中由用户手动打开并登录微信后,再通知可进行受限功能验收。不得由 Agent 输入凭据或绕过登录。M4/M5 写操作仍需各自单独授权;附件原文件下载若需协议/CDN/AES 破解仍不实施。