{ "apiName": "xyzbc-trt-native-web-evidence-comparison", "status": "pass", "comparedAt": "2026-07-03T13:49:04.790Z", "nativePath": "/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/evidence/native-xyzbc-trt-evidence.json", "webPath": "/home/mes123456/cnc_wams/web-rtcp-5axis-xyzbc-trt-sim-plan/working/evidence/web-xyzbc-trt-evidence.json", "summary": { "checkCount": 35, "passCount": 35, "failCount": 0, "blockers": [], "nativeStatus": "ok", "webStatus": "ready-for-wasm-runtime" }, "checks": [ { "category": "profile", "requirement": "native axis mask is XYZBC", "status": "pass", "evidence": { "nativeAxisMask": 55 } }, { "category": "profile", "requirement": "web default profile is xyzbc-trt", "status": "pass", "evidence": { "webProfile": "xyzbc-trt" } }, { "category": "ini", "requirement": "native loaded xyzbc switchkins program", "status": "pass", "evidence": { "nativeFile": "/home/mes123456/cnc_wams/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzbc_switchkins.ngc" } }, { "category": "ini", "requirement": "web INI parse is ready", "status": "pass", "evidence": { "webIniReady": true } }, { "category": "switchkins", "requirement": "native switchkins pin readable", "status": "pass", "evidence": { "nativePin": { "owner": "31", "type": "float", "direction": "IN", "value": 0, "linked": true, "raw": " 31 float IN 0 motion.switchkins-type <== :kinstype-select" } } }, { "category": "switchkins", "requirement": "web remap files staged", "status": "pass", "evidence": { "remaps": [ { "raw": "M428 modalgroup=10 ngc=428remap", "code": "M428", "modalGroup": 10, "ngc": "428remap" }, { "raw": "M429 modalgroup=10 ngc=429remap", "code": "M429", "modalGroup": 10, "ngc": "429remap" }, { "raw": "M430 modalgroup=10 ngc=430remap", "code": "M430", "modalGroup": 10, "ngc": "430remap" } ] } }, { "category": "program", "requirement": "web default xyzbc_switchkins program staged", "status": "pass", "evidence": { "selected": { "sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzbc_switchkins.ngc", "filename": "xyzbc_switchkins.ngc", "wasmProgramPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/demos/xyzbc_switchkins.ngc" } } }, { "category": "tool-table", "requirement": "web tool table staged", "status": "pass", "evidence": { "toolTable": "xyzbc-trt.tbl" } }, { "category": "tool-table", "requirement": "web tool table active offset drives kinematics, path, and Vismach", "status": "pass", "evidence": { "toolRuntime": { "activeToolNumber": 2, "activePocket": 2, "kinematicsToolOffsetZ": 10, "pathTool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "vismachToolOffset": 10, "defaultActivationUsed": true }, "toolOffsetClosure": { "sourceToolTable": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.tbl", "selectedProgramSourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzbc_switchkins.ngc", "programToolCommands": [], "activeToolOffset": { "idx": 2, "toolNumber": 2, "pocket": 2, "offset": { "x": 0, "y": 0, "z": 10, "a": 0, "b": 0, "c": 0, "u": 0, "v": 0, "w": 0 }, "diameter": 8, "frontAngle": 0, "backAngle": 0, "orientation": 0 }, "kinematicsToolOffsetZ": 10, "pathTool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "vismachToolOffset": 10, "closed": true, "semanticBoundary": "tool_table_current_t_p_z_d_drives_kinematics_path_and_vismach" } } }, { "category": "pyvcp", "requirement": "web PyVCP XML staged", "status": "pass", "evidence": { "pyvcpXmlPath": "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.xml" } }, { "category": "positions", "requirement": "native joint feedback readable", "status": "pass", "evidence": { "joints": { "0": 0, "1": 0, "2": 0, "3": 0, "4": 0 } } }, { "category": "wasm", "requirement": "required WASM artifacts available", "status": "pass", "evidence": { "missing": [] } }, { "category": "parameters", "requirement": "parameter file staged", "status": "pass", "evidence": { "parameterFile": "xyzbc.var" } }, { "category": "program", "requirement": "web boat-xyzbc demo program staged", "status": "pass", "evidence": { "demoPrograms": [ { "filename": "xyzbc_switchkins.ngc", "default": true, "staged": true, "sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzbc_switchkins.ngc" }, { "filename": "boat-xyzbc.ngc", "default": false, "staged": true, "sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/boat-xyzbc.ngc" } ] } }, { "category": "ngcgui", "requirement": "web Ngcgui/remap subroutines staged", "status": "pass", "evidence": { "ngcguiSubroutines": [ { "filename": "xyzbc_switchkins_sub.ngc", "staged": true, "sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/xyzbc_switchkins_sub.ngc", "executable": true, "motionEventCount": 29 }, { "filename": "centering.ngc", "staged": true, "sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/centering.ngc", "executable": true, "motionEventCount": 80 }, { "filename": "helix_bc.ngc", "staged": true, "sourceRel": "configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/helix_bc.ngc", "executable": true, "motionEventCount": 5 } ] } }, { "category": "ngcgui", "requirement": "web Ngcgui/remap subroutines execute through WASM interpreter wrappers", "status": "pass", "evidence": { "ngcguiExecution": { "ready": true, "unavailableReason": null, "subroutines": [ { "filename": "xyzbc_switchkins_sub.ngc", "staged": true, "wrapperFilename": "ngcgui-wrapper-xyzbc_switchkins_sub.ngc", "executable": true, "motionEventCount": 29, "switchkinsCodes": [], "remapRuntimeReady": true, "machineFileExecutionReady": true, "finalAxes": { "x": -10, "y": 20, "z": 10, "a": 0, "b": 0, "c": 0, "u": 0, "v": 0, "w": 0, "arc": { "plane": 170, "firstAxis": "x", "secondAxis": "y", "thirdAxis": "z", "firstEnd": 0, "secondEnd": 0, "centerFirst": 10, "centerSecond": 0, "rotation": -3, "axisEndPoint": 5 } }, "semanticBoundary": "ngcgui_subroutine_executed_by_web_linuxcnc_interpreter_wasm" }, { "filename": "centering.ngc", "staged": true, "wrapperFilename": "ngcgui-wrapper-centering.ngc", "executable": true, "motionEventCount": 80, "switchkinsCodes": [], "remapRuntimeReady": true, "machineFileExecutionReady": true, "finalAxes": { "x": 0, "y": 0, "z": 60, "a": 0, "b": 0, "c": 0, "u": 0, "v": 0, "w": 0 }, "semanticBoundary": "ngcgui_subroutine_executed_by_web_linuxcnc_interpreter_wasm" }, { "filename": "helix_bc.ngc", "staged": true, "wrapperFilename": "ngcgui-wrapper-helix_bc.ngc", "executable": true, "motionEventCount": 5, "switchkinsCodes": [], "remapRuntimeReady": true, "machineFileExecutionReady": true, "finalAxes": { "x": 10, "y": 0, "z": 10, "a": 0, "b": 0, "c": 0, "u": 0, "v": 0, "w": 0, "arc": { "plane": 170, "firstAxis": "x", "secondAxis": "y", "thirdAxis": "z", "firstEnd": 0, "secondEnd": 0, "centerFirst": 10, "centerSecond": 0, "rotation": -3, "axisEndPoint": 5 } }, "semanticBoundary": "ngcgui_subroutine_executed_by_web_linuxcnc_interpreter_wasm" } ], "semanticBoundary": "web_ngcgui_remap_subroutines_staged_and_executable" } } }, { "category": "postgui-hal", "requirement": "web PyVCP to HALUI POSTGUI nets represented", "status": "pass", "evidence": { "halNets": [ { "signal": "kinstype-select", "source": "motion.analog-out-03", "target": "motion.switchkins-type", "boundary": "ini-halcmd" }, { "signal": "table-x", "source": "joint.0.pos-fb", "target": "xyzbc-trt-gui.table-x", "boundary": "ini-halcmd" }, { "signal": "saddle-y", "source": "joint.1.pos-fb", "target": "xyzbc-trt-gui.saddle-y", "boundary": "ini-halcmd" }, { "signal": "spindle-z", "source": "joint.2.pos-fb", "target": "xyzbc-trt-gui.spindle-z", "boundary": "ini-halcmd" }, { "signal": "tilt-b", "source": "joint.3.pos-fb", "target": "xyzbc-trt-gui.tilt-b", "boundary": "ini-halcmd" }, { "signal": "rotate-c", "source": "joint.4.pos-fb", "target": "xyzbc-trt-gui.rotate-c", "boundary": "ini-halcmd" }, { "signal": "tool-offset", "source": "motion.tooloffset.z", "target": "xyzbc-trt-kins.tool-offset", "boundary": "ini-halcmd" }, { "signal": "tool-offset", "source": "xyzbc-trt-kins.tool-offset", "target": "xyzbc-trt-gui.tool-offset", "boundary": "ini-halcmd" }, { "signal": "x-offset", "source": "xyzbc-trt-kins.x-offset", "target": "xyzbc-trt-gui.x-offset", "boundary": "ini-halcmd" }, { "signal": "z-offset", "source": "xyzbc-trt-kins.z-offset", "target": "xyzbc-trt-gui.z-offset", "boundary": "ini-halcmd" }, { "signal": "kinstype.is-0", "source": "kinstype.is-0", "target": "pyvcp.multilabel.0.legend0", "boundary": "postgui-hal" }, { "signal": "kinstype.is-1", "source": "kinstype.is-1", "target": "pyvcp.multilabel.0.legend1", "boundary": "postgui-hal" }, { "signal": "kinstype.is-2", "source": "kinstype.is-2", "target": "pyvcp.multilabel.0.legend2", "boundary": "postgui-hal" }, { "signal": "vismach-clear", "source": "pyvcp.vismach-clear", "target": "vismach.plotclear", "boundary": "postgui-hal" }, { "signal": "type0-button", "source": "pyvcp.type0-button", "target": "halui.mdi-command-00", "command": "M429", "boundary": "postgui-hal" }, { "signal": "type1-button", "source": "pyvcp.type1-button", "target": "halui.mdi-command-01", "command": "M428", "boundary": "postgui-hal" }, { "signal": "type2-button", "source": "pyvcp.type2-button", "target": "halui.mdi-command-02", "command": "M430", "boundary": "postgui-hal" } ] } }, { "category": "basic-sim", "requirement": "native basic_sim joint/home/spindle/toolchange feedback readable", "status": "pass", "evidence": { "basicSimEquivalent": { "ready": true, "source": "LIB:basic_sim.tcl native runtime", "jointFeedback": { "joint.0.pos-fb": 0, "joint.1.pos-fb": 0, "joint.2.pos-fb": 0, "joint.3.pos-fb": 0, "joint.4.pos-fb": 0 }, "homing": { "firstFiveHomedBefore": [ false, false, false, false, false ], "firstFiveHomedAfter": [ false, false, false, false, false ], "allConfiguredAxesHomed": false }, "manualToolChange": { "toolOffsetZ": 0, "toolOffsetLinked": true }, "spindle": { "speed": 0, "feedrate": 1, "rapidrate": 1 }, "execution": { "completed": true, "eventCount": 3 }, "semanticBoundary": "native_basic_sim_joint_home_spindle_manualtoolchange_feedback" } } }, { "category": "basic-sim", "requirement": "web task/HAL basic_sim equivalent covers joint/home/spindle/toolchange feedback", "status": "pass", "evidence": { "basicSimEquivalent": { "ready": true, "source": "web linuxcnc_task_hal WASM plus LinuxCNC task policy", "jointFeedback": { "joint.0.pos-fb": -10, "joint.1.pos-fb": 20, "joint.2.pos-fb": 10, "joint.3.pos-fb": 0, "joint.4.pos-fb": 0 }, "homing": { "allConfiguredAxesHomed": true, "taskPolicyCanHome": false }, "manualToolChange": { "activeToolNumber": 2, "toolOffsetZ": 10 }, "spindle": { "speed": 0, "canSpindle": false }, "execution": { "completed": true, "sampleCount": 228, "taskHalEventCount": 28 }, "semanticBoundary": "web_basic_sim_joint_home_spindle_manualtoolchange_feedback" }, "taskHalEquivalence": { "ready": true, "unavailableReason": null, "taskHal": { "semanticBoundary": "linuxcnc_task_motion_hal_wasm_simulation_runtime", "sessionProgramPath": "/work/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt/demos/xyzbc_switchkins.ngc", "completed": true, "eventCount": 28 }, "taskPolicy": { "taskState": "estop-reset", "taskMode": "manual", "interpState": "idle", "canJog": false, "canHome": false, "canRunAuto": false, "canExecuteMdi": false, "canPause": false, "canResume": false, "canSpindle": false, "canOverride": false }, "taskHalStatusSummary": null, "basicSimEquivalent": { "ready": true, "source": "web linuxcnc_task_hal WASM plus LinuxCNC task policy", "jointFeedback": { "joint.0.pos-fb": -10, "joint.1.pos-fb": 20, "joint.2.pos-fb": 10, "joint.3.pos-fb": 0, "joint.4.pos-fb": 0 }, "homing": { "allConfiguredAxesHomed": true, "taskPolicyCanHome": false }, "manualToolChange": { "activeToolNumber": 2, "toolOffsetZ": 10 }, "spindle": { "speed": 0, "canSpindle": false }, "execution": { "completed": true, "sampleCount": 228, "taskHalEventCount": 28 }, "semanticBoundary": "web_basic_sim_joint_home_spindle_manualtoolchange_feedback" }, "semanticBoundary": "web_task_hal_basic_sim_equivalent_state_flow" } } }, { "category": "kinematics", "requirement": "web kinematics HAL pins represented", "status": "pass", "evidence": { "kinematicsPins": { "xOffset": -20, "zOffset": -15, "xRotPoint": 0, "yRotPoint": 0, "zRotPoint": 0, "conventionalDirections": 0, "toolOffsetSource": "motion.tooloffset.z", "toolOffsetValue": 10, "toolOffsetToolNumber": 2, "pins": [ "motion.switchkins-type", "motion.analog-out-03", "motion.tooloffset.z", "xyzbc-trt-kins.tool-offset", "xyzbc-trt-kins.x-offset", "xyzbc-trt-kins.z-offset", "xyzbc-trt-kins.x-rot-point", "xyzbc-trt-kins.y-rot-point", "xyzbc-trt-kins.z-rot-point", "xyzbc-trt-kins.conventional-directions", "halui.mdi-command-00", "halui.mdi-command-01", "halui.mdi-command-02" ] } } }, { "category": "limits", "requirement": "web TRAJ/AXIS/JOINT limits represented", "status": "pass", "evidence": { "axisJointLimits": { "coordinates": "XYZBC", "linearUnits": "mm", "angularUnits": "deg", "jogAxes": [ "X", "Y", "Z", "C" ], "geometry": "XYZB", "traj": { "coordinates": "XYZBC", "linearUnits": "mm", "angularUnits": "deg", "defaultLinearVelocity": 20, "maxLinearVelocity": 35, "defaultLinearAcceleration": 300, "maxLinearAcceleration": 400 }, "axisLimits": { "X": { "min": -200, "max": 200, "maxVelocity": 20, "maxAcceleration": 300 }, "Y": { "min": -100, "max": 100, "maxVelocity": 20, "maxAcceleration": 300 }, "Z": { "min": -120, "max": 120, "maxVelocity": 20, "maxAcceleration": 300 }, "B": { "min": -36000, "max": 36000, "maxVelocity": 30, "maxAcceleration": 300 }, "C": { "min": -36000, "max": 36000, "maxVelocity": 30, "maxAcceleration": 300 } }, "jointCount": 5, "jointConfig": [ { "id": 0, "axis": "X", "type": "LINEAR", "home": 0, "min": -200, "max": 200, "maxVelocity": 20, "maxAcceleration": 300, "homeSearchVelocity": 0, "homeSequence": 0 }, { "id": 1, "axis": "Y", "type": "LINEAR", "home": 0, "min": -100, "max": 100, "maxVelocity": 20, "maxAcceleration": 300, "homeSearchVelocity": 0, "homeSequence": 0 }, { "id": 2, "axis": "Z", "type": "LINEAR", "home": 0, "min": -120, "max": 120, "maxVelocity": 20, "maxAcceleration": 300, "homeSearchVelocity": 0, "homeSequence": 0 }, { "id": 3, "axis": "B", "type": "ANGULAR", "home": 0, "min": -100, "max": 50, "maxVelocity": 30, "maxAcceleration": 300, "homeSearchVelocity": 0, "homeSequence": 0 }, { "id": 4, "axis": "C", "type": "ANGULAR", "home": 0, "min": -36000, "max": 36000, "maxVelocity": 30, "maxAcceleration": 300, "homeSearchVelocity": 0, "homeSequence": 0 } ] } } }, { "category": "ui", "requirement": "web AXIS first screen exposes program, coordinates, status, MDI/switchkins, override, tool, preview, and execution", "status": "pass", "evidence": { "axisMainUi": { "semanticBoundary": "xyzbc_trt_axis_first_screen_program_coordinates_status_mdi_switchkins_override_tool_preview_execution", "firstViewport": "axis-equivalent-cnc-console", "profileId": "xyzbc-trt", "coordinates": "XYZBC", "requiredSections": [ { "id": "preview", "section": "preview-toolpath-and-machine-model" }, { "id": "dro", "section": "coordinates-dro" }, { "id": "gcode", "section": "program-and-mdi" }, { "id": "status-sidebar", "section": "status-mode-and-switchkins" }, { "id": "info-tabs", "section": "execution-tool-and-runtime-state" }, { "id": "override", "section": "feed-rapid-override" }, { "id": "spindle-coolant", "section": "spindle-coolant" }, { "id": "bottom-controls", "section": "run-jog-home-controls" } ], "axisButtonParity": { "sourceFile": "/home/mes123456/cnc_wams/linuxcnc/src/emc/usr_intf/axis/scripts/axis.py", "pyvcpSourceFiles": [ "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.xml", "configs/sim/axis/vismach/5axis/table-rotary-tilting/switchkins_postgui.hal" ], "requiredActions": [ "estop", "power", "open", "reload", "run-ready", "run", "pause", "resume", "step", "stop", "home-all", "jog-minus", "jog-plus", "touch-off", "tool-touch-off", "spindle-forward", "spindle-stop", "spindle-reverse", "feed-override-down", "feed-override-up", "rapid-override-down", "rapid-override-up", "spindle-override-down", "spindle-override-up", "ignore-limits", "block-delete", "optional-stop", "toggle-flood", "toggle-mist", "mdi-form", "mdi-history", "kins-identity", "kins-tcp", "kins-userk", "clear-preview", "view-x", "view-y", "view-z", "view-p" ], "coveredActions": [ "open", "reload", "stage", "save-session", "restore-session", "estop", "power", "home-all", "run-ready", "run", "pause", "resume", "step", "stop", "view-z", "view-y", "view-x", "view-p", "clear-preview", "audit", "tab-manual", "tab-mdi", "select-joint", "jog-increment", "jog-minus", "jog-plus", "touch-off", "tool-touch-off", "spindle-reverse", "spindle-stop", "spindle-forward", "feed-override-down", "feed-override-up", "rapid-override-down", "rapid-override-up", "spindle-override-down", "spindle-override-up", "ignore-limits", "block-delete", "optional-stop", "toggle-flood", "toggle-mist", "mdi-form", "mdi-history", "kins-identity", "kins-tcp", "kins-userk" ], "missingActions": [], "buttonCount": 61, "sourceReferencedCount": 61, "ready": true }, "buttons": [ { "id": "menu-open", "action": "open", "sourceSymbol": "commands.open_file", "sourceLines": "axis.py:2243-2262", "expected": "file picker opens without changing runtime state" }, { "id": "menu-reload", "action": "reload", "sourceSymbol": "commands.reload_file", "sourceLines": "axis.py:2296-2297", "expected": "program reload resets active playback state" }, { "id": "menu-stage", "action": "stage", "sourceSymbol": "web OPFS staging for DISPLAY PROGRAM_PREFIX", "sourceLines": "xyzbc-trt.ini:[DISPLAY] PROGRAM_PREFIX", "expected": "LinuxCNC profile files are staged" }, { "id": "menu-save-session", "action": "save-session", "sourceSymbol": "web session persistence", "sourceLines": "five-axis-session.js", "expected": "session snapshot is requested" }, { "id": "menu-restore-session", "action": "restore-session", "sourceSymbol": "web session persistence", "sourceLines": "five-axis-session.js", "expected": "session restore is requested" }, { "id": "menu-estop", "action": "estop", "sourceSymbol": "commands.estop_clicked", "sourceLines": "axis.py:2223-2229", "expected": "toggle ESTOP/ESTOP_RESET" }, { "id": "menu-power", "action": "power", "sourceSymbol": "commands.onoff_clicked", "sourceLines": "axis.py:2231-2241", "expected": "toggle machine ON/OFF after estop reset" }, { "id": "menu-home-all", "action": "home-all", "sourceSymbol": "commands.home_all_joints", "sourceLines": "axis.py:2586-2596", "expected": "home all joints in manual mode" }, { "id": "menu-run-ready", "action": "run-ready", "sourceSymbol": "AXIS run preconditions", "sourceLines": "axis.py:2308-2320", "expected": "power on, home, auto mode and TCP kins ready" }, { "id": "menu-run", "action": "run", "sourceSymbol": "commands.task_run", "sourceLines": "axis.py:2308-2320", "expected": "AUTO_RUN from current start line" }, { "id": "menu-pause", "action": "pause", "sourceSymbol": "commands.task_pause", "sourceLines": "axis.py:2329-2333", "expected": "AUTO_PAUSE when running" }, { "id": "menu-resume", "action": "resume", "sourceSymbol": "commands.task_resume", "sourceLines": "axis.py:2344-2351", "expected": "AUTO_RESUME when paused" }, { "id": "menu-step", "action": "step", "sourceSymbol": "commands.task_step", "sourceLines": "axis.py:2321-2327", "expected": "AUTO_STEP one cycle/segment" }, { "id": "menu-stop", "action": "stop", "sourceSymbol": "commands.task_stop", "sourceLines": "axis.py:2365-2372", "expected": "abort current task" }, { "id": "menu-view-z", "action": "view-z", "sourceSymbol": "commands.set_view_z", "sourceLines": "axis.py:2208-2215", "expected": "select top Z camera" }, { "id": "menu-view-y", "action": "view-y", "sourceSymbol": "commands.set_view_y", "sourceLines": "axis.py:2192-2200", "expected": "select front Y camera" }, { "id": "menu-view-x", "action": "view-x", "sourceSymbol": "commands.set_view_x", "sourceLines": "axis.py:2182-2190", "expected": "select side X camera" }, { "id": "menu-view-p", "action": "view-p", "sourceSymbol": "commands.set_view_p", "sourceLines": "axis.py:2220-2221", "expected": "select perspective/fit camera" }, { "id": "menu-clear-preview", "action": "clear-preview", "sourceSymbol": "commands.clear_live_plot", "sourceLines": "axis.py:2557-2558", "expected": "clear live plot buffer" }, { "id": "menu-audit", "action": "audit", "sourceSymbol": "web parity audit", "sourceLines": "collect-web-xyzbc-trt-evidence.mjs", "expected": "request native/Web parity audit" }, { "id": "toolbar-estop", "action": "estop", "sourceSymbol": "commands.estop_clicked", "sourceLines": "axis.py:2223-2229", "expected": "toggle ESTOP/ESTOP_RESET" }, { "id": "toolbar-power", "action": "power", "sourceSymbol": "commands.onoff_clicked", "sourceLines": "axis.py:2231-2241", "expected": "toggle machine power" }, { "id": "toolbar-load", "action": "open", "sourceSymbol": "commands.open_file", "sourceLines": "axis.py:2243-2262", "expected": "open local G-code" }, { "id": "toolbar-reload", "action": "reload", "sourceSymbol": "commands.reload_file", "sourceLines": "axis.py:2296-2297", "expected": "reload active program" }, { "id": "toolbar-run", "action": "run", "sourceSymbol": "commands.task_run", "sourceLines": "axis.py:2308-2320", "expected": "start AUTO run" }, { "id": "toolbar-pause-resume", "action": "pause", "sourceSymbol": "commands.task_pauseresume", "sourceLines": "axis.py:2353-2363", "expected": "pause or resume based on paused state" }, { "id": "toolbar-step", "action": "step", "sourceSymbol": "commands.task_step", "sourceLines": "axis.py:2321-2327", "expected": "single step" }, { "id": "toolbar-stop", "action": "stop", "sourceSymbol": "commands.task_stop", "sourceLines": "axis.py:2365-2372", "expected": "abort current task" }, { "id": "toolbar-view-z", "action": "view-z", "sourceSymbol": "commands.set_view_z", "sourceLines": "axis.py:2208-2215", "expected": "Z view" }, { "id": "toolbar-view-y", "action": "view-y", "sourceSymbol": "commands.set_view_y", "sourceLines": "axis.py:2192-2200", "expected": "Y view" }, { "id": "toolbar-view-x", "action": "view-x", "sourceSymbol": "commands.set_view_x", "sourceLines": "axis.py:2182-2190", "expected": "X view" }, { "id": "toolbar-view-p", "action": "view-p", "sourceSymbol": "commands.set_view_p", "sourceLines": "axis.py:2220-2221", "expected": "perspective view" }, { "id": "toolbar-clear-preview", "action": "clear-preview", "sourceSymbol": "commands.clear_live_plot", "sourceLines": "axis.py:2557-2558", "expected": "clear path count" }, { "id": "manual-tab", "action": "tab-manual", "sourceSymbol": "commands.ensure_manual", "sourceLines": "axis.py:2520-2531", "expected": "manual mode tab selected" }, { "id": "mdi-tab", "action": "tab-mdi", "sourceSymbol": "commands.ensure_mdi", "sourceLines": "axis.py:2533-2540", "expected": "MDI mode tab selected" }, { "id": "manual-select-joint", "action": "select-joint", "sourceSymbol": "axis radiobuttons ja_rbutton", "sourceLines": "axis.py:1369-1380", "expected": "active joint/axis selected" }, { "id": "manual-jog-increment", "action": "jog-increment", "sourceSymbol": "set_hal_jogincrement", "sourceLines": "axis.py:1507-1515", "expected": "jog increment updates HAL-equivalent state" }, { "id": "manual-jog-minus", "action": "jog-minus", "sourceSymbol": "commands.jog_minus", "sourceLines": "axis.py:2573-2577", "expected": "negative jog of active axis/joint" }, { "id": "manual-jog-plus", "action": "jog-plus", "sourceSymbol": "commands.jog_plus", "sourceLines": "axis.py:2567-2571", "expected": "positive jog of active axis/joint" }, { "id": "manual-touch-off", "action": "touch-off", "sourceSymbol": "commands.touch_off_system", "sourceLines": "axis.py:2631-2650", "expected": "G10 touch off MDI equivalent" }, { "id": "manual-tool-touch-off", "action": "tool-touch-off", "sourceSymbol": "commands.touch_off_tool", "sourceLines": "axis.py:2651-2685", "expected": "tool length offset equivalent" }, { "id": "manual-spindle-reverse", "action": "spindle-reverse", "sourceSymbol": "spindle CCW control", "sourceLines": "axis.py:1389-1398", "expected": "spindle reverse" }, { "id": "manual-spindle-stop", "action": "spindle-stop", "sourceSymbol": "spindle stop control", "sourceLines": "axis.py:1389-1398", "expected": "spindle stop" }, { "id": "manual-spindle-forward", "action": "spindle-forward", "sourceSymbol": "spindle CW control", "sourceLines": "axis.py:1389-1398", "expected": "spindle forward" }, { "id": "override-feed-down", "action": "feed-override-down", "sourceSymbol": "commands.set_feedrate", "sourceLines": "axis.py:2131-2137", "expected": "feed override down" }, { "id": "override-feed-up", "action": "feed-override-up", "sourceSymbol": "commands.set_feedrate", "sourceLines": "axis.py:2131-2137", "expected": "feed override up" }, { "id": "override-rapid-down", "action": "rapid-override-down", "sourceSymbol": "commands.set_rapidrate", "sourceLines": "axis.py:2139-2145", "expected": "rapid override down" }, { "id": "override-rapid-up", "action": "rapid-override-up", "sourceSymbol": "commands.set_rapidrate", "sourceLines": "axis.py:2139-2145", "expected": "rapid override up" }, { "id": "override-spindle-down", "action": "spindle-override-down", "sourceSymbol": "commands.set_spindlerate", "sourceLines": "axis.py:2122-2129", "expected": "spindle override down" }, { "id": "override-spindle-up", "action": "spindle-override-up", "sourceSymbol": "commands.set_spindlerate", "sourceLines": "axis.py:2122-2129", "expected": "spindle override up" }, { "id": "manual-ignore-limits", "action": "ignore-limits", "sourceSymbol": "commands.toggle_override_limits", "sourceLines": "axis.py:3161", "expected": "limit override checkbox state" }, { "id": "manual-block-delete", "action": "block-delete", "sourceSymbol": "commands.toggle_block_delete", "sourceLines": "axis.py:2051-2059", "expected": "block delete state" }, { "id": "manual-optional-stop", "action": "optional-stop", "sourceSymbol": "commands.toggle_optional_stop", "sourceLines": "axis.py:2047-2049", "expected": "optional stop state" }, { "id": "manual-flood", "action": "toggle-flood", "sourceSymbol": "commands.flood_toggle", "sourceLines": "axis.py:3176", "expected": "flood coolant toggle" }, { "id": "manual-mist", "action": "toggle-mist", "sourceSymbol": "commands.mist_toggle", "sourceLines": "axis.py:3175", "expected": "mist coolant toggle" }, { "id": "mdi-submit", "action": "mdi-form", "sourceSymbol": "commands.send_mdi", "sourceLines": "axis.py:2413-2417", "expected": "submit MDI command" }, { "id": "mdi-history", "action": "mdi-history", "sourceSymbol": "commands.mdi_history_butt_1", "sourceLines": "axis.py:2499-2516", "expected": "run/restore MDI history command" }, { "id": "pyvcp-identity", "action": "kins-identity", "sourceSymbol": "pyvcp.type0-button -> halui.mdi-command-00", "sourceLines": "switchkins_postgui.hal", "expected": "M429 sets identity kins" }, { "id": "pyvcp-tcp", "action": "kins-tcp", "sourceSymbol": "pyvcp.type1-button -> halui.mdi-command-01", "sourceLines": "switchkins_postgui.hal", "expected": "M428 sets tcp-xyzbc kins" }, { "id": "pyvcp-userk", "action": "kins-userk", "sourceSymbol": "pyvcp.type2-button -> halui.mdi-command-02", "sourceLines": "switchkins_postgui.hal", "expected": "M430 sets userk kins" }, { "id": "pyvcp-clear", "action": "clear-preview", "sourceSymbol": "pyvcp.vismach-clear -> vismach.plotclear", "sourceLines": "switchkins_postgui.hal", "expected": "clear Vismach plot" } ], "capabilities": [ { "id": "program", "ready": true, "evidence": "configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzbc_switchkins.ngc" }, { "id": "coordinates", "ready": true, "evidence": { "coordinates": "XYZBC", "droAxes": [ "X", "Y", "Z", "B", "C" ] } }, { "id": "status", "ready": true, "evidence": { "taskState": "estop-reset", "mode": "manual", "runState": "idle" } }, { "id": "mdi", "ready": true, "evidence": { "command": "G0 X0 Y0 Z0", "switchkinsMdi": [ "M429", "M428", "M430" ] } }, { "id": "switchkins", "ready": true, "evidence": [ { "value": 0, "label": "identity", "mdiCommand": "M429", "webKinsType": "identity", "remap": { "code": "M429", "modalGroup": 10, "ngc": "429remap", "path": "configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/429remap.ngc", "switchkinsType": 0, "analogOutputIndex": 3, "syncInputIndex": 0, "requiresHalPinVars": true }, "haluiCommand": "M429", "halPin": "motion.switchkins-type" }, { "value": 1, "label": "XYZBC TCP", "mdiCommand": "M428", "webKinsType": "tcp-xyzbc", "remap": { "code": "M428", "modalGroup": 10, "ngc": "428remap", "path": "configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/428remap.ngc", "switchkinsType": 1, "analogOutputIndex": 3, "syncInputIndex": 0, "requiresHalPinVars": true }, "haluiCommand": "M428", "halPin": "motion.switchkins-type" }, { "value": 2, "label": "USERK", "mdiCommand": "M430", "webKinsType": "userk", "remap": { "code": "M430", "modalGroup": 10, "ngc": "430remap", "path": "configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/430remap.ngc", "switchkinsType": 2, "analogOutputIndex": 3, "syncInputIndex": 0, "requiresHalPinVars": true }, "haluiCommand": "M430", "halPin": "motion.switchkins-type" } ] }, { "id": "override", "ready": true, "evidence": { "feedOverride": 100, "rapidOverride": 100 } }, { "id": "tool", "ready": true, "evidence": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 } }, { "id": "preview", "ready": true, "evidence": { "samplePeriodMs": 50, "sampleCount": 1300 } }, { "id": "execution", "ready": true, "evidence": { "samplePeriodMs": 50, "sampleCount": 228 } }, { "id": "axis-buttons", "ready": true, "evidence": { "canRunAuto": false, "canExecuteMdi": false, "canJog": false, "canHome": false, "axisButtonParity": { "sourceFile": "/home/mes123456/cnc_wams/linuxcnc/src/emc/usr_intf/axis/scripts/axis.py", "pyvcpSourceFiles": [ "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.xml", "configs/sim/axis/vismach/5axis/table-rotary-tilting/switchkins_postgui.hal" ], "requiredActions": [ "estop", "power", "open", "reload", "run-ready", "run", "pause", "resume", "step", "stop", "home-all", "jog-minus", "jog-plus", "touch-off", "tool-touch-off", "spindle-forward", "spindle-stop", "spindle-reverse", "feed-override-down", "feed-override-up", "rapid-override-down", "rapid-override-up", "spindle-override-down", "spindle-override-up", "ignore-limits", "block-delete", "optional-stop", "toggle-flood", "toggle-mist", "mdi-form", "mdi-history", "kins-identity", "kins-tcp", "kins-userk", "clear-preview", "view-x", "view-y", "view-z", "view-p" ], "coveredActions": [ "open", "reload", "stage", "save-session", "restore-session", "estop", "power", "home-all", "run-ready", "run", "pause", "resume", "step", "stop", "view-z", "view-y", "view-x", "view-p", "clear-preview", "audit", "tab-manual", "tab-mdi", "select-joint", "jog-increment", "jog-minus", "jog-plus", "touch-off", "tool-touch-off", "spindle-reverse", "spindle-stop", "spindle-forward", "feed-override-down", "feed-override-up", "rapid-override-down", "rapid-override-up", "spindle-override-down", "spindle-override-up", "ignore-limits", "block-delete", "optional-stop", "toggle-flood", "toggle-mist", "mdi-form", "mdi-history", "kins-identity", "kins-tcp", "kins-userk" ], "missingActions": [], "buttonCount": 61, "sourceReferencedCount": 61, "ready": true } } } ], "missingCapabilities": [], "ready": true } } }, { "category": "ui", "requirement": "web AXIS/PyVCP buttons are source-referenced and covered by a button-level parity matrix", "status": "pass", "evidence": { "axisButtonParity": { "sourceFile": "/home/mes123456/cnc_wams/linuxcnc/src/emc/usr_intf/axis/scripts/axis.py", "pyvcpSourceFiles": [ "configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzbc-trt.xml", "configs/sim/axis/vismach/5axis/table-rotary-tilting/switchkins_postgui.hal" ], "requiredActions": [ "estop", "power", "open", "reload", "run-ready", "run", "pause", "resume", "step", "stop", "home-all", "jog-minus", "jog-plus", "touch-off", "tool-touch-off", "spindle-forward", "spindle-stop", "spindle-reverse", "feed-override-down", "feed-override-up", "rapid-override-down", "rapid-override-up", "spindle-override-down", "spindle-override-up", "ignore-limits", "block-delete", "optional-stop", "toggle-flood", "toggle-mist", "mdi-form", "mdi-history", "kins-identity", "kins-tcp", "kins-userk", "clear-preview", "view-x", "view-y", "view-z", "view-p" ], "coveredActions": [ "open", "reload", "stage", "save-session", "restore-session", "estop", "power", "home-all", "run-ready", "run", "pause", "resume", "step", "stop", "view-z", "view-y", "view-x", "view-p", "clear-preview", "audit", "tab-manual", "tab-mdi", "select-joint", "jog-increment", "jog-minus", "jog-plus", "touch-off", "tool-touch-off", "spindle-reverse", "spindle-stop", "spindle-forward", "feed-override-down", "feed-override-up", "rapid-override-down", "rapid-override-up", "spindle-override-down", "spindle-override-up", "ignore-limits", "block-delete", "optional-stop", "toggle-flood", "toggle-mist", "mdi-form", "mdi-history", "kins-identity", "kins-tcp", "kins-userk" ], "missingActions": [], "buttonCount": 61, "sourceReferencedCount": 61, "ready": true } } }, { "category": "ui", "requirement": "web UI state flow, buttons, HAL pins, and paths are rechecked against native xyzbc-trt runtime", "status": "pass", "evidence": { "nativeTaskStateFlow": { "ready": true, "executionCompleted": true, "eventCount": 3, "states": [ { "name": "before", "taskState": 4, "taskMode": 1, "interpState": 1, "execState": 2, "homed": [ false, false, false, false, false ], "file": "/home/mes123456/cnc_wams/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzbc_switchkins.ngc" }, { "name": "after", "taskState": 4, "taskMode": 1, "interpState": 1, "execState": 2, "homed": [ false, false, false, false, false ], "file": "/home/mes123456/cnc_wams/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzbc_switchkins.ngc" } ], "kinstype": 0, "semanticBoundary": "native_linuxcnc_estop_power_home_auto_mdi_interlock_state_flow" }, "webNativeStateFlowReview": { "ready": true, "source": "web_task_hal_basic_sim_equivalent_state_flow", "stateFields": [ "taskState", "taskMode", "interpState", "estop", "enabled", "homed", "kinstype" ], "buttonInterlocks": { "taskState": "estop-reset", "taskMode": "manual", "interpState": "idle", "canJog": false, "canHome": false, "canRunAuto": false, "canExecuteMdi": false, "canPause": false, "canResume": false, "canSpindle": false, "canOverride": false }, "switchkinsButtons": [ { "command": "M429", "gatedBy": "machine on and interpreter idle", "represented": true }, { "command": "M428", "gatedBy": "machine on and interpreter idle", "represented": true }, { "command": "M430", "gatedBy": "machine on and interpreter idle", "represented": true } ], "pathHalPinsReviewed": [ "motion.switchkins-type", "motion.analog-out-03", "motion.tooloffset.z", "joint.0.pos-fb", "joint.1.pos-fb", "joint.2.pos-fb", "joint.3.pos-fb", "joint.4.pos-fb" ], "semanticBoundary": "web_ui_rechecked_against_native_xyzbc_trt_state_flow_buttons_hal_pins_paths" } } }, { "category": "path-preview", "requirement": "native and web preview path sample period is 50ms", "status": "pass", "evidence": { "nativeSamplePeriodMs": 50, "webSamplePeriodMs": 50 } }, { "category": "path-preview", "requirement": "native and web preview paths have samples", "status": "pass", "evidence": { "nativeSampleCount": 1300, "webSampleCount": 1300, "unavailable": [] } }, { "category": "path-preview", "requirement": "native and web preview tool paths are geometrically aligned", "status": "pass", "evidence": { "thresholds": { "maxTcpErrorMm": 0.001, "maxJointError": 0.001, "maxToolAxisAngleDeg": 0.001, "sampleCountDelta": 0 }, "maxTcpErrorMm": 3.552713678800501e-15, "rmsTcpErrorMm": 4.515420281608176e-16, "maxJointError": 3.552713678800501e-15, "maxToolAxisAngleDeg": 0, "sampleCountDelta": 0 } }, { "category": "path-execution", "requirement": "native and web execution path sample period is 50ms", "status": "pass", "evidence": { "nativeSamplePeriodMs": 50, "webSamplePeriodMs": 50 } }, { "category": "path-execution", "requirement": "native and web execution paths have samples", "status": "pass", "evidence": { "nativeSampleCount": 4, "webSampleCount": 228, "unavailable": [] } }, { "category": "path-execution", "requirement": "native and web source-expanded execution paths are geometrically aligned", "status": "pass", "evidence": { "thresholds": { "maxTcpErrorMm": 0.001, "maxJointError": 0.001, "maxToolAxisAngleDeg": 0.001, "sampleCountDelta": 0 }, "nativeSampleCount": 1300, "webSampleCount": 1300, "maxTcpErrorMm": 3.552713678800501e-15, "rmsTcpErrorMm": 4.515420281608176e-16, "maxJointError": 3.552713678800501e-15, "maxToolAxisAngleDeg": 0, "machineStateMismatchCount": 0, "sampleCountDelta": 0 } }, { "category": "line-execution", "requirement": "native and web per-line G-code execution trace matches", "status": "pass", "evidence": { "nativeTraceCount": 64, "webTraceCount": 64, "mismatchCount": 0, "mismatches": [] } }, { "category": "axis-values", "requirement": "native and web actual axis values by executed line match", "status": "pass", "evidence": { "nativeLineValueCount": 29, "webLineValueCount": 29, "thresholds": { "maxTcpErrorMm": 0.001, "maxJointError": 0.001, "maxToolAxisAngleDeg": 0.001 }, "maxTcpErrorMm": 0, "maxJointError": 0, "maxToolAxisAngleDeg": 0, "mismatchCount": 0, "mismatches": [] } }, { "category": "gcode-process", "requirement": "native and web complete G-code execution process JSON matches", "status": "pass", "evidence": { "nativeExecutionStepCount": 128, "webExecutionStepCount": 128, "nativeSourceLineCoverageCount": 65, "webSourceLineCoverageCount": 65, "mismatchCount": 0, "mismatches": [] } }, { "category": "path-preview-execution-consistency", "requirement": "native preview and execution paths are comparable", "status": "pass", "evidence": { "nativePreviewSampleCount": 1300, "nativeExecutionSampleCount": 4, "unavailable": [] } }, { "category": "path-preview-execution-consistency", "requirement": "web preview and execution paths are comparable", "status": "pass", "evidence": { "webPreviewSampleCount": 1300, "webExecutionSampleCount": 228, "unavailable": [] } } ], "pathComparison": { "samplePeriodMs": 50, "previewVsPreview": { "status": "pass", "comparable": true, "geometricAligned": true, "thresholds": { "maxTcpErrorMm": 0.001, "maxJointError": 0.001, "maxToolAxisAngleDeg": 0.001, "sampleCountDelta": 0 }, "periodsMatch": true, "nativeSamplePeriodMs": 50, "webSamplePeriodMs": 50, "leftSampleCount": 1300, "rightSampleCount": 1300, "nativeSampleCount": 1300, "webSampleCount": 1300, "unavailable": [], "maxTcpErrorMm": 3.552713678800501e-15, "rmsTcpErrorMm": 4.515420281608176e-16, "maxJointError": 3.552713678800501e-15, "rmsJointError": 4.515420281608176e-16, "maxToolAxisAngleDeg": 0, "sampleCountDelta": 0, "missingSamples": [], "machineStateMismatchCount": 0, "machineStateMismatches": [] }, "executionVsExecution": { "status": "pass", "comparable": true, "geometricAligned": true, "thresholds": null, "periodsMatch": true, "nativeSamplePeriodMs": 50, "webSamplePeriodMs": 50, "leftSampleCount": 4, "rightSampleCount": 228, "nativeSampleCount": 4, "webSampleCount": 228, "unavailable": [], "maxTcpErrorMm": 5.61798, "rmsTcpErrorMm": 3.846366141275425, "maxJointError": 5.61798, "rmsJointError": 3.846366141275425, "maxToolAxisAngleDeg": 0, "sampleCountDelta": 224, "missingSamples": [], "machineStateMismatchCount": 4, "machineStateMismatches": [ { "index": 0, "native": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 1, "actualMmPerMin": 1, "overridePercent": 100 }, "cutting": { "active": false, "cuttingSpeedMmPerMin": 0 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } }, "web": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 2100, "actualMmPerMin": 2100, "overridePercent": 100 }, "cutting": { "active": false, "cuttingSpeedMmPerMin": 0 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } } }, { "index": 1, "native": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 1, "actualMmPerMin": 1, "overridePercent": 100 }, "cutting": { "active": false, "cuttingSpeedMmPerMin": 0 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } }, "web": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 2100, "actualMmPerMin": 2100, "overridePercent": 100 }, "cutting": { "active": false, "cuttingSpeedMmPerMin": 0 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } } }, { "index": 2, "native": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 1, "actualMmPerMin": 1, "overridePercent": 100 }, "cutting": { "active": false, "cuttingSpeedMmPerMin": 0 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } }, "web": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 2100, "actualMmPerMin": 2100, "overridePercent": 100 }, "cutting": { "active": false, "cuttingSpeedMmPerMin": 0 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } } }, { "index": 3, "native": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 1, "actualMmPerMin": 1, "overridePercent": 100 }, "cutting": { "active": false, "cuttingSpeedMmPerMin": 0 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } }, "web": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 2100, "actualMmPerMin": 2100, "overridePercent": 100 }, "cutting": { "active": false, "cuttingSpeedMmPerMin": 0 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } } } ] }, "semanticExecutionVsSemanticExecution": { "status": "pass", "comparable": true, "geometricAligned": true, "thresholds": { "maxTcpErrorMm": 0.001, "maxJointError": 0.001, "maxToolAxisAngleDeg": 0.001, "sampleCountDelta": 0 }, "periodsMatch": true, "nativeSamplePeriodMs": 50, "webSamplePeriodMs": 50, "leftSampleCount": 1300, "rightSampleCount": 1300, "nativeSampleCount": 1300, "webSampleCount": 1300, "unavailable": [], "maxTcpErrorMm": 3.552713678800501e-15, "rmsTcpErrorMm": 4.515420281608176e-16, "maxJointError": 3.552713678800501e-15, "rmsJointError": 4.515420281608176e-16, "maxToolAxisAngleDeg": 0, "sampleCountDelta": 0, "missingSamples": [], "machineStateMismatchCount": 0, "machineStateMismatches": [] }, "previewVsExecutionNative": { "status": "pass", "comparable": true, "geometricAligned": true, "thresholds": null, "periodsMatch": true, "nativePreviewSamplePeriodMs": 50, "nativeExecutionSamplePeriodMs": 50, "leftSampleCount": 1300, "rightSampleCount": 4, "unavailable": [], "maxTcpErrorMm": 10.539101686569952, "rmsTcpErrorMm": 10.171539097523873, "maxJointError": 10.539101686569952, "rmsJointError": 10.171539097523873, "maxToolAxisAngleDeg": 0, "sampleCountDelta": 1296, "missingSamples": [], "machineStateMismatchCount": 4, "machineStateMismatches": [ { "index": 0, "native": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 2100, "actualMmPerMin": 2100, "overridePercent": 100 }, "cutting": { "active": false, "cuttingSpeedMmPerMin": 0 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } }, "web": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 1, "actualMmPerMin": 1, "overridePercent": 100 }, "cutting": { "active": false, "cuttingSpeedMmPerMin": 0 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } } }, { "index": 1, "native": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 2100, "actualMmPerMin": 2100, "overridePercent": 100 }, "cutting": { "active": false, "cuttingSpeedMmPerMin": 0 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } }, "web": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 1, "actualMmPerMin": 1, "overridePercent": 100 }, "cutting": { "active": false, "cuttingSpeedMmPerMin": 0 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } } }, { "index": 2, "native": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 2100, "actualMmPerMin": 2100, "overridePercent": 100 }, "cutting": { "active": false, "cuttingSpeedMmPerMin": 0 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } }, "web": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 1, "actualMmPerMin": 1, "overridePercent": 100 }, "cutting": { "active": false, "cuttingSpeedMmPerMin": 0 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } } }, { "index": 3, "native": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 2100, "actualMmPerMin": 2100, "overridePercent": 100 }, "cutting": { "active": false, "cuttingSpeedMmPerMin": 0 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } }, "web": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 1, "actualMmPerMin": 1, "overridePercent": 100 }, "cutting": { "active": false, "cuttingSpeedMmPerMin": 0 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } } } ] }, "previewVsExecutionWeb": { "status": "pass", "comparable": true, "geometricAligned": true, "thresholds": null, "periodsMatch": true, "webPreviewSamplePeriodMs": 50, "webExecutionSamplePeriodMs": 50, "leftSampleCount": 1300, "rightSampleCount": 228, "unavailable": [], "maxTcpErrorMm": 38.302720817901054, "rmsTcpErrorMm": 27.083943307199817, "maxJointError": 60.1956712201985, "rmsJointError": 30.61792131178714, "maxToolAxisAngleDeg": 19.999999999999993, "sampleCountDelta": 1072, "missingSamples": [], "machineStateMismatchCount": 211, "machineStateMismatches": [ { "index": 17, "native": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 2100, "actualMmPerMin": 2100, "overridePercent": 100 }, "cutting": { "active": false, "cuttingSpeedMmPerMin": 0 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } }, "web": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 1000.002, "actualMmPerMin": 1000.002, "overridePercent": 100 }, "cutting": { "active": true, "cuttingSpeedMmPerMin": 1000.002 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } } }, { "index": 18, "native": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 2100, "actualMmPerMin": 2100, "overridePercent": 100 }, "cutting": { "active": false, "cuttingSpeedMmPerMin": 0 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } }, "web": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 1000.002, "actualMmPerMin": 1000.002, "overridePercent": 100 }, "cutting": { "active": true, "cuttingSpeedMmPerMin": 1000.002 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } } }, { "index": 19, "native": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 2100, "actualMmPerMin": 2100, "overridePercent": 100 }, "cutting": { "active": false, "cuttingSpeedMmPerMin": 0 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } }, "web": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 1000.002, "actualMmPerMin": 1000.002, "overridePercent": 100 }, "cutting": { "active": true, "cuttingSpeedMmPerMin": 1000.002 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } } }, { "index": 20, "native": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 2100, "actualMmPerMin": 2100, "overridePercent": 100 }, "cutting": { "active": false, "cuttingSpeedMmPerMin": 0 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } }, "web": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 1000.002, "actualMmPerMin": 1000.002, "overridePercent": 100 }, "cutting": { "active": true, "cuttingSpeedMmPerMin": 1000.002 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } } }, { "index": 21, "native": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 2100, "actualMmPerMin": 2100, "overridePercent": 100 }, "cutting": { "active": false, "cuttingSpeedMmPerMin": 0 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } }, "web": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 1000.002, "actualMmPerMin": 1000.002, "overridePercent": 100 }, "cutting": { "active": true, "cuttingSpeedMmPerMin": 1000.002 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } } }, { "index": 22, "native": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 2100, "actualMmPerMin": 2100, "overridePercent": 100 }, "cutting": { "active": false, "cuttingSpeedMmPerMin": 0 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } }, "web": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 1000.002, "actualMmPerMin": 1000.002, "overridePercent": 100 }, "cutting": { "active": true, "cuttingSpeedMmPerMin": 1000.002 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } } }, { "index": 23, "native": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 2100, "actualMmPerMin": 2100, "overridePercent": 100 }, "cutting": { "active": false, "cuttingSpeedMmPerMin": 0 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } }, "web": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 1000.002, "actualMmPerMin": 1000.002, "overridePercent": 100 }, "cutting": { "active": true, "cuttingSpeedMmPerMin": 1000.002 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } } }, { "index": 24, "native": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 2100, "actualMmPerMin": 2100, "overridePercent": 100 }, "cutting": { "active": false, "cuttingSpeedMmPerMin": 0 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } }, "web": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 1000.002, "actualMmPerMin": 1000.002, "overridePercent": 100 }, "cutting": { "active": true, "cuttingSpeedMmPerMin": 1000.002 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } } }, { "index": 25, "native": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 2100, "actualMmPerMin": 2100, "overridePercent": 100 }, "cutting": { "active": false, "cuttingSpeedMmPerMin": 0 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } }, "web": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 1000.002, "actualMmPerMin": 1000.002, "overridePercent": 100 }, "cutting": { "active": true, "cuttingSpeedMmPerMin": 1000.002 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } } }, { "index": 26, "native": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 2100, "actualMmPerMin": 2100, "overridePercent": 100 }, "cutting": { "active": false, "cuttingSpeedMmPerMin": 0 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } }, "web": { "spindle": { "speedRpm": 0, "direction": "stopped", "enabled": false }, "feed": { "programmedMmPerMin": 1000.002, "actualMmPerMin": 1000.002, "overridePercent": 100 }, "cutting": { "active": true, "cuttingSpeedMmPerMin": 1000.002 }, "tool": { "id": 2, "pocket": 2, "length": 10, "diameter": 8 }, "toolChange": { "activeTool": 2, "activePocket": 2, "changed": false, "command": null }, "coolant": { "mist": false, "flood": false } } } ] } }, "lineExecutionComparison": { "status": "pass", "nativeTraceCount": 64, "webTraceCount": 64, "mismatchCount": 0, "mismatches": [], "semanticBoundary": "native_web_line_by_line_gcode_execution_trace_comparison" }, "axisValuesByLineComparison": { "status": "pass", "nativeLineValueCount": 29, "webLineValueCount": 29, "thresholds": { "maxTcpErrorMm": 0.001, "maxJointError": 0.001, "maxToolAxisAngleDeg": 0.001 }, "maxTcpErrorMm": 0, "maxJointError": 0, "maxToolAxisAngleDeg": 0, "mismatchCount": 0, "mismatches": [], "semanticBoundary": "native_web_executed_line_axis_values_comparison" }, "gcodeExecutionProcessComparison": { "status": "pass", "nativeExecutionStepCount": 128, "webExecutionStepCount": 128, "nativeSourceLineCoverageCount": 65, "webSourceLineCoverageCount": 65, "nativeSummary": { "motionStepCount": 29, "switchkinsStepCount": 21, "parameterAssignmentStepCount": 41, "workOffsetStepCount": 9, "callStepCount": 5, "noMotionStepCount": 99, "finalJoint": { "x": 0, "y": 0, "z": 10, "b": 0, "c": 0 }, "finalKinematics": "identity" }, "webSummary": { "motionStepCount": 29, "switchkinsStepCount": 21, "parameterAssignmentStepCount": 41, "workOffsetStepCount": 9, "callStepCount": 5, "noMotionStepCount": 99, "finalJoint": { "x": 0, "y": 0, "z": 10, "b": 0, "c": 0 }, "finalKinematics": "identity" }, "mismatchCount": 0, "mismatches": [], "semanticBoundary": "native_web_complete_gcode_execution_process_json_comparison" }, "requiredImprovements": [], "semanticBoundary": "native_linuxcnc_vs_web_opfs_wasm_xyzbc_trt_evidence_comparison" }