# HWLAB MVP E2E 验收测试与报告 issue 规则

> **门禁最小化见 AGENTS.md P0**: Critical Guard Minimalism Rule、Critical Latest-Requirement Test Rule。以下用例为当前 MVP 验收清单（一次性验证参考，非长期保留门禁）。旧用例阻碍最新交付时删除，新增用例只覆盖明确高价值风险。

本文定义 HWLAB MVP 的用户可读、Agent 可执行验收测试规格。它按 `cli-spec` 的 `TEST.md` 风格组织用例，但报告产物不写入 `docs/` 或 `repository report directory `；每轮验收必须创建一个带编号的 GitHub 测试报告 issue。

## 适用范围

- 当前 G14 DEV 浏览器入口固定为 `http://74.48.78.17:17666/`。
- 当前 G14 DEV API、edge 和 live health 入口固定为 `http://74.48.78.17:17667/` 与 `http://74.48.78.17:17667/health/live`。
- 当前 MVP 上位约束是 `DC-DCSN-P0-2026-003` / [pikasTech/HWLAB#78](https://github.com/pikasTech/HWLAB/issues/78)：M3 虚拟硬件可信闭环必须证明 `res_boxsimu_1:DO1 -> hwlab-patch-panel -> res_boxsimu_2:DI1`。
- 当前默认前端方向以 [pikasTech/HWLAB#99](https://github.com/pikasTech/HWLAB/issues/99) 为准：`/` 必须是类 VS Code 的 Cloud Workbench，不是 Gate、status 或 diagnostics 首页。

## 报告 issue 规则

测试报告产物必须落到 GitHub issue，不进入长期文档目录，也不提交一次性报告文件。

- 报告 issue 标题格式：`[MVP-E2E-RPT-<NNN>] HWLAB MVP E2E 验收测试报告：<简短范围>`。
- `<NNN>` 从 `001` 开始递增；创建前先搜索 open 和 closed issue 中已有的 `MVP-E2E-RPT-` 编号，选择下一个编号。
- 报告 issue 必须包含：测试日期、测试人或 runner、源文档路径、本次目标、DEV URL、observed commit/revision/tag/digest、每个 `T{x}` 用例的状态、blocker class、关键截图或截图附件、operation/trace/audit/evidence id、最终结论和后续 issue。
- 如果 Playwright 截图无法直接上传到 issue，报告 issue 必须记录截图文件路径、文件名、SHA 或可审查的 artifact URL；不能只写“已截图”。
- 任一用例为 `failed` 或 `blocked` 时，总结论只能是 failed/blocked，不得写 pass。

推荐报告 issue body 结构：

```markdown
## 测试范围

- 源文档：docs/reference/MVP-e2e-acceptance.md
- 报告编号：MVP-E2E-RPT-<NNN>
- DEV Cloud Web：
- DEV API/edge：
- observed frontend revision：
- observed API revision：
- runner / tester：

## 结果总览

| 用例 | 状态 | 证据等级 | blocker class | 截图/证据 |
| --- | --- | --- | --- | --- |
| T1 | pass/failed/blocked | DEV-LIVE/SOURCE/DRY-RUN/BLOCKED |  |  |

## 详细记录

## T1

- 操作：
- 观察：
- 截图：
- 关键 ID：
- 结论：

## 安全边界

- 未触碰 PROD：
- 未读取 secret 明文：
- 未重启 UniDesk / Code Queue / backend-core：
- 未把 UniDesk runtime 当 HWLAB runtime：
```

## 证据等级

- `DEV-LIVE`：真实 G14 DEV `17666/17667` 上的浏览器、API、runtime 或短生命周期授权操作证据。
- `SOURCE`：源代码、静态检查、合同校验或未部署构建证据。
- `LOCAL`：本地浏览器、fixture 或本地服务证据。
- `DRY-RUN`：显式 dry-run 输出，不触碰 DEV runtime。
- `BLOCKED`：因为环境、权限、运行态、agent、DB、evidence 或安全边界无法继续。

禁止把 `SOURCE`、`LOCAL`、`DRY-RUN`、fixture、edge-only health、前端静态状态或 UniDesk runtime 代理写成 M3 或 MVP `DEV-LIVE` 通过。

## 验收用例

## T1 DEV 入口与运行边界

阅读 `AGENTS.md`，然后用浏览器或 Playwright 手动测试以下内容：打开 `http://74.48.78.17:17666/`，确认默认页是 HWLAB Cloud Workbench，不是 Gate、status、help 或 diagnostics；访问 `http://74.48.78.17:17667/health` 和 `http://74.48.78.17:17667/health/live`，确认返回 HWLAB DEV API/edge identity。报告必须写明 legacy public `:16666/:16667` 和 public `:6666/:6667` 未作为当前验收入口，UniDesk backend、provider-gateway 和 microservice proxy 未作为 HWLAB runtime 替代。

通过标准：

- `17666` 根页可由浏览器打开，页面标题、主导航或首屏内容明确指向 HWLAB 云工作台。
- `17667/health` 或 `17667/health/live` 返回 JSON，包含 HWLAB service identity 和 dev environment。
- 报告 issue 附桌面首屏截图和 API/health 摘要。

## T2 Cloud Workbench 首屏、布局与中文 UX

阅读 `AGENTS.md`，然后用浏览器或 Playwright 手动测试以下内容：分别在桌面视口和 `390x844` 移动视口截图，确认左侧资源/功能导航、中间 Agent 对话/trace/输入区、右侧硬件状态和控制/接线/可信记录区域可见；外层页面不滚动，滚动只发生在内部面板；用户可见文案中文优先；使用说明是内部入口且由 Markdown 渲染，不是默认首页。

通过标准：

- 默认页显示工作台，不显示 Gate/M0-M5/验收报告作为首屏主体。
- 桌面和移动视口下 `html/body` 或等价应用根节点没有页面级滚动路径。
- 关键中文标签可见，必要机器标识可以保留原文。
- 报告 issue 附桌面、移动和使用说明内部页截图。

## T3 M3 虚拟硬件可信闭环

阅读 `AGENTS.md`，然后用浏览器或 Playwright 手动测试以下内容：在明确授权的 DEV live 窗口内，通过工作台或等价受控入口执行 `res_boxsimu_1:DO1 -> hwlab-patch-panel -> res_boxsimu_2:DI1` 的 true/false 循环。报告必须记录两个 distinct box-simu、两个 distinct gateway-simu、一个 patch-panel、patch-panel-owned wiring、operationId、traceId、auditId 和 evidenceId。

通过标准：

- 写 `DO1=true` 后，`DI1=true` 经 `hwlab-patch-panel` 同步可见；写 `DO1=false` 后，`DI1=false` 同步可见。
- 证据链明确归因到 `hwlab-patch-panel`，没有 box loopback、前端直改状态或 UniDesk runtime 替代。
- operation、trace、audit 和 evidence id 能互相指向同一轮操作。
- 未获授权、目标缺失、持久化 blocked 或任一关键 ID 缺失时，必须标为 `BLOCKED`，不得 claim M3 PASS。

## T4 Code Agent 真实 runner 能力

阅读 `AGENTS.md`，然后用浏览器或 Playwright 手动测试以下内容：在 `17666` 工作台 Agent 区输入 `pwd` 和“列出你可用的 skills”，确认返回来自真实 Codex runner、workspace、tool calls 和 skills 注入，而不是 `openai-responses` text-chat-only。随后让 Agent 通过 `hwlab-cloud-api` 执行同一 M3 硬件任务，确认 agent trace 引用对应 hardware operation 和 audit。

通过标准：

- `pwd` 返回真实 runner 工作目录或结构化 runner blocker。
- skills 查询返回真实 skill 列表、skill 发现输出或结构化 skills blocker。
- runner trace 中能看到工具调用、workspace 证据和 hardware operation/audit 关联。
- 如果只能文本聊天、provider unavailable、无工具调用或无 workspace 证据，必须标为 `BLOCKED/agent-runtime` 或 `BLOCKED/credential`。

## T5 Audit、Evidence 与持久化

阅读 `AGENTS.md`，然后用浏览器或 Playwright 手动测试以下内容：确认直接 M3 操作和 Agent M3 操作都能在工作台、API 或 CLI 输出中看到 hardware audit、agent trace 和 evidence record。最小 evidence record 至少包含 `sessionId`、worker image 或 digest、`skillsCommitId`、`skillsTreeSha` 或文件清单 hash、`workspaceMode`、`agentTraceId`、`operationId`、`auditId`、`result` 和 `createdAt`。

通过标准：

- hardware audit 由 HWLAB cloud/gateway/patch-panel 硬件链路生成，agent 自述不能替代 audit。
- evidence 中不包含 secret/token 明文。
- durable DB 或 evidence adapter 仍 blocked 时，报告必须标注准确 blocker，不得写 trusted green。

## T6 报告 issue 创建与编号

阅读 `AGENTS.md`，然后用浏览器或 Playwright 手动测试以下内容：按本文“报告 issue 规则”创建一个带递增编号的测试报告 issue，标题使用 `[MVP-E2E-RPT-<NNN>]` 前缀。报告 issue 必须挂载本次所有截图、关键 JSON 摘要、测试结论和后续 issue 链接；不得把测试报告正文写入 `docs/reference/`，不得提交一次性报告文件来替代 issue。

通过标准：

- 报告 issue 存在，编号未与历史报告冲突。
- 每个 `T{x}` 都有状态、证据等级和简短证据。
- 最终结论与各用例状态一致。
- 安全边界明确写出：未触碰 PROD、未读取 secret 明文、未重启 UniDesk / Code Queue / backend-core、未用 UniDesk runtime 替代 HWLAB runtime。

## 停止条件

出现以下情况时停止后续 live 或 mutating 测试，并在报告 issue 中标为 `BLOCKED` 或 `failed`：

- 入口不是 G14 DEV `17666/17667`，或命中非当前 HWLAB DEV runtime。
- 需要读取或打印 Secret/token 明文。
- 需要触碰 PROD。
- 需要重启 UniDesk、Code Queue、backend-core 或无关基础设施。
- M3 目标不能证明两个 distinct box-simu、两个 distinct gateway-simu 和 patch-panel-owned wiring。
- agent 只能文本聊天，不能证明真实 runner/workspace/tool/skills。
- 任一结果要求把 SOURCE、LOCAL、DRY-RUN、fixture 或 edge-only 证据升级为 DEV-LIVE。

## 稳定来源

- [architecture.md](architecture.md)：MVP 边界、M3 trusted loop 和证据等级。
- [dev-runtime-boundary.md](dev-runtime-boundary.md)：G14 `17666/17667`、PROD `18666/18667`、G14 k3s 和运行态边界；D601 只作 legacy 回溯。
- [cloud-workbench.md](cloud-workbench.md)：Cloud Workbench 默认首页和 UX 约束。
- [code-agent-chat-readiness.md](code-agent-chat-readiness.md)：Code Agent 真实回复和 provider/runner blocker 判定。
- [m3-loop-rollout-runbook.md](m3-loop-rollout-runbook.md)：M3 live 操作授权、证据和失败分类。
