devagent-physical-engine 1.8.6__tar.gz → 1.8.8__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 (257) hide show
  1. {devagent_physical_engine-1.8.6/src/devagent_physical_engine.egg-info → devagent_physical_engine-1.8.8}/PKG-INFO +16 -6
  2. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/README.md +15 -5
  3. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/pyproject.toml +3 -1
  4. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/__init__.py +1 -1
  5. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/workpiece_scene.py +1 -1
  6. devagent_physical_engine-1.8.8/src/devagent_physical_engine/ros2/workpiece_scene_probe_v187.py +408 -0
  7. devagent_physical_engine-1.8.8/src/devagent_physical_engine/ros2/workpiece_scene_probe_v188.py +283 -0
  8. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8/src/devagent_physical_engine.egg-info}/PKG-INFO +16 -6
  9. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine.egg-info/SOURCES.txt +2 -0
  10. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_industrial_motion_v170.py +2 -2
  11. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_package_metadata_v184.py +2 -2
  12. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_transfer_place_diagnostic_v172.py +2 -2
  13. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_workpiece_semantic_lifecycle_v186.py +13 -1
  14. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/NOTICE +0 -0
  15. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/setup.cfg +0 -0
  16. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/agent/__init__.py +0 -0
  17. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/agent/compiler.py +0 -0
  18. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/agent/contracts.py +0 -0
  19. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/agent/coordinator.py +0 -0
  20. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/agent/critic.py +0 -0
  21. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/agent/evidence.py +0 -0
  22. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/agent/interpreter.py +0 -0
  23. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/agent/planner.py +0 -0
  24. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/agent/recovery.py +0 -0
  25. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/agent/routing.py +0 -0
  26. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/agent/runtime.py +0 -0
  27. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/agent/semantic.py +0 -0
  28. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/agent/structured.py +0 -0
  29. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ai_cli.py +0 -0
  30. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/cli.py +0 -0
  31. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/commercial.py +0 -0
  32. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/commercial_campaign.py +0 -0
  33. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/commercial_cli.py +0 -0
  34. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/commercial_importer.py +0 -0
  35. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/commercial_intelligence.py +0 -0
  36. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/commercial_readiness.py +0 -0
  37. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/commercial_repository.py +0 -0
  38. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/continuous_clearance.py +0 -0
  39. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/controller_runtime_hotfix_v181.py +0 -0
  40. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/doctor.py +0 -0
  41. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/engineering_agent.py +0 -0
  42. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/engineering_request.py +0 -0
  43. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/evidence_replay.py +0 -0
  44. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/evidence_trust.py +0 -0
  45. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/execution.py +0 -0
  46. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/industrial_motion_hotfix_v170.py +0 -0
  47. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/industrial_motion_v170.py +0 -0
  48. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/industrial_motion_v182.py +0 -0
  49. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/models.py +0 -0
  50. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/one_command.py +0 -0
  51. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/one_command_runtime.py +0 -0
  52. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/one_command_v15.py +0 -0
  53. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/one_command_v16.py +0 -0
  54. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/operating_envelope.py +0 -0
  55. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/optimization/__init__.py +0 -0
  56. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/optimization/benchmark.py +0 -0
  57. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/optimization/candidates.py +0 -0
  58. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/optimization/contracts.py +0 -0
  59. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/optimization/evaluator.py +0 -0
  60. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/optimization/evidence.py +0 -0
  61. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/optimization/experience.py +0 -0
  62. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/optimization/measured.py +0 -0
  63. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/optimization/optimizer.py +0 -0
  64. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/optimization/orchestrator.py +0 -0
  65. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/physical_campaign.py +0 -0
  66. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/physical_evidence.py +0 -0
  67. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/physical_motion.py +0 -0
  68. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/planning.py +0 -0
  69. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/pose_math.py +0 -0
  70. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/preexecution_contract.py +0 -0
  71. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/production_authority.py +0 -0
  72. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/production_grade.py +0 -0
  73. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/project.py +0 -0
  74. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/provider_adapters/__init__.py +0 -0
  75. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/provider_adapters/anthropic.py +0 -0
  76. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/provider_adapters/common.py +0 -0
  77. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/provider_adapters/factory.py +0 -0
  78. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/provider_adapters/gemini.py +0 -0
  79. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/provider_adapters/openai.py +0 -0
  80. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/provider_criterion.py +0 -0
  81. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/provider_qualification.py +0 -0
  82. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/providers.py +0 -0
  83. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/qualification.py +0 -0
  84. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/qualification_cli.py +0 -0
  85. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/qualification_harness.py +0 -0
  86. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/reference_workcell.py +0 -0
  87. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/report_test_execution.py +0 -0
  88. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/report_test_execution_strict.py +0 -0
  89. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/robot_platform.py +0 -0
  90. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/robot_support_v18.py +0 -0
  91. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/robots.py +0 -0
  92. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/__init__.py +0 -0
  93. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/abb_irb1200.py +0 -0
  94. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/abb_irb1200_preview.py +0 -0
  95. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/acceptance.py +0 -0
  96. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/commands.py +0 -0
  97. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/continuous_clearance_probe.py +0 -0
  98. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/controller_action_probe.py +0 -0
  99. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/destination_support_contact_v182.py +0 -0
  100. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/doctor.py +0 -0
  101. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/fk_pose.py +0 -0
  102. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/fk_probe.py +0 -0
  103. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/frame_alignment.py +0 -0
  104. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/gazebo_cli.py +0 -0
  105. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/gazebo_pose.py +0 -0
  106. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/gazebo_world.py +0 -0
  107. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v170.py +0 -0
  108. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v171.py +0 -0
  109. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v172.py +0 -0
  110. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v182.py +0 -0
  111. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/joint_state_probe.py +0 -0
  112. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/joint_state_recorder.py +0 -0
  113. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/measured_motion.py +0 -0
  114. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/moveit_joint_plan_probe.py +0 -0
  115. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/moveit_joint_plan_v161_probe.py +0 -0
  116. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/moveit_scene.py +0 -0
  117. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/moveit_task_planner.py +0 -0
  118. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/pilz_sequence_plan_probe.py +0 -0
  119. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/pilz_sequence_plan_probe_v182.py +0 -0
  120. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/preexecution.py +0 -0
  121. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/qualification.py +0 -0
  122. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/qualification_v10.py +0 -0
  123. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/qualification_v11.py +0 -0
  124. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/qualification_v12.py +0 -0
  125. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/report_test_visualization.py +0 -0
  126. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/report_test_visualization_v170.py +0 -0
  127. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/scene_probe.py +0 -0
  128. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/state_validity_probe.py +0 -0
  129. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/support_contact_acm_probe_v170.py +0 -0
  130. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/support_contact_lease_v170.py +0 -0
  131. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/support_contact_runner_v161.py +0 -0
  132. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/support_contact_v161.py +0 -0
  133. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/task_adapter.py +0 -0
  134. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/task_visualization.py +0 -0
  135. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/tf_probe.py +0 -0
  136. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/tool_scene.py +0 -0
  137. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/tool_scene_probe.py +0 -0
  138. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/trajectory.py +0 -0
  139. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/trajectory_action_probe.py +0 -0
  140. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/trajectory_tracking.py +0 -0
  141. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/ur5e.py +0 -0
  142. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/ur5e_adapter.py +0 -0
  143. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/ur5e_v10_adapter.py +0 -0
  144. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/workpiece_follow.py +0 -0
  145. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/workpiece_gazebo_follower.py +0 -0
  146. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/workpiece_scene_probe.py +0 -0
  147. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/workpiece_scene_probe_v186.py +0 -0
  148. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/selective_verification.py +0 -0
  149. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/selective_verification_v16.py +0 -0
  150. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/setup_profile.py +0 -0
  151. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/sim_real_qualification.py +0 -0
  152. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/simulation.py +0 -0
  153. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/simulation_platform.py +0 -0
  154. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/smooth_motion_hotfix_v162.py +0 -0
  155. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/support_contact_hotfix_v161.py +0 -0
  156. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/tool_collision.py +0 -0
  157. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/trajectory_qualification.py +0 -0
  158. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/twin.py +0 -0
  159. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/twin_builder.py +0 -0
  160. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/twin_codec.py +0 -0
  161. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/twin_materialization.py +0 -0
  162. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/user_cli.py +0 -0
  163. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/user_cli_v15.py +0 -0
  164. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/user_cli_v16.py +0 -0
  165. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/user_cli_v18.py +0 -0
  166. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/verification.py +0 -0
  167. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/workpiece_lifecycle.py +0 -0
  168. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine.egg-info/dependency_links.txt +0 -0
  169. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine.egg-info/entry_points.txt +0 -0
  170. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine.egg-info/requires.txt +0 -0
  171. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine.egg-info/top_level.txt +0 -0
  172. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_abb_irb1200_visual_v18.py +0 -0
  173. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_agent_core.py +0 -0
  174. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_agent_semantic_hardening.py +0 -0
  175. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_ai_cli.py +0 -0
  176. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_ai_cli_v07.py +0 -0
  177. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_commercial_importer_v1.py +0 -0
  178. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_commercial_intelligence_v15.py +0 -0
  179. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_commercial_readiness_v1.py +0 -0
  180. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_commercial_v1.py +0 -0
  181. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_continuous_clearance_v011.py +0 -0
  182. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_controller_runtime_hotfix_v181.py +0 -0
  183. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_core.py +0 -0
  184. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_destination_support_contact_v182.py +0 -0
  185. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_engineering_request_v07.py +0 -0
  186. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_evidence_replay_v12.py +0 -0
  187. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_evidence_trust_coverage_v12.py +0 -0
  188. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_evidence_trust_transport_v12.py +0 -0
  189. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_evidence_trust_v12.py +0 -0
  190. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_evidence_viewer_palette_v130.py +0 -0
  191. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_gazebo_cli_v0122.py +0 -0
  192. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_golden_abb_runner_v171.py +0 -0
  193. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_golden_abb_showcase.py +0 -0
  194. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_interpreter_profiles_v08.py +0 -0
  195. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_joint_state_probe_v0125.py +0 -0
  196. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_live_provider_qualification.py +0 -0
  197. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_measured_motion_v10.py +0 -0
  198. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_moveit_planning_diagnostics_v0125.py +0 -0
  199. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_moveit_scene_v0123.py +0 -0
  200. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_natural_language_agent_v07.py +0 -0
  201. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_one_command_hardening_v13.py +0 -0
  202. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_one_command_pose_hardening_v15.py +0 -0
  203. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_one_command_regression_v141.py +0 -0
  204. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_one_command_v13.py +0 -0
  205. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_openai_strict_schema_v0113.py +0 -0
  206. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_optimization_v05.py +0 -0
  207. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_physical_campaign_v09.py +0 -0
  208. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_physical_evidence_v09.py +0 -0
  209. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_physical_motion_v09.py +0 -0
  210. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_planning_fallback_v012.py +0 -0
  211. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_pose_math_v0125.py +0 -0
  212. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_preexecution_contract_v10.py +0 -0
  213. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_production_authority_v11.py +0 -0
  214. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_production_grade_coverage_v11.py +0 -0
  215. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_production_grade_v11.py +0 -0
  216. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_project_spine_v013.py +0 -0
  217. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_provider_and_qualification.py +0 -0
  218. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_provider_criterion_v15.py +0 -0
  219. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_qualification_cli_lifecycle_v06.py +0 -0
  220. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_qualification_harness_v06.py +0 -0
  221. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_readme_pypi.py +0 -0
  222. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_real_provider_adapters.py +0 -0
  223. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_reference_workcell_ros_frames_v0125.py +0 -0
  224. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_reference_workcell_v012.py +0 -0
  225. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_report_test_contract_coverage_v16.py +0 -0
  226. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_report_test_lineage_v16.py +0 -0
  227. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_report_test_visual_execution_v16.py +0 -0
  228. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_robot_platform_v08.py +0 -0
  229. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_ros2_production_receipts_v011.py +0 -0
  230. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_ros2_simulation.py +0 -0
  231. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_ros_trajectory_v09.py +0 -0
  232. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_selective_verification_v14.py +0 -0
  233. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_setup_profile.py +0 -0
  234. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_sim_real_qualification_v011.py +0 -0
  235. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_simulation_platform_v08.py +0 -0
  236. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_smooth_motion_hotfix_v162.py +0 -0
  237. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_support_contact_hotfix_v161.py +0 -0
  238. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_tool_collision_v011.py +0 -0
  239. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_tool_scene_v0124.py +0 -0
  240. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_trajectory_action_probe_v0125.py +0 -0
  241. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_trajectory_qualification_v09.py +0 -0
  242. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_trajectory_tracking_v0125.py +0 -0
  243. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_twin_materialization_v10.py +0 -0
  244. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_twin_v08.py +0 -0
  245. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_ur5e_adapter_scopes_v09.py +0 -0
  246. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_ur5e_v10_adapter_scopes.py +0 -0
  247. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_user_cli_interactive_v131.py +0 -0
  248. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_user_cli_progress_v131.py +0 -0
  249. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_user_cli_report_visual_v16.py +0 -0
  250. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_user_cli_selective_v14.py +0 -0
  251. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_user_cli_v15.py +0 -0
  252. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_user_cli_v15_hotfix_inheritance.py +0 -0
  253. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_v052_stabilization.py +0 -0
  254. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_v08_catalog_mapping_regression.py +0 -0
  255. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_workpiece_attach_semantics_v183.py +0 -0
  256. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_workpiece_lifecycle_v011.py +0 -0
  257. {devagent_physical_engine-1.8.6 → devagent_physical_engine-1.8.8}/tests/test_workpiece_scene_probe_v185.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devagent-physical-engine
3
- Version: 1.8.6
3
+ Version: 1.8.8
4
4
  Summary: Verification-first robotics commissioning runtime with exact-Twin evidence, qualified UR5e Gazebo/MoveIt report execution, truthful robot support tiers, selective verification, replay, regression, and FAT reporting.
5
5
  Author: Tom Ha
6
6
  License: All Rights Reserved
@@ -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.6
79
+ python -m pip install --upgrade devagent-physical-engine==1.8.8
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.6
91
+ 1.8.8
92
92
  ```
93
93
 
94
94
  Run the normal customer workflow:
@@ -438,6 +438,16 @@ Every lifecycle transition persists a deterministic receipt containing probe std
438
438
 
439
439
  This release does not disable collision checking, change the verified tool/workpiece geometry, modify motion targets, planner types or speeds, detach early, grant site qualification, or expand real-execution authority.
440
440
 
441
+ ## v1.8.8 canonical world integrity gate before GRASP
442
+
443
+ v1.8.8 packages the latest workpiece-lifecycle diagnostics as an unambiguous release version so target acceptance no longer runs newer code while reporting `1.8.6`.
444
+
445
+ Before ATTACH, DevAgent now reasserts the exact canonical Twin workpiece into the live MoveIt world, synchronously reads the object back, normalizes ROS `uint8/octet` primitive representations safely, and requires exact identity/frame/geometry plus bounded pose agreement before attachment is attempted. Primitive type `0` remains invalid; DevAgent does not infer BOX/CYLINDER from dimensions or weaken collision checking.
446
+
447
+ The lifecycle receipt records the pre/post primitive type representation, canonical-world reassert result, semantic verification, and the exact inner failure code. Existing target poses, conservative Pilz motion limits, tool/workpiece geometry, site-qualification boundaries, and `real_execution_allowed = false` remain unchanged.
448
+
449
+ Hosted CI qualifies the software/build/install contract. The ROS/Gazebo/MoveIt workstation still requires a fresh target acceptance run of the released 1.8.8 artifact before this specific workpiece path can be called physically qualified.
450
+
441
451
  ## Qualified visual-execution scope
442
452
 
443
453
  Measured report-test execution remains intentionally narrow:
@@ -638,9 +648,9 @@ devagent-physical-ai optional provider-backed engineering front end
638
648
 
639
649
  # Project status
640
650
 
641
- **v1.8.6 — Production/Stable software workflow**
651
+ **v1.8.8 — Production/Stable software workflow**
642
652
 
643
- v1.8.6 retains v1.8.5 quaternion canonicalization, v1.8.4 PyPI metadata compliance, v1.8.3 synchronous service-safe attachment, v1.8.2 scoped destination-support place contact, and v1.8.1 direct UR5e controller/action binding. It upgrades the workpiece lifecycle to canonical MoveIt existing-object world↔attached transitions, strict physical-semantic pose/geometry verification, and persistent expected/observed lifecycle diagnostics instead of using floating representation SHA equality as PASS authority.
653
+ v1.8.8 retains the v1.8.6 semantic lifecycle and the target-candidate improvements layered after it, while making the package/version identity explicit. The current GRASP path adds ROS-octet-safe diagnostics and a synchronous canonical-world reassert/readback gate before attachment. This release is intended to make the next workstation qualification run reproducible and attributable to one exact installable artifact.
644
654
 
645
655
  Production-oriented software capabilities include:
646
656
 
@@ -655,7 +665,7 @@ exact Requirement → Mapping → Verification Plan → Case provenance
655
665
  truthful robot support tiers
656
666
  qualified UR5e report-test visual execution contract
657
667
  direct UR5e controller-manager/action readiness binding
658
- canonical MoveIt existing-object workpiece attach/detach
668
+ canonical MoveIt workpiece lifecycle with world-integrity gate
659
669
  semantic workpiece pose/geometry verification with persistent diagnostics
660
670
  scoped destination-support place contact
661
671
  experimental exact ABB IRB1200 Gazebo/MoveIt/RViz preview
@@ -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.6
38
+ python -m pip install --upgrade devagent-physical-engine==1.8.8
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.6
50
+ 1.8.8
51
51
  ```
52
52
 
53
53
  Run the normal customer workflow:
@@ -397,6 +397,16 @@ Every lifecycle transition persists a deterministic receipt containing probe std
397
397
 
398
398
  This release does not disable collision checking, change the verified tool/workpiece geometry, modify motion targets, planner types or speeds, detach early, grant site qualification, or expand real-execution authority.
399
399
 
400
+ ## v1.8.8 canonical world integrity gate before GRASP
401
+
402
+ v1.8.8 packages the latest workpiece-lifecycle diagnostics as an unambiguous release version so target acceptance no longer runs newer code while reporting `1.8.6`.
403
+
404
+ Before ATTACH, DevAgent now reasserts the exact canonical Twin workpiece into the live MoveIt world, synchronously reads the object back, normalizes ROS `uint8/octet` primitive representations safely, and requires exact identity/frame/geometry plus bounded pose agreement before attachment is attempted. Primitive type `0` remains invalid; DevAgent does not infer BOX/CYLINDER from dimensions or weaken collision checking.
405
+
406
+ The lifecycle receipt records the pre/post primitive type representation, canonical-world reassert result, semantic verification, and the exact inner failure code. Existing target poses, conservative Pilz motion limits, tool/workpiece geometry, site-qualification boundaries, and `real_execution_allowed = false` remain unchanged.
407
+
408
+ Hosted CI qualifies the software/build/install contract. The ROS/Gazebo/MoveIt workstation still requires a fresh target acceptance run of the released 1.8.8 artifact before this specific workpiece path can be called physically qualified.
409
+
400
410
  ## Qualified visual-execution scope
401
411
 
402
412
  Measured report-test execution remains intentionally narrow:
@@ -597,9 +607,9 @@ devagent-physical-ai optional provider-backed engineering front end
597
607
 
598
608
  # Project status
599
609
 
600
- **v1.8.6 — Production/Stable software workflow**
610
+ **v1.8.8 — Production/Stable software workflow**
601
611
 
602
- v1.8.6 retains v1.8.5 quaternion canonicalization, v1.8.4 PyPI metadata compliance, v1.8.3 synchronous service-safe attachment, v1.8.2 scoped destination-support place contact, and v1.8.1 direct UR5e controller/action binding. It upgrades the workpiece lifecycle to canonical MoveIt existing-object world↔attached transitions, strict physical-semantic pose/geometry verification, and persistent expected/observed lifecycle diagnostics instead of using floating representation SHA equality as PASS authority.
612
+ v1.8.8 retains the v1.8.6 semantic lifecycle and the target-candidate improvements layered after it, while making the package/version identity explicit. The current GRASP path adds ROS-octet-safe diagnostics and a synchronous canonical-world reassert/readback gate before attachment. This release is intended to make the next workstation qualification run reproducible and attributable to one exact installable artifact.
603
613
 
604
614
  Production-oriented software capabilities include:
605
615
 
@@ -614,7 +624,7 @@ exact Requirement → Mapping → Verification Plan → Case provenance
614
624
  truthful robot support tiers
615
625
  qualified UR5e report-test visual execution contract
616
626
  direct UR5e controller-manager/action readiness binding
617
- canonical MoveIt existing-object workpiece attach/detach
627
+ canonical MoveIt workpiece lifecycle with world-integrity gate
618
628
  semantic workpiece pose/geometry verification with persistent diagnostics
619
629
  scoped destination-support place contact
620
630
  experimental exact ABB IRB1200 Gazebo/MoveIt/RViz preview
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "devagent-physical-engine"
7
- version = "1.8.6"
7
+ version = "1.8.8"
8
8
  description = "Verification-first robotics commissioning runtime with exact-Twin evidence, qualified UR5e Gazebo/MoveIt report execution, truthful robot support tiers, selective verification, replay, regression, and FAT reporting."
9
9
  readme = { file = "README.md", content-type = "text/markdown" }
10
10
  requires-python = ">=3.11"
@@ -66,6 +66,8 @@ omit = [
66
66
  # Pure contracts/reference-workcell logic remains inside the hosted coverage gate.
67
67
  "src/devagent_physical_engine/ros2/*_probe.py",
68
68
  "src/devagent_physical_engine/ros2/workpiece_scene_probe_v186.py",
69
+ "src/devagent_physical_engine/ros2/workpiece_scene_probe_v187.py",
70
+ "src/devagent_physical_engine/ros2/workpiece_scene_probe_v188.py",
69
71
  "src/devagent_physical_engine/ros2/qualification*.py",
70
72
  "src/devagent_physical_engine/ros2/joint_state_recorder.py",
71
73
  "src/devagent_physical_engine/ros2/ur5e_adapter.py",
@@ -219,4 +219,4 @@ install_industrial_motion_v170()
219
219
  install_controller_runtime_hotfix_v181()
220
220
  install_one_command_runtime()
221
221
 
222
- __version__ = "1.8.6"
222
+ __version__ = "1.8.8"
@@ -124,7 +124,7 @@ class MoveItWorkpieceLifecycleBridge:
124
124
  )
125
125
  temporary.replace(payload_path)
126
126
 
127
- helper = Path(__file__).with_name("workpiece_scene_probe_v186.py").resolve()
127
+ helper = Path(__file__).with_name("workpiece_scene_probe_v188.py").resolve()
128
128
  result = self.runner.run(
129
129
  (
130
130
  "python3",
@@ -0,0 +1,408 @@
1
+ from __future__ import annotations
2
+
3
+ import argparse
4
+ import json
5
+ from pathlib import Path
6
+ from typing import Any
7
+
8
+ try:
9
+ from .workpiece_scene_probe import (
10
+ _canonical_attachment,
11
+ _collision_object,
12
+ _compose,
13
+ _hash,
14
+ _lookup_transform,
15
+ _pose_payload,
16
+ )
17
+ from .workpiece_scene_probe_v186 import (
18
+ GEOMETRY_DIMENSION_TOLERANCE_M,
19
+ _apply_scene,
20
+ _dimensions_match,
21
+ _inspect_collision,
22
+ _read_scene_state,
23
+ _verify_semantics,
24
+ )
25
+ except ImportError: # Direct helper execution under distro Python.
26
+ from workpiece_scene_probe import ( # type: ignore[no-redef]
27
+ _canonical_attachment,
28
+ _collision_object,
29
+ _compose,
30
+ _hash,
31
+ _lookup_transform,
32
+ _pose_payload,
33
+ )
34
+ from workpiece_scene_probe_v186 import ( # type: ignore[no-redef]
35
+ GEOMETRY_DIMENSION_TOLERANCE_M,
36
+ _apply_scene,
37
+ _dimensions_match,
38
+ _inspect_collision,
39
+ _read_scene_state,
40
+ _verify_semantics,
41
+ )
42
+
43
+
44
+ def _diagnostic_hash(
45
+ *,
46
+ tool_link: str,
47
+ item: dict[str, Any],
48
+ position,
49
+ quaternion,
50
+ ) -> str:
51
+ return _hash(_canonical_attachment(tool_link, item, position, quaternion))
52
+
53
+
54
+ def transition(path: Path, *, operation: str, timeout_s: float) -> dict[str, Any]:
55
+ payload = json.loads(path.read_text(encoding="utf-8"))
56
+ item = dict(payload["workpiece"])
57
+ planning_frame = str(payload["planning_frame"])
58
+ tool_link = str(payload["tool_link"])
59
+ touch_links = tuple(str(value) for value in payload.get("touch_links", [tool_link]))
60
+ materialization_hash = str(payload["materialization_hash"])
61
+ twin_hash = str(payload["twin_hash"])
62
+ workpiece_id = str(item["id"])
63
+
64
+ pose_data = item["pose"]
65
+ expected_world_position = tuple(float(value) for value in pose_data["position_m"])
66
+ expected_world_q = tuple(float(value) for value in pose_data["quaternion_xyzw"])
67
+ expected_item = {
68
+ "id": workpiece_id,
69
+ "geometry_kind": str(item["geometry_kind"]),
70
+ "dimensions_m": [float(value) for value in item["dimensions_m"]],
71
+ }
72
+
73
+ import rclpy
74
+ from geometry_msgs.msg import Pose
75
+ from moveit_msgs.msg import AttachedCollisionObject, CollisionObject, PlanningScene
76
+ from moveit_msgs.srv import ApplyPlanningScene, GetPlanningScene
77
+ from shape_msgs.msg import SolidPrimitive
78
+ from tf2_ros import Buffer, TransformListener
79
+
80
+ rclpy.init()
81
+ node = rclpy.create_node("devagent_workpiece_scene_probe_v187")
82
+ apply_client = node.create_client(ApplyPlanningScene, "/apply_planning_scene")
83
+ get_client = node.create_client(GetPlanningScene, "/get_planning_scene")
84
+ buffer = Buffer()
85
+ listener = TransformListener(buffer, node, spin_thread=False)
86
+ try:
87
+ if not apply_client.wait_for_service(timeout_sec=timeout_s):
88
+ return {"success": False, "code": "apply_planning_scene_unavailable"}
89
+ if not get_client.wait_for_service(timeout_sec=timeout_s):
90
+ return {"success": False, "code": "get_planning_scene_unavailable"}
91
+
92
+ pre_world, pre_attached = _read_scene_state(
93
+ get_client, node, timeout_s, workpiece_id
94
+ )
95
+
96
+ if operation == "attach":
97
+ if len(pre_world) != 1 or pre_attached:
98
+ return {
99
+ "success": False,
100
+ "code": "workpiece_attach_precondition_mismatch",
101
+ "observed_world_count": len(pre_world),
102
+ "observed_attached_count": len(pre_attached),
103
+ }
104
+
105
+ try:
106
+ observed_world = _inspect_collision(pre_world[0], SolidPrimitive)
107
+ except ValueError as exc:
108
+ return {
109
+ "success": False,
110
+ "code": "workpiece_world_shape_invalid",
111
+ "detail": str(exc),
112
+ }
113
+
114
+ world_semantics = _verify_semantics(
115
+ expected_item=expected_item,
116
+ expected_frame=planning_frame,
117
+ expected_position=expected_world_position,
118
+ expected_quaternion=expected_world_q,
119
+ observed=observed_world,
120
+ )
121
+ if not world_semantics["success"]:
122
+ return {
123
+ "success": False,
124
+ "code": "workpiece_world_semantic_mismatch",
125
+ "observed_world": observed_world,
126
+ "world_semantics": world_semantics,
127
+ }
128
+
129
+ transform = _lookup_transform(
130
+ node,
131
+ buffer,
132
+ target_frame=tool_link,
133
+ source_frame=planning_frame,
134
+ timeout_s=timeout_s,
135
+ )
136
+ transform_position = (
137
+ float(transform.transform.translation.x),
138
+ float(transform.transform.translation.y),
139
+ float(transform.transform.translation.z),
140
+ )
141
+ transform_q = (
142
+ float(transform.transform.rotation.x),
143
+ float(transform.transform.rotation.y),
144
+ float(transform.transform.rotation.z),
145
+ float(transform.transform.rotation.w),
146
+ )
147
+ expected_relative_position, expected_relative_q = _compose(
148
+ transform_position,
149
+ transform_q,
150
+ observed_world["position_m"],
151
+ observed_world["quaternion_xyzw"],
152
+ )
153
+
154
+ # v1.8.5 target evidence proved this explicit AttachedCollisionObject
155
+ # representation is accepted by the real Jazzy MoveIt stack. v1.8.6
156
+ # changed both the verifier and the attach mechanism to an ID-only transfer,
157
+ # making the resulting relative pose depend on MoveIt's asynchronously
158
+ # sampled internal RobotState while the verifier used live TF. Keep semantic
159
+ # verification, but make the command and verifier share this exact TF-derived
160
+ # tool-relative pose and the already-verified geometry. MoveIt removes the
161
+ # same-ID world object as part of the attach; no redundant world REMOVE is sent.
162
+ attached = AttachedCollisionObject()
163
+ attached.link_name = tool_link
164
+ attached.touch_links = list(touch_links)
165
+ attached.object = _collision_object(
166
+ expected_item,
167
+ tool_link,
168
+ expected_relative_position,
169
+ expected_relative_q,
170
+ operation=CollisionObject.ADD,
171
+ CollisionObject=CollisionObject,
172
+ Pose=Pose,
173
+ SolidPrimitive=SolidPrimitive,
174
+ )
175
+ scene = PlanningScene()
176
+ scene.is_diff = True
177
+ scene.robot_state.is_diff = True
178
+ scene.robot_state.attached_collision_objects.append(attached)
179
+ failure = _apply_scene(apply_client, node, scene, timeout_s)
180
+ if failure is not None:
181
+ return {
182
+ **failure,
183
+ "attach_mode": "explicit_verified_geometry",
184
+ "expected_attachment_pose": _pose_payload(
185
+ expected_relative_position, expected_relative_q
186
+ ),
187
+ }
188
+
189
+ post_world, post_attached = _read_scene_state(
190
+ get_client, node, timeout_s, workpiece_id
191
+ )
192
+ observed_link = (
193
+ post_attached[0].link_name if len(post_attached) == 1 else None
194
+ )
195
+ if post_world or len(post_attached) != 1 or observed_link != tool_link:
196
+ return {
197
+ "success": False,
198
+ "code": "workpiece_attach_readback_mismatch",
199
+ "attach_mode": "explicit_verified_geometry",
200
+ "observed_world_count": len(post_world),
201
+ "observed_attached_count": len(post_attached),
202
+ "observed_attached_link": observed_link,
203
+ }
204
+
205
+ observed_touch_links = tuple(sorted(set(post_attached[0].touch_links)))
206
+ expected_touch_links = tuple(sorted(set(touch_links)))
207
+ if observed_touch_links != expected_touch_links:
208
+ return {
209
+ "success": False,
210
+ "code": "workpiece_attachment_touch_links_mismatch",
211
+ "attach_mode": "explicit_verified_geometry",
212
+ "expected_touch_links": list(expected_touch_links),
213
+ "observed_touch_links": list(observed_touch_links),
214
+ }
215
+
216
+ try:
217
+ observed_attached = _inspect_collision(
218
+ post_attached[0].object, SolidPrimitive
219
+ )
220
+ except ValueError as exc:
221
+ return {
222
+ "success": False,
223
+ "code": "workpiece_attached_shape_invalid",
224
+ "attach_mode": "explicit_verified_geometry",
225
+ "detail": str(exc),
226
+ }
227
+
228
+ attached_semantics = _verify_semantics(
229
+ expected_item=expected_item,
230
+ expected_frame=tool_link,
231
+ expected_position=expected_relative_position,
232
+ expected_quaternion=expected_relative_q,
233
+ observed=observed_attached,
234
+ )
235
+ expected_hash = _diagnostic_hash(
236
+ tool_link=tool_link,
237
+ item=expected_item,
238
+ position=expected_relative_position,
239
+ quaternion=expected_relative_q,
240
+ )
241
+ observed_item = {
242
+ "id": observed_attached["id"],
243
+ "geometry_kind": observed_attached["geometry_kind"],
244
+ "dimensions_m": observed_attached["dimensions_m"],
245
+ }
246
+ observed_hash = _diagnostic_hash(
247
+ tool_link=tool_link,
248
+ item=observed_item,
249
+ position=observed_attached["position_m"],
250
+ quaternion=observed_attached["quaternion_xyzw"],
251
+ )
252
+ diagnostic = {
253
+ "materialization_hash": materialization_hash,
254
+ "twin_hash": twin_hash,
255
+ "attach_mode": "explicit_verified_geometry",
256
+ "observed_world_present": False,
257
+ "observed_attached_link": tool_link,
258
+ "expected_attachment_hash": expected_hash,
259
+ "observed_attachment_hash": observed_hash,
260
+ "representation_hash_match": observed_hash == expected_hash,
261
+ "expected_attachment_pose": _pose_payload(
262
+ expected_relative_position, expected_relative_q
263
+ ),
264
+ "observed_attachment": observed_attached,
265
+ "attachment_semantics": attached_semantics,
266
+ "expected_touch_links": list(expected_touch_links),
267
+ "observed_touch_links": list(observed_touch_links),
268
+ }
269
+ if not attached_semantics["success"]:
270
+ return {
271
+ "success": False,
272
+ "code": "workpiece_attachment_semantic_mismatch",
273
+ **diagnostic,
274
+ }
275
+ return {
276
+ "success": True,
277
+ "code": "workpiece_attach_verified",
278
+ "attachment_hash": expected_hash,
279
+ **diagnostic,
280
+ }
281
+
282
+ if operation == "detach":
283
+ if pre_world or len(pre_attached) != 1:
284
+ return {
285
+ "success": False,
286
+ "code": "workpiece_detach_precondition_mismatch",
287
+ "observed_world_count": len(pre_world),
288
+ "observed_attached_count": len(pre_attached),
289
+ }
290
+ if pre_attached[0].link_name != tool_link:
291
+ return {
292
+ "success": False,
293
+ "code": "workpiece_detach_link_mismatch",
294
+ "observed_attached_link": pre_attached[0].link_name,
295
+ "expected_attached_link": tool_link,
296
+ }
297
+ try:
298
+ before_detach = _inspect_collision(
299
+ pre_attached[0].object, SolidPrimitive
300
+ )
301
+ except ValueError as exc:
302
+ return {
303
+ "success": False,
304
+ "code": "workpiece_attached_shape_invalid",
305
+ "detail": str(exc),
306
+ }
307
+ if (
308
+ before_detach["geometry_kind"] != expected_item["geometry_kind"]
309
+ or not _dimensions_match(
310
+ expected_item["dimensions_m"],
311
+ before_detach["dimensions_m"],
312
+ GEOMETRY_DIMENSION_TOLERANCE_M,
313
+ )
314
+ ):
315
+ return {
316
+ "success": False,
317
+ "code": "workpiece_detach_geometry_mismatch",
318
+ "observed_attachment": before_detach,
319
+ }
320
+
321
+ attached = AttachedCollisionObject()
322
+ attached.link_name = tool_link
323
+ attached.object.id = workpiece_id
324
+ attached.object.operation = CollisionObject.REMOVE
325
+ scene = PlanningScene()
326
+ scene.is_diff = True
327
+ scene.robot_state.is_diff = True
328
+ scene.robot_state.attached_collision_objects.append(attached)
329
+ failure = _apply_scene(apply_client, node, scene, timeout_s)
330
+ if failure is not None:
331
+ return failure
332
+
333
+ post_world, post_attached = _read_scene_state(
334
+ get_client, node, timeout_s, workpiece_id
335
+ )
336
+ if len(post_world) != 1 or post_attached:
337
+ return {
338
+ "success": False,
339
+ "code": "workpiece_detach_readback_mismatch",
340
+ "observed_world_count": len(post_world),
341
+ "observed_attached_count": len(post_attached),
342
+ }
343
+ try:
344
+ observed_world = _inspect_collision(post_world[0], SolidPrimitive)
345
+ except ValueError as exc:
346
+ return {
347
+ "success": False,
348
+ "code": "workpiece_world_shape_invalid",
349
+ "detail": str(exc),
350
+ }
351
+ world_semantics = _verify_semantics(
352
+ expected_item=expected_item,
353
+ expected_frame=planning_frame,
354
+ expected_position=expected_world_position,
355
+ expected_quaternion=expected_world_q,
356
+ observed=observed_world,
357
+ )
358
+ diagnostic = {
359
+ "materialization_hash": materialization_hash,
360
+ "twin_hash": twin_hash,
361
+ "observed_world_present": True,
362
+ "observed_attached_link": None,
363
+ "observed_world": observed_world,
364
+ "world_semantics": world_semantics,
365
+ }
366
+ if not world_semantics["success"]:
367
+ return {
368
+ "success": False,
369
+ "code": "workpiece_detach_semantic_mismatch",
370
+ **diagnostic,
371
+ }
372
+ return {
373
+ "success": True,
374
+ "code": "workpiece_detach_verified",
375
+ **diagnostic,
376
+ }
377
+
378
+ return {"success": False, "code": "workpiece_operation_invalid"}
379
+ finally:
380
+ del listener
381
+ node.destroy_node()
382
+ rclpy.shutdown()
383
+
384
+
385
+ def main() -> int:
386
+ parser = argparse.ArgumentParser()
387
+ parser.add_argument("operation", choices=("attach", "detach"))
388
+ parser.add_argument("--input", required=True)
389
+ parser.add_argument("--timeout", type=float, default=20.0)
390
+ args = parser.parse_args()
391
+ try:
392
+ result = transition(
393
+ Path(args.input).expanduser().resolve(),
394
+ operation=str(args.operation),
395
+ timeout_s=float(args.timeout),
396
+ )
397
+ except Exception as exc:
398
+ result = {
399
+ "success": False,
400
+ "code": f"workpiece_scene_probe_error:{type(exc).__name__}",
401
+ "detail": str(exc),
402
+ }
403
+ print(json.dumps(result, sort_keys=True))
404
+ return 0 if result.get("success") else 2
405
+
406
+
407
+ if __name__ == "__main__":
408
+ raise SystemExit(main())