{ "summary": { "generatedAt": "2026-07-03T13:21:51.610Z", "project": "/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan", "url": "http://127.0.0.1:44397/web-rtcp-5axis-xyzbc-trt-sim-plan/app/dist/index.html", "inventoryCount": 83, "buttonCount": 71, "functionalControlCount": 74, "passed": 74, "failed": 5, "runtimeErrors": [], "resourceErrorCount": 43, "finalRunState": "idle", "finalMode": "auto", "finalKinsType": "identity", "finalBoundaryPhase": "blocked" }, "inventory": [ { "i": 0, "region": "menubar", "tag": "button", "type": "button", "action": "", "menuCommand": "", "text": "File", "sourceRef": "", "expectedEffect": "", "business": false }, { "i": 1, "region": "menubar", "tag": "button", "type": "button", "action": "", "menuCommand": "open", "text": "Open...", "sourceRef": "commands.open_file", "expectedEffect": "file picker opens without changing runtime state", "business": true }, { "i": 2, "region": "menubar", "tag": "button", "type": "button", "action": "", "menuCommand": "reload", "text": "Reload", "sourceRef": "commands.reload_file", "expectedEffect": "program reload resets active playback state", "business": true }, { "i": 3, "region": "menubar", "tag": "button", "type": "button", "action": "", "menuCommand": "stage", "text": "Stage LinuxCNC files", "sourceRef": "web OPFS staging for DISPLAY PROGRAM_PREFIX", "expectedEffect": "LinuxCNC profile files are staged", "business": true }, { "i": 4, "region": "menubar", "tag": "button", "type": "button", "action": "", "menuCommand": "save-session", "text": "Save session", "sourceRef": "web session persistence", "expectedEffect": "session snapshot is requested", "business": true }, { "i": 5, "region": "menubar", "tag": "button", "type": "button", "action": "", "menuCommand": "restore-session", "text": "Restore session", "sourceRef": "web session persistence", "expectedEffect": "session restore is requested", "business": true }, { "i": 6, "region": "menubar", "tag": "button", "type": "button", "action": "", "menuCommand": "", "text": "Machine", "sourceRef": "", "expectedEffect": "", "business": false }, { "i": 7, "region": "menubar", "tag": "button", "type": "button", "action": "", "menuCommand": "estop", "text": "Toggle Emergency Stop", "sourceRef": "commands.estop_clicked", "expectedEffect": "toggle ESTOP/ESTOP_RESET", "business": true }, { "i": 8, "region": "menubar", "tag": "button", "type": "button", "action": "", "menuCommand": "power", "text": "Toggle Machine Power", "sourceRef": "commands.onoff_clicked", "expectedEffect": "toggle machine ON/OFF after estop reset", "business": true }, { "i": 9, "region": "menubar", "tag": "button", "type": "button", "action": "", "menuCommand": "home-all", "text": "Home All", "sourceRef": "commands.home_all_joints", "expectedEffect": "home all joints in manual mode", "business": true }, { "i": 10, "region": "menubar", "tag": "button", "type": "button", "action": "", "menuCommand": "run-ready", "text": "Run Ready", "sourceRef": "AXIS run preconditions", "expectedEffect": "power on, home, auto mode and TCP kins ready", "business": true }, { "i": 11, "region": "menubar", "tag": "button", "type": "button", "action": "", "menuCommand": "run", "text": "Run", "sourceRef": "commands.task_run", "expectedEffect": "AUTO_RUN from current start line", "business": true }, { "i": 12, "region": "menubar", "tag": "button", "type": "button", "action": "", "menuCommand": "pause", "text": "Pause", "sourceRef": "commands.task_pause", "expectedEffect": "AUTO_PAUSE when running", "business": true }, { "i": 13, "region": "menubar", "tag": "button", "type": "button", "action": "", "menuCommand": "step", "text": "Step", "sourceRef": "commands.task_step", "expectedEffect": "AUTO_STEP one cycle/segment", "business": true }, { "i": 14, "region": "menubar", "tag": "button", "type": "button", "action": "", "menuCommand": "stop", "text": "Stop", "sourceRef": "commands.task_stop", "expectedEffect": "abort current task", "business": true }, { "i": 15, "region": "menubar", "tag": "button", "type": "button", "action": "", "menuCommand": "", "text": "View", "sourceRef": "", "expectedEffect": "", "business": false }, { "i": 16, "region": "menubar", "tag": "button", "type": "button", "action": "", "menuCommand": "view-z", "text": "Top Z", "sourceRef": "commands.set_view_z", "expectedEffect": "select top Z camera", "business": true }, { "i": 17, "region": "menubar", "tag": "button", "type": "button", "action": "", "menuCommand": "view-y", "text": "Front Y", "sourceRef": "commands.set_view_y", "expectedEffect": "select front Y camera", "business": true }, { "i": 18, "region": "menubar", "tag": "button", "type": "button", "action": "", "menuCommand": "view-x", "text": "Side X", "sourceRef": "commands.set_view_x", "expectedEffect": "select side X camera", "business": true }, { "i": 19, "region": "menubar", "tag": "button", "type": "button", "action": "", "menuCommand": "view-p", "text": "Perspective", "sourceRef": "commands.set_view_p", "expectedEffect": "select perspective/fit camera", "business": true }, { "i": 20, "region": "menubar", "tag": "button", "type": "button", "action": "", "menuCommand": "clear-preview", "text": "Clear Live Plot", "sourceRef": "commands.clear_live_plot", "expectedEffect": "clear live plot buffer", "business": true }, { "i": 21, "region": "menubar", "tag": "button", "type": "button", "action": "", "menuCommand": "", "text": "Help", "sourceRef": "", "expectedEffect": "", "business": false }, { "i": 22, "region": "menubar", "tag": "button", "type": "button", "action": "", "menuCommand": "audit", "text": "Run parity audit", "sourceRef": "web parity audit", "expectedEffect": "request native/Web parity audit", "business": true }, { "i": 23, "region": "toolbar", "tag": "input", "type": "file", "action": "OPEN_FILE", "menuCommand": "", "text": "", "sourceRef": "", "expectedEffect": "", "business": true }, { "i": 24, "region": "toolbar", "tag": "button", "type": "button", "action": "estop", "menuCommand": "", "text": "Emergency stop", "sourceRef": "commands.estop_clicked", "expectedEffect": "toggle ESTOP/ESTOP_RESET", "business": true }, { "i": 25, "region": "toolbar", "tag": "button", "type": "button", "action": "power", "menuCommand": "", "text": "Machine power", "sourceRef": "commands.onoff_clicked", "expectedEffect": "toggle machine ON/OFF after estop reset", "business": true }, { "i": 26, "region": "toolbar", "tag": "button", "type": "button", "action": "open", "menuCommand": "", "text": "Open program", "sourceRef": "commands.open_file", "expectedEffect": "file picker opens without changing runtime state", "business": true }, { "i": 27, "region": "toolbar", "tag": "button", "type": "button", "action": "reload", "menuCommand": "", "text": "Reload program", "sourceRef": "commands.reload_file", "expectedEffect": "program reload resets active playback state", "business": true }, { "i": 28, "region": "toolbar", "tag": "button", "type": "button", "action": "run", "menuCommand": "", "text": "Run program", "sourceRef": "commands.task_run", "expectedEffect": "AUTO_RUN from current start line", "business": true }, { "i": 29, "region": "toolbar", "tag": "button", "type": "button", "action": "pause", "menuCommand": "", "text": "Pause", "sourceRef": "commands.task_pause", "expectedEffect": "AUTO_PAUSE when running", "business": true }, { "i": 30, "region": "toolbar", "tag": "button", "type": "button", "action": "step", "menuCommand": "", "text": "Step", "sourceRef": "commands.task_step", "expectedEffect": "AUTO_STEP one cycle/segment", "business": true }, { "i": 31, "region": "toolbar", "tag": "button", "type": "button", "action": "stop", "menuCommand": "", "text": "Stop", "sourceRef": "commands.task_stop", "expectedEffect": "abort current task", "business": true }, { "i": 32, "region": "toolbar", "tag": "button", "type": "button", "action": "view-z", "menuCommand": "", "text": "Z", "sourceRef": "commands.set_view_z", "expectedEffect": "select top Z camera", "business": true }, { "i": 33, "region": "toolbar", "tag": "button", "type": "button", "action": "view-y", "menuCommand": "", "text": "Y", "sourceRef": "commands.set_view_y", "expectedEffect": "select front Y camera", "business": true }, { "i": 34, "region": "toolbar", "tag": "button", "type": "button", "action": "view-x", "menuCommand": "", "text": "X", "sourceRef": "commands.set_view_x", "expectedEffect": "select side X camera", "business": true }, { "i": 35, "region": "toolbar", "tag": "button", "type": "button", "action": "view-p", "menuCommand": "", "text": "P", "sourceRef": "commands.set_view_p", "expectedEffect": "select perspective/fit camera", "business": true }, { "i": 36, "region": "toolbar", "tag": "button", "type": "button", "action": "clear-preview", "menuCommand": "", "text": "Clear plot", "sourceRef": "commands.clear_live_plot", "expectedEffect": "clear live plot buffer", "business": true }, { "i": 37, "region": "manual", "tag": "button", "type": "button", "action": "tab-manual", "menuCommand": "", "text": "Manual Control [F3]", "sourceRef": "commands.ensure_manual", "expectedEffect": "manual mode tab selected", "business": true }, { "i": 38, "region": "manual", "tag": "button", "type": "button", "action": "tab-mdi", "menuCommand": "", "text": "MDI [F5]", "sourceRef": "commands.ensure_mdi", "expectedEffect": "MDI mode tab selected", "business": true }, { "i": 39, "region": "manual", "tag": "input", "type": "radio", "action": "select-joint", "menuCommand": "", "text": "", "sourceRef": "axis radiobuttons ja_rbutton", "expectedEffect": "active joint/axis selected", "business": true }, { "i": 40, "region": "manual", "tag": "input", "type": "radio", "action": "select-joint", "menuCommand": "", "text": "", "sourceRef": "axis radiobuttons ja_rbutton", "expectedEffect": "active joint/axis selected", "business": true }, { "i": 41, "region": "manual", "tag": "input", "type": "radio", "action": "select-joint", "menuCommand": "", "text": "", "sourceRef": "axis radiobuttons ja_rbutton", "expectedEffect": "active joint/axis selected", "business": true }, { "i": 42, "region": "manual", "tag": "input", "type": "radio", "action": "select-joint", "menuCommand": "", "text": "", "sourceRef": "axis radiobuttons ja_rbutton", "expectedEffect": "active joint/axis selected", "business": true }, { "i": 43, "region": "manual", "tag": "input", "type": "radio", "action": "select-joint", "menuCommand": "", "text": "", "sourceRef": "axis radiobuttons ja_rbutton", "expectedEffect": "active joint/axis selected", "business": true }, { "i": 44, "region": "manual", "tag": "button", "type": "button", "action": "jog-minus", "menuCommand": "", "text": "-", "sourceRef": "commands.jog_minus", "expectedEffect": "negative jog of active axis/joint", "business": true }, { "i": 45, "region": "manual", "tag": "button", "type": "button", "action": "jog-plus", "menuCommand": "", "text": "+", "sourceRef": "commands.jog_plus", "expectedEffect": "positive jog of active axis/joint", "business": true }, { "i": 46, "region": "manual", "tag": "select", "type": "", "action": "jog-increment", "menuCommand": "", "text": "Continuous 0.0010 0.0100 0.1000 1.0000 10.0000", "sourceRef": "set_hal_jogincrement", "expectedEffect": "jog increment updates HAL-equivalent state", "business": true }, { "i": 47, "region": "manual", "tag": "button", "type": "button", "action": "home-all", "menuCommand": "", "text": "Home All", "sourceRef": "commands.home_all_joints", "expectedEffect": "home all joints in manual mode", "business": true }, { "i": 48, "region": "manual", "tag": "button", "type": "button", "action": "touch-off", "menuCommand": "", "text": "Touch Off", "sourceRef": "commands.touch_off_system", "expectedEffect": "G10 touch off MDI equivalent", "business": true }, { "i": 49, "region": "manual", "tag": "button", "type": "button", "action": "tool-touch-off", "menuCommand": "", "text": "Tool Touch Off", "sourceRef": "commands.touch_off_tool", "expectedEffect": "tool length offset equivalent", "business": true }, { "i": 50, "region": "manual", "tag": "button", "type": "button", "action": "spindle-reverse", "menuCommand": "", "text": "Rev", "sourceRef": "spindle CCW control", "expectedEffect": "spindle reverse", "business": true }, { "i": 51, "region": "manual", "tag": "button", "type": "button", "action": "spindle-stop", "menuCommand": "", "text": "Stop", "sourceRef": "spindle stop control", "expectedEffect": "spindle stop", "business": true }, { "i": 52, "region": "manual", "tag": "button", "type": "button", "action": "spindle-forward", "menuCommand": "", "text": "Fwd", "sourceRef": "spindle CW control", "expectedEffect": "spindle forward", "business": true }, { "i": 53, "region": "manual", "tag": "button", "type": "button", "action": "spindle-override-down", "menuCommand": "", "text": "-", "sourceRef": "commands.set_spindlerate", "expectedEffect": "spindle override down", "business": true }, { "i": 54, "region": "manual", "tag": "button", "type": "button", "action": "spindle-override-up", "menuCommand": "", "text": "+", "sourceRef": "commands.set_spindlerate", "expectedEffect": "spindle override up", "business": true }, { "i": 55, "region": "manual", "tag": "form", "type": "", "action": "mdi-form", "menuCommand": "", "text": "MDI Command: Go", "sourceRef": "commands.send_mdi", "expectedEffect": "submit MDI command", "business": true }, { "i": 56, "region": "manual", "tag": "input", "type": "text", "action": "mdi-input", "menuCommand": "", "text": "", "sourceRef": "", "expectedEffect": "", "business": true }, { "i": 57, "region": "manual", "tag": "button", "type": "submit", "action": "", "menuCommand": "", "text": "Go", "sourceRef": "", "expectedEffect": "", "business": false }, { "i": 58, "region": "manual", "tag": "button", "type": "button", "action": "mdi-history", "menuCommand": "", "text": "G0 X0 Y0 Z0", "sourceRef": "commands.mdi_history_butt_1", "expectedEffect": "run/restore MDI history command", "business": true }, { "i": 59, "region": "manual", "tag": "button", "type": "button", "action": "mdi-history", "menuCommand": "", "text": "G91 X1", "sourceRef": "commands.mdi_history_butt_1", "expectedEffect": "run/restore MDI history command", "business": true }, { "i": 60, "region": "manual", "tag": "button", "type": "button", "action": "mdi-history", "menuCommand": "", "text": "G90", "sourceRef": "commands.mdi_history_butt_1", "expectedEffect": "run/restore MDI history command", "business": true }, { "i": 61, "region": "manual", "tag": "button", "type": "button", "action": "mdi-history", "menuCommand": "", "text": "M429", "sourceRef": "commands.mdi_history_butt_1", "expectedEffect": "run/restore MDI history command", "business": true }, { "i": 62, "region": "manual", "tag": "button", "type": "button", "action": "mdi-history", "menuCommand": "", "text": "M428", "sourceRef": "commands.mdi_history_butt_1", "expectedEffect": "run/restore MDI history command", "business": true }, { "i": 63, "region": "manual", "tag": "button", "type": "button", "action": "mdi-history", "menuCommand": "", "text": "M430", "sourceRef": "commands.mdi_history_butt_1", "expectedEffect": "run/restore MDI history command", "business": true }, { "i": 64, "region": "manual", "tag": "button", "type": "button", "action": "feed-override-down", "menuCommand": "", "text": "-", "sourceRef": "commands.set_feedrate", "expectedEffect": "feed override down", "business": true }, { "i": 65, "region": "manual", "tag": "button", "type": "button", "action": "feed-override-up", "menuCommand": "", "text": "+", "sourceRef": "commands.set_feedrate", "expectedEffect": "feed override up", "business": true }, { "i": 66, "region": "manual", "tag": "button", "type": "button", "action": "rapid-override-down", "menuCommand": "", "text": "-", "sourceRef": "commands.set_rapidrate", "expectedEffect": "rapid override down", "business": true }, { "i": 67, "region": "manual", "tag": "button", "type": "button", "action": "rapid-override-up", "menuCommand": "", "text": "+", "sourceRef": "commands.set_rapidrate", "expectedEffect": "rapid override up", "business": true }, { "i": 68, "region": "manual", "tag": "button", "type": "button", "action": "spindle-override-down", "menuCommand": "", "text": "-", "sourceRef": "commands.set_spindlerate", "expectedEffect": "spindle override down", "business": true }, { "i": 69, "region": "manual", "tag": "button", "type": "button", "action": "spindle-override-up", "menuCommand": "", "text": "+", "sourceRef": "commands.set_spindlerate", "expectedEffect": "spindle override up", "business": true }, { "i": 70, "region": "manual", "tag": "input", "type": "checkbox", "action": "ignore-limits", "menuCommand": "", "text": "", "sourceRef": "commands.toggle_override_limits", "expectedEffect": "limit override checkbox state", "business": true }, { "i": 71, "region": "manual", "tag": "input", "type": "checkbox", "action": "block-delete", "menuCommand": "", "text": "", "sourceRef": "commands.toggle_block_delete", "expectedEffect": "block delete state", "business": true }, { "i": 72, "region": "manual", "tag": "input", "type": "checkbox", "action": "optional-stop", "menuCommand": "", "text": "", "sourceRef": "commands.toggle_optional_stop", "expectedEffect": "optional stop state", "business": true }, { "i": 73, "region": "manual", "tag": "button", "type": "button", "action": "toggle-flood", "menuCommand": "", "text": "Flood", "sourceRef": "commands.flood_toggle", "expectedEffect": "flood coolant toggle", "business": true }, { "i": 74, "region": "manual", "tag": "button", "type": "button", "action": "toggle-mist", "menuCommand": "", "text": "Mist", "sourceRef": "commands.mist_toggle", "expectedEffect": "mist coolant toggle", "business": true }, { "i": 75, "region": "main-tabs", "tag": "button", "type": "button", "action": "", "menuCommand": "", "text": "Preview", "sourceRef": "", "expectedEffect": "", "business": false }, { "i": 76, "region": "main-tabs", "tag": "button", "type": "button", "action": "", "menuCommand": "", "text": "DRO", "sourceRef": "", "expectedEffect": "", "business": false }, { "i": 77, "region": "main-tabs", "tag": "button", "type": "button", "action": "", "menuCommand": "", "text": "xyzbc_switchkins_sub", "sourceRef": "", "expectedEffect": "", "business": false }, { "i": 78, "region": "main-tabs", "tag": "button", "type": "button", "action": "", "menuCommand": "", "text": "centering", "sourceRef": "", "expectedEffect": "", "business": false }, { "i": 79, "region": "pyvcp", "tag": "button", "type": "button", "action": "kins-identity", "menuCommand": "", "text": "IDENTITY", "sourceRef": "pyvcp.type0-button -> halui.mdi-command-00", "expectedEffect": "M429 sets identity kins", "business": true }, { "i": 80, "region": "pyvcp", "tag": "button", "type": "button", "action": "kins-tcp", "menuCommand": "", "text": "TCP:XYZBC", "sourceRef": "pyvcp.type1-button -> halui.mdi-command-01", "expectedEffect": "M428 sets tcp-xyzbc kins", "business": true }, { "i": 81, "region": "pyvcp", "tag": "button", "type": "button", "action": "kins-userk", "menuCommand": "", "text": "userk", "sourceRef": "pyvcp.type2-button -> halui.mdi-command-02", "expectedEffect": "M430 sets userk kins", "business": true }, { "i": 82, "region": "pyvcp", "tag": "button", "type": "button", "action": "clear-preview", "menuCommand": "", "text": "vismach-clear", "sourceRef": "pyvcp.vismach-clear -> vismach.plotclear", "expectedEffect": "clear Vismach plot", "business": true } ], "results": [ { "task": "启动与清单", "selector": "document", "result": "通过", "expected": "默认 xyzbc-trt,runtime ready,生成 DOM 控件清单", "actual": "profile=xyzbc-trt, controls=83" }, { "task": "按钮来源矩阵", "selector": "getButtonParity()", "result": "通过", "expected": "业务按钮有 AXIS/PyVCP 来源引用", "actual": "parity=61, business=74, missing=0" }, { "task": "按钮矩阵前置", "selector": "TASK_HAL_RUNTIME_FAILED", "result": "通过", "expected": "逐按钮矩阵使用稳定 UI dispatch fallback;真实 Task/HAL 由 smoke:browser 覆盖", "actual": "已设置" }, { "task": "菜单 Stage LinuxCNC files", "selector": "[data-menu-command=\"stage\"]", "result": "通过", "expected": "staged fileCount>=10", "actual": "{\"mode\":\"manual\",\"runState\":\"idle\",\"msg\":\"LinuxCNC machine files staged 20\",\"kins\":\"identity\"}" }, { "task": "菜单 Save session", "selector": "[data-menu-command=\"save-session\"]", "result": "通过", "expected": "session status=saved", "actual": "{\"mode\":\"manual\",\"runState\":\"idle\",\"msg\":\"5-axis session saved web-rtcp-5axis-xyzbc-trt-sim-plan/sessions/xyzbc-trt-web-session/web-rtcp-5axis-session.json (opfs)\",\"kins\":\"identity\"}" }, { "task": "工具栏 View X", "selector": "[data-action=\"view-x\"]", "result": "通过", "expected": "selectedView=x", "actual": "{\"mode\":\"manual\",\"runState\":\"idle\",\"msg\":\"preview view x\",\"kins\":\"identity\"}" }, { "task": "菜单 Restore session", "selector": "[data-menu-command=\"restore-session\"]", "result": "通过", "expected": "session restoredAt 非空", "actual": "{\"mode\":\"manual\",\"runState\":\"idle\",\"msg\":\"5-axis session restored web-rtcp-5axis-xyzbc-trt-sim-plan/sessions/xyzbc-trt-web-session/web-rtcp-5axis-session.json\",\"kins\":\"identity\"}" }, { "task": "急停按钮", "selector": "[data-action=\"estop\"]", "result": "通过", "expected": "estopActive=true", "actual": "{\"mode\":\"manual\",\"runState\":\"estopped\",\"msg\":\"emergency stop active\",\"kins\":\"identity\"}" }, { "task": "急停复位按钮", "selector": "[data-action=\"estop\"]", "result": "通过", "expected": "estopActive=false", "actual": "{\"mode\":\"manual\",\"runState\":\"idle\",\"msg\":\"estop reset; machine off\",\"kins\":\"identity\"}" }, { "task": "上电按钮", "selector": "[data-action=\"power\"]", "result": "通过", "expected": "powerOn=true", "actual": "{\"mode\":\"manual\",\"runState\":\"idle\",\"msg\":\"machine power on\",\"kins\":\"identity\"}" }, { "task": "Manual 页签", "selector": "[data-action=\"tab-manual\"]", "result": "通过", "expected": "mode=manual", "actual": "{\"mode\":\"manual\",\"runState\":\"idle\",\"msg\":\"mode manual\",\"kins\":\"identity\"}" }, { "task": "Home All 按钮", "selector": "[data-action=\"home-all\"]", "result": "通过", "expected": "allHomed=true", "actual": "{\"mode\":\"manual\",\"runState\":\"idle\",\"msg\":\"machine homed to fixture origin\",\"kins\":\"identity\"}" }, { "task": "MDI 页签", "selector": "[data-action=\"tab-mdi\"]", "result": "通过", "expected": "mode=mdi", "actual": "{\"mode\":\"mdi\",\"runState\":\"idle\",\"msg\":\"mode mdi\",\"kins\":\"identity\"}" }, { "task": "Manual 页签返回", "selector": "[data-action=\"tab-manual\"]", "result": "通过", "expected": "mode=manual", "actual": "{\"mode\":\"manual\",\"runState\":\"idle\",\"msg\":\"mode manual\",\"kins\":\"identity\"}" }, { "task": "选择 Joint 0", "selector": "[data-action=\"select-joint\"][value=\"0\"]", "result": "通过", "expected": "selectedJoint=0", "actual": "{\"value\":0,\"selectedJoint\":0,\"jogIncrement\":1}" }, { "task": "选择 Joint 1", "selector": "[data-action=\"select-joint\"][value=\"1\"]", "result": "通过", "expected": "selectedJoint=1", "actual": "{\"value\":1,\"selectedJoint\":1,\"jogIncrement\":1}" }, { "task": "选择 Joint 2", "selector": "[data-action=\"select-joint\"][value=\"2\"]", "result": "通过", "expected": "selectedJoint=2", "actual": "{\"value\":2,\"selectedJoint\":2,\"jogIncrement\":1}" }, { "task": "选择 Joint 3", "selector": "[data-action=\"select-joint\"][value=\"3\"]", "result": "通过", "expected": "selectedJoint=3", "actual": "{\"value\":3,\"selectedJoint\":3,\"jogIncrement\":1}" }, { "task": "选择 Joint 4", "selector": "[data-action=\"select-joint\"][value=\"4\"]", "result": "通过", "expected": "selectedJoint=4", "actual": "{\"value\":4,\"selectedJoint\":4,\"jogIncrement\":1}" }, { "task": "Jog 增量 0", "selector": "[data-action=\"jog-increment\"]", "result": "通过", "expected": "jogIncrement=0", "actual": "{\"value\":0,\"selectedJoint\":4,\"jogIncrement\":0}" }, { "task": "Jog 增量 0.001", "selector": "[data-action=\"jog-increment\"]", "result": "通过", "expected": "jogIncrement=0.001", "actual": "{\"value\":0.001,\"selectedJoint\":4,\"jogIncrement\":0.001}" }, { "task": "Jog 增量 0.01", "selector": "[data-action=\"jog-increment\"]", "result": "通过", "expected": "jogIncrement=0.01", "actual": "{\"value\":0.01,\"selectedJoint\":4,\"jogIncrement\":0.01}" }, { "task": "Jog 增量 0.1", "selector": "[data-action=\"jog-increment\"]", "result": "通过", "expected": "jogIncrement=0.1", "actual": "{\"value\":0.1,\"selectedJoint\":4,\"jogIncrement\":0.1}" }, { "task": "Jog 增量 1", "selector": "[data-action=\"jog-increment\"]", "result": "通过", "expected": "jogIncrement=1", "actual": "{\"value\":1,\"selectedJoint\":4,\"jogIncrement\":1}" }, { "task": "Jog 增量 10", "selector": "[data-action=\"jog-increment\"]", "result": "通过", "expected": "jogIncrement=10", "actual": "{\"value\":10,\"selectedJoint\":4,\"jogIncrement\":10}" }, { "task": "Jog 增量恢复", "selector": "[data-action=\"jog-increment\"]", "result": "通过", "expected": "jogIncrement=1", "actual": "{\"value\":1,\"selectedJoint\":4,\"jogIncrement\":1}" }, { "task": "选择 X 轴", "selector": "[data-action=\"select-joint\"][value=\"0\"]", "result": "通过", "expected": "selectedJoint=0", "actual": "{\"value\":0,\"selectedJoint\":0,\"jogIncrement\":1}" }, { "task": "Jog +", "selector": "[data-action=\"jog-plus\"]", "result": "通过", "expected": "X 增加", "actual": "{\"mode\":\"manual\",\"runState\":\"jogging\",\"msg\":\"jog X +1\",\"kins\":\"identity\"}" }, { "task": "Jog -", "selector": "[data-action=\"jog-minus\"]", "result": "通过", "expected": "X 恢复", "actual": "{\"mode\":\"manual\",\"runState\":\"jogging\",\"msg\":\"jog X -1\",\"kins\":\"identity\"}" }, { "task": "Touch Off", "selector": "[data-action=\"touch-off\"]", "result": "失败", "expected": "应执行 G10 L20 P0 X0", "actual": "{\"mode\":\"manual\",\"runState\":\"jogging\",\"msg\":\"MDI blocked: switch to MDI mode first\",\"kins\":\"identity\"}" }, { "task": "Tool Touch Off", "selector": "[data-action=\"tool-touch-off\"]", "result": "失败", "expected": "应执行 G43", "actual": "{\"mode\":\"manual\",\"runState\":\"jogging\",\"msg\":\"MDI blocked: switch to MDI mode first\",\"kins\":\"identity\"}" }, { "task": "Spindle Fwd", "selector": "[data-action=\"spindle-forward\"]", "result": "通过", "expected": "direction=forward enabled", "actual": "{\"mode\":\"manual\",\"runState\":\"jogging\",\"msg\":\"spindle forward\",\"kins\":\"identity\"}" }, { "task": "Spindle Rev", "selector": "[data-action=\"spindle-reverse\"]", "result": "通过", "expected": "direction=reverse enabled", "actual": "{\"mode\":\"manual\",\"runState\":\"jogging\",\"msg\":\"spindle reverse\",\"kins\":\"identity\"}" }, { "task": "Spindle Stop", "selector": "[data-action=\"spindle-stop\"]", "result": "通过", "expected": "direction=stop disabled", "actual": "{\"mode\":\"manual\",\"runState\":\"jogging\",\"msg\":\"spindle stopped\",\"kins\":\"identity\"}" }, { "task": "Spindle Override +", "selector": "[data-action=\"spindle-override-up\"]", "result": "通过", "expected": "+10", "actual": "{\"mode\":\"manual\",\"runState\":\"jogging\",\"msg\":\"spindle override adjusted\",\"kins\":\"identity\"}" }, { "task": "Spindle Override -", "selector": "[data-action=\"spindle-override-down\"]", "result": "通过", "expected": "恢复", "actual": "{\"mode\":\"manual\",\"runState\":\"jogging\",\"msg\":\"spindle override adjusted\",\"kins\":\"identity\"}" }, { "task": "Feed Override +", "selector": "[data-action=\"feed-override-up\"]", "result": "通过", "expected": "+10", "actual": "{\"mode\":\"manual\",\"runState\":\"jogging\",\"msg\":\"feed override adjusted\",\"kins\":\"identity\"}" }, { "task": "Feed Override -", "selector": "[data-action=\"feed-override-down\"]", "result": "通过", "expected": "恢复", "actual": "{\"mode\":\"manual\",\"runState\":\"jogging\",\"msg\":\"feed override adjusted\",\"kins\":\"identity\"}" }, { "task": "Rapid Override +", "selector": "[data-action=\"rapid-override-up\"]", "result": "失败", "expected": "+10", "actual": "{\"mode\":\"manual\",\"runState\":\"jogging\",\"msg\":\"rapid override adjusted\",\"kins\":\"identity\"}" }, { "task": "Rapid Override -", "selector": "[data-action=\"rapid-override-down\"]", "result": "通过", "expected": "恢复", "actual": "{\"mode\":\"manual\",\"runState\":\"jogging\",\"msg\":\"rapid override adjusted\",\"kins\":\"identity\"}" }, { "task": "Flood 开", "selector": "[data-action=\"toggle-flood\"]", "result": "通过", "expected": "flood=true", "actual": "{\"mode\":\"manual\",\"runState\":\"jogging\",\"msg\":\"flood coolant toggled\",\"kins\":\"identity\"}" }, { "task": "Flood 关", "selector": "[data-action=\"toggle-flood\"]", "result": "通过", "expected": "flood=false", "actual": "{\"mode\":\"manual\",\"runState\":\"jogging\",\"msg\":\"flood coolant toggled\",\"kins\":\"identity\"}" }, { "task": "Mist 开", "selector": "[data-action=\"toggle-mist\"]", "result": "通过", "expected": "mist=true", "actual": "{\"mode\":\"manual\",\"runState\":\"jogging\",\"msg\":\"mist coolant toggled\",\"kins\":\"identity\"}" }, { "task": "Mist 关", "selector": "[data-action=\"toggle-mist\"]", "result": "通过", "expected": "mist=false", "actual": "{\"mode\":\"manual\",\"runState\":\"jogging\",\"msg\":\"mist coolant toggled\",\"kins\":\"identity\"}" }, { "task": "Ignore limits 开", "selector": "[data-action=\"ignore-limits\"]", "result": "通过", "expected": "true", "actual": "{\"mode\":\"manual\",\"runState\":\"jogging\",\"msg\":\"limit override requested\",\"kins\":\"identity\"}" }, { "task": "Ignore limits 关", "selector": "[data-action=\"ignore-limits\"]", "result": "通过", "expected": "false", "actual": "{\"mode\":\"manual\",\"runState\":\"jogging\",\"msg\":\"limit override clear\",\"kins\":\"identity\"}" }, { "task": "Optional block 开", "selector": "[data-action=\"block-delete\"]", "result": "通过", "expected": "true", "actual": "{\"mode\":\"manual\",\"runState\":\"jogging\",\"msg\":\"block delete on\",\"kins\":\"identity\"}" }, { "task": "Optional block 关", "selector": "[data-action=\"block-delete\"]", "result": "通过", "expected": "false", "actual": "{\"mode\":\"manual\",\"runState\":\"jogging\",\"msg\":\"block delete off\",\"kins\":\"identity\"}" }, { "task": "Optional stop 开", "selector": "[data-action=\"optional-stop\"]", "result": "通过", "expected": "true", "actual": "{\"mode\":\"manual\",\"runState\":\"jogging\",\"msg\":\"optional stop on\",\"kins\":\"identity\"}" }, { "task": "Optional stop 关", "selector": "[data-action=\"optional-stop\"]", "result": "通过", "expected": "false", "actual": "{\"mode\":\"manual\",\"runState\":\"jogging\",\"msg\":\"optional stop off\",\"kins\":\"identity\"}" }, { "task": "MDI 表单 Go", "selector": "[data-action=\"mdi-form\"]", "result": "通过", "expected": "历史首项=G91 X1", "actual": "通过" }, { "task": "MDI 历史按钮", "selector": "[data-action=\"mdi-history\"]", "result": "通过", "expected": "历史按钮可执行", "actual": "{\"mode\":\"mdi\",\"runState\":\"mdi\",\"msg\":\"MDI G91 X1\",\"kins\":\"identity\"}" }, { "task": "PyVCP TCP:XYZBC", "selector": "[data-action=\"kins-tcp\"]", "result": "通过", "expected": "tcp-xyzbc + RTCP on", "actual": "{\"mode\":\"mdi\",\"runState\":\"mdi\",\"msg\":\"MDI M428\",\"kins\":\"tcp-xyzbc\"}" }, { "task": "PyVCP IDENTITY", "selector": "[data-action=\"kins-identity\"]", "result": "通过", "expected": "identity + RTCP off", "actual": "{\"mode\":\"mdi\",\"runState\":\"mdi\",\"msg\":\"MDI M429\",\"kins\":\"identity\"}" }, { "task": "PyVCP userk", "selector": "[data-action=\"kins-userk\"]", "result": "通过", "expected": "kins=userk", "actual": "{\"mode\":\"mdi\",\"runState\":\"mdi\",\"msg\":\"MDI M430\",\"kins\":\"userk\"}" }, { "task": "View X", "selector": "[data-action=\"view-x\"]", "result": "通过", "expected": "selectedView=x", "actual": "{\"mode\":\"mdi\",\"runState\":\"mdi\",\"msg\":\"preview view x\",\"kins\":\"userk\"}" }, { "task": "View Y", "selector": "[data-action=\"view-y\"]", "result": "通过", "expected": "selectedView=y", "actual": "{\"mode\":\"mdi\",\"runState\":\"mdi\",\"msg\":\"preview view y\",\"kins\":\"userk\"}" }, { "task": "View Z", "selector": "[data-action=\"view-z\"]", "result": "通过", "expected": "selectedView=z", "actual": "{\"mode\":\"mdi\",\"runState\":\"mdi\",\"msg\":\"preview view z\",\"kins\":\"userk\"}" }, { "task": "View P", "selector": "[data-action=\"view-p\"]", "result": "通过", "expected": "selectedView=iso", "actual": "{\"mode\":\"mdi\",\"runState\":\"mdi\",\"msg\":\"preview fit to program\",\"kins\":\"userk\"}" }, { "task": "Toolbar Clear plot", "selector": "[data-region=\"toolbar\"] [data-action=\"clear-preview\"]", "result": "通过", "expected": "pathPoints=0", "actual": "{\"mode\":\"mdi\",\"runState\":\"mdi\",\"msg\":\"preview path cleared\",\"kins\":\"userk\"}" }, { "task": "Toolbar Reload", "selector": "[data-action=\"reload\"]", "result": "通过", "expected": "pathPoints>0", "actual": "{\"mode\":\"mdi\",\"runState\":\"idle\",\"msg\":\"program reloaded\",\"kins\":\"userk\"}" }, { "task": "PyVCP vismach-clear", "selector": "[data-region=\"pyvcp\"] [data-action=\"clear-preview\"]", "result": "通过", "expected": "pathPoints=0", "actual": "{\"mode\":\"mdi\",\"runState\":\"idle\",\"msg\":\"preview path cleared\",\"kins\":\"userk\"}" }, { "task": "Reload after PyVCP clear", "selector": "[data-action=\"reload\"]", "result": "通过", "expected": "pathPoints>0", "actual": "{\"mode\":\"mdi\",\"runState\":\"idle\",\"msg\":\"program reloaded\",\"kins\":\"userk\"}" }, { "task": "Run Ready 菜单", "selector": "[data-menu-command=\"run-ready\"]", "result": "通过", "expected": "power/home/auto/tcp ready", "actual": "{\"mode\":\"auto\",\"runState\":\"idle\",\"msg\":\"LinuxCNC interpreter blocked: Failed to execute 'decode' on 'TextDecoder': The provided ArrayBuffer value must not be resizable\",\"kins\":\"tcp-xyzbc\"}" }, { "task": "Step 按钮", "selector": "[data-action=\"step\"]", "result": "通过", "expected": "进入 stepping/running/complete", "actual": "{\"mode\":\"auto\",\"runState\":\"stepping\",\"msg\":\"stepped to line 18\",\"kins\":\"identity\"}" }, { "task": "Run 按钮", "selector": "[data-action=\"run\"]", "result": "失败", "expected": "运行默认 LinuxCNC 程序并产生 runtime feedback", "actual": "{\"mode\":\"auto\",\"runState\":\"stepping\",\"msg\":\"run blocked: resume paused program first\",\"kins\":\"identity\"}" }, { "task": "Pause 按钮", "selector": "[data-action=\"pause\"]", "result": "通过", "expected": "进入 paused 或发出 pause", "actual": "{\"mode\":\"auto\",\"runState\":\"paused\",\"msg\":\"program paused\",\"kins\":\"identity\"}" }, { "task": "Resume 按钮", "selector": "[data-action=\"resume\"], [data-menu-command=\"resume\"]", "result": "通过", "expected": "恢复运行或发出 resume", "actual": "{\"mode\":\"auto\",\"runState\":\"running\",\"msg\":\"program resumed\",\"kins\":\"identity\"}" }, { "task": "Stop 按钮", "selector": "[data-action=\"stop\"]", "result": "通过", "expected": "runState=stopped 或 stop 完成", "actual": "{\"mode\":\"auto\",\"runState\":\"stopped\",\"msg\":\"program stopped\",\"kins\":\"identity\"}" }, { "task": "Run parity audit 菜单", "selector": "[data-menu-command=\"audit\"]", "result": "失败", "expected": "machine-file execution 或 boundary ready", "actual": "{\"mode\":\"auto\",\"runState\":\"stopped\",\"msg\":\"LinuxCNC interpreter blocked: Failed to execute 'decode' on 'TextDecoder': The provided ArrayBuffer value must not be resizable\",\"kins\":\"identity\"}" }, { "task": "顶层菜单按钮 #1", "selector": ".axis-menu > button", "result": "通过", "expected": "无业务动作按钮点击后无运行时异常", "actual": "通过" }, { "task": "顶层菜单按钮 #2", "selector": ".axis-menu > button", "result": "通过", "expected": "无业务动作按钮点击后无运行时异常", "actual": "通过" }, { "task": "顶层菜单按钮 #3", "selector": ".axis-menu > button", "result": "通过", "expected": "无业务动作按钮点击后无运行时异常", "actual": "通过" }, { "task": "顶层菜单按钮 #4", "selector": ".axis-menu > button", "result": "通过", "expected": "无业务动作按钮点击后无运行时异常", "actual": "通过" }, { "task": "主区域静态页签按钮 #1", "selector": "[data-region=\"main-tabs\"] .axis-main-tabs button", "result": "通过", "expected": "无业务动作按钮点击后无运行时异常", "actual": "通过" }, { "task": "主区域静态页签按钮 #2", "selector": "[data-region=\"main-tabs\"] .axis-main-tabs button", "result": "通过", "expected": "无业务动作按钮点击后无运行时异常", "actual": "通过" }, { "task": "主区域静态页签按钮 #3", "selector": "[data-region=\"main-tabs\"] .axis-main-tabs button", "result": "通过", "expected": "无业务动作按钮点击后无运行时异常", "actual": "通过" }, { "task": "主区域静态页签按钮 #4", "selector": "[data-region=\"main-tabs\"] .axis-main-tabs button", "result": "通过", "expected": "无业务动作按钮点击后无运行时异常", "actual": "通过" }, { "task": "Open 文件控件", "selector": "[data-action=\"OPEN_FILE\"]", "result": "通过", "expected": "本地 ngc 文件加载成功", "actual": "activeProgram=button-validation-sample-20260703T132018Z.ngc" } ] }