# R2 任务报告

## 结论

已完成 [UniDesk #2248](https://github.com/pikasTech/unidesk/issues/2248) 的通用工具改进：新增 `web-probe console-verify` typed command，将 Cloud Console 全路由、多视口、截图和可选 Projects/HWPOD/MDTODO/AgentRun 交互验收收敛为一个受控入口。

该命令不新增浏览器执行器，继续复用现有认证、semantic origin、远程 script runner、report recovery、截图、结构化输出和 `MemAvailable` 物理内存门禁。它只用于已部署页面人工 closeout，不进入 CI/CD gate，也不替代 Workbench Kafka、Trace 或性能专项 validator。

## 配置与实现

- owning YAML：`config/hwlab-node-lanes.yaml#templates.*.webProbeWorkbench.consoleVerificationProfiles`。
- CLI：`bun scripts/cli.ts web-probe console-verify --node <node> --lane <lane> --origin internal|public --profile <profile>`。
- profile 拥有视口、路由、ready selector、截图预算、等待、输出上限和可选产品工作流。
- parser 对未知字段、重复 route/viewport、未知 route 引用、越界参数和截图预算不足 fail-fast。
- runner 一次创建一棵受控浏览器进程树，按路由×视口矩阵检查空白页、登录重定向、横向溢出和 HTTP 5xx，并输出有界 report/screenshot SHA。
- 产品工作流覆盖卡片/列表/树切换、URL view state、HWPOD reduced-motion 与深链刷新、Python 接入命令、MDTODO 任务深链与报告预览/全屏、AgentRun 单产品 EventSource。
- 生成命令标记为 repo-owned，最终 command governance 不再产生 ad-hoc script warning。

## 工具调用缩减

改进前需要先查 runner helper、临时维护 `.state/probes/*.mjs`、手工枚举路由/视口/selector，再执行 `web-probe script` 并人工抽取证据。

改进后同类任务只需一次 `web-probe console-verify` 调用；node、lane、origin 和 profile 是变化输入，其余验证矩阵由 owning YAML 维护。新页面或 DOM 合同变化只改 profile，不复制 runner。

## 验证

- `bun test scripts/src/hwlab-node-web-probe-console-verify.test.ts scripts/src/hwlab-node-web-probe-memory-guard.test.ts`：17/17 通过。
- `bun scripts/cli.ts check --syntax-only`：11/11 通过。
- `bun scripts/cli.ts web-probe --help`：默认输出未截断。
- `git diff --check`：通过。
- controlled scripts typecheck 的仓库全局 gate 仍有既有基线错误：
  - 新增的三个 Console 文件匹配错误数为 0；
  - `scripts/src/hwlab-node/web-probe.ts` 匹配错误数为 0；
  - `scripts/src/hwlab-node-lanes.ts` 的 2 条错误位于本任务未修改的既有代码，主分支同样存在。
- NC01 单命令 smoke：
  - `MemAvailable=2.62 GiB`；
  - 门禁阈值 `4 GiB`；
  - 返回 `status=blocked`、`decision=gc-required`；
  - 未创建 Chromium；
  - 输出 plan→run→status-until-terminal→memory-recheck 顺序。

## 未冒充完成的范围

本报告只完成通用 WebProbe 工具改进。HWLAB Web 产品体验 R2.4/R3 的真实页面验收仍需等待 NC01 `MemAvailable > 4 GiB` 后，分别对 internal 和 public semantic origin 执行该 typed command；当前 blocked smoke 不能作为页面通过证据。
