feat: support long text and safe attachment batches
Build web service image / build (push) Successful in 1m15s

This commit is contained in:
2026-09-30 09:16:36 +08:00
parent a977902b25
commit edba7d0d38
26 changed files with 720 additions and 82 deletions
@@ -0,0 +1,52 @@
# 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:188/188 测试通过。覆盖长文本 4,000 字符分段、组合字符边界、20,000 字符总上限、附件路径预校验、同名提及候选拒绝、重复 fingerprint 的新增出现计数,以及合并聊天图片/视频/文件/嵌套元数据。
- 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`,未读取或附入本记录。
- 另对批准的“消息测试专用群组”运行 Windows Host 只读 `db group-members` 查询:2 个成员、2 个非空显示名、0 个重复显示名、`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。
## 项目待办状态(不得视为通过)
| 项目 | 代码检查 | 真机/样本验收 |
|---|---|---|
| 长文本分段与部分发送错误码 | 已实现并有 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 破解仍不实施。