{ "generatedAt": "2026-06-22T22:10:40.219Z", "targetUrl": "http://127.0.0.1:45757/web-rtcp-5axis-sim-plan/app/index.html", "caseName": "07-run-preconditions-and-feedback", "summary": "浏览器 RUN 证据:INI/profile/kinematics/task-HAL 同一上下文,taskHalStatusLoop 持续推进,UI 消费 task/HAL/motion feedback", "status": "PASS", "checks": [ { "name": "INI ready", "pass": true, "detail": "iniReady=true,true,true,true,true" }, { "name": "selected LinuxCNC G-code", "pass": true, "detail": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_1.ngc" }, { "name": "task/HAL session opened selected G-code", "pass": true, "detail": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt/demos/xyzac_switchkins_test_1.ngc" }, { "name": "taskHalStatusLoop 新 RUN sequence", "pass": true, "detail": "baselineSequence=1, sequences=2,2,2,2,2" }, { "name": "taskHalStatusLoop 本次 RUN tickCount", "pass": true, "detail": "ticks=4,4,4,4,4" }, { "name": "programRuntimeFeedbackHistory 本次 RUN 采样", "pass": true, "detail": "history=5,5,5,5,5" }, { "name": "feedback sourceMode 来自 task/HAL", "pass": true, "detail": "sourceModes=linuxcnc-task-motion-hal-wasm,linuxcnc-task-motion-hal-wasm,linuxcnc-task-motion-hal-wasm,linuxcnc-task-motion-hal-wasm,linuxcnc-task-motion-hal-wasm" }, { "name": "无 fixture-line-playback feedback", "pass": true, "detail": "sourceModes=linuxcnc-task-motion-hal-wasm,linuxcnc-task-motion-hal-wasm,linuxcnc-task-motion-hal-wasm,linuxcnc-task-motion-hal-wasm,linuxcnc-task-motion-hal-wasm" }, { "name": "semantic boundary", "pass": true, "detail": "linuxcnc_task_motion_hal_wasm_simulation_runtime,linuxcnc_task_motion_hal_wasm_simulation_runtime,linuxcnc_task_motion_hal_wasm_simulation_runtime,linuxcnc_task_motion_hal_wasm_simulation_runtime,linuxcnc_task_motion_hal_wasm_simulation_runtime" }, { "name": "activeLine 等于 UI 高亮行", "pass": true, "detail": "active=29/29,29/29,29/29,29/29,29/29" }, { "name": "DRO 等于 runtime feedback axisPose", "pass": true, "detail": "droMatchesFeedback=true for all samples" }, { "name": "RTCP canvas 与 state 一致", "pass": true, "detail": "off/off,off/off,off/off,off/off,off/off" }, { "name": "runtime cycle 可见", "pass": true, "detail": "33/330,33/330,33/330,33/330,33/330" }, { "name": "canvas 执行轨迹", "pass": true, "detail": "true/1/ok,true/1/ok,true/1/ok,true/1/ok,true/1/ok" } ], "baseline": { "elapsedMs": 0, "screenshotPath": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/run-preconditions-feedback/07-run-preconditions-and-feedback-0000ms-before-run.png", "canvas": { "threeReady": "true", "rtcpState": "off", "executedPathPoints": 1, "currentSegmentHighlight": "ok", "toolExecutionTraceSource": "linuxcnc_tp_samples_or_task_motion_hal_feedback" }, "state": { "profileId": "xyzac-trt", "iniReady": true, "iniPath": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini", "coordinates": "XYZAC", "kinematicsModuleId": "xyzac-trt", "selectedGcodeSourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_1.ngc", "taskHalSessionProgramPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt/demos/xyzac_switchkins_test_1.ngc", "taskHalStatusLoop": { "apiName": "web-rtcp-5axis-task-hal-status-loop", "active": false, "sequence": 1, "profileId": "xyzac-trt", "iniPath": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini", "kinematicsModuleId": "xyzac-trt", "tickCount": 12, "batchSize": 5, "intervalMs": 25, "taskPeriodNs": 10000000, "servoPeriodNs": 1000000, "lastStatusAt": "2026-06-22T22:10:27.362Z", "lastError": null, "stopReason": "running", "semanticBoundary": "js_status_polling_loop_for_linuxcnc_task_hal_motion_status" }, "runState": "idle", "activeLine": 1, "activeRowLine": 1, "activeLineMatchesUi": true, "droAxisPose": { "x": 0, "y": 0, "z": 0, "a": 0, "b": 0, "c": 0 }, "feedbackAxisPose": { "x": 0, "y": 0, "z": 0, "a": 0, "b": 0, "c": 0 }, "droMatchesFeedback": true, "rtcpState": "off", "kinsType": "identity", "feedback": { "sourceMode": "linuxcnc-task-motion-hal-wasm", "semanticBoundary": "linuxcnc_task_motion_hal_wasm_simulation_runtime", "line": 1, "taskCycle": 3, "servoCycle": 30, "velocity": 0, "distanceToGo": 0 }, "feedbackHistoryLength": 18, "feedbackHistorySourceModes": [ "linuxcnc-task-motion-hal-wasm" ], "taskHalStatus": { "taskState": "on", "taskMode": "auto", "interpState": "idle", "taskCycle": null, "servoCycle": 30 } } }, "samples": [ { "elapsedMs": 200, "screenshotPath": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/run-preconditions-feedback/07-run-preconditions-and-feedback-200ms.png", "canvas": { "threeReady": "true", "rtcpState": "off", "executedPathPoints": 1, "currentSegmentHighlight": "ok", "toolExecutionTraceSource": "linuxcnc_tp_samples_or_task_motion_hal_feedback" }, "state": { "profileId": "xyzac-trt", "iniReady": true, "iniPath": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini", "coordinates": "XYZAC", "kinematicsModuleId": "xyzac-trt", "selectedGcodeSourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_1.ngc", "taskHalSessionProgramPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt/demos/xyzac_switchkins_test_1.ngc", "taskHalStatusLoop": { "apiName": "web-rtcp-5axis-task-hal-status-loop", "active": false, "sequence": 2, "profileId": "xyzac-trt", "iniPath": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini", "kinematicsModuleId": "xyzac-trt", "tickCount": 4, "batchSize": 5, "intervalMs": 25, "taskPeriodNs": 10000000, "servoPeriodNs": 1000000, "lastStatusAt": "2026-06-22T22:10:35.152Z", "lastError": null, "stopReason": "complete", "semanticBoundary": "js_status_polling_loop_for_linuxcnc_task_hal_motion_status" }, "runState": "complete", "activeLine": 29, "activeRowLine": 29, "activeLineMatchesUi": true, "droAxisPose": { "x": 0, "y": 0, "z": 0, "a": 0, "b": 0, "c": 0 }, "feedbackAxisPose": { "x": 0, "y": 0, "z": 0, "a": 0, "b": 0, "c": 0 }, "droMatchesFeedback": true, "rtcpState": "off", "kinsType": "identity", "feedback": { "sourceMode": "linuxcnc-task-motion-hal-wasm", "semanticBoundary": "linuxcnc_task_motion_hal_wasm_simulation_runtime", "line": 29, "taskCycle": 33, "servoCycle": 330, "velocity": 3600, "distanceToGo": 0 }, "feedbackHistoryLength": 5, "feedbackHistorySourceModes": [ "linuxcnc-task-motion-hal-wasm" ], "taskHalStatus": { "taskState": "on", "taskMode": "auto", "interpState": "idle", "taskCycle": null, "servoCycle": 330 } } }, { "elapsedMs": 500, "screenshotPath": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/run-preconditions-feedback/07-run-preconditions-and-feedback-500ms.png", "canvas": { "threeReady": "true", "rtcpState": "off", "executedPathPoints": 1, "currentSegmentHighlight": "ok", "toolExecutionTraceSource": "linuxcnc_tp_samples_or_task_motion_hal_feedback" }, "state": { "profileId": "xyzac-trt", "iniReady": true, "iniPath": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini", "coordinates": "XYZAC", "kinematicsModuleId": "xyzac-trt", "selectedGcodeSourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_1.ngc", "taskHalSessionProgramPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt/demos/xyzac_switchkins_test_1.ngc", "taskHalStatusLoop": { "apiName": "web-rtcp-5axis-task-hal-status-loop", "active": false, "sequence": 2, "profileId": "xyzac-trt", "iniPath": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini", "kinematicsModuleId": "xyzac-trt", "tickCount": 4, "batchSize": 5, "intervalMs": 25, "taskPeriodNs": 10000000, "servoPeriodNs": 1000000, "lastStatusAt": "2026-06-22T22:10:35.152Z", "lastError": null, "stopReason": "complete", "semanticBoundary": "js_status_polling_loop_for_linuxcnc_task_hal_motion_status" }, "runState": "complete", "activeLine": 29, "activeRowLine": 29, "activeLineMatchesUi": true, "droAxisPose": { "x": 0, "y": 0, "z": 0, "a": 0, "b": 0, "c": 0 }, "feedbackAxisPose": { "x": 0, "y": 0, "z": 0, "a": 0, "b": 0, "c": 0 }, "droMatchesFeedback": true, "rtcpState": "off", "kinsType": "identity", "feedback": { "sourceMode": "linuxcnc-task-motion-hal-wasm", "semanticBoundary": "linuxcnc_task_motion_hal_wasm_simulation_runtime", "line": 29, "taskCycle": 33, "servoCycle": 330, "velocity": 3600, "distanceToGo": 0 }, "feedbackHistoryLength": 5, "feedbackHistorySourceModes": [ "linuxcnc-task-motion-hal-wasm" ], "taskHalStatus": { "taskState": "on", "taskMode": "auto", "interpState": "idle", "taskCycle": null, "servoCycle": 330 } } }, { "elapsedMs": 1000, "screenshotPath": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/run-preconditions-feedback/07-run-preconditions-and-feedback-1000ms.png", "canvas": { "threeReady": "true", "rtcpState": "off", "executedPathPoints": 1, "currentSegmentHighlight": "ok", "toolExecutionTraceSource": "linuxcnc_tp_samples_or_task_motion_hal_feedback" }, "state": { "profileId": "xyzac-trt", "iniReady": true, "iniPath": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini", "coordinates": "XYZAC", "kinematicsModuleId": "xyzac-trt", "selectedGcodeSourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_1.ngc", "taskHalSessionProgramPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt/demos/xyzac_switchkins_test_1.ngc", "taskHalStatusLoop": { "apiName": "web-rtcp-5axis-task-hal-status-loop", "active": false, "sequence": 2, "profileId": "xyzac-trt", "iniPath": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini", "kinematicsModuleId": "xyzac-trt", "tickCount": 4, "batchSize": 5, "intervalMs": 25, "taskPeriodNs": 10000000, "servoPeriodNs": 1000000, "lastStatusAt": "2026-06-22T22:10:35.152Z", "lastError": null, "stopReason": "complete", "semanticBoundary": "js_status_polling_loop_for_linuxcnc_task_hal_motion_status" }, "runState": "complete", "activeLine": 29, "activeRowLine": 29, "activeLineMatchesUi": true, "droAxisPose": { "x": 0, "y": 0, "z": 0, "a": 0, "b": 0, "c": 0 }, "feedbackAxisPose": { "x": 0, "y": 0, "z": 0, "a": 0, "b": 0, "c": 0 }, "droMatchesFeedback": true, "rtcpState": "off", "kinsType": "identity", "feedback": { "sourceMode": "linuxcnc-task-motion-hal-wasm", "semanticBoundary": "linuxcnc_task_motion_hal_wasm_simulation_runtime", "line": 29, "taskCycle": 33, "servoCycle": 330, "velocity": 3600, "distanceToGo": 0 }, "feedbackHistoryLength": 5, "feedbackHistorySourceModes": [ "linuxcnc-task-motion-hal-wasm" ], "taskHalStatus": { "taskState": "on", "taskMode": "auto", "interpState": "idle", "taskCycle": null, "servoCycle": 330 } } }, { "elapsedMs": 2000, "screenshotPath": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/run-preconditions-feedback/07-run-preconditions-and-feedback-2000ms.png", "canvas": { "threeReady": "true", "rtcpState": "off", "executedPathPoints": 1, "currentSegmentHighlight": "ok", "toolExecutionTraceSource": "linuxcnc_tp_samples_or_task_motion_hal_feedback" }, "state": { "profileId": "xyzac-trt", "iniReady": true, "iniPath": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini", "coordinates": "XYZAC", "kinematicsModuleId": "xyzac-trt", "selectedGcodeSourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_1.ngc", "taskHalSessionProgramPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt/demos/xyzac_switchkins_test_1.ngc", "taskHalStatusLoop": { "apiName": "web-rtcp-5axis-task-hal-status-loop", "active": false, "sequence": 2, "profileId": "xyzac-trt", "iniPath": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini", "kinematicsModuleId": "xyzac-trt", "tickCount": 4, "batchSize": 5, "intervalMs": 25, "taskPeriodNs": 10000000, "servoPeriodNs": 1000000, "lastStatusAt": "2026-06-22T22:10:35.152Z", "lastError": null, "stopReason": "complete", "semanticBoundary": "js_status_polling_loop_for_linuxcnc_task_hal_motion_status" }, "runState": "complete", "activeLine": 29, "activeRowLine": 29, "activeLineMatchesUi": true, "droAxisPose": { "x": 0, "y": 0, "z": 0, "a": 0, "b": 0, "c": 0 }, "feedbackAxisPose": { "x": 0, "y": 0, "z": 0, "a": 0, "b": 0, "c": 0 }, "droMatchesFeedback": true, "rtcpState": "off", "kinsType": "identity", "feedback": { "sourceMode": "linuxcnc-task-motion-hal-wasm", "semanticBoundary": "linuxcnc_task_motion_hal_wasm_simulation_runtime", "line": 29, "taskCycle": 33, "servoCycle": 330, "velocity": 3600, "distanceToGo": 0 }, "feedbackHistoryLength": 5, "feedbackHistorySourceModes": [ "linuxcnc-task-motion-hal-wasm" ], "taskHalStatus": { "taskState": "on", "taskMode": "auto", "interpState": "idle", "taskCycle": null, "servoCycle": 330 } } }, { "elapsedMs": 5000, "screenshotPath": "/home/meswork/cnc_wams/qa/web-rtcp-5axis-site-test/screenshots/run-preconditions-feedback/07-run-preconditions-and-feedback-5000ms.png", "canvas": { "threeReady": "true", "rtcpState": "off", "executedPathPoints": 1, "currentSegmentHighlight": "ok", "toolExecutionTraceSource": "linuxcnc_tp_samples_or_task_motion_hal_feedback" }, "state": { "profileId": "xyzac-trt", "iniReady": true, "iniPath": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini", "coordinates": "XYZAC", "kinematicsModuleId": "xyzac-trt", "selectedGcodeSourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins_test_1.ngc", "taskHalSessionProgramPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt/demos/xyzac_switchkins_test_1.ngc", "taskHalStatusLoop": { "apiName": "web-rtcp-5axis-task-hal-status-loop", "active": false, "sequence": 2, "profileId": "xyzac-trt", "iniPath": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini", "kinematicsModuleId": "xyzac-trt", "tickCount": 4, "batchSize": 5, "intervalMs": 25, "taskPeriodNs": 10000000, "servoPeriodNs": 1000000, "lastStatusAt": "2026-06-22T22:10:35.152Z", "lastError": null, "stopReason": "complete", "semanticBoundary": "js_status_polling_loop_for_linuxcnc_task_hal_motion_status" }, "runState": "complete", "activeLine": 29, "activeRowLine": 29, "activeLineMatchesUi": true, "droAxisPose": { "x": 0, "y": 0, "z": 0, "a": 0, "b": 0, "c": 0 }, "feedbackAxisPose": { "x": 0, "y": 0, "z": 0, "a": 0, "b": 0, "c": 0 }, "droMatchesFeedback": true, "rtcpState": "off", "kinsType": "identity", "feedback": { "sourceMode": "linuxcnc-task-motion-hal-wasm", "semanticBoundary": "linuxcnc_task_motion_hal_wasm_simulation_runtime", "line": 29, "taskCycle": 33, "servoCycle": 330, "velocity": 3600, "distanceToGo": 0 }, "feedbackHistoryLength": 5, "feedbackHistorySourceModes": [ "linuxcnc-task-motion-hal-wasm" ], "taskHalStatus": { "taskState": "on", "taskMode": "auto", "interpState": "idle", "taskCycle": null, "servoCycle": 330 } } } ], "consoleErrors": [ "Failed to load resource: the server responded with a status of 404 (Not Found)", "Failed to load resource: the server responded with a status of 404 (Not Found)" ] }