devagent-physical-engine 1.8.0__tar.gz → 1.8.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (245) hide show
  1. {devagent_physical_engine-1.8.0/src/devagent_physical_engine.egg-info → devagent_physical_engine-1.8.1}/PKG-INFO +15 -6
  2. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/README.md +14 -5
  3. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/pyproject.toml +2 -2
  4. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/__init__.py +3 -1
  5. devagent_physical_engine-1.8.1/src/devagent_physical_engine/controller_runtime_hotfix_v181.py +93 -0
  6. devagent_physical_engine-1.8.1/src/devagent_physical_engine/ros2/controller_action_probe.py +165 -0
  7. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1/src/devagent_physical_engine.egg-info}/PKG-INFO +15 -6
  8. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine.egg-info/SOURCES.txt +3 -0
  9. devagent_physical_engine-1.8.1/tests/test_controller_runtime_hotfix_v181.py +194 -0
  10. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_industrial_motion_v170.py +2 -2
  11. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_ros_trajectory_v09.py +82 -43
  12. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_transfer_place_diagnostic_v172.py +1 -1
  13. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/NOTICE +0 -0
  14. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/setup.cfg +0 -0
  15. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/__init__.py +0 -0
  16. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/compiler.py +0 -0
  17. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/contracts.py +0 -0
  18. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/coordinator.py +0 -0
  19. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/critic.py +0 -0
  20. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/evidence.py +0 -0
  21. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/interpreter.py +0 -0
  22. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/planner.py +0 -0
  23. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/recovery.py +0 -0
  24. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/routing.py +0 -0
  25. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/runtime.py +0 -0
  26. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/semantic.py +0 -0
  27. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/structured.py +0 -0
  28. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ai_cli.py +0 -0
  29. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/cli.py +0 -0
  30. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/commercial.py +0 -0
  31. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/commercial_campaign.py +0 -0
  32. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/commercial_cli.py +0 -0
  33. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/commercial_importer.py +0 -0
  34. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/commercial_intelligence.py +0 -0
  35. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/commercial_readiness.py +0 -0
  36. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/commercial_repository.py +0 -0
  37. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/continuous_clearance.py +0 -0
  38. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/doctor.py +0 -0
  39. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/engineering_agent.py +0 -0
  40. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/engineering_request.py +0 -0
  41. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/evidence_replay.py +0 -0
  42. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/evidence_trust.py +0 -0
  43. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/execution.py +0 -0
  44. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/industrial_motion_hotfix_v170.py +0 -0
  45. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/industrial_motion_v170.py +0 -0
  46. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/models.py +0 -0
  47. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/one_command.py +0 -0
  48. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/one_command_runtime.py +0 -0
  49. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/one_command_v15.py +0 -0
  50. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/one_command_v16.py +0 -0
  51. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/operating_envelope.py +0 -0
  52. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/optimization/__init__.py +0 -0
  53. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/optimization/benchmark.py +0 -0
  54. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/optimization/candidates.py +0 -0
  55. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/optimization/contracts.py +0 -0
  56. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/optimization/evaluator.py +0 -0
  57. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/optimization/evidence.py +0 -0
  58. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/optimization/experience.py +0 -0
  59. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/optimization/measured.py +0 -0
  60. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/optimization/optimizer.py +0 -0
  61. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/optimization/orchestrator.py +0 -0
  62. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/physical_campaign.py +0 -0
  63. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/physical_evidence.py +0 -0
  64. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/physical_motion.py +0 -0
  65. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/planning.py +0 -0
  66. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/pose_math.py +0 -0
  67. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/preexecution_contract.py +0 -0
  68. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/production_authority.py +0 -0
  69. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/production_grade.py +0 -0
  70. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/project.py +0 -0
  71. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/provider_adapters/__init__.py +0 -0
  72. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/provider_adapters/anthropic.py +0 -0
  73. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/provider_adapters/common.py +0 -0
  74. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/provider_adapters/factory.py +0 -0
  75. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/provider_adapters/gemini.py +0 -0
  76. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/provider_adapters/openai.py +0 -0
  77. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/provider_criterion.py +0 -0
  78. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/provider_qualification.py +0 -0
  79. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/providers.py +0 -0
  80. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/qualification.py +0 -0
  81. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/qualification_cli.py +0 -0
  82. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/qualification_harness.py +0 -0
  83. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/reference_workcell.py +0 -0
  84. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/report_test_execution.py +0 -0
  85. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/report_test_execution_strict.py +0 -0
  86. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/robot_platform.py +0 -0
  87. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/robot_support_v18.py +0 -0
  88. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/robots.py +0 -0
  89. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/__init__.py +0 -0
  90. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/abb_irb1200.py +0 -0
  91. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/abb_irb1200_preview.py +0 -0
  92. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/acceptance.py +0 -0
  93. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/commands.py +0 -0
  94. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/continuous_clearance_probe.py +0 -0
  95. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/doctor.py +0 -0
  96. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/fk_pose.py +0 -0
  97. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/fk_probe.py +0 -0
  98. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/frame_alignment.py +0 -0
  99. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/gazebo_cli.py +0 -0
  100. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/gazebo_pose.py +0 -0
  101. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/gazebo_world.py +0 -0
  102. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v170.py +0 -0
  103. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v171.py +0 -0
  104. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v172.py +0 -0
  105. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/joint_state_probe.py +0 -0
  106. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/joint_state_recorder.py +0 -0
  107. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/measured_motion.py +0 -0
  108. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/moveit_joint_plan_probe.py +0 -0
  109. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/moveit_joint_plan_v161_probe.py +0 -0
  110. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/moveit_scene.py +0 -0
  111. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/moveit_task_planner.py +0 -0
  112. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/pilz_sequence_plan_probe.py +0 -0
  113. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/preexecution.py +0 -0
  114. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/qualification.py +0 -0
  115. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/qualification_v10.py +0 -0
  116. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/qualification_v11.py +0 -0
  117. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/qualification_v12.py +0 -0
  118. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/report_test_visualization.py +0 -0
  119. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/report_test_visualization_v170.py +0 -0
  120. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/scene_probe.py +0 -0
  121. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/state_validity_probe.py +0 -0
  122. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/support_contact_acm_probe_v170.py +0 -0
  123. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/support_contact_lease_v170.py +0 -0
  124. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/support_contact_runner_v161.py +0 -0
  125. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/support_contact_v161.py +0 -0
  126. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/task_adapter.py +0 -0
  127. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/task_visualization.py +0 -0
  128. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/tf_probe.py +0 -0
  129. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/tool_scene.py +0 -0
  130. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/tool_scene_probe.py +0 -0
  131. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/trajectory.py +0 -0
  132. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/trajectory_action_probe.py +0 -0
  133. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/trajectory_tracking.py +0 -0
  134. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/ur5e.py +0 -0
  135. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/ur5e_adapter.py +0 -0
  136. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/ur5e_v10_adapter.py +0 -0
  137. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/workpiece_follow.py +0 -0
  138. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/workpiece_gazebo_follower.py +0 -0
  139. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/workpiece_scene.py +0 -0
  140. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/workpiece_scene_probe.py +0 -0
  141. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/selective_verification.py +0 -0
  142. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/selective_verification_v16.py +0 -0
  143. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/setup_profile.py +0 -0
  144. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/sim_real_qualification.py +0 -0
  145. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/simulation.py +0 -0
  146. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/simulation_platform.py +0 -0
  147. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/smooth_motion_hotfix_v162.py +0 -0
  148. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/support_contact_hotfix_v161.py +0 -0
  149. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/tool_collision.py +0 -0
  150. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/trajectory_qualification.py +0 -0
  151. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/twin.py +0 -0
  152. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/twin_builder.py +0 -0
  153. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/twin_codec.py +0 -0
  154. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/twin_materialization.py +0 -0
  155. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/user_cli.py +0 -0
  156. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/user_cli_v15.py +0 -0
  157. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/user_cli_v16.py +0 -0
  158. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/user_cli_v18.py +0 -0
  159. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/verification.py +0 -0
  160. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/workpiece_lifecycle.py +0 -0
  161. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine.egg-info/dependency_links.txt +0 -0
  162. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine.egg-info/entry_points.txt +0 -0
  163. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine.egg-info/requires.txt +0 -0
  164. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine.egg-info/top_level.txt +0 -0
  165. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_abb_irb1200_visual_v18.py +0 -0
  166. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_agent_core.py +0 -0
  167. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_agent_semantic_hardening.py +0 -0
  168. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_ai_cli.py +0 -0
  169. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_ai_cli_v07.py +0 -0
  170. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_commercial_importer_v1.py +0 -0
  171. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_commercial_intelligence_v15.py +0 -0
  172. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_commercial_readiness_v1.py +0 -0
  173. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_commercial_v1.py +0 -0
  174. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_continuous_clearance_v011.py +0 -0
  175. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_core.py +0 -0
  176. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_engineering_request_v07.py +0 -0
  177. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_evidence_replay_v12.py +0 -0
  178. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_evidence_trust_coverage_v12.py +0 -0
  179. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_evidence_trust_transport_v12.py +0 -0
  180. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_evidence_trust_v12.py +0 -0
  181. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_evidence_viewer_palette_v130.py +0 -0
  182. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_gazebo_cli_v0122.py +0 -0
  183. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_golden_abb_runner_v171.py +0 -0
  184. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_golden_abb_showcase.py +0 -0
  185. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_interpreter_profiles_v08.py +0 -0
  186. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_joint_state_probe_v0125.py +0 -0
  187. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_live_provider_qualification.py +0 -0
  188. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_measured_motion_v10.py +0 -0
  189. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_moveit_planning_diagnostics_v0125.py +0 -0
  190. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_moveit_scene_v0123.py +0 -0
  191. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_natural_language_agent_v07.py +0 -0
  192. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_one_command_hardening_v13.py +0 -0
  193. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_one_command_pose_hardening_v15.py +0 -0
  194. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_one_command_regression_v141.py +0 -0
  195. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_one_command_v13.py +0 -0
  196. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_openai_strict_schema_v0113.py +0 -0
  197. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_optimization_v05.py +0 -0
  198. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_physical_campaign_v09.py +0 -0
  199. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_physical_evidence_v09.py +0 -0
  200. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_physical_motion_v09.py +0 -0
  201. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_planning_fallback_v012.py +0 -0
  202. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_pose_math_v0125.py +0 -0
  203. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_preexecution_contract_v10.py +0 -0
  204. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_production_authority_v11.py +0 -0
  205. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_production_grade_coverage_v11.py +0 -0
  206. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_production_grade_v11.py +0 -0
  207. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_project_spine_v013.py +0 -0
  208. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_provider_and_qualification.py +0 -0
  209. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_provider_criterion_v15.py +0 -0
  210. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_qualification_cli_lifecycle_v06.py +0 -0
  211. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_qualification_harness_v06.py +0 -0
  212. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_readme_pypi.py +0 -0
  213. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_real_provider_adapters.py +0 -0
  214. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_reference_workcell_ros_frames_v0125.py +0 -0
  215. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_reference_workcell_v012.py +0 -0
  216. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_report_test_contract_coverage_v16.py +0 -0
  217. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_report_test_lineage_v16.py +0 -0
  218. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_report_test_visual_execution_v16.py +0 -0
  219. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_robot_platform_v08.py +0 -0
  220. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_ros2_production_receipts_v011.py +0 -0
  221. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_ros2_simulation.py +0 -0
  222. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_selective_verification_v14.py +0 -0
  223. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_setup_profile.py +0 -0
  224. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_sim_real_qualification_v011.py +0 -0
  225. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_simulation_platform_v08.py +0 -0
  226. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_smooth_motion_hotfix_v162.py +0 -0
  227. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_support_contact_hotfix_v161.py +0 -0
  228. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_tool_collision_v011.py +0 -0
  229. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_tool_scene_v0124.py +0 -0
  230. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_trajectory_action_probe_v0125.py +0 -0
  231. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_trajectory_qualification_v09.py +0 -0
  232. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_trajectory_tracking_v0125.py +0 -0
  233. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_twin_materialization_v10.py +0 -0
  234. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_twin_v08.py +0 -0
  235. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_ur5e_adapter_scopes_v09.py +0 -0
  236. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_ur5e_v10_adapter_scopes.py +0 -0
  237. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_user_cli_interactive_v131.py +0 -0
  238. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_user_cli_progress_v131.py +0 -0
  239. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_user_cli_report_visual_v16.py +0 -0
  240. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_user_cli_selective_v14.py +0 -0
  241. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_user_cli_v15.py +0 -0
  242. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_user_cli_v15_hotfix_inheritance.py +0 -0
  243. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_v052_stabilization.py +0 -0
  244. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_v08_catalog_mapping_regression.py +0 -0
  245. {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_workpiece_lifecycle_v011.py +0 -0
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devagent-physical-engine
3
- Version: 1.8.0
4
- Summary: Production-grade verification-first robotics evidence runtime with one-command customer intake, truthful robot support tiers, qualified UR5e report-test Gazebo execution, experimental ABB IRB1200 Gazebo/MoveIt/RViz visualization, transfer/place diagnostics, requirement-driven test generation, selective verification, deterministic Twin lineage, measured physical verification, replay inspection, regression, and FAT evidence.
3
+ Version: 1.8.1
4
+ Summary: Production-grade verification-first robotics evidence runtime with one-command customer intake, truthful robot support tiers, qualified UR5e report-test Gazebo execution, direct ROS controller/action readiness, experimental ABB IRB1200 Gazebo/MoveIt/RViz visualization, transfer/place diagnostics, requirement-driven test generation, selective verification, deterministic Twin lineage, measured physical verification, replay inspection, regression, and FAT evidence.
5
5
  Author: Tom Ha
6
6
  License: All Rights Reserved
7
7
  Project-URL: Homepage, https://github.com/tomha85/devagent-physical-engine
@@ -76,7 +76,7 @@ regression + FAT report + Evidence Viewer
76
76
  Python 3.11+ is required.
77
77
 
78
78
  ```bash
79
- python -m pip install --upgrade devagent-physical-engine==1.8.0
79
+ python -m pip install --upgrade devagent-physical-engine==1.8.1
80
80
  ```
81
81
 
82
82
  Verify the installed package:
@@ -88,7 +88,7 @@ python -c "import devagent_physical_engine as d; print(d.__version__)"
88
88
  Expected:
89
89
 
90
90
  ```text
91
- 1.8.0
91
+ 1.8.1
92
92
  ```
93
93
 
94
94
  Run the normal customer workflow:
@@ -360,6 +360,14 @@ This is intentionally **visual simulation availability**, not measured FAT quali
360
360
 
361
361
  Generic `abb_irb`, FANUC CRX, and KUKA KR profiles remain model-only until equivalent vendor/model visual runtimes are implemented and qualified.
362
362
 
363
+ ## v1.8.1 direct UR5e controller/action readiness hotfix
364
+
365
+ A real UR5e target-stack run proved that Gazebo, `gz_ros2_control`, the controller manager, joint-state broadcaster, and `scaled_joint_trajectory_controller` could all initialize successfully while DevAgent remained stuck in startup readiness until the 120-second timeout. The old UR5e readiness gate depended on ROS CLI graph commands and expected the unscaled `/joint_trajectory_controller/follow_joint_trajectory` action even when the active controller was the scaled UR controller.
366
+
367
+ v1.8.1 makes UR5e readiness and trajectory execution use one controller-binding contract. A short-lived direct `rclpy` probe calls `/controller_manager/list_controllers`, deterministically selects the active trajectory controller, verifies its exact `FollowJointTrajectory` action server, and returns the bound action name. Required UR5e joint-state readiness continues to use the direct machine joint-state probe.
368
+
369
+ The readiness gate therefore no longer depends on a long-lived `ros2 daemon`, `ros2 node list`, `ros2 topic list`, or `ros2 action list`. It remains fail-closed on missing controller-manager service, no active trajectory controller, ambiguous active controllers, a missing trajectory action server, or missing required UR5e joint state. No collision rule, Pilz target, motion speed, Twin lineage, site-qualification boundary, or real-execution authority is relaxed.
370
+
363
371
  ## Qualified visual-execution scope
364
372
 
365
373
  Measured report-test execution remains intentionally narrow:
@@ -560,9 +568,9 @@ devagent-physical-ai optional provider-backed engineering front end
560
568
 
561
569
  # Project status
562
570
 
563
- **v1.8.0 — Production/Stable software workflow**
571
+ **v1.8.1 — Production/Stable software workflow**
564
572
 
565
- v1.8.0 retains the qualified UR5e measured report-test architecture and the v1.7.2 transfer/place diagnostics, while adding truthful robot support tiers and an exact ABB IRB1200 experimental Gazebo Harmonic + MoveIt + RViz visual runtime. ABB visualization is available for engineering preview, but measured FAT promotion remains fail-closed until the exact ABB execution adapter is separately qualified.
573
+ v1.8.1 retains the v1.8.0 truthful robot support tiers and ABB IRB1200 experimental visual runtime, while fixing the UR5e target-stack readiness gate so it directly binds the active controller manager trajectory controller and exact `FollowJointTrajectory` server instead of depending on ROS CLI graph discovery or an unscaled-controller naming assumption.
566
574
 
567
575
  Production-oriented software capabilities include:
568
576
 
@@ -576,6 +584,7 @@ immutable project/Twin lineage
576
584
  exact Requirement → Mapping → Verification Plan → Case provenance
577
585
  truthful robot support tiers
578
586
  qualified UR5e report-test visual execution contract
587
+ direct UR5e controller-manager/action readiness binding
579
588
  experimental exact ABB IRB1200 Gazebo/MoveIt/RViz preview
580
589
  industrial Pilz PTP / LIN planning
581
590
  adaptive bounded blend selection
@@ -35,7 +35,7 @@ regression + FAT report + Evidence Viewer
35
35
  Python 3.11+ is required.
36
36
 
37
37
  ```bash
38
- python -m pip install --upgrade devagent-physical-engine==1.8.0
38
+ python -m pip install --upgrade devagent-physical-engine==1.8.1
39
39
  ```
40
40
 
41
41
  Verify the installed package:
@@ -47,7 +47,7 @@ python -c "import devagent_physical_engine as d; print(d.__version__)"
47
47
  Expected:
48
48
 
49
49
  ```text
50
- 1.8.0
50
+ 1.8.1
51
51
  ```
52
52
 
53
53
  Run the normal customer workflow:
@@ -319,6 +319,14 @@ This is intentionally **visual simulation availability**, not measured FAT quali
319
319
 
320
320
  Generic `abb_irb`, FANUC CRX, and KUKA KR profiles remain model-only until equivalent vendor/model visual runtimes are implemented and qualified.
321
321
 
322
+ ## v1.8.1 direct UR5e controller/action readiness hotfix
323
+
324
+ A real UR5e target-stack run proved that Gazebo, `gz_ros2_control`, the controller manager, joint-state broadcaster, and `scaled_joint_trajectory_controller` could all initialize successfully while DevAgent remained stuck in startup readiness until the 120-second timeout. The old UR5e readiness gate depended on ROS CLI graph commands and expected the unscaled `/joint_trajectory_controller/follow_joint_trajectory` action even when the active controller was the scaled UR controller.
325
+
326
+ v1.8.1 makes UR5e readiness and trajectory execution use one controller-binding contract. A short-lived direct `rclpy` probe calls `/controller_manager/list_controllers`, deterministically selects the active trajectory controller, verifies its exact `FollowJointTrajectory` action server, and returns the bound action name. Required UR5e joint-state readiness continues to use the direct machine joint-state probe.
327
+
328
+ The readiness gate therefore no longer depends on a long-lived `ros2 daemon`, `ros2 node list`, `ros2 topic list`, or `ros2 action list`. It remains fail-closed on missing controller-manager service, no active trajectory controller, ambiguous active controllers, a missing trajectory action server, or missing required UR5e joint state. No collision rule, Pilz target, motion speed, Twin lineage, site-qualification boundary, or real-execution authority is relaxed.
329
+
322
330
  ## Qualified visual-execution scope
323
331
 
324
332
  Measured report-test execution remains intentionally narrow:
@@ -519,9 +527,9 @@ devagent-physical-ai optional provider-backed engineering front end
519
527
 
520
528
  # Project status
521
529
 
522
- **v1.8.0 — Production/Stable software workflow**
530
+ **v1.8.1 — Production/Stable software workflow**
523
531
 
524
- v1.8.0 retains the qualified UR5e measured report-test architecture and the v1.7.2 transfer/place diagnostics, while adding truthful robot support tiers and an exact ABB IRB1200 experimental Gazebo Harmonic + MoveIt + RViz visual runtime. ABB visualization is available for engineering preview, but measured FAT promotion remains fail-closed until the exact ABB execution adapter is separately qualified.
532
+ v1.8.1 retains the v1.8.0 truthful robot support tiers and ABB IRB1200 experimental visual runtime, while fixing the UR5e target-stack readiness gate so it directly binds the active controller manager trajectory controller and exact `FollowJointTrajectory` server instead of depending on ROS CLI graph discovery or an unscaled-controller naming assumption.
525
533
 
526
534
  Production-oriented software capabilities include:
527
535
 
@@ -535,6 +543,7 @@ immutable project/Twin lineage
535
543
  exact Requirement → Mapping → Verification Plan → Case provenance
536
544
  truthful robot support tiers
537
545
  qualified UR5e report-test visual execution contract
546
+ direct UR5e controller-manager/action readiness binding
538
547
  experimental exact ABB IRB1200 Gazebo/MoveIt/RViz preview
539
548
  industrial Pilz PTP / LIN planning
540
549
  adaptive bounded blend selection
@@ -587,4 +596,4 @@ Original creator: Tom Ha
587
596
  Original project: https://github.com/tomha85/devagent-physical-engine
588
597
  All rights reserved.
589
598
 
590
- See repository `LICENSE`, `NOTICE`, and `COPYRIGHT` for complete ownership and usage terms.
599
+ See repository `LICENSE`, `NOTICE`, and `COPYRIGHT` for complete ownership and usage terms.
@@ -4,8 +4,8 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "devagent-physical-engine"
7
- version = "1.8.0"
8
- description = "Production-grade verification-first robotics evidence runtime with one-command customer intake, truthful robot support tiers, qualified UR5e report-test Gazebo execution, experimental ABB IRB1200 Gazebo/MoveIt/RViz visualization, transfer/place diagnostics, requirement-driven test generation, selective verification, deterministic Twin lineage, measured physical verification, replay inspection, regression, and FAT evidence."
7
+ version = "1.8.1"
8
+ description = "Production-grade verification-first robotics evidence runtime with one-command customer intake, truthful robot support tiers, qualified UR5e report-test Gazebo execution, direct ROS controller/action readiness, experimental ABB IRB1200 Gazebo/MoveIt/RViz visualization, transfer/place diagnostics, requirement-driven test generation, selective verification, deterministic Twin lineage, measured physical verification, replay inspection, regression, and FAT evidence."
9
9
  readme = { file = "README.md", content-type = "text/markdown" }
10
10
  requires-python = ">=3.11"
11
11
  dependencies = ["PyYAML>=6.0,<7"]
@@ -26,6 +26,7 @@ from .commercial_intelligence import (
26
26
  )
27
27
  from .commercial_readiness import CommercialProjectStatus, FATReportBuilder
28
28
  from .commercial_repository import CommercialProjectRepository
29
+ from .controller_runtime_hotfix_v181 import install_controller_runtime_hotfix_v181
29
30
  from .evidence_replay import ReplayInspectionService
30
31
  from .evidence_trust import (
31
32
  EVIDENCE_TRUST_SCHEMA_VERSION,
@@ -215,6 +216,7 @@ __all__ = [
215
216
  install_support_contact_hotfix_v161()
216
217
  install_smooth_motion_hotfix_v162()
217
218
  install_industrial_motion_v170()
219
+ install_controller_runtime_hotfix_v181()
218
220
  install_one_command_runtime()
219
221
 
220
- __version__ = "1.8.0"
222
+ __version__ = "1.8.1"
@@ -0,0 +1,93 @@
1
+ from __future__ import annotations
2
+
3
+ import json
4
+ from pathlib import Path
5
+ from typing import Mapping
6
+
7
+ from .ros2 import trajectory as _trajectory
8
+ from .ros2.commands import CommandExecutionError, RosCommandRunner
9
+ from .ros2.trajectory import RosTrajectoryError
10
+ from .ros2.ur5e_adapter import UR5E_JOINTS, UR5eGazeboAdapter
11
+
12
+
13
+ _DEFAULT_TRAJECTORY_ACTION = "/joint_trajectory_controller/follow_joint_trajectory"
14
+
15
+
16
+ def _last_json_mapping(stdout: str, *, code: str) -> Mapping[str, object]:
17
+ lines = [line.strip() for line in stdout.splitlines() if line.strip()]
18
+ if not lines:
19
+ raise RosTrajectoryError(code)
20
+ try:
21
+ payload = json.loads(lines[-1])
22
+ except json.JSONDecodeError as exc:
23
+ raise RosTrajectoryError(code) from exc
24
+ if not isinstance(payload, Mapping):
25
+ raise RosTrajectoryError(code)
26
+ return payload
27
+
28
+
29
+ def resolve_active_trajectory_action_v181(
30
+ runner: RosCommandRunner,
31
+ *,
32
+ preferred_action: str = _DEFAULT_TRAJECTORY_ACTION,
33
+ ) -> str:
34
+ if not preferred_action.startswith("/") or any(
35
+ character.isspace() for character in preferred_action
36
+ ):
37
+ raise RosTrajectoryError("trajectory_action_must_be_absolute")
38
+
39
+ service_timeout = 3.0
40
+ action_timeout = 3.0
41
+ helper = Path(_trajectory.__file__).with_name("controller_action_probe.py").resolve()
42
+ command = (
43
+ "python3",
44
+ str(helper),
45
+ "--preferred-action",
46
+ preferred_action,
47
+ "--service-timeout",
48
+ format(service_timeout, ".6g"),
49
+ "--action-timeout",
50
+ format(action_timeout, ".6g"),
51
+ )
52
+ try:
53
+ result = runner.run(
54
+ command,
55
+ timeout_s=service_timeout * 2.0 + action_timeout + 4.0,
56
+ )
57
+ except CommandExecutionError as exc:
58
+ raise RosTrajectoryError("trajectory_controller_discovery_timeout") from exc
59
+
60
+ payload = _last_json_mapping(
61
+ result.stdout,
62
+ code="trajectory_controller_probe_output_invalid",
63
+ )
64
+ code = str(payload.get("code") or "trajectory_controller_probe_failed")
65
+ if payload.get("success") is not True:
66
+ raise RosTrajectoryError(code)
67
+ if not result.ok:
68
+ raise RosTrajectoryError("trajectory_controller_probe_exit_nonzero")
69
+
70
+ action_name = str(payload.get("action_name") or "").strip()
71
+ if not action_name.startswith("/") or not action_name.endswith(
72
+ "/follow_joint_trajectory"
73
+ ):
74
+ raise RosTrajectoryError("trajectory_controller_probe_output_invalid")
75
+ return action_name
76
+
77
+
78
+ def ur5e_ready_probe_v181(self: UR5eGazeboAdapter) -> tuple[bool, str]:
79
+ try:
80
+ action_name = resolve_active_trajectory_action_v181(self.runner)
81
+ _trajectory.read_joint_state(
82
+ self.runner,
83
+ timeout_s=4.0,
84
+ required_joint_names=UR5E_JOINTS,
85
+ )
86
+ except RosTrajectoryError as exc:
87
+ return False, str(exc)
88
+ return True, f"controller/action/joint-state ready:{action_name}"
89
+
90
+
91
+ def install_controller_runtime_hotfix_v181() -> None:
92
+ _trajectory.resolve_active_trajectory_action = resolve_active_trajectory_action_v181
93
+ UR5eGazeboAdapter._ready_probe = ur5e_ready_probe_v181
@@ -0,0 +1,165 @@
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+ import json
5
+ import os
6
+ from typing import Any, Sequence
7
+
8
+
9
+ def _controller_from_action(action_name: str) -> str | None:
10
+ parts = tuple(part for part in str(action_name).strip().split("/") if part)
11
+ if len(parts) == 2 and parts[1] == "follow_joint_trajectory":
12
+ return parts[0]
13
+ return None
14
+
15
+
16
+ def _is_trajectory_controller(name: str, controller_type: str) -> bool:
17
+ canonical_name = str(name).strip()
18
+ canonical_type = str(controller_type).strip().lower().replace("_", "")
19
+ return canonical_name.endswith("joint_trajectory_controller") or (
20
+ "trajectorycontroller" in canonical_type
21
+ )
22
+
23
+
24
+ def select_active_trajectory_controller(
25
+ controllers: Sequence[tuple[str, str, str]],
26
+ *,
27
+ preferred_action: str,
28
+ ) -> tuple[str | None, str]:
29
+ preferred = _controller_from_action(preferred_action)
30
+ if preferred is None:
31
+ return None, "trajectory_action_must_be_absolute"
32
+
33
+ active = sorted(
34
+ {
35
+ str(name).strip()
36
+ for name, controller_type, state in controllers
37
+ if str(state).strip().lower() == "active"
38
+ and _is_trajectory_controller(name, controller_type)
39
+ and str(name).strip()
40
+ and "/" not in str(name).strip()
41
+ }
42
+ )
43
+ if not active:
44
+ return None, "trajectory_controller_not_active"
45
+ if preferred in active:
46
+ return preferred, "trajectory_controller_selected"
47
+ if len(active) == 1:
48
+ return active[0], "trajectory_controller_selected"
49
+ return None, "trajectory_controller_ambiguous:" + ",".join(active)
50
+
51
+
52
+ def probe_controller_action(
53
+ *,
54
+ preferred_action: str,
55
+ service_timeout_s: float,
56
+ action_timeout_s: float,
57
+ ) -> dict[str, Any]:
58
+ if service_timeout_s <= 0 or action_timeout_s <= 0:
59
+ raise ValueError("controller_action_probe_timeout_must_be_positive")
60
+ if not preferred_action.startswith("/") or any(
61
+ character.isspace() for character in preferred_action
62
+ ):
63
+ raise ValueError("trajectory_action_must_be_absolute")
64
+
65
+ import rclpy
66
+ from control_msgs.action import FollowJointTrajectory
67
+ from controller_manager_msgs.srv import ListControllers
68
+ from rclpy.action import ActionClient
69
+
70
+ rclpy.init(args=None)
71
+ node = rclpy.create_node(f"devagent_controller_action_probe_{os.getpid()}")
72
+ service = node.create_client(ListControllers, "/controller_manager/list_controllers")
73
+ action_client = None
74
+ try:
75
+ if not service.wait_for_service(timeout_sec=float(service_timeout_s)):
76
+ return {"success": False, "code": "controller_manager_service_timeout"}
77
+
78
+ future = service.call_async(ListControllers.Request())
79
+ rclpy.spin_until_future_complete(node, future, timeout_sec=float(service_timeout_s))
80
+ if not future.done():
81
+ return {"success": False, "code": "controller_manager_list_timeout"}
82
+ response = future.result()
83
+ if response is None:
84
+ return {"success": False, "code": "controller_manager_list_failed"}
85
+
86
+ records = tuple(
87
+ (str(item.name), str(item.type), str(item.state))
88
+ for item in response.controller
89
+ )
90
+ controller, code = select_active_trajectory_controller(
91
+ records,
92
+ preferred_action=preferred_action,
93
+ )
94
+ if controller is None:
95
+ return {
96
+ "success": False,
97
+ "code": code,
98
+ "controllers": [
99
+ {"name": name, "type": controller_type, "state": state}
100
+ for name, controller_type, state in records
101
+ ],
102
+ }
103
+
104
+ action_name = f"/{controller}/follow_joint_trajectory"
105
+ action_client = ActionClient(node, FollowJointTrajectory, action_name)
106
+ if not action_client.wait_for_server(timeout_sec=float(action_timeout_s)):
107
+ return {
108
+ "success": False,
109
+ "code": "trajectory_action_server_timeout",
110
+ "controller": controller,
111
+ "action_name": action_name,
112
+ }
113
+
114
+ selected_type = next(
115
+ (
116
+ controller_type
117
+ for name, controller_type, state in records
118
+ if name == controller and state.strip().lower() == "active"
119
+ ),
120
+ "",
121
+ )
122
+ return {
123
+ "success": True,
124
+ "code": "trajectory_controller_action_ready",
125
+ "controller": controller,
126
+ "controller_type": selected_type,
127
+ "action_name": action_name,
128
+ }
129
+ finally:
130
+ if action_client is not None:
131
+ action_client.destroy()
132
+ node.destroy_client(service)
133
+ node.destroy_node()
134
+ if rclpy.ok():
135
+ rclpy.shutdown()
136
+
137
+
138
+ def main() -> int:
139
+ parser = argparse.ArgumentParser()
140
+ parser.add_argument(
141
+ "--preferred-action",
142
+ default="/joint_trajectory_controller/follow_joint_trajectory",
143
+ )
144
+ parser.add_argument("--service-timeout", type=float, default=3.0)
145
+ parser.add_argument("--action-timeout", type=float, default=3.0)
146
+ args = parser.parse_args()
147
+
148
+ try:
149
+ result = probe_controller_action(
150
+ preferred_action=str(args.preferred_action),
151
+ service_timeout_s=float(args.service_timeout),
152
+ action_timeout_s=float(args.action_timeout),
153
+ )
154
+ except Exception as exc:
155
+ result = {
156
+ "success": False,
157
+ "code": f"controller_action_probe_error:{type(exc).__name__}",
158
+ }
159
+
160
+ print(json.dumps(result, sort_keys=True, separators=(",", ":"), allow_nan=False))
161
+ return 0 if result.get("success") else 2
162
+
163
+
164
+ if __name__ == "__main__":
165
+ raise SystemExit(main())
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devagent-physical-engine
3
- Version: 1.8.0
4
- Summary: Production-grade verification-first robotics evidence runtime with one-command customer intake, truthful robot support tiers, qualified UR5e report-test Gazebo execution, experimental ABB IRB1200 Gazebo/MoveIt/RViz visualization, transfer/place diagnostics, requirement-driven test generation, selective verification, deterministic Twin lineage, measured physical verification, replay inspection, regression, and FAT evidence.
3
+ Version: 1.8.1
4
+ Summary: Production-grade verification-first robotics evidence runtime with one-command customer intake, truthful robot support tiers, qualified UR5e report-test Gazebo execution, direct ROS controller/action readiness, experimental ABB IRB1200 Gazebo/MoveIt/RViz visualization, transfer/place diagnostics, requirement-driven test generation, selective verification, deterministic Twin lineage, measured physical verification, replay inspection, regression, and FAT evidence.
5
5
  Author: Tom Ha
6
6
  License: All Rights Reserved
7
7
  Project-URL: Homepage, https://github.com/tomha85/devagent-physical-engine
@@ -76,7 +76,7 @@ regression + FAT report + Evidence Viewer
76
76
  Python 3.11+ is required.
77
77
 
78
78
  ```bash
79
- python -m pip install --upgrade devagent-physical-engine==1.8.0
79
+ python -m pip install --upgrade devagent-physical-engine==1.8.1
80
80
  ```
81
81
 
82
82
  Verify the installed package:
@@ -88,7 +88,7 @@ python -c "import devagent_physical_engine as d; print(d.__version__)"
88
88
  Expected:
89
89
 
90
90
  ```text
91
- 1.8.0
91
+ 1.8.1
92
92
  ```
93
93
 
94
94
  Run the normal customer workflow:
@@ -360,6 +360,14 @@ This is intentionally **visual simulation availability**, not measured FAT quali
360
360
 
361
361
  Generic `abb_irb`, FANUC CRX, and KUKA KR profiles remain model-only until equivalent vendor/model visual runtimes are implemented and qualified.
362
362
 
363
+ ## v1.8.1 direct UR5e controller/action readiness hotfix
364
+
365
+ A real UR5e target-stack run proved that Gazebo, `gz_ros2_control`, the controller manager, joint-state broadcaster, and `scaled_joint_trajectory_controller` could all initialize successfully while DevAgent remained stuck in startup readiness until the 120-second timeout. The old UR5e readiness gate depended on ROS CLI graph commands and expected the unscaled `/joint_trajectory_controller/follow_joint_trajectory` action even when the active controller was the scaled UR controller.
366
+
367
+ v1.8.1 makes UR5e readiness and trajectory execution use one controller-binding contract. A short-lived direct `rclpy` probe calls `/controller_manager/list_controllers`, deterministically selects the active trajectory controller, verifies its exact `FollowJointTrajectory` action server, and returns the bound action name. Required UR5e joint-state readiness continues to use the direct machine joint-state probe.
368
+
369
+ The readiness gate therefore no longer depends on a long-lived `ros2 daemon`, `ros2 node list`, `ros2 topic list`, or `ros2 action list`. It remains fail-closed on missing controller-manager service, no active trajectory controller, ambiguous active controllers, a missing trajectory action server, or missing required UR5e joint state. No collision rule, Pilz target, motion speed, Twin lineage, site-qualification boundary, or real-execution authority is relaxed.
370
+
363
371
  ## Qualified visual-execution scope
364
372
 
365
373
  Measured report-test execution remains intentionally narrow:
@@ -560,9 +568,9 @@ devagent-physical-ai optional provider-backed engineering front end
560
568
 
561
569
  # Project status
562
570
 
563
- **v1.8.0 — Production/Stable software workflow**
571
+ **v1.8.1 — Production/Stable software workflow**
564
572
 
565
- v1.8.0 retains the qualified UR5e measured report-test architecture and the v1.7.2 transfer/place diagnostics, while adding truthful robot support tiers and an exact ABB IRB1200 experimental Gazebo Harmonic + MoveIt + RViz visual runtime. ABB visualization is available for engineering preview, but measured FAT promotion remains fail-closed until the exact ABB execution adapter is separately qualified.
573
+ v1.8.1 retains the v1.8.0 truthful robot support tiers and ABB IRB1200 experimental visual runtime, while fixing the UR5e target-stack readiness gate so it directly binds the active controller manager trajectory controller and exact `FollowJointTrajectory` server instead of depending on ROS CLI graph discovery or an unscaled-controller naming assumption.
566
574
 
567
575
  Production-oriented software capabilities include:
568
576
 
@@ -576,6 +584,7 @@ immutable project/Twin lineage
576
584
  exact Requirement → Mapping → Verification Plan → Case provenance
577
585
  truthful robot support tiers
578
586
  qualified UR5e report-test visual execution contract
587
+ direct UR5e controller-manager/action readiness binding
579
588
  experimental exact ABB IRB1200 Gazebo/MoveIt/RViz preview
580
589
  industrial Pilz PTP / LIN planning
581
590
  adaptive bounded blend selection
@@ -12,6 +12,7 @@ src/devagent_physical_engine/commercial_intelligence.py
12
12
  src/devagent_physical_engine/commercial_readiness.py
13
13
  src/devagent_physical_engine/commercial_repository.py
14
14
  src/devagent_physical_engine/continuous_clearance.py
15
+ src/devagent_physical_engine/controller_runtime_hotfix_v181.py
15
16
  src/devagent_physical_engine/doctor.py
16
17
  src/devagent_physical_engine/engineering_agent.py
17
18
  src/devagent_physical_engine/engineering_request.py
@@ -108,6 +109,7 @@ src/devagent_physical_engine/ros2/abb_irb1200_preview.py
108
109
  src/devagent_physical_engine/ros2/acceptance.py
109
110
  src/devagent_physical_engine/ros2/commands.py
110
111
  src/devagent_physical_engine/ros2/continuous_clearance_probe.py
112
+ src/devagent_physical_engine/ros2/controller_action_probe.py
111
113
  src/devagent_physical_engine/ros2/doctor.py
112
114
  src/devagent_physical_engine/ros2/fk_pose.py
113
115
  src/devagent_physical_engine/ros2/fk_probe.py
@@ -164,6 +166,7 @@ tests/test_commercial_intelligence_v15.py
164
166
  tests/test_commercial_readiness_v1.py
165
167
  tests/test_commercial_v1.py
166
168
  tests/test_continuous_clearance_v011.py
169
+ tests/test_controller_runtime_hotfix_v181.py
167
170
  tests/test_core.py
168
171
  tests/test_engineering_request_v07.py
169
172
  tests/test_evidence_replay_v12.py