# 05-验收证据

版本：0.3  
日期：2026-06-27

## 1. 记录规则

每条证据必须包含：

1. 证据编号。
2. 关联任务。
3. 对标章节。
4. 命令、页面、报告、截图、日志或产物路径。
5. 执行环境。
6. 结果摘要。
7. 是否通过。

状态取值：

| 状态 | 含义 |
| --- | --- |
| 待验证 | 任务未执行或证据未产生。 |
| 通过 | 结果满足验收标准。 |
| 不通过 | 已执行但不满足验收标准。 |
| 阻塞 | 因环境、依赖或设计问题无法验证。 |

## 2. 环境基线

| 项 | 当前值 |
| --- | --- |
| 工作区 | `/home/meswork/kdl_work` |
| KDL 源码 | `/home/meswork/kdl_work/orocos_kinematics_dynamics/orocos_kdl` |
| KDL 对标文档 | `/home/meswork/kdl_work/work/doc/KDL_WASM计算接口设计.md` |
| GRL 对标文档 | `/home/meswork/kdl_work/work/doc/通用机器人编程语法规范.md` |
| 实施文档目录 | `/home/meswork/kdl_work/work/working1` |
| Emscripten | `emcc 6.0.0` |
| Node.js | `v22.23.0` |
| 浏览器 | 待 Playwright 安装后记录 |

## 3. 管理证据

### EV-000：对标实施文档

关联任务：`KW-000`  
对标章节：两份源文档全文  
类型：文件清单  
命令：

```bash
find /home/meswork/kdl_work/work/working1 -maxdepth 1 -type f -print | sort
```

预期结果：

```text
README.md
01-项目功能内容.md
02-项目程序开发详细步骤.md
03-推进台账.md
04-任务矩阵.md
05-验收证据.md
06-决策记录.md
```

结果摘要：实际文件清单包含 `README.md`、`01-项目功能内容.md`、`02-项目程序开发详细步骤.md`、`03-推进台账.md`、`04-任务矩阵.md`、`05-验收证据.md`、`06-决策记录.md`，与预期一致。  
是否通过：通过。

## 4. KDL WASM 证据

### EV-001：WASM 工程和 Worker RPC

关联任务：`KW-001`  
对标章节：KDL 2、17、18、24  
类型：构建和单元测试  
命令：

```bash
cd /home/meswork/kdl_work
npm run typecheck
emcmake cmake -S kdl-wasm -B kdl-wasm/build-wasm \
  -DCMAKE_BUILD_TYPE=Release \
  -DKDL_SOURCE_DIR=/home/meswork/kdl_work/orocos_kinematics_dynamics/orocos_kdl
cmake --build kdl-wasm/build-wasm -j16
npm run test -- kdl rpc
node --input-type=module -e "import createKdlModule from './kdl-wasm/build-wasm/kdl.js'; const m=await createKdlModule({ locateFile: (p) => new URL('./kdl-wasm/build-wasm/' + p, import.meta.url).pathname }); const rc=m.ccall('kdl_init','number',['string'],['{}']); console.log(JSON.stringify({ rc, hasCwrap: typeof m.cwrap === 'function' }));"
```

预期产物：

```text
kdl-wasm/build-wasm/kdl.js
kdl-wasm/build-wasm/kdl.wasm
kdl-wasm/build-wasm/kdl.d.ts
```

执行环境：

```text
Node.js v22.23.0
npm 10.9.8
cmake 3.22.1
emcmake/emcc: /home/meswork/emsdk/upstream/emscripten
```

结果摘要：

1. `npm run typecheck` 通过。
2. CMake 配置和 `cmake --build kdl-wasm/build-wasm -j16` 通过。
3. 产物存在：`kdl-wasm/build-wasm/kdl.js`、`kdl-wasm/build-wasm/kdl.wasm`、`kdl-wasm/build-wasm/kdl.d.ts`。
4. `npm run test -- kdl rpc` 通过，2 个测试文件共 11 个测试通过。
5. Node 动态加载 `kdl.js` 并调用 `kdl_init`，输出 `{"rc":0,"hasCwrap":true}`。
6. 当前 C ABI 在 `KW-013` 已补稳定导出、RobotHandle 生命周期和结构化错误边界；轮次 024/025 已进一步接入 native KDL Chain、FK、fkAllLinks、Jacobian、IK 和 sampleTrap，高层轨迹规划仍由 TypeScript runtime 基线承载。

是否通过：通过。

### EV-002：URDF 和 `NormalizedRobotModel`

关联任务：`KW-002`  
对标章节：KDL 6、22、23、24  
类型：单元测试  
命令：

```bash
npm run typecheck
npm run test -- kdl urdf normalized-model
```

验证点：

1. URDF link/joint/origin/axis/limit 解析。
2. base/tip 连通性诊断。
3. activeJointNames 顺序稳定。
4. `createRobotFromModel/getRobotInfo/getJointLimits/destroyRobot`。

执行环境：

```text
Node.js v22.23.0
npm 10.9.8
Vitest 3.2.6
```

结果摘要：

1. `npm run typecheck` 通过。
2. `npm run test -- kdl urdf normalized-model` 通过，4 个测试文件共 19 个测试通过。
3. URDF 解析覆盖 link、joint、origin、axis、limit。
4. `NormalizedRobotModel` 生成 `activeJointNames`、`limits`、`source.urdfHash`。
5. base/tip 不连通、unsupported joint type 返回 `KDL_INVALID_MODEL` 结构化诊断。
6. Worker runtime 支持 `loadRobotFromUrdf/createRobotFromModel/getRobotInfo/getJointLimits/destroyRobot` 的 RobotHandle 生命周期。
7. Worker runtime 当前仍由 TypeScript registry 管理 RobotHandle；C ABI 已可根据同一 `NormalizedRobotModel` 构造 native KDL Chain 并执行 FK、fkAllLinks、Jacobian、IK 和 sampleTrap。

是否通过：通过。

### EV-003：FK 和 fkAllLinks

关联任务：`KW-003`  
对标章节：KDL 8.1、8.2、22、23  
类型：单元测试  
命令：

```bash
npm run typecheck
npm run test -- kdl fk
```

验证点：

1. `fk` 返回 flange、tcp、joints、diagnostics。
2. `fkAllLinks` 返回 link pose 列表。
3. FK golden 数据误差在容差内。
4. 关节维度错误返回结构化诊断。

执行环境：

```text
Node.js v22.23.0
npm 10.9.8
Vitest 3.2.6
```

结果摘要：

1. `npm run typecheck` 通过。
2. `npm run test -- kdl fk` 通过，6 个测试文件共 28 个测试通过。
3. `cmake --build kdl-wasm/build-wasm -j16` 回归通过。
4. `fk` 返回 `ok/flange/tcp/joints/diagnostics`。
5. `fkAllLinks` 返回 base-to-tip link pose 顺序。
6. 覆盖零位 FK、revolute + prismatic 关节、tool TCP 偏移、link 顺序和关节维度结构化诊断。
7. Worker `fk/fkAllLinks` 当前为 TypeScript 标准模型数值基线；C ABI 已补 native `kdl_fk` pose7 golden 测试和 `kdl_fk_all_links` JSON link pose 顺序测试。

是否通过：通过。

### EV-004：IK 和 ikBatch

关联任务：`KW-004`  
对标章节：KDL 8.3、15、22、23  
类型：单元测试  
命令：

```bash
npm run typecheck
npm run test -- kdl ik
```

验证点：

1. IK 后 FK 回代误差小于容差。
2. `ikBatch` 顺序保持。
3. seed、多 seed、qMin/qMax、maxIterations 生效。
4. 不可达、限位、奇异、迭代失败原因稳定。

执行环境：

```text
Node.js v22.23.0
npm 10.9.8
Vitest 3.2.6
```

结果摘要：

1. `npm run typecheck` 通过。
2. `npm run test -- kdl ik` 通过，8 个测试文件共 34 个测试通过。
3. `ik` 返回 `ok/joints/iterations/residualPosition/residualOrientation/reason/diagnostics`。
4. 覆盖可达目标 IK、FK 回代误差、`ikBatch` 顺序保持、关节限位失败、unsupported model 的 `invalid_model` reason。
5. Worker IK 当前为 TypeScript 基线几何求解器，支持 single-prismatic 和 Rz+Px 链；C ABI 已补 native Orocos KDL `ChainIkSolverPos_LMA` IK 回代测试，后续可继续把 Worker IK 路由切到 native solver。

是否通过：通过。

### EV-005：Jacobian、奇异性和检查 API

关联任务：`KW-005`  
对标章节：KDL 8.4、15、22、23  
类型：单元测试  
命令：

```bash
npm run typecheck
npm run test -- kdl jacobian checks
```

验证点：

1. Jacobian rows/cols/data 正确。
2. 奇异点 warning。
3. 关节限位、速度限位、可达性诊断。
4. 批量可达性结果与输入一一对应。

执行环境：

```text
Node.js v22.23.0
npm 10.9.8
Vitest 3.2.6
```

结果摘要：

1. `npm run typecheck` 通过。
2. `npm run test -- kdl jacobian checks` 通过，9 个测试文件共 38 个测试通过。
3. `npm test` 通过，9 个测试文件共 38 个测试通过。
4. `cmake --build kdl-wasm/build-wasm -j16` 通过。
5. `jacobian` 返回 `ok/rows/cols/data/diagnostics`，覆盖 6 x dof 矩阵和关键线速度分量。
6. `checkSingularity` 返回 `nearSingularity/manipulability/conditionNumber`，奇异场景返回 `KDL_SINGULARITY` warning。
7. `checkJointLimits/checkVelocityLimits` 返回 `KDL_JOINT_LIMIT/KDL_VELOCITY_LIMIT/KDL_ACCEL_LIMIT` 结构化诊断。
8. `checkReachability/checkReachabilityBatch` 基于 IK 返回可达性、关节解、残差和批量顺序。
9. 轮次 024 已补 C ABI native `kdl_jacobian` golden 测试，覆盖 Orocos KDL `ChainJntToJacSolver` 输出的 6 x dof 矩阵。

是否通过：通过。

### EV-006：位姿变换和 offset

关联任务：`KW-006`  
对标章节：KDL 7、21、22、23  
类型：单元测试  
命令：

```bash
npm run typecheck
npm run test -- kdl pose offset
npm test
cmake --build kdl-wasm/build-wasm -j16
```

验证点：

1. `normalizePose` 处理 `pose/poseq`。
2. `composePose/inversePose` 数值正确。
3. `applyToolAndFrame` 与 GRL tool/frame 语义一致。
4. `applyOffset` 支持 frame/tool/world。

执行环境：

```text
Node.js v22.23.0
npm 10.9.8
Vitest 3.2.6
```

结果摘要：

1. `npm run typecheck` 通过。
2. `npm run test -- kdl pose offset` 通过，10 个测试文件共 43 个测试通过。
3. `npm test` 通过，10 个测试文件共 43 个测试通过。
4. `cmake --build kdl-wasm/build-wasm -j16` 通过。
5. `normalizePose` 支持 `position/quaternion`、`xyz/rpy`、`xyz/quat`，并规范化四元数。
6. `composePose/inversePose` 覆盖平移组合和逆变换回到 identity。
7. `applyToolAndFrame` 按当前 FK 约定执行 `frame * target.pose * tool`。
8. `applyOffset` 覆盖 `frame/world` 左乘偏移、`tool` 右乘偏移，并保留目标点元数据。
9. 非法位姿输入返回 `KDL_INVALID_POSE` 结构化诊断。

是否通过：通过。

### EV-007：梯形速度曲线

关联任务：`KW-007`  
对标章节：KDL 9、22、23  
类型：单元测试  
命令：

```bash
npm run typecheck
npm run test -- kdl trap-profile
npm test
cmake --build kdl-wasm/build-wasm -j16
```

验证点：

1. 长距离为 trapezoid。
2. 短距离为 triangle。
3. 首末采样点严格对应 `s=0` 和 `s=1`。
4. `s` 单调递增。

执行环境：

```text
Node.js v22.23.0
npm 10.9.8
Vitest 3.2.6
```

结果摘要：

1. `npm run typecheck` 通过。
2. `npm run test -- kdl trap-profile` 通过，11 个测试文件共 47 个测试通过。
3. `npm test` 通过，11 个测试文件共 47 个测试通过。
4. `cmake --build kdl-wasm/build-wasm -j16` 通过。
5. 长距离场景生成 trapezoid，覆盖 `tAccel/tConst/tDecel/duration/vPeak`。
6. 短距离场景自动退化为 triangle，并输出 `KDL_TRAP_TRIANGLE_PROFILE` info 诊断。
7. `makeTrapProfile` 返回完整 profile 和 samples，`sampleTrapProfile` 返回同一采样规则下的 samples。
8. 首末采样点严格对应 `s=0` 和 `s=1`，采样时间和 `s` 单调递增。
9. 非法输入返回 `KDL_INVALID_TRAP_PROFILE` 结构化诊断。

是否通过：通过。

### EV-008：MOVEJ 轨迹

关联任务：`KW-008`  
对标章节：KDL 11、21、22、23  
类型：运动测试  
命令：

```bash
npm run typecheck
npm run test -- kdl movej planMoveJ
npm test
cmake --build kdl-wasm/build-wasm -j16
```

验证点：

1. 关节同起同停。
2. `joint_target` 和 `pose_target` 两类目标。
3. FK 输出 TCP。
4. 限位、速度、加速度、奇异性诊断。
5. 非 fine zone 返回 `KDL_ZONE_APPROX_FINE`。

执行环境：

```text
Node.js v22.23.0
npm 10.9.8
Vitest 3.2.6
```

结果摘要：

1. `npm run typecheck` 通过。
2. `npm run test -- kdl movej planMoveJ` 通过，12 个测试文件共 51 个测试通过。
3. `npm test` 通过，12 个测试文件共 51 个测试通过。
4. `cmake --build kdl-wasm/build-wasm -j16` 通过。
5. `planMoveJ` 支持 `joint_target` 直接规划和 `pose_target` IK 求终点关节。
6. 轨迹点输出 `time/dt/s/sd/sdd/joints/jointVelocity/jointAcceleration/flange/tcp`。
7. 使用梯形速度曲线生成关节同步轨迹，首末点速度归零。
8. 终点关节限位失败返回 `TrajectoryResult.ok=false` 和 `KDL_JOINT_LIMIT`。
9. 速度、加速度保持在 joint limits 内；非 fine zone 返回 `KDL_ZONE_APPROX_FINE` warning；采样点奇异性返回 `KDL_SINGULARITY` warning。

是否通过：通过。

### EV-009：MOVEL 轨迹

关联任务：`KW-009`  
对标章节：KDL 12、21、22、23  
类型：运动测试  
命令：

```bash
npm run typecheck
npm run test -- kdl movel planMoveL
npm test
cmake --build kdl-wasm/build-wasm -j16
```

验证点：

1. 起点 FK。
2. 目标 tool/frame/offset。
3. TCP 直线误差。
4. 逐点 IK 连续。
5. 速度、加速度、姿态误差和配置突变诊断。

执行环境：

```text
Node.js v22.23.0
npm 10.9.8
Vitest 3.2.6
```

结果摘要：

1. `npm run typecheck` 通过。
2. `npm run test -- kdl movel planMoveL` 通过，13 个测试文件共 54 个测试通过。
3. `npm test` 通过，13 个测试文件共 54 个测试通过。
4. `cmake --build kdl-wasm/build-wasm -j16` 通过。
5. `planMoveL` 使用起点 FK 得到 TCP 起点，按 TCP 直线生成采样 pose。
6. 每个采样点逐点 IK，seed 使用上一采样点关节解。
7. 轨迹点输出 `MOVEL` 的 `joints/jointVelocity/jointAcceleration/flange/tcp`。
8. 可达直线测试覆盖 TCP 直线误差和终点 TCP；不可达采样点返回 `TrajectoryResult.ok=false` 和 `KDL_JOINT_LIMIT`。
9. 非 linear speed 返回 `KDL_MOVEL_JOINT_SPEED_APPROX` warning；非 fine zone 返回 `KDL_ZONE_APPROX_FINE` warning。

是否通过：通过。

### EV-010：MOVEC 轨迹

关联任务：`KW-010`  
对标章节：KDL 13、21、22、23  
类型：运动测试  
命令：

```bash
npm run typecheck
npm run test -- kdl movec planMoveC
npm test
cmake --build kdl-wasm/build-wasm -j16
```

验证点：

1. 圆心、半径、法向、角度、弧长正确。
2. `TrajectoryResult.meta.circle` 包含 `CirclePlanMeta`。
3. 三点共线返回 `KDL_ARC_DEGENERATE`。
4. 逐点 IK 和圆弧误差诊断。

执行环境：

```text
Node.js v22.23.0
npm 10.9.8
Vitest 3.2.6
```

结果摘要：

1. `npm run typecheck` 通过。
2. `npm run test -- kdl movec planMoveC` 通过，14 个测试文件共 57 个测试通过。
3. `npm test` 通过，14 个测试文件共 57 个测试通过。
4. `cmake --build kdl-wasm/build-wasm -j16` 通过。
5. `planMoveC` 基于起点 TCP、via、target 三点计算圆心、半径、法向、角度和弧长。
6. `TrajectoryResult.meta.circle` 包含 `center/radius/normal/angle/length/direction/maxArcError`。
7. 圆弧采样逐点 IK，seed 使用上一采样点关节解。
8. 三点重合或共线返回 `TrajectoryResult.ok=false` 和 `KDL_ARC_DEGENERATE`。
9. 非 linear speed 返回 `KDL_MOVEC_JOINT_SPEED_APPROX` warning；非 fine zone 返回 `KDL_ZONE_APPROX_FINE` warning。

是否通过：通过。

### EV-011：Path 规划和验证

关联任务：`KW-011`  
对标章节：KDL 14、15、21、22、23  
类型：集成测试  
命令：

```bash
npm run typecheck
npm run test -- kdl path validation
npm test
cmake --build kdl-wasm/build-wasm -j16
```

验证点：

1. `planPath` 多段轨迹合并。
2. `validatePath` 返回 `PathValidationResult`。
3. 空路径返回 `KDL_PATH_EMPTY`。
4. segmentId、targetId、sourceMap 保留。

执行环境：

```text
Node.js v22.23.0
npm 10.9.8
Vitest 3.2.6
```

结果摘要：

1. `npm run typecheck` 通过。
2. `npm run test -- kdl path validation` 通过，15 个测试文件共 60 个测试通过。
3. `npm test` 通过，15 个测试文件共 60 个测试通过。
4. `cmake --build kdl-wasm/build-wasm -j16` 通过。
5. `PathPlanRequest/MotionSegmentRequest/PathPlanResult/PathValidationResult` 已从占位类型改为明确结构。
6. `planPath` 按段调用 `planMoveJ/planMoveL/planMoveC`，并用上一段终点关节作为下一段起点。
7. 合并轨迹点重新编号并更新时间，保留 `segmentId/targetId/sourceMap`。
8. `validatePath` 返回 `segmentReports`、`cycleTime`、速度/加速度比例和诊断。
9. 空路径返回 `TrajectoryResult.ok=false` 风格的 `KDL_PATH_EMPTY` 诊断。

是否通过：通过。

### EV-012：节拍估算、重采样和诊断

关联任务：`KW-012`  
对标章节：KDL 16、19、20、22、23  
类型：单元测试  
命令：

```bash
npm run typecheck
npm run test -- kdl cycle-time resample diagnostics
npm test
cmake --build kdl-wasm/build-wasm -j16
```

验证点：

1. `estimateCycleTime` 只计算运动时间。
2. `resampleTrajectory` 时间和点序稳定。
3. error/warning/info 分级正确。
4. KDL API 不抛裸字符串错误。

执行环境：

```text
Node.js v22.23.0
npm 10.9.8
Vitest 3.2.6
```

结果摘要：

1. `npm run typecheck` 通过。
2. `npm run test -- kdl cycle-time resample diagnostics` 通过，16 个测试文件共 63 个测试通过。
3. `npm test` 通过，16 个测试文件共 63 个测试通过。
4. `cmake --build kdl-wasm/build-wasm -j16` 通过。
5. `estimateCycleTime` 支持单段 `TrajectoryResult` 和多段 `PathPlanResult`，当前只统计 KDL 运动时间，`waitTime/ioTime` 保留为 0。
6. `resampleTrajectory` 按固定 `sampleTime` 重采样，首末点保持稳定，时间单调并重新编号。
7. 重采样对关节、速度、加速度、flange 和 tcp 位置做线性插值，并输出 `KDL_TRAJECTORY_RESAMPLED` info。
8. 空轨迹重采样返回 `KDL_RESAMPLE_EMPTY_TRAJECTORY` warning；非法采样时间抛出 `KDL_INVALID_SAMPLE_TIME` 结构化错误。
9. Path 段级 points 也保留 `segmentId/sourceMap`，便于节拍估算和诊断报告定位。

是否通过：通过。

### EV-013：C ABI、Embind 和性能

关联任务：`KW-013`  
对标章节：KDL 18、19、24  
类型：构建、性能报告  
命令：

```bash
npm run typecheck
cmake --build kdl-wasm/build-wasm -j16
npm test -- kdl-wasm/web/tests/kdl/cAbi.test.ts
npm run test -- kdl fk jacobian checks c-abi
npm run test -- kdl c-abi performance
npm test
```

指标：

| 指标 | 结果 |
| --- | --- |
| 单机器人 6 轴初始化 | 3.536 ms，目标 < 1000 ms |
| 单次 FK | `fkPose7` TypedArray 平均 0.019288 ms，目标 < 1 ms |
| 单次 IK | 平面 Rz+Px IK 平均 0.010930 ms，目标 < 10 ms |
| 1000 个目标点批量可达性 | 7.166 ms，目标 < 500 ms |
| 10 秒轨迹 4 ms 采样 | 2526 点，48.864 ms，目标 < 500 ms |

执行环境：

```text
Node.js v22.23.0
npm 10.9.8
Vitest 3.2.6
Emscripten emcc 6.0.0
```

结果摘要：

1. `npm run typecheck` 通过。
2. `cmake --build kdl-wasm/build-wasm -j16` 通过。
3. `npm test -- kdl-wasm/web/tests/kdl/cAbi.test.ts` 通过，1 个测试文件共 6 个测试通过。
4. `npm run test -- kdl cAbi trapProfile` 通过，27 个测试文件共 109 个测试通过。
5. `npm test` 通过，27 个测试文件共 109 个测试通过。
6. C ABI 稳定导出 `kdl_init/create_robot/destroy_robot/get_robot_info/fk/fk_all_links/jacobian/ik/plan_movej/plan_movel/plan_movec/plan_path/sample_trap/last_error`。
7. C++ ABI 现支持 `kdl_create_robot/kdl_destroy_robot/kdl_get_robot_info` 的 handle 生命周期和 JSON 输出。
8. WASM wrapper 链接 Orocos KDL 最小源码集，C ABI 可从 `NormalizedRobotModel` 构造 native KDL Chain。
9. `kdl_fk` 通过 `ChainFkSolverPos_recursive` 输出 pose7，测试覆盖 Rz+Px 链 `[pi/2, 0.4]` 的位置和四元数 golden。
10. `kdl_fk_all_links` 输出 JSON link pose 列表，测试覆盖 `base_link/link_1/tool0` 顺序和 tip 位姿。
11. `kdl_jacobian` 通过 `ChainJntToJacSolver` 输出 6 x dof 行主序矩阵，测试覆盖线速度和角速度分量。
12. `kdl_ik` 通过 `ChainIkSolverPos_LMA` 求解，测试覆盖 native IK 后 FK 回代到 `[pi/2, 0.4]`。
13. `kdl_sample_trap` 输出完整梯形/三角速度曲线 JSON，测试覆盖 trapezoid、triangle 和非法输入结构化错误。
14. 修复 native solver 生命周期：FK/Jacobian/IK solver 在 map 内稳定 `RobotRecord` 上构造，避免持有 move 前 Chain 引用。
15. C ABI 失败统一通过 `kdl_last_error` 返回结构化 `code/message/diagnostics`，覆盖 `KDL_INVALID_HANDLE`、`KDL_INVALID_TRAP_PROFILE` 和 `KDL_BUFFER_TOO_SMALL`。
16. 新增 `KdlNativeAbi` 封装 C ABI 导出检查、缓冲区读取、返回码检查和错误归一化。
17. 新增 `fkPose7` TypedArray 高频 FK 接口，支持复用输出缓冲区并覆盖输出维度错误。
18. 性能基线已记录 6 轴初始化、TypedArray FK、平面 IK、1000 点批量可达性和 10 秒 4 ms 轨迹采样。
19. native `planMoveJ/planMoveL/planMoveC/planPath` 仍由 TypeScript runtime 基线承载；底层 C ABI 已保留稳定导出，后续可逐步切到 native solver。

是否通过：通过。

## 5. GRL 证据

### EV-100：Lexer、单位和关键字

关联任务：`KW-100`  
对标章节：GRL 4、24  
类型：单元测试  
命令：

```bash
npm run typecheck
npm run test -- grl lexer units
```

验证点：

1. 注释、标识符、字符串、数字。
2. 保留关键字表。
3. 长度、角度、时间、质量、速度、加速度单位规范化。

执行环境：

```text
Node.js v22.23.0
npm 10.9.8
Vitest 3.2.6
```

结果摘要：

1. `npm run typecheck` 通过。
2. `npm run test -- grl lexer` 通过，1 个测试文件 5 个测试通过。
3. Lexer 覆盖单行/多行注释、关键字、标识符、字符串、数字、source range 和 EOF token。
4. 关键字表覆盖 GRL 规范第 4.5 节 85 个保留关键字。
5. 单位规范化覆盖 `mm/m/deg/rad/mm/s/%/ms/kg/mm/s2`，`100 mm -> 0.1 m`、`180 deg -> pi rad`、`300 mm/s -> 0.3 m/s` 通过。

是否通过：通过。

### EV-101：Parser 和 AST

关联任务：`KW-101`  
对标章节：GRL 5、22、23、24  
类型：parser 测试和 snapshot  
命令：

```bash
npm run typecheck
npm run test -- grl parser ast
```

验证点：

1. 最小文件解析。
2. 第 23 章完整示例解析。
3. AST source range、注释、单位原文、metadata。
4. 非法语法行列号。

执行环境：

```text
Node.js v22.23.0
npm 10.9.8
Vitest 3.2.6
```

结果摘要：

1. `npm run typecheck` 通过。
2. `npm run test -- grl parser ast` 通过，2 个测试文件共 8 个测试通过。
3. 最小文件 `language grl 0.1 / module / proc / end` 可解析。
4. AST 保留 `LanguageDeclaration`、`ModuleDeclaration`、`ImportDeclaration`、`ProcedureDeclaration` 和 source range。
5. 顶层 `const/target/path/operation/func/trap/task/post_hint` 当前保留为 RawTopLevelDeclaration，后续 KW-102 到 KW-109 逐步细化。
6. 非法语法错误行列号稳定。

是否通过：通过。

### EV-102：类型、数据声明和目标点

关联任务：`KW-102`  
对标章节：GRL 6、7、8、24  
类型：单元测试  
命令：

```bash
npm run typecheck
npm run test -- grl types declarations targets
```

验证点：

1. `const/var/persistent`。
2. `tool/frame/load`。
3. `joint_target/pose_target`。
4. `pose/poseq/robot_config/ext_axis`。
5. `speed/zone/offset/offset_in` 编译为共享结构。

执行环境：

```text
Node.js v22.23.0
npm 10.9.8
Vitest 3.2.6
```

结果摘要：

1. `npm run typecheck` 通过。
2. `npm run test -- grl types declarations targets` 通过，3 个测试文件共 12 个测试通过。
3. Parser 结构化输出 `DataDeclaration`、`TargetDeclaration`、表达式 AST、对象表达式、数组、调用和 offset 表达式。
4. `tool/frame` 可编译为包含 TCP/origin 的共享结构。
5. `joint_target/pose_target` 可编译为 `JointTarget/PoseTarget`，单位规范化为 SI。
6. `speed/zone` 可编译为 `SpeedSpec/ZoneSpec`。
7. `offset/offset_in tool` 可编译为 `OffsetSpec`。

是否通过：通过。

### EV-103：运动指令

关联任务：`KW-103`  
对标章节：GRL 9、20、21、24；KDL 21  
类型：单元测试、集成测试  
命令：

```bash
npm run typecheck
npm run test -- grl motion
npm test
```

验证点：

1. `movej/movel/movec` AST。
2. tool/frame/speed/zone 参数优先级。
3. MotionInstruction。
4. KDL `MoveJRequest/MoveLRequest/MoveCRequest`。

执行环境：

```text
Node.js v22.23.0
npm 10.9.8
Vitest 3.2.6
```

结果摘要：

1. `npm run typecheck` 通过。
2. `npm run test -- grl motion` 通过，4 个测试文件共 14 个测试通过。
3. `npm test` 通过，8 个测试文件共 34 个测试通过。
4. `movej/movel/movec` 可从 `proc` body token 编译为 `MotionInstruction`。
5. 当前 `set_tool/set_frame/set_speed/set_zone` 可作为运行上下文默认值。
6. 显式 motion 参数优先于当前上下文。
7. `MotionInstruction` 可编译为 `MoveJRequest/MoveLRequest/MoveCRequest`，包含 startJoints、target/via、speed、zone、tool、frame、sampleTime、sourceMap。
8. 预留命令 `npm run test -- integration grl-kdl-motion` 当前无独立测试文件，集成点由 `grl motion` 和全量测试覆盖。

是否通过：通过。

### EV-104：Path 和 `run_path`

关联任务：`KW-104`  
对标章节：GRL 10、18、20、21、24；KDL 14、21  
类型：单元测试、集成测试  
命令：

```bash
npm run typecheck
npm run test -- grl path run_path event
npm test
cmake --build kdl-wasm/build-wasm -j16
```

验证点：

1. `defaults/source/point/event`。
2. 空 Path、重复点名诊断。
3. `run_path` 编译为 `PathPlanRequest`。
4. source map 到 path point。

执行环境：

```text
Node.js v22.23.0
npm 10.9.8
Vitest 3.2.6
```

结果摘要：

1. `npm run typecheck` 通过。
2. `npm run test -- grl path run_path event` 通过，6 个测试文件共 22 个测试通过。
3. `npm test` 通过，19 个测试文件共 75 个测试通过。
4. `cmake --build kdl-wasm/build-wasm -j16` 通过。
5. Parser 将 `path` 从 raw declaration 提升为 `PathDeclaration`，覆盖 `defaults/source/point/event before/after/at distance`。
6. Path defaults 支持 tool、frame、speed、zone，并按高于当前控制器上下文的优先级应用到 point motion。
7. Source metadata 编译为 `PathPlanRequest.source`，数值单位规范化，例如 `5 mm -> 0.005`。
8. Path point 编译为 `MotionSegmentRequest`，保留 point id、targetId、sourceMap 和 source metadata。
9. `run_path` 从 procedure body token 编译为 `RunPathInstruction`，保留 sourceMap。
10. Event 当前编译为 `PathEventRequest` metadata，保留 timing、pointId、distance、kind、statement 和 sourceMap；具体 IO/Wait/Pulse IR 在 `KW-106` 展开。
11. 空 Path 返回 `GRL_PATH_EMPTY`，重复 point 返回 `GRL_PATH_POINT_DUPLICATE`，event 引用缺失 point 返回 `GRL_PATH_EVENT_POINT_NOT_FOUND`。

是否通过：通过。

### EV-105：Operation 和 `run_operation`

关联任务：`KW-105`  
对标章节：GRL 11、20、21、24；KDL 14  
类型：单元测试  
命令：

```bash
npm run typecheck
npm run test -- grl operation run_operation
npm test
cmake --build kdl-wasm/build-wasm -j16
```

验证点：

1. `operation kind/path/process/start_action/end_action`。
2. Operation 引用不存在 Path 报错。
3. `run_operation` 展开后 KDL 只处理 motion segment。

执行环境：

```text
Node.js v22.23.0
npm 10.9.8
Vitest 3.2.6
```

结果摘要：

1. `npm run typecheck` 通过。
2. `npm run test -- grl operation run_operation` 通过，6 个测试文件共 23 个测试通过。
3. `npm test` 通过，20 个测试文件共 79 个测试通过。
4. `cmake --build kdl-wasm/build-wasm -j16` 通过。
5. Parser 将 `operation` 从 raw declaration 提升为 `OperationDeclaration`，覆盖 `kind/path/process/start_action/end_action`。
6. `compileOperation` 验证 operation 引用的 path 存在，缺失时报 `GRL_OPERATION_PATH_NOT_FOUND`。
7. Process 参数编译为 metadata，保留数值、字符串和 identifier。
8. start/end action 编译为 `OperationActionInstruction` metadata，保留 actionKind、operationId、statement、sourceMap。
9. `parseProcedureRunOperationStatements` 从 procedure body token 提取 `run_operation` 并保留 sourceMap。
10. `expandRunOperation` 展开为 start action、`RUN_PATH`、end action；缺失 operation 报 `GRL_OPERATION_NOT_FOUND`。
11. KDL 仍只接收 Path 展开后的 motion segment；operation action 的 IO/Wait/Pulse 语义在 `KW-106` 继续展开。

是否通过：通过。

### EV-106：IO、wait 和 pulse

关联任务：`KW-106`  
对标章节：GRL 12、20、21、24；KDL 21.1  
类型：单元测试  
命令：

```bash
npm run typecheck
npm run test -- grl io wait pulse
npm test
cmake --build kdl-wasm/build-wasm -j16
```

验证点：

1. IO 地址和别名。
2. wait 条件、timeout、on_timeout。
3. all/any/rising/falling/changed。
4. pulse IR。
5. IO/wait/pulse 不直接调用 KDL。

执行环境：

```text
Node.js v22.23.0
npm 10.9.8
Vitest 3.2.6
```

结果摘要：

1. `npm run typecheck` 通过。
2. `npm run test -- grl io wait pulse` 通过，7 个测试文件共 28 个测试通过。
3. `npm test` 通过，21 个测试文件共 84 个测试通过。
4. `cmake --build kdl-wasm/build-wasm -j16` 通过。
5. 新增 `IoWriteInstruction/WaitInstruction/PulseInstruction/IoFlowInstruction`，覆盖 IO 写入、等待和脉冲 IR。
6. `parseIoFlowStatements` 支持 `io.di/do/ai/ao/gi/go/ri/ro`、`io.alias.*`、IO map 范围校验和 `GRL_IO_ADDRESS_NOT_FOUND`。
7. `wait` 支持条件字符串、`timeout`、`on_timeout alarm/call`，并覆盖 `all/any/rising/falling/changed` 条件表达。
8. `pulse` 生成 set/reset trace，单位归一化保留到秒。
9. `compilePathEventIo` 和 `compileOperationActionIo` 可将 Path event / Operation action metadata 展开为 IO/wait/pulse IR。
10. Path/Operation action token 原样保留，statement fallback 使用 GRL lexer，确保 `true/false` 和 `ms/s` 单位类型正确。
11. KDL 边界保持不变：IO/wait/pulse 不进入 KDL motion segment 或 wasm 运动规划。

是否通过：通过。

### EV-107：流程控制

关联任务：`KW-107`  
对标章节：GRL 13、20、21、24  
类型：单元测试  
命令：

```bash
npm run typecheck
npm run test -- grl control-flow
npm test
cmake --build kdl-wasm/build-wasm -j16
```

验证点：

1. if/elseif/else。
2. while/for/switch。
3. break/continue 合法性。
4. label/jump 规则。
5. jump 进入非法块结构诊断。

执行环境：

```text
Node.js v22.23.0
npm 10.9.8
Vitest 3.2.6
```

结果摘要：

1. `npm run typecheck` 通过。
2. `npm run test -- grl control-flow` 通过，8 个测试文件共 33 个测试通过。
3. `npm test` 通过，22 个测试文件共 89 个测试通过。
4. `cmake --build kdl-wasm/build-wasm -j16` 通过。
5. 新增流程控制 IR：`IfInstruction/WhileInstruction/ForInstruction/SwitchInstruction/BreakInstruction/ContinueInstruction/LabelInstruction/JumpInstruction`。
6. `parseProcedureControlFlow` 从 procedure body token 编译结构化流程控制树。
7. `if/elseif/else`、`while`、`for`、`switch/case/default` 均保留 sourceMap、条件/表达式文本和原始 token。
8. 条件表达式做 P0 bool 检查，明显数值/字符串条件报 `GRL_CONTROL_CONDITION_NOT_BOOL`。
9. `break/continue` 做位置合法性检查，非法位置分别报 `GRL_BREAK_OUTSIDE_FLOW` 和 `GRL_CONTINUE_OUTSIDE_LOOP`。
10. switch case 要求常量表达式，重复 case/default 会报结构化错误。
11. label/jump 做重复、缺失和跳入内层块检查，覆盖 `GRL_LABEL_DUPLICATE`、`GRL_LABEL_NOT_FOUND`、`GRL_JUMP_INTO_BLOCK`。

是否通过：通过。

### EV-108：proc、func、参数方向和作用域

关联任务：`KW-108`  
对标章节：GRL 14、20、21、24  
类型：单元测试  
命令：

```bash
npm run typecheck
npm run test -- grl proc func scope
npm test
cmake --build kdl-wasm/build-wasm -j16
```

验证点：

1. proc/call/return。
2. func 返回路径。
3. in/out/inout。
4. out 所有正常返回路径赋值。
5. func 非法副作用诊断。
6. 名称解析和遮蔽 warning。

执行环境：

```text
Node.js v22.23.0
npm 10.9.8
Vitest 3.2.6
```

结果摘要：

1. `npm run typecheck` 通过。
2. `npm run test -- grl proc func scope` 通过，9 个测试文件共 39 个测试通过。
3. `npm test` 通过，23 个测试文件共 95 个测试通过。
4. `cmake --build kdl-wasm/build-wasm -j16` 通过。
5. `func` 从 raw top-level declaration 提升为结构化 `FunctionDeclaration`。
6. 新增 procedure/function signature IR，支持 `in/out/inout` 参数方向。
7. `analyzeProcFunctionSemantics` 建立 proc/func 签名表，解析 `call` 和 `return`。
8. `out/inout` 实参必须为左值，参数数量和基础类型不匹配会返回结构化错误。
9. `out` 参数做正常返回路径赋值检查，支持通过 `call` 写入 out/inout 实参。
10. `func` 检查缺失返回、返回类型不兼容、proc return value 非法。
11. `func` 默认禁止运动、wait、pulse、run_path、run_operation 和调用 proc。
12. 名称遮蔽和自递归以 warning diagnostic 返回。

是否通过：通过。

### EV-109：异常、报警、中断和多任务语法

关联任务：`KW-109`  
对标章节：GRL 15、16、24  
类型：单元测试  
命令：

```bash
npm run typecheck
npm run test -- grl alarm interrupt task
npm test
cmake --build kdl-wasm/build-wasm -j16
```

验证点：

1. alarm/raise。
2. try/catch/finally。
3. trap/interrupt 语法。
4. task cycle 语法。
5. P1 未实现语义有明确诊断。

执行环境：

```text
Node.js v22.23.0
npm 10.9.8
Vitest 3.2.6
```

结果摘要：

1. `npm run typecheck` 通过。
2. `npm run test -- grl alarm interrupt task` 通过，10 个测试文件共 43 个测试通过。
3. `npm test` 通过，24 个测试文件共 99 个测试通过。
4. `cmake --build kdl-wasm/build-wasm -j16` 通过。
5. 新增异常/报警 IR：`AlarmInstruction/RaiseInstruction/TryInstruction/CatchInstruction/FinallyInstruction/UnsupportedRuntimeInstruction`。
6. `parseProcedureExceptionFlow` 支持 `alarm`、`raise`、`try/catch/finally`。
7. `alarm` 保留 alarm id、message、severity 和 sourceMap。
8. `try` 要求至少一个 `catch` 或 `finally`，否则报 `GRL_TRY_HANDLER_MISSING`。
9. `trap` 和 `task ... cycle ... end` 保持为 raw top-level declaration，AST 可表达完整 token block。
10. `analyzeExceptionSemantics` 对 P1 的 trap/task 返回 `UNSUPPORTED_RUNTIME` 并输出 `GRL_P1_UNIMPLEMENTED` warning diagnostic。
11. procedure body 内 `enable/disable interrupt` 编译为 `UNSUPPORTED_RUNTIME`，明确标识 P0 不执行。

是否通过：通过。

### EV-110：语义检查、IR 和 source map

关联任务：`KW-110`  
对标章节：GRL 20、21、24；KDL 21  
类型：语义测试、IR snapshot  
命令：

```bash
npm run typecheck
npm run test -- grl semantic ir sourcemap
npm test
cmake --build kdl-wasm/build-wasm -j16
```

验证点：

1. 语法规范第 21 章 22 项检查覆盖。
2. Executable IR。
3. Motion IR 到 KDL request。
4. source map 定位 GRL、Path、Operation。

执行环境：

```text
Node.js v22.23.0
npm 10.9.8
Vitest 3.2.6
```

结果摘要：

1. `npm run typecheck` 通过。
2. `npm run test -- grl semantic ir sourcemap` 通过，11 个测试文件共 46 个测试通过。
3. `npm test` 通过，25 个测试文件共 102 个测试通过。
4. `cmake --build kdl-wasm/build-wasm -j16` 通过。
5. 新增 `compileSemanticProgram` 统一语义入口，组合数据、target、path、operation、proc/func、IO、流程控制、异常/报警语义。
6. 新增 `SemanticProgramIr`，包含 `symbols/semanticChecks/procedures/paths/operations/diagnostics/sourceMap/kdlBridge`。
7. `semanticChecks` 覆盖 22 项检查清单，用于对齐 GRL 第 21 章 P0 语义检查面。
8. Executable IR 支持 Motion、IO、Wait、Pulse、RunPath、RunOperation、Call、Return、Branch、Alarm、UnsupportedRuntime。
9. `kdlBridge.motionRequests` 可从 executable motion 映射到 KDL request，`kdlBridge.pathRequests` 保留 PathPlanRequest。
10. source map 聚合 GRL procedure 行列、path point/event、operation action。
11. 修正 motion 语句参数解析的跨行边界，避免 `movej ... zone fine` 吞掉下一行 IO/wait/control token。
12. 重复符号通过 semantic diagnostic 返回 `GRL_SYMBOL_DUPLICATE`。

是否通过：通过。

### EV-111：三品牌后处理原型

关联任务：`KW-111`  
对标章节：GRL 17、19、24  
类型：golden file 测试  
命令：

```bash
npm run typecheck
npm run test -- post abb fanuc kuka
npm test
cmake --build kdl-wasm/build-wasm -j16
```

验证点：

1. ABB RAPID。
2. FANUC LS/TP 风格。
3. KUKA KRL。
4. post_hint。
5. brand metadata。
6. 不支持语义转换报告。

执行环境：

```text
Node.js v22.23.0
npm 10.9.8
Vitest 3.2.6
```

结果摘要：

1. `npm run typecheck` 通过。
2. `npm run test -- post abb fanuc kuka` 通过，1 个测试文件共 2 个测试通过。
3. `npm test` 通过，26 个测试文件共 104 个测试通过。
4. `cmake --build kdl-wasm/build-wasm -j16` 通过。
5. 新增 `postProcessBrand/postProcessAllBrands`，以 `SemanticProgramIr` 为后处理输入。
6. ABB RAPID 原型输出 `MoveJ/MoveL/MoveC/SetDO/WaitUntil/PulseDO`。
7. FANUC LS/TP 风格原型输出 `/PROG`、`J/L/C`、`DO/WAIT/PULSE`。
8. KUKA KRL 原型输出 `DEF`、`PTP/LIN/CIRC`、`$OUT/WAIT FOR/PULSE`。
9. speed/zone 映射覆盖 joint percent、linear mm/s、fine、distance zone。
10. `post_hint abb` 对 ABB 生效，对 FANUC/KUKA 输出 `GRL_POST_HINT_IGNORED` report。
11. 不支持语义进入转换报告，测试覆盖 `ALARM` 的 `GRL_POST_UNSUPPORTED`。

是否通过：通过。

### EV-112：自动生成规则和往返

关联任务：`KW-112`  
对标章节：GRL 18、24  
类型：生成器测试、往返测试  
命令：

```bash
npm run typecheck
npm run test -- grl generator roundtrip
npm test
cmake --build kdl-wasm/build-wasm -j16
```

验证点：

1. 优先生成 target/path/operation。
2. 点名稳定。
3. defaults 和单点 override 稳定。
4. source metadata 保留。
5. compact/expanded 输出。
6. 生成后可再解析为等价对象和 IR。

执行环境：

```text
Node.js v22.23.0
npm 10.9.8
Vitest 3.2.6
cmake 3.22.1
```

结果摘要：

1. `npm run typecheck` 通过。
2. `npm run test -- grl generator roundtrip` 通过，12 个 GRL 相关测试文件共 49 个测试通过。
3. `npm test` 通过，27 个测试文件共 107 个测试通过。
4. `cmake --build kdl-wasm/build-wasm -j16` 通过。
5. 新增 `generateGrlProgram`，从结构化 spec 生成稳定 GRL 文本和 stable ids。
6. target 按名称稳定排序，未显式命名的 path point 自动生成 `p00/p01/...`。
7. speed、zone、path defaults、point override、source metadata 和 operation action 输出稳定。
8. expanded 与 compact 两种输出均可解析；生成后可进入 parser、semantic IR 和三品牌后处理链路。
9. 修正 source metadata 字符串格式化：`id` 等外部标识保留字符串引号，`type` 等类别值可保持 GRL 标识符。

是否通过：通过。
