需要完善的内容，做个备忘
按 web-rtcp-5axis-sim-plan/docs/native-task-hal-sync-implementation-steps.md 的边界要求，本次只处理 Web Three.js 可视化层，不改 LinuxCNC task/HAL runtime 语义。

完成内容：
Three.js 三维显示区改为 toolpath-only：删除画布内地板、网格、坐标轴、机床包络、转台、刀具实体，只保留刀具预览路径线。

补齐 Three.js 相机交互：
- 鼠标左键/单指拖动：旋转
- 鼠标中键、右键或 Shift+拖动：平移
- 鼠标滚轮：缩放
- 双指：缩放并平移
- X/Y/Z/Fit 按钮：预设视角/复位视角


边界说明：
这次没有提升 nativeTaskReady/nativeHalSyncReady；它仍属于 Web simulation UI 显示层调整。task/HAL native/WASM 边界仍需继续按执行文档阶段 0-8 推进。


继续按 web-rtcp-5axis-sim-plan/docs/native-task-hal-sync-implementation-steps.md 边界推进 Three.js 显示层：程序预览和刀具执行过程已显示在 Three.js 区域。

完成内容：
Three.js 区域现在同时显示：
- 完整程序预览路径：来自 state.programExecution.motion，也就是 LinuxCNC interpreter/WASM canonical motion events。
- 已执行路径：优先来自 state.programExecutionTiming.samples，也就是 LinuxCNC TP queue runtime timing samples；没有 samples 时回退到 canonical motion 端点。
- 当前刀具/TCP 执行标记：来自 state.programRuntimeFeedback.axisPose / task-HAL runtime feedback，并显示刀轴方向线。
- 快速移动路径辅助层：从 canonical motion 中的 STRAIGHT_TRAVERSE 提取。

保留功能：
- 鼠标/触控旋转、平移、缩放仍可用。
- X/Y/Z/Fit 预设视角仍可用。
- Clear 会同步清空完整预览路径和已执行路径。

实现文件：
[five-axis-scene.js](/home/cnc/桌面/cnc_wams/web-rtcp-5axis-sim-plan/app/src/visualization/five-axis-scene.js)
[gmoccapy_shell_smoke.html](/home/cnc/桌面/cnc_wams/web-rtcp-5axis-sim-plan/tests/browser/gmoccapy_shell_smoke.html)

新增可观测状态：
canvas.dataset.threeSceneMode=program-preview-and-tool-execution
canvas.dataset.threeProgramPreviewSource=linuxcnc-interpreter-wasm / linuxcnc-machine-file-remap-wasm / fixture-line-playback
canvas.dataset.threePathPoints=完整程序预览点数
canvas.dataset.threeExecutedPathPoints=已执行路径点数
canvas.dataset.threeToolExecutionMarker=true/false

验证已通过：
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

边界说明：
Three.js 不解析 G-code，不手写 LinuxCNC 运动语义；只消费已有 LinuxCNC interpreter canonical motion、TP timing samples、task/HAL runtime feedback。nativeTaskReady/nativeHalSyncReady 的提升仍按执行文档阶段任务另行完成。
发布站点已经可访问，但第一次远端 smoke 卡在无 GPU 的 WebGL 上了，页面退回了 2D fallback。这个不是业务逻辑失败，我现在切换浏览器参数强制 swiftshader，再跑同一套发布后测试。

我先确认当前程序执行数据从哪里来，以及 LinuxCNC 示例程序在仓库里如何被加载。目标是让 Three.js 区域既能显示完整程序预览路径，也能显示执行中的刀具位置/已执行轨迹，并尽量复用已有 interpreter/task/HAL 输出，不手写新的 CNC 语义。


文档更新会比较小：把 “下一步要做 Worker/store” 改为 “已接线”，把当前边界标为 Web simulation promoted，同时仍明确 hardware/realtime kernel/external user-M/tool DB 不支持。历史 M18/M13 记录不改。


公网测试已经跑到一个明确失败点：Save Session 在 http://82.156.24.101:8092 下抛出 OPFS is not available in this browser。这类浏览器存储 API 在公网 HTTP/IP 环境不是安全上下文，很多“保存、恢复、暂存机床文件、完整边界审计”都会受影响；我会继续把其余功能用异常隔离方式跑完，确认还有没有独立问题。


代码确认了：会话保存和机床文件暂存都硬依赖 OPFS。公网 HTTP/IP 不满足安全上下文，因此这些功能天然不可用；我会先用降级后的脚本继续测试不依赖 OPFS 的操作功能，再给出完整问题清单。

本轮继续处理公网 HTTP/IP 测试失败点：Save Session 在 http://82.156.24.101:8092 下因 OPFS 不可用报错。

完成内容：
- five-axis session runtime 现在会优先使用 OPFS；如果当前浏览器没有 navigator.storage.getDirectory，则自动使用页面内存会话存储。
- Save Session / Restore Session 返回并记录 storageMode：
  - opfs：安全上下文下的 OPFS 持久化；
  - memory-fallback：公网 HTTP/IP 等无 OPFS 环境下的页面内存后备；
  - memory：测试显式注入的内存存储。
- gmoccapy 信息面板 Session 行现在显示 status / storageMode / path，避免把 memory-fallback 误认成 OPFS 持久化。
- browser smoke 覆盖默认 Save/Restore 按钮路径，确认无 OPFS 环境不会再抛出 “OPFS is not available in this browser.”。

实现文件：
[five-axis-session.js](/home/cnc/桌面/cnc_wams/web-rtcp-5axis-sim-plan/app/src/runtime/five-axis-session.js)
[store.js](/home/cnc/桌面/cnc_wams/web-rtcp-5axis-sim-plan/app/src/state/store.js)
[gmoccapy-shell.js](/home/cnc/桌面/cnc_wams/web-rtcp-5axis-sim-plan/app/src/ui/gmoccapy-shell.js)
[verify_five_axis_session.mjs](/home/cnc/桌面/cnc_wams/web-rtcp-5axis-sim-plan/tests/node/verify_five_axis_session.mjs)
[gmoccapy_shell_smoke.html](/home/cnc/桌面/cnc_wams/web-rtcp-5axis-sim-plan/tests/browser/gmoccapy_shell_smoke.html)

验证已通过：
node web-rtcp-5axis-sim-plan/tests/node/verify_five_axis_session.mjs
bash web-rtcp-5axis-sim-plan/tests/browser/verify_gmoccapy_shell_browser.sh
npm --prefix web-rtcp-5axis-sim-plan/app run smoke:node
bash web-rtcp-5axis-sim-plan/tests/browser/verify_gmoccapy_dist_browser.sh

边界说明：
memory-fallback 只解决公网 HTTP/IP 下“当前页面生命周期内保存/恢复会话”的可用性，不声称提供 OPFS 持久化。机床文件暂存、完整边界审计中仍硬依赖 OPFS 的部分，公网 HTTP/IP 下还需要继续按功能逐项降级或标记 blocked。


