MooTool Next Flutter 验收与交付标准
初始状态:全部待开发/待验收。本文规定测试方法和完成标准,不能作为已通过的测试报告。
1. 状态与证据规则
| 状态 | 何时使用 |
|---|---|
| 未开始 | 没有对应实现 |
| 开发中 | 有部分实现,核心路径尚未闭环 |
| 待验收 | 代码完成但缺真实平台/视觉/持久化证据 |
| 已验收 | 本文要求的对应范围已执行,并链接具体证据 |
| 明确差异 | 有精确范围、原因、替代操作、影响及决策记录;不自动视为完整对齐 |
禁止以“库声称支持”“页面有按钮”“另一个版本已通过”“构建通过”代替用户流程验收。未运行的平台标记未验证;预览版可以有限范围发布,不能称三平台完整可用。
每轮证据放入 docs/evidence/<日期>-<阶段>/:
environment.md # 提交、工具链、OS/架构、屏幕缩放、测试数据路径
results.md # 检查命令、结果、失败和范围
screenshots/ # 当前产品可复现截图
parity.md # 当前 Electron 基线、Flutter 变化、未决项
performance.json # 如本轮有性能测试,含原始测量
测试不能使用开发者真实工作区。应用内集成测试启动参数指定 Flutter 临时数据目录;Electron 对照运行使用另一个专属临时目录。测试后只清理自己创建的目录。
2. 功能进度表
实现人员逐项更新状态与证据,F 编号对应 功能规格。不能只更新总体百分比。
| ID | 入口 | 当前状态 | 证据 |
|---|---|---|---|
| F00 | mootool / 首页 | 开发中 | 三语言首页与外链已实现;与 Electron 并排桌面截图未跑 |
| F01 | quickNote / 随手记 | 开发中 | 列编辑/24 项替换/附件路径;剪贴板图片走 DesktopHost;拖放树、Git watcher、5MiB 冲突 UI 未完 |
| F02 | textDiff / 文本对比 | 开发中 | test/unit/local_tools_test.dart 对齐 unified/segment fixtures;同步滚动与字符高亮 UI 未完 |
| F03 | reformat / 格式化 | 开发中 | Nginx 对齐;XML/HTML/Java 为自写整理,非 Prettier,见 ADR 004 |
| F04 | json / JSON | 开发中 | test/unit/json_engine_test.dart、workspace_test.dart;Git 主流程有服务,冲突 UI 未完 |
| F05 | java / 代码运行 | 开发中 | test/unit/p5_system_test.dart、review_runtime_test.dart R13 杀进程树;Node 非 Prettier;桌面 UI 未跑 |
| F06 | ymlProperties / 配置转换 | 开发中 | Properties↔YAML 单测通过 |
| F07 | protobuf / Protobuf | 开发中 | 粘贴 proto3 JSON↔Hex/Wire 单测通过;嵌套/map/oneof 未做 |
| F08 | variables / 环境变量 | 开发中 | 用户变量写入本产品 environment/user.json;不改系统环境;OS 持久未做 |
| F09 | http / HTTP | 开发中 | test/unit/network_test.dart 本地服务确认 method/重复 query/body/超时/过大响应;cURL 导入不执行命令;代理 UI 未完 |
| F10 | host / Host | 开发中 | 方案 CRUD 持久化;系统 hosts 提权写入明确未实现 |
| F11 | net / 网络/IP | 开发中 | IPv4↔Long 对齐 Electron;DNS/ping 真实查找;WHOIS 走 :43 并跟随 refer;本机地址来自网卡列表 |
| F12 | uaParse / UA | 开发中 | 预设 Chrome/Safari/bot 单测通过 |
| F13 | encode / 编码 | 开发中 | Unicode/URL UTF-8+GB2312/Hex/ASCII 单测通过 |
| F14 | crypto / 加解密/随机 | 开发中 | AES ECB PKCS7 固定密文与 Electron 一致;DES/摘要/Base32/随机已做;SM4/RSA/SM2 明确未实现 |
| F15 | regex / 正则 | 开发中 | 分组与零宽匹配;^ 锚点不再因 substring 重跑而失真;超时取消未做 |
| F16 | cron / Cron | 开发中 | 下次运行与年字段单测通过;L/# 未做 |
| F17 | qrCode / 二维码 | 开发中 | 生成 PNG;识别未接入解码器 |
| F18 | timeConvert / 时间 | 开发中 | 时区往返与非法日期单测通过;全屏时钟未做 |
| F19 | messageBoard / 留言板 | 开发中 | 8 预设/6 主题/80 字/对齐/比例/Esc 退出演示;防休眠走 DesktopHost,失败不假装常亮 |
| F20 | translation / 翻译 | 开发中 | Google gtx 客户端 + 分段/取消单测;Bing/单词本/自动翻译未做 |
| F21 | calculator / 计算器 | 开发中 | 表达式/进制/GCD/排列组合单测通过 |
| F22 | colorBoard / 调色板 | 开发中 | 解析/运算/主题色 SHA 对齐;取色走 DesktopHost / NSColorSampler;Release 安装包未验收 |
| F23 | image / 图片 | 开发中 | 图片库导入/压缩/水印/轮廓 SVG;剪贴板与截图走 DesktopHost;截图可裁剪,取消不写库 |
| F24 | pdf / PDF | 开发中 | 页码规则对齐 Electron;SimplePdf 可提取含括号文本;任意/加密 PDF 拒绝;不是真实页对象复制 |
| F25 | hardware / 系统信息 | 开发中 | Platform/内存/网卡真实采集;非 systeminformation 全量;CPU% 未做 |
| A01 | 11 类设置 | 开发中 | 11 类页可持久化;六种风格有独立 token;凭据不进 settings/备份;关闭 hide 无托盘时改为询问;托盘/截图/取色 Release 实机未验收 |
| A02 | 历史/收藏/搜索 | 开发中 | JSON 与本地工具历史;regex/cron/color 收藏入口;⌘K 搜索 |
| A03 | 数据/Git/窗口/平台/更新 | 开发中 | 保存队列/恢复内存/文档边界/原子回退/隔离见 test/unit/review_regression_test.dart;分离窗口诚实失败;更新只读 next-flutter;本机未签名 DMG 见 p7b;Windows/Linux 包与清单节点未做;R01 Release 原生通信未用安装包验收 |
每个复杂工具再维护子能力状态。比如随手记正文编辑完成、列编辑未完成时,F01 不能标记已验收。
3. 首批必须实现的验收用例
以下用例 ID 可以直接作为 Cursor 测试任务名;它们是后续实现任务,并非现有测试文件。
| 用例 | 操作 | 必须观察到的结果 |
|---|---|---|
| CORE-01 | 搜索中英日名称/ID/关键词,键盘选择 | 命中正确工具;全部 26 项可访问 |
| CORE-02 | 编辑 JSON → 切计算器 → 回 JSON | 文本、选区、滚动、选项保持 |
| CORE-03 | 切 theme/language/navigation | 所有已打开工具同步;编辑状态不重建丢失 |
| CORE-04 | 新建自定义组、隐藏工具、重启 | 分组/隐藏持久化,隐藏工具仍可搜索 |
| CORE-05 | 输入中文候选期间按 Enter/Esc | 完成/取消输入法,不执行工具或关闭窗口 |
| JSON-01 | {"b":2,"a":{"d":4,"c":3}} 排序格式化 |
内外 Key 按已选规则排序;undo 恢复输入 |
| JSON-02 | {"a":1,"a":2} 检查重复 |
报告重复 a,不能因 Map 覆盖而显示无重复 |
| JSON-03 | 非法 JSON 保存/查找/切页 | 校验失败但原文不丢,文本仍可操作 |
| JSON-04 | 数组筛选 JSONPath、路径树选值 | 结果由实际数据产生,路径和值一致 |
| NOTE-01 | 矩形选择三行,输入相同前缀后 undo | 三行正确更新并一次恢复,范围不含多余字符 |
| NOTE-02 | 双击选词 → 等待自动保存 → 切预览 | 选区及 undo 不因保存丢失,切回可继续 |
| NOTE-03 | 连续粘贴两张图片,中间不手动换行 | 两个独立相对附件引用,顺序正确,预览可见 |
| NOTE-04 | 有选区时快速替换;无选区再执行 | 分别只改选区/全文,均能撤销 |
| NOTE-05 | 移动/重命名笔记、删除另一笔记 | 附件引用有效,仍被引用附件不会误删 |
| HTTP-01 | 发重复 Query/表单/Headers/Cookies 到本地服务 | 服务收到准确内容,响应 Tab/耗时/状态真实 |
| HTTP-02 | 延迟响应时取消,马上发送新请求 | 原请求真正停止;旧结果不覆盖新响应 |
| HTTP-03 | cURL 导入含引号/转义/重复参数 | 只解析不执行;支持字段准确,不支持项明确 |
| RUN-01 | 实际 Node/Python 打印参数和 cwd | 输出与用户设置一致,非固定文本 |
| RUN-02 | 启动含子进程的长任务后停止 | 整棵受控进程树退出,无遗留临时文件 |
| DATA-01 | 写笔记/历史/集合 → 退出 → 重启 | 内容、选项和导航恢复 |
| DATA-02 | 自动保存期间注入写失败 | 保留 dirty 状态和旧文件;可重试,不显示已保存 |
| DATA-03 | 修改外部文档,同时本地有 dirty | 提示比较/保留/另存,不静默覆盖 |
| DATA-04 | 备份 → 修改 → 恢复 | 所有声明覆盖类别一致回到快照点 |
| DATA-05 | 损坏 settings/DB/备份 | 保留原数据并显示恢复入口,不写空数据覆盖 |
| IMPORT-01 | 对受支持 Java/Electron 样本导入两次 | 只读来源,第二次幂等,无重复记录 |
| IMPORT-02 | 预览后改变来源,或中途注入失败 | 变化拒绝/重新预览;失败回滚目标,来源不变 |
| FILE-01 | 导入中文/空格/长路径、选择后删除文件 | 正常文件处理正确,竞态错误可理解 |
| FILE-02 | 相对越界、symlink 逃逸、重复解包项 | 拒绝越界,不写本产品作用域外 |
| CRYPTO-01 | Electron 固定密文→Flutter 解密/验签 | 按冻结兼容模式得出正确结果 |
| PROTO-01 | 粘贴运行前从未见过的 proto message | 无需重编译即可编解码 |
| QR-01 | 生成 PNG→文件/图片剪贴板识别 | 原始中文内容准确回读 |
| PDF-01 | 5 页 PDF 选页拆分再合并 | 页数/顺序正确,文字可提取,非栅格化 |
| IMAGE-01 | 多张图片压缩、水印、转 SVG | 真正新产物,取消/覆盖策略正确 |
4. 多窗口、桌面与原生交互
| 用例 | 场景 | 通过条件 |
|---|---|---|
| WIN-01 | JSON 带选区/undo 分离再收回 | 同一逻辑会话,文本/选择/滚动/undo 保持 |
| WIN-02 | 关闭分离窗口 | 工具收回主工作区,不清空、不退出应用 |
| WIN-03 | JSON、随手记、HTTP、计算器同时分离 | 互不串状态;各窗口插件与剪贴板可用 |
| WIN-04 | 转移中目标窗口初始化失败 | 源恢复可编辑,无两个写入 owner |
| WIN-05 | HTTP/运行代码期间分离/收回 | 不重新执行、不丢输出,取消仍有效 |
| WIN-06 | 分离/收回连续 100 次 | 无崩溃、遗留窗口、累积监听器、持续内存增长 |
| WIN-07 | 打开搜索、设置、分组、更新说明 | 层级正确,可点击;工具视图不盖住 overlay |
| WIN-08 | 主窗口 ask/hide/quit 与托盘禁用 | 无隐藏后无法恢复的孤儿进程 |
| WIN-09 | 多屏、负坐标、移除显示器后重启 | 窗口恢复到可见工作区,尺寸/缩放正确 |
| SYS-01 | 截图、区域选择、取消、拒绝权限 | 实际捕获/正确恢复窗口,取消不保留临时资产 |
| SYS-02 | 100%/150%/200% 屏幕取色 | 像素坐标和预览一致,无窗口遮挡污染 |
| SYS-03 | 留言板演示、退出、失活 | 防休眠 token 按 owner 释放 |
| SYS-04 | Hosts/环境写入拒绝提权 | 不显示成功,不破坏系统文件 |
| SYS-05 | 本机菜单、右键、拖放、复制粘贴 | 真实 OS 工作流,与 Widget 层结果一致 |
必须实际使用输入法和系统剪贴板。测试控制器直接修改文本不能替代键盘输入验收;直接写数据库不能替代保存按钮验收。
5. 视觉验收
5.1 建立两类基线
- Electron 体验基线:冻结提交、设置、测试数据、窗口尺寸。检查工具顺序、左右/上下关系、Tab 顺序、主要动作和结果位置。
- Flutter 视觉基线:按现代 token 和本平台原生行为建立。检查字体、色彩、边距、焦点、密度和主题一致性。
Flutter 不要求与 Electron 跨渲染引擎逐像素相等。外边距、圆角、原生按钮和字体渲染等有意变化记录为设计差异;不能借此容许布局错位、缺功能或错误选中态。
每张截图写明版本/提交、系统、DPI、logical size、语言、主题、导航模式、工具状态。历史截图中的大标题不再作为当前功能页验收目标。
5.2 矩阵
| 维度 | 最低覆盖 |
|---|---|
| 入口 | 26 个入口默认态全部覆盖;有编辑/结果的工具至少一个真实结果态 |
| 主题 | 每个入口 light/dark;另测系统主题切换 |
| 核心尺寸 | 1440×920 light、1080×720 dark;JSON/随手记/HTTP/设置两尺寸双主题 |
| 额外尺寸 | 960×640 最小、1920×1080 大屏;实际平台支持允许更严格最小值但需记录 |
| 语言 | 中文/英文/日文导航和设置全量;密集工具全部检查英文/日文最长文案 |
| 缩放 | 至少 100%、150%、200% OS 缩放;应用文字 125%、150% |
| 导航 | classic/card/grouped、展开/折叠、自定义组/隐藏工具 |
| 风格 | modern 完整矩阵;其余五个预设至少首页/JSON/设置的双主题代表状态 |
| 原生层 | 工具独立窗口、原生菜单/文件对话框、tooltip、popup、拖放反馈 |
验收标准:
- 功能工作区贴齐可用区域,无额外大标题/装饰卡片占据编辑空间。
- 主操作可见,工具栏不裁切;无黄黑 overflow、重叠、空白渲染或窗口级横向滚动。
- 表格、编辑器、树和菜单各自滚动,footer/主要操作不跟随长列表消失。
- 深色弹窗、原生 titlebar、代码语法和选中文本清楚;焦点框可辨。
- 空白/无权限/错误状态有行动入口;“无数据”不覆盖“加载失败”。
- 图标按钮有语义标签和 tooltip,键盘可走完整流程;VoiceOver/Narrator/可用 Linux 读屏进行代表场景检查。
- Golden 更新必须审阅差异;禁止盲目批量接受新截图消除失败。
5.3 黄金路径截图场景
- JSON:格式化后、重复 Key、JSONPath 树、查询结果、查找替换、Git diff、窄检查器。
- 随手记:编辑/分栏/预览、列选区、快速替换、图片附件、正文搜索。
- HTTP:带参数的请求与真实响应、错误、取消中、保存集合。
- PDF/图片:任务排队、成功结果和单项错误。
- 设置:外观、布局、数据/备份、更新下载状态。
- 主壳:命令搜索、自定义组、折叠侧栏及多个分离窗口。
6. 性能与资源
以下是 Flutter 初版工程目标,不是当前测量结果;P0/P2 要记录参考硬件,调整目标需说明理由。用 release/profile 模式测试,debug 耗时不能当发行指标。
| 指标 | 初始目标 |
|---|---|
| 冷启动至导航与输入可用 | 中位数 ≤ 2 秒;至少 10 次,记录 p95 |
| 已加载工具切换 | p95 ≤ 100 ms,无输入丢失 |
| 普通文本键入反馈 | p95 ≤ 50 ms;不计输入法候选服务自身延迟 |
| 搜索 26 工具 | p95 ≤ 50 ms |
| 3 MiB JSON 格式化 | ≤ 3 秒;UI 可交互、可取消 |
| 5 MiB 随手记保存/恢复 | 单次 ≤ 2 秒;不阻塞 UI isolate |
| 10,000 文件树节点 | 首屏增量显示 ≤ 1 秒;虚拟化/后台索引 |
| 帧耗时 | 常见操作以 60 Hz 的约 16.7 ms 帧预算检查;记录慢帧和原因 |
| 稳态内存 | 主窗口+已使用核心工具参考目标 ≤ 300 MiB RSS;跨平台分别测量 |
| 反复窗口转移 | 100 次后无持续单调增长;关闭临时引擎/worker 后稳定值有记录 |
性能不作为伪造测试数字或删除功能的理由。多 engine 内存成本高时采取按需创建、及时释放非 owner engine 和有限缓存,不能销毁 dirty 会话。
压力样本包含:1/3/10 MiB JSON、5 MiB 笔记、大段单行文本、10,000 节点 Vault、20 项 PDF、超大图片、连续网络取消和无限运行程序。所有限制使用统一常量,超限告知原因并保留现有数据。
7. 五产品并存:专门验收
测试环境同时安装可用的 Java、Electron、Tauri、macOS Native(仅 macOS)和 Flutter。缺少某产品时记录未覆盖,不能默认判定通过。
| 用例 | 操作 | 通过条件 |
|---|---|---|
| ISO-01 | 安装 Flutter | 应用名、ID、目录、快捷方式、卸载项独立;其他安装文件 hash 不变 |
| ISO-02 | 所有可用产品同时启动 | 不被跨产品单实例锁阻止;不激活错误产品 |
| ISO-03 | Flutter 修改主题、草稿、历史、Vault | 其他产品专属数据内容不变,重启仍保持原设置 |
| ISO-04 | Flutter 更新检查遇到其他产品更高版本 | 不提示跨产品升级,不下载其他产品资产 |
| ISO-05 | 安装 Flutter 新版本 | 仅升级 Flutter,自有数据迁移成功 |
| ISO-06 | 卸载 Flutter | 其他产品可启动且数据不变;删除 Flutter 数据只在明确选择时发生 |
| ISO-07 | 从 Electron/Java 显式导入 | 来源内容 hash 不变,旧产品仍正常使用 |
| ISO-08 | 用户误选其他产品活动数据/Vault 目录 | 阻止直接接管,提供复制导入方式 |
| ISO-09 | 凭据和缓存 | Flutter 专属命名空间,不能读到/删除其他产品 token |
| ISO-10 | 只取出 next-flutter 干净构建 | 不读取其他产品源码/资源/产物,不运行其他产品构建 |
| ISO-11 | 发布 Flutter tag/更新清单 | 只操作 next-flutter 节点和 Release;保留其他节点,不覆盖 Latest |
| ISO-12 | 平台 URL scheme/文件关联/全局快捷键 | 独立身份;默认不抢占已有产品注册;冲突时显式提示 |
ISO-03 验证专属数据的只读/未改写,可对关闭的来源数据制作 before/after 内容 hash。测试运行中数据库自行写 WAL 时不能把其正常写入误判为 Flutter 改动;需要控制测试条件并辅以实际访问日志。
系统 Hosts、环境变量、剪贴板属于 OS 共享资源,用户主动操作它们会影响整个系统。验收应确认“操作范围明确、动作由用户触发、没有跨产品私有数据依赖”,不能要求剪贴板或系统 Hosts 在不同应用间物理隔离。
8. 发布和更新验收
- 每个发行平台实机安装、首次启动、升级、取消更新和卸载。
- 版本/ID/tag/notes/文件名一致;没有未打包的 DLL、资源、helper。
- stable 不收到 beta/rc;预发布接收规则有测试。
- 缺失产品节点、空 releases、坏 JSON、未知 schema、无匹配架构和断网都能正常反馈。
- 下载取消、断开网络、空间不足、hash/长度错误不进入“已就绪”。
- 下载产物只属于 Flutter;手动安装模式显示正确动作,不能显示并未支持的“自动安装成功”。
- 更新/备份/退出遇到 dirty 文档先完成保存或让用户处理失败,不直接丢草稿。
- 资产可访问后才更新产品清单,其他节点 byte/结构内容保持不变。
- 发行说明写清平台支持、未签名状态(如适用)、明确差异和产品独立关系。
9. 差异记录模板
差异 ID:
工具/能力:
Electron 基线提交与具体源码:
Electron 观察行为:
Flutter 行为:
类别:视觉改进 / 平台差异 / 修复源缺陷 / 尚未实现
原因与影响:
用户仍如何完成原任务:
实现/测试/截图证据:
状态与后续动作:
是否改变已约定功能范围:
“尚未实现”不能写成“视觉改进”。可自行确定控件圆角、实现库等常规选择;减少核心功能或改变数据共享边界须回到用户决定。不要因为一般实现选择频繁请求确认。
10. 完整产品的发布 DoD
- 26 个入口准确,25 个工具所有核心流程有证据,应用级功能完整。
- 当前 Electron 沉浸布局、设置页、列编辑、图片转 SVG 等新基线没有被旧截图覆盖。
- 三语言、明暗主题、键盘/IME、默认/紧凑布局和平台原生操作通过。
- 编辑器撤销、自动保存、文档切换、附件和大文本可靠。
- 多窗口 session 转移、关闭收回、任务继续/取消及错误回滚通过。
- 数据 schema 迁移、损坏保护、备份恢复、显式导入和只读来源通过。
- 算法使用真实实现,复杂能力已有语义/跨实现 fixtures。
- 已发布平台的实际原生能力、权限、DPI、安装包和更新闭环通过。
- 五产品并存范围有独立报告,数据/安装/更新/构建没有隐式耦合。
- 性能指标有真实测量,限制与未覆盖平台如实记录。
- Flutter 自有版本、Release notes、许可证、更新节点和 Latest 策略符合约定。
- 不含伪成功按钮、隐藏 TODO 流程、发布态 mock 数据或未披露的功能删减。
若只是阶段预览,应按实际范围命名并发布;不要把“做完 P1 壳”标记为完整 Flutter 版。