{ "apiName": "xyzbc-trt-native-web-evidence-comparison", "status": "pass", "comparedAt": "2026-07-05T22:57:05.625Z", "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": 60, "passCount": 60, "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", "toggle-auto-manual", "pause-resume", "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-input", "mdi-form", "mdi-history", "kins-identity", "kins-tcp", "kins-userk" ], "missingActions": [], "buttonCount": 63, "sourceReferencedCount": 63, "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-auto-manual", "action": "toggle-auto-manual", "sourceSymbol": "commands.ensure_manual / commands.task_mode_auto", "sourceLines": "axis.py:2308-2320,2520-2531", "expected": "toggle task mode between AUTO and MANUAL" }, { "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-resume", "sourceSymbol": "commands.task_pauseresume", "sourceLines": "axis.py:2433-2443 / axis.tcl:543-549", "expected": "AUTO_PAUSE when interpreter is not idle; AUTO_RESUME when paused" }, { "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-input", "action": "mdi-input", "sourceSymbol": "commands.mdi_command.entry", "sourceLines": "axis.py:2413-2417,2499-2516", "expected": "edit pending MDI command text before submit/history execution" }, { "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", "toggle-auto-manual", "pause-resume", "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-input", "mdi-form", "mdi-history", "kins-identity", "kins-tcp", "kins-userk" ], "missingActions": [], "buttonCount": 63, "sourceReferencedCount": 63, "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", "toggle-auto-manual", "pause-resume", "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-input", "mdi-form", "mdi-history", "kins-identity", "kins-tcp", "kins-userk" ], "missingActions": [], "buttonCount": 63, "sourceReferencedCount": 63, "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": [] } }, { "category": "source-manifest", "requirement": "T-051 LinuxCNC source tree authority manifest is complete", "status": "pass", "evidence": { "status": "pass", "nativeFileCount": 23, "nativeMissingCount": 0, "webFileCount": 20, "nativeRoles": [ "axis-source", "demo-program", "desktop-entry", "halcmd", "ini", "kinematics-source", "ngcgui-subroutine", "parameter-file", "postgui-hal", "pyvcp", "remap", "runtime-artifact", "runtime-entry", "tool-table", "vismach-source" ] } }, { "category": "runtime-launch", "requirement": "T-052 native/Web launch entrypoints and runtime environment are recorded", "status": "pass", "evidence": { "status": "pass", "nativeEntrypoints": { "ripEnvironment": "/home/mes123456/cnc_wams/linuxcnc/scripts/rip-environment", "linuxcnc": "/home/mes123456/cnc_wams/linuxcnc/scripts/linuxcnc", "axis": "/home/mes123456/cnc_wams/linuxcnc/bin/axis", "vismach": "/home/mes123456/cnc_wams/linuxcnc/bin/xyzbc-trt-gui", "desktop": "/home/mes123456/cnc_wams/linuxcnc/linuxcnc-rtcp-5axis-shortcuts/table-rotary-tilting/xyzbc-trt.desktop" }, "webEntrypoints": { "app": "app/index.html", "devServer": "npm --prefix web-rtcp-5axis-xyzbc-trt-sim-plan/app run dev", "staticBuild": "npm --prefix web-rtcp-5axis-xyzbc-trt-sim-plan/app run build" } } }, { "category": "ini-full", "requirement": "T-053 complete INI section/key coverage matches native baseline", "status": "pass", "evidence": { "status": "pass", "nativeSectionCount": 21, "webSectionCount": 21, "nativeKeyCount": 124, "webKeyCount": 124 } }, { "category": "hal-graph", "requirement": "T-054 HAL source graph and runtime pin model are present", "status": "pass", "evidence": { "status": "pass", "nativeCommandCount": 172, "webCommandCount": 23, "nativeRuntimePins": 15, "webRuntimePins": 13 } }, { "category": "kinematics", "requirement": "T-055 xyzbc-trt kinematics formula evidence and sample validation are present", "status": "pass", "evidence": { "status": "pass", "nativeReady": true, "webReady": true, "nativeBoundary": "source_formula_references_plus_xyzbc_sample_validation", "webBoundary": "web_xyzbc_kinematics_formula_sample_validation" } }, { "category": "remap", "requirement": "T-056 M428/M429/M430 remap semantics are source-checked", "status": "pass", "evidence": { "status": "pass", "nativeReady": true, "webReady": true, "nativeBoundary": "m428_m429_m430_remap_semantics_source_checked", "webBoundary": "web_m428_m429_m430_remap_semantics" } }, { "category": "pyvcp-postgui", "requirement": "T-057 PyVCP POSTGUI HAL full chain is represented", "status": "pass", "evidence": { "status": "pass", "nativeReady": true, "webReady": true, "nativeBoundary": "pyvcp_xml_postgui_hal_full_chain", "webBoundary": "web_pyvcp_postgui_hal_chain" } }, { "category": "axis-ui", "requirement": "T-058 AXIS UI source behavior references are represented", "status": "pass", "evidence": { "status": "pass", "nativeReady": true, "webReady": true, "nativeBoundary": "native_axis_py_ui_behavior_source_reference", "webBoundary": "web_axis_ui_source_referenced_behavior" } }, { "category": "vismach", "requirement": "T-059 Vismach transform tree evidence is represented", "status": "pass", "evidence": { "status": "pass", "nativeReady": true, "webReady": true, "nativeBoundary": "native_vismach_transform_tree_source_reference", "webBoundary": "web_vismach_transform_tree_strict" } }, { "category": "timing", "requirement": "T-060 servo/task timing and 50ms sampling budget are represented", "status": "pass", "evidence": { "status": "pass", "native": { "ready": true, "servoPeriodNs": 1000000, "taskCycleTimeSeconds": 0.01, "samplePeriodMs": 50, "runtimeEventCount": 3, "runtimeSampleDeltasMs": [ 50, 51 ], "runtimeDeltaMinMs": 50, "runtimeDeltaMaxMs": 51, "semanticBoundary": "native_servo_task_timing_and_50ms_sampling_budget" }, "web": { "ready": true, "samplePeriodMs": 50, "taskCycleTimeSeconds": 0.01, "servoPeriodNs": 1000000, "runtimeSampleCount": 228, "semanticBoundary": "web_servo_task_timing_budget" } } }, { "category": "runtime-execution", "requirement": "T-061 true runtime execution samples are separated from source-derived expansion", "status": "pass", "evidence": { "status": "pass", "nativeRuntimeStatus": "completed", "nativeRuntimeEventCount": 3, "webRuntimeSampleCount": 228, "nativeSourceDerivedSampleCount": 1300, "webSourceDerivedSampleCount": 1300 } }, { "category": "staging-hash", "requirement": "T-062 Web staged file hashes match native source manifest for staged files", "status": "pass", "evidence": { "status": "pass", "commonFileCount": 12, "mismatchCount": 0, "mismatches": [] } }, { "category": "wasm-source", "requirement": "T-063 WASM artifacts are bound to source and have hashes", "status": "pass", "evidence": { "status": "pass", "artifactCount": 8, "sourceManifestSha256": "da59feae2d963a410e7f8fdf968a2238f5ca2b3c7bf7a6c6e408ea28f514fbef" } }, { "category": "task-hal-full", "requirement": "T-064 task/HAL full state fields are represented", "status": "pass", "evidence": { "status": "pass", "nativeReady": true, "webReady": true, "nativeBoundary": "native_task_hal_full_state_snapshot", "webBoundary": "web_task_hal_full_state" } }, { "category": "limits", "requirement": "T-065 TRAJ/AXIS/JOINT limits and interlocks are represented", "status": "pass", "evidence": { "status": "pass", "nativeReady": true, "webReady": true, "nativeBoundary": "traj_axis_joint_limits_and_interlock_source", "webBoundary": "web_axis_joint_limits_and_interlocks" } }, { "category": "tool-parameters", "requirement": "T-066 tool table and parameter file persistence are represented", "status": "pass", "evidence": { "status": "pass", "nativeReady": true, "webReady": true, "nativeBoundary": "tool_table_parameter_file_persistence_native_source", "webBoundary": "web_tool_table_parameter_persistence" } }, { "category": "program-corpus", "requirement": "T-067 Ngcgui and demo program corpus execution is represented", "status": "pass", "evidence": { "status": "pass", "nativeReady": true, "webReady": true, "nativeBoundary": "ngcgui_and_demo_program_corpus_source_runtime_coverage", "webBoundary": "web_program_corpus_execution" } }, { "category": "visual", "requirement": "T-068 native/Web visual evidence paths are present", "status": "pass", "evidence": { "status": "pass", "nativeReady": true, "webReady": true, "nativeBoundary": "native_web_visual_evidence_paths_for_same_state_review", "webBoundary": "web_visual_evidence_paths" } }, { "category": "errors", "requirement": "T-069 error path parity matrix is represented", "status": "pass", "evidence": { "status": "pass", "nativeReady": true, "webReady": true, "nativeBoundary": "native_web_error_path_and_message_parity_matrix", "webBoundary": "web_error_path_matrix" } }, { "category": "dual-baseline", "requirement": "T-070 compare JSON contains source/runtime dual baseline sections", "status": "pass", "evidence": { "status": "pass", "sections": [ "sourceManifestComparison", "runtimeLaunchComparison", "halGraphComparison", "iniFullComparison", "kinematicsFormulaComparison", "uiBehaviorComparison", "visualComparison" ] } }, { "category": "classification", "requirement": "T-071 evidence classification prevents static derivation being labeled runtime", "status": "pass", "evidence": { "status": "pass", "native": { "ready": true, "sourceDerived": [ "sourceManifest", "iniFull", "halGraph.sourceFiles", "semanticExecutionPath" ], "runtimeObserved": [ "linuxcncRuntime.processes", "before", "after", "hal.raw" ], "runtimeSampled": [ "commandResult.events" ], "rule": "runtimeSampled fields must come from linuxcnc stat/HAL/log channels; source expansion remains explicitly sourceDerived.", "semanticBoundary": "explicit_no_static_derivation_as_runtime_observation" }, "web": { "ready": true, "sourceDerived": [ "sourceManifest", "iniFull", "semanticExecutionPath" ], "runtimeObserved": [ "taskHalEquivalence", "state", "paths.executionPath" ], "runtimeSampled": [ "executionPath.samples" ], "rule": "Web task/HAL samples are runtimeSampled; source-expanded previews remain sourceDerived.", "semanticBoundary": "web_runtime_classification_no_static_as_runtime" } } }, { "category": "rerun", "requirement": "T-072 one-command rerun entrypoint is recorded", "status": "pass", "evidence": { "status": "pass", "nativeRerunCommand": "npm --prefix web-rtcp-5axis-xyzbc-trt-sim-plan/app run evidence:web && npm --prefix web-rtcp-5axis-xyzbc-trt-sim-plan/app run evidence:compare", "webEvidenceFiles": [ "working/evidence/native-xyzbc-trt-evidence.json", "working/evidence/web-xyzbc-trt-evidence.json", "working/evidence/compare-xyzbc-trt-evidence.json" ] } }, { "category": "reverse-index", "requirement": "T-073 reverse source index is present", "status": "pass", "evidence": { "status": "pass", "nativeReady": true, "webReady": true, "nativeBoundary": "working_conclusions_reverse_index_to_linuxcnc_source_lines_and_web_files", "webBoundary": "web_reverse_source_index" } }, { "category": "performance", "requirement": "T-074 performance/error budget is represented and current geometric errors fit", "status": "pass", "evidence": { "status": "pass", "maxTcpErrorMm": 3.552713678800501e-15, "maxJointError": 3.552713678800501e-15, "maxToolAxisAngleDeg": 0, "sampleCountDelta": 0 } }, { "category": "strict-acceptance", "requirement": "T-075 strict acceptance freeze metadata is present", "status": "pass", "evidence": { "status": "pass", "nativeReady": true, "webReady": true, "nativeBoundary": "strict_acceptance_freeze_manifest_evidence_compare", "webBoundary": "web_strict_acceptance_freeze" } } ], "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" }, "sourceManifestComparison": { "status": "pass", "nativeFileCount": 23, "nativeMissingCount": 0, "webFileCount": 20, "nativeRoles": [ "axis-source", "demo-program", "desktop-entry", "halcmd", "ini", "kinematics-source", "ngcgui-subroutine", "parameter-file", "postgui-hal", "pyvcp", "remap", "runtime-artifact", "runtime-entry", "tool-table", "vismach-source" ] }, "runtimeLaunchComparison": { "status": "pass", "nativeEntrypoints": { "ripEnvironment": "/home/mes123456/cnc_wams/linuxcnc/scripts/rip-environment", "linuxcnc": "/home/mes123456/cnc_wams/linuxcnc/scripts/linuxcnc", "axis": "/home/mes123456/cnc_wams/linuxcnc/bin/axis", "vismach": "/home/mes123456/cnc_wams/linuxcnc/bin/xyzbc-trt-gui", "desktop": "/home/mes123456/cnc_wams/linuxcnc/linuxcnc-rtcp-5axis-shortcuts/table-rotary-tilting/xyzbc-trt.desktop" }, "webEntrypoints": { "app": "app/index.html", "devServer": "npm --prefix web-rtcp-5axis-xyzbc-trt-sim-plan/app run dev", "staticBuild": "npm --prefix web-rtcp-5axis-xyzbc-trt-sim-plan/app run build" } }, "halGraphComparison": { "status": "pass", "nativeCommandCount": 172, "webCommandCount": 23, "nativeRuntimePins": 15, "webRuntimePins": 13 }, "iniFullComparison": { "status": "pass", "nativeSectionCount": 21, "webSectionCount": 21, "nativeKeyCount": 124, "webKeyCount": 124 }, "kinematicsFormulaComparison": { "status": "pass", "nativeReady": true, "webReady": true, "nativeBoundary": "source_formula_references_plus_xyzbc_sample_validation", "webBoundary": "web_xyzbc_kinematics_formula_sample_validation" }, "uiBehaviorComparison": { "status": "pass", "nativeReady": true, "webReady": true, "nativeBoundary": "native_axis_py_ui_behavior_source_reference", "webBoundary": "web_axis_ui_source_referenced_behavior" }, "visualComparison": { "status": "pass", "nativeReady": true, "webReady": true, "nativeBoundary": "native_vismach_transform_tree_source_reference", "webBoundary": "web_vismach_transform_tree_strict" }, "strictComparison": { "sourceManifestComparison": { "status": "pass", "nativeFileCount": 23, "nativeMissingCount": 0, "webFileCount": 20, "nativeRoles": [ "axis-source", "demo-program", "desktop-entry", "halcmd", "ini", "kinematics-source", "ngcgui-subroutine", "parameter-file", "postgui-hal", "pyvcp", "remap", "runtime-artifact", "runtime-entry", "tool-table", "vismach-source" ] }, "runtimeLaunchComparison": { "status": "pass", "nativeEntrypoints": { "ripEnvironment": "/home/mes123456/cnc_wams/linuxcnc/scripts/rip-environment", "linuxcnc": "/home/mes123456/cnc_wams/linuxcnc/scripts/linuxcnc", "axis": "/home/mes123456/cnc_wams/linuxcnc/bin/axis", "vismach": "/home/mes123456/cnc_wams/linuxcnc/bin/xyzbc-trt-gui", "desktop": "/home/mes123456/cnc_wams/linuxcnc/linuxcnc-rtcp-5axis-shortcuts/table-rotary-tilting/xyzbc-trt.desktop" }, "webEntrypoints": { "app": "app/index.html", "devServer": "npm --prefix web-rtcp-5axis-xyzbc-trt-sim-plan/app run dev", "staticBuild": "npm --prefix web-rtcp-5axis-xyzbc-trt-sim-plan/app run build" } }, "iniFullComparison": { "status": "pass", "nativeSectionCount": 21, "webSectionCount": 21, "nativeKeyCount": 124, "webKeyCount": 124 }, "halGraphComparison": { "status": "pass", "nativeCommandCount": 172, "webCommandCount": 23, "nativeRuntimePins": 15, "webRuntimePins": 13 }, "kinematicsFormulaComparison": { "status": "pass", "nativeReady": true, "webReady": true, "nativeBoundary": "source_formula_references_plus_xyzbc_sample_validation", "webBoundary": "web_xyzbc_kinematics_formula_sample_validation" }, "remapSemanticsComparison": { "status": "pass", "nativeReady": true, "webReady": true, "nativeBoundary": "m428_m429_m430_remap_semantics_source_checked", "webBoundary": "web_m428_m429_m430_remap_semantics" }, "pyvcpPostguiComparison": { "status": "pass", "nativeReady": true, "webReady": true, "nativeBoundary": "pyvcp_xml_postgui_hal_full_chain", "webBoundary": "web_pyvcp_postgui_hal_chain" }, "axisUiBehaviorComparison": { "status": "pass", "nativeReady": true, "webReady": true, "nativeBoundary": "native_axis_py_ui_behavior_source_reference", "webBoundary": "web_axis_ui_source_referenced_behavior" }, "visualComparison": { "status": "pass", "nativeReady": true, "webReady": true, "nativeBoundary": "native_vismach_transform_tree_source_reference", "webBoundary": "web_vismach_transform_tree_strict" }, "servoTaskTimingComparison": { "status": "pass", "native": { "ready": true, "servoPeriodNs": 1000000, "taskCycleTimeSeconds": 0.01, "samplePeriodMs": 50, "runtimeEventCount": 3, "runtimeSampleDeltasMs": [ 50, 51 ], "runtimeDeltaMinMs": 50, "runtimeDeltaMaxMs": 51, "semanticBoundary": "native_servo_task_timing_and_50ms_sampling_budget" }, "web": { "ready": true, "samplePeriodMs": 50, "taskCycleTimeSeconds": 0.01, "servoPeriodNs": 1000000, "runtimeSampleCount": 228, "semanticBoundary": "web_servo_task_timing_budget" } }, "runtimeExecutionComparison": { "status": "pass", "nativeRuntimeStatus": "completed", "nativeRuntimeEventCount": 3, "webRuntimeSampleCount": 228, "nativeSourceDerivedSampleCount": 1300, "webSourceDerivedSampleCount": 1300 }, "webStagingHashComparison": { "status": "pass", "commonFileCount": 12, "mismatchCount": 0, "mismatches": [] }, "wasmSourceBindingComparison": { "status": "pass", "artifactCount": 8, "sourceManifestSha256": "da59feae2d963a410e7f8fdf968a2238f5ca2b3c7bf7a6c6e408ea28f514fbef" }, "taskHalFullStateComparison": { "status": "pass", "nativeReady": true, "webReady": true, "nativeBoundary": "native_task_hal_full_state_snapshot", "webBoundary": "web_task_hal_full_state" }, "limitInterlocksComparison": { "status": "pass", "nativeReady": true, "webReady": true, "nativeBoundary": "traj_axis_joint_limits_and_interlock_source", "webBoundary": "web_axis_joint_limits_and_interlocks" }, "toolParameterComparison": { "status": "pass", "nativeReady": true, "webReady": true, "nativeBoundary": "tool_table_parameter_file_persistence_native_source", "webBoundary": "web_tool_table_parameter_persistence" }, "programCorpusComparison": { "status": "pass", "nativeReady": true, "webReady": true, "nativeBoundary": "ngcgui_and_demo_program_corpus_source_runtime_coverage", "webBoundary": "web_program_corpus_execution" }, "nativeWebVisualComparison": { "status": "pass", "nativeReady": true, "webReady": true, "nativeBoundary": "native_web_visual_evidence_paths_for_same_state_review", "webBoundary": "web_visual_evidence_paths" }, "errorPathComparison": { "status": "pass", "nativeReady": true, "webReady": true, "nativeBoundary": "native_web_error_path_and_message_parity_matrix", "webBoundary": "web_error_path_matrix" }, "dualBaselineComparison": { "status": "pass", "sections": [ "sourceManifestComparison", "runtimeLaunchComparison", "halGraphComparison", "iniFullComparison", "kinematicsFormulaComparison", "uiBehaviorComparison", "visualComparison" ] }, "evidenceClassificationComparison": { "status": "pass", "native": { "ready": true, "sourceDerived": [ "sourceManifest", "iniFull", "halGraph.sourceFiles", "semanticExecutionPath" ], "runtimeObserved": [ "linuxcncRuntime.processes", "before", "after", "hal.raw" ], "runtimeSampled": [ "commandResult.events" ], "rule": "runtimeSampled fields must come from linuxcnc stat/HAL/log channels; source expansion remains explicitly sourceDerived.", "semanticBoundary": "explicit_no_static_derivation_as_runtime_observation" }, "web": { "ready": true, "sourceDerived": [ "sourceManifest", "iniFull", "semanticExecutionPath" ], "runtimeObserved": [ "taskHalEquivalence", "state", "paths.executionPath" ], "runtimeSampled": [ "executionPath.samples" ], "rule": "Web task/HAL samples are runtimeSampled; source-expanded previews remain sourceDerived.", "semanticBoundary": "web_runtime_classification_no_static_as_runtime" } }, "rerunEntryComparison": { "status": "pass", "nativeRerunCommand": "npm --prefix web-rtcp-5axis-xyzbc-trt-sim-plan/app run evidence:web && npm --prefix web-rtcp-5axis-xyzbc-trt-sim-plan/app run evidence:compare", "webEvidenceFiles": [ "working/evidence/native-xyzbc-trt-evidence.json", "working/evidence/web-xyzbc-trt-evidence.json", "working/evidence/compare-xyzbc-trt-evidence.json" ] }, "reverseSourceIndexComparison": { "status": "pass", "nativeReady": true, "webReady": true, "nativeBoundary": "working_conclusions_reverse_index_to_linuxcnc_source_lines_and_web_files", "webBoundary": "web_reverse_source_index" }, "performanceBudgetComparison": { "status": "pass", "maxTcpErrorMm": 3.552713678800501e-15, "maxJointError": 3.552713678800501e-15, "maxToolAxisAngleDeg": 0, "sampleCountDelta": 0 }, "strictAcceptanceComparison": { "status": "pass", "nativeReady": true, "webReady": true, "nativeBoundary": "strict_acceptance_freeze_manifest_evidence_compare", "webBoundary": "web_strict_acceptance_freeze" } }, "requiredImprovements": [], "semanticBoundary": "native_linuxcnc_vs_web_opfs_wasm_xyzbc_trt_evidence_comparison" }