Files
linuxcncWebWASM/docs/linuxcnc-web-wasm-implementation-readiness.md

125 lines
12 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# LinuxCNC Web/WASM 实施准备基线
**状态**:M0 已落地,M1 ABI 骨架已验证,LinuxCNC 功能移植尚未完成
**目标**:把既有技术路线收敛成可执行的实施顺序、完整性证明和发布前置条件
**固定基线**:LinuxCNC `2.10.0~pre0`,提交 `239dcf4284762ad7e9c65d390bc5524d855c2f8e`
**关联文档**:[技术路线](linuxcnc-web-wasm-technical-roadmap.md)、[完整移植实施蓝图](linuxcnc-web-wasm-full-port-implementation.md)、[运动学完整移植计划](linuxcnc-web-wasm-kinematics-migration-plan.md)、[覆盖矩阵](linuxcnc-web-wasm-simulation-coverage.md)、[源程序关联](linuxcnc-web-wasm-source-map.md)、[通信设计](linuxcnc-web-wasm-frontend-communication-design.md)、[执行策略](linuxcnc-web-wasm-execution-strategy.md)、[总控手册](linuxcnc-web-wasm-integration-playbook.md)
本文件是开始编写程序和恢复任务前的单页入口。完整移植实施蓝图进一步规定启动状态机、运行时依赖、tick 顺序和各域产物;专项文档保留详细契约。本文件只固定真实基线、先后顺序、完成定义和阻断条件。
## 1. 现状和不可误读项
本仓库已经具备完整设计文档,并已落地一组可独立验证的 Web/WASM 运行时切片;LinuxCNC 全功能运行时仍未闭合。当前 M0/M1 产物如下:
| 产物 | 当前事实 | 允许的结论 |
|---|---|---|
| `context-lock.json` | 锁定 LinuxCNC 提交、Emscripten 3.1.6、schema v1 和索引哈希 | 基线可复现 |
| `coverage/source-index.jsonl` | 8,026 个来源文件,来自 docs/src/configs/tests/unit_tests/build | 来源扫描已开始,可审计 |
| `coverage/manifest.jsonl` | 8,026 个一对一种子条目,全部 `planned/needs_owner` | 没有来源被静默漏掉;不代表已实现 |
| `wasm-core` | C ABI 生命周期、固定 tick、快照、导入导出,以及 posemath/解释器/运动适配切片 | 工程边界可编译、可调用;不代表完整核心闭合 |
| `build-wasm`/`build-native` | WASM 模块生成,宿主 ABI 单测通过 | 构建链路可重跑 |
以下能力目前都不能声明完成:rs274ngc、TP、motion、kinematics、HAL、ClassicLadder、Python/remap、OPFS、Worker、UI、Three.js、全量配置和浏览器回归。
## 2. 产品边界和“完整”的定义
产品是浏览器内离线运行的 LinuxCNC **仿真机床**。状态权威在 Worker 内的 WASM/兼容运行时,主线程只负责 UI 和渲染;所有影响结果的操作都经过固定 tick、版本化协议和可恢复账本。
功能全集由以下集合并集产生,而不是由一组三轴演示决定:
```text
LinuxCNC 文档能力
∪ src/emc、src/hal、classicladder、lib/python 的可观察 API/符号
∪ configs/sim/** 的全部入口和引用资源
∪ tests/**、unit_tests/** 的全部可运行用例
∪ Web 工程、VCP、可视化、持久化和恢复工作流
```
每个功能必须同时闭合:正常、边界、错误/报警、暂停/恢复/急停、持久化/刷新/离线,以及适用的跨域交互。`accepted` 必须有实现、自动测试、oracle、差异报告和 context lock。真实硬件、内核实时性、物理安全和宿主设备访问只能标记 `REAL-EXCLUDED`,且配置检查必须返回明确错误;仿真配置依赖的主轴、编码器、探针、限位、换刀和 IO 必须用数字孪生实现。
## 3. 已冻结的技术决策
1. **核心优先复用**:posemath、rs274ngc、TP、可移植 kinematics 优先以最小补丁编译;Linux 进程、NML/CMS、共享内存、实时 API、动态加载和桌面 GUI 不直接移植。
2. **单 Worker、单写者**:WASM、Python、HAL、虚拟设备、工作区和恢复全部在同一 Dedicated Worker 中串行;UI 不读 WASM 指针、不直接写 OPFS。
3. **确定性时间**:`sim_step(cycles)` 是唯一推进入口;墙钟只负责节流和渲染,不参与结果计算。1x、快速、暂停恢复、单步和回放必须得到同一逻辑终点。
4. **两层文件系统**:WASM 内同步工作树承接 LinuxCNC 文件语义;Worker 通过 OPFS journal、checkpoint 和迁移持久化,不能每个 tick 写 OPFS。
5. **稳定 C ABI**:TypeScript 只见版本化 C ABI 和消息 schema,不暴露 C++ 布局、STL、指针或异常字符串。
6. **Python 受控运行时**:PY-01 前不锁定运行时;启用后必须单独创建锁,固定 Pyodide、包、补丁和 artifact hash,只提供 `linuxcnc/hal/INI` 虚拟模块,拒绝 subprocess、socket、设备和宿主路径。
7. **镜像可替换、字节不可替换**:允许中国大陆镜像、官方站点和离线缓存;下载记录必须包含 URL、版本、大小、SHA-256、许可证。镜像切换但字节相同不改变 context;字节、补丁或版本变化必须生成新 context。
8. **先建立 oracle 再扩展功能**:原生 LinuxCNC runner 输出解释器状态、canonical、每周期运动、HAL/IO、错误和最终状态;WASM 只以首个 divergent tick、字段差异和定义容差对照。
## 4. 完整移植功能分层
| 层 | 必须覆盖的能力 | 实现策略 | 完成证据 |
|---|---|---|---|
| L0 配置/工作区 | INI/include、HALFILE 顺序、TBL/VAR/NGC/PY/XML/TCL/CLP、路径和诊断 | 虚拟 `/workspace` + 解析器 + OPFS | 233 个 sim INI 全部资源图;错误含文件/行 |
| L1 解释器 | 全部 G/M/O、模态、单位、坐标系、参数、循环、补偿、remap 边界 | 复用 rs274ngc;Python 通过受控桥接 | G/M/O manifest、错误行和 golden |
| L2 轨迹/运动 | canonical、前瞻、blend、速度/加速度、急停、暂停、jog、home、limit、following error | TP/posemath 复用;sim_motion 状态机 | 每 tick 状态、容差、恢复终点 |
| L3 运动学 | trivkins、5 轴、gantry、CoreXY、Delta、机器人、foam 等内置模块 | 静态编译注册,按配置选择 | forward/inverse、姿态、奇异/越限错误 |
| L4 HAL/PLC | pin/signal/param、thread/function/addf、全量仿真组件、ClassicLadder | `.comp` 构建期清单 + 固定扫描顺序 | 组件条目、HAL graph、scan/golden |
| L5 虚拟设备 | 主轴、编码器、stepgen、探针、限位、换刀、冷却、等离子/激光 | 可脚本化数字孪生和故障注入 | 正常/不到速/超时/失败/恢复 |
| L6 Python/VCP | linuxcnc/hal API、remap/filter、VCP 回调和权限 | Pyodide Worker + manifest 能力授权 | API/异常/资源限制/隔离 |
| L7 Web 工作流 | 工程、编辑器、MDI、run/pause/abort、jog/home、工具/IO/报警、HAL/PLC | React+TS,WorkerClient,domain store | 浏览器 E2E、键盘/触摸、恢复 |
| L8 可视化/发布 | 轨迹、姿态、刀具、毛坯、日志、导入导出、离线 PWA、兼容/许可证报告 | Three.js + transferable streams + 发布清单 | 多浏览器、性能、离线和回滚演练 |
## 5. 可执行路线和退出条件
### M0:基线和来源闭包(已完成第一版)
入口是 LinuxCNC 版本和提交已确认。必须生成 source index、manifest seed、context lock、状态枚举、扫描器版本和下载策略。退出条件是索引/manifest 哈希与锁一致,重复 ID、孤儿来源和缺字段检查生效。
### M1:最小运行时闭环(当前)
先完成 `sim_create → sim_load_workspace → sim_command → sim_step → snapshot/event → export/import → destroy`,固定 ABI、错误码、消息 envelope、Worker 单会话队列和虚拟工作区最小接口。正常、非法状态、buffer 不足、暂停/恢复各至少一条测试;不得接 UI mock 作为完成证据。
### M2:解释器和运动核心
按 posemath → TP → rs274ngc → canonical → task/motion → kinematics 顺序接入。每个切片先接原生 runner 和差异报告,再接 Worker。M2 退出前,受影响核心条目必须达到 `verified`,且任何差异能定位到首个 tick/字段/源映射。
### M3:HAL、数字孪生、Python、持久化
接入 HAL 图和固定线程顺序,再接主轴/编码器/探针/限位/换刀/PLC;随后实现 OPFS prepare/commit、checkpoint、迁移、配额和 Worker 崩溃恢复,最后锁定 Python runtime 并接 remap/VCP。M3 不允许用“刷新后重新初始化”替代恢复。
### M4:Web 工作流和可视化
以真实 Worker/WASM 状态接入工程选择、编辑器、MDI、run/pause/abort、jog/home、工具/报警、HAL/PLC、3D、导入导出和离线 PWA。mock 只能用于早期 UI 结构开发,里程碑退出必须全部切换真实协议。
### M5:全量回归和发布
递归运行全部 `configs/sim/**`、可移植 `tests/**`、`unit_tests/**`、G/M/O、HAL 组件、Python API 和浏览器故障矩阵。发布包必须同时包含 WASM、Python 运行时、Service Worker、schema、source/coverage/golden manifest、兼容报告、排除项和回滚包;任何孤儿、无 oracle、未覆盖维度或静默降级都阻断发布。
## 6. 实施顺序(直接照此开工)
1. 保持 `context-lock.json` 不变,运行 M0 校验和上下文包测试。
2. 为 `coverage/manifest.jsonl` 建立 owner/feature/domain 分配器,将 `seed:*` 按功能归并但保留一对多来源引用。
3. 在原生 LinuxCNC 环境建立 runner,先覆盖 `unit_tests/interp`、`unit_tests/tp` 和 `configs/sim/axis/minimal_xyz.ini`,冻结 JSONL golden schema。
4. 将 `wasm-core` 从 bootstrap API 扩展为 posemath/TP 最小链接;每加入一个源组就更新 manifest、编译参数和 ABI 测试。
5. 实现固定 tick scheduler、事件队列、快照 schema 和 `WorkerClient`;先完成命令幂等和 `prepare/verify/commit` 账本。
6. 实现虚拟工作区的 `open/read/write/stat/readdir/rename/unlink/fsync`,然后接 OPFS journal 和恢复,不提前接高频 UI。
7. 接 HAL 核心和最小三轴数字孪生,完成正常/限位/急停/恢复四条端到端场景。
8. 锁定 Python runtime(允许中国镜像下载,但必须记录校验)并接 `linuxcnc/hal`、remap 和一个 VCP descriptor。
9. 接 React/TypeScript AppShell、状态面板、G-code/MDI 和 Three.js 轨迹;只消费 Worker 快照和 transferable 流。
10. 扩展全部配置、组件、运动学、GUI 工作流和回归矩阵,按 M2-M5 门禁推进。
## 7. 必须持续保持的检查
```bash
python3 scripts/generate_source_inventory.py
python3 scripts/validate_baseline.py
python3 scripts/validate_download_index.py
python3 -m unittest discover -s scripts -p 'test_*.py' -v
scripts/build-wasm.sh
```
清单重生成后若哈希变化,必须先审查来源差异并创建新 context;不能直接覆盖锁文件。任何新下载都必须进入 `vendor/downloads/index.jsonl`(M1 前建立),任何新源码、配置或测试都必须在同一变更中更新 manifest。只有 `validate_baseline`、受影响测试、原生/WASM 对照和相应恢复场景都通过,任务才可从 `implemented` 进入 `verified`。
## 8. 当前明确风险
- 现有 LinuxCNC `meson.build` 面向原生依赖(Python、Boost、`libdl`),不能直接作为 Emscripten 构建;WASM 必须保持独立 CMake 目标。
- `configs/sim` 文件量大且资源类型复杂,清单生成必须先于功能归并;不能用目录状态或抽样配置宣称全覆盖。
- 浏览器没有 PREEMPT_RT;任何依赖墙钟的行为都必须改成逻辑 tick,并单独报告实时性不等价。
- OPFS 有配额和淘汰风险;已提交版本、导出备份和配额错误必须优先于自动保存便利性。
- Python、GUI 和 HAL 组件是最大移植面;它们必须按受控能力和静态清单接入,不允许把宿主进程/设备能力直接暴露给工程脚本。
当前基线允许开始编写程序,但只允许从 M1 的 ABI、runner、工作区和协议契约开始;在 M0/M1 证据闭合前,不应投入全量 UI 或声称 LinuxCNC 功能已经移植完成。