## 12. 验收清单(逐项勾选,不得跳过) > 所有自动验证默认无头/离屏;`--visual` 才允许真实桌面。任一项未通过都不得声称完成。 ### 12.1 工程门禁 - [ ] `pnpm lint` 0 error(warning 需列出)。 - [ ] `pnpm typecheck` 0 error(先构建 shared)。 - [ ] `pnpm build:desktop` 成功;`island.html` 与主窗口产物分别可加载。 - [ ] 未新增 UI 框架/状态库/图标库;新增依赖(若有)≤ 200KB 且说明不可替代性。 - [ ] 只改 `packages/shared`、`packages/desktop-client`、`packages/ui`(如需)与 docs;服务端/Web 管理端零改动。 - [ ] 所有新增 IPC 通道有 sender 校验、payload 类型校验;preload 白名单与 `desktop.d.ts` 同步。 - [ ] 无 `console.log` 残留;日志走统一 logger。 ### 12.2 视觉验收(像素级) 在 1920×1080@100%、2560×1440@125%、深色/浅色、`family=classisland`/`winisland`、Fluent/Classic 主题下截取离屏基准图,逐项比对(颜色 ±2/255、尺寸/位置 ±1px、透明度 ±1%): **fixed(classisland 风格)** - [ ] fixed 窗口包围盒固定:宽 = min(工作区宽, 960)、高 = 40 + 2×pad(pad 默认 20);消息到达/展开/多条列表均不改变窗口尺寸。 - [ ] 可见行高 40px,行内容左右内边距 12px,最小内容宽 20px;行间距 5px。 - [ ] 行背景:圆角 8px、背景不透明度 0.5、1px 描边、阴影 `0 4 8 2 #48000000`(Fluent)。 - [ ] 字号:次要 14 / 主体 16 / 强调 18 / 超大 20;字重 Medium;正文 `line-height: 1.25`。 - [ ] 进度条:高 3px、贴底、圆角 1.5px、颜色为强调色、按设置精度更新。 - [ ] 默认 1 行 = 日期 + 课程表;无课表时显示占位文本("今天没有课程。"/"今日课程已全部结束。")。 - [ ] 课程表显示当前/下一节/今日时间点模式,当前项展开显示起止时间,其余折叠;课间与"默认隐藏"时间点折叠时隐藏,分割线显示竖线,行动不显示。 - [ ] 下课前秒数徽标:蓝色圆形、显示在课程名右侧、剩余 1 秒显示 `-1`、不显示"即将下课"遮罩、不替换常态组件。 - [ ] 消息气泡:遮罩 5 区权重 `[0,0.1,0.2,0.4,0.2,0.1]`、60° 斜切、区段 360ms + 错峰 120ms、开 QuarticEaseOut / 关 QuadraticEaseIn;文字延迟 260/250ms、scale 1.1→1.0/750ms;退出 200ms `(0.5,0,0.75,0)`;行高 40。 - [ ] 强提醒:全屏/大区域遮罩、超时关闭、不抢焦点、在岛所在显示器出现;关闭后无残影。 - [ ] `winisland` 风格:胶囊 268×44(默认值可配置 220–420 × 36–72)、连续圆角(超椭圆 4.2/14 段)、弹簧形变、纯黑/毛玻璃/主题色渐变、阴影常驻;不得与 classisland 风格混用。 **custom(始终 ClassIsland 规格,family 不影响 custom)** - [ ] 行高 40、行间距 5、组件外边距 6/6、行背景圆角 8、背景不透明度 0.5。 - [ ] 行结构:`Auto, *, Auto` 三列(左拖动把手 20px / 中组件 / 右行操作区);选中框 1.5px 虚线 `1,1.5`、Opacity 0.75、圆角同背景。 - [ ] 多行、分体岛(separated)、主行标记、允许提醒标记、隐藏规则、组件外观覆盖(字号/前景/背景/圆角/透明度/宽度/对齐)逐项与设置一致。 - [ ] 编辑器中的组件库、行、容器嵌套、选中态、抽屉尺寸与间距符合第 9 部分。 - [ ] 所有组件的默认样式/空数据兜底/超长文本截断/滚动行为符合第 7 部分。 **窗口与层级** - [ ] 岛窗口无边框、透明、置顶、默认不占任务栏、默认不抢焦点;`winisland` 与 `classisland` 风格均不出现白底/黑边/窗口阴影残影。 - [ ] 6 个停靠位 × 偏移(X/Y)× 多显示器索引正确;`followCursorDisplay` 行为保持。 - [ ] 编辑模式窗口/画布尺寸正确:屏宽 ×(屏高−1px)、四边 60px 内缩、开启命中。 - [ ] 深浅色/主题切换无残留样式;岛动画由 `appearance.animations` 开关控制(系统 `prefers-reduced-motion` 不强制关闭岛动画,遵循 ClassHelper 既有文档约定)。 ### 12.3 功能验收 **消息与提醒** - [ ] 通知/作业/叫人三类消息的图标、标题、正文、优先级、时间显示符合第 8 部分。 - [ ] id 去重;同批消息按"优先级 → 时间"排序;列表"展开更多"与"超出工作区提示"正确。 - [ ] 上课期间普通通知/作业暂存、下课补弹;普通叫人保留可点胶囊;紧急通知/紧急叫人立即展开;与 ClassHelper 现有规则逐条一致。 - [ ] 已读/知道了/标为已读/批处理的语义与通知中心状态一致;本机新录作业指纹去重。 - [ ] 自动收起超时:胶囊 15s、展开 20s、紧急 45s、叫人 90s(按现有常量),可打断、可重入。 - [ ] 强提醒仅对开启"强调提醒"的消息出现;关闭后不出现;超时自动关闭;不阻塞岛与其他应用。 - [ ] 消息风暴 20 条/分钟:不丢、不重复、不卡顿、队列上限有日志。 **课程与天气** - [ ] 准备/上课/课间/下课前倒数/课中进度五类提醒按设置触发,阈值默认 60s 可调。 - [ ] 课程状态机跨天、跨周、临时课表、预定课表、调课场景正确(与 ClassHelper 现有解析结果一致)。 - [ ] 课程提醒接管:fixed(classisland)按 ClassIsland 行内容接管显示 prepare/on-class/break;custom 不再临时接管整岛(移除 `resident-lesson-page`),进度由课程组件显示,ending 只保留课程名右侧 30×30 蓝色圆形秒数徽标。 - [ ] 天气:Open-Meteo 15 分钟刷新、断网缓存并显示"缓存"、失败重试与降级、无官方气象预警措辞。 - [ ] 课件传输:传输中覆盖岛内容,显示文件名/类型/教师/字节/进度,完成后校验并回执;不自动运行文件。 **编辑器与设置** - [ ] 设置页:经典/自定义切换、风格切换、外观参数、课程提醒开关、指针避让、动画开关、强提醒开关全部即时保存并生效。 - [ ] 编辑器:方案栏(新建/复制/删除/重命名/导入导出/重置)、组件库 11 类、行(新增/排序/主行/允许提醒/删除)、容器嵌套、拖拽(行内/跨行/库→行/库→容器)、选中与组件设置(内容/外观/尺寸/隐藏条件)、编辑模式预览、预览缩放、退出保存/失败重试。 - [ ] 边界:12 行/200 节点/6 层/20 方案;超限拒绝并提示;非法颜色/数值被夹取;未知组件/未知 Kind 不崩溃。 - [ ] 旧方案导入后可直接渲染(迁移测试)。 ### 12.4 动画验收 - [ ] 第 10 部分动画表逐项实现;时长误差 ≤ 16ms,曲线一致(DevTools Animations 或逐帧截图验证)。 - [ ] 岛出现/隐藏、行展开/折叠、行宽/高度、进度条、消息气泡两阶段、强提醒、课程徽标、滚动/轮播、主题切换全部流畅(≥55fps)。 - [ ] 不可打断的动画可被新状态覆盖(不排队、不闪回)。 - [ ] `animations=false` 生效(唯一岛动画开关);`speed` 统一缩放时长;失焦/隐藏页暂停;恢复后不补播。 - [ ] 动画结束无残留 `will-change`、定时器、rAF。 ### 12.5 兼容与迁移验收 - [ ] 旧 `fixed`/`custom` 配置 fixtures 升级后:方案、行、组件、外观、课程提醒、指针避让、`residentEnabled` 全部保留;迁移幂等。 - [ ] 升级失败可回滚(备份恢复);不可用时保留原文件为 `.corrupt` 并启动默认配置,不得清空。 - [ ] 新配置被旧客户端读取时忽略未知字段、不崩溃(如能构造旧客户端则测;否则单测模拟)。 - [ ] `winisland` 风格下旧观感/旧交互无回归(对照基线图)。 - [ ] 切换 fixed↔custom、风格切换、方案切换均不新开窗口、不丢配置。 ### 12.6 无头与不打扰验收 - [ ] `pnpm verify:desktop`(不带 `--visual`)全程不创建可见岛、托盘气泡、系统通知、声音;测试结束无残留进程/窗口。 - [ ] 使用独立 userData;不触碰真实配置/真实班级/真实通知。 - [ ] `--visual` 仅在显式允许时运行,且截图输出到临时目录;不自动发布。 - [ ] 崩溃自愈限流有效:1 分钟内最多重建 3 次,超过进入安全模式/停止重建。 - [ ] 日志无密码/令牌/敏感路径。 ### 12.7 性能验收 - [ ] 岛渲染进程启动 ≤ 500ms;冷启动到岛可见 ≤ 3s。 - [ ] 空闲 CPU ≤ 1%;消息风暴峰值 ≤ 15% 且 ≤ 500ms。 - [ ] 主进程 + 岛渲染进程内存 ≤ 250MB;24h 增长 ≤ 10%;无句柄泄漏。 - [ ] 包体增量 ≤ 200KB(除说明的例外);无新增大图标/字体文件。 ### 12.8 文档与交付物 - [ ] `docs/app/island.md`、`docs/dev/implementation.md` 更新;新增 `docs/dev/island-refactor.md`。 - [ ] 架构图、数据契约、动画表、迁移与回滚、测试命令齐全。 - [ ] 交付说明:与 ClassIsland 差异、未实现项、性能数据、回滚步骤。 - [ ] 第 12 部分本清单逐项勾选并附验证输出摘要;未验证项标注原因。 ### 12.9 禁止事项(验收时再次确认) - [ ] 未通过修改验收标准/删除测试来"通过"。 - [ ] 未因重构删除既有功能(消息、课程、天气、课件、编辑、导入导出、指针避让、触摸)。 - [ ] 未引入需要联网/登录的新依赖。 - [ ] 未把 ClassIsland 的 C#/XAML/本地档案代码复制进 ClassHelper。