同步五轴仿真文档和验证证据

This commit is contained in:
2026-06-26 09:45:39 -04:00
parent d5d96a8e5c
commit 8df191faa5
188 changed files with 19504 additions and 42 deletions

View File

@@ -0,0 +1,112 @@
# 01-功能内容
## 功能目标
完善 Web RTCP 五轴仿真页面的数控控制按钮互相功能,使按钮状态和点击反馈真实反映 LinuxCNC task/HAL 控制状态。
本轮优先完成的按钮:
- Run
- Stop
- Pause
- Resume
- Step
- Home
## 已实现内容
1. Run 条件检查和提示
- 当执行条件不具备时Run 按钮保持可点击。
- 点击后通过 `operatorMessage` 提示具体原因,例如机器未上电、未切到 AUTO、未 Home、task/HAL runtime 未就绪、未加载 LinuxCNC machine-file G-code 等。
- 前端按钮增加 `data-command-ready``aria-disabled` 状态,避免按钮被禁用后无法给出提示。
2. Stop
- Web store 发送 `EMC_TASK_ABORT`
- task/HAL 状态回到 idle/stopped。
- motion runtime 标记 aborted并清空/停止执行队列。
3. Pause
- Web store 发送 `EMC_TASK_PLAN_PAUSE`
- task/HAL runtime 将解释器状态置为 `PAUSED`
- motion runtime 接收 `EMC_TRAJ_PAUSE`,运动状态进入 paused。
4. Resume
- Web store 发送 `EMC_TASK_PLAN_RESUME`
- 仅当返回的 LinuxCNC task/HAL 状态仍应继续运行时,才恢复 task/HAL status loop。
- 避免 Resume 后在已完成、已停止或不应运行的状态下继续轮询。
5. Step
- Web store 发送 `EMC_TASK_PLAN_STEP`,不再只跑空 cycle。
- task/HAL runtime 记录 `singleStepping=true``taskPaused=true`
- motion runtime 增加 `EMC_TRAJ_STEP` / `EMCMOT_STEP` 支持,在 paused 状态下允许 step 命令通过。
6. Home
- Web store 发送 `EMC_JOINT_HOME`
- Home 后立即保持 Web 侧 `allHomed=true`,防止快速 `HOME -> SET_MODE` 时序丢失已归零状态。
- task/HAL 状态 patch 保留 `allHomed``noForceHoming`
- task/HAL session 初始化时停止旧 status loop防止旧循环覆盖新 session 状态。
## LinuxCNC 源码依据
参考 LinuxCNC 源程序:
- `/home/meswork/cnc_wams/linuxcnc/src/emc/task/emctaskmain.cc`
- `/home/meswork/cnc_wams/linuxcnc/src/emc/nml_intf/emc_nml.hh`
- `/home/meswork/cnc_wams/linuxcnc/src/emc/nml_intf/emc.hh`
对应命令语义:
- `EMC_TASK_PLAN_RUN`
- `EMC_TASK_PLAN_PAUSE`
- `EMC_TASK_PLAN_RESUME`
- `EMC_TASK_PLAN_STEP`
- `EMC_TASK_ABORT`
- `EMC_JOINT_HOME`
- `EMC_TRAJ_PAUSE`
- `EMC_TRAJ_RESUME`
- `EMC_TRAJ_STEP`
- `EMC_TRAJ_ABORT`
## 修改文件
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/src/ui/gmoccapy-shell.js`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/app/src/state/store.js`
- `/home/meswork/cnc_wams/wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `/home/meswork/cnc_wams/wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.c`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/node/verify_linuxcnc_task_hal_runtime.mjs`
- `/home/meswork/cnc_wams/web-rtcp-5axis-sim-plan/tests/browser/gmoccapy_shell_smoke.html`
## 当前完成状态
状态:已完成并通过选定严格测试。
补充验收:已新增本地浏览器按钮流程取证,覆盖 Home、Run、Pause、Resume、Step、Stop 点击前后状态截图和 JSON 报告。
取证文件:
- `/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs`
- `/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/button-control-evidence-report.json`
- `/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/button-control-evidence-report.pdf`
- `/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/button-control-evidence/`
云端补充验收:
- 已重新部署当前静态站点到 `https://82.156.24.101:8092/`
- 已使用同一按钮流程脚本采集云端 Home、Run、Pause、Resume、Step、Stop 点击前后状态。
- 云端报告状态:`PASS`
- job_id`btn-20260623091811-c291e49b`
- report_id`report-btn-20260623091811-c291e49b`
- 云端 JSON`/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/cloud-button-control-evidence-report.json`
- 云端 PDF`/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/cloud-button-control-evidence-report.pdf`
- 云端截图:`/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/cloud-button-control-evidence/`
Native 对照补充验收:
- 已生成 native task/HAL 对照报告。
- 报告状态:`PASS_WITH_HOST_NATIVE_RUNTIME_BLOCKER`
- 报告文件:
- `/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/native-task-hal-comparison-report.json`
- `/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/native-task-hal-comparison-report.md`
- 结论LinuxCNC source/phase0/native readiness audit 对照通过host-native TRT runtime 状态转换日志因当前主机 native runtime 依赖阻塞无法生成。
注意本轮仍不声明真实硬件驱动、host realtime kernel、外部 User-M process 或 tool DB native runtime 已具备;这些边界在 native 对照报告中明确记录。

View File

@@ -0,0 +1,279 @@
# 02-程序开发步骤
## 阶段 1确认语义来源
1. 阅读 workspace 规则和 LinuxCNC WASM port 规则。
2. 确认本轮不能新增独立 CNC 语义,必须以 LinuxCNC 源码为语义依据。
3. 查阅 LinuxCNC task 源码:
- `linuxcnc/src/emc/task/emctaskmain.cc`
- `linuxcnc/src/emc/nml_intf/emc_nml.hh`
- `linuxcnc/src/emc/nml_intf/emc.hh`
4. 确认按钮对应的 LinuxCNC command
- Run -> `EMC_TASK_PLAN_RUN`
- Stop -> `EMC_TASK_ABORT`
- Pause -> `EMC_TASK_PLAN_PAUSE`
- Resume -> `EMC_TASK_PLAN_RESUME`
- Step -> `EMC_TASK_PLAN_STEP`
- Home -> `EMC_JOINT_HOME`
## 阶段 2前端按钮状态调整
文件:
- `web-rtcp-5axis-sim-plan/app/src/ui/gmoccapy-shell.js`
步骤:
1. 找到 bottom controls 渲染逻辑。
2. 增加 promptable action 列表:
- `RUN`
- `STOP`
- `PAUSE`
- `RESUME`
- `STEP`
- `HOME`
3. 这些按钮在 blocked 时不再设置 HTML `disabled`
4. blocked 状态通过以下属性体现:
- `data-command-ready="false"`
- `aria-disabled="true"`
- `title="... blocked reason ..."`
5. 点击后仍 dispatch 原 action由 store gate 返回真实阻塞原因。
## 阶段 3Web store 命令行为调整
文件:
- `web-rtcp-5axis-sim-plan/app/src/state/store.js`
步骤:
1. Resume
- 发送 `EMC_TASK_PLAN_RESUME`
- 根据返回 status 调用 `shouldContinueTaskHalStatusLoop()`
- 只有仍处于 reading/mdi 等应继续状态时才重启 status loop。
2. Step
- 从空 command sequence 改为发送 `EMC_TASK_PLAN_STEP`
- 保留单步后 paused 状态。
3. Home
- 在 task/HAL runtime 存在时,先在 Web 状态中标记:
- `mode="manual"`
- `allHomed=true`
- `interpState="idle"`
- `taskPaused=false`
- 再异步发送 `EMC_JOINT_HOME`
- 修复快速 `HOME -> SET_MODE` 导致 Home 状态丢失的问题。
4. Session reset
- `initializeTaskHalSession()` 开始时停止旧 `taskHalStatusLoop`
- 避免旧运行循环覆盖新 session 或 MDI/Step 状态。
5. Status patch
- `applyTaskHalStatusPatch()` 保留 `allHomed`
- 同时保留 `noForceHoming`,避免 gate 状态回退。
## 阶段 4WASM task/HAL runtime 补齐
文件:
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
步骤:
1.`TaskRuntime` 中增加:
- `task_paused`
- `single_stepping`
2.`status_json()` 输出:
- `task.taskPaused`
- `task.singleStepping`
3. 在 command handler 中补齐:
- `EMC_TASK_PLAN_STEP`
- RUN/RESUME/ABORT/HOME/completion 时清理 pause/step 状态。
4. Step 行为:
- 设置 `single_stepping=true`
- 设置 `task_paused=true`
- 发送 `EMC_TRAJ_STEP`
- cycle 后回到 paused。
## 阶段 5WASM motion runtime 补齐
文件:
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.c`
步骤:
1. 增加 `LCMOT_CMD_STEP`
2. 解析:
- `EMC_TRAJ_STEP`
- `EMCMOT_STEP`
3. paused 状态下允许 STEP 命令通过 queue gate。
4. apply step 时短暂解除 paused使单步命令可以推进。
## 阶段 6测试覆盖
修改测试:
- `web-rtcp-5axis-sim-plan/tests/node/verify_linuxcnc_task_hal_runtime.mjs`
- `web-rtcp-5axis-sim-plan/tests/browser/gmoccapy_shell_smoke.html`
新增/强化验证:
1. blocked Run 按钮不能被 HTML disabled应可点击并提示原因。
2. Pause 后 `runState=paused`
3. Resume 后恢复 running/reading 状态。
4. Step 后:
- `machine.interpState="paused"`
- `machine.taskPaused=true`
- `taskHalStatus.task.singleStepping=true`
5. Stop 后:
- `runState="stopped"`
- `machine.interpState="idle"`
- `motion.aborted=true`
## 阶段 7构建与验证
执行:
```bash
bash wasm-port/tools/build_task_hal_wasm.sh
node wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs
node web-rtcp-5axis-sim-plan/tests/node/verify_linuxcnc_task_hal_runtime.mjs
node web-rtcp-5axis-sim-plan/tests/node/verify_run_preconditions.mjs
node web-rtcp-5axis-sim-plan/tests/node/verify_rtcp_store.mjs
bash web-rtcp-5axis-sim-plan/tests/browser/verify_gmoccapy_shell_browser.sh
```
结果:全部通过。
## 阶段 8浏览器按钮截图取证
新增文件:
- `qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs`
步骤:
1. 启动本地静态 HTTP server打开 `web-rtcp-5axis-sim-plan/app/index.html`
2. 等待 kinematics、interpreter、task/HAL runtime ready。
3. 加载短 G-code 程序 `button-control-evidence.ngc`
4. 按顺序采集:
- 初始界面
- 程序加载后
- Home 前后
- Run 前后
- Pause 前后
- Resume 前后
- Step 前后
- Stop 前后
5. 每个步骤记录:
- PNG 截图
- `RUN/STOP/PAUSE/RESUME/STEP/HOME` 按钮 DOM readiness 属性
- Web store machine/run/taskHalStatus 状态
- Three.js canvas dataset
- PNG 非黑像素统计
6. 输出 JSON 报告:
```text
/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/button-control-evidence-report.json
```
验证命令:
```bash
node --check qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs
node qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs
```
结果:
```text
button_control_evidence_status=PASS
```
## 阶段 9云端部署与按钮验收
步骤:
1. 重建当前静态站点:
```bash
bash wasm-port/tools/build_task_hal_wasm.sh
npm --prefix web-rtcp-5axis-sim-plan/app run build
```
2. 打包 `web-rtcp-5axis-sim-plan/app/dist`
```bash
tar -C web-rtcp-5axis-sim-plan/app/dist -czf /tmp/web-rtcp-5axis-sim-8092-working1.tar.gz .
```
3. 通过 SSH/paramiko 发布到云端 nginx root
```text
host=82.156.24.101
user=ubuntu
root=/var/www/web-rtcp-5axis-sim
```
4. 云端执行:
```bash
sudo nginx -t
sudo systemctl reload nginx
curl -k -I https://127.0.0.1:8092/
```
5. 对公网 URL 运行按钮流程取证:
```bash
TARGET_URL='https://82.156.24.101:8092/' \
EVIDENCE_SCOPE='cloud-button-control-evidence' \
node qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs
```
结果:
```text
button_control_evidence_status=PASS
button_control_evidence_job_id=btn-20260623091811-c291e49b
button_control_evidence_report_id=report-btn-20260623091811-c291e49b
button_control_evidence_json=/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/cloud-button-control-evidence-report.json
button_control_evidence_pdf=/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/cloud-button-control-evidence-report.pdf
button_control_evidence_screenshots=/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/cloud-button-control-evidence
```
## 阶段 10LinuxCNC native 对照报告
新增文件:
- `qa/web-rtcp-5axis-site-test/capture-native-task-hal-comparison.mjs`
步骤:
1. 运行 phase0 native source/probe gate。
2. 运行 Web native task/HAL readiness audit。
3. 尝试运行 opt-in TRT native runtime probe。
4. 尝试运行 upstream `rs274` fixture baseline。
5. 记录 `halcmd``rs274``linuxcncsvr` 动态库依赖。
6. 输出 native 对照 JSON/Markdown 报告。
命令:
```bash
node --check qa/web-rtcp-5axis-site-test/capture-native-task-hal-comparison.mjs
node qa/web-rtcp-5axis-site-test/capture-native-task-hal-comparison.mjs
```
结果:
```text
native_task_hal_comparison_status=PASS_WITH_HOST_NATIVE_RUNTIME_BLOCKER
native_task_hal_comparison_json=/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/native-task-hal-comparison-report.json
native_task_hal_comparison_markdown=/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/native-task-hal-comparison-report.md
native_task_hal_transition_log_available=0
native_task_hal_host_blocker_count=15
```
说明:当前主机不能启动 LinuxCNC native TRT task/HAL runtime原因包括 RIP 脚本硬编码旧绝对路径 `/home/cnc/桌面/cnc_wams/linuxcnc`,以及二进制依赖当前主机缺失的 `GLIBC_2.38``GLIBCXX_3.4.31``libpython3.13.so.1.0` 等 runtime 条件。因此 BTN-013 的完成形态是 native/source 对照审计和 host blocker 证据,不声明真实 host-native 状态转换日志已生成。

View File

@@ -0,0 +1,85 @@
# 03-推进台账
## 本轮目标
完成 Web RTCP 五轴仿真页面中 Run、Stop、Pause、Resume、Step、Home 按钮的互相功能,使按钮真实反映 LinuxCNC task/HAL 状态。Run 不满足条件时必须给出明确提示。
## 推进记录
| 轮次 | 做了什么 | 改了哪些文件 | 验证了什么 | 下一步 |
|---|---|---|---|---|
| 1 | 阅读 workspace 和 LinuxCNC WASM port 规则,确认必须以 LinuxCNC 源码作为语义依据 | 无 | 确认 `AGENTS.md``wasm-port/SKILL.md` 规则 | 定位按钮和状态代码 |
| 2 | 查找按钮渲染、状态 store、task/HAL runtime、motion runtime | 无 | 定位 `gmoccapy-shell.js``store.js`、task/HAL WASM shim | 对照 LinuxCNC 源码 |
| 3 | 对照 LinuxCNC 源码确认命令语义 | 无 | 确认 `RUN/PAUSE/RESUME/STEP/ABORT/HOME` 对应 LinuxCNC command | 修改 UI gate |
| 4 | 调整按钮 blocked 行为Run/Stop/Pause/Resume/Step/Home blocked 时仍可点击 | `web-rtcp-5axis-sim-plan/app/src/ui/gmoccapy-shell.js` | blocked Run 可以点击并产生 operatorMessage | 修改 store 命令 |
| 5 | 修改 store 中 Resume、Step、Home、session reset 和 status patch 行为 | `web-rtcp-5axis-sim-plan/app/src/state/store.js` | Step 发送 `EMC_TASK_PLAN_STEP`Home 状态不丢失 | 修改 WASM runtime |
| 6 | task/HAL runtime 增加 paused/single-stepping 状态和 `EMC_TASK_PLAN_STEP` | `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp` | task status 输出 `taskPaused``singleStepping` | 修改 motion runtime |
| 7 | motion runtime 增加 `EMC_TRAJ_STEP` / `EMCMOT_STEP` | `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.c` | paused 状态下 step 命令可以通过 | 重建 WASM |
| 8 | 重建 task/HAL WASM | 生成/更新 build artifact | `linuxcnc_task_hal_wasm_build=ok` | 跑 Node/WASM 测试 |
| 9 | 跑 WASM 和 Node 测试,发现 MDI `M428` 状态被旧时序影响 | `store.js` | 定位 Home 快速切模式导致 `allHomed` 丢失 | 修复 Home race |
| 10 | 修复 Home racetask/HAL HOME 先同步 Web homed 状态,再发 runtime command | `store.js` | `verify_linuxcnc_task_hal_runtime.mjs` 通过 | 增强测试 |
| 11 | 增加 STEP/STOP task/HAL 状态断言 | `web-rtcp-5axis-sim-plan/tests/node/verify_linuxcnc_task_hal_runtime.mjs` | Step/Stop 状态可验收 | 增加浏览器断言 |
| 12 | 增加浏览器 blocked Run button 可点击断言 | `web-rtcp-5axis-sim-plan/tests/browser/gmoccapy_shell_smoke.html` | blocked Run 不再 disabled点击后提示原因 | 记录日志 |
| 13 | 追加 GPT/Codex 过程日志 | `web-rtcp-5axis-sim-plan/gptlog-process/gpdlog.md` | 满足 workspace logging rule | 生成交付文档 |
| 14 | 新增浏览器按钮流程取证脚本,采集 Home/Run/Pause/Resume/Step/Stop 点击前后截图和状态报告 | `qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs` | `button_control_evidence_status=PASS`,生成 14 张截图和 JSON 报告 | 更新工作文档和日志 |
| 15 | 参数化按钮取证脚本,增加 `TARGET_URL`、云端独立输出、job_id、report_id、PDF 报告 | `qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs` | 本地取证仍 PASS并生成 PDF | 部署云端 |
| 16 | 重建并部署当前静态站点到 `https://82.156.24.101:8092/` | `web-rtcp-5axis-sim-plan/app/dist`;远端 `/var/www/web-rtcp-5axis-sim` | `nginx -t` 成功;远端 `curl -k -I https://127.0.0.1:8092/` 返回 `HTTP/2 200` | 跑云端按钮验收 |
| 17 | 对云端页面运行按钮流程取证 | `qa/web-rtcp-5axis-site-test/output/cloud-button-control-evidence-report.json``cloud-button-control-evidence-report.pdf``screenshots/cloud-button-control-evidence/*.png` | `button_control_evidence_status=PASS`job_id/report_id 已生成 | 做 native 对照 |
| 18 | 生成 LinuxCNC native task/HAL 对照报告,记录 source/phase0 audit 和 host-native runtime blocker | `qa/web-rtcp-5axis-site-test/capture-native-task-hal-comparison.mjs``native-task-hal-comparison-report.json``native-task-hal-comparison-report.md` | `native_task_hal_comparison_status=PASS_WITH_HOST_NATIVE_RUNTIME_BLOCKER` | 更新文档和日志 |
## 最终改动文件
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.c`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `web-rtcp-5axis-sim-plan/app/src/state/store.js`
- `web-rtcp-5axis-sim-plan/app/src/ui/gmoccapy-shell.js`
- `web-rtcp-5axis-sim-plan/tests/browser/gmoccapy_shell_smoke.html`
- `web-rtcp-5axis-sim-plan/tests/node/verify_linuxcnc_task_hal_runtime.mjs`
- `qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs`
- `qa/web-rtcp-5axis-site-test/output/button-control-evidence-report.json`
- `qa/web-rtcp-5axis-site-test/output/button-control-evidence-report.pdf`
- `qa/web-rtcp-5axis-site-test/screenshots/button-control-evidence/*.png`
- `qa/web-rtcp-5axis-site-test/output/cloud-button-control-evidence-report.json`
- `qa/web-rtcp-5axis-site-test/output/cloud-button-control-evidence-report.pdf`
- `qa/web-rtcp-5axis-site-test/screenshots/cloud-button-control-evidence/*.png`
- `qa/web-rtcp-5axis-site-test/capture-native-task-hal-comparison.mjs`
- `qa/web-rtcp-5axis-site-test/output/native-task-hal-comparison-report.json`
- `qa/web-rtcp-5axis-site-test/output/native-task-hal-comparison-report.md`
- `web-rtcp-5axis-sim-plan/gptlog-process/gpdlog.md`
## 最终验证
通过:
- `bash wasm-port/tools/build_task_hal_wasm.sh`
- `node wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs`
- `node web-rtcp-5axis-sim-plan/tests/node/verify_linuxcnc_task_hal_runtime.mjs`
- `node web-rtcp-5axis-sim-plan/tests/node/verify_run_preconditions.mjs`
- `node web-rtcp-5axis-sim-plan/tests/node/verify_rtcp_store.mjs`
- `bash web-rtcp-5axis-sim-plan/tests/browser/verify_gmoccapy_shell_browser.sh`
- `node --check qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs`
- `node qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs`
- `TARGET_URL='https://82.156.24.101:8092/' EVIDENCE_SCOPE='cloud-button-control-evidence' node qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs`
- `bash wasm-port/tests/native/verify_task_hal_phase0.sh`
- `node web-rtcp-5axis-sim-plan/tests/node/verify_native_task_hal_audit.mjs`
- `node --check qa/web-rtcp-5axis-site-test/capture-native-task-hal-comparison.mjs`
- `node qa/web-rtcp-5axis-site-test/capture-native-task-hal-comparison.mjs`
新增浏览器取证结果:
- `button_control_evidence_status=PASS`
- JSON`/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/button-control-evidence-report.json`
- 截图目录:`/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/button-control-evidence/`
- PDF`/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/button-control-evidence-report.pdf`
- 云端 JSON`/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/cloud-button-control-evidence-report.json`
- 云端 PDF`/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/cloud-button-control-evidence-report.pdf`
- 云端截图目录:`/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/cloud-button-control-evidence/`
- 云端 job_id`btn-20260623091811-c291e49b`
- 云端 report_id`report-btn-20260623091811-c291e49b`
- Native 对照 JSON`/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/native-task-hal-comparison-report.json`
- Native 对照 Markdown`/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/native-task-hal-comparison-report.md`
## 遗留事项
1. `work/working1` 中 BTN-001 到 BTN-013 已全部有验收或 blocker 证据。
2. 当前仍不声明真实硬件、host realtime kernel、外部 User-M process 或 tool DB native runtime 已具备native host runtime 的阻塞原因已记录在 native 对照报告中。

View File

@@ -0,0 +1,50 @@
# 04-任务矩阵
## 状态说明
- Done已实现并有测试证据。
- Partial部分实现需要继续扩展。
- Pending未开始。
- Done-with-blocker验收报告已完成且明确记录当前主机/外部条件阻塞,不再作为本轮未完成项。
## 任务矩阵
| 编号 | 任务 | 状态 | 验收标准 | 验收证据 |
|---|---|---|---|---|
| BTN-001 | Run blocked 时仍可点击 | Done | Run 按钮不被 HTML disabled`data-command-ready=false`;点击后出现 blocked 原因 | `gmoccapy_shell_smoke.html``verify_gmoccapy_shell_browser.sh` |
| BTN-002 | Run 执行条件检查 | Done | 未上电、未 AUTO、未 Home、runtime 未就绪、未选 G-code 等条件会阻止执行并提示 | `verify_run_preconditions.mjs``verify_rtcp_store.mjs` |
| BTN-003 | Run 正常执行 | Done | 条件满足后进入 task/HAL run产生 runtime feedback状态来自 `linuxcnc-task-motion-hal-wasm` | `verify_linuxcnc_task_hal_runtime.mjs`browser smoke |
| BTN-004 | Stop 功能 | Done | 点击 Stop 后发送 `EMC_TASK_ABORT`runState 为 stoppedmotion aborted 为 true | `verify_linuxcnc_task_hal_runtime.mjs` |
| BTN-005 | Pause 功能 | Done | 点击 Pause 后 task/HAL interpState 为 pausedmotion paused 为 true | `verify_linuxcnc_task_hal_runtime.mjs`browser smoke |
| BTN-006 | Resume 功能 | Done | 点击 Resume 后发送 `EMC_TASK_PLAN_RESUME`;仅在状态允许时恢复 status loop | `verify_linuxcnc_task_hal_runtime.mjs`browser smoke |
| BTN-007 | Step 功能 | Done | 点击 Step 后发送 `EMC_TASK_PLAN_STEP`singleStepping 为 true状态保持 paused | `verify_linuxcnc_task_hal_runtime.mjs` |
| BTN-008 | Home 功能 | Done | 点击 Home 后发送 `EMC_JOINT_HOME`Web/task gate 保留 allHomed快速切模式不丢状态 | `verify_linuxcnc_task_hal_runtime.mjs``verify_run_preconditions.mjs` |
| BTN-009 | 按钮 UI 状态标识 | Done | 按钮根据 gate 输出 `data-command-ready``aria-disabled`、title | `gmoccapy-shell.js`browser smoke |
| BTN-010 | LinuxCNC 源码语义映射 | Done | 文档和实现引用 LinuxCNC task command 语义,不新增独立 CNC 行为 | `linuxcnc-task-policy.js` sourceReferences本工作文档 |
| RUNTIME-001 | task/HAL paused 状态输出 | Done | status JSON 输出 `taskPaused` | `linuxcnc_task_hal_wasm.cpp`WASM/Node 测试 |
| RUNTIME-002 | task/HAL single stepping 状态输出 | Done | status JSON 输出 `singleStepping` | `verify_linuxcnc_task_hal_runtime.mjs` |
| RUNTIME-003 | motion runtime 支持 step | Done | `EMC_TRAJ_STEP` / `EMCMOT_STEP` 可进入 queue 并在 paused 时通过 | `linuxcnc_motion_runtime.c`WASM/Node 测试 |
| TEST-001 | WASM runtime 测试 | Done | `verify_task_hal_wasm.mjs` 通过 | 命令输出 |
| TEST-002 | Node task/HAL 测试 | Done | `verify_linuxcnc_task_hal_runtime.mjs` 通过 | 命令输出 |
| TEST-003 | Run precondition 测试 | Done | `verify_run_preconditions.mjs` 通过 | 命令输出 |
| TEST-004 | Browser smoke 测试 | Done | `verify_gmoccapy_shell_browser.sh` 通过 | 命令输出 |
| TEST-005 | Browser 按钮流程截图取证 | Done | Home/Run/Pause/Resume/Step/Stop 点击前后状态截图和 JSON 报告生成,检查项全部 PASS | `capture-button-control-evidence.mjs``button-control-evidence-report.json``screenshots/button-control-evidence/` |
| TEST-006 | 云端按钮流程截图取证 | Done | `https://82.156.24.101:8092/` 页面 Home/Run/Pause/Resume/Step/Stop 流程 PASS生成 job_id/report_id/PDF/截图 | `cloud-button-control-evidence-report.json``cloud-button-control-evidence-report.pdf``screenshots/cloud-button-control-evidence/` |
| TEST-007 | LinuxCNC native task/HAL 对照报告 | Done-with-blocker | source/phase0/native readiness audit 通过opt-in host-native runtime probe 的阻塞原因被记录 | `native-task-hal-comparison-report.json``native-task-hal-comparison-report.md` |
| DOC-001 | 过程日志 | Done | 追加到 `gptlog-process/gpdlog.md` | `gpdlog.md` |
| DOC-002 | 工作交付文档 | Done | 在 `work/working1` 创建 6 份文档 | 本目录 |
## 防重复规则
1. 后续如果继续改这些按钮,先检查 BTN-001 到 BTN-010 的状态,避免重复实现已有 gate。
2. 不要重新写一套 JavaScript CNC 状态机替代 LinuxCNC task/HAL command。
3. 新增按钮时必须先建立 LinuxCNC command/source mapping再接入 store 和 tests。
4. 修改 runtime 行为时必须同时更新 WASM/Node/browser 至少一层测试。
## 后续可扩展任务
| 编号 | 任务 | 状态 | 验收标准 |
|---|---|---|---|
| BTN-011 | 云端页面验收截图 | Done | `https://82.156.24.101:8092/` 部署后截图和报告证明按钮行为 |
| BTN-012 | Stop/Pause/Resume/Step/Home 浏览器截图证据 | Done | 浏览器报告包含每个按钮点击前后状态截图 |
| BTN-013 | 更完整 LinuxCNC native 对照 | Done-with-blocker | native/source 对照和 opt-in host-native runtime blocker 报告完成;当前主机不能生成 native task 状态转换日志 |

View File

@@ -0,0 +1,280 @@
# 05-验收证据
## 验收范围
本轮验收覆盖:
- Run 条件不具备时可点击并提示原因。
- Run 条件满足后进入 task/HAL 执行。
- Stop、Pause、Resume、Step、Home 按钮驱动 task/HAL runtime。
- 按钮状态来自 LinuxCNC task policy 和 task/HAL status而不是固定 UI 状态。
## 命令证据
### 1. 构建 task/HAL WASM
命令:
```bash
bash wasm-port/tools/build_task_hal_wasm.sh
```
结果:
```text
linuxcnc_task_hal_wasm_build=ok
```
### 2. WASM task/HAL runtime 测试
命令:
```bash
node wasm-port/tests/wasm/node/verify_task_hal_wasm.mjs
```
结果:
```text
linuxcnc_task_runtime_smoke=ok
task_status_from_linuxcnc_runtime=ok
task_commands_drive_motion_runtime=ok
mdi_jog_task_motion_hal_sync=ok
```
### 3. Web store + task/HAL runtime 测试
命令:
```bash
node web-rtcp-5axis-sim-plan/tests/node/verify_linuxcnc_task_hal_runtime.mjs
```
结果:
```text
linuxcnc_task_hal_runtime_smoke=ok
task_hal_machine_file_smoke=ok
switchkins_remap_hal_sync_smoke=ok
browser_task_hal_worker_smoke=ok
```
覆盖点:
- Run task/HAL feedback。
- MDI `M428``switchkinsType=1`
- Home 后 Jog 保持坐标连续。
- Pause 后 `interpState=paused`
- Resume 后 `interpState=reading`
- Step 后 `singleStepping=true`
- Stop 后 `motion.aborted=true`
### 4. Run preconditions 测试
命令:
```bash
node web-rtcp-5axis-sim-plan/tests/node/verify_run_preconditions.mjs
```
结果:
```text
run_preconditions_ini_profile_smoke=ok
run_preconditions_kinematics_smoke=ok
run_preconditions_machine_file_smoke=ok
```
覆盖点:
- LinuxCNC INI 未加载时阻止 Run。
- task/HAL runtime 未就绪时阻止 Run。
- 未开机、未 AUTO、未 Home 时阻止 Run。
- 未选择 machine-file G-code 时阻止 Run。
### 5. Store 回归测试
命令:
```bash
node web-rtcp-5axis-sim-plan/tests/node/verify_rtcp_store.mjs
```
结果:
```text
rtcp_store_smoke=ok
```
### 6. 浏览器 smoke 测试
命令:
```bash
bash web-rtcp-5axis-sim-plan/tests/browser/verify_gmoccapy_shell_browser.sh
```
结果:
```text
gmoccapy_shell_smoke=ok
```
覆盖点:
- 页面渲染完整。
- task/HAL runtime worker 就绪。
- blocked Run 按钮不 disabled。
- blocked Run 按钮有 `data-command-ready=false``aria-disabled=true`
- 点击 blocked Run 后输出 blocked 原因。
- Pause/Resume browser workflow 正常。
### 7. 浏览器按钮流程截图取证
命令:
```bash
node --check qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs
node qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs
```
结果:
```text
button_control_evidence_status=PASS
button_control_evidence_job_id=btn-20260623091525-b35869f1
button_control_evidence_report_id=report-btn-20260623091525-b35869f1
button_control_evidence_json=/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/button-control-evidence-report.json
button_control_evidence_pdf=/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/button-control-evidence-report.pdf
button_control_evidence_screenshots=/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/button-control-evidence
```
覆盖点:
- Home 后 `allHomed=true`,保持 manual/idle 状态。
- Run 后 `runState=running`runtime feedback 来源为 `linuxcnc-task-motion-hal-wasm`
- Pause 后 `runState=paused``taskPaused=true`
- Resume 后恢复 `runState=running``interpState=reading`
- Step 后 `singleStepping=true`,并保持 paused。
- Stop 后 `runState=stopped``motion.aborted=true`
- 14 张截图非空,且每一步记录 `RUN/STOP/PAUSE/RESUME/STEP/HOME` 的 readiness 属性。
### 8. 云端部署与按钮流程验收
部署命令摘要:
```bash
bash wasm-port/tools/build_task_hal_wasm.sh
npm --prefix web-rtcp-5axis-sim-plan/app run build
tar -C web-rtcp-5axis-sim-plan/app/dist -czf /tmp/web-rtcp-5axis-sim-8092-working1.tar.gz .
```
云端发布:
```text
host=82.156.24.101
user=ubuntu
nginx root=/var/www/web-rtcp-5axis-sim
remote tar=/home/ubuntu/tmp/web-rtcp-5axis-sim-8092-working1-20260623051405.tar.gz
remote staging=/home/ubuntu/tmp/web-rtcp-5axis-sim-8092-working1-20260623051405
remote backup=/home/ubuntu/tmp/web-rtcp-backups/web-rtcp-5axis-sim-before-working1-20260623051405
```
云端验证:
```text
sudo nginx -t -> nginx: configuration file /etc/nginx/nginx.conf test is successful
curl -k -I https://127.0.0.1:8092/ -> HTTP/2 200
```
公网按钮流程取证命令:
```bash
TARGET_URL='https://82.156.24.101:8092/' \
EVIDENCE_SCOPE='cloud-button-control-evidence' \
node qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs
```
结果:
```text
button_control_evidence_status=PASS
button_control_evidence_job_id=btn-20260623091811-c291e49b
button_control_evidence_report_id=report-btn-20260623091811-c291e49b
button_control_evidence_json=/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/cloud-button-control-evidence-report.json
button_control_evidence_pdf=/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/cloud-button-control-evidence-report.pdf
button_control_evidence_screenshots=/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/cloud-button-control-evidence
```
### 9. LinuxCNC native task/HAL 对照报告
命令:
```bash
bash wasm-port/tests/native/verify_task_hal_phase0.sh
node web-rtcp-5axis-sim-plan/tests/node/verify_native_task_hal_audit.mjs
node --check qa/web-rtcp-5axis-site-test/capture-native-task-hal-comparison.mjs
node qa/web-rtcp-5axis-site-test/capture-native-task-hal-comparison.mjs
```
结果:
```text
task_hal_phase0_native_probe_gate=ok
native_task_hal_source_artifact_audit=ok
native_task_hal_comparison_status=PASS_WITH_HOST_NATIVE_RUNTIME_BLOCKER
native_task_hal_comparison_json=/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/native-task-hal-comparison-report.json
native_task_hal_comparison_markdown=/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/output/native-task-hal-comparison-report.md
native_task_hal_transition_log_available=0
native_task_hal_host_blocker_count=15
```
阻塞证据摘要:
- `linuxcnc/scripts/linuxcnc``linuxcnc/scripts/rip-environment` 硬编码旧路径 `/home/cnc/桌面/cnc_wams/linuxcnc`
- `linuxcnc/bin/halcmd` 要求当前主机没有的 `GLIBC_2.38`
- `linuxcnc/bin/rs274` 要求当前主机没有的 `GLIBC_2.38``GLIBCXX_3.4.31``libpython3.13.so.1.0`
- 当前主机 glibc 为 `Ubuntu GLIBC 2.35``libstdc++` 只到 `GLIBCXX_3.4.30`
结论BTN-013 已形成可复核 native/source 对照和 host-native blocker 证据;不声明 native task 状态转换日志已生成。
## 页面证据
本轮执行的是本地和云端 browser 验收:
- 页面入口:`web-rtcp-5axis-sim-plan/app/index.html`
- 云端入口:`https://82.156.24.101:8092/`
- 浏览器验证脚本:`web-rtcp-5axis-sim-plan/tests/browser/verify_gmoccapy_shell_browser.sh`
- 按钮流程取证脚本:`qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs`
- 按钮流程 JSON`qa/web-rtcp-5axis-site-test/output/button-control-evidence-report.json`
- 按钮流程 PDF`qa/web-rtcp-5axis-site-test/output/button-control-evidence-report.pdf`
- 按钮流程截图目录:`qa/web-rtcp-5axis-site-test/screenshots/button-control-evidence/`
- 云端按钮流程 JSON`qa/web-rtcp-5axis-site-test/output/cloud-button-control-evidence-report.json`
- 云端按钮流程 PDF`qa/web-rtcp-5axis-site-test/output/cloud-button-control-evidence-report.pdf`
- 云端按钮流程截图目录:`qa/web-rtcp-5axis-site-test/screenshots/cloud-button-control-evidence/`
- Native 对照 JSON`qa/web-rtcp-5axis-site-test/output/native-task-hal-comparison-report.json`
- Native 对照 Markdown`qa/web-rtcp-5axis-site-test/output/native-task-hal-comparison-report.md`
## 文件证据
实现文件:
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.c`
- `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`
- `web-rtcp-5axis-sim-plan/app/src/state/store.js`
- `web-rtcp-5axis-sim-plan/app/src/ui/gmoccapy-shell.js`
测试文件:
- `web-rtcp-5axis-sim-plan/tests/browser/gmoccapy_shell_smoke.html`
- `web-rtcp-5axis-sim-plan/tests/node/verify_linuxcnc_task_hal_runtime.mjs`
- `qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs`
- `qa/web-rtcp-5axis-site-test/capture-native-task-hal-comparison.mjs`
过程日志:
- `web-rtcp-5axis-sim-plan/gptlog-process/gpdlog.md`
## 验收结论
本轮功能已通过 WASM、Node、browser 三层验证。按钮行为已从单纯 UI 操作提升为 LinuxCNC task/HAL 状态驱动的控制流程。

View File

@@ -0,0 +1,187 @@
# 06-决策记录
## DR-001按钮 blocked 时保持可点击
决策Run、Stop、Pause、Resume、Step、Home 在 gate blocked 时不设置 HTML `disabled`
原因:
- 用户要求点击 Run 时,如果执行条件不具备,请提示。
- HTML disabled 按钮无法触发 click用户拿不到具体阻塞原因。
- 保持按钮可点击,同时用 `data-command-ready=false``aria-disabled=true`、title 和 operatorMessage 表达 blocked 状态,更符合操作员界面需求。
影响:
- blocked 按钮仍能 dispatch action。
- store gate 是最终裁决点。
- UI 可以显示真实阻塞原因。
## DR-002按钮语义以 LinuxCNC task command 为准
决策:不新增独立 JavaScript CNC 行为,按钮映射 LinuxCNC command。
映射:
- Run -> `EMC_TASK_PLAN_RUN`
- Stop -> `EMC_TASK_ABORT`
- Pause -> `EMC_TASK_PLAN_PAUSE`
- Resume -> `EMC_TASK_PLAN_RESUME`
- Step -> `EMC_TASK_PLAN_STEP`
- Home -> `EMC_JOINT_HOME`
原因:
- `wasm-port/SKILL.md` 要求 LinuxCNC 源码是语义源。
- LinuxCNC task 状态、解释器状态、pause/resume/step 行为已有明确实现。
- Web 端只应做 runtime edge adapter 和 UI 显示。
参考:
- `/home/meswork/cnc_wams/linuxcnc/src/emc/task/emctaskmain.cc`
- `/home/meswork/cnc_wams/linuxcnc/src/emc/nml_intf/emc_nml.hh`
## DR-003Step 必须发送 `EMC_TASK_PLAN_STEP`
决策Step 不再只执行空 task cycle必须发送 `EMC_TASK_PLAN_STEP`
原因:
- LinuxCNC 中单步由 `EMC_TASK_PLAN_STEP``single_stepping``steppingWait` 等状态控制。
- 空 cycle 不能表达 operator step command也不能作为验收依据。
影响:
- task/HAL runtime 增加 `singleStepping` 状态。
- motion runtime 增加 `EMC_TRAJ_STEP` 支持。
- Node 测试验证 `singleStepping=true`
## DR-004Resume 后是否重启 status loop 由返回状态决定
决策Resume command 完成后,用 `shouldContinueTaskHalStatusLoop(state, status)` 判断是否恢复轮询。
原因:
- 旧逻辑只看旧 state可能在已经完成、停止或状态不应继续时重启 loop。
- LinuxCNC task/HAL status 是更可信的数据来源。
影响:
- 减少旧 status loop 覆盖新命令状态的风险。
- Pause/Resume 更接近 LinuxCNC task 状态。
## DR-005Home 在 Web 状态中立即标记 homed
决策task/HAL HOME dispatch 时,先同步 Web 侧 machine 状态,再异步发送 `EMC_JOINT_HOME`
原因:
- 前端操作可能快速执行 `HOME -> SET_MODE auto/mdi`
- 如果只等异步 task/HAL status 返回,后续 mode command 可能覆盖 Home 状态,导致 Run 或 MDI 被错误阻止。
- 这是 standalone Web runtime 的异步边界适配,不改变 LinuxCNC Home 命令语义。
影响:
- `allHomed=true` 不会因快速模式切换丢失。
- task/HAL runtime 仍会收到 `EMC_JOINT_HOME`
## DR-006初始化 task/HAL session 时停止旧 status loop
决策:`initializeTaskHalSession()` 开始时停止旧 `taskHalStatusLoop`
原因:
- session reset 会重置 task/HAL runtime。
- 旧 status loop 如果继续运行,可能把旧运行状态覆盖到新 session 或 MDI command 上。
影响:
- MDI `M428``switchkinsType=1` 不会被旧 loop 覆盖。
- 新 session 状态边界更清晰。
## DR-007保留 `allHomed` 和 `noForceHoming`
决策:`applyTaskHalStatusPatch()` 在合并 task/HAL status 时保留 Web policy 状态中的 `allHomed``noForceHoming`
原因:
- 当前 standalone task/HAL status JSON 不完整表达所有 LinuxCNC homing policy 细节。
- Web task policy gate 需要这些字段判断 Run/MDI 是否允许。
影响:
- Run gate 不会因为 status patch 丢失 homed/policy 信息而错误阻止。
## DR-008本轮不做真实硬件控制
决策:只完善 Web/WASM standalone simulation task/HAL 状态,不接入真实硬件。
原因:
- 项目边界明确Web simulation不驱动真实硬件。
- `wasm-port/SKILL.md` 明确 realtime scheduling、driver、native HAL runtime internals 是替换边界。
影响:
- 验收以 WASM/Node/browser simulation 为准。
- 后续若要硬件级对照,应另建 native LinuxCNC 验收任务。
## DR-009云端验收另行执行
决策:本轮文档记录本地严格测试证据;云端 `https://82.156.24.101:8092/` 需要部署后单独采集。后续已执行部署和云端取证,见 DR-011。
原因:
- 本轮代码和测试在本地 workspace 完成。
- 未执行云端部署命令,也未产生云端 job_id/report_id/PDF。
影响:
- 当前功能代码已完成。
- 云端验收截图/报告已在后续步骤补齐。
## DR-010按钮流程截图取证独立于 browser smoke
决策:新增 `qa/web-rtcp-5axis-site-test/capture-button-control-evidence.mjs`,不把截图取证逻辑塞进 `gmoccapy_shell_smoke.html`
原因:
- browser smoke 用于快速回归,职责是发现核心渲染和行为回退。
- 按钮流程取证会启动 Puppeteer、采集 PNG、分析像素并写 JSON执行成本和输出体积更大。
- 独立脚本可以稳定保留 Home/Run/Pause/Resume/Step/Stop 的验收证据,同时不拖慢常规 smoke。
影响:
- BTN-012 的验收入口是独立 QA 命令。
- 截图和 JSON 报告保存在 `qa/web-rtcp-5axis-site-test/` 下,可用于交付或人工复核。
## DR-011云端 BTN-011 以同一按钮流程脚本验收
决策:使用参数化后的 `capture-button-control-evidence.mjs``https://82.156.24.101:8092/` 运行同一套 Home/Run/Pause/Resume/Step/Stop 验收。
原因:
- 同一脚本能保证本地和云端验收标准一致。
- 云端验收必须包含 job_id、report_id、PDF、截图和 JSON。
- 云端 machine-file seed 比本地慢,脚本改为轮询 runtime readiness 和 staging 状态,避免 Puppeteer 长 Promise 被回收。
影响:
- BTN-011 已完成。
- 云端报告为 `PASS`job_id 为 `btn-20260623091811-c291e49b`
## DR-012BTN-013 以 native/source 对照和 host blocker 报告完成
决策:不把当前主机无法运行的 host-native TRT task/HAL runtime 伪装成已通过BTN-013 的完成产物是 `native-task-hal-comparison-report.json/md`
原因:
- 默认 phase0 native source/probe gate 和 Web native readiness audit 均通过。
- opt-in native runtime probe 尝试后失败,`linuxcnc.stderr.log` 显示 LinuxCNC RIP 脚本引用旧绝对路径 `/home/cnc/桌面/cnc_wams/linuxcnc/scripts/rip-environment`
- `ldd` 显示当前主机还缺少 `GLIBC_2.38``GLIBCXX_3.4.31``libpython3.13.so.1.0` 等 native runtime 依赖。
- 在这些 host 条件未满足前,无法生成真实 native LinuxCNC task 状态转换日志。
影响:
- BTN-013 标记为 `Done-with-blocker`
- 本轮仍只声明 Web/WASM simulation boundary 的 task/HAL 行为完成。
- 真实 host realtime/hardware/external process/tool DB native runtime 仍不提升为完成状态。