devagent-physical-engine 1.8.1__tar.gz → 1.8.4__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 (252) hide show
  1. {devagent_physical_engine-1.8.1/src/devagent_physical_engine.egg-info → devagent_physical_engine-1.8.4}/PKG-INFO +60 -8
  2. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/README.md +59 -7
  3. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/pyproject.toml +3 -2
  4. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/__init__.py +1 -1
  5. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/industrial_motion_hotfix_v170.py +15 -9
  6. devagent_physical_engine-1.8.4/src/devagent_physical_engine/industrial_motion_v182.py +127 -0
  7. devagent_physical_engine-1.8.4/src/devagent_physical_engine/ros2/destination_support_contact_v182.py +56 -0
  8. devagent_physical_engine-1.8.4/src/devagent_physical_engine/ros2/industrial_sequence_planner_v182.py +208 -0
  9. devagent_physical_engine-1.8.4/src/devagent_physical_engine/ros2/pilz_sequence_plan_probe_v182.py +101 -0
  10. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/workpiece_scene_probe.py +93 -30
  11. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4/src/devagent_physical_engine.egg-info}/PKG-INFO +60 -8
  12. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine.egg-info/SOURCES.txt +7 -0
  13. devagent_physical_engine-1.8.4/tests/test_destination_support_contact_v182.py +234 -0
  14. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_industrial_motion_v170.py +13 -6
  15. devagent_physical_engine-1.8.4/tests/test_package_metadata_v184.py +23 -0
  16. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_transfer_place_diagnostic_v172.py +9 -3
  17. devagent_physical_engine-1.8.4/tests/test_workpiece_attach_semantics_v183.py +38 -0
  18. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/NOTICE +0 -0
  19. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/setup.cfg +0 -0
  20. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/__init__.py +0 -0
  21. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/compiler.py +0 -0
  22. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/contracts.py +0 -0
  23. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/coordinator.py +0 -0
  24. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/critic.py +0 -0
  25. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/evidence.py +0 -0
  26. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/interpreter.py +0 -0
  27. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/planner.py +0 -0
  28. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/recovery.py +0 -0
  29. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/routing.py +0 -0
  30. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/runtime.py +0 -0
  31. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/semantic.py +0 -0
  32. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/structured.py +0 -0
  33. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ai_cli.py +0 -0
  34. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/cli.py +0 -0
  35. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/commercial.py +0 -0
  36. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/commercial_campaign.py +0 -0
  37. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/commercial_cli.py +0 -0
  38. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/commercial_importer.py +0 -0
  39. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/commercial_intelligence.py +0 -0
  40. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/commercial_readiness.py +0 -0
  41. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/commercial_repository.py +0 -0
  42. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/continuous_clearance.py +0 -0
  43. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/controller_runtime_hotfix_v181.py +0 -0
  44. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/doctor.py +0 -0
  45. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/engineering_agent.py +0 -0
  46. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/engineering_request.py +0 -0
  47. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/evidence_replay.py +0 -0
  48. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/evidence_trust.py +0 -0
  49. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/execution.py +0 -0
  50. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/industrial_motion_v170.py +0 -0
  51. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/models.py +0 -0
  52. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/one_command.py +0 -0
  53. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/one_command_runtime.py +0 -0
  54. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/one_command_v15.py +0 -0
  55. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/one_command_v16.py +0 -0
  56. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/operating_envelope.py +0 -0
  57. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/optimization/__init__.py +0 -0
  58. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/optimization/benchmark.py +0 -0
  59. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/optimization/candidates.py +0 -0
  60. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/optimization/contracts.py +0 -0
  61. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/optimization/evaluator.py +0 -0
  62. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/optimization/evidence.py +0 -0
  63. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/optimization/experience.py +0 -0
  64. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/optimization/measured.py +0 -0
  65. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/optimization/optimizer.py +0 -0
  66. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/optimization/orchestrator.py +0 -0
  67. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/physical_campaign.py +0 -0
  68. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/physical_evidence.py +0 -0
  69. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/physical_motion.py +0 -0
  70. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/planning.py +0 -0
  71. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/pose_math.py +0 -0
  72. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/preexecution_contract.py +0 -0
  73. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/production_authority.py +0 -0
  74. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/production_grade.py +0 -0
  75. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/project.py +0 -0
  76. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/provider_adapters/__init__.py +0 -0
  77. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/provider_adapters/anthropic.py +0 -0
  78. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/provider_adapters/common.py +0 -0
  79. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/provider_adapters/factory.py +0 -0
  80. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/provider_adapters/gemini.py +0 -0
  81. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/provider_adapters/openai.py +0 -0
  82. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/provider_criterion.py +0 -0
  83. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/provider_qualification.py +0 -0
  84. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/providers.py +0 -0
  85. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/qualification.py +0 -0
  86. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/qualification_cli.py +0 -0
  87. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/qualification_harness.py +0 -0
  88. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/reference_workcell.py +0 -0
  89. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/report_test_execution.py +0 -0
  90. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/report_test_execution_strict.py +0 -0
  91. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/robot_platform.py +0 -0
  92. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/robot_support_v18.py +0 -0
  93. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/robots.py +0 -0
  94. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/__init__.py +0 -0
  95. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/abb_irb1200.py +0 -0
  96. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/abb_irb1200_preview.py +0 -0
  97. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/acceptance.py +0 -0
  98. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/commands.py +0 -0
  99. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/continuous_clearance_probe.py +0 -0
  100. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/controller_action_probe.py +0 -0
  101. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/doctor.py +0 -0
  102. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/fk_pose.py +0 -0
  103. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/fk_probe.py +0 -0
  104. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/frame_alignment.py +0 -0
  105. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/gazebo_cli.py +0 -0
  106. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/gazebo_pose.py +0 -0
  107. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/gazebo_world.py +0 -0
  108. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v170.py +0 -0
  109. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v171.py +0 -0
  110. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v172.py +0 -0
  111. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/joint_state_probe.py +0 -0
  112. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/joint_state_recorder.py +0 -0
  113. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/measured_motion.py +0 -0
  114. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/moveit_joint_plan_probe.py +0 -0
  115. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/moveit_joint_plan_v161_probe.py +0 -0
  116. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/moveit_scene.py +0 -0
  117. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/moveit_task_planner.py +0 -0
  118. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/pilz_sequence_plan_probe.py +0 -0
  119. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/preexecution.py +0 -0
  120. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/qualification.py +0 -0
  121. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/qualification_v10.py +0 -0
  122. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/qualification_v11.py +0 -0
  123. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/qualification_v12.py +0 -0
  124. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/report_test_visualization.py +0 -0
  125. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/report_test_visualization_v170.py +0 -0
  126. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/scene_probe.py +0 -0
  127. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/state_validity_probe.py +0 -0
  128. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/support_contact_acm_probe_v170.py +0 -0
  129. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/support_contact_lease_v170.py +0 -0
  130. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/support_contact_runner_v161.py +0 -0
  131. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/support_contact_v161.py +0 -0
  132. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/task_adapter.py +0 -0
  133. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/task_visualization.py +0 -0
  134. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/tf_probe.py +0 -0
  135. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/tool_scene.py +0 -0
  136. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/tool_scene_probe.py +0 -0
  137. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/trajectory.py +0 -0
  138. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/trajectory_action_probe.py +0 -0
  139. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/trajectory_tracking.py +0 -0
  140. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/ur5e.py +0 -0
  141. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/ur5e_adapter.py +0 -0
  142. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/ur5e_v10_adapter.py +0 -0
  143. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/workpiece_follow.py +0 -0
  144. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/workpiece_gazebo_follower.py +0 -0
  145. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/workpiece_scene.py +0 -0
  146. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/selective_verification.py +0 -0
  147. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/selective_verification_v16.py +0 -0
  148. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/setup_profile.py +0 -0
  149. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/sim_real_qualification.py +0 -0
  150. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/simulation.py +0 -0
  151. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/simulation_platform.py +0 -0
  152. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/smooth_motion_hotfix_v162.py +0 -0
  153. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/support_contact_hotfix_v161.py +0 -0
  154. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/tool_collision.py +0 -0
  155. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/trajectory_qualification.py +0 -0
  156. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/twin.py +0 -0
  157. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/twin_builder.py +0 -0
  158. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/twin_codec.py +0 -0
  159. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/twin_materialization.py +0 -0
  160. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/user_cli.py +0 -0
  161. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/user_cli_v15.py +0 -0
  162. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/user_cli_v16.py +0 -0
  163. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/user_cli_v18.py +0 -0
  164. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/verification.py +0 -0
  165. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/workpiece_lifecycle.py +0 -0
  166. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine.egg-info/dependency_links.txt +0 -0
  167. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine.egg-info/entry_points.txt +0 -0
  168. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine.egg-info/requires.txt +0 -0
  169. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine.egg-info/top_level.txt +0 -0
  170. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_abb_irb1200_visual_v18.py +0 -0
  171. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_agent_core.py +0 -0
  172. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_agent_semantic_hardening.py +0 -0
  173. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_ai_cli.py +0 -0
  174. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_ai_cli_v07.py +0 -0
  175. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_commercial_importer_v1.py +0 -0
  176. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_commercial_intelligence_v15.py +0 -0
  177. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_commercial_readiness_v1.py +0 -0
  178. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_commercial_v1.py +0 -0
  179. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_continuous_clearance_v011.py +0 -0
  180. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_controller_runtime_hotfix_v181.py +0 -0
  181. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_core.py +0 -0
  182. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_engineering_request_v07.py +0 -0
  183. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_evidence_replay_v12.py +0 -0
  184. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_evidence_trust_coverage_v12.py +0 -0
  185. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_evidence_trust_transport_v12.py +0 -0
  186. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_evidence_trust_v12.py +0 -0
  187. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_evidence_viewer_palette_v130.py +0 -0
  188. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_gazebo_cli_v0122.py +0 -0
  189. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_golden_abb_runner_v171.py +0 -0
  190. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_golden_abb_showcase.py +0 -0
  191. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_interpreter_profiles_v08.py +0 -0
  192. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_joint_state_probe_v0125.py +0 -0
  193. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_live_provider_qualification.py +0 -0
  194. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_measured_motion_v10.py +0 -0
  195. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_moveit_planning_diagnostics_v0125.py +0 -0
  196. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_moveit_scene_v0123.py +0 -0
  197. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_natural_language_agent_v07.py +0 -0
  198. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_one_command_hardening_v13.py +0 -0
  199. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_one_command_pose_hardening_v15.py +0 -0
  200. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_one_command_regression_v141.py +0 -0
  201. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_one_command_v13.py +0 -0
  202. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_openai_strict_schema_v0113.py +0 -0
  203. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_optimization_v05.py +0 -0
  204. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_physical_campaign_v09.py +0 -0
  205. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_physical_evidence_v09.py +0 -0
  206. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_physical_motion_v09.py +0 -0
  207. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_planning_fallback_v012.py +0 -0
  208. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_pose_math_v0125.py +0 -0
  209. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_preexecution_contract_v10.py +0 -0
  210. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_production_authority_v11.py +0 -0
  211. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_production_grade_coverage_v11.py +0 -0
  212. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_production_grade_v11.py +0 -0
  213. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_project_spine_v013.py +0 -0
  214. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_provider_and_qualification.py +0 -0
  215. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_provider_criterion_v15.py +0 -0
  216. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_qualification_cli_lifecycle_v06.py +0 -0
  217. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_qualification_harness_v06.py +0 -0
  218. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_readme_pypi.py +0 -0
  219. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_real_provider_adapters.py +0 -0
  220. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_reference_workcell_ros_frames_v0125.py +0 -0
  221. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_reference_workcell_v012.py +0 -0
  222. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_report_test_contract_coverage_v16.py +0 -0
  223. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_report_test_lineage_v16.py +0 -0
  224. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_report_test_visual_execution_v16.py +0 -0
  225. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_robot_platform_v08.py +0 -0
  226. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_ros2_production_receipts_v011.py +0 -0
  227. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_ros2_simulation.py +0 -0
  228. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_ros_trajectory_v09.py +0 -0
  229. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_selective_verification_v14.py +0 -0
  230. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_setup_profile.py +0 -0
  231. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_sim_real_qualification_v011.py +0 -0
  232. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_simulation_platform_v08.py +0 -0
  233. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_smooth_motion_hotfix_v162.py +0 -0
  234. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_support_contact_hotfix_v161.py +0 -0
  235. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_tool_collision_v011.py +0 -0
  236. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_tool_scene_v0124.py +0 -0
  237. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_trajectory_action_probe_v0125.py +0 -0
  238. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_trajectory_qualification_v09.py +0 -0
  239. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_trajectory_tracking_v0125.py +0 -0
  240. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_twin_materialization_v10.py +0 -0
  241. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_twin_v08.py +0 -0
  242. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_ur5e_adapter_scopes_v09.py +0 -0
  243. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_ur5e_v10_adapter_scopes.py +0 -0
  244. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_user_cli_interactive_v131.py +0 -0
  245. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_user_cli_progress_v131.py +0 -0
  246. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_user_cli_report_visual_v16.py +0 -0
  247. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_user_cli_selective_v14.py +0 -0
  248. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_user_cli_v15.py +0 -0
  249. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_user_cli_v15_hotfix_inheritance.py +0 -0
  250. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_v052_stabilization.py +0 -0
  251. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_v08_catalog_mapping_regression.py +0 -0
  252. {devagent_physical_engine-1.8.1 → devagent_physical_engine-1.8.4}/tests/test_workpiece_lifecycle_v011.py +0 -0
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devagent-physical-engine
3
- Version: 1.8.1
4
- Summary: Production-grade verification-first robotics evidence runtime with one-command customer intake, truthful robot support tiers, qualified UR5e report-test Gazebo execution, direct ROS controller/action readiness, experimental ABB IRB1200 Gazebo/MoveIt/RViz visualization, transfer/place diagnostics, requirement-driven test generation, selective verification, deterministic Twin lineage, measured physical verification, replay inspection, regression, and FAT evidence.
3
+ Version: 1.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
7
7
  Project-URL: Homepage, https://github.com/tomha85/devagent-physical-engine
@@ -76,7 +76,7 @@ regression + FAT report + Evidence Viewer
76
76
  Python 3.11+ is required.
77
77
 
78
78
  ```bash
79
- python -m pip install --upgrade devagent-physical-engine==1.8.1
79
+ python -m pip install --upgrade devagent-physical-engine==1.8.4
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.1
91
+ 1.8.4
92
92
  ```
93
93
 
94
94
  Run the normal customer workflow:
@@ -256,7 +256,7 @@ HOME
256
256
  ↓ PTP
257
257
  ```
258
258
 
259
- Execution groups:
259
+ Original v1.7 execution groups:
260
260
 
261
261
  ```text
262
262
  approach_pick PTP → LIN
@@ -368,6 +368,56 @@ v1.8.1 makes UR5e readiness and trajectory execution use one controller-binding
368
368
 
369
369
  The readiness gate therefore no longer depends on a long-lived `ros2 daemon`, `ros2 node list`, `ros2 topic list`, or `ros2 action list`. It remains fail-closed on missing controller-manager service, no active trajectory controller, ambiguous active controllers, a missing trajectory action server, or missing required UR5e joint state. No collision rule, Pilz target, motion speed, Twin lineage, site-qualification boundary, or real-execution authority is relaxed.
370
370
 
371
+ ## v1.8.2 scoped destination-support place contact
372
+
373
+ A clean v1.8.1 UR5e target-stack run reached exact-Twin read-back and independently proved that transfer PTP planning succeeds while the attached-workpiece place LIN segment fails. v1.8.2 converts that evidence into a narrow placement contract rather than disabling collision checking.
374
+
375
+ The qualified report runtime now uses hard transfer/place boundaries:
376
+
377
+ ```text
378
+ approach_pick PTP → LIN
379
+ lift_departure LIN
380
+ transfer_departure PTP
381
+ transfer_place LIN # place only
382
+ retreat_home LIN → PTP
383
+ ```
384
+
385
+ `transfer_departure` remains normally collision checked. Only the single zero-blend `place` LIN planning request may add one request-local Allowed Collision Matrix pair:
386
+
387
+ ```text
388
+ attached workpiece ↔ declared destination support
389
+ ```
390
+
391
+ The place probe starts from the complete live MoveIt ACM, preserves every existing entry, enables only that symmetric pair, and applies the matrix only to the request-local PlanningScene diff. The transfer path cannot inherit the allowance. No global/live destination-contact lease remains active after planning.
392
+
393
+ The v1.8.2 place receipt records the exact destination support id, workpiece id, phase, and contact scope. Missing destination identity, a non-attached scene, a non-LIN place planner, nonzero place blending, malformed support identity, or mismatched receipt fails closed.
394
+
395
+ The release does **not** change real-execution authority, site qualification, target poses, conservative motion scales, or the rule that every motion group must preflight successfully before execution begins.
396
+
397
+ ## v1.8.3 synchronous verified workpiece attach
398
+
399
+ A clean v1.8.2 target-stack run proved all five industrial preflight groups and actual `approach_pick` execution, then failed closed at GRASP with `workpiece_lifecycle_failed:apply_planning_scene_rejected`.
400
+
401
+ The attach request previously combined an `AttachedCollisionObject.ADD` with a redundant same-ID world `CollisionObject.REMOVE`. MoveIt applies attached-object state first, which already transitions the same-ID object out of the world. Processing the later redundant world REMOVE can therefore make synchronous `/apply_planning_scene` report failure even though the attachment transition was already attempted.
402
+
403
+ v1.8.3 makes the attach transition service-safe and deterministic: the request contains only the authoritative attached-object ADD. DevAgent then synchronously reads the PlanningScene back and requires all of the following before motion may continue:
404
+
405
+ ```text
406
+ workpiece absent from world
407
+ exactly one attached object with the expected id
408
+ attached link == verified tool mount link
409
+ attached primitive geometry is valid
410
+ attachment pose/geometry hash matches the expected attachment hash
411
+ ```
412
+
413
+ Detach semantics remain explicit attached-object REMOVE plus world-object ADD at the verified placement pose. No collision rule, tool/workpiece geometry, TCP, touch link, target pose, motion speed, planner, site-qualification boundary, or real-execution authority is relaxed.
414
+
415
+ ## v1.8.4 PyPI metadata compliance hotfix
416
+
417
+ v1.8.4 carries the exact v1.8.3 runtime semantics and shortens only the package Core Metadata `Summary` so it satisfies PyPI's 512-character limit. A regression test now parses `pyproject.toml` and rejects an empty or over-limit project description before release.
418
+
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
+
371
421
  ## Qualified visual-execution scope
372
422
 
373
423
  Measured report-test execution remains intentionally narrow:
@@ -568,9 +618,9 @@ devagent-physical-ai optional provider-backed engineering front end
568
618
 
569
619
  # Project status
570
620
 
571
- **v1.8.1 — Production/Stable software workflow**
621
+ **v1.8.4 — Production/Stable software workflow**
572
622
 
573
- v1.8.1 retains the v1.8.0 truthful robot support tiers and ABB IRB1200 experimental visual runtime, while fixing the UR5e target-stack readiness gate so it directly binds the active controller manager trajectory controller and exact `FollowJointTrajectory` server instead of depending on ROS CLI graph discovery or an unscaled-controller naming assumption.
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.
574
624
 
575
625
  Production-oriented software capabilities include:
576
626
 
@@ -585,11 +635,13 @@ exact Requirement → Mapping → Verification Plan → Case provenance
585
635
  truthful robot support tiers
586
636
  qualified UR5e report-test visual execution contract
587
637
  direct UR5e controller-manager/action readiness binding
638
+ synchronous verified workpiece attach/detach lifecycle
639
+ scoped destination-support place contact
588
640
  experimental exact ABB IRB1200 Gazebo/MoveIt/RViz preview
589
641
  industrial Pilz PTP / LIN planning
590
642
  adaptive bounded blend selection
591
643
  plan-only transfer/place segment diagnostics
592
- lift-only support-contact ACM lease + exact restore
644
+ lift-only source-support contact lease + exact restore
593
645
  Gazebo/MoveIt selected-case visualization
594
646
  typed physical measurement binding
595
647
  deterministic campaigns
@@ -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.1
38
+ python -m pip install --upgrade devagent-physical-engine==1.8.4
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.1
50
+ 1.8.4
51
51
  ```
52
52
 
53
53
  Run the normal customer workflow:
@@ -215,7 +215,7 @@ HOME
215
215
  ↓ PTP
216
216
  ```
217
217
 
218
- Execution groups:
218
+ Original v1.7 execution groups:
219
219
 
220
220
  ```text
221
221
  approach_pick PTP → LIN
@@ -327,6 +327,56 @@ v1.8.1 makes UR5e readiness and trajectory execution use one controller-binding
327
327
 
328
328
  The readiness gate therefore no longer depends on a long-lived `ros2 daemon`, `ros2 node list`, `ros2 topic list`, or `ros2 action list`. It remains fail-closed on missing controller-manager service, no active trajectory controller, ambiguous active controllers, a missing trajectory action server, or missing required UR5e joint state. No collision rule, Pilz target, motion speed, Twin lineage, site-qualification boundary, or real-execution authority is relaxed.
329
329
 
330
+ ## v1.8.2 scoped destination-support place contact
331
+
332
+ A clean v1.8.1 UR5e target-stack run reached exact-Twin read-back and independently proved that transfer PTP planning succeeds while the attached-workpiece place LIN segment fails. v1.8.2 converts that evidence into a narrow placement contract rather than disabling collision checking.
333
+
334
+ The qualified report runtime now uses hard transfer/place boundaries:
335
+
336
+ ```text
337
+ approach_pick PTP → LIN
338
+ lift_departure LIN
339
+ transfer_departure PTP
340
+ transfer_place LIN # place only
341
+ retreat_home LIN → PTP
342
+ ```
343
+
344
+ `transfer_departure` remains normally collision checked. Only the single zero-blend `place` LIN planning request may add one request-local Allowed Collision Matrix pair:
345
+
346
+ ```text
347
+ attached workpiece ↔ declared destination support
348
+ ```
349
+
350
+ The place probe starts from the complete live MoveIt ACM, preserves every existing entry, enables only that symmetric pair, and applies the matrix only to the request-local PlanningScene diff. The transfer path cannot inherit the allowance. No global/live destination-contact lease remains active after planning.
351
+
352
+ The v1.8.2 place receipt records the exact destination support id, workpiece id, phase, and contact scope. Missing destination identity, a non-attached scene, a non-LIN place planner, nonzero place blending, malformed support identity, or mismatched receipt fails closed.
353
+
354
+ The release does **not** change real-execution authority, site qualification, target poses, conservative motion scales, or the rule that every motion group must preflight successfully before execution begins.
355
+
356
+ ## v1.8.3 synchronous verified workpiece attach
357
+
358
+ A clean v1.8.2 target-stack run proved all five industrial preflight groups and actual `approach_pick` execution, then failed closed at GRASP with `workpiece_lifecycle_failed:apply_planning_scene_rejected`.
359
+
360
+ The attach request previously combined an `AttachedCollisionObject.ADD` with a redundant same-ID world `CollisionObject.REMOVE`. MoveIt applies attached-object state first, which already transitions the same-ID object out of the world. Processing the later redundant world REMOVE can therefore make synchronous `/apply_planning_scene` report failure even though the attachment transition was already attempted.
361
+
362
+ v1.8.3 makes the attach transition service-safe and deterministic: the request contains only the authoritative attached-object ADD. DevAgent then synchronously reads the PlanningScene back and requires all of the following before motion may continue:
363
+
364
+ ```text
365
+ workpiece absent from world
366
+ exactly one attached object with the expected id
367
+ attached link == verified tool mount link
368
+ attached primitive geometry is valid
369
+ attachment pose/geometry hash matches the expected attachment hash
370
+ ```
371
+
372
+ Detach semantics remain explicit attached-object REMOVE plus world-object ADD at the verified placement pose. No collision rule, tool/workpiece geometry, TCP, touch link, target pose, motion speed, planner, site-qualification boundary, or real-execution authority is relaxed.
373
+
374
+ ## v1.8.4 PyPI metadata compliance hotfix
375
+
376
+ v1.8.4 carries the exact v1.8.3 runtime semantics and shortens only the package Core Metadata `Summary` so it satisfies PyPI's 512-character limit. A regression test now parses `pyproject.toml` and rejects an empty or over-limit project description before release.
377
+
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
+
330
380
  ## Qualified visual-execution scope
331
381
 
332
382
  Measured report-test execution remains intentionally narrow:
@@ -527,9 +577,9 @@ devagent-physical-ai optional provider-backed engineering front end
527
577
 
528
578
  # Project status
529
579
 
530
- **v1.8.1 — Production/Stable software workflow**
580
+ **v1.8.4 — Production/Stable software workflow**
531
581
 
532
- v1.8.1 retains the v1.8.0 truthful robot support tiers and ABB IRB1200 experimental visual runtime, while fixing the UR5e target-stack readiness gate so it directly binds the active controller manager trajectory controller and exact `FollowJointTrajectory` server instead of depending on ROS CLI graph discovery or an unscaled-controller naming assumption.
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.
533
583
 
534
584
  Production-oriented software capabilities include:
535
585
 
@@ -544,11 +594,13 @@ exact Requirement → Mapping → Verification Plan → Case provenance
544
594
  truthful robot support tiers
545
595
  qualified UR5e report-test visual execution contract
546
596
  direct UR5e controller-manager/action readiness binding
597
+ synchronous verified workpiece attach/detach lifecycle
598
+ scoped destination-support place contact
547
599
  experimental exact ABB IRB1200 Gazebo/MoveIt/RViz preview
548
600
  industrial Pilz PTP / LIN planning
549
601
  adaptive bounded blend selection
550
602
  plan-only transfer/place segment diagnostics
551
- lift-only support-contact ACM lease + exact restore
603
+ lift-only source-support contact lease + exact restore
552
604
  Gazebo/MoveIt selected-case visualization
553
605
  typed physical measurement binding
554
606
  deterministic campaigns
@@ -596,4 +648,4 @@ Original creator: Tom Ha
596
648
  Original project: https://github.com/tomha85/devagent-physical-engine
597
649
  All rights reserved.
598
650
 
599
- See repository `LICENSE`, `NOTICE`, and `COPYRIGHT` for complete ownership and usage terms.
651
+ See repository `LICENSE`, `NOTICE`, and `COPYRIGHT` for complete ownership and usage terms.
@@ -4,8 +4,8 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "devagent-physical-engine"
7
- version = "1.8.1"
8
- description = "Production-grade verification-first robotics evidence runtime with one-command customer intake, truthful robot support tiers, qualified UR5e report-test Gazebo execution, direct ROS controller/action readiness, experimental ABB IRB1200 Gazebo/MoveIt/RViz visualization, transfer/place diagnostics, requirement-driven test generation, selective verification, deterministic Twin lineage, measured physical verification, replay inspection, regression, and FAT evidence."
7
+ version = "1.8.4"
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"
11
11
  dependencies = ["PyYAML>=6.0,<7"]
@@ -76,6 +76,7 @@ omit = [
76
76
  "src/devagent_physical_engine/ros2/industrial_sequence_planner_v170.py",
77
77
  "src/devagent_physical_engine/ros2/industrial_sequence_planner_v171.py",
78
78
  "src/devagent_physical_engine/ros2/industrial_sequence_planner_v172.py",
79
+ "src/devagent_physical_engine/ros2/industrial_sequence_planner_v182.py",
79
80
  "src/devagent_physical_engine/ros2/support_contact_lease_v170.py",
80
81
  "src/devagent_physical_engine/ros2/fk_pose.py",
81
82
  "src/devagent_physical_engine/ros2/gazebo_pose.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.1"
222
+ __version__ = "1.8.4"
@@ -24,24 +24,30 @@ def _patch_constructor(cls) -> None:
24
24
 
25
25
 
26
26
  def install_industrial_motion_v170() -> None:
27
- """Route report-test execution through the qualified v1.7 industrial runtime.
27
+ """Route report-test execution through the latest qualified industrial runtime.
28
28
 
29
- v1.7.1 retries only generic Pilz sequence-planning failures with smaller internal
30
- blend radii. v1.7.2 retains that bounded fallback and, if transfer/place still
31
- fails at zero blend, runs plan-only transfer PTP and place LIN probes against the
32
- same attached-workpiece scene. The probes only improve diagnosis; they never grant
33
- execution authority or relax geometry, collision, speed, scene, or Twin lineage.
29
+ v1.7.1 retains bounded blend fallback and v1.7.2 retains independent transfer/
30
+ place diagnostics for the legacy two-segment group. v1.8.2 introduces a stricter
31
+ destination-contact boundary for the qualified report runtime: transfer is a
32
+ separate normally collision-checked PTP group, while the existing
33
+ ``transfer_place`` execution/release boundary becomes one zero-blend LIN place
34
+ group. Only that single place request may allow the attached workpiece to contact
35
+ the declared destination support, and only through a request-local full-ACM diff.
36
+ No real-execution authority, geometry, speed, Twin lineage, or other collision
37
+ relationship is relaxed.
34
38
  """
35
39
 
36
40
  from . import report_test_execution as base_exec
37
41
  from . import report_test_execution_strict as strict_exec
42
+ from .industrial_motion_v182 import reference_industrial_groups_v182
38
43
  from .ros2 import report_test_visualization as base_visual
39
44
  from .ros2 import report_test_visualization_v170 as visual_v170
40
- from .ros2.industrial_sequence_planner_v172 import (
41
- PilzIndustrialSequencePlannerV172,
45
+ from .ros2.industrial_sequence_planner_v182 import (
46
+ PilzIndustrialSequencePlannerV182,
42
47
  )
43
48
 
44
- visual_v170.PilzIndustrialSequencePlannerV170 = PilzIndustrialSequencePlannerV172
49
+ visual_v170.PilzIndustrialSequencePlannerV170 = PilzIndustrialSequencePlannerV182
50
+ visual_v170.reference_industrial_groups = reference_industrial_groups_v182
45
51
 
46
52
  base_exec.run_report_test_visualization = run_report_test_visualization_v170
47
53
  strict_exec.run_report_test_visualization = run_report_test_visualization_v170
@@ -0,0 +1,127 @@
1
+ from __future__ import annotations
2
+
3
+ from .industrial_motion_v170 import (
4
+ LIN_ACCELERATION_SCALE,
5
+ LIN_VELOCITY_SCALE,
6
+ PTP_ACCELERATION_SCALE,
7
+ PTP_VELOCITY_SCALE,
8
+ SAFE_BLEND_RADIUS_M,
9
+ IndustrialGroupSpec,
10
+ IndustrialSegmentSpec,
11
+ )
12
+
13
+
14
+ INDUSTRIAL_MOTION_PROFILE_V182 = "pilz_ptp_lin_destination_contact_v2"
15
+
16
+
17
+ def reference_industrial_groups_v182() -> tuple[IndustrialGroupSpec, ...]:
18
+ """Qualified UR5e motion boundaries for destination-support placement.
19
+
20
+ v1.8.2 makes destination contact a hard motion boundary. Transfer is planned as
21
+ one collision-normal PTP group. Place is then planned as one zero-blend LIN group
22
+ whose request-local PlanningScene may allow exactly the attached workpiece and
23
+ the declared destination support to contact. This keeps the contact allowance out
24
+ of transfer geometry while preserving the existing execution/release boundary at
25
+ the ``transfer_place`` group id.
26
+ """
27
+
28
+ groups = (
29
+ IndustrialGroupSpec(
30
+ "approach_pick",
31
+ (
32
+ IndustrialSegmentSpec(
33
+ "pre_pick",
34
+ "PTP",
35
+ SAFE_BLEND_RADIUS_M,
36
+ PTP_VELOCITY_SCALE,
37
+ PTP_ACCELERATION_SCALE,
38
+ ),
39
+ IndustrialSegmentSpec(
40
+ "pick",
41
+ "LIN",
42
+ 0.0,
43
+ LIN_VELOCITY_SCALE,
44
+ LIN_ACCELERATION_SCALE,
45
+ ),
46
+ ),
47
+ workpiece_loaded=False,
48
+ scene_state="inherit",
49
+ ),
50
+ IndustrialGroupSpec(
51
+ "lift_departure",
52
+ (
53
+ IndustrialSegmentSpec(
54
+ "lift",
55
+ "LIN",
56
+ 0.0,
57
+ LIN_VELOCITY_SCALE,
58
+ LIN_ACCELERATION_SCALE,
59
+ ),
60
+ ),
61
+ workpiece_loaded=True,
62
+ scene_state="attached",
63
+ support_contact_departure=True,
64
+ ),
65
+ IndustrialGroupSpec(
66
+ "transfer_departure",
67
+ (
68
+ IndustrialSegmentSpec(
69
+ "transfer",
70
+ "PTP",
71
+ 0.0,
72
+ PTP_VELOCITY_SCALE,
73
+ PTP_ACCELERATION_SCALE,
74
+ ),
75
+ ),
76
+ workpiece_loaded=True,
77
+ scene_state="attached",
78
+ ),
79
+ IndustrialGroupSpec(
80
+ "transfer_place",
81
+ (
82
+ IndustrialSegmentSpec(
83
+ "place",
84
+ "LIN",
85
+ 0.0,
86
+ LIN_VELOCITY_SCALE,
87
+ LIN_ACCELERATION_SCALE,
88
+ ),
89
+ ),
90
+ workpiece_loaded=True,
91
+ scene_state="attached",
92
+ ),
93
+ IndustrialGroupSpec(
94
+ "retreat_home",
95
+ (
96
+ IndustrialSegmentSpec(
97
+ "retract",
98
+ "LIN",
99
+ SAFE_BLEND_RADIUS_M,
100
+ LIN_VELOCITY_SCALE,
101
+ LIN_ACCELERATION_SCALE,
102
+ ),
103
+ IndustrialSegmentSpec(
104
+ "return_home",
105
+ "PTP",
106
+ 0.0,
107
+ PTP_VELOCITY_SCALE,
108
+ PTP_ACCELERATION_SCALE,
109
+ ),
110
+ ),
111
+ workpiece_loaded=False,
112
+ scene_state="world",
113
+ ),
114
+ )
115
+ expected = (
116
+ "pre_pick",
117
+ "pick",
118
+ "lift",
119
+ "transfer",
120
+ "place",
121
+ "retract",
122
+ "return_home",
123
+ )
124
+ actual = tuple(phase for group in groups for phase in group.phase_names)
125
+ if actual != expected:
126
+ raise RuntimeError("industrial_v182_reference_phase_coverage_invalid")
127
+ return groups
@@ -0,0 +1,56 @@
1
+ from __future__ import annotations
2
+
3
+ from copy import deepcopy
4
+ from typing import Any, Mapping
5
+
6
+ from ..simulation_platform import SimulationPlatformError
7
+ from .support_contact_v161 import support_surface_backend_id
8
+
9
+
10
+ DESTINATION_SUPPORT_CONTACT_SCOPE = "place_arrival_only"
11
+ DESTINATION_SUPPORT_CONTACT_PHASE = "place"
12
+
13
+
14
+ def destination_support_backend_id(destination_entity_id: str) -> str:
15
+ destination = str(destination_entity_id).strip()
16
+ if not destination:
17
+ raise SimulationPlatformError("destination_support_entity_id_missing")
18
+ return support_surface_backend_id(destination)
19
+
20
+
21
+ def prepare_destination_support_scene(
22
+ scene_contract: Mapping[str, Any] | None,
23
+ *,
24
+ destination_entity_id: str,
25
+ ) -> tuple[dict[str, Any], str, str]:
26
+ """Allow exactly attached-workpiece ↔ declared destination support for place.
27
+
28
+ The returned scene is a request-local copy. No live/global ACM state is mutated.
29
+ The caller must use it only for a single zero-blend LIN ``place`` request.
30
+ """
31
+
32
+ if not isinstance(scene_contract, Mapping):
33
+ raise SimulationPlatformError("destination_support_scene_required")
34
+ if str(scene_contract.get("state") or "") != "attached":
35
+ raise SimulationPlatformError("destination_support_requires_attached_scene")
36
+ raw_workpiece = scene_contract.get("workpiece")
37
+ if not isinstance(raw_workpiece, Mapping):
38
+ raise SimulationPlatformError("destination_support_workpiece_missing")
39
+ workpiece_id = str(raw_workpiece.get("id") or "").strip()
40
+ if not workpiece_id:
41
+ raise SimulationPlatformError("destination_support_workpiece_missing")
42
+
43
+ support_id = destination_support_backend_id(destination_entity_id)
44
+ if workpiece_id == support_id:
45
+ raise SimulationPlatformError("destination_support_pair_invalid")
46
+
47
+ scene = deepcopy(dict(scene_contract))
48
+ scene.update(
49
+ {
50
+ "allow_support_contact": True,
51
+ "support_contact_scope": DESTINATION_SUPPORT_CONTACT_SCOPE,
52
+ "support_contact_phase": DESTINATION_SUPPORT_CONTACT_PHASE,
53
+ "support_surface_id": support_id,
54
+ }
55
+ )
56
+ return scene, workpiece_id, support_id