# HWLAB MVP E2E 验收测试与报告 issue 规则 本文定义 HWLAB MVP 的用户可读、Agent 可执行验收测试规格。它按 `cli-spec` 的 `TEST.md` 风格组织用例,但报告产物不写入 `docs/` 或 `repository report directory `;每轮验收必须创建一个带编号的 GitHub 测试报告 issue。 ## 适用范围 - 当前 DEV 浏览器入口固定为 `http://74.48.78.17:16666/`。 - 当前 DEV API、edge 和 live health 入口固定为 `http://74.48.78.17:16667/` 与 `http://74.48.78.17:16667/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-] HWLAB MVP E2E 验收测试报告:<简短范围>`。 - `` 从 `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- - 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`:真实 DEV `16666/16667` 上的浏览器、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:16666/`,确认默认页是 HWLAB Cloud Workbench,不是 Gate、status、help 或 diagnostics;访问 `http://74.48.78.17:16667/health` 和 `http://74.48.78.17:16667/health/live`,确认返回 HWLAB DEV API/edge identity。报告必须写明 public `:6666/:6667` 未作为当前验收入口,UniDesk backend、provider-gateway 和 microservice proxy 未作为 HWLAB runtime 替代。 通过标准: - `16666` 根页可由浏览器打开,页面标题、主导航或首屏内容明确指向 HWLAB 云工作台。 - `16667/health` 或 `16667/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 手动测试以下内容:在 `16666` 工作台 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-]` 前缀。报告 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`: - 入口不是 `16666/16667`,或命中非 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):`16666/16667`、D601 k3s 和运行态边界。 - [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 操作授权、证据和失败分类。