diff --git a/coverage/task-packets/TP-PARITY-00.handoff.json b/coverage/task-packets/TP-PARITY-00.handoff.json index c8ee3da..6b7a1ca 100644 --- a/coverage/task-packets/TP-PARITY-00.handoff.json +++ b/coverage/task-packets/TP-PARITY-00.handoff.json @@ -5,7 +5,7 @@ "status": "blocked", "scope": "xyzac_only", "result": "run-5axis-rtcp.sh launches native LinuxCNC services and AXIS, but linuxcnc.stat cannot attach to the launcher status buffer on this host; no native per-tick oracle was generated", - "report": {"path": "coverage/xyzac-native-tick-trace.report.json", "status": "blocked"}, + "report": {"path": "coverage/xyzac-native-tick-trace.report.json", "status": "blocked", "sha256": "86d13e1a715c20b2a7bfc243301b46780a9f2942bd96d928c5ae24a53dbcca71"}, "outputs": [ {"path": "scripts/run_xyzac_native_tick_trace.py", "status": "created"}, {"path": "doc-rtcp/xyzac-trt-full-tp-parity-plan.md", "status": "created"}, @@ -15,13 +15,15 @@ "launcher": "run-5axis-rtcp.sh started native linuxcncsvr/io/halui/milltask/axis", "axis_window": "visible during manual probe", "stat_attach": "blocked: emcStatusBuffer invalid err=3 / taskbeat invalid", + "python_module": "blocked: installed 2.10.0~pre1 extension differs from source 2.10.0~pre0 launcher", "native_trace": "blocked", "source_hashes": "recorded by collector", "full_parity_claim": "forbidden" }, "failure_samples": [ {"code": "NATIVE_STAT_BUFFER_INVALID", "detail": "linuxcnc.stat().poll() returned emcStatusBuffer invalid err=3 or SystemError without exception while run-5axis-rtcp.sh services were alive"}, - {"code": "NATIVE_TASKBEAT_INVALID", "detail": "taskbeat remained 4294967296 and no valid native tick could be selected"} + {"code": "NATIVE_TASKBEAT_INVALID", "detail": "taskbeat remained 4294967296 and no valid native tick could be selected"}, + {"code": "NATIVE_PYTHON_MODULE_MISMATCH", "detail": "collector imported /usr/lib/python3/dist-packages/linuxcnc.cpython-312-x86_64-linux-gnu.so while run-5axis-rtcp.sh uses the source 2.10.0~pre0 launcher"} ], "next_task": "TP-PARITY-01", "next_task_status": "blocked_by_TP-PARITY-00", diff --git a/coverage/task-packets/TP-PARITY-00.json b/coverage/task-packets/TP-PARITY-00.json index e0ef44a..be144c3 100644 --- a/coverage/task-packets/TP-PARITY-00.json +++ b/coverage/task-packets/TP-PARITY-00.json @@ -27,7 +27,7 @@ ], "observed": { "report": "coverage/xyzac-native-tick-trace.report.json", - "report_sha256": "812a0bb8de8438aa18bc16789c40a33bcaadfaf3fcdc704ecf109c4b77bfdbfd", + "report_sha256": "86d13e1a715c20b2a7bfc243301b46780a9f2942bd96d928c5ae24a53dbcca71", "row_count": 0, "first_blocker": "NATIVE_STAT_BUFFER_INVALID" }, diff --git a/coverage/xyzac-native-tick-trace.report.json b/coverage/xyzac-native-tick-trace.report.json index 2f54893..f5fea28 100644 --- a/coverage/xyzac-native-tick-trace.report.json +++ b/coverage/xyzac-native-tick-trace.report.json @@ -45,19 +45,21 @@ "remaining_services": [] }, "errors": [ - "RuntimeError:native_stat_transition_timeout" + "RuntimeError:native_stat_transition_timeout", + "NATIVE_PYTHON_MODULE_MISMATCH" ], "known_boundaries": [ "native stat exposes motion_id but not full TP segment geometry; active_segment_geometry is explicit null", "taskbeat is the public native task-cycle counter; wall-clock is recorded only as diagnostic elapsed_ms", + "source run-in-place launcher and installed Python extension must use the same LinuxCNC build; mismatch is blocked", "this report is an oracle input and does not claim native/WASM parity by itself" ], "launcher": [ "./run-5axis-rtcp.sh", "xyzac-trt.ini" ], - "launcher_output_sha256": "8e18cd62ead0174b8c9c7c70b4fa62716ee066bb0984de99e288322ae6aecaa2", - "launcher_output_tail": "Starting 5-axis RTCP case: /home/mes006/linuxcncWebWASM/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini\nDemo program: /home/mes006/linuxcncWebWASM/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins.ngc\nRTCP subroutine: /home/mes006/linuxcncWebWASM/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/helix_ac.ngc\nMachine configuration file is 'xyzac-trt.ini'\ncheck_config: Unchecked: [KINS]KINEMATICS={xyzac-trt-kins sparm=identityfirst}\nStarting LinuxCNC...\nlinuxcnc TPMOD=tpmod HOMEMOD=homemod EMCMOT=motmod\nNote: Using POSIX non-realtime\nFound file(LIB): /home/mes006/linuxcncWebWASM/linuxcnc/lib/hallib/basic_sim.tcl\nsetup_kins: cmd=loadrt xyzac-trt-kins sparm=identityfirst\nnote: MAXV max: 1000.000 units/sec 60000.000 units/min\nnote: LJOG max: 1000.000 units/sec 60000.000 units/min\nnote: LJOG default: 20.000 units/sec 1200.000 units/min\nnote: AJOG max: 360.000 units/sec 21600.000 units/min\nnote: AJOG default: 360.000 units/sec 21600.000 units/min\nnote: jog_order='XYZC'\nnote: jog_invert=set()\ntask: 0 cycles, min=0.000004, max=0.062398, avg=-1.000000, 0 latency excursions (> 10x expected cycle time of 0.010000s)\nTraceback (most recent call last):\n File \"/home/mes006/linuxcncWebWASM/linuxcnc/bin/axis\", line 4249, in \n o.mainloop()\n File \"/usr/lib/python3.12/tkinter/__init__.py\", line 1504, in mainloop\n self.tk.mainloop(n)\n File \"/usr/lib/python3.12/tkinter/__init__.py\", line 1962, in __call__\n def __call__(self, *args):\n\nKeyboardInterrupt\nShutting down and cleaning up LinuxCNC...\n\n!!! switchkins-type 0 is IDENTITY\n\nidentityKinematicsSetup: coordinates:xyzac\n Joint 0 ==> Axis X\n Joint 1 ==> Axis Y\n Joint 2 ==> Axis Z\n Joint 3 ==> Axis A\n Joint 4 ==> Axis C\n\nxyzac-trt-kins coordinates=xyzac assigns:\n Joint 0 ==> Axis X\n Joint 1 ==> Axis Y\n Joint 2 ==> Axis Z\n Joint 3 ==> Axis A\n Joint 4 ==> Axis C\n\nuserkKinematicsSetup:\n emc/kinematics/userkfuncs.c max_joints=16 allow_duplicates=1\n\nNote: Using POSIX non-realtime", + "launcher_output_sha256": "016a93120b82e66cf4161d61ef01fc751347479a7c709a1e12f8835001f8a86d", + "launcher_output_tail": "Starting 5-axis RTCP case: /home/mes006/linuxcncWebWASM/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/xyzac-trt.ini\nDemo program: /home/mes006/linuxcncWebWASM/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/demos/xyzac_switchkins.ngc\nRTCP subroutine: /home/mes006/linuxcncWebWASM/linuxcnc/configs/sim/axis/vismach/5axis/table-rotary-tilting/remap_subs/helix_ac.ngc\nMachine configuration file is 'xyzac-trt.ini'\ncheck_config: Unchecked: [KINS]KINEMATICS={xyzac-trt-kins sparm=identityfirst}\nStarting LinuxCNC...\nlinuxcnc TPMOD=tpmod HOMEMOD=homemod EMCMOT=motmod\nNote: Using POSIX non-realtime\nFound file(LIB): /home/mes006/linuxcncWebWASM/linuxcnc/lib/hallib/basic_sim.tcl\nsetup_kins: cmd=loadrt xyzac-trt-kins sparm=identityfirst\nnote: MAXV max: 1000.000 units/sec 60000.000 units/min\nnote: LJOG max: 1000.000 units/sec 60000.000 units/min\nnote: LJOG default: 20.000 units/sec 1200.000 units/min\nnote: AJOG max: 360.000 units/sec 21600.000 units/min\nnote: AJOG default: 360.000 units/sec 21600.000 units/min\nnote: jog_order='XYZC'\nnote: jog_invert=set()\ntask: main loop took 0.119082 seconds\ntask: 0 cycles, min=0.000003, max=0.119082, avg=-1.000000, 1 latency excursions (> 10x expected cycle time of 0.010000s)\nTraceback (most recent call last):\n File \"/home/mes006/linuxcncWebWASM/linuxcnc/bin/axis\", line 4249, in \n o.mainloop()\n File \"/usr/lib/python3.12/tkinter/__init__.py\", line 1504, in mainloop\n self.tk.mainloop(n)\n File \"/usr/lib/python3.12/tkinter/__init__.py\", line 1962, in __call__\n def __call__(self, *args):\n\nKeyboardInterrupt\nShutting down and cleaning up LinuxCNC...\n\n!!! switchkins-type 0 is IDENTITY\n\nidentityKinematicsSetup: coordinates:xyzac\n Joint 0 ==> Axis X\n Joint 1 ==> Axis Y\n Joint 2 ==> Axis Z\n Joint 3 ==> Axis A\n Joint 4 ==> Axis C\n\nxyzac-trt-kins coordinates=xyzac assigns:\n Joint 0 ==> Axis X\n Joint 1 ==> Axis Y\n Joint 2 ==> Axis Z\n Joint 3 ==> Axis A\n Joint 4 ==> Axis C\n\nuserkKinematicsSetup:\n emc/kinematics/userkfuncs.c max_joints=16 allow_duplicates=1\n\nNote: Using POSIX non-realtime", "native_axis_window": { "height": 1377, "raw": "0x4c0001f \"AXIS 2.10.0~pre0 on sim-xyzac-trt-kins (switchkins) (no file)\": (\"axis\" \"Axis\") 1552x1377+28+98 +280+286", @@ -66,6 +68,7 @@ }, "native_linuxcnc": { "display": ":1", + "expected_source_python_module": "/home/mes006/linuxcncWebWASM/linuxcnc/lib/python/linuxcnc.so", "python_module": "/usr/lib/python3/dist-packages/linuxcnc.cpython-312-x86_64-linux-gnu.so" }, "program": { @@ -73,7 +76,7 @@ "sha256": "5afc03d5c1b692edd4154a6d37e5f94d74936a7bd5e82dc9c022f7bc21c7dc17" }, "release_status": "STOP_RELEASE", - "report_sha256": "812a0bb8de8438aa18bc16789c40a33bcaadfaf3fcdc704ecf109c4b77bfdbfd", + "report_sha256": "86d13e1a715c20b2a7bfc243301b46780a9f2942bd96d928c5ae24a53dbcca71", "row_count": 0, "rows": [], "schema": "xyzac-native-linuxcnc-tick-trace.v1", diff --git a/scripts/run_xyzac_native_tick_trace.py b/scripts/run_xyzac_native_tick_trace.py index 125d9ec..1e79bcf 100644 --- a/scripts/run_xyzac_native_tick_trace.py +++ b/scripts/run_xyzac_native_tick_trace.py @@ -223,6 +223,10 @@ def run(duration: float) -> dict[str, Any]: source_bytes = PROGRAM.read_bytes() trace_hash = sha256_bytes(canonical(rows).encode()) + python_module = getattr(linuxcnc, "__file__", None) + source_python_module = str(ROOT / "linuxcnc/lib/python/linuxcnc.so") + if python_module != source_python_module: + errors.append("NATIVE_PYTHON_MODULE_MISMATCH") status = "verified" if rows and not errors else "blocked" return { "schema": SCHEMA, @@ -231,7 +235,7 @@ def run(duration: float) -> dict[str, Any]: "launcher": command, "native_axis_window": window, "program": {"path": PROGRAM.relative_to(ROOT).as_posix(), "sha256": sha256_bytes(source_bytes)}, - "native_linuxcnc": {"python_module": getattr(linuxcnc, "__file__", None), "display": environment["DISPLAY"]}, + "native_linuxcnc": {"python_module": python_module, "expected_source_python_module": source_python_module, "display": environment["DISPLAY"]}, "tick_source": "linuxcnc.stat.taskbeat", "rows": rows, "row_count": len(rows), @@ -243,6 +247,7 @@ def run(duration: float) -> dict[str, Any]: "known_boundaries": [ "native stat exposes motion_id but not full TP segment geometry; active_segment_geometry is explicit null", "taskbeat is the public native task-cycle counter; wall-clock is recorded only as diagnostic elapsed_ms", + "source run-in-place launcher and installed Python extension must use the same LinuxCNC build; mismatch is blocked", "this report is an oracle input and does not claim native/WASM parity by itself", ], "release_status": "STOP_RELEASE",