Files
cnc_wams/web-rtcp-5axis-sim-plan/docs/development-continuation.md

638 lines
21 KiB
Markdown
Raw 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.
# 5 轴数控系统 Web 仿真编写过程接续文档
生成时间2026-06-20 CST
## 1. 当前结论
已确定:
- Web 前端界面可实现;
- 首选界面风格为 `gmoccapy_5_axis.png`
- 前端不使用 React/Vue 等框架,采用原生 HTML/CSS + TypeScript/JavaScript ES modules
- 3D 使用 Three.js
- LinuxCNC Python GUI 只做界面参考;
- LinuxCNC C/C++/WASM/source-derived boundary 才能作为 CNC 语义和五轴运动学依据。
当前准备文档已完成:
```text
README.md
docs/implementation-plan.md
docs/technical-roadmap.md
docs/program-implementation-guide.md
docs/development-continuation.md
docs/traceability-matrix.md
docs/linuxcnc-python-gui-reference.md
docs/linuxcnc-gui-reference-gallery.md
```
## 2. 下一轮直接开工任务
下一轮不再继续扩展方案,直接进入实现。
第一批任务:
```text
M1-web-shell-gmoccapy
```
状态:
```text
completed_with_build_gate
```
目标:
- 创建 `app/`
- 创建原生 HTML/CSS/TS 项目;
- 实现 gmoccapy 风格静态 shell
- 复制必要的参考图路径到 docs
- 加 browser smoke 验证页面区域存在。
已补齐 M1 工程化验收:
- `app/tsconfig.json` 已创建;
- `npm run build` 已可输出静态产物;
- build 产物目录 `app/dist/` 已加入 `.gitignore`
- browser smoke 已检查无 React/Vue/Angular/Svelte 依赖和 DOM 标记。
## 3. M1 任务拆分
### M1.1 初始化 app
创建:
```text
app/index.html
app/package.json
app/tsconfig.json
app/src/main.ts
app/src/styles/gmoccapy.css
```
要求:
- 不安装 React/Vue
- 可使用 Vite
- `npm run dev` 能启动;
- `npm run build` 能输出静态产物。
### M1.2 静态 shell
创建:
```text
app/src/ui/gmoccapy-shell.ts
```
渲染区域:
```text
titlebar
preview
dro
gcode
status-sidebar
info-tabs
override
spindle-coolant
bottom-controls
```
### M1.3 CSS layout
目标:
- 视觉接近 `gmoccapy_5_axis.png`
- 黑底 preview
- 绿色 DRO
- 灰色面板;
- 橙色 override
- 右侧竖向大按钮;
- 底部大按钮栏。
### M1.4 smoke
创建:
```text
tests/browser/gmoccapy_shell_smoke.html
tests/browser/verify_gmoccapy_shell_browser.sh
```
检查:
- 页面加载;
- 关键 `data-region` 存在;
- DRO 文本非空;
- G-code rows 存在;
- preview 容器非空;
- 无 React/Vue 依赖标记。
当前 gate
```text
gmoccapy_static_build=ok
gmoccapy_shell_smoke=ok
```
## 4. M2 任务
```text
M2-state-and-controls
```
状态:
```text
completed_with_rtcp_frame_and_control_wiring
```
目标:
- 实现 store
- 实现 Run/Stop/Pause/Step action
- G-code active line
- DRO state update
- Node smoke。
本轮追加 RTCP 最小可验证链路:
- 新增 `xyzac-trt` profile source reference
- 新增 `web-rtcp-5axis-motion-frame`
- store 输出 `axisPose``jointPose``tcpPose``toolAxisVector``rtcpFrame`
- 右侧 TCP/IDENTITY 按钮可切换 `rtcpState=on/off`
- DRO 和 info tabs 显示 TCP pose、tool axis vector、RTCP frame readiness
- browser smoke 验证 RTCP DOM 和状态同步;
- node smoke 验证 frame/store 行为。
本轮继续补齐 M2 控件接线:
- preview X/Y/Z/Fit/Clear 按钮接入 store
- Rapid Override / Feed Rate 加减按钮接入 store
- Spindle override 加减按钮接入 store
- Flood / Mist 冷却按钮接入 store
- Reload / Home / Full 底部按钮接入 store
- `operatorMessage` 记录最近一次仿真操作;
- Node smoke 和 browser smoke 覆盖上述控制链路。
边界说明:
```text
sourceMode=fixture-ui-only
semanticBoundary=fixture_frame_ui_plumbing_not_linuxcnc_kinematics_proof
linuxCncKinematicsReady=false
promotionAllowed=false
```
也就是说Web 仿真界面现在已经具备 RTCP 状态链路和显示链路,但尚未把 LinuxCNC/source-derived 五轴运动学 WASM 接入为最终语义源。
## 5. M3 任务
```text
M3-threejs-preview
```
状态:
```text
completed_with_canvas_smoke
```
目标:
- Three.js canvas
- 基础五轴机床;
- tool marker
- simple path
- canvas nonblank browser smoke。
M3 需要消费 M2 的 `rtcpFrame`
- Three.js tool marker 使用 `tcpPose`
- 刀轴显示使用 `toolAxisVector`
- RTCP on/off 需要在预览中产生可见姿态差异;
- canvas smoke 需要检查 frame 与预览数据同步。
已完成:
- 新增 `app/src/vendor/three/three.module.js``three.core.js`
- 新增 `app/src/visualization/five-axis-scene.js`
- gmoccapy preview 区域由真实 WebGL canvas 渲染;
- 预览显示基础五轴工作区、工作台、刀具/TCP marker、刀轴和刀路
- Three.js canvas 消费 `tcpPose``toolAxisVector``rtcpState``rtcpFrame`
- browser smoke 验证 canvas nonblank、scene objects、path points、RTCP on/off 同步和 STEP 后 TCP pose 更新。
当前 gate
```text
gmoccapy_static_build=ok
rtcp_store_smoke=ok
gmoccapy_shell_smoke=ok
```
## 6. M4 任务
```text
M4-profile-and-linuxcnc-boundary
```
状态:
```text
completed_with_profile_boundary_smoke
```
目标:
- `xyzac-trt` profile
- source reference map
- PyVCP/HAL panel schema
- LinuxCNC adapter 接入点;
- traceability update。
已完成:
- 扩展 `app/src/profiles/xyzac-trt.js`,记录 INI、PyVCP XML、postgui HAL、generated HAL、tool table、remap、switchkins type、HAL pins、offsets、sample programs
- 进一步按 LinuxCNC `xyzac-trt.ini`/`xyzac-trt_cmds.hal`/`*.tbl`/`428-430remap.ngc` 整理 machine name、DISPLAY/RS274NGC/TRAJ、axis/joint limits、HALCMD nets、HALUI MDI commands、tool table 条目;
- 新增 `app/src/profiles/source-reference-map.js`,建立 `xyzac-trt` source/config/reference map
- 新增 `app/src/panel-schema/xyzac-trt-pyvcp.js`,把 `xyzac-trt.xml``switchkins_postgui.hal` 的 SWITCHKINS 控件整理为 Web panel schema
- 新增 `app/src/runtime/linuxcnc-boundary-adapter.js`,作为后续 LinuxCNC interpreter/kinematics WASM 的接入点;
- store 输出 `linuxCncBoundaryAdapter``linuxCncBoundaryReadiness`
- info tabs 显示 adapter、panel schema、source map 和 boundary readiness
- 新增 `tests/node/verify_profile_boundary.mjs`,并接入 `npm run smoke:node`
- browser smoke 验证 LinuxCNC boundary adapter/schema/readiness DOM 状态。
边界说明:
```text
sourceMapBoundary=profile_source_map_only_not_runtime_proof
panelSchemaBoundary=pyvcp_hal_schema_reference_only
adapterBoundary=adapter_entrypoint_only_runtime_not_connected
linuxCncKinematicsReady=false
promotionAllowed=false
```
说明:
```text
M4 现在可视为在 profile/source-map/panel-schema/adapter 层面完全满足;
但这不等于 LinuxCNC interpreter/kinematics runtime 已接入。
```
## 7. M5 任务
```text
M5-operator-program-workflow
```
状态:
```text
completed_with_operator_program_smoke
```
目标:
- 上电、急停、自动、手动、JOG、MDI、复位等操作
- 加载 G-code 文件;
- 刀具预览;
- 执行程序并显示执行的当前行。
已完成:
- store 新增 `machine.powerOn``machine.estopActive``machine.mode`、JOG/MDI/reset 状态;
- 右侧按钮栏新增 POWER、E-STOP、RESET、AUTO、MANUAL、JOG、MDI
- 底部控制栏新增本地 G-code 文件输入、JOG X/Y、MDI run
- `LOAD_PROGRAM` 可从浏览器 FileReader 或 public dispatch 加载 operator G-code 文本;
- G-code 面板显示程序来源、当前执行行,并按当前行高亮;
- Three.js 预览区域新增刀具预览卡,显示 T 号、直径、长度和 holder
- RUN/STEP 会在上电且非急停状态下推进当前行,未上电时明确 blocked
- node/browser smoke 覆盖上电、加载程序、运行、高亮当前行、JOG、MDI、复位和急停。
边界说明:
```text
operatorWorkflowBoundary=browser_ui_runtime_fixture
gcodeLoadBoundary=file_text_staging_only
programExecutionBoundary=fixture_line_playback_not_linuxcnc_interpreter
linuxCncKinematicsReady=false
promotionAllowed=false
```
## 8. 每批完成后必须更新
每批完成后更新:
- 本文件的“当前状态”;
- `docs/traceability-matrix.md`
- 如果新增 UI 或 runtime 约束,更新 `docs/program-implementation-guide.md`
- 如果新增参考来源,更新 `docs/linuxcnc-python-gui-reference.md``docs/linuxcnc-gui-reference-gallery.md`
## 9. 当前状态
```text
status=M17_linuxcnc_5axis_gcode_source_ingest_complete
active_style=gmoccapy_5_axis
frontend_framework=none
ui_stack=html_css_typescript_es_modules
preview_stack=threejs
semantic_boundary=linuxcnc_owned
latest_batch=M17-linuxcnc-5axis-gcode-source-ingest
latest_gate=full_execution_boundary_smoke=ok,linuxcnc_kinematics_runtime_smoke=ok,linuxcnc_interpreter_runtime_smoke=ok,linuxcnc_ini_runtime_smoke=ok,full_linuxcnc_5axis_source_node_smoke=ok,machine_file_staging_smoke=ok,five_axis_session_smoke=ok,profile_boundary_smoke=ok,rtcp_store_smoke=ok,gmoccapy_shell_smoke=ok,gmoccapy_dist_smoke=ok,gmoccapy_static_build=ok
rtcp_ui_state=implemented_browser_worker_and_node_kinematics_wasm_frame_with_fixture_fallback
control_wiring=power_estop_reset_auto_manual_jog_mdi_run_stop_pause_step_overrides_coolant_spindle_preview_home_reload_full
gcode_loading=implemented_browser_file_text_staging_with_linuxcnc_interpreter_execution
linuxcnc_5axis_gcode_sources=implemented_and_guarded_to_linuxcnc_source_manifest_trt_demos_only
program_current_line=implemented_linuxcnc_canonical_motion_highlight_with_fixture_fallback
tool_preview=implemented_tool_card_and_threejs_marker
threejs_preview=implemented_basic_canvas_scene
profile_source_map=implemented_xyzac_trt_and_xyzbc_trt
profile_switching=implemented_xyzac_trt_and_xyzbc_trt_with_runtime_reload
pyvcp_hal_schema=implemented_xyzac_trt_switchkins
linuxcnc_boundary_adapter=kinematics_and_interpreter_runtime_connected_remap_planner_missing
full_execution_boundary=implemented_machine_file_remap_ready_with_planner_task_hal_blockers
linuxcnc_kinematics_wasm=browser_and_node_proof_ready_xyzac_trt
browser_kinematics_wasm=worker_connected_source_and_dist_xyzac_trt
linuxcnc_interpreter_wasm=browser_worker_and_node_direct_canonical_program_execution_ready_with_switchkins_mcode_preservation
browser_interpreter_wasm=worker_connected_source_and_dist
switchkins_rtcp_program_execution=implemented_m428_m429_program_events_drive_rtcp_and_kinematics_switch
full_program_execution=partial_interpreter_canonical_and_switchkins_event_ready_remap_planner_not_promoted
session_persistence=implemented_opfs_save_restore_for_5axis_session
machine_file_staging=implemented_linuxcnc_trt_ini_hal_tool_table_remap_demo_opfs_staging
machine_file_backed_run=implemented_linuxcnc_fiveaxis_remap_wasm_machine_file_execution
planner_task_hal_gap=closed_for_web_simulation_boundary_with_task_motion_hal_wasm_runtime
native_task_hal_sync_plan=docs_native_task_hal_sync_implementation_steps_ready
native_task_hal_phase0_8=source_manifest_native_probe_hal_runtime_motion_hal_sync_task_shim_sdk_machine_file_store_ui_full_boundary_smokes_ready
next_batch=hardware_realtime_external_processes_if_required
```
当前 native task/HAL 接续状态:
- Phase 0 source manifest gate 已输出 `task_hal_source_manifest_ready=1`
- Phase 1 TRT native probe 已按 opt-in 模式就绪,默认 `ready_disabled_by_default`,不提升;
- Phase 2 HAL runtime 已覆盖 pin/signal/param/net/thread scheduler 和 `loadusr` blocked evidence
- Phase 3 minimal motion/HAL C ABI 已覆盖 servo cycle、program-line、switchkins、jog/status HAL 同步;
- Phase 4 minimal task/HAL C ABI 已覆盖 `lctask_*` session/stage/open/command/cycle/status/eventsRUN/MDI/JOG/PAUSE/RESUME/ABORT 能从 task shim 驱动 motion/HAL runtime并已补 SDK wrapper
- Phase 5-8 已把 machine-file session、task/HAL runtime adapter、Worker/client 文件、store action mapping、gmoccapy diagnostics 和 full boundary gate 接上;
- `nativeTaskReady=true``nativeHalSyncReady=true` 当前只表示 Web simulation boundary 内的 task/motion/HAL WASM runtime proof仍保持 `hardwareDrive=false``hostRealtimeKernel=false``externalUserMProcessReady=false``toolDbProcessReady=false`
补充实施文档:
```text
docs/native-task-hal-sync-implementation-steps.md
```
该文档给出完成 `nativeTaskReady``nativeHalSyncReady` 的分阶段实现步骤、程序编写顺序、LinuxCNC 源程序参考清单和验收 gate。当前已完成 Web simulation boundary不表示真实硬件、host realtime kernel 或外部进程 runtime 已完成。
## 10. M12 任务
```text
M12-switchkins-rtcp-program-execution
```
状态:
```text
completed_with_program_level_rtcp_switching
```
已完成:
- `linuxcnc-interpreter-runtime` 识别 LinuxCNC TRT 配置中的 `M428/M429/M430` switchkins remap M-code
- 因当前 interpreter WASM 未启用 Python/NGC remap runtime运行前会从送入 WASM 的程序文本中移除这些高位 M-code避免 `M-code greater than 199` 阻断普通 canonical motion
- 原始程序的 `M428/M429/M430` 被保留为 `switchkinsEvents`,并打上 `linuxcnc_switchkins_remap_mcode_preserved_web_runtime_applied` 边界;
- canonical motion event 继承最近的 switchkins 状态,`RUN/STEP/RUN_FRAME` 按程序自动切换 `identity` / `tcp-xyzac` / `tcp-xyzbc`
- node/browser kinematics runtime 增加 `switchKinematics()`,程序内 `M428/M429` 会同步切换 LinuxCNC kinematics WASM 的 `lckins_switch()`
- gmoccapy diagnostics 显示 program switchkins event count
- smoke 覆盖含 `M428/M429` 的五轴联动 RTCP 程序:加载后进入 TCP执行 A/C 联动段保持 RTCP on运行到 `M429` 后回到 identity。
边界说明:
```text
switchkinsProgramBoundary=linuxcnc_remap_mcode_preserved_and_web_runtime_applied
interpreterBoundary=linuxcnc_interpreter_wasm_canonical_events
kinematicsBoundary=linuxcnc_kinematics_wasm_c_abi
remapRuntimeReady=false
plannerRuntimeReady=false
fullLinuxCncProgramExecutionReady=false
```
## 14. M16 任务
```text
M16-linuxcnc-tp-queue-timing-runtime
```
状态:
```text
completed_with_tp_wasm_and_web_node_smoke
```
已完成:
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_tp_wasm.c` 新增
`lctp_run_canonical_motion_timing()`
- TP WASM C ABI 将 LinuxCNC interpreter canonical motion events 入队到 vendored
LinuxCNC `src/emc/tp` runtime并通过 `tpRunCycle()` 生成 segment timing
- canonical 零长度 motion 保留为 0 秒 timing segment不作为 TP enqueue failure
- 新增 `wasm-port/runtime/sdk/src/linuxcnc-tp.js`
- `linuxcnc-interpreter-runtime``runProgram()` / `runMachineFileProgram()` 后调用
TP SDK`programExecution.plannerTiming` 使用
`linuxcnc_tp_queue_runtime_timing_from_canonical_motion` 边界;
- store 优先使用 TP planner timingJS `execution-timing.js` 保留为 fallback/MDI
lightweight path
- full execution boundary 可在 TP timing 成功时报告 `plannerRuntimeReady=true`
- browser source/dist smoke 验证 interpreter Worker readiness 包含 TP planner runtime
并验证含 `ARC_FEED` 的真实 G-code 程序通过 TP arc timing segment。
边界说明:
```text
timingBoundary=linuxcnc_tp_queue_runtime_timing_from_canonical_motion
plannerRuntimeReady=true for interpreter canonical motion with TP WASM timing
nativeTaskReady=false
nativeHalSyncReady=false
fullLinuxCncProgramExecutionReady=false
hardwareDrive=false
```
验证:
```text
source /home/cnc/emsdk/emsdk_env.sh >/dev/null && bash wasm-port/tools/build_tp_wasm.sh && bash wasm-port/tests/wasm/node/verify_tp_wasm.sh
node web-rtcp-5axis-sim-plan/tests/node/verify_linuxcnc_interpreter_runtime.mjs
npm --prefix web-rtcp-5axis-sim-plan/app run smoke:node
npm --prefix web-rtcp-5axis-sim-plan/app run smoke
```
## 11. M13 任务
```text
M13-interpreter-worker-runtime
```
状态:
```text
completed_with_browser_worker_smoke
```
已完成:
- 新增 `linuxcnc-interpreter-worker.js``linuxcnc-interpreter-worker-client.js`
- 浏览器默认优先通过 Web Worker 加载 LinuxCNC interpreter WASM
- store 的 `RUN_INTERPRETER_PROGRAM` 支持 async runtime避免 worker 结果阻塞 UI 线程;
- 增加 `interpreterExecutionPending` 和 sequence guard防止旧解释器结果覆盖新加载程序
- gmoccapy diagnostics 显示 interpreter execution context
- browser smoke 验证 kinematics 和 interpreter 都在 Worker并验证 source/dist 两条路径。
边界说明:
```text
browserInterpreterExecutionContext=worker
nodeInterpreterExecutionContext=direct
interpreterBoundary=linuxcnc_interpreter_wasm_canonical_events
remapRuntimeReady=false
plannerRuntimeReady=false
fullLinuxCncProgramExecutionReady=false
```
## 14. M16 任务
```text
M16-planner-task-hal-boundary-audit
```
状态:
```text
completed_with_full_execution_boundary_smoke
```
已完成:
- 新增 `full-execution-boundary.js`,统一汇总 kinematics、interpreter canonical、machine-file staging、five-axis remap run、switchkins HAL evidence
- store 新增 `fullExecutionBoundary` 派生状态和 `RUN_FULL_BOUNDARY_AUDIT_REQUEST`
- gmoccapy diagnostics 显示 full boundary、planner/task/HAL blockers 和证据摘要;
- 底部新增 `Audit` 按钮,可触发 machine-file staging + machine-file backed five-axis remap run
- interpreter runtime 对 machine-file backed run 的 `remapRuntimeReady` 改为基于 `fiveaxis_ini_open=1``fiveaxis_remaps_ready=1``fiveaxis_file_reached_exit=1`
- Node/browser smoke 验证 partial remap boundary ready同时继续禁止 full LinuxCNC program execution promoted。
边界说明:
```text
fullExecutionBoundary=linuxcnc_machine_file_remap_ready_planner_task_hal_blocked
remapRuntimeReady=true for staged fiveAxisRemap C ABI run
halSwitchkinsEvidenceReady=true for fiveaxis_hal_switchkins evidence
nativeTaskReady=false
nativeHalSyncReady=false
plannerRuntimeReady=false
fullLinuxCncProgramExecutionReady=false
promotionAllowed=false
```
## 15. M17 任务
```text
M17-linuxcnc-5axis-gcode-source-ingest
```
状态:
```text
completed_with_real_linuxcnc_5axis_source_program_smoke
```
已完成:
- machine-file staging 从 LinuxCNC source manifest 中追加 TRT `demos/*.ngc`,包括 `boat-xyzac.ngc``boat-xyzbc.ngc``impeller-7bl-xyzac.ngc``xyzac_switchkins*.ngc``xyzbc_switchkins.ngc`
- `selectMachineFileProgram()` 强制 5 轴 G-code 必须来自 LinuxCNC 源程序目录 `configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/*.ngc`
- 新增 `listLinuxCncGcodeSources()``selectMachineFileProgram()`
- store 新增 `LOAD_LINUXCNC_GCODE_SOURCE`,可把 staged LinuxCNC 真实 5 轴 `.ngc` 源文件加载到 G-code 面板;
- gmoccapy G-code 面板新增 LinuxCNC 5-axis source 下拉框和 staging 按钮;
- machine-file backed remap run 使用当前选中的 LinuxCNC `.ngc` 源程序路径;
- Node/browser smoke 验证选择 `impeller-7bl-xyzac.ngc`UI 加载真实源程序machine-file run 的 `wasmProgramPath` 指向该源文件。
边界说明:
```text
gcodeSourceBoundary=linuxcnc_vendored_5axis_gcode_source_file
sourceMode=linuxcnc-vendored-5axis-gcode
machineFileBackedRunProgram=selected_staged_linuxcnc_ngc_source
sourceDirectoryGuard=configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/*.ngc only
remapRuntimeReady=true for staged fiveAxisRemap C ABI run
plannerRuntimeReady=false
nativeTaskReady=false
nativeHalSyncReady=false
fullLinuxCncProgramExecutionReady=false
```
## 12. M14 任务
```text
M14-opfs-machine-file-staging
```
状态:
```text
completed_with_node_and_browser_opfs_smoke
```
已完成:
- 新增 `linuxcnc-machine-file-staging.js`
- 复用 `wasm-port/runtime/sdk/src/sim-config-staging.js``planSimConfigStaging()`,为 `xyzac-trt` / `xyzbc-trt` 生成 LinuxCNC sim-config staging plan
- 将 INI、tool table、HAL、PyVCP XML、`remap_subs/*.ngc`、demo G-code 等 vendored LinuxCNC 文本文件保存到 OPFS 风格路径;
- store 增加 `machineFileStaging` 状态和 `stageMachineFiles()` API
- gmoccapy diagnostics 显示 machine-file staging 状态;
- build 产物复制 `wasm-port/tools/source-manifest.txt`,保证 dist 页面也能生成 staging plan
- node smoke 使用 memory OPFS 验证文件保存browser smoke 使用真实 OPFS 验证 source/dist staging。
边界说明:
```text
machineFileStagingBoundary=linuxcnc_sim_config_file_staging_plan_plus_opfs_text_persistence
stagedFiles=ini,hal,pyvcp,tool_table,remap_ngc,demo_gcode
nativeHalTaskSync=false
remapRuntimeReady=false
plannerRuntimeReady=false
fullLinuxCncProgramExecutionReady=false
```
## 13. M15 任务
```text
M15-machine-file-backed-fiveaxis-remap-run
```
状态:
```text
completed_with_node_and_browser_fiveaxis_remap_run
```
已完成:
- `linuxcnc-interpreter-runtime` 新增 `runMachineFileProgram()`
- interpreter Worker 支持 `runMachineFileProgram` 转发;
- store 新增 `RUN_MACHINE_FILE_PROGRAM` action 和 `machineFileExecution` 状态;
- 使用 M14 的 machine-file staging plan/files把 TRT INI、tool table、remap NGC、demo G-code 写入 Emscripten FS
- 调用 LinuxCNC interpreter SDK `runSimConfigProgram({ executionMode: "fiveAxisRemap" })`
- Node/browser smoke 验证 `fiveaxis_ini_open=1``fiveaxis_remaps_ready=1``fiveaxis_file_reached_exit=1`
- gmoccapy diagnostics 显示 machine-file backed run 状态。
边界说明:
```text
machineFileBackedRunBoundary=linuxcnc_fiveaxis_remap_wasm_machine_file_execution
sourceMode=linuxcnc-machine-file-remap-wasm
remapRuntimeReady=vendored_linuxcnc_fiveaxis_remap_c_abi_for_staged_files
nativeTaskHalSync=false
plannerRuntimeReady=false
fullLinuxCncProgramExecutionReady=false
```