devagent-physical-engine 1.8.4__tar.gz → 1.8.6__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 (256) hide show
  1. {devagent_physical_engine-1.8.4/src/devagent_physical_engine.egg-info → devagent_physical_engine-1.8.6}/PKG-INFO +27 -6
  2. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/README.md +27 -6
  3. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/pyproject.toml +2 -1
  4. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/__init__.py +1 -1
  5. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/workpiece_scene.py +106 -15
  6. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/workpiece_scene_probe.py +44 -1
  7. devagent_physical_engine-1.8.6/src/devagent_physical_engine/ros2/workpiece_scene_probe_v186.py +523 -0
  8. devagent_physical_engine-1.8.6/src/devagent_physical_engine/workpiece_lifecycle.py +116 -0
  9. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6/src/devagent_physical_engine.egg-info}/PKG-INFO +27 -6
  10. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine.egg-info/SOURCES.txt +4 -1
  11. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_industrial_motion_v170.py +2 -2
  12. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_package_metadata_v184.py +2 -2
  13. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_transfer_place_diagnostic_v172.py +2 -2
  14. devagent_physical_engine-1.8.6/tests/test_workpiece_scene_probe_v185.py +52 -0
  15. devagent_physical_engine-1.8.6/tests/test_workpiece_semantic_lifecycle_v186.py +208 -0
  16. devagent_physical_engine-1.8.4/src/devagent_physical_engine/workpiece_lifecycle.py +0 -66
  17. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/NOTICE +0 -0
  18. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/setup.cfg +0 -0
  19. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/agent/__init__.py +0 -0
  20. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/agent/compiler.py +0 -0
  21. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/agent/contracts.py +0 -0
  22. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/agent/coordinator.py +0 -0
  23. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/agent/critic.py +0 -0
  24. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/agent/evidence.py +0 -0
  25. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/agent/interpreter.py +0 -0
  26. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/agent/planner.py +0 -0
  27. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/agent/recovery.py +0 -0
  28. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/agent/routing.py +0 -0
  29. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/agent/runtime.py +0 -0
  30. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/agent/semantic.py +0 -0
  31. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/agent/structured.py +0 -0
  32. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ai_cli.py +0 -0
  33. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/cli.py +0 -0
  34. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/commercial.py +0 -0
  35. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/commercial_campaign.py +0 -0
  36. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/commercial_cli.py +0 -0
  37. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/commercial_importer.py +0 -0
  38. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/commercial_intelligence.py +0 -0
  39. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/commercial_readiness.py +0 -0
  40. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/commercial_repository.py +0 -0
  41. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/continuous_clearance.py +0 -0
  42. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/controller_runtime_hotfix_v181.py +0 -0
  43. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/doctor.py +0 -0
  44. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/engineering_agent.py +0 -0
  45. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/engineering_request.py +0 -0
  46. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/evidence_replay.py +0 -0
  47. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/evidence_trust.py +0 -0
  48. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/execution.py +0 -0
  49. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/industrial_motion_hotfix_v170.py +0 -0
  50. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/industrial_motion_v170.py +0 -0
  51. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/industrial_motion_v182.py +0 -0
  52. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/models.py +0 -0
  53. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/one_command.py +0 -0
  54. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/one_command_runtime.py +0 -0
  55. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/one_command_v15.py +0 -0
  56. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/one_command_v16.py +0 -0
  57. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/operating_envelope.py +0 -0
  58. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/optimization/__init__.py +0 -0
  59. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/optimization/benchmark.py +0 -0
  60. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/optimization/candidates.py +0 -0
  61. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/optimization/contracts.py +0 -0
  62. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/optimization/evaluator.py +0 -0
  63. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/optimization/evidence.py +0 -0
  64. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/optimization/experience.py +0 -0
  65. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/optimization/measured.py +0 -0
  66. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/optimization/optimizer.py +0 -0
  67. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/optimization/orchestrator.py +0 -0
  68. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/physical_campaign.py +0 -0
  69. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/physical_evidence.py +0 -0
  70. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/physical_motion.py +0 -0
  71. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/planning.py +0 -0
  72. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/pose_math.py +0 -0
  73. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/preexecution_contract.py +0 -0
  74. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/production_authority.py +0 -0
  75. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/production_grade.py +0 -0
  76. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/project.py +0 -0
  77. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/provider_adapters/__init__.py +0 -0
  78. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/provider_adapters/anthropic.py +0 -0
  79. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/provider_adapters/common.py +0 -0
  80. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/provider_adapters/factory.py +0 -0
  81. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/provider_adapters/gemini.py +0 -0
  82. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/provider_adapters/openai.py +0 -0
  83. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/provider_criterion.py +0 -0
  84. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/provider_qualification.py +0 -0
  85. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/providers.py +0 -0
  86. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/qualification.py +0 -0
  87. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/qualification_cli.py +0 -0
  88. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/qualification_harness.py +0 -0
  89. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/reference_workcell.py +0 -0
  90. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/report_test_execution.py +0 -0
  91. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/report_test_execution_strict.py +0 -0
  92. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/robot_platform.py +0 -0
  93. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/robot_support_v18.py +0 -0
  94. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/robots.py +0 -0
  95. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/__init__.py +0 -0
  96. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/abb_irb1200.py +0 -0
  97. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/abb_irb1200_preview.py +0 -0
  98. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/acceptance.py +0 -0
  99. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/commands.py +0 -0
  100. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/continuous_clearance_probe.py +0 -0
  101. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/controller_action_probe.py +0 -0
  102. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/destination_support_contact_v182.py +0 -0
  103. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/doctor.py +0 -0
  104. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/fk_pose.py +0 -0
  105. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/fk_probe.py +0 -0
  106. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/frame_alignment.py +0 -0
  107. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/gazebo_cli.py +0 -0
  108. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/gazebo_pose.py +0 -0
  109. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/gazebo_world.py +0 -0
  110. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v170.py +0 -0
  111. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v171.py +0 -0
  112. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v172.py +0 -0
  113. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v182.py +0 -0
  114. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/joint_state_probe.py +0 -0
  115. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/joint_state_recorder.py +0 -0
  116. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/measured_motion.py +0 -0
  117. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/moveit_joint_plan_probe.py +0 -0
  118. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/moveit_joint_plan_v161_probe.py +0 -0
  119. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/moveit_scene.py +0 -0
  120. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/moveit_task_planner.py +0 -0
  121. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/pilz_sequence_plan_probe.py +0 -0
  122. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/pilz_sequence_plan_probe_v182.py +0 -0
  123. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/preexecution.py +0 -0
  124. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/qualification.py +0 -0
  125. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/qualification_v10.py +0 -0
  126. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/qualification_v11.py +0 -0
  127. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/qualification_v12.py +0 -0
  128. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/report_test_visualization.py +0 -0
  129. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/report_test_visualization_v170.py +0 -0
  130. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/scene_probe.py +0 -0
  131. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/state_validity_probe.py +0 -0
  132. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/support_contact_acm_probe_v170.py +0 -0
  133. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/support_contact_lease_v170.py +0 -0
  134. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/support_contact_runner_v161.py +0 -0
  135. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/support_contact_v161.py +0 -0
  136. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/task_adapter.py +0 -0
  137. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/task_visualization.py +0 -0
  138. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/tf_probe.py +0 -0
  139. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/tool_scene.py +0 -0
  140. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/tool_scene_probe.py +0 -0
  141. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/trajectory.py +0 -0
  142. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/trajectory_action_probe.py +0 -0
  143. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/trajectory_tracking.py +0 -0
  144. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/ur5e.py +0 -0
  145. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/ur5e_adapter.py +0 -0
  146. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/ur5e_v10_adapter.py +0 -0
  147. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/workpiece_follow.py +0 -0
  148. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/workpiece_gazebo_follower.py +0 -0
  149. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/selective_verification.py +0 -0
  150. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/selective_verification_v16.py +0 -0
  151. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/setup_profile.py +0 -0
  152. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/sim_real_qualification.py +0 -0
  153. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/simulation.py +0 -0
  154. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/simulation_platform.py +0 -0
  155. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/smooth_motion_hotfix_v162.py +0 -0
  156. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/support_contact_hotfix_v161.py +0 -0
  157. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/tool_collision.py +0 -0
  158. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/trajectory_qualification.py +0 -0
  159. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/twin.py +0 -0
  160. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/twin_builder.py +0 -0
  161. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/twin_codec.py +0 -0
  162. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/twin_materialization.py +0 -0
  163. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/user_cli.py +0 -0
  164. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/user_cli_v15.py +0 -0
  165. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/user_cli_v16.py +0 -0
  166. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/user_cli_v18.py +0 -0
  167. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/verification.py +0 -0
  168. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine.egg-info/dependency_links.txt +0 -0
  169. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine.egg-info/entry_points.txt +0 -0
  170. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine.egg-info/requires.txt +0 -0
  171. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine.egg-info/top_level.txt +0 -0
  172. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_abb_irb1200_visual_v18.py +0 -0
  173. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_agent_core.py +0 -0
  174. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_agent_semantic_hardening.py +0 -0
  175. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_ai_cli.py +0 -0
  176. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_ai_cli_v07.py +0 -0
  177. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_commercial_importer_v1.py +0 -0
  178. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_commercial_intelligence_v15.py +0 -0
  179. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_commercial_readiness_v1.py +0 -0
  180. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_commercial_v1.py +0 -0
  181. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_continuous_clearance_v011.py +0 -0
  182. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_controller_runtime_hotfix_v181.py +0 -0
  183. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_core.py +0 -0
  184. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_destination_support_contact_v182.py +0 -0
  185. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_engineering_request_v07.py +0 -0
  186. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_evidence_replay_v12.py +0 -0
  187. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_evidence_trust_coverage_v12.py +0 -0
  188. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_evidence_trust_transport_v12.py +0 -0
  189. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_evidence_trust_v12.py +0 -0
  190. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_evidence_viewer_palette_v130.py +0 -0
  191. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_gazebo_cli_v0122.py +0 -0
  192. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_golden_abb_runner_v171.py +0 -0
  193. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_golden_abb_showcase.py +0 -0
  194. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_interpreter_profiles_v08.py +0 -0
  195. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_joint_state_probe_v0125.py +0 -0
  196. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_live_provider_qualification.py +0 -0
  197. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_measured_motion_v10.py +0 -0
  198. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_moveit_planning_diagnostics_v0125.py +0 -0
  199. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_moveit_scene_v0123.py +0 -0
  200. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_natural_language_agent_v07.py +0 -0
  201. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_one_command_hardening_v13.py +0 -0
  202. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_one_command_pose_hardening_v15.py +0 -0
  203. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_one_command_regression_v141.py +0 -0
  204. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_one_command_v13.py +0 -0
  205. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_openai_strict_schema_v0113.py +0 -0
  206. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_optimization_v05.py +0 -0
  207. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_physical_campaign_v09.py +0 -0
  208. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_physical_evidence_v09.py +0 -0
  209. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_physical_motion_v09.py +0 -0
  210. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_planning_fallback_v012.py +0 -0
  211. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_pose_math_v0125.py +0 -0
  212. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_preexecution_contract_v10.py +0 -0
  213. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_production_authority_v11.py +0 -0
  214. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_production_grade_coverage_v11.py +0 -0
  215. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_production_grade_v11.py +0 -0
  216. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_project_spine_v013.py +0 -0
  217. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_provider_and_qualification.py +0 -0
  218. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_provider_criterion_v15.py +0 -0
  219. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_qualification_cli_lifecycle_v06.py +0 -0
  220. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_qualification_harness_v06.py +0 -0
  221. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_readme_pypi.py +0 -0
  222. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_real_provider_adapters.py +0 -0
  223. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_reference_workcell_ros_frames_v0125.py +0 -0
  224. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_reference_workcell_v012.py +0 -0
  225. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_report_test_contract_coverage_v16.py +0 -0
  226. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_report_test_lineage_v16.py +0 -0
  227. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_report_test_visual_execution_v16.py +0 -0
  228. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_robot_platform_v08.py +0 -0
  229. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_ros2_production_receipts_v011.py +0 -0
  230. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_ros2_simulation.py +0 -0
  231. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_ros_trajectory_v09.py +0 -0
  232. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_selective_verification_v14.py +0 -0
  233. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_setup_profile.py +0 -0
  234. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_sim_real_qualification_v011.py +0 -0
  235. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_simulation_platform_v08.py +0 -0
  236. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_smooth_motion_hotfix_v162.py +0 -0
  237. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_support_contact_hotfix_v161.py +0 -0
  238. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_tool_collision_v011.py +0 -0
  239. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_tool_scene_v0124.py +0 -0
  240. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_trajectory_action_probe_v0125.py +0 -0
  241. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_trajectory_qualification_v09.py +0 -0
  242. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_trajectory_tracking_v0125.py +0 -0
  243. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_twin_materialization_v10.py +0 -0
  244. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_twin_v08.py +0 -0
  245. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_ur5e_adapter_scopes_v09.py +0 -0
  246. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_ur5e_v10_adapter_scopes.py +0 -0
  247. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_user_cli_interactive_v131.py +0 -0
  248. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_user_cli_progress_v131.py +0 -0
  249. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_user_cli_report_visual_v16.py +0 -0
  250. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_user_cli_selective_v14.py +0 -0
  251. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_user_cli_v15.py +0 -0
  252. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_user_cli_v15_hotfix_inheritance.py +0 -0
  253. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_v052_stabilization.py +0 -0
  254. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_v08_catalog_mapping_regression.py +0 -0
  255. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_workpiece_attach_semantics_v183.py +0 -0
  256. {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_workpiece_lifecycle_v011.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devagent-physical-engine
3
- Version: 1.8.4
3
+ Version: 1.8.6
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.4
79
+ python -m pip install --upgrade devagent-physical-engine==1.8.6
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.4
91
+ 1.8.6
92
92
  ```
93
93
 
94
94
  Run the normal customer workflow:
@@ -418,6 +418,26 @@ v1.8.4 carries the exact v1.8.3 runtime semantics and shortens only the package
418
418
 
419
419
  This metadata hotfix does not change the UR5e attach/detach lifecycle, collision policy, motion planning, Twin lineage, site-qualification boundary, or real-execution authority.
420
420
 
421
+ ## v1.8.5 quaternion-invariant verified workpiece attach
422
+
423
+ A clean v1.8.4 UR5e target-stack run proved that synchronous `/apply_planning_scene` attachment now succeeds, world/attached state reaches strict read-back, and the remaining GRASP blocker is `workpiece_attachment_hash_mismatch`.
424
+
425
+ MoveIt round-trips attached-object rotations through Eigen. Unit quaternions `q` and `-q` represent the same physical rotation, but a raw component hash treats those two equivalent representations as different. v1.8.5 canonicalizes equivalent quaternion signs before workpiece attachment hashing using the same deterministic positive-`w` / first-nonzero-component rule already used by the qualified tool-scene path.
426
+
427
+ Verification remains strict for attachment identity, link, geometry contract, position, and physical rotation. This is not a tolerance-based PASS and does not change target geometry, TCP, collision policy, planner types, motion speeds, controller binding, Twin lineage, site qualification, or real-execution authority. If a hash mismatch remains, DevAgent records expected and observed hashes plus canonical expected/object/primitive/effective attachment poses for target diagnosis.
428
+
429
+ ## v1.8.6 canonical semantic workpiece lifecycle
430
+
431
+ A clean v1.8.5 UR5e target-stack run again reached all five industrial preflight groups and executed `approach_pick`, while GRASP still failed with `workpiece_attachment_hash_mismatch`. That target evidence proved raw SHA equality of floating pose representations was too brittle to remain physical PASS authority.
432
+
433
+ v1.8.6 uses MoveIt's canonical existing-object lifecycle. Before GRASP, DevAgent reads back and semantically verifies the exact world workpiece. Attach then sends an ID-only `AttachedCollisionObject.ADD`; MoveIt transfers the already-verified world object's geometry and pose into the AttachedBody on the verified tool link. Release sends an ID-only attached-object REMOVE; MoveIt restores that same AttachedBody to the world at its current global pose.
434
+
435
+ The lifecycle remains fail-closed. Attach requires exact object identity, exact attached link, exact touch-link set, exact geometry kind, dimensions within `1e-9 m`, position error no greater than `0.1 mm`, and orientation error no greater than `1e-4 rad`. Detach similarly verifies restored world identity, geometry, destination frame, position, and orientation. Representation hashes remain recorded for audit diagnostics but do not override the explicit physical-semantic checks.
436
+
437
+ Every lifecycle transition persists a deterministic receipt containing probe stdout/stderr plus expected/observed semantic diagnostics. Any failure includes the receipt path so the next target-stack blocker can be diagnosed directly instead of being collapsed to a generic lifecycle code.
438
+
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
+
421
441
  ## Qualified visual-execution scope
422
442
 
423
443
  Measured report-test execution remains intentionally narrow:
@@ -618,9 +638,9 @@ devagent-physical-ai optional provider-backed engineering front end
618
638
 
619
639
  # Project status
620
640
 
621
- **v1.8.4 — Production/Stable software workflow**
641
+ **v1.8.6 — Production/Stable software workflow**
622
642
 
623
- v1.8.4 retains the v1.8.3 synchronous verified workpiece-attach fix, the v1.8.2 scoped destination-support place contract, v1.8.1 direct UR5e controller/action binding, truthful robot support tiers, and ABB IRB1200 experimental visual runtime. The only v1.8.4 behavior change is packaging metadata compliance for PyPI; physical runtime semantics are unchanged from v1.8.3.
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.
624
644
 
625
645
  Production-oriented software capabilities include:
626
646
 
@@ -635,7 +655,8 @@ exact Requirement → Mapping → Verification Plan → Case provenance
635
655
  truthful robot support tiers
636
656
  qualified UR5e report-test visual execution contract
637
657
  direct UR5e controller-manager/action readiness binding
638
- synchronous verified workpiece attach/detach lifecycle
658
+ canonical MoveIt existing-object workpiece attach/detach
659
+ semantic workpiece pose/geometry verification with persistent diagnostics
639
660
  scoped destination-support place contact
640
661
  experimental exact ABB IRB1200 Gazebo/MoveIt/RViz preview
641
662
  industrial Pilz PTP / LIN planning
@@ -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.4
38
+ python -m pip install --upgrade devagent-physical-engine==1.8.6
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.4
50
+ 1.8.6
51
51
  ```
52
52
 
53
53
  Run the normal customer workflow:
@@ -377,6 +377,26 @@ v1.8.4 carries the exact v1.8.3 runtime semantics and shortens only the package
377
377
 
378
378
  This metadata hotfix does not change the UR5e attach/detach lifecycle, collision policy, motion planning, Twin lineage, site-qualification boundary, or real-execution authority.
379
379
 
380
+ ## v1.8.5 quaternion-invariant verified workpiece attach
381
+
382
+ A clean v1.8.4 UR5e target-stack run proved that synchronous `/apply_planning_scene` attachment now succeeds, world/attached state reaches strict read-back, and the remaining GRASP blocker is `workpiece_attachment_hash_mismatch`.
383
+
384
+ MoveIt round-trips attached-object rotations through Eigen. Unit quaternions `q` and `-q` represent the same physical rotation, but a raw component hash treats those two equivalent representations as different. v1.8.5 canonicalizes equivalent quaternion signs before workpiece attachment hashing using the same deterministic positive-`w` / first-nonzero-component rule already used by the qualified tool-scene path.
385
+
386
+ Verification remains strict for attachment identity, link, geometry contract, position, and physical rotation. This is not a tolerance-based PASS and does not change target geometry, TCP, collision policy, planner types, motion speeds, controller binding, Twin lineage, site qualification, or real-execution authority. If a hash mismatch remains, DevAgent records expected and observed hashes plus canonical expected/object/primitive/effective attachment poses for target diagnosis.
387
+
388
+ ## v1.8.6 canonical semantic workpiece lifecycle
389
+
390
+ A clean v1.8.5 UR5e target-stack run again reached all five industrial preflight groups and executed `approach_pick`, while GRASP still failed with `workpiece_attachment_hash_mismatch`. That target evidence proved raw SHA equality of floating pose representations was too brittle to remain physical PASS authority.
391
+
392
+ v1.8.6 uses MoveIt's canonical existing-object lifecycle. Before GRASP, DevAgent reads back and semantically verifies the exact world workpiece. Attach then sends an ID-only `AttachedCollisionObject.ADD`; MoveIt transfers the already-verified world object's geometry and pose into the AttachedBody on the verified tool link. Release sends an ID-only attached-object REMOVE; MoveIt restores that same AttachedBody to the world at its current global pose.
393
+
394
+ The lifecycle remains fail-closed. Attach requires exact object identity, exact attached link, exact touch-link set, exact geometry kind, dimensions within `1e-9 m`, position error no greater than `0.1 mm`, and orientation error no greater than `1e-4 rad`. Detach similarly verifies restored world identity, geometry, destination frame, position, and orientation. Representation hashes remain recorded for audit diagnostics but do not override the explicit physical-semantic checks.
395
+
396
+ Every lifecycle transition persists a deterministic receipt containing probe stdout/stderr plus expected/observed semantic diagnostics. Any failure includes the receipt path so the next target-stack blocker can be diagnosed directly instead of being collapsed to a generic lifecycle code.
397
+
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
+
380
400
  ## Qualified visual-execution scope
381
401
 
382
402
  Measured report-test execution remains intentionally narrow:
@@ -577,9 +597,9 @@ devagent-physical-ai optional provider-backed engineering front end
577
597
 
578
598
  # Project status
579
599
 
580
- **v1.8.4 — Production/Stable software workflow**
600
+ **v1.8.6 — Production/Stable software workflow**
581
601
 
582
- v1.8.4 retains the v1.8.3 synchronous verified workpiece-attach fix, the v1.8.2 scoped destination-support place contract, v1.8.1 direct UR5e controller/action binding, truthful robot support tiers, and ABB IRB1200 experimental visual runtime. The only v1.8.4 behavior change is packaging metadata compliance for PyPI; physical runtime semantics are unchanged from v1.8.3.
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.
583
603
 
584
604
  Production-oriented software capabilities include:
585
605
 
@@ -594,7 +614,8 @@ exact Requirement → Mapping → Verification Plan → Case provenance
594
614
  truthful robot support tiers
595
615
  qualified UR5e report-test visual execution contract
596
616
  direct UR5e controller-manager/action readiness binding
597
- synchronous verified workpiece attach/detach lifecycle
617
+ canonical MoveIt existing-object workpiece attach/detach
618
+ semantic workpiece pose/geometry verification with persistent diagnostics
598
619
  scoped destination-support place contact
599
620
  experimental exact ABB IRB1200 Gazebo/MoveIt/RViz preview
600
621
  industrial Pilz PTP / LIN planning
@@ -648,4 +669,4 @@ Original creator: Tom Ha
648
669
  Original project: https://github.com/tomha85/devagent-physical-engine
649
670
  All rights reserved.
650
671
 
651
- See repository `LICENSE`, `NOTICE`, and `COPYRIGHT` for complete ownership and usage terms.
672
+ See repository `LICENSE`, `NOTICE`, and `COPYRIGHT` for complete ownership and usage terms.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "devagent-physical-engine"
7
- version = "1.8.4"
7
+ version = "1.8.6"
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"
@@ -65,6 +65,7 @@ omit = [
65
65
  # simulator, move_group, TF, controller actions, or gz services.
66
66
  # Pure contracts/reference-workcell logic remains inside the hosted coverage gate.
67
67
  "src/devagent_physical_engine/ros2/*_probe.py",
68
+ "src/devagent_physical_engine/ros2/workpiece_scene_probe_v186.py",
68
69
  "src/devagent_physical_engine/ros2/qualification*.py",
69
70
  "src/devagent_physical_engine/ros2/joint_state_recorder.py",
70
71
  "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.4"
222
+ __version__ = "1.8.6"
@@ -38,6 +38,30 @@ class MoveItWorkpieceLifecycleBridge:
38
38
  raise SimulationPlatformError("workpiece_materialization_missing_or_ambiguous")
39
39
  return matches[0]
40
40
 
41
+ @staticmethod
42
+ def _persist_probe_receipt(
43
+ path: Path,
44
+ *,
45
+ operation: WorkpieceOperation,
46
+ result,
47
+ output: dict[str, object] | None,
48
+ ) -> None:
49
+ record = {
50
+ "operation": operation.value,
51
+ "command_ok": bool(result.ok),
52
+ "returncode": int(getattr(result, "returncode", 0 if result.ok else 1)),
53
+ "duration_s": float(getattr(result, "duration_s", 0.0)),
54
+ "stdout": str(getattr(result, "stdout", "")),
55
+ "stderr": str(getattr(result, "stderr", "")),
56
+ "probe_output": output,
57
+ }
58
+ temporary = path.with_suffix(path.suffix + ".tmp")
59
+ temporary.write_text(
60
+ json.dumps(record, indent=2, sort_keys=True, allow_nan=False) + "\n",
61
+ encoding="utf-8",
62
+ )
63
+ temporary.replace(path)
64
+
41
65
  def _transition(
42
66
  self,
43
67
  *,
@@ -63,7 +87,11 @@ class MoveItWorkpieceLifecycleBridge:
63
87
  raise SimulationPlatformError("workpiece_world_pose_override_non_finite")
64
88
 
65
89
  workpiece = self._workpiece(materialization, workpiece_entity_id)
66
- position = tuple(world_position_m) if world_position_m is not None else workpiece.position_m
90
+ position = (
91
+ tuple(world_position_m)
92
+ if world_position_m is not None
93
+ else workpiece.position_m
94
+ )
67
95
  quaternion = (
68
96
  tuple(world_quaternion_xyzw)
69
97
  if world_quaternion_xyzw is not None
@@ -86,7 +114,9 @@ class MoveItWorkpieceLifecycleBridge:
86
114
  },
87
115
  },
88
116
  }
89
- payload_path = self.work_dir / f"{materialization.fingerprint}.{operation.value}.{workpiece.backend_id}.json"
117
+ payload_path = self.work_dir / (
118
+ f"{materialization.fingerprint}.{operation.value}.{workpiece.backend_id}.json"
119
+ )
90
120
  temporary = payload_path.with_suffix(payload_path.suffix + ".tmp")
91
121
  temporary.write_text(
92
122
  json.dumps(payload, sort_keys=True, separators=(",", ":"), allow_nan=False),
@@ -94,7 +124,7 @@ class MoveItWorkpieceLifecycleBridge:
94
124
  )
95
125
  temporary.replace(payload_path)
96
126
 
97
- helper = Path(__file__).with_name("workpiece_scene_probe.py").resolve()
127
+ helper = Path(__file__).with_name("workpiece_scene_probe_v186.py").resolve()
98
128
  result = self.runner.run(
99
129
  (
100
130
  "python3",
@@ -107,14 +137,43 @@ class MoveItWorkpieceLifecycleBridge:
107
137
  ),
108
138
  timeout_s=self.timeout_s + 10.0,
109
139
  )
140
+ probe_receipt_path = payload_path.with_name(payload_path.name + ".receipt.json")
141
+ output: dict[str, object] | None = None
110
142
  try:
111
- output = json.loads(result.stdout.strip().splitlines()[-1])
112
- except (IndexError, json.JSONDecodeError) as exc:
113
- raise SimulationPlatformError("workpiece_scene_probe_output_invalid") from exc
114
- if not isinstance(output, dict):
115
- raise SimulationPlatformError("workpiece_scene_probe_output_invalid")
143
+ decoded = json.loads(result.stdout.strip().splitlines()[-1])
144
+ if isinstance(decoded, dict):
145
+ output = decoded
146
+ except (IndexError, json.JSONDecodeError):
147
+ output = None
148
+ self._persist_probe_receipt(
149
+ probe_receipt_path,
150
+ operation=operation,
151
+ result=result,
152
+ output=output,
153
+ )
154
+ if output is None:
155
+ raise SimulationPlatformError(
156
+ f"workpiece_scene_probe_output_invalid:evidence={probe_receipt_path}"
157
+ )
116
158
 
117
159
  verified = bool(output.get("success")) and result.ok
160
+ semantic_key = (
161
+ "attachment_semantics"
162
+ if operation is WorkpieceOperation.ATTACH
163
+ else "world_semantics"
164
+ )
165
+ semantic = output.get(semantic_key)
166
+ semantic_payload = semantic if isinstance(semantic, dict) else {}
167
+ observed_world_present = (
168
+ bool(output["observed_world_present"])
169
+ if "observed_world_present" in output
170
+ else int(output.get("observed_world_count") or 0) > 0
171
+ )
172
+ observed_attached_link = (
173
+ str(output["observed_attached_link"])
174
+ if output.get("observed_attached_link") is not None
175
+ else None
176
+ )
118
177
  receipt = WorkpieceLifecycleReceipt(
119
178
  operation=operation,
120
179
  verified=verified,
@@ -133,20 +192,52 @@ class MoveItWorkpieceLifecycleBridge:
133
192
  if operation is WorkpieceOperation.ATTACH
134
193
  else WorkpieceState.WORLD
135
194
  ),
136
- observed_world_present=bool(output.get("observed_world_present")),
137
- observed_attached_link=(
138
- str(output["observed_attached_link"])
139
- if output.get("observed_attached_link") is not None
140
- else None
141
- ),
195
+ observed_world_present=observed_world_present,
196
+ observed_attached_link=observed_attached_link,
142
197
  attachment_hash=(
143
198
  str(output["attachment_hash"])
144
199
  if output.get("attachment_hash") is not None
145
200
  else None
146
201
  ),
202
+ observed_attachment_hash=(
203
+ str(output["observed_attachment_hash"])
204
+ if output.get("observed_attachment_hash") is not None
205
+ else None
206
+ ),
207
+ representation_hash_match=(
208
+ bool(output["representation_hash_match"])
209
+ if output.get("representation_hash_match") is not None
210
+ else None
211
+ ),
212
+ semantic_verified=(
213
+ bool(semantic_payload.get("success")) if semantic_payload else None
214
+ ),
215
+ position_error_m=(
216
+ float(semantic_payload["position_error_m"])
217
+ if semantic_payload.get("position_error_m") is not None
218
+ else None
219
+ ),
220
+ orientation_error_rad=(
221
+ float(semantic_payload["orientation_error_rad"])
222
+ if semantic_payload.get("orientation_error_rad") is not None
223
+ else None
224
+ ),
225
+ position_tolerance_m=(
226
+ float(semantic_payload["position_tolerance_m"])
227
+ if semantic_payload.get("position_tolerance_m") is not None
228
+ else None
229
+ ),
230
+ orientation_tolerance_rad=(
231
+ float(semantic_payload["orientation_tolerance_rad"])
232
+ if semantic_payload.get("orientation_tolerance_rad") is not None
233
+ else None
234
+ ),
235
+ diagnostic_path=str(probe_receipt_path),
147
236
  )
148
237
  if not receipt.verified:
149
- raise SimulationPlatformError(f"workpiece_lifecycle_failed:{receipt.code}")
238
+ raise SimulationPlatformError(
239
+ f"workpiece_lifecycle_failed:{receipt.code}:evidence={probe_receipt_path}"
240
+ )
150
241
  return receipt
151
242
 
152
243
  def attach(
@@ -26,6 +26,24 @@ def _qnorm(q):
26
26
  return tuple(float(value) / norm for value in q)
27
27
 
28
28
 
29
+ def _qcanonical(q):
30
+ """Canonicalize equivalent q/-q rotations to one deterministic form."""
31
+
32
+ quaternion = _qnorm(q)
33
+ # A quaternion and its negation represent the same physical rotation. MoveIt
34
+ # round-trips poses through Eigen, which may legitimately return the opposite
35
+ # quaternion sign. Hash the rotation, not an arbitrary representation of it.
36
+ # Prefer positive w; for exact 180-degree rotations use the first non-zero xyz
37
+ # component as the deterministic sign discriminator.
38
+ for component in (quaternion[3], quaternion[0], quaternion[1], quaternion[2]):
39
+ if abs(component) <= 1e-15:
40
+ continue
41
+ if component < 0.0:
42
+ quaternion = tuple(-value for value in quaternion)
43
+ break
44
+ return tuple(_canon_float(value) for value in quaternion)
45
+
46
+
29
47
  def _qmul(first, second):
30
48
  ax, ay, az, aw = first
31
49
  bx, by, bz, bw = second
@@ -69,6 +87,13 @@ def _pose_from_msg(pose):
69
87
  )
70
88
 
71
89
 
90
+ def _pose_payload(position, quaternion) -> dict[str, list[float]]:
91
+ return {
92
+ "position_m": [_canon_float(value) for value in position],
93
+ "quaternion_xyzw": list(_qcanonical(quaternion)),
94
+ }
95
+
96
+
72
97
  def _pose_to_msg(position, quaternion, Pose):
73
98
  pose = Pose()
74
99
  pose.position.x, pose.position.y, pose.position.z = (float(value) for value in position)
@@ -90,7 +115,7 @@ def _canonical_attachment(
90
115
  "geometry_kind": str(item["geometry_kind"]),
91
116
  "dimensions_m": [_canon_float(value) for value in item["dimensions_m"]],
92
117
  "position_m": [_canon_float(value) for value in position],
93
- "quaternion_xyzw": [_canon_float(value) for value in _qnorm(quaternion)],
118
+ "quaternion_xyzw": list(_qcanonical(quaternion)),
94
119
  }
95
120
 
96
121
 
@@ -224,6 +249,7 @@ def transition(path: Path, *, operation: str, timeout_s: float) -> dict[str, Any
224
249
  scene.is_diff = True
225
250
  scene.robot_state.is_diff = True
226
251
  attachment_hash = None
252
+ expected_attachment_pose = None
227
253
 
228
254
  if operation == "attach":
229
255
  transform = _lookup_transform(
@@ -279,6 +305,10 @@ def transition(path: Path, *, operation: str, timeout_s: float) -> dict[str, Any
279
305
  relative_quaternion,
280
306
  )
281
307
  attachment_hash = _hash(expected_attachment)
308
+ expected_attachment_pose = _pose_payload(
309
+ relative_position,
310
+ relative_quaternion,
311
+ )
282
312
  elif operation == "detach":
283
313
  attached = AttachedCollisionObject()
284
314
  attached.link_name = tool_link
@@ -361,6 +391,18 @@ def transition(path: Path, *, operation: str, timeout_s: float) -> dict[str, Any
361
391
  "code": "workpiece_attachment_hash_mismatch",
362
392
  "observed_world_present": world_present,
363
393
  "observed_attached_link": observed_attached_link,
394
+ "expected_attachment_hash": attachment_hash,
395
+ "observed_attachment_hash": observed_attachment_hash,
396
+ "expected_attachment_pose": expected_attachment_pose,
397
+ "observed_object_pose": _pose_payload(object_position, object_q),
398
+ "observed_primitive_pose": _pose_payload(
399
+ primitive_position,
400
+ primitive_q,
401
+ ),
402
+ "observed_attachment_pose": _pose_payload(
403
+ observed_position,
404
+ observed_q,
405
+ ),
364
406
  }
365
407
  return {
366
408
  "success": True,
@@ -370,6 +412,7 @@ def transition(path: Path, *, operation: str, timeout_s: float) -> dict[str, Any
370
412
  "observed_world_present": False,
371
413
  "observed_attached_link": tool_link,
372
414
  "attachment_hash": attachment_hash,
415
+ "attachment_pose": expected_attachment_pose,
373
416
  }
374
417
 
375
418
  success = world_present and not attached_items