feat: complete working8 pause semantics

This commit is contained in:
wangdequan
2026-07-07 10:27:02 -04:00
parent 83402c506e
commit 4ba45b2ec5
987 changed files with 340641 additions and 65 deletions

View File

@@ -3109,3 +3109,97 @@ Pause 修复已提交并推送到云仓库 `master`,提交号为 `58854f9`。
### 结论
已完成 `/home/mes123456/cnc_wams/work/working8` 文档体系建设,新增 README 索引和 01 至 06 六个要求文档。文档明确了暂停按钮必须补齐 LinuxCNC task/interpreter 与 motion/trajectory 双层语义,拆分了 `W8-001``W8-014` 任务矩阵,并给出后续代码修改目标文件、验收标准和验证命令。本轮未修改业务代码,未运行测试。
## 2026-07-07 09:41 EDT
### 提问
用户要求提交到云仓库,并提供云仓库地址 `http://154.8.160.151:3000`、用户名 `wangdequan`、密码 `wangdequan123`
### 执行过程
1. 查看 `git status --short` 和当前分支,确认当前分支为 `master`,工作区存在本轮 `work/working8` 文档、日志追加,以及此前已有的暂停按钮前端、文档、证据、截图等大量未提交改动。
2. 查看 `git remote -v`,确认 `origin` 已配置为 `http://wangdequan:wangdequan123@154.8.160.151:3000/wangdequan/cnc_wams.git`
3. 查看最近提交,确认当前本地历史最新远端提交为 `6cecd28 docs: record final artifact push`
4. 执行 `git fetch origin master`,成功连接云仓库并获取 `origin/master`
5. 执行 `git rev-list --left-right --count origin/master...HEAD`,输出 `0 0`,确认本地 `master` 与远端 `origin/master` 推送前没有分叉。
6. 统计未跟踪文件数量,确认未跟踪文件约 `3282` 个,主要是暂停验证 trace 和 50ms 截图证据目录;考虑用户要求提交云仓库,决定整体纳入提交,避免文档引用的证据缺失。
7. 执行 `git add -A`,暂存全部当前工作区改动。
8. 执行 `git commit -m "docs: record pause wasm implementation plan"`,成功创建提交 `83402c5`,提交包含 `3299` 个文件变更,包括 `work/working8` 文档体系、暂停按钮分析文档、暂停验证工具、暂停测试报告、trace、截图证据、日志和此前已有前端相关改动。
9. 执行 `git push origin master`,推送过程中等待远端处理,最终成功输出 `6cecd28..83402c5 master -> master`
10. 执行 `git status -sb && git rev-parse HEAD && git rev-parse origin/master`,确认本地 `HEAD``origin/master` 均为 `83402c506e26cfcae2ba567a8188ae858858b918`,本地与远端一致。
### 结论
已成功提交并推送到云仓库 `origin/master`。提交哈希为 `83402c506e26cfcae2ba567a8188ae858858b918`,提交信息为 `docs: record pause wasm implementation plan`。本次日志是在推送完成后按规则追加,因此日志文件本身会产生新的未推送工作区改动。
## 2026-07-07 10:16 EDT
### 提问
用户要求完成 `/home/mes123456/cnc_wams/work/working8` 的全部任务。
### 执行过程
1. 读取 `work/working8/README.md``01-项目功能内容.md``02-项目程序开发详细步骤.md``03-推进台账.md``04-任务矩阵.md``05-验收证据.md``06-决策记录.md`,确认本工作包目标是补齐 `wasm-port` 的 LinuxCNC task/motion/TP 暂停语义,并让 `web-rtcp-5axis-xyzbc-trt-sim-plan` 的 AXIS 风格暂停按钮具备真实底层暂停/恢复/单步行为。
2. 查看 `git status --short`,确认开始前已有 `gptlog-process/gpdlog.md``web-rtcp-5axis-sim-plan/gptlog-process/gpdlog.md` 未提交修改;本轮未回退这些既有修改。
3. 读取 `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_task_hal_wasm.cpp`,确认原实现中 `EMC_TASK_PLAN_PAUSE` 会设置 `interp_state=PAUSED``task_paused=true`,但缺少 `interpResumeState` 保存和输出,`RESUME` 固定近似恢复到 `READING`
4. 读取 `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_motion_runtime.c`,确认原 motion pause 仍作为普通队列命令处理,`STEP` 近似普通 resume缺少 motion id/idForStep/stepping 跟踪和“只推进一个 motion 后自动回暂停”语义。
5. 读取 `wasm-port/runtime/core/linuxcnc_wrap/linuxcnc_tp_wasm.c``wasm-port/tests/wasm/node/verify_tp_wasm.mjs`,确认已有 TP line/arc/queue probe但没有 `tpPause()/tpResume()` 专门验证。
6. 读取 Web 侧 `app/src/runtime/linuxcnc-task-hal-runtime.js``app/src/state/linuxcnc-task-policy.js``app/src/state/store.js``app/src/ui/axis-shell.js``tests/node/verify_run_feedback_loop.mjs`,确认前端 resume gate 主要依赖 `interpState === paused`,尚未完整接入 motion paused。
7. 修改 `linuxcnc_task_hal_wasm.cpp`:在 `TaskRuntime` 增加 `interp_resume_state`status JSON 输出 `task.interpResumeState`session init、open program、run、pause、step、resume、abort、MDI、jog、home、program complete 等路径同步维护该字段pause 时保存暂停前状态resume 时按保存状态恢复step 保持外部 `PAUSED`,仅在 `lctask_run_cycles()` 内部允许推进一条。
8. 修改 `linuxcnc_motion_runtime.c`:增加 `stepping``id_for_step``motion_id`;把 `EMCMOT/EMC_TRAJ` 的 pause/resume/step/abort 改成即时命令pause 设置 `paused=1`、速度归零、不清空队列paused 期间不消费普通 movestep 记录当前 motion id允许消费一个普通 move 后自动 `paused=1``stepping=0`status JSON 输出 `motion.stepping``motion.idForStep``motion.motionId``motion.commandQueueDepth` 和根级 `commandQueueDepth`
9. 修改 `linuxcnc_tp_wasm.c`:新增 pause/resume probe创建 TP、加入两段 line、运行后调用 vendored LinuxCNC `tpPause()`,等待速度归零并保持位置,再调用 `tpResume()` 验证队列继续完成;输出 `tp_pause_rc=0``tp_resume_rc=0``tp_paused_velocity_zero=1``tp_paused_position_frozen=1``tp_resume_done=1` 等字段。
10. 修改 `verify_task_hal_wasm.mjs`:扩展为四行程序运行中 pause/resume/step 验证;断言 pause 后 `interpState=PAUSED``interpResumeState=READING``taskPaused=true``motion.paused=true`、连续 cycles 不推进 task line/motion line/axis/motion idresume 后恢复读取并继续task STEP 后回到 paused直接调用 motion C ABI 验证 queued moves 在 pause 后 queue 保留、step 只消费一个、resume 后继续消费。
11. 修改 `verify_tp_wasm.mjs`:增加对 TP pause/resume probe 输出的断言,并输出 `tp_pause_resume_smoke=ok`
12. 修改 Web runtime normalize`normalizeTaskHalStatus()` 中映射 `ui.interpResumeState``ui.taskPaused``ui.singleStepping``ui.motionPaused``ui.motionStepping``ui.motionId``ui.idForStep``ui.motionQueueDepth`
13. 修改 `linuxcnc-task-policy.js`:新增 `motionPaused``taskPaused``feedbackPaused``paused` 综合状态;`canResume``RESUME` gate 接受 motion paused/task paused/interp paused/runState paused菜单 Pause 仍保持 AUTO 且 interpreter running 的严格语义。
14. 修改 `store.js`:初始 `machine` 增加 `motionPaused``PAUSE``RESUME``STEP`、task-hal status apply、normalizeMachine、runtime feedback、shouldContinueTaskHalStatusLoop 等路径同步维护和使用 motion paused`PAUSE_RESUME` 优先用 `machine.motionPaused` 判断是否触发 resume`programRuntimeFeedback` 增加 `paused` 字段。
15. 修改 `axis-shell.js`:暂停按钮 active/title/data-paused 判断接入 `machine.motionPaused``programRuntimeFeedback.paused`
16. 修改 `verify_run_feedback_loop.mjs`:新增 Web Node 暂停断言,点击 `PAUSE_RESUME` 后检查 `machine.motionPaused=true``taskHalStatus.ui.motionPaused=true``taskHalStatus.motionStatus.motion.paused=true``programRuntimeFeedback.paused=true`,并确认 active line、motion program line、motion axis 不推进;再次点击同一按钮恢复;同时修正 Run Ready 测试,使其只验证程序准备,然后显式执行 power/home/auto/run。
17. 修改 `verify-estop-power-home-run-pause-50ms.mjs`:在 screenshot frame、state summary 和 event summary 中加入 `motionPaused`,使 manifest 可记录两次暂停保持阶段的 `motionPaused=true`
18. 首次执行 `./tools/build_task_hal_wasm.sh` 失败,错误为当前 shell 找不到 `emcc`;查找发现 `/home/mes123456/emsdk/emsdk_env.sh``/home/mes123456/emsdk/upstream/emscripten/emcc`
19. 执行 `source /home/mes123456/emsdk/emsdk_env.sh >/dev/null && ./tools/build_task_hal_wasm.sh`,构建通过,输出 `linuxcnc_task_hal_wasm_build=ok`
20. 执行 `node tests/wasm/node/verify_task_hal_wasm.mjs`,通过,输出 `linuxcnc_task_runtime_smoke=ok``task_status_from_linuxcnc_runtime=ok``task_commands_drive_motion_runtime=ok``mdi_jog_task_motion_hal_sync=ok``pause_freezes_motion_queue=ok``resume_restores_interp_resume_state=ok``step_returns_to_paused=ok`
21. 执行 `source /home/mes123456/emsdk/emsdk_env.sh >/dev/null && ./tools/build_tp_wasm.sh`TP WASM 构建完成。
22. 执行 `node tests/wasm/node/verify_tp_wasm.mjs`,通过,输出 `tp_wasm_node_smoke=ok``tp_pause_resume_smoke=ok`
23. 执行 `npm --prefix app run build`,通过,输出 `gmoccapy_static_build=ok`,并更新 `app/dist` 中静态产物和 WASM artifact。
24. 执行 `node tests/node/verify_run_feedback_loop.mjs`,第一次失败在新增暂停断言中直接比较 UI `axisPose`,发现该字段会受异步 RTCP/kinematics 刷新影响而符号变化;将断言改为比较底层 `taskHalStatus.motionStatus.axis`
25. 再次执行 `node tests/node/verify_run_feedback_loop.mjs`,失败在既有 Run Ready 等待条件;确认 Run Ready 按 AXIS parity 应只准备程序,不应代替 power/home/run修改测试为 Run Ready 后显式执行 `TOGGLE_POWER``HOME``SET_MODE auto``RUN`
26. 再次执行 `node tests/node/verify_run_feedback_loop.mjs`,通过,输出 `run_feedback_status_loop_smoke=ok``run_ready_sequence_smoke=ok``pause_uses_motion_paused_gate=ok``pause_freezes_task_hal_status_loop=ok`
27. 执行 `APP_URL_PATH=/web-rtcp-5axis-xyzbc-trt-sim-plan/app/dist/index.html node tools/trace-pause-position-json.mjs`,通过,输出 `pause_position_status=passed-position-frozen``position_changed=false``changed_fields=`trace 文件为 `/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/pause-position-traces/pause-position-20260707T140646Z/trace.json`
28. 执行 `RUN_STABLE_BEFORE_FIRST_PAUSE_MS=3000 node tools/verify-estop-power-home-run-pause-50ms.mjs`,首次通过并生成截图目录 `estop-power-home-run-pause-50ms-20260707T140708Z`,随后发现 manifest 缺少 `motionPaused` 字段,因此补工具后重跑。
29. 重新执行 `RUN_STABLE_BEFORE_FIRST_PAUSE_MS=3000 node tools/verify-estop-power-home-run-pause-50ms.mjs`,通过,输出 `verification_status=passed`,截图目录为 `/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/screenshots/estop-power-home-run-pause-50ms-20260707T141219Z`manifest 为 `/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/screenshots/estop-power-home-run-pause-50ms-20260707T141219Z/manifest.json`,采集 `459` 帧,采样周期 `50ms`
30. 使用 `jq` 提取新 manifest 暂停保持证据:第一次暂停保持 5 秒为 `sampleIndex=109``activeLine=17``interpState=paused``taskPaused=true``motionPaused=true``currentVelocity=0`;第二次暂停保持 5 秒为 `sampleIndex=341``activeLine=13``interpState=paused``taskPaused=true``motionPaused=true``currentVelocity=0`
31. 更新 `work/working8/04-任务矩阵.md`,将 `W8-001``W8-014` 全部标记为 `已完成`
32. 更新 `work/working8/05-验收证据.md`,追加本轮 WASM task/motion、TP、Web Node、浏览器 trace、50ms 长流程截图验证的命令、关键输出、生成文件路径和结论。
33. 更新 `work/working8/03-推进台账.md`,追加 2026-07-07 轮次 2 的用户目标、本轮实现、修改文件、验证结果、证据路径、遗留问题和下一步。
34. 更新 `work/working8/06-决策记录.md`,新增 `DR-W8-007`,明确 Run Ready 只准备程序,不代替 ESTOP/Power/Home/Run避免污染暂停按钮验收。
35. 执行 `git diff --check`,通过,无空白错误。
36. 执行 `git status --short``git diff --stat`,确认本轮修改覆盖 wasm-port runtime/test、Web runtime/policy/store/UI/test/tool、working8 文档、app/dist 构建产物,以及本轮新增 trace 和截图证据目录;同时保留开始前已存在的其他日志修改。
37. 按根目录 AGENTS.md 要求,将本轮完整中文执行过程追加到 `gptlog-process/gpdlog.md`
### 结论
`work/working8``W8-001``W8-014` 已全部完成。底层 task/motion 暂停恢复和 STEP 可观测语义已补齐TP pause/resume probe 已验证 vendored LinuxCNC APIWeb task policy/store/UI 已接入 motion pausedNode/WASM/Web/browser trace/50ms 长流程截图验收全部通过。主要证据路径为 trace `/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/pause-position-traces/pause-position-20260707T140646Z/trace.json` 和 50ms manifest `/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/screenshots/estop-power-home-run-pause-50ms-20260707T141219Z/manifest.json`
## 2026-07-07 10:25 EDT
### 提问
用户要求提交到云仓库,并提供云仓库地址 `http://154.8.160.151:3000`、用户名 `wangdequan`、密码 `wangdequan123`
### 执行过程
1. 查看 `git status --short` 和当前分支,确认当前分支为 `master`,工作区包含本轮 `working8` 实现、验证证据、构建产物、过程日志,以及一个既有修改文件 `备忘/16备用暂停按钮实现详细过程.txt`
2. 查看 `git remote -v`,确认 `origin` 已配置为 `http://wangdequan:wangdequan123@154.8.160.151:3000/wangdequan/cnc_wams.git`,与用户提供的云仓库地址和账号信息一致。
3. 查看最近提交,确认当前最新提交为 `83402c5 docs: record pause wasm implementation plan`
4. 执行 `git fetch origin master`,成功从云仓库获取 `origin/master`
5. 执行 `git rev-list --left-right --count origin/master...HEAD`,输出 `0 0`,确认本地 `master` 与远端 `origin/master` 没有分叉。
6. 执行 `git diff --stat`,确认待提交内容覆盖 wasm-port task/motion/TP 暂停语义、WASM/TP/Web 测试、Web runtime/policy/store/UI、working8 文档、trace/截图证据、构建产物和日志。
7. 执行 `git diff --check`,通过,无空白错误。
8. 按项目日志规则,先将本次云仓库提交过程中文日志追加到 `gptlog-process/gpdlog.md`,随后将执行 `git add -A``git commit``git push origin master`,确保日志也随本次提交进入云仓库。
### 结论
本次云仓库提交前检查通过:远端可访问,本地与远端无分叉,工作区改动可提交,空白检查通过。下一步将提交全部当前改动并推送到 `origin/master`