# 5 轴数控系统 Web 仿真实现追溯文档

生成时间：2026-06-20 CST

## 1. 目的

本文件用于追溯后续实现中的每个主要功能来自哪里、参考了哪些 LinuxCNC 源文件/配置/图片、属于什么边界、如何验证。

追溯原则：

```text
界面形态可参考 LinuxCNC Python GUI；
CNC 语义必须来自 LinuxCNC source/WASM/source-derived boundary；
浏览器代码只负责 UI、状态编排、文件会话、可视化和调用边界；
任何 fixture 或 UI-only 结果不得冒充 LinuxCNC runtime proof。
```

## 2. 总体追溯表

| 功能 | Web 实现位置 | LinuxCNC 参考 | 边界分类 | 验证方式 |
| --- | --- | --- | --- | --- |
| gmoccapy 风格 shell | `app/src/ui/gmoccapy-shell.ts` | `docs/src/gui/images/gmoccapy_5_axis.png`, `configs/sim/gmoccapy/gmoccapy_XYZAC.ini` | UI reference | browser shell smoke |
| 大号 DRO | `app/src/ui/gmoccapy-dro-panel.ts` | gmoccapy 5 axis screenshot, LinuxCNC DRO conventions | UI rendering of runtime state | DOM smoke + state smoke |
| 右侧模式按钮栏 | `app/src/ui/gmoccapy-status-sidebar.ts` | gmoccapy screenshot | UI action dispatch | browser button/action smoke |
| 底部运行控制 | `app/src/ui/gmoccapy-bottom-controls.ts` | gmoccapy/AXIS run controls | UI action dispatch | playback smoke |
| G-code 当前行 | `app/src/ui/gmoccapy-gcode-panel.ts` | AXIS/gmoccapy program display | LinuxCNC output rendering | active-line smoke |
| 上电/急停/复位/模式操作 | `app/src/state/store.js`, `app/src/state/linuxcnc-task-policy.js`, `app/src/ui/gmoccapy-shell.js` | `src/emc/nml_intf/emc.hh`, `src/emc/task/emctaskmain.cc`, `src/emc/task/emctask.cc` | LinuxCNC task source-referenced Web policy | node smoke + browser operator smoke |
| JOG/MDI 操作 | `app/src/state/store.js`, `app/src/state/linuxcnc-task-policy.js`, `app/src/ui/gmoccapy-shell.js` | `src/emc/task/emctaskmain.cc` `EMC_JOG_INCR`, `EMC_JOINT_HOME`, `EMC_TASK_PLAN_EXECUTE` | LinuxCNC task source-referenced Web policy | node smoke + browser operator smoke |
| 程序运行/暂停/继续/停止 | `app/src/state/store.js`, `app/src/state/linuxcnc-task-policy.js`, `app/src/ui/gmoccapy-shell.js` | `src/emc/task/emctaskmain.cc` `EMC_TASK_PLAN_RUN`, `EMC_TASK_PLAN_PAUSE`, `EMC_TASK_PLAN_RESUME`, `EMC_TASK_ABORT` | LinuxCNC task source-referenced Web policy | node smoke + browser operator smoke |
| G-code 文件加载 | `app/src/ui/gmoccapy-shell.js`, `app/src/state/store.js` | AXIS/gmoccapy open program workflow | browser file staging + LinuxCNC interpreter execution | node smoke + browser operator smoke |
| LinuxCNC 5 轴源程序选择 | `app/src/runtime/linuxcnc-machine-file-staging.js`, `app/src/state/store.js`, `app/src/ui/gmoccapy-shell.js` | `configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/*.ngc` | guarded vendored LinuxCNC source-directory G-code staging + selected machine-file run | machine-file staging node smoke + browser source selector smoke |
| LinuxCNC 5 轴源程序案例覆盖 | `tests/node/verify_real_linuxcnc_5axis_program_cases.mjs`, `tests/browser/gmoccapy_shell_smoke.html`, `app/src/runtime/linuxcnc-interpreter-runtime.js` | `boat-xyzac.ngc`, `boat-xyzbc.ngc`, `impeller-7bl-xyzac.ngc`, `xyzac_switchkins*.ngc`, `xyzbc_switchkins.ngc` | source-guarded LinuxCNC demo canonical/TP/toolpath coverage; `o<sub> call` entries verified through machine-file staging/remap boundary | real LinuxCNC 5-axis program cases node smoke + browser source program smoke |
| 程序执行当前行显示 | `app/src/state/store.js`, `app/src/ui/gmoccapy-shell.js` | AXIS/gmoccapy current line display | LinuxCNC interpreter canonical motion events with fixture fallback | node smoke + browser operator smoke |
| 程序执行速度/时间 | `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_tp_wasm.c`, `wasm-port/runtime/sdk/src/linuxcnc-tp.js`, `app/src/runtime/linuxcnc-interpreter-runtime.js`, `app/src/state/store.js`, `app/src/ui/gmoccapy-shell.js` | LinuxCNC interpreter canonical motion events queued through `src/emc/tp/tp.c`, `tc.c`, `tcq.c`, S-curve/Ruckig support sources | LinuxCNC TP queue runtime timing from canonical motion; JS estimate kept only as fallback/MDI lightweight path | TP WASM smoke + interpreter/store node smoke + browser source/dist TP timing smoke |
| 刀具预览 | `app/src/ui/gmoccapy-shell.js`, `app/src/visualization/five-axis-scene.js` | gmoccapy/vismach tool display | visualization/runtime state display | browser operator smoke |
| 3D 五轴预览 | `app/src/visualization/five-axis-scene.js` | `qtvismach_5axis_gantry.png`, `lib/python/vismach.py` | visualization consuming runtime state | canvas nonblank smoke |
| Three.js 程序预览和执行轨迹 | `app/src/visualization/five-axis-scene.js`, `tests/browser/gmoccapy_shell_smoke.html` | LinuxCNC interpreter canonical motion, LinuxCNC TP timing samples, task/motion/HAL feedback | display only; no G-code semantics generated in Three.js | source-program browser smoke + desktop/mobile canvas nonblank |
| Vismach transform tree | `app/src/visualization/machine-model.ts` | `lib/python/vismach.py`, `src/hal/user_comps/vismach/*.py` | visualization from GUI reference | scene graph smoke |
| `xyzac-trt` profile | `app/src/profiles/xyzac-trt.js` | `configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini` | source/config reference | profile boundary node smoke |
| `xyzac-trt` source reference map | `app/src/profiles/source-reference-map.js` | `xyzac-trt.ini`, `xyzac-trt.xml`, `switchkins_postgui.hal`, `xyzac-trt_cmds.hal`, `xyzac-trt-kins.c`, `trtfuncs.c`, `switchkins.c` | profile/source map only, not runtime proof | profile boundary node smoke |
| `xyzbc-trt` profile | `app/src/profiles/xyzbc-trt.js` | `configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini` | source/config reference + runtime module switch | profile node smoke + browser profile switch smoke |
| `gmoccapy-xyzab` reference profile | `app/src/profiles/gmoccapy-xyzab.js` | `linuxcnc/configs/sim/gmoccapy/gmoccapy_XYZAB.ini`, `core_sim_XYZAB.hal`, `spindle_sim.hal`, `simulated_home.hal`, `gmoccapy_postgui.hal` | gmoccapy/trivkins reference profile only; not RTCP proof | gmoccapy XYZAB profile node smoke |
| gmoccapy_XYZAB NML/HAL communication model | `app/src/runtime/gmoccapy-communication-model.js`, `docs/gmoccapy-xyzab-reference.md` | `gmoccapy.py`, `linuxcnc.command/stat/error_channel`, `milltask`, HALUI, POSTGUI_HALFILE startup order | native communication reference mapped to Web store/task policy; browser does not attach to NML/HAL shared memory | gmoccapy communication model node smoke |
| gmoccapy_XYZAB HAL/postgui diagnostics model | `app/src/runtime/gmoccapy-hal-model.js`, `docs/gmoccapy-xyzab-reference.md` | `core_sim_XYZAB.hal`, `spindle_sim.hal`, `simulated_home.hal`, `gmoccapy_postgui.hal` | HAL pin/postgui reference and Web diagnostics only | gmoccapy HAL model node smoke |
| gmoccapy button icon manifest | `app/src/ui-reference/gmoccapy-button-icons.json`, `app/src/assets/gmoccapy-icons/` | `work/working3/gmoccapy_button_icons/button_icon_inventory.csv`, copied classic theme and macro image files | UI asset provenance only; button semantics still require task policy/runtime evidence | gmoccapy icon manifest node smoke |
| SWITCHKINS panel | `app/src/panel-schema/xyzac-trt-pyvcp.js` | `xyzac-trt.xml`, `switchkins_postgui.hal` | UI/HAL binding reference | profile boundary node smoke + browser DOM smoke |
| M428/M429/M430 state | `app/src/profiles/xyzac-trt.js`, `app/src/panel-schema/xyzac-trt-pyvcp.js` | `remap_subs/428remap.ngc`, `429remap.ngc`, `430remap.ngc` | LinuxCNC remap/source reference only until runtime adapter is connected | profile boundary node smoke |
| LinuxCNC boundary adapter | `app/src/runtime/linuxcnc-boundary-adapter.js` | LinuxCNC interpreter/kinematics/TP WASM adapter point | kinematics + interpreter + TP timing runtime connected; task/motion/HAL simulation runtime connected separately | profile boundary node smoke + browser DOM smoke |
| Full execution boundary audit | `app/src/runtime/full-execution-boundary.js`, `app/src/state/store.js`, `app/src/ui/gmoccapy-shell.js` | LinuxCNC kinematics WASM, interpreter WASM, TP WASM, task/motion/HAL WASM, `runSimConfigProgram({ executionMode: "fiveAxisRemap" })`, TRT remap files | machine-file remap, TP timing, and task/motion/HAL ready for Web simulation boundary; hardware/realtime kernel/external processes still false | full execution boundary node smoke + browser DOM smoke |
| Native task/HAL readiness artifact | `app/src/runtime/native-task-hal-audit.js`, `tests/node/verify_native_task_hal_audit.mjs`, `build/readiness/native-task-hal-readiness.json` | `wasm-port/tools/task-hal-source-manifest.txt`, `wasm-port/tests/native/probe_trt_task_hal_runtime.sh`, task/motion/HAL WASM gates | machine-readable audit that separates Web simulation promotion from host realtime/hardware/native process blockers | native task/HAL audit node smoke |
| Native task / realtime HAL sync runtime | `docs/native-task-hal-sync-implementation-steps.md`, `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`, `app/src/runtime/linuxcnc-task-hal-runtime.js` | `src/emc/task/emctaskmain.cc`, `src/emc/task/emctask.cc`, `src/emc/task/taskintf.cc`, `src/emc/task/emccanon.cc`, `src/emc/motion/control.c`, `src/emc/motion/command.c`, `src/emc/motion/motion.c`, `src/hal/hal_lib.c`, `src/hal/hal_priv.h` | task/motion/HAL deterministic WASM simulation runtime; host realtime/hardware out of scope | source manifest, native opt-in probe, HAL runtime smoke, motion/HAL sync smoke, task/HAL WASM SDK smoke, Web store/browser smoke |
| Five-axis kinematics | `core/linuxcnc_kinematics_wasm` | `trtfuncs.c`, `xyzac-trt-kins.c`, `xyzbc-trt-kins.c`, `5axiskins.c` | LinuxCNC source-derived WASM | Node roundtrip smoke |
| RTCP/TCP frame | `app/src/runtime/rtcp-frame.js` | LinuxCNC kinematics output + canonical events | fixture frame plumbing until kinematics WASM is ready | RTCP/store node smoke + browser DOM smoke |
| OPFS/session storage capability | `app/src/runtime/five-axis-session.js`, `app/src/runtime/linuxcnc-machine-file-staging.js`, `app/src/ui/gmoccapy-shell.js` | browser OPFS contract and current page memory fallback | OPFS persistence when available; memory fallback is current page lifecycle only | five_axis_session_smoke + machine_file_staging_smoke + public HTTP fallback browser smoke |

## 3. 源文件追溯清单

### UI 图片

```text
linuxcnc/docs/src/gui/images/gmoccapy_5_axis.png
linuxcnc/docs/src/gui/images/qtvismach_5axis_gantry.png
linuxcnc/docs/src/gui/images/axis.png
linuxcnc/docs/src/gui/images/axis-pyvcp.png
linuxcnc/docs/src/gui/images/qtdragon.png
linuxcnc/docs/src/gui/images/qtdragon_hd.png
```

本项目副本：

```text
assets/reference/linuxcnc-gui/
```

### Python GUI

```text
src/emc/usr_intf/axis/scripts/axis.py
lib/python/vismach.py
src/hal/user_comps/vismach/5axisgui.py
src/hal/user_comps/vismach/xyzac-trt-gui.py
src/hal/user_comps/vismach/xyzbc-trt-gui.py
configs/sim/gmoccapy/gmoccapy_XYZAC.ini
configs/sim/gmoccapy/gmoccapy_XYZAB.ini
configs/sim/gmoccapy/core_sim_XYZAB.hal
configs/sim/gmoccapy/spindle_sim.hal
configs/sim/gmoccapy/simulated_home.hal
configs/sim/gmoccapy/gmoccapy_postgui.hal
configs/sim/qtvcp_screens/qtdragon/README
```

使用方式：

```text
UI/visualization reference only
```

### 5 轴配置

```text
configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini
configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini
configs/sim/axis/vismach/5axis/bridgemill/5axis.ini
configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.ini
```

### PyVCP/HAL

```text
configs/sim/axis/vismach/5axis/bridgemill/5axis.xml
configs/sim/axis/vismach/5axis/bridgemill/5axis_postgui.hal
configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.xml
configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.xml
configs/sim/axis/vismach/5axis/table-rotary-tilting/switchkins_postgui.hal
configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr.xml
configs/sim/axis/vismach/5axis/table-dual-rotary/xyzab-tdr-postgui.hal
```

### 5 轴运动学源码

```text
src/emc/kinematics/trtfuncs.c
src/emc/kinematics/xyzac-trt-kins.c
src/emc/kinematics/xyzbc-trt-kins.c
src/emc/kinematics/5axiskins.c
src/emc/kinematics/switchkins.c
src/emc/kinematics/switchkins.h
src/emc/kinematics/userkfuncs.c
src/emc/kinematics/kins_util.c
```

## 4. 边界状态

| 边界 | 当前状态 | 说明 |
| --- | --- | --- |
| gmoccapy UI style | ready | 可直接 Web 化 |
| Three.js preview | implemented_basic_canvas_scene | 已显示基础五轴机床、刀具/TCP marker、刀轴、刀路，并消费 `rtcpFrame` |
| LinuxCNC interpreter WASM | browser_and_node_canonical_execution_ready | `createLinuxCncInterpSdk()` 已接入普通 G-code canonical motion execution；remap/planner 未 promoted |
| LinuxCNC 5-axis kinematics WASM | browser_and_node_proof_ready | `createLinuxCncKinematicsSdk({ moduleId: "xyzac-trt" })` 已由 web adapter 加载，Node/source-browser/dist-browser smoke 验证 forward/inverse frame |
| RTCP frame UI plumbing | implemented_fixture_and_kinematics_wasm | fixture fallback 仍为 `linuxCncKinematicsReady=false`；browser/node kinematics proof 为 `source-derived-kinematics-wasm` / `linuxcnc_kinematics_wasm_c_abi` |
| Operator workflow | implemented_linuxcnc_task_policy_with_canonical_motion | 上电/急停/复位/模式/JOG/MDI/RUN/PAUSE/RESUME/STOP/HOME 通过 `linuxcnc_task_state_mode_command_gate`；普通程序执行来自 LinuxCNC canonical motion |
| LinuxCNC boundary adapter | kinematics_and_interpreter_connected | `web-rtcp-5axis-linuxcnc-boundary-adapter` 可区分 kinematics-only ready 与 interpreter/remap missing |
| Full execution boundary audit | implemented_task_motion_hal_simulation_runtime | `web-rtcp-5axis-full-linuxcnc-execution-boundary` 汇总 kinematics/interpreter/machine-file-remap/TP/task-HAL evidence；Web simulation boundary 可提升，仍明确 `hardwareDrive=false`、`hostRealtimeKernel=false`、`externalUserMProcessReady=false`、`toolDbProcessReady=false` |
| PyVCP/HAL panel schema | implemented_reference_only | `xyzac-trt-switchkins-pyvcp` 已整理 SWITCHKINS 控件与 HAL nets；不执行 native HAL |
| Python GUI runtime | not_ported | 只参考，不运行 |
| Python remap runtime | blocked | 不在第一版实现 |
| tool DB runtime | blocked | 不在第一版实现 |
| external user-M process | blocked | 不在第一版实现 |
| native hard realtime | out_of_scope | Web 仿真不实现 |

## 5. 每批开发追溯记录模板

后续每批完成后追加：

```text
Batch:
Date:
Files changed:
Feature:
LinuxCNC references:
Boundary:
Tests:
Result:
Remaining risk:
Next:
```

## 6. 首批追溯记录

```text
Batch: M0-docs-preparation
Date: 2026-06-20 CST
Files changed:
  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
Feature:
  完成 5 轴数控系统 Web 仿真程序开发前准备文档。
LinuxCNC references:
  gmoccapy_5_axis.png
  qtvismach_5axis_gantry.png
  axis.py
  vismach.py
  xyzac-trt.ini
  xyzbc-trt.ini
  trtfuncs.c
  5axiskins.c
Boundary:
  docs_only
Tests:
  git diff --check -- web-rtcp-5axis-sim-plan
Result:
  ready_for_M1_web_shell_gmoccapy
Remaining risk:
  尚未实现 app 代码；LinuxCNC kinematics WASM ABI 尚未建立。
Next:
  M1-web-shell-gmoccapy
```

## 7. M1 追溯记录

```text
Batch: M1-web-shell-gmoccapy
Date: 2026-06-20 CST
Files changed:
  .gitignore
  app/index.html
  app/package.json
  app/tsconfig.json
  app/scripts/build-static.mjs
  app/src/main.js
  app/src/state/store.js
  app/src/ui/gmoccapy-shell.js
  app/src/styles/gmoccapy.css
  tests/browser/gmoccapy_shell_smoke.html
  tests/browser/verify_gmoccapy_shell_browser.sh
Feature:
  实现 gmoccapy 5 轴风格 Web shell，并补齐 M1 build gate。
LinuxCNC references:
  docs/src/gui/images/gmoccapy_5_axis.png
  docs/src/gui/images/qtvismach_5axis_gantry.png
  configs/sim/gmoccapy/gmoccapy_XYZAC.ini
Boundary:
  ui_reference_only
  sourceMode=fixture-ui-only
Tests:
  npm --prefix web-rtcp-5axis-sim-plan/app run build
  web-rtcp-5axis-sim-plan/tests/browser/verify_gmoccapy_shell_browser.sh
  git diff --check -- web-rtcp-5axis-sim-plan
Result:
  gmoccapy_static_build=ok
  gmoccapy_shell_smoke=ok
Remaining risk:
  M1 shell/build gate 已闭环；Three.js 真实场景、LinuxCNC interpreter/WASM、5 轴 kinematics ABI 仍未接入。
Next:
  M2-state-and-controls
```

## 8. M2 追溯记录

```text
Batch: M2-state-and-controls
Date: 2026-06-20 CST
Files changed:
  app/package.json
  app/src/profiles/xyzac-trt.js
  app/src/runtime/rtcp-frame.js
  app/src/state/store.js
  app/src/ui/gmoccapy-shell.js
  app/src/styles/gmoccapy.css
  tests/node/verify_rtcp_store.mjs
  tests/browser/gmoccapy_shell_smoke.html
  docs/development-continuation.md
  docs/traceability-matrix.md
Feature:
  实现 gmoccapy store/control 链路，并加入 RTCP fixture frame plumbing。
  Run/Step 会推进 fixture motion frame；TCP/IDENTITY 会切换 RTCP on/off；
  DRO、preview badge 和 info diagnostics 显示 TCP pose、tool axis vector、frame readiness。
  Preview view/Fit/Clear、Rapid/Feed override、Spindle override、Flood/Mist、
  Reload/Home/Full 已接入 store action，并由 node/browser smoke 覆盖。
LinuxCNC references:
  configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini
  configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.xml
  configs/sim/axis/vismach/5axis/table-rotary-tilting/switchkins_postgui.hal
  src/emc/kinematics/xyzac-trt-kins.c
  src/emc/kinematics/trtfuncs.c
Boundary:
  sourceMode=fixture-ui-only
  semanticBoundary=fixture_frame_ui_plumbing_not_linuxcnc_kinematics_proof
  linuxCncKinematicsReady=false
  promotionAllowed=false
Tests:
  npm --prefix web-rtcp-5axis-sim-plan/app run build
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke:node
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke
Result:
  gmoccapy_static_build=ok
  rtcp_store_smoke=ok
  gmoccapy_shell_smoke=ok
Remaining risk:
  RTCP 当前是 UI/runtime frame plumbing，不是 LinuxCNC/source-derived kinematics WASM proof；
  Three.js 仍是 SVG placeholder，M3 需要接入真实 canvas scene 并消费 rtcpFrame。
Next:
  M3-threejs-preview
```

## 9. M3 追溯记录

```text
Batch: M3-threejs-preview
Date: 2026-06-21 CST
Files changed:
  app/src/vendor/three/three.module.js
  app/src/vendor/three/three.core.js
  app/src/visualization/five-axis-scene.js
  app/src/ui/gmoccapy-shell.js
  tests/browser/gmoccapy_shell_smoke.html
  docs/development-continuation.md
  docs/traceability-matrix.md
Feature:
  将 preview 区域从占位内容升级为 Three.js WebGL canvas。
  场景显示基础五轴工作区、工作台、刀具/TCP marker、刀轴和刀路；
  tool marker 消费 store 的 tcpPose，刀轴消费 toolAxisVector，RTCP on/off 影响可见刀轴长度和姿态数据。
LinuxCNC references:
  docs/src/gui/images/qtvismach_5axis_gantry.png
  lib/python/vismach.py
  src/hal/user_comps/vismach/xyzac-trt-gui.py
Boundary:
  visualization_only
  sourceMode=fixture-ui-only
  semanticBoundary=fixture_frame_ui_plumbing_not_linuxcnc_kinematics_proof
Tests:
  npm --prefix web-rtcp-5axis-sim-plan/app run build
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke:node
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke
Result:
  gmoccapy_static_build=ok
  rtcp_store_smoke=ok
  gmoccapy_shell_smoke=ok
Remaining risk:
  Three.js 当前消费 fixture frame；五轴运动学仍未接入 LinuxCNC/source-derived WASM。
Next:
  M4-profile-and-linuxcnc-boundary
```

## 10. M4 追溯记录

```text
Batch: M4-profile-and-linuxcnc-boundary
Date: 2026-06-21 CST
Files changed:
  app/package.json
  app/src/profiles/xyzac-trt.js
  app/src/profiles/source-reference-map.js
  app/src/panel-schema/xyzac-trt-pyvcp.js
  app/src/runtime/linuxcnc-boundary-adapter.js
  app/src/state/store.js
  app/src/ui/gmoccapy-shell.js
  tests/node/verify_rtcp_store.mjs
  tests/node/verify_profile_boundary.mjs
  tests/browser/gmoccapy_shell_smoke.html
  docs/development-continuation.md
  docs/program-implementation-guide.md
  docs/traceability-matrix.md
Feature:
  建立 `xyzac-trt` profile/source reference map、PyVCP/HAL SWITCHKINS panel schema
  和 LinuxCNC boundary adapter 接入点。store/UI 暴露 boundary readiness，
  并明确保持 `linuxCncKinematicsReady=false`、`promotionAllowed=false`。
  本批后续已进一步按 LinuxCNC `xyzac-trt.ini`、`xyzac-trt_cmds.hal`、
  `switchkins_postgui.hal`、`xyzac-trt.tbl`、`428/429/430remap.ngc` 显式整理
  DISPLAY/RS274NGC/TRAJ、axis/joint limits、HALCMD feedback/offset nets、
  HALUI MDI commands、tool table 和 remap IO 约束，使 M4 在 source-aligned
  profile/schema/adapter 层面完整闭环。
LinuxCNC references:
  configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini
  configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.xml
  configs/sim/axis/vismach/5axis/table-rotary-tilting/switchkins_postgui.hal
  configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt_cmds.hal
  configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/428remap.ngc
  configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/429remap.ngc
  configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/430remap.ngc
  src/emc/kinematics/xyzac-trt-kins.c
  src/emc/kinematics/trtfuncs.c
  src/emc/kinematics/switchkins.c
Boundary:
  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
Tests:
  npm --prefix web-rtcp-5axis-sim-plan/app run build
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke:node
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke
Result:
  gmoccapy_static_build=ok
  rtcp_store_smoke=ok
  profile_boundary_smoke=ok
  gmoccapy_shell_smoke=ok
Remaining risk:
  Adapter 目前只是接入点；尚未连接 LinuxCNC interpreter/kinematics WASM ABI。
Next:
  linuxcnc_kinematics_wasm_abi
```

## 11. M5 追溯记录

```text
Batch: M5-operator-program-workflow
Date: 2026-06-21 CST
Files changed:
  app/src/state/store.js
  app/src/ui/gmoccapy-shell.js
  app/src/styles/gmoccapy.css
  tests/node/verify_rtcp_store.mjs
  tests/browser/gmoccapy_shell_smoke.html
  docs/development-continuation.md
  docs/traceability-matrix.md
Feature:
  补齐 operator workflow：上电、急停、AUTO/MANUAL/JOG/MDI、复位、
  本地 G-code 文件加载、刀具预览、程序执行当前行显示和高亮。
LinuxCNC references:
  gmoccapy operator workflow
  AXIS program loading/current-line workflow
  vismach tool preview conventions
Boundary:
  operatorWorkflowBoundary=browser_ui_runtime_fixture
  gcodeLoadBoundary=file_text_staging_only
  programExecutionBoundary=fixture_line_playback_not_linuxcnc_interpreter
  linuxCncKinematicsReady=false
  promotionAllowed=false
Tests:
  npm --prefix web-rtcp-5axis-sim-plan/app run build
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke:node
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke
Result:
  gmoccapy_static_build=ok
  rtcp_store_smoke=ok
  profile_boundary_smoke=ok
  gmoccapy_shell_smoke=ok
Remaining risk:
  程序执行仍是 fixture line playback；下一步必须接 LinuxCNC interpreter/WASM 或
  source-derived kinematics WASM，才能把执行来源升级为 LinuxCNC-owned。
Next:
  linuxcnc_interpreter_or_kinematics_wasm_execution_source
```

## 12. M6 追溯记录

```text
Batch: M6-linuxcnc-kinematics-frame-proof
Date: 2026-06-21 CST
Files changed:
  app/package.json
  app/src/runtime/linuxcnc-kinematics-runtime.js
  app/src/runtime/linuxcnc-boundary-adapter.js
  app/src/runtime/rtcp-frame.js
  app/src/state/store.js
  tests/node/verify_linuxcnc_kinematics_runtime.mjs
  tests/node/verify_rtcp_store.mjs
  tests/node/verify_profile_boundary.mjs
  docs/program-implementation-guide.md
  docs/development-continuation.md
  docs/traceability-matrix.md
Feature:
  将 RTCP frame/boundary adapter 从 fixture-only 接到
  createLinuxCncKinematicsSdk({ moduleId: "xyzac-trt" })。
  新增 web runtime adapter，只加载共享 wasm-port SDK 并返回 LinuxCNC
  forward/inverse 结果；frame builder 使用 forward.pose 和 inverse.joints
  生成 source-derived kinematics frame。
LinuxCNC references:
  wasm-port/runtime/sdk/src/linuxcnc-kinematics.js
  wasm-port/build/wasm/kinematics/linuxcnc_xyzac_trt_kinematics.wasm
  src/emc/kinematics/xyzac-trt-kins.c
  src/emc/kinematics/trtfuncs.c
  src/emc/kinematics/switchkins.c
Boundary:
  sourceMode=source-derived-kinematics-wasm
  semanticBoundary=linuxcnc_kinematics_wasm_c_abi
  linuxCncKinematicsReady=true
  kinematicsFramePromotionAllowed=true
  fullLinuxCncProgramExecutionReady=false
  browserFallback=fixture-ui-only
Tests:
  npm --prefix web-rtcp-5axis-sim-plan/app run build
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke:node
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke
Result:
  gmoccapy_static_build=ok
  linuxcnc_kinematics_runtime_smoke=ok
  rtcp_store_smoke=ok
  profile_boundary_smoke=ok
  gmoccapy_shell_smoke=ok
Remaining risk:
  Browser path still runs fixture fallback because kinematics WASM asset copy/worker
  is not wired into app/src/main.js. Program RUN/STEP still advances fixture lines;
  LinuxCNC interpreter/remap/planner execution is not promoted.
Next:
  browser_kinematics_wasm_asset_worker_or_interpreter_execution_source
```

## 13. M7 追溯记录

```text
Batch: M7-browser-kinematics-runtime
Date: 2026-06-21 CST
Files changed:
  app/package.json
  app/scripts/build-static.mjs
  app/src/main.js
  app/src/runtime/linuxcnc-kinematics-runtime.js
  tests/browser/gmoccapy_shell_smoke.html
  tests/browser/verify_gmoccapy_dist_browser.sh
  docs/development-continuation.md
  docs/program-implementation-guide.md
  docs/technical-roadmap.md
  docs/traceability-matrix.md
Feature:
  将浏览器主流程接入 xyzac-trt LinuxCNC kinematics WASM。
  runtime loader 移除顶层 node:* 依赖，支持 browser ESM import；
  app/src/main.js 启动后自动 attach kinematics runtime；
  build-static 复制 linuxcnc-kinematics.js 与 kinematics .js/.wasm 产物到 dist；
  browser smoke 同时覆盖源码入口和 dist 入口。
LinuxCNC references:
  wasm-port/runtime/sdk/src/linuxcnc-kinematics.js
  wasm-port/build/wasm/kinematics/linuxcnc_xyzac_trt_kinematics.js
  wasm-port/build/wasm/kinematics/linuxcnc_xyzac_trt_kinematics.wasm
  src/emc/kinematics/xyzac-trt-kins.c
Boundary:
  sourceMode=source-derived-kinematics-wasm
  semanticBoundary=linuxcnc_kinematics_wasm_c_abi
  browserKinematicsReady=true
  nodeKinematicsReady=true
  fullLinuxCncProgramExecutionReady=false
  fixtureFallback=available_only_on_runtime_load_failure
Tests:
  npm --prefix web-rtcp-5axis-sim-plan/app run build
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke:node
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke
Result:
  gmoccapy_static_build=ok
  linuxcnc_kinematics_runtime_smoke=ok
  rtcp_store_smoke=ok
  profile_boundary_smoke=ok
  gmoccapy_shell_smoke=ok
  gmoccapy_dist_smoke=ok
Remaining risk:
  Superseded by M8/M9: browser kinematics now runs through Worker and ordinary
  G-code RUN/STEP uses LinuxCNC interpreter canonical events. Remap/planner
  execution remains not promoted.
Next:
  linuxcnc_interpreter_remap_planner_execution_source_or_worker_isolation
```

## 14. M8-M9 追溯记录

```text
Batch: M8-kinematics-worker-runtime
Batch: M9-interpreter-canonical-program-execution
Date: 2026-06-21 CST
Files changed:
  app/package.json
  app/scripts/build-static.mjs
  app/src/main.js
  app/src/runtime/linuxcnc-interpreter-runtime.js
  app/src/runtime/linuxcnc-kinematics-runtime.js
  app/src/runtime/linuxcnc-kinematics-worker.js
  app/src/runtime/linuxcnc-kinematics-worker-client.js
  app/src/runtime/linuxcnc-boundary-adapter.js
  app/src/state/store.js
  app/src/ui/gmoccapy-shell.js
  tests/node/verify_linuxcnc_interpreter_runtime.mjs
  tests/node/verify_linuxcnc_kinematics_runtime.mjs
  tests/node/verify_rtcp_store.mjs
  tests/browser/gmoccapy_shell_smoke.html
Feature:
  浏览器默认通过 Web Worker 加载 xyzac-trt LinuxCNC kinematics WASM；
  普通 G-code 程序通过 LinuxCNC interpreter WASM 执行并输出 canonical
  motion events；RUN/STEP 使用 canonical motion line/pose 更新 G-code
  highlight、DRO、RTCP frame 和 Three.js preview。
LinuxCNC references:
  wasm-port/runtime/sdk/src/linuxcnc-kinematics.js
  wasm-port/runtime/sdk/src/linuxcnc-interp.js
  wasm-port/build/wasm/kinematics/linuxcnc_xyzac_trt_kinematics.wasm
  wasm-port/build/wasm/core/linuxcnc_interp.wasm
Boundary:
  kinematics sourceMode=source-derived-kinematics-wasm
  kinematics executionContext=worker in browser
  interpreter sourceMode=linuxcnc-interpreter-wasm
  interpreter semanticBoundary=linuxcnc_interpreter_wasm_canonical_events
  remapRuntimeReady=false
  plannerRuntimeReady=false
  fullLinuxCncProgramExecutionReady=false
Tests:
  npm --prefix web-rtcp-5axis-sim-plan/app run build
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke:node
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke
Result:
  gmoccapy_static_build=ok
  linuxcnc_kinematics_runtime_smoke=ok
  linuxcnc_interpreter_runtime_smoke=ok
  rtcp_store_smoke=ok
  profile_boundary_smoke=ok
  gmoccapy_shell_smoke=ok
  gmoccapy_dist_smoke=ok
Remaining risk:
  Interpreter runtime currently runs on the main browser thread; remap/planner,
  OPFS machine-session staging, Python remap, tool DB, and external user-M process
  remain not promoted.
Next:
  remap_planner_worker_interpreter_or_opfs_machine_session_integration
```

## 15. M10-M11 追溯记录

```text
Batch: M10-profile-switching
Batch: M11-profile-session-business-closure
Date: 2026-06-21 CST
Files changed:
  app/src/profiles/index.js
  app/src/profiles/xyzbc-trt.js
  app/src/profiles/source-reference-map.js
  app/src/runtime/five-axis-session.js
  app/src/runtime/rtcp-frame.js
  app/src/state/store.js
  app/src/ui/gmoccapy-shell.js
  app/src/styles/gmoccapy.css
  tests/node/verify_five_axis_session.mjs
  tests/node/verify_profile_boundary.mjs
  tests/node/verify_rtcp_store.mjs
  tests/browser/gmoccapy_shell_smoke.html
Feature:
  增加 xyzbc-trt profile、source reference map、PyVCP SWITCHKINS schema
  变体和 UI profile selector；profile 切换后重载对应 LinuxCNC kinematics WASM。
  增加 web-rtcp-5axis OPFS session snapshot，可保存/恢复 profile、program、
  axis/TCP pose、RTCP state、canonical execution summary、runtime readiness 和 preview state。
LinuxCNC references:
  configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini
  configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.xml
  src/emc/kinematics/xyzbc-trt-kins.c
  wasm-port/runtime/opfs snapshot/file-service pattern
Boundary:
  profile switching=source/config reference plus source-derived kinematics runtime reload
  session persistence=browser OPFS UI/runtime state snapshot
  machine-file staging=false
  remapRuntimeReady=false
  plannerRuntimeReady=false
Tests:
  npm --prefix web-rtcp-5axis-sim-plan/app run build
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke:node
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke
Result:
  gmoccapy_static_build=ok
  linuxcnc_kinematics_runtime_smoke=ok
  linuxcnc_interpreter_runtime_smoke=ok
  five_axis_session_smoke=ok
  rtcp_store_smoke=ok
  profile_boundary_smoke=ok
  gmoccapy_shell_smoke=ok
  gmoccapy_dist_smoke=ok
Remaining risk:
  Session snapshot persists Web simulation state, not full LinuxCNC machine-file
  staging. Interpreter still runs on the main browser thread. Remap/planner,
  Python remap, tool DB, and external user-M process remain not promoted.
Next:
  interpreter_worker_or_opfs_machine_file_staging_or_remap_planner_boundary
```

## 17. M18 追溯记录

```text
Batch: M18-linuxcnc-task-policy-controls
Date: 2026-06-21 CST
Files changed:
  app/src/state/linuxcnc-task-policy.js
  app/src/runtime/execution-timing.js
  app/src/state/store.js
  app/src/ui/gmoccapy-shell.js
  tests/node/verify_rtcp_store.mjs
  tests/node/verify_five_axis_session.mjs
  tests/browser/gmoccapy_shell_smoke.html
Feature:
  Adds a source-referenced LinuxCNC task policy gate for operator controls:
  TOGGLE_POWER, RESET, ESTOP, SET_MODE, JOG, RUN_MDI, RUN, STEP, HOME,
  PAUSE, RESUME, STOP, and ABORT. The gmoccapy diagnostics panel now exposes
  task state/mode/interpreter state, gate readiness, and the source file list
  including `linuxcnc/src/emc/task/emctaskmain.cc`.
  Adds LinuxCNC TP queue timing from interpreter canonical motion events.
  UI now reports total/elapsed/remaining time and current segment
  duration/velocity from the TP WASM runtime when available.
LinuxCNC references:
  src/emc/nml_intf/emc.hh
  src/emc/task/emctaskmain.cc
  src/emc/task/emctask.cc
Boundary:
  taskPolicyBoundary=linuxcnc_task_state_mode_command_gate
  timingBoundary=linuxcnc_tp_queue_runtime_timing_from_canonical_motion
  sourceMode=linuxcnc-task-source-referenced-policy
  nativeTaskReady=false
  nativeHalSyncReady=false
  plannerRuntimeReady=true
  fullLinuxCncProgramExecutionReady=false
Tests:
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke:node
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke
Result:
  rtcp_store_smoke=ok
  five_axis_session_smoke=ok
  gmoccapy_shell_smoke=ok
  gmoccapy_dist_smoke=ok
Remaining risk:
  The control gates are aligned to LinuxCNC task source behavior, but this is
  still a Web policy mirror. The project does not run the native LinuxCNC task
  process, NML IPC loop, or realtime HAL synchronization. TP timing is computed
  by the vendored LinuxCNC TP queue runtime from canonical motion events; it is
  still not hardware drive timing and does not make native task/HAL ready.
Next:
  decide_release_handoff_or_start_native_task_hal_planner_boundary
```

## 17. M13 追溯记录

```text
Batch: M13-interpreter-worker-runtime
Date: 2026-06-21 CST
Files changed:
  app/src/main.js
  app/src/runtime/linuxcnc-interpreter-worker.js
  app/src/runtime/linuxcnc-interpreter-worker-client.js
  app/src/state/store.js
  app/src/ui/gmoccapy-shell.js
  tests/browser/gmoccapy_shell_smoke.html
  tests/node/verify_five_axis_session.mjs
  tests/node/verify_rtcp_store.mjs
Feature:
  Browser LinuxCNC interpreter WASM now loads through a Web Worker by default,
  matching the existing kinematics Worker isolation. Program execution in store
  accepts async interpreter runtimes, exposes interpreterExecutionPending, and
  uses a sequence guard so stale Worker results cannot overwrite newer program
  loads.
LinuxCNC references:
  wasm-port/runtime/sdk/src/linuxcnc-interp.js
  wasm-port/build/wasm/core/linuxcnc_interp.js
  wasm-port/build/wasm/core/linuxcnc_interp.wasm
Boundary:
  browserInterpreterExecutionContext=worker
  nodeInterpreterExecutionContext=direct
  interpreter semanticBoundary=linuxcnc_interpreter_wasm_canonical_events
  remapRuntimeReady=false
  plannerRuntimeReady=false
  fullLinuxCncProgramExecutionReady=false
Tests:
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke:node
  npm --prefix web-rtcp-5axis-sim-plan/app run build
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke
Result:
  linuxcnc_kinematics_runtime_smoke=ok
  linuxcnc_interpreter_runtime_smoke=ok
  five_axis_session_smoke=ok
  rtcp_store_smoke=ok
  profile_boundary_smoke=ok
  gmoccapy_static_build=ok
  gmoccapy_shell_smoke=ok
  gmoccapy_dist_smoke=ok
Remaining risk:
  Interpreter isolation is complete for browser canonical execution, but this
  still does not promote native LinuxCNC remap/planner, tool DB, task/HAL sync,
  or external user-M process.
Next:
  opfs_machine_file_staging_or_remap_planner_boundary
```

## 18. M14 追溯记录

```text
Batch: M14-opfs-machine-file-staging
Date: 2026-06-21 CST
Files changed:
  app/package.json
  app/scripts/build-static.mjs
  app/src/main.js
  app/src/runtime/linuxcnc-machine-file-staging.js
  app/src/state/store.js
  app/src/ui/gmoccapy-shell.js
  tests/node/verify_machine_file_staging.mjs
  tests/browser/gmoccapy_shell_smoke.html
Feature:
  Adds LinuxCNC TRT machine-file staging for the web simulator. The runtime
  reuses `planSimConfigStaging()` to collect INI, tool table, HAL/PyVCP assets,
  remap NGC files, and demo G-code from the vendored LinuxCNC tree, then persists
  those text files into OPFS-style machine paths. Store exposes stageMachineFiles()
  and gmoccapy diagnostics render staging status.
LinuxCNC references:
  wasm-port/runtime/sdk/src/sim-config-staging.js
  wasm-port/tools/source-manifest.txt
  configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini
  configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.ini
  configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/*.ngc
  configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/*.ngc
Boundary:
  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
Tests:
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke:node
  npm --prefix web-rtcp-5axis-sim-plan/app run build
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke
Result:
  machine_file_staging_smoke=ok
  linuxcnc_kinematics_runtime_smoke=ok
  linuxcnc_interpreter_runtime_smoke=ok
  five_axis_session_smoke=ok
  rtcp_store_smoke=ok
  profile_boundary_smoke=ok
  gmoccapy_static_build=ok
  gmoccapy_shell_smoke=ok
  gmoccapy_dist_smoke=ok
Remaining risk:
  Machine files are staged and persisted as browser/host text assets. This does
  not yet execute a machine-file backed LinuxCNC task session, native HAL sync,
  Python/NGC remap runtime, full planner, tool DB, or external user-M process.
Next:
  remap_planner_boundary_or_machine_file_backed_run
```

## 19. M15 追溯记录

```text
Batch: M15-machine-file-backed-fiveaxis-remap-run
Date: 2026-06-21 CST
Files changed:
  app/src/runtime/linuxcnc-interpreter-runtime.js
  app/src/runtime/linuxcnc-interpreter-worker.js
  app/src/runtime/linuxcnc-interpreter-worker-client.js
  app/src/runtime/linuxcnc-machine-file-staging.js
  app/src/state/store.js
  app/src/ui/gmoccapy-shell.js
  tests/node/verify_machine_file_staging.mjs
  tests/browser/gmoccapy_shell_smoke.html
Feature:
  Adds machine-file backed five-axis remap execution. The simulator now stages
  TRT machine files, forwards the staged INI/tool table/remap/demo files into
  the LinuxCNC interpreter WASM filesystem, and calls
  `runSimConfigProgram({ executionMode: "fiveAxisRemap" })`. Node and browser
  smokes verify LinuxCNC reports INI open, remap readiness, and program exit.
LinuxCNC references:
  wasm-port/runtime/sdk/src/linuxcnc-interp.js
  wasm-port/runtime/sdk/src/sim-config-staging.js
  configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini
  configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/428remap.ngc
  configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/429remap.ngc
  configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins.ngc
Boundary:
  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
Tests:
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke:node
  npm --prefix web-rtcp-5axis-sim-plan/app run build
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke
Result:
  machine_file_staging_smoke=ok
  linuxcnc_interpreter_runtime_smoke=ok
  rtcp_store_smoke=ok
  gmoccapy_shell_smoke=ok
  gmoccapy_dist_smoke=ok
Remaining risk:
  The run uses vendored LinuxCNC five-axis remap C ABI for staged files, but
  still does not promote full native task/HAL synchronization, trajectory
  planner runtime, tool DB process, or external user-M process.
Next:
  planner_boundary_or_full_task_hal_gap_closure
```

## 20. M16 追溯记录

```text
Batch: M16-planner-task-hal-boundary-audit
Date: 2026-06-21 CST
Files changed:
  app/package.json
  app/src/runtime/full-execution-boundary.js
  app/src/runtime/linuxcnc-interpreter-runtime.js
  app/src/state/store.js
  app/src/ui/gmoccapy-shell.js
  tests/node/verify_full_execution_boundary.mjs
  tests/node/verify_linuxcnc_interpreter_runtime.mjs
  tests/node/verify_machine_file_staging.mjs
  tests/node/verify_rtcp_store.mjs
  tests/browser/gmoccapy_shell_smoke.html
Feature:
  Adds a full LinuxCNC execution boundary audit layer. The Web simulator now
  summarizes kinematics WASM, interpreter canonical motion, machine-file
  staging, five-axis remap C ABI run, and switchkins HAL evidence in one
  explicit diagnostics contract. It also adds an Audit control that can trigger
  staging plus machine-file backed remap execution from the gmoccapy shell.
LinuxCNC references:
  wasm-port/runtime/sdk/src/linuxcnc-interp.js
  wasm-port/runtime/sdk/src/linuxcnc-hal.js
  configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini
  configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/428remap.ngc
  configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/429remap.ngc
  configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/430remap.ngc
Boundary:
  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
Tests:
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke:node
  npm --prefix web-rtcp-5axis-sim-plan/app run build
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke
Result:
  full_execution_boundary_smoke=ok
  machine_file_staging_smoke=ok
  linuxcnc_interpreter_runtime_smoke=ok
  rtcp_store_smoke=ok
  gmoccapy_shell_smoke=ok
  gmoccapy_dist_smoke=ok
Remaining risk:
  Full native LinuxCNC task/NML process, realtime HAL thread synchronization,
  trajectory planner queue runtime, external user-M process, and full tool DB
  process are still not ported or promoted.
Next:
  optional_native_task_hal_planner_port_or_release_handoff
```

## 21. M17 追溯记录

```text
Batch: M17-linuxcnc-5axis-gcode-source-ingest
Date: 2026-06-21 CST
Files changed:
  app/src/runtime/linuxcnc-machine-file-staging.js
  app/src/runtime/linuxcnc-interpreter-runtime.js
  app/src/state/store.js
  app/src/ui/gmoccapy-shell.js
  tests/node/verify_machine_file_staging.mjs
  tests/browser/gmoccapy_shell_smoke.html
Feature:
  Adds real vendored LinuxCNC five-axis G-code source ingestion. TRT demo
  programs from `configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/*.ngc`
  are staged, listed in the gmoccapy G-code panel, loadable into the program
  viewer, and used as the selected `wasmProgramPath` for machine-file backed
  fiveAxisRemap execution.
LinuxCNC references:
  configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc
  configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzbc.ngc
  configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc
  configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins.ngc
  configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzbc_switchkins.ngc
Boundary:
  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
Tests:
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke:node
  npm --prefix web-rtcp-5axis-sim-plan/app run build
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke
Result:
  machine_file_staging_smoke=ok
  gmoccapy_shell_smoke=ok
  gmoccapy_dist_smoke=ok
Remaining risk:
  The selected G-code source is real LinuxCNC vendored source and the machine-file
  run uses that selected file path, but full native task/NML, realtime HAL sync,
  and trajectory planner queue runtime are still not promoted.
Next:
  trajectory_planner_wasm_boundary_or_native_task_hal_port
```

## 22. Native Task/HAL Phase 0-4 追溯记录

```text
Batch: native-task-hal-phase0-4-runtime-boundary
Date: 2026-06-22 CST
Files changed:
  wasm-port/tools/task-hal-source-manifest.txt
  wasm-port/tools/verify_task_hal_source_manifest.sh
  wasm-port/tests/native/probe_trt_task_hal_runtime.sh
  wasm-port/runtime/core/shims/hal.h
  wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_hal_runtime.hh
  wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_hal_runtime.cpp
  wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_hal_runtime_probe.cpp
  wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.h
  wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.c
  wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.hh
  wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp
  wasm-port/tools/build_task_hal_wasm.sh
  wasm-port/runtime/sdk/src/linuxcnc-task-hal.js
  wasm-port/runtime/sdk/src/index.js
  wasm-port/tests/wasm/node/verify_hal_runtime.sh
  wasm-port/tests/wasm/node/verify_motion_hal_sync.sh
  wasm-port/tests/wasm/node/verify_task_hal_wasm.sh
  wasm-port/tests/wasm/node/verify_task_hal_sdk.sh
Feature:
  Establishes the unpromoted native task/HAL implementation path through
  phase 0 source manifest evidence, phase 1 opt-in native TRT task/HAL probe,
  phase 2 C/C++ HAL runtime registry, and phase 3 minimal motion/HAL servo-cycle
  C ABI. The HAL runtime owns pin/signal/param/net/thread state and blocks
  `loadusr`; the motion runtime accepts LinuxCNC-style command JSON and
  synchronizes `motion.*`, `axis.*`, and `joint.*` HAL pins on deterministic
  servo cycles. Phase 4 adds the planned `lctask_*` C ABI as an in-process
  task shim that stages files, opens a program, tracks task state/mode/interp
  and exec status, and forwards RUN/PAUSE/RESUME/ABORT/MDI/JOG into motion/HAL
  runtime snapshots. It also adds the SDK wrapper needed for later Worker
  integration.
LinuxCNC references:
  src/emc/task/task.hh
  src/emc/task/emctask.cc
  src/emc/task/emctaskmain.cc
  src/emc/task/taskintf.cc
  src/emc/task/emccanon.cc
  src/emc/nml_intf/emc.hh
  src/emc/motion/motion.h
  src/emc/motion/command.c
  src/emc/motion/control.c
  src/emc/motion/mot_priv.h
  src/hal/hal_lib.c
  src/hal/hal_priv.h
  src/hal/components/threads.c
Boundary:
  taskHalSourceManifestReady=true
  nativeTaskHalProbe=opt_in_ready_disabled_by_default
  halRuntimeBoundary=linuxcnc_hal_runtime_phase2_minimal
  motionHalBoundary=linuxcnc_motion_runtime_phase3_minimal
  taskHalBoundary=linuxcnc_task_motion_hal_wasm_phase4_minimal
  nativeTaskReady=false
  nativeHalSyncReady=false
  fullLinuxCncProgramExecutionReady=false
  promotionAllowed=false
Tests:
  wasm-port/tools/verify_task_hal_source_manifest.sh
  wasm-port/tests/native/probe_trt_task_hal_runtime.sh
  wasm-port/tests/wasm/node/verify_hal_runtime.sh
  wasm-port/tests/wasm/node/verify_motion_hal_sync.sh
  wasm-port/tests/wasm/node/verify_task_hal_wasm.sh
  wasm-port/tests/wasm/node/verify_task_hal_sdk.sh
Result:
  task_hal_source_manifest_ready=1
  native_probe_status=ready_disabled_by_default
  hal_runtime_registry=ok
  hal_net_signal_propagation=ok
  hal_thread_scheduler=ok
  loadusr_blocked_evidence=ok
  motion_hal_servo_cycle=ok
  motion_program_line_hal_sync=ok
  switchkins_type_hal_sync=ok
  jog_motion_status_sync=ok
  linuxcnc_task_runtime_smoke=ok
  task_status_from_linuxcnc_runtime=ok
  task_commands_drive_motion_runtime=ok
  mdi_jog_task_motion_hal_sync=ok
  linuxcnc_task_hal_sdk=ok
Remaining risk:
  Phase 4 is still a narrow deterministic runtime-edge adapter. Full LinuxCNC
  task loop, in-process NML queue sourced from `emc.hh`, canonical queue,
  real `emcmotController()`, machine-file session integration, native/WASM
  comparison artifacts, and browser Worker/store wiring are still required
  before promotion.
Next:
  task_hal_machine_file_session_and_worker_wiring
```

## 20. M20 追溯记录

```text
Batch: M20-task-hal-machine-file-worker-boundary
Date: 2026-06-22 CST
Files changed:
  app/src/runtime/linuxcnc-task-hal-runtime.js
  app/src/runtime/linuxcnc-task-hal-worker.js
  app/src/runtime/linuxcnc-task-hal-worker-client.js
  app/src/runtime/linuxcnc-machine-file-staging.js
  app/src/runtime/full-execution-boundary.js
  app/src/state/store.js
  app/src/ui/gmoccapy-shell.js
  app/scripts/build-static.mjs
  tests/node/verify_linuxcnc_task_hal_runtime.mjs
  tests/node/verify_full_execution_boundary.mjs
Feature:
  Connects the task/motion/HAL WASM runtime to the Web simulator boundary.
  Machine-file staging now emits a task/HAL session descriptor. The Web runtime
  can init/stage/open files, send task commands, run deterministic task/servo
  cycles, read task/motion/HAL status, and map `motion.program-line` plus
  `motion.switchkins-type` back into gmoccapy current line, DRO, RTCP state, and
  diagnostics. Full boundary promotion now depends on task runtime, motion
  runtime, HAL runtime, HAL sync, and task/HAL cycle artifact evidence.
LinuxCNC references:
  src/emc/task/task.hh
  src/emc/task/emctask.cc
  src/emc/task/emctaskmain.cc
  src/emc/task/taskintf.cc
  src/emc/task/emccanon.cc
  src/emc/nml_intf/emc.hh
  src/emc/motion/motion.h
  src/emc/motion/command.c
  src/emc/motion/control.c
  src/hal/hal_lib.c
  src/hal/hal_priv.h
  src/hal/components/threads.c
Boundary:
  taskHalBoundary=linuxcnc_task_motion_hal_wasm_simulation_runtime
  nativeTaskReady=true for Web simulation boundary
  nativeHalSyncReady=true for Web simulation boundary
  fullLinuxCncProgramExecutionReady=true when kinematics/interpreter/machine-file-remap/TP/task-HAL gates pass
  hardwareDrive=false
  hostRealtimeKernel=false
  externalUserMProcessReady=false
  toolDbProcessReady=false
Tests:
  bash wasm-port/tools/build_task_hal_wasm.sh
  bash wasm-port/tools/verify_task_hal_source_manifest.sh
  bash wasm-port/tests/native/verify_task_hal_phase0.sh
  bash wasm-port/tests/native/probe_trt_task_hal_runtime.sh
  bash wasm-port/tests/wasm/node/verify_hal_runtime.sh
  bash wasm-port/tests/wasm/node/verify_motion_hal_sync.sh
  bash wasm-port/tests/wasm/node/verify_task_hal_wasm.sh
  bash wasm-port/tests/wasm/node/verify_task_hal_sdk.sh
  node web-rtcp-5axis-sim-plan/tests/node/verify_linuxcnc_task_hal_runtime.mjs
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke:node
  npm --prefix web-rtcp-5axis-sim-plan/app run build
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke
Result:
  linuxcnc_task_hal_wasm_build=ok
  task_hal_source_manifest_ready=1
  task_hal_phase0_native_probe_gate=ok
  native_probe_status=ready_disabled_by_default
  hal_runtime_registry=ok
  motion_hal_sync_smoke=ok
  linuxcnc_task_runtime_smoke=ok
  linuxcnc_task_hal_sdk=ok
  linuxcnc_task_hal_runtime_smoke=ok
  task_hal_machine_file_smoke=ok
  switchkins_remap_hal_sync_smoke=ok
  browser_task_hal_worker_smoke=ok
  gmoccapy_static_build=ok
  gmoccapy_shell_smoke=ok
  gmoccapy_dist_smoke=ok
Remaining risk:
  The promoted boundary is deterministic Web simulation only. It does not run
  a host LinuxCNC realtime kernel, hardware IO, Mesa/parallel-port drivers,
  arbitrary external user-M processes, or the full tool DB process.
Next:
  hardware_realtime_external_processes_if_required
```

## 16. M12 追溯记录

```text
Batch: M12-switchkins-rtcp-program-execution
Date: 2026-06-21 CST
Files changed:
  app/src/runtime/linuxcnc-interpreter-runtime.js
  app/src/runtime/linuxcnc-kinematics-runtime.js
  app/src/runtime/linuxcnc-kinematics-worker.js
  app/src/runtime/linuxcnc-kinematics-worker-client.js
  app/src/state/store.js
  app/src/ui/gmoccapy-shell.js
  tests/node/verify_linuxcnc_interpreter_runtime.mjs
  tests/node/verify_rtcp_store.mjs
  tests/browser/gmoccapy_shell_smoke.html
Feature:
  LinuxCNC TRT `M428/M429/M430` switchkins remap M-code is preserved as
  program-level runtime events. The interpreter runtime strips those high M-codes
  only from the WASM input program so LinuxCNC interpreter canonical motion can
  continue, then annotates canonical motion with active switchkins state.
  RUN/STEP/RUN_FRAME now applies program switchkins state to RTCP state and calls
  LinuxCNC kinematics WASM `lckins_switch()` through direct and Worker runtimes.
LinuxCNC references:
  configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini
  configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/428remap.ngc
  configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/429remap.ngc
  configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/430remap.ngc
  src/emc/kinematics/switchkins.c
  wasm-port/runtime/sdk/src/linuxcnc-kinematics.js
Boundary:
  switchkinsProgramBoundary=linuxcnc_remap_mcode_preserved_and_web_runtime_applied
  interpreter sourceMode=linuxcnc-interpreter-wasm
  interpreter semanticBoundary=linuxcnc_interpreter_wasm_canonical_events
  kinematics semanticBoundary=linuxcnc_kinematics_wasm_c_abi
  remapRuntimeReady=false
  plannerRuntimeReady=false
  fullLinuxCncProgramExecutionReady=false
Tests:
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke:node
  npm --prefix web-rtcp-5axis-sim-plan/app run build
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke
Result:
  linuxcnc_kinematics_runtime_smoke=ok
  linuxcnc_interpreter_runtime_smoke=ok
  five_axis_session_smoke=ok
  rtcp_store_smoke=ok
  profile_boundary_smoke=ok
  gmoccapy_static_build=ok
  gmoccapy_shell_smoke=ok
  gmoccapy_dist_smoke=ok
Remaining risk:
  This preserves and applies switchkins remap M-codes in Web runtime, but does not
  execute LinuxCNC Python/NGC remap, native HAL/task synchronization, full planner,
  tool DB, or external user-M process.
Next:
  interpreter_worker_or_opfs_machine_file_staging_or_remap_planner_boundary
```

## 21. M18 追溯记录

```text
Batch: M18-native-task-hal-source-and-artifact-audit
Date: 2026-06-22 CST
Files changed:
  .gitignore
  app/package.json
  app/src/runtime/native-task-hal-audit.js
  tests/node/verify_native_task_hal_audit.mjs
  docs/development-continuation.md
  docs/program-implementation-guide.md
  docs/traceability-matrix.md
Feature:
  Adds a machine-readable readiness audit for the native task/HAL source and
  artifact boundary. The audit consumes task/HAL source manifest evidence,
  default non-exclusive TRT native probe evidence, full execution boundary
  readiness, and task/HAL runtime status, then writes
  build/readiness/native-task-hal-readiness.json.
LinuxCNC references:
  wasm-port/tools/task-hal-source-manifest.txt
  wasm-port/tests/native/probe_trt_task_hal_runtime.sh
  src/emc/task/emctaskmain.cc
  src/emc/motion/control.c
  src/hal/hal_lib.c
Boundary:
  webSimulation.promotionScope=web_simulation_only
  nativeTaskReady=true for Web simulation boundary only
  nativeHalSyncReady=true for Web simulation boundary only
  hardwareDrive=false
  hostRealtimeKernel=false
  externalUserMProcessReady=false
  toolDbProcessReady=false
Tests:
  node web-rtcp-5axis-sim-plan/tests/node/verify_native_task_hal_audit.mjs
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke:node
  bash web-rtcp-5axis-sim-plan/tests/browser/verify_gmoccapy_shell_browser.sh
  bash web-rtcp-5axis-sim-plan/tests/browser/verify_gmoccapy_dist_browser.sh
Result:
  native_task_hal_source_artifact_audit=ok
  task_hal_web_simulation_boundary_consistent=1
  native_task_hal_host_probe_status=ready_disabled_by_default
  hardware_drive=0
  host_realtime_kernel=0
  external_user_m_process_ready=0
  tool_db_process_ready=0
  promotion_scope=web_simulation_only
Remaining risk:
  The readiness artifact does not execute host realtime LinuxCNC or hardware IO.
  It intentionally keeps external user-M process and tool DB process readiness
  false.
Next:
  M19-linuxcnc-source-program-case-coverage
```

## 22. M19 追溯记录

```text
Batch: M19-linuxcnc-source-program-case-coverage
Date: 2026-06-22 CST
Files changed:
  app/package.json
  app/src/runtime/linuxcnc-interpreter-runtime.js
  tests/node/verify_real_linuxcnc_5axis_program_cases.mjs
  tests/browser/gmoccapy_shell_smoke.html
  wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_tp_wasm.c
  docs/development-continuation.md
  docs/program-implementation-guide.md
  docs/traceability-matrix.md
Feature:
  Adds a real LinuxCNC TRT source-program case gate. The gate covers staged
  source guards for boat, impeller, xyzac switchkins, and xyzbc switchkins demo
  programs; validates direct interpreter canonical motion and LinuxCNC TP
  samples where the source file is directly executable; and validates
  machine-file staging/remap readiness for subroutine-entry demo files.
LinuxCNC references:
  configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzac.ngc
  configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzbc.ngc
  configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/impeller-7bl-xyzac.ngc
  configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins.ngc
  configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_1.ngc
  configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_2.ngc
  configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_3.ngc
  configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzbc_switchkins.ngc
  src/emc/tp/tp.c
Boundary:
  sourceProgramBoundary=linuxcnc_vendored_5axis_gcode_source_file
  toolpathPreviewBoundary=linuxcnc_interpreter_canonical_motion
  toolExecutionTraceBoundary=linuxcnc_tp_samples_or_task_motion_hal_feedback
  threejsGeneratedToolpathSemantics=forbidden
  fixtureToolpathFallbackPromoted=false
Tests:
  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_real_linuxcnc_5axis_program_cases.mjs
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke:node
  bash web-rtcp-5axis-sim-plan/tests/browser/verify_gmoccapy_shell_browser.sh
  bash web-rtcp-5axis-sim-plan/tests/browser/verify_gmoccapy_dist_browser.sh
Result:
  linuxcnc_source_program_case_count=8
  all_cases_program_preview_points=ok
  all_cases_executed_path_points=ok_after_run_or_step
  all_cases_toolpath_preview_source=linuxcnc_interpreter_canonical_motion
  all_cases_tool_execution_trace_source=linuxcnc_tp_samples_or_task_motion_hal_feedback
  all_switchkins_cases_rtcp_state_changes_verified=1
  all_cases_source_guard=linuxcnc_vendored_5axis_gcode_source_file
  fixture_toolpath_fallback_not_promoted=1
  real_linuxcnc_5axis_program_cases_smoke=ok
Remaining risk:
  `xyzac_switchkins.ngc` and `xyzbc_switchkins.ngc` are subroutine-entry demo
  files; direct interpreter execution without staged subroutine context still
  has zero canonical motion, so they remain verified through source guard and
  machine-file remap staging rather than direct single-file preview.
Next:
  M20-threejs-tool-execution-quality
```

## 23. M20 Three.js 显示质量追溯记录

```text
Batch: M20-threejs-tool-execution-quality
Date: 2026-06-22 CST
Files changed:
  app/src/visualization/five-axis-scene.js
  tests/browser/gmoccapy_shell_smoke.html
  docs/development-continuation.md
  docs/program-implementation-guide.md
  docs/traceability-matrix.md
Feature:
  Adds program-preview and tool-execution display quality gates to Three.js.
  The scene now draws rapid/feed/arc layers, the executed TP/task trace, and
  the current segment highlight while fitting the camera to real LinuxCNC
  source-program bounds.
LinuxCNC references:
  LinuxCNC interpreter canonical motion events
  LinuxCNC TP queue timing samples
  task/motion/HAL runtime feedback snapshots
Boundary:
  threejsProgramPreviewMode=program-preview-and-tool-execution
  toolpathPreviewBoundary=linuxcnc_interpreter_canonical_motion
  toolExecutionTraceBoundary=linuxcnc_tp_samples_or_task_motion_hal_feedback
  threejsGeneratedToolpathSemantics=forbidden
Tests:
  bash web-rtcp-5axis-sim-plan/tests/browser/verify_gmoccapy_shell_browser.sh
  bash web-rtcp-5axis-sim-plan/tests/browser/verify_gmoccapy_dist_browser.sh
Result:
  threejs_program_preview_mode=program-preview-and-tool-execution
  threejs_toolpath_preview_source=linuxcnc_interpreter_canonical_motion
  threejs_tool_execution_trace_source=linuxcnc_tp_samples_or_task_motion_hal_feedback
  threejs_path_fit_bounds=ok
  threejs_current_segment_highlight=ok
  threejs_rapid_feed_visual_distinction=ok
  threejs_no_gcode_semantics_generation=ok
  threejs_canvas_nonblank_desktop=ok
  threejs_canvas_nonblank_mobile=ok
Remaining risk:
  The visual distinction is display-only and remains limited to canonical/TP
  segment data already emitted by LinuxCNC runtimes. It does not add lookahead,
  blending, planner semantics, or hardware execution semantics in Three.js.
Next:
  M21-public-http-opfs-degradation
```

## 24. M21 公网 OPFS 降级追溯记录

```text
Batch: M21-public-http-opfs-degradation
Date: 2026-06-22 CST
Files changed:
  app/src/runtime/five-axis-session.js
  app/src/runtime/linuxcnc-machine-file-staging.js
  app/src/state/store.js
  app/src/ui/gmoccapy-shell.js
  tests/node/verify_machine_file_staging.mjs
  tests/browser/gmoccapy_shell_smoke.html
  docs/development-continuation.md
  docs/program-implementation-guide.md
  docs/traceability-matrix.md
Feature:
  Adds explicit storage capability detection and current-page memory fallback
  for public HTTP/IP deployments where OPFS is unavailable. Session save/restore
  and machine-file staging continue inside the current page lifecycle, while UI
  diagnostics report OPFS unavailable and the fallback reason.
LinuxCNC references:
  LinuxCNC machine-file staging remains based on vendored TRT source/config
  files; storage fallback does not alter interpreter, TP, task/HAL, or
  kinematics semantics.
Boundary:
  opfsAvailable=false when browser capability is missing or forced unavailable
  fallbackMode=memory-fallback
  memoryFallbackPersistence=current_page_lifecycle_only
  nonOpfsWorkflowsStillPass=true
Tests:
  node web-rtcp-5axis-sim-plan/tests/node/verify_machine_file_staging.mjs
  node web-rtcp-5axis-sim-plan/tests/node/verify_five_axis_session.mjs
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke:node
  bash web-rtcp-5axis-sim-plan/tests/browser/verify_gmoccapy_shell_browser.sh
  bash web-rtcp-5axis-sim-plan/tests/browser/verify_gmoccapy_dist_browser.sh
Result:
  opfs_unavailable_detected=1
  opfs_fallback_current_page_lifecycle_only=1
  opfs_dependent_actions_report_clear_fallback_message=1
  non_opfs_workflows_still_pass=1
  public_http_smoke_no_uncaught_exception=1
Remaining risk:
  Memory fallback is not persistent across reloads. True OPFS persistence still
  requires a secure context and browser OPFS support.
Next:
  none_from_development_continuation
```

## 25. M22 Host/native 边界可见性追溯记录

```text
Batch: M22-host-native-boundary-visibility
Date: 2026-06-22 CST
Files changed:
  app/src/ui/gmoccapy-shell.js
  tests/browser/gmoccapy_shell_smoke.html
  docs/development-continuation.md
  docs/traceability-matrix.md
Feature:
  Adds an explicit Host/native diagnostics row in gmoccapy info tabs so the
  promoted Web simulation task/motion/HAL boundary remains visibly separated
  from hardware drive, host realtime kernel, external user-M process, and tool
  DB process readiness.
LinuxCNC references:
  No new LinuxCNC source semantics are introduced. The change displays existing
  full execution boundary fields emitted by the LinuxCNC task/motion/HAL Web
  simulation runtime audit.
Boundary:
  hardwareDrive=false
  hostRealtimeKernel=false
  externalUserMProcessReady=false
  toolDbProcessReady=false
  promotionScope=web_simulation_only
Tests:
  bash web-rtcp-5axis-sim-plan/tests/browser/verify_gmoccapy_shell_browser.sh
  bash web-rtcp-5axis-sim-plan/tests/browser/verify_gmoccapy_dist_browser.sh
  npm --prefix web-rtcp-5axis-sim-plan/app run smoke:node
Result:
  host_native_boundary_ui=ok
  hardware_drive_false_visible=1
  host_realtime_false_visible=1
  external_user_m_false_visible=1
  tool_db_false_visible=1
Remaining risk:
  This is a visibility and regression guard only. It does not implement host
  realtime kernel, hardware IO, external user-M process, or native tool DB
  process support.
Next:
  none_from_development_continuation
```
