Files
cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/evidence/button-full-validation-20260703T132018Z.json
2026-07-03 17:04:33 -04:00

1571 lines
45 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
{
"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-trtruntime 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"
}
]
}