# 05-验收证据

版本：0.1
日期：2026-06-28

## 1. 证据状态

| 状态 | 含义 |
| --- | --- |
| 待验证 | 任务尚未执行或未产生产物。 |
| 通过 | 已执行且满足验收标准。 |
| 不通过 | 已执行但不满足验收标准。 |
| 跳过 | 因明确边界暂不执行，必须说明原因。 |

## 2. 基准证据项

| 证据 | 状态 | 目标产物 |
| --- | --- | --- |
| EV-W2-SPEC-001：语法覆盖矩阵 | 通过 | `working2/programs/manifest.md` 和 `spec-programs/manifest.json` 已覆盖章节 4 到 25。 |
| EV-W2-PROG-010：Runtime 程序创建 | 通过 | `kdl-wasm/web/tests/fixtures/abb120/spec-programs/runtime/W2_*.grl` 共 11 个；manifest Runtime 层级共 12 项。 |
| EV-W2-PROG-020：Error 程序创建 | 通过 | `static/error/W2_E*.grl` 共 5 个，其中 4 个 Static、1 个 Runtime timeout error。 |
| EV-W2-PROG-030：Post 程序创建 | 通过 | `post/W2_P*.grl` 共 3 个。 |
| EV-W2-RUN-001：suite runner | 通过 | `kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/job.json`。 |
| EV-W2-RUN-030：虚拟控制器执行 | 通过 | 每个 runtime 程序输出 `controller.json`、`trace.json`、`motion-queue.json`。 |
| EV-W2-RUN-040：逐帧轨迹 | 通过 | Runtime 轨迹 `trajectory.json` 包含 `frames[]`，每帧包含 joints[6]、TCP position[3] 和 TCP quaternion[4]。 |
| EV-W2-RUN-050：IO/wait/pulse | 通过 | `W2_60_IOWaitPulse` 和 `W2_E50_RuntimeTimeout` 输出 IO/wait/pulse/timeout trace。 |
| EV-W2-POST-010：三品牌输出 | 通过 | `post-report.json` 记录 ABB/FANUC/KUKA 文件名和 report。 |
| EV-W2-POST-020：roundtrip | 通过 | `roundtrip.json` 记录 ABB import 回读状态和 diagnostics。 |
| EV-W2-UI-020：HTML 截图 | 通过 | `kdl-wasm/web/test-results/virtual-controller/virtual-controller-desktop.png`、`virtual-controller-mobile.png`、`evidence.json`。 |
| EV-W2-CI-900：全量命令 | 通过 | `npm run typecheck`、`npm test`、`npm run verify:virtual-controller` 全部通过；WASM native build 未执行。 |
| EV-W2-DEPLOY-001：演示包 manifest | 通过 | `demo-manifest.json` 包含 release_id、job_id、19 个程序、报告、截图、文档入口。 |
| EV-W2-DEPLOY-020：演示包 zip | 通过 | `kdl-wasm/web/test-results/deploy/kdl-olp-demo-20260628-164048-W2-JOB-20260628082622-51484d62.zip`。 |
| EV-W2-DEPLOY-040：HTTPS 发布 | 通过 | `https://82.156.24.101:8095/` 可访问首页、虚拟控制器、report、截图和逐帧轨迹 JSON。 |
| EV-W2-DEPLOY-050：远程 smoke test | 通过 | `kdl-wasm/web/test-results/deploy/kdl-olp-demo-20260628-164048-W2-JOB-20260628082622-51484d62.deploy.json`，`program_count=19` 且 `summary.fail=0`。 |

## 3. 建议命令

### 3.1 文档和覆盖矩阵检查

```powershell
rg -n "W2_|通用机器人编程语法规范|Runtime|Static|Post|ABB120|虚拟控制器" working2
```

预期：能找到 README、任务矩阵、验收证据、决策记录和 manifest 中的覆盖项。

### 3.2 GRL 和 ABB120 测试

```powershell
cd E:\Work\kdl_work
npm test -- grl abb120
```

预期：GRL parser/semantic、ABB120 fixture、表达式和程序编译测试通过。

### 3.3 虚拟控制器运行测试

```powershell
npm test -- virtual controller runtime
```

预期：状态机、IR runtime、motion queue、IO runtime、workbench/debug facade 测试通过。

### 3.4 后处理和导入回读

```powershell
npm test -- post import roundtrip
```

预期：ABB/FANUC/KUKA post、brand import、roundtrip diff 测试通过。

### 3.5 HTML 虚拟控制器截图

```powershell
npm run verify:virtual-controller
```

预期：桌面和移动截图生成，状态交互、Wait 置位和无横向溢出检查通过。

### 3.6 可选 WASM native build

```powershell
cmake --build kdl-wasm/build-wasm -j16
```

预期：当前 Emscripten/Ninja 环境可用时构建通过；如环境缺失，记录为环境阻塞而不是功能通过。

### 3.7 服务器演示包生成

建议后续实现脚本：

```powershell
cd E:\Work\kdl_work
node kdl-wasm/web/scripts/build-demo-package.mjs
node kdl-wasm/web/scripts/verify-demo-package.mjs kdl-wasm/web/test-results/deploy/kdl-olp-demo-<release_id>.zip
```

预期：生成 zip；解压校验包含 `index.html`、`demo-manifest.json`、19 个 `.grl`、最新 `W2-JOB-*`、逐帧 `trajectory.frames`、2 张截图和 2 份 Word 文档。

### 3.8 HTTPS 远程 smoke test

```powershell
$base = "https://82.156.24.101:8095"
curl.exe -k "$base/"
curl.exe -k "$base/demo-manifest.json"
curl.exe -k "$base/spec-programs/manifest.json"
curl.exe -k "$base/app/virtual-controller.html"
curl.exe -k "$base/test-results/abb120-spec/<job_id>/report.json"
curl.exe -k "$base/test-results/virtual-controller/virtual-controller-desktop.png" --output NUL
curl.exe -k "$base/test-results/virtual-controller/virtual-controller-mobile.png" --output NUL
```

预期：

1. 关键 URL 返回 200。
2. `demo-manifest.json` 中 `program_count` 为 19。
3. `report.json` 中 `summary.fail` 为 0。
4. 浏览器可打开虚拟控制器页面和报告页面。

## 4. 实际产物目录

```text
kdl-wasm/web/test-results/abb120-spec/
  W2-JOB-20260628022836-51484d62/
    job.json
    manifest.json
    report.json
    report.html
    programs/
      <program_id>/
        compile.json
        controller.json
        motion-queue.json
        trace.json
        io.json
        trajectory.json
        post-report.json
        roundtrip.json
```

每个 `job.json` 必须包含：

1. `job_id`
2. `suite_id`
3. `robot_id`
4. `spec_version`
5. `programs`
6. `commands`
7. `status`
8. `diagnostics`
9. `artifact_paths`

## 5. 当前记录

| 时间 | 命令 | 结果 |
| --- | --- | --- |
| 2026-06-28 09:38 Asia/Shanghai | `npm run suite:abb120-spec` | 通过；生成 `W2-JOB-20260628013857-19b5a2c7`，18 个程序，missingSections 为空。 |
| 2026-06-28 09:40 Asia/Shanghai | `npm run typecheck` | 通过。 |
| 2026-06-28 09:41 Asia/Shanghai | `npm test` | 通过；41 个 test files，155 个 tests。 |
| 2026-06-28 09:42 Asia/Shanghai | `npm run verify:virtual-controller` | 通过；desktop screenshot 49892 bytes，mobile screenshot 47887 bytes，wait=`satisfied`，所有主要面板可见。 |
| 2026-06-28 10:28 Asia/Shanghai | `npm test -- abb120SpecSuite` | 通过；manifest 引用、层级、expected status、expected diagnostics 和 W2_99 完整示例证据均通过。 |
| 2026-06-28 10:28 Asia/Shanghai | `npm run typecheck` | 通过。 |
| 2026-06-28 10:28 Asia/Shanghai | `npm run suite:abb120-spec` | 通过；生成 `W2-JOB-20260628022836-51484d62`，19 个程序，missingSections 为空。 |
| 2026-06-28 10:33 Asia/Shanghai | `npm test` | 通过；41 个 test files，155 个 tests。 |
| 2026-06-28 10:33 Asia/Shanghai | `npm run verify:virtual-controller` | 通过；desktop screenshot 49892 bytes，mobile screenshot 47887 bytes，wait=`satisfied`，所有主要面板可见。 |
| 2026-06-28 12:06 Asia/Shanghai | `npm run demo:build` | 通过；生成 release `20260628-120601-W2-JOB-20260628024709-51484d62`，zip 3769732 bytes，sha256=`e3d936ae5e2c813f80346363b66b82fc19c87fe61ca421ac1b2de2eb4bc1c699`。 |
| 2026-06-28 12:06 Asia/Shanghai | `npm run demo:verify -- kdl-wasm/web/test-results/deploy/kdl-olp-demo-20260628-120601-W2-JOB-20260628024709-51484d62.zip` | 通过；解压后 `program_count=19`、`.grl=19`、`summary.fail=0`、截图和 2 份 Word 文档均存在。 |
| 2026-06-28 12:07 Asia/Shanghai | 上传并切换服务器 release | 通过；`current` 指向 `/opt/kdl-olp-demo/8095/releases/20260628-120601-W2-JOB-20260628024709-51484d62`，`previous` 指向 `/opt/kdl-olp-demo/8095/releases/20260628-120357-W2-JOB-20260628024709-51484d62`，服务 `kdl-site-8095` 为 active。 |
| 2026-06-28 12:07 Asia/Shanghai | HTTPS remote smoke test | 通过；`/`、`/demo-manifest.json`、`/spec-programs/manifest.json`、`/app/virtual-controller.html`、`report.json`、`report.html`、desktop/mobile png 全部返回 200；`program_count=19`、`summary.fail=0`。 |
| 2026-06-28 12:15 Asia/Shanghai | `npm run typecheck` | 通过。 |
| 2026-06-28 12:15 Asia/Shanghai | `npm test` | 通过；41 个 test files，155 个 tests。 |
| 2026-06-28 16:25 Asia/Shanghai | `npm run typecheck` | 通过。 |
| 2026-06-28 16:25 Asia/Shanghai | `npm test -- kdl-wasm/web/tests/integration/abb120SpecSuite.test.ts kdl-wasm/web/tests/integration/abb120SuiteArtifacts.test.ts` | 通过；5 个 integration tests 通过，包含逐帧 trajectory 断言。 |
| 2026-06-28 16:26 Asia/Shanghai | `npm run suite:abb120-spec` | 通过；生成 `W2-JOB-20260628082622-51484d62`，19 个程序，missingSections 为空。 |
| 2026-06-28 16:28 Asia/Shanghai | `npm run verify:virtual-controller` | 通过；desktop screenshot 45302 bytes，mobile screenshot 40407 bytes，`Run` 后 state=`running`，DI wait=`satisfied`。 |
| 2026-06-28 16:35 Asia/Shanghai | `npm run demo:verify -- kdl-wasm/web/test-results/deploy/kdl-olp-demo-20260628-163458-W2-JOB-20260628082622-51484d62.zip` | 通过；`program_count=19`、`.grl=19`、`summary.fail=0`、`runtime_trajectory_frames=9/12`。 |
| 2026-06-28 16:38 Asia/Shanghai | `powershell -NoProfile -ExecutionPolicy Bypass -File kdl-wasm/web/scripts/deploy-demo-package.ps1 -ZipPath ... -Target abigailaw-8091` | 通过；关键 URL 全部 200，`program_count=19`、`summary.fail=0`，服务 `kdl-site-8095` 自动重启后读取新 release。 |
| 2026-06-28 16:39 Asia/Shanghai | Python HTTPS 远程逐帧轨迹抽查 | 通过；`W2_30_MotionAllTypes` 有 12 帧，`W2_60_IOWaitPulse` 有 4 帧，`W2_99_FullSpecExample` 有 32 帧，均含 joints 和 TCP。 |

### 最新 job

| 项 | 值 |
| --- | --- |
| job_id | `W2-JOB-20260628082622-51484d62` |
| suite_id | `working2-abb120-spec` |
| robot_id | `abb_irb120_3_58` |
| job.json | `kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/job.json` |
| report.html | `kdl-wasm/web/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/report.html` |
| HTML screenshots | `kdl-wasm/web/test-results/virtual-controller/` |

## 6. 服务器发布证据记录模板

| 项 | 值 |
| --- | --- |
| release_id | `20260628-164048-W2-JOB-20260628082622-51484d62` |
| zip 路径 | `kdl-wasm/web/test-results/deploy/kdl-olp-demo-20260628-164048-W2-JOB-20260628082622-51484d62.zip` |
| zip hash | 见同目录 `kdl-olp-demo-20260628-164048-W2-JOB-20260628082622-51484d62.summary.json`。 |
| job_id | `W2-JOB-20260628082622-51484d62` |
| 发布地址 | `https://82.156.24.101:8095/` |
| 服务器 release 目录 | `/opt/kdl-olp-demo/8095/releases/20260628-164048-W2-JOB-20260628082622-51484d62` |
| current 指向 | `/opt/kdl-olp-demo/8095/releases/20260628-164048-W2-JOB-20260628082622-51484d62` |
| smoke test 时间 | `2026-06-28 16:40 Asia/Shanghai` |
| smoke test 结果 | 通过；关键 URL 全部 200，`program_count=19`，`summary.fail=0`。 |
| 回滚目录 | `/opt/kdl-olp-demo/8095/releases/20260628-163458-W2-JOB-20260628082622-51484d62` |

## 7. 远程页面人工验收记录模板

| 演示项 | 程序或页面 | 结果 | 备注 |
| --- | --- | --- | --- |
| 首页打开 | `/` | 通过 | HTTP 200，返回 11199 bytes。 |
| manifest 打开 | `/demo-manifest.json` | 通过 | HTTP 200，`program_count=19`。 |
| 虚拟控制器打开 | `/app/virtual-controller.html` | 通过 | HTTP 200，页面包含 Program 下拉、Frame slider 和 `Trajectory Frames` 表格。 |
| 报告打开 | `/test-results/abb120-spec/W2-JOB-20260628082622-51484d62/report.html` | 通过 | HTTP 200，返回 2266 bytes。 |
| 最小运动演示 | `W2_00_MinimalModule` | 通过 | 程序源和 compile artifact 均在 manifest 中可跳转。 |
| 三类运动演示 | `W2_30_MotionAllTypes` | 通过 | 远程 `trajectory.json` 有 12 帧，每帧包含 TCP 和 J1-J6。 |
| IO/wait/pulse 演示 | `W2_60_IOWaitPulse` | 通过 | 远程 `trajectory.json` 有 4 帧；页面 DI1 可将 wait 切到 `satisfied`。 |
| 完整示例演示 | `W2_99_FullSpecExample` | 通过 | 远程 `trajectory.json` 有 32 帧，每帧包含 TCP 和 J1-J6。 |
| 静态诊断展示 | `W2_E10` 到 `W2_E40` | 通过 | `report.json` 中保留 expected diagnostics，`summary.fail=0`。 |
| 后处理展示 | `W2_P10` 到 `W2_P30` | 通过 | post/roundtrip artifacts 均在 package 内。 |
| 桌面截图打开 | `virtual-controller-desktop.png` | 通过 | HTTP 200，45302 bytes。 |
| 移动截图打开 | `virtual-controller-mobile.png` | 通过 | HTTP 200，40407 bytes。 |
