Update wasm port validation state

This commit is contained in:
wangdequan
2026-07-10 03:22:55 -04:00
parent 49a8bad404
commit 2e922ad628
91 changed files with 3292 additions and 1488 deletions

View File

@@ -0,0 +1,498 @@
基于Web/WASM/OPFS的LinuxCNC兼容数控仿真平台
完全对标LinuxCNC的可执行验收标准
版本: 2.1
编写日期: 2026-07-09
验收对象: wasm-port 目录下的 LinuxCNC WASM/OPFS 移植与浏览器仿真系统
对标基准: /home/mes123456/cnc_wams/linuxcnc
参考文件: /home/mes123456/cnc_wams/完善wasm/02完全对标linuxcnc的验收标准.txt
上游基线: LinuxCNC master, commit 60597ee0718873d2449058c824262a275e5e4bad
一、验收定位
1.1 验收目标
本文件用于判定 Web/WASM/OPFS 版本是否真正达到“完全对标 LinuxCNC”验收重点不是界面相似也不是独立实现一套近似 G 代码解释器,而是证明核心数控语义、错误行为、机床配置行为和可复现实验结果来自 LinuxCNC 源码、测试资产和运行规则。
本文件同时作为 `/home/mes123456/cnc_wams/wasm-port` 的持续完善依据。后续新增功能、修复缺陷、迁移 LinuxCNC 测试、扩展浏览器 UI 或接入新的运行边界时,必须先在本文件定义的 LinuxCNC 功能树、证据层级、晋级规则和最终判定规则中找到归属;找不到归属的功能不得直接宣称为 LinuxCNC 对标功能。
系统只有同时满足以下条件,才能判定为“完全对标 LinuxCNC”
1. CNC 核心语义由 LinuxCNC 源码提供,项目自有代码不得重新实现 G 代码、刀补、参数、remap、刀具、轨迹规划、运动学或机床控制语义。
2. 上游 LinuxCNC 测试资产、nc_files 示例、configs/sim 机床配置能够被系统按层级接入、执行、分类和复验。
3. Native、WASM Node、真实浏览器三层结果在可比较范围内一致。
4. 浏览器端 OPFS、UI、Worker、C ABI 和适配层只承担文件、调度、展示、持久化和边界桥接职责,不改变 LinuxCNC 行为。
5. 不能执行的上游测试必须记录明确阻塞原因、LinuxCNC 行为归属源码和后续解除条件,不能以“忽略”“暂不支持”替代验收说明。
1.2 验收结论口径
验收结论分为四类:
通过: 已有源码复用证据、上游测试或等价夹具、Native/WASM/浏览器证据,结果与 LinuxCNC 基准一致。
条件通过: LinuxCNC 行为已由源码或测试证明,但 Web 平台存在合理边界例如动态模块加载、实时内核、外部硬件、Python 进程或 full-process HAL 依赖,需要以预编译、虚拟化或明确边界方式验收。
不通过: 存在项目自有 CNC 语义、结果与 LinuxCNC 不一致、错误被静默吞掉、测试缺少证据、或 UI 显示与底层状态不一致。
阻塞: 当前无法执行,但已明确 LinuxCNC 依赖、源码归属、缺失运行边界、恢复路径和不允许伪造通过的规则。
1.3 一票否决项
出现任一情况,整体验收不得判定为“完全通过”:
1. JS、TypeScript、浏览器 UI 或项目自有 C/C++ 代码中出现自研 G 代码解释、刀补、固定循环、remap、刀具表、轨迹规划、运动学反解、HAL 数控逻辑,并且未证明该代码只是 LinuxCNC 源码的薄封装。
2. 修改上游 vendored 文件内容以适配测试,而未同步说明该修改来自 LinuxCNC 上游变更。
3. 把 LinuxCNC full-process 测试降级为普通解释器测试后仍标记为通过。
4. 浏览器层测试只验证页面元素存在,不验证底层 LinuxCNC C ABI 输出、状态机或文件持久化结果。
5. 对预期失败不记录原因,或把未知失败计入通过率。
6. UI 的坐标、模态、刀具、主轴、程序状态与底层状态快照不一致。
二、验收证据体系
2.1 基准锁定
验收前必须锁定并记录以下信息:
项目 验收标准
LinuxCNC 源码路径 必须指向 /home/mes123456/cnc_wams/linuxcnc
上游提交 必须与 wasm-port/tools/upstream-baseline.txt 和 docs/scope-and-baseline.md 一致
源码清单 wasm-port/tools/source-manifest.txt 中的 vendored 文件必须可追溯到上游
同步校验 wasm-port/tools/verify_vendor_sync.sh 必须通过
自研语义检查 wasm-port/tools/verify_no_standalone_cnc_semantics.sh 必须通过
证据文档 wasm-port/docs/source-reuse-map.md、compatibility-validation.md、linuxcnc-test-porting-tracker.md 必须同步更新
2.2 验收证据优先级
证据按以下顺序采用,高优先级证据优先于低优先级证据:
等级 证据类型 验收意义
P0 LinuxCNC 上游源码、上游测试脚本、上游 nc_files/configs/sim 定义真实行为
P1 vendored 文件字节级同步、source manifest、source reuse map 证明行为来源
P2 Native 探针或 native rs274 输出对比 证明脱离浏览器后仍与 LinuxCNC 一致
P3 WASM Node 测试 证明编译到 WASM 后语义未漂移
P4 真实浏览器测试 证明 OPFS、Worker、UI、C ABI 集成后仍一致
P5 人工 UI 截图或录屏 只能作为补充,不能单独作为核心语义证据
2.3 必跑验收命令
完整验收至少执行以下命令,并保存输出日志:
wasm-port/tools/verify_upstream_baseline.sh
wasm-port/tools/verify_vendor_sync.sh
wasm-port/tools/verify_no_standalone_cnc_semantics.sh
wasm-port/tests/native/verify_native_probes.sh
wasm-port/tests/native/verify_nc_files.sh
wasm-port/tests/native/verify_sim_configs.sh
wasm-port/tests/wasm/node/verify_ini_wasm.sh
wasm-port/tests/wasm/node/verify_interp_wasm.sh
wasm-port/tests/wasm/node/verify_sim_configs_wasm.sh
wasm-port/tests/wasm/node/verify_sim_configs_inventory_wasm.sh
wasm-port/tests/wasm/node/verify_nc_files_wasm.sh
wasm-port/tests/wasm/node/verify_tp_wasm.sh
wasm-port/tests/opfs/node/verify_file_service.sh
wasm-port/tests/ui/node/verify_ui_node_smokes.sh
wasm-port/tests/browser/verify_ini_panel_browser.sh
wasm-port/tests/browser/verify_interp_browser.sh
wasm-port/tests/host/verify_host_smokes.sh
2.4 结果比较规则
1. canonical event 序列必须按事件类型、顺序、关键参数比较。
2. 错误文本允许归一化路径、行尾、空白和平台差异,但不得改变错误类别、触发行和关键提示。
3. 坐标、刀具补偿、轨迹规划输出采用双精度比较;解释器坐标容差不大于 1e-9运动/轨迹输出容差不大于 1e-6。
4. 浏览器计时不要求达到 Linux 实时内核确定性,但 servo/base 周期调度必须记录期望周期、实际周期、最大抖动和降级策略。
5. 所有 expected_fail 必须有固定原因和源码归属unexpected_fail 必须为 0 才能进入通过结论。
三、分层验收模型
3.1 Layer 1: LinuxCNC nc_files 基础示例
验收目标: 证明 LinuxCNC 自带示例程序在项目入口中可执行、可分类、可复现。
验收项 标准要求 证据
基础示例执行 linuxcnc/nc_files 基础和 example 程序通过 native rs274 或等价 LinuxCNC 入口执行 verify_nc_files.sh 输出
上下文缺失分类 需机床上下文、探针、刀具或入口点的程序必须标为 expected_fail nc-files/summary.tsv
禁止修改示例 不得修改上游 G 代码使其通过 vendor sync
WASM 代表集 代表性 nc_files 可在 WASM Node 和浏览器执行 verify_nc_files_wasm.sh、verify_interp_browser.sh
通过标准: total/pass/expected_fail/unexpected_fail 明确unexpected_fail 为 0。
3.2 Layer 2: LinuxCNC configs/sim 机床配置
验收目标: 证明真实 LinuxCNC 仿真机床配置、INI、tool.tbl、remap 子程序、USER_M_PATH、SUBROUTINE_PATH 能被正确识别和分层处理。
验收项 标准要求 证据
INI 驱动执行 按真实 INI 定位 open file、tool table、parameter file、subroutine path、user M path verify_sim_configs.sh
机床类型分类 普通解释器、remap、外部进程、HAL/UI 依赖等分类准确 sim-configs-coverage-matrix.md
预期失败固定 standalone rs274 无法覆盖的 task/user-M/HAL/UI 边界必须记录 expected_fail summary.tsv、class-summary.tsv
浏览器代表集 可独立执行的代表机床配置进入 WASM/浏览器验证 verify_sim_configs_wasm.sh
通过标准: native strict harness unexpected_fail 为 0浏览器代表集不得绕过 INI 上下文。
3.3 Layer 3: LinuxCNC 源码级 runtime probes
验收目标: 证明解释器、remap、tooldata、参数、运动学、轨迹规划等行为通过 vendored LinuxCNC 源码执行。
验收项 标准要求 证据
源码入口 探针直接调用 LinuxCNC 源码入口,不调用项目自研 CNC 语义 source-probes.tsv
边界 shim 项目代码只提供文件、状态、HAL/user-M 虚拟边界 native-runtime-probe-summary.tsv
负例行为 错误、拒绝、超时、不可达路径均与 LinuxCNC 一致 verify_native_probes.sh
通过标准: native probes complete且 source reuse map 已记录行为归属。
3.4 Layer 4: WASM Node、OPFS、真实浏览器
验收目标: 证明 LinuxCNC 行为穿过 Emscripten、C ABI、Node、OPFS、浏览器 UI 后仍保持一致。
验收项 标准要求 证据
WASM C ABI 所有核心调用返回结构化状态和错误,不丢失 LinuxCNC 结果 verify_interp_wasm.sh
OPFS 文件 INI、NGC、tool.tbl、var、session 文件可持久化、恢复、覆盖、删除 verify_file_service.sh
浏览器真实执行 真实浏览器运行解释器和面板流程,不只做 DOM smoke verify_interp_browser.sh、verify_ini_panel_browser.sh
UI 状态同步 坐标、模态、刀具、主轴、程序状态来自底层快照 verify_ui_node_smokes.sh、浏览器日志
通过标准: targeted smoke 与 aggregate host smoke 均通过,且失败时可定位到 Native/WASM/Browser 的具体层。
四、核心模块验收标准
4.1 G 代码解释器
源码基准: linuxcnc/src/emc/rs274ngc/
分类 必须覆盖的 LinuxCNC 行为 最低验收证据
基础运动 G0、G1、多轴同步、G53、进给率、路径控制 G61/G64 tests/interp、nc_files、canonical events
圆弧/NURBS G2/G3、IJK/R、G17/G18/G19、G5/G5.1/G5.2/G5.3/G6 tests/interp/good、nc_files
单位与模式 G20/G21、G90/G91、G90.1/G91.1、G93/G94/G95、G98/G99 fixture matrix
坐标系统 G54-G59.3、G10 L2/L20、G52/G92、G92.1/G92.2/G92.3、旋转 tests/interp/g10、g52、rotation
固定循环 G80-G89含钻孔、啄钻、攻丝、镗孔、平面限制和非法轴拒绝 tests/interp/g81、g84、bad
刀具补偿 G40/G41/G42、入口/出口、凹角、凸角、平面切换拒绝、车削补偿 tests/ccomp、tests/interp/inside-corners
刀长补偿 G43/G43.1/G43.2/G49、G10 工具偏置更新、缺失工具报错 tests/interp/g10、tool fixtures
车削循环 G70/G71/G72/G76、恒线速 G96/G97、螺纹同步、无死循环 tests/interp/g71-*、g72-*、g76
主轴语义 M3/M4/M5、S、M19、方向、等待、orient offset tests/interp/m19、g76
探针与输入 G38.x、M66、输入等待、超时、#5399 tests/interp、remap-io NGC-only
O-word 与 M98/M99 子程序、递归、局部参数、返回值、L 次数、外部子程序路径 tests/interp/m98m99、oword、flowsnake
参数系统 编号参数、命名参数、INI 参数、只读参数、持久化参数、格式化输出 tests/interp/iniparam、namedparam、magic_comments
remap NGC remap、参数传递、执行顺序、嵌套、M30 交互、失败恢复 tests/remap 已纳入项
错误行为 零进给、圆弧半径错误、缺工具、非法嵌套、非法参数写入、探针无轴 tests/interp/bad 及负例夹具
通过标准:
1. 所有已纳入解释器测试 Native/WASM/浏览器结果一致。
2. 负例必须触发 LinuxCNC 同类错误,不能被吞掉或转换成普通成功。
3. 对未纳入的 tests/interp、tests/remap、tests/ccomp 项必须在 porting tracker 中有状态。
4.2 Task、NML、程序状态和运行控制
源码基准: linuxcnc/src/emc/task/、linuxcnc/src/emc/nml_intf/
验收项 标准要求 最低验收证据
程序打开/关闭 打开 NGC 后状态、文件名、初始模态正确 task probes、browser run summary
解释执行循环 按 LinuxCNC task 周期读取、执行、更新状态,不由 UI 自行推进 emctask 对标测试
暂停/继续 暂停为受控停止,继续从正确断点恢复 taskintf 对标
单步 单行执行后进入暂停或等待状态 single-step 类测试
abort/stop 中止后队列、状态、错误、运动指令清理符合 LinuxCNC abort 测试或阻塞记录
MDI 队列 MDI 命令排队、等待、错误恢复、队列长度符合 LinuxCNC mdi-queue 测试或阻塞记录
倍率 feed override、rapid override、spindle override 状态进入底层,不只影响 UI task 状态快照
M1/M2/M30 可选停止、程序结束、回卷和模态复位符合 LinuxCNC 解释器和 task 测试
通过标准: Task 状态必须可从结构化快照验证full-process 依赖项未实现时必须标记阻塞,不能用普通解释器测试替代。
4.3 运动控制、轨迹规划和插补
源码基准: linuxcnc/src/emc/tp/、linuxcnc/src/emc/motion/
验收项 标准要求 最低验收证据
轨迹规划 连续线段、圆弧、加减速、速度约束、path tolerance 调用 LinuxCNC TP verify_tp_wasm.sh、native TP probes
多轴同步 直线/圆弧/旋转轴同步比例正确 轨迹输出对比
前瞻 短线段连续路径速度平滑,不出现非法停顿 TP fixture
软限位 超程按 LinuxCNC 规则报警,不被 UI 截断 hard-limits 或阻塞记录
跟随误差 FERROR/MIN_FERROR 阈值与报警一致 motion 测试或阻塞记录
点动 连续点动、增量点动、手轮输入、joint/axis 模式区分 motion/jogwheel 测试或阻塞记录
回零 HOME_SEQUENCE、joint 回零、all-home 状态符合 LinuxCNC homing 测试或阻塞记录
外部偏置 external offsets 与 motion 状态传播符合 sim configs external_offsets 代表配置
通过标准: TP/运动输出必须有数值比较;浏览器动画不能替代运动控制验收。
4.4 运动学与五轴联动
源码基准: linuxcnc/src/emc/kinematics/
验收项 标准要求 最低验收证据
trivkins 笛卡尔轴/joint 映射、旋转轴 wrapped rotary 正确 kinematics probes
identity kins identity 映射与 LinuxCNC 一致 source probe
5axiskins XYZBCW bridge-mill、TRT xyzac/xyzbc 正反解按 LinuxCNC 源码执行 native runtime probes
switchkins M428/M429/M430、kinstype guard、坐标/限位切换符合 LinuxCNC sim config 代表项
RTCP/G43.4 刀尖点保持、旋转轴联动、刀长偏置传播可数值验证 五轴夹具
自定义运动学 预编译模块可用;运行时动态加载缺失时必须标为条件通过 source reuse map
通过标准: 每类运动学必须记录源码入口、输入姿态、输出坐标、容差和失败原因。
4.5 HAL、RTAPI 和虚拟硬件边界
源码基准: linuxcnc/src/hal/、linuxcnc/src/rtapi/
验收项 标准要求 最低验收证据
HAL 类型 bit、float、s32、u32 pin/signal/param 行为一致 HAL native probes
net/link/unlink 连接、断开、多驱动拒绝、类型错误符合 LinuxCNC hal-link-unlink、hal-show
组件 and2、or2、not、mux、scale、edge、limit3、timedelay 等常用组件可验证 linuxcnc/tests 对应组件
loadrt 预编译组件加载可用;运行时动态编译/内核模块加载为条件通过 module-loading 或阻塞记录
线程 servo-thread/base-thread 执行顺序、周期参数、函数调用顺序可观测 threads/overrun 或虚拟调度日志
HAL Scope/Meter 波形、采样和数值显示来自 HAL 状态,不由 UI 伪造 UI/browser HAL 证据
外部硬件 Mesa、Modbus、VFD、实体 I/O 不要求真实硬件通过,但必须有虚拟边界说明 blocked table
通过标准: HAL 逻辑组件可在无真实硬件环境中复验;实时内核和硬件驱动类测试只能条件通过或阻塞。
4.6 刀具、刀库、主轴和 I/O
源码基准: linuxcnc/src/emc/tooldata/、linuxcnc/src/emc/iotask/、相关 task/io 源码
验收项 标准要求 最低验收证据
tool.tbl 读取、写入、随机/非随机刀库、口袋号、刀号、磨损字段一致 tooldata probes
T/M6/M61 换刀、设当前刀、缺失刀具、重载刀表符合 LinuxCNC toolchanger 或阻塞记录
T0 无刀、启动刀、随机刀库状态符合 LinuxCNC t0/tool-info 或阻塞记录
刀具数据库 DB_PROGRAM 协议、g/l/u/p/FINI 行为按 LinuxCNC 归属记录 tool DB boundary evidence
主轴控制 多主轴选择、速度、方向、orient、同步进给和刚性攻丝一致 interp spindle tests
冷却/辅助 IO M7/M8/M9、M62-M68、输入等待与 HAL/IO 状态传播一致 remap-io、IO tests
通过标准: tooldata 行为不得由 JS 解析替代OPFS 只能作为存储介质。
4.7 INI、文件系统和 OPFS
源码基准: linuxcnc/src/emc/ini/、OPFS runtime adapters
验收项 标准要求 最低验收证据
INI 解析 注释、空白、续行、重复 key、缺值、大小写、路径解析符合 LinuxCNC tests/inifile
配置目录 多机床目录、相对路径、OPEN_FILE、TOOL_TABLE、PARAMETER_FILE 正确 resolve/staging tests
参数文件 var 文件恢复、保存、禁用 G92 持久化行为一致 interp g52/g92 tests
OPFS 持久化 会话刷新后 NGC、INI、HAL、tool.tbl、var、快照仍可读取 OPFS browser tests
错误处理 文件缺失、权限/路径错误、无效编码有清晰错误 file-service tests
通过标准: OPFS 中的文件内容必须可导出并与输入对比;路径规划不得依赖浏览器目录枚举的偶然结果。
4.8 浏览器 UI 与可视化
验收目标: UI 必须是 LinuxCNC 状态的呈现和控制入口,而不是另一个状态真相。
验收项 标准要求 最低验收证据
坐标显示 机床坐标、工件坐标、相对坐标、joint/axis 模式来源于底层状态 browser state snapshot
模态显示 G/M 模态、单位、平面、坐标系、进给模式与解释器一致 interp browser smoke
程序运行 打开、运行、暂停、单步、停止、错误定位可操作 UI workflow smoke
3D 刀路 刀路来自 canonical/motion 事件,视图切换不改变底层结果 3D screenshot smoke
HAL 监视 信号、pin、参数显示来自 HAL 快照 HAL UI tests
文件管理 导入、保存、切换机床、恢复会话后状态一致 OPFS session workflow
错误呈现 错误类别、行号、LinuxCNC 原因向用户可见 browser negative fixtures
通过标准: UI smoke 必须验证底层结果,不得只验证按钮存在。
4.9 多通道、并发和隔离
验收项 标准要求 最低验收证据
多实例 多个浏览器标签页或机床实例状态隔离 OPFS/session tests
多通道 如宣称支持多通道,必须有独立解释器状态、倍率、坐标系和同步握手 多通道 fixture
Worker 隔离 解释器/运动/OPFS Worker 崩溃不污染其他实例 worker error tests
并发文件访问 同一配置并发读写有锁或明确冲突策略 file-service tests
通过标准: 没有证据时不得宣称 LinuxCNC 多通道完全通过。
五、上游测试纳入标准
5.1 每个 LinuxCNC 测试进入项目时必须完成
1. 记录上游路径。
2. 原样复制或通过脚本提取到 wasm-port/vendor/linuxcnc/。
3. 加入 source manifest 或 vendor sync 规则。
4. 记录行为归属 LinuxCNC 源码文件。
5. 优先添加 Native 覆盖。
6. 能进入 WASM 的添加 Node 覆盖。
7. 涉及 OPFS/UI 的添加真实浏览器覆盖。
8. 与上游输出或 LinuxCNC 行为做比较。
9. 更新 source-reuse-map.md、compatibility-validation.md、linuxcnc-test-porting-tracker.md。
10. 如不能执行,加入 blocked table并说明阻塞依赖。
5.2 测试分类规则
分类 处理方式
纯解释器测试 优先纳入 Native/WASM/浏览器
需要 INI/tool/var/subroutine 的测试 通过 LinuxCNC INI 上下文 staging 纳入
需要 NGC remap 的测试 只有在 LinuxCNC remap 源码路径接入后才可标通过
需要 Python remap 的测试 未接入 Python runtime 前标阻塞或条件通过
需要 full-process task/HAL/motion 的测试 不得降级为解释器通过,必须保留 full-process 边界说明
需要真实硬件/实时内核的测试 以虚拟边界、预编译组件或阻塞项验收
GUI smoke 测试 只能证明 UI 启动,不能证明 CNC 语义
5.3 wasm-port 持续完善闭环
每次为 `wasm-port` 增加或修复功能,必须按以下闭环推进,不能只完成代码实现:
步骤 输出物 通过条件
1. 功能定位 记录对应 LinuxCNC 源码目录、测试目录、configs/sim 或 nc_files 资产 能说明该功能在 LinuxCNC 中由谁定义
2. 边界判断 标记为纯源码复用、WASM 边界、OPFS 边界、浏览器 UI 边界、full-process 边界或硬件边界 不能把 full-process 或硬件行为伪装成纯解释器行为
3. 源码接入 更新 vendor 提取、source manifest、source reuse map `verify_vendor_sync.sh` 通过
4. Native 证明 新增或扩展 native probe、native rs274 对比或上游 test.sh 对比 Native 层先通过或明确 expected_fail
5. WASM 证明 通过 C ABI、Node runner 或 SDK 执行相同行为 WASM 输出与 Native 一致
6. 浏览器证明 涉及 OPFS/UI/Worker 的功能必须有真实浏览器测试 浏览器结果与 WASM/Native 一致
7. 文档同步 更新 compatibility-validation、linuxcnc-test-porting-tracker、必要的工作台账 阻塞项、证据入口、运行命令可追踪
8. 回归门禁 运行最小相关命令,重大功能运行 host aggregate smoke 不能引入新的 unexpected_fail
5.4 功能晋级状态
`wasm-port` 的每个 LinuxCNC 对标功能必须使用以下状态,不得只写“已完成”:
状态 含义 允许宣称
L0 已盘点 已确认 LinuxCNC 源码和测试资产归属 只能宣称已纳入计划
L1 已同步 相关上游文件已 vendored 并可同步校验 只能宣称源码已接入
L2 Native 通过 Native probe 或上游输出对比通过 可宣称核心语义在 Native 层对标
L3 WASM 通过 WASM Node 结果与 Native 一致 可宣称 WASM 核心语义对标
L4 Browser 通过 真实浏览器/OPFS/Worker 结果与 WASM 一致 可宣称浏览器运行边界对标
L5 UI 发布 用户界面状态、错误、操作流与底层一致并进入汇总门禁 可作为用户可见功能发布
Blocked 阻塞 缺 Python/full-process/HAL/硬件/实时内核/外部进程边界 只能宣称已识别阻塞,不能宣称功能通过
5.5 功能不得降级验收
以下降级方式一律无效:
1. 只验证 G 代码能解析,却宣称 task/motion/HAL 已通过。
2. 只验证 canonical event却宣称真实机床状态、回零、限位、跟随误差已通过。
3. 只验证 Native却宣称浏览器 OPFS 或 UI 已通过。
4. 只验证浏览器按钮存在,却宣称 LinuxCNC 状态机已通过。
5. 只手写一个简化 fixture却替代 LinuxCNC 上游测试或 configs/sim 资产。
六、性能、稳定性和确定性标准
6.1 性能指标
指标 最低标准
解释器吞吐 代表性 nc_files 和 configs/sim 程序可在合理时间内完成,不能因 O-word/remap 递归出现非 LinuxCNC 死循环
WASM 初始化 核心模块可重复初始化、销毁、重新加载,无残留全局状态污染
OPFS 延迟 常规 INI/NGC/tool/var 文件读写不阻塞 UI 主线程
浏览器渲染 3D 刀路和状态面板更新不影响底层解释执行结果
内存 重复运行测试后无持续增长到不可用的泄漏
6.2 确定性指标
1. 同一输入在 Native、WASM Node、浏览器中产生相同 canonical 事件或等价状态。
2. 同一浏览器重复运行三次,结果一致。
3. expected_fail 列表稳定,不随执行顺序变化。
4. 多实例运行时文件和状态互不污染。
七、安全和平台边界
验收项 标准要求
文件隔离 浏览器只能访问 OPFS 或用户显式导入文件,不能假定本机路径可直接访问
用户 M 代码 外部进程类 USER_M_PATH 在浏览器中必须是明确虚拟边界,不得静默执行宿主命令
Python remap 未设计 Python runtime 沙箱前,不得宣称浏览器完整执行 Python remap
网络 linuxcncrsh/TCP/MQTT 等网络能力未实现时必须标阻塞
硬件驱动 Mesa、Modbus、VFD、实体 I/O 只能通过虚拟接口或 host bridge 条件验收
八、LinuxCNC 功能树到 wasm-port 的持续完善矩阵
8.1 源码功能树映射
`wasm-port` 的持续完善必须覆盖 LinuxCNC 的真实功能树。下表不是一次性验收清单,而是后续补功能、补测试、补 UI 和补运行边界的任务来源。
LinuxCNC 源码/资产 定义的能力 wasm-port 持续完善目标 最低晋级目标
linuxcnc/src/emc/rs274ngc G 代码解释、参数、O-word、remap、canonical 输出 保持解释器行为完全来自 LinuxCNC持续扩展 tests/interp、tests/remap、tests/ccomp 覆盖 L4 Browser 通过Python remap 类可先 Blocked
linuxcnc/src/emc/task Task 状态机、运行模式、程序队列、pause/resume/abort/step 把浏览器运行控制对齐 emctask/taskintf不允许 UI 自己造状态 L3 WASM 通过;涉及 UI 的达到 L5
linuxcnc/src/emc/nml_intf NML 命令、状态结构、错误通道 提供结构化 C ABI/JS SDK 状态映射,保持字段语义与 LinuxCNC 一致 L4 Browser 通过
linuxcnc/src/emc/motion 运动控制、joint/axis、限位、回零、跟随误差、点动 建立 motion runtime probe 和浏览器状态验证full-process 依赖项先记录阻塞 L3 WASM 通过full-process 项 Blocked
linuxcnc/src/emc/tp 轨迹规划、速度约束、前瞻、path tolerance 持续增加 TP native/WASM 数值对比和复杂路径 fixture L3 WASM 通过
linuxcnc/src/emc/kinematics 运动学正反解、trivkins、5axis、switchkins 对五轴、TRT、SCARA、gantry、wrapped rotary 建立源码级 probe L4 Browser 通过
linuxcnc/src/emc/tooldata 刀具表、刀库、随机/非随机、DB_PROGRAM 协议 工具数据逻辑必须来自 LinuxCNCOPFS 只做存储 L4 Browser 通过;外部 DB 进程可先 Blocked
linuxcnc/src/emc/ini INI 解析和配置查找 用 LinuxCNC INI 规则驱动 configs/sim staging覆盖注释、续行、重复 key 等 L4 Browser 通过
linuxcnc/src/hal HAL pin/signal/param、halcmd、组件、线程调度 先实现可预编译虚拟 HAL 和常用组件,再逐步扩展 full-process HAL L3 WASM 通过;硬件项条件通过/Blocked
linuxcnc/src/rtapi 实时 API、共享内存、线程、模块生命周期 浏览器采用虚拟化边界,记录实时内核差异;不宣称硬实时 条件通过
linuxcnc/src/libnml NML、posemath、RCS 基础库 复用姿态/坐标/NML 基础结构,避免 JS 重写状态协议 L3 WASM 通过
linuxcnc/src/emc/pythonplugin Python 插件、Python remap 边界 设计 Pyodide/host Python 边界前保持阻塞,不用 JS 伪造 Python 行为 Blocked 或条件通过
linuxcnc/src/emc/usr_intf AXIS、gmoccapy、qtvcp、touchy 等 UI 行为参考 浏览器 UI 只对标操作语义和状态呈现,不复制桌面 GUI 技术栈 L5 UI 发布
linuxcnc/configs/sim 真实仿真机床配置、INI/HAL/NGC/tool/remap/user-M 作为机床能力推广入口,按配置族建立覆盖矩阵 L2/L3/L4 分层推进
linuxcnc/nc_files 官方 G 代码示例和宏 作为解释器和文件执行基本烟测入口 L4 Browser 通过
linuxcnc/tests 上游回归测试 作为持续完善主任务池;每个跳过项必须有阻塞原因 逐项 L0 到 L5 或 Blocked
8.2 configs/sim 机床族推进矩阵
后续完善 `wasm-port` 时,必须把 LinuxCNC `configs/sim` 当作真实机床能力库逐族推进。
机床族 代表能力 wasm-port 推进要求 不可降级点
axis 基础配置 三轴、车床、foam、wrapped rotary、external offsets、gantry 优先形成浏览器可打开、可运行、可保存的代表配置 不能丢弃 INI/tool/var/subroutine 上下文
axis/remap 内置命令扩展、NGC remap、toolchange、stop-lookahead 先覆盖 NGC remapPython remap 未接入前阻塞 不能用 JS 回调替代 LinuxCNC remap
axis/vismach 五轴、机器人、PUMA、SCARA、hexapod、millturn 用 kinematics/source probe 和代表程序验证空间运动 不能只展示 3D 模型就宣称运动学通过
gmoccapy/qtvcp/qtdragon/touchy UI 与宏、Python、tool probe、plasma 等流程 抽取操作语义和配置行为进入 Web UI桌面 UI 进程保持边界 不能把桌面 GUI smoke 当作 Web 功能通过
qtplasmac/plasma 等离子专用 HAL、Python、实时 IO 先建立阻塞和虚拟 IO 模型,再逐步接入 不能宣称真实切割过程通过
woodpecker 面向教学和多配置体验的完整 UI/机床包 可作为 Web 产品化体验参考,但底层仍按 LinuxCNC 证据验收 不能只迁移外观
8.3 上游测试族推进矩阵
`linuxcnc/tests` 是持续完善的主要入口。每个测试族的处理原则如下:
测试族 优先级 推进策略
tests/interp 最高 持续扩展 Native/WASM/Browser 解释器覆盖,负例和错误文本同等重要
tests/remap 最高 NGC remap 优先Python remap 建立 runtime 边界后再晋级
tests/ccomp 最高 刀补几何必须进入数值和 canonical 对比
tests/inifile 高 补齐 INI 解析边界,避免 Web staging 与 LinuxCNC 规则漂移
tests/trajectory-planner 高 通过 TP API probe 验证,不用浏览器动画替代
tests/motion 高 能拆 API probe 的先拆full-process motion 保持阻塞说明
tests/hal*、module-loading、threads 中高 常用 HAL 组件预编译验收,动态加载/实时线程条件通过
tests/toolchanger、tool-info、t0 中高 tooldata 先行task/io full-process 后续接入
tests/mdi-queue、linuxcncrsh 中 需 task 队列和 socket/server 边界,未接入前阻塞
tests/ui-smoke 中 只作为 UI 启动参考,不能作为 CNC 语义证据
tests/mb2hal、mqtt、硬件驱动类 低到中 定义 host/virtual I/O 边界后逐步推进
8.4 wasm-port 功能路线分组
为便于持续开发,`wasm-port` 后续功能应按以下分组推进:
分组 目标 进入条件 完成条件
A 解释器与文件执行 扩大 G 代码、参数、O-word、remap、错误覆盖 有上游 tests/interp/remap/ccomp/nc_files 资产 L4 Browser 通过且 unexpected_fail 为 0
B 机床配置与 OPFS 扩大 configs/sim、INI、tool、var、subroutine staging 有真实 configs/sim 代表配置 浏览器可导入/运行/保存/恢复
C Task 和运行控制 对齐 emctask、taskintf、NML 状态 已有解释器和状态 C ABI 暂停/继续/单步/abort 状态可验证
D Motion、TP、Kinematics 对齐轨迹规划、joint/axis、五轴、RTCP 已有 Native source probe 数值输出与 LinuxCNC 容差内一致
E HAL、IO、Tool、Spindle 对齐 HAL 虚拟化、tooldata、主轴、冷却、M62-M68 已有源码归属和边界设计 预编译/虚拟边界通过full-process 项记录阻塞
F Browser UI 产品化 把 LinuxCNC 状态可靠呈现给用户 底层 L3/L4 已通过 UI 操作不产生独立真相,截图和状态快照同时通过
G Python/外部进程边界 接入 Python remap、USER_M_PATH、tool DB、linuxcncrsh 等 已有安全和沙箱设计 不得破坏浏览器安全模型Native/WASM/Browser 证据齐全
8.5 每轮开发的最小验收包
不同规模改动必须运行不同最小验收包:
改动类型 最小验收命令
文档或测试清单变更 检查相关文档链接、更新 gptlog-process/gpdlog.md
vendored 源码或测试资产变更 `wasm-port/tools/verify_vendor_sync.sh`、相关 source manifest 校验
解释器/参数/remap 变更 `wasm-port/tests/native/verify_native_probes.sh`、`wasm-port/tests/wasm/node/verify_interp_wasm.sh`、`wasm-port/tests/browser/verify_interp_browser.sh`
INI/OPFS/配置 staging 变更 `wasm-port/tests/wasm/node/verify_ini_wasm.sh`、`wasm-port/tests/opfs/node/verify_file_service.sh`、`wasm-port/tests/browser/verify_ini_panel_browser.sh`
configs/sim 变更 `wasm-port/tests/native/verify_sim_configs.sh`、`wasm-port/tests/wasm/node/verify_sim_configs_wasm.sh`、inventory 验证
TP/运动学变更 `wasm-port/tests/wasm/node/verify_tp_wasm.sh`、对应 native source probe
UI 变更 `wasm-port/tests/ui/node/verify_ui_node_smokes.sh`、相关 browser smoke
跨模块或发布前变更 `wasm-port/tests/host/verify_host_smokes.sh` 加所有相关 targeted checks
8.6 功能完成定义
一个功能只有同时满足以下条件,才能从“开发完成”进入“验收完成”:
1. 有 LinuxCNC 源码或测试资产归属。
2. 没有项目自研 CNC 语义。
3. Native 层先通过或明确阻塞。
4. WASM 层结果与 Native 一致。
5. 涉及浏览器、OPFS、UI 的功能有真实浏览器证据。
6. 文档、tracker、source reuse map、compatibility validation 同步更新。
7. expected_fail 与 blocked 项稳定、可解释、可复验。
8. 用户可见说明不超出证据覆盖范围。
九、验收汇总模板
验收时必须填写以下汇总表:
模块 总项 通过 条件通过 阻塞 不通过 证据入口
源码基线与同步 0 0 0 0 verify_upstream_baseline.sh、verify_vendor_sync.sh
自研语义禁止 0 0 0 0 verify_no_standalone_cnc_semantics.sh
G代码解释器 0 0 0 0 verify_native_probes.sh、verify_interp_wasm.sh、verify_interp_browser.sh
remap/O-word/参数 0 0 0 0 linuxcnc-test-porting-tracker.md
刀补/固定循环/车削 0 0 0 0 tests/ccomp、tests/interp
Task/NML/状态机 0 0 0 0 task 对标测试
运动/TP/插补 0 0 0 0 verify_tp_wasm.sh
运动学/五轴/RTCP 0 0 0 0 kinematics probes、sim configs
HAL/RTAPI 0 0 0 0 HAL tests、blocked table
刀具/主轴/IO 0 0 0 0 tooldata、toolchanger、spindle tests
INI/OPFS/文件系统 0 0 0 0 verify_file_service.sh、browser OPFS
configs/sim 0 0 0 0 verify_sim_configs.sh
浏览器 UI 0 0 0 0 browser smoke、UI node smokes
多实例/并发 0 0 0 0 session workflow
文档与证据 0 0 0 0 compatibility-validation.md、source-reuse-map.md
十、最终判定规则
10.1 完全通过
满足以下全部条件:
1. 必跑命令全部通过。
2. unexpected_fail 为 0。
3. 所有 claimed feature 均有 P0-P4 证据链。
4. 阻塞项均为 Web 平台、硬件、实时内核或尚未接入 runtime 边界导致,并已记录。
5. 没有一票否决项。
10.2 条件通过
满足以下全部条件:
1. 核心解释器、参数、刀具、remap、TP、运动学、OPFS 和浏览器代表流程通过。
2. full-process HAL/task/motion、Python remap、动态 loadrt、硬件驱动等边界项有明确阻塞表。
3. 用户可见功能没有宣称超过证据覆盖范围。
10.3 不通过
出现以下任一情况:
1. 自研 CNC 语义替代 LinuxCNC 语义。
2. Native 与 WASM/浏览器结果不一致且无合理平台边界说明。
3. 未知失败被计入 expected_fail。
4. UI 状态与底层 LinuxCNC 状态不一致。
5. 未执行或未保存关键验收命令输出。
十一、与旧版验收标准的关系
旧版“02完全对标linuxcnc的验收标准.txt”可作为功能覆盖目标参考本文件作为新的执行标准重点补充以下要求
1. 从“功能清单通过”升级为“源码来源、测试资产、运行层级和证据链通过”。
2. 明确禁止项目自研 CNC 语义冒充 LinuxCNC 行为。
3. 把 Native、WASM Node、真实浏览器拆成四层验收。
4. 把 full-process、Python remap、HAL、硬件驱动等边界从笼统受限改为可追踪阻塞项。
5. 把 UI 验收从页面存在升级为底层状态一致性验收。
6. 把 expected_fail 和 blocked 项纳入正式验收口径,要求 unexpected_fail 为 0。
7. 增加 LinuxCNC 功能树到 `wasm-port` 的持续完善矩阵,使本文档可直接作为后续功能开发、测试迁移、浏览器集成和发布验收的推进依据。
最终结论模板:
本次验收以 /home/mes123456/cnc_wams/linuxcnc 的 LinuxCNC 源码和测试资产为唯一数控语义基准。经源码同步、自研语义禁止、Native、WASM Node、OPFS、真实浏览器和 UI 状态一致性验证后若所有必跑命令通过、unexpected_fail 为 0、阻塞项均有明确 LinuxCNC 依赖和恢复路径,则可判定系统达到“完全对标 LinuxCNC”的可执行验收标准。