Files
nodeagent/tests/e2e
jkooe 92df08eb20 test(v7~v13): 新能力补齐 e2e 覆盖(21 -> 26 用例)—— 审查报告 §5.1-3
## 背景
报告指出「v7/v8 新能力零自动化测试,只有提交说明里的真机手验」。此前 e2e 覆盖止于 v6。

## 新增 5 个用例(tests/e2e/run.mjs)
1. **v8 GUI 语义契约** —— 不断言「屏幕上一定有什么」(CI 无桌面会话时不可靠),
   而断言对外契约:window.list 结构 + 前台窗口排最前(否则会被 limit 截掉);
   window.focus 目标不存在时是干净错误;screen.find 无命中返回空数组 + engine + waited_ms;
   参数越界必须被拒
2. **v10 剪贴板与后台任务** —— clip.set/get 往返;异步 exec → task_id →
   续读输出 → 任务列表 → 终止长任务并断言 state=killed / exit_code=124
3. **v12 事件订阅** —— 文件监控:制造变动后**同时验证两条通路**
   (onEvent 推送 + event.poll 增量游标),并验证 unwatch 生效
4. **v12 GUI 宏引擎** —— 不依赖 GUI 的步骤组合(exec+clip+assert+sleep)回放;
   断言失败必须中止并给出 failed_at 定位;optional 失败不中断
5. **v13 成功指标与审计链** —— 指标字段齐全、分层时延存在、拦截率恒 1、
   无样本时装软件成功率为 null(而非 0);audit.verify 链完整

## 写用例时踩到并固化的契约(重要,已写入测试注释)
**协议层错误会抛异常,能力层失败才返回 {status:'failed'}**:
  - 能力层失败(输入未开启 / 窗口未找到)→ 返回 { status:'failed', error:{name} }
  - 协议层失败(参数校验 / 鉴权 / ACL / 限速)→ invoke() **抛 ClientError**(err.name = 错误码)
新增 expectProtocolError() 辅助函数统一断言后者,避免后续再写错。
另修正:任务终态是 `done`(不是 exited),运行中为 `running`。

单测 105/105、e2e 26/26 全绿
2026-09-30 00:56:49 +08:00
..