devagent-physical-engine 1.8.2__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.2/src/devagent_physical_engine.egg-info → devagent_physical_engine-1.8.4}/PKG-INFO +31 -6
  2. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/README.md +30 -5
  3. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/pyproject.toml +2 -2
  4. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/__init__.py +1 -1
  5. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/workpiece_scene_probe.py +93 -30
  6. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4/src/devagent_physical_engine.egg-info}/PKG-INFO +31 -6
  7. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine.egg-info/SOURCES.txt +2 -0
  8. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_industrial_motion_v170.py +2 -2
  9. devagent_physical_engine-1.8.4/tests/test_package_metadata_v184.py +23 -0
  10. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_transfer_place_diagnostic_v172.py +5 -3
  11. devagent_physical_engine-1.8.4/tests/test_workpiece_attach_semantics_v183.py +38 -0
  12. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/NOTICE +0 -0
  13. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/setup.cfg +0 -0
  14. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/__init__.py +0 -0
  15. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/compiler.py +0 -0
  16. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/contracts.py +0 -0
  17. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/coordinator.py +0 -0
  18. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/critic.py +0 -0
  19. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/evidence.py +0 -0
  20. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/interpreter.py +0 -0
  21. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/planner.py +0 -0
  22. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/recovery.py +0 -0
  23. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/routing.py +0 -0
  24. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/runtime.py +0 -0
  25. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/semantic.py +0 -0
  26. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/structured.py +0 -0
  27. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ai_cli.py +0 -0
  28. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/cli.py +0 -0
  29. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/commercial.py +0 -0
  30. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/commercial_campaign.py +0 -0
  31. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/commercial_cli.py +0 -0
  32. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/commercial_importer.py +0 -0
  33. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/commercial_intelligence.py +0 -0
  34. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/commercial_readiness.py +0 -0
  35. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/commercial_repository.py +0 -0
  36. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/continuous_clearance.py +0 -0
  37. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/controller_runtime_hotfix_v181.py +0 -0
  38. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/doctor.py +0 -0
  39. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/engineering_agent.py +0 -0
  40. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/engineering_request.py +0 -0
  41. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/evidence_replay.py +0 -0
  42. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/evidence_trust.py +0 -0
  43. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/execution.py +0 -0
  44. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/industrial_motion_hotfix_v170.py +0 -0
  45. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/industrial_motion_v170.py +0 -0
  46. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/industrial_motion_v182.py +0 -0
  47. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/models.py +0 -0
  48. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/one_command.py +0 -0
  49. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/one_command_runtime.py +0 -0
  50. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/one_command_v15.py +0 -0
  51. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/one_command_v16.py +0 -0
  52. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/operating_envelope.py +0 -0
  53. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/optimization/__init__.py +0 -0
  54. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/optimization/benchmark.py +0 -0
  55. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/optimization/candidates.py +0 -0
  56. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/optimization/contracts.py +0 -0
  57. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/optimization/evaluator.py +0 -0
  58. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/optimization/evidence.py +0 -0
  59. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/optimization/experience.py +0 -0
  60. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/optimization/measured.py +0 -0
  61. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/optimization/optimizer.py +0 -0
  62. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/optimization/orchestrator.py +0 -0
  63. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/physical_campaign.py +0 -0
  64. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/physical_evidence.py +0 -0
  65. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/physical_motion.py +0 -0
  66. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/planning.py +0 -0
  67. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/pose_math.py +0 -0
  68. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/preexecution_contract.py +0 -0
  69. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/production_authority.py +0 -0
  70. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/production_grade.py +0 -0
  71. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/project.py +0 -0
  72. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/provider_adapters/__init__.py +0 -0
  73. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/provider_adapters/anthropic.py +0 -0
  74. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/provider_adapters/common.py +0 -0
  75. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/provider_adapters/factory.py +0 -0
  76. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/provider_adapters/gemini.py +0 -0
  77. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/provider_adapters/openai.py +0 -0
  78. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/provider_criterion.py +0 -0
  79. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/provider_qualification.py +0 -0
  80. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/providers.py +0 -0
  81. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/qualification.py +0 -0
  82. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/qualification_cli.py +0 -0
  83. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/qualification_harness.py +0 -0
  84. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/reference_workcell.py +0 -0
  85. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/report_test_execution.py +0 -0
  86. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/report_test_execution_strict.py +0 -0
  87. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/robot_platform.py +0 -0
  88. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/robot_support_v18.py +0 -0
  89. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/robots.py +0 -0
  90. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/__init__.py +0 -0
  91. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/abb_irb1200.py +0 -0
  92. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/abb_irb1200_preview.py +0 -0
  93. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/acceptance.py +0 -0
  94. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/commands.py +0 -0
  95. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/continuous_clearance_probe.py +0 -0
  96. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/controller_action_probe.py +0 -0
  97. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/destination_support_contact_v182.py +0 -0
  98. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/doctor.py +0 -0
  99. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/fk_pose.py +0 -0
  100. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/fk_probe.py +0 -0
  101. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/frame_alignment.py +0 -0
  102. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/gazebo_cli.py +0 -0
  103. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/gazebo_pose.py +0 -0
  104. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/gazebo_world.py +0 -0
  105. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v170.py +0 -0
  106. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v171.py +0 -0
  107. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v172.py +0 -0
  108. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v182.py +0 -0
  109. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/joint_state_probe.py +0 -0
  110. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/joint_state_recorder.py +0 -0
  111. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/measured_motion.py +0 -0
  112. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/moveit_joint_plan_probe.py +0 -0
  113. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/moveit_joint_plan_v161_probe.py +0 -0
  114. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/moveit_scene.py +0 -0
  115. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/moveit_task_planner.py +0 -0
  116. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/pilz_sequence_plan_probe.py +0 -0
  117. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/pilz_sequence_plan_probe_v182.py +0 -0
  118. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/preexecution.py +0 -0
  119. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/qualification.py +0 -0
  120. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/qualification_v10.py +0 -0
  121. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/qualification_v11.py +0 -0
  122. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/qualification_v12.py +0 -0
  123. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/report_test_visualization.py +0 -0
  124. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/report_test_visualization_v170.py +0 -0
  125. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/scene_probe.py +0 -0
  126. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/state_validity_probe.py +0 -0
  127. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/support_contact_acm_probe_v170.py +0 -0
  128. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/support_contact_lease_v170.py +0 -0
  129. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/support_contact_runner_v161.py +0 -0
  130. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/support_contact_v161.py +0 -0
  131. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/task_adapter.py +0 -0
  132. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/task_visualization.py +0 -0
  133. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/tf_probe.py +0 -0
  134. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/tool_scene.py +0 -0
  135. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/tool_scene_probe.py +0 -0
  136. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/trajectory.py +0 -0
  137. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/trajectory_action_probe.py +0 -0
  138. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/trajectory_tracking.py +0 -0
  139. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/ur5e.py +0 -0
  140. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/ur5e_adapter.py +0 -0
  141. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/ur5e_v10_adapter.py +0 -0
  142. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/workpiece_follow.py +0 -0
  143. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/workpiece_gazebo_follower.py +0 -0
  144. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/workpiece_scene.py +0 -0
  145. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/selective_verification.py +0 -0
  146. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/selective_verification_v16.py +0 -0
  147. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/setup_profile.py +0 -0
  148. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/sim_real_qualification.py +0 -0
  149. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/simulation.py +0 -0
  150. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/simulation_platform.py +0 -0
  151. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/smooth_motion_hotfix_v162.py +0 -0
  152. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/support_contact_hotfix_v161.py +0 -0
  153. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/tool_collision.py +0 -0
  154. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/trajectory_qualification.py +0 -0
  155. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/twin.py +0 -0
  156. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/twin_builder.py +0 -0
  157. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/twin_codec.py +0 -0
  158. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/twin_materialization.py +0 -0
  159. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/user_cli.py +0 -0
  160. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/user_cli_v15.py +0 -0
  161. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/user_cli_v16.py +0 -0
  162. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/user_cli_v18.py +0 -0
  163. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/verification.py +0 -0
  164. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/workpiece_lifecycle.py +0 -0
  165. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine.egg-info/dependency_links.txt +0 -0
  166. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine.egg-info/entry_points.txt +0 -0
  167. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine.egg-info/requires.txt +0 -0
  168. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine.egg-info/top_level.txt +0 -0
  169. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_abb_irb1200_visual_v18.py +0 -0
  170. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_agent_core.py +0 -0
  171. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_agent_semantic_hardening.py +0 -0
  172. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_ai_cli.py +0 -0
  173. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_ai_cli_v07.py +0 -0
  174. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_commercial_importer_v1.py +0 -0
  175. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_commercial_intelligence_v15.py +0 -0
  176. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_commercial_readiness_v1.py +0 -0
  177. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_commercial_v1.py +0 -0
  178. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_continuous_clearance_v011.py +0 -0
  179. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_controller_runtime_hotfix_v181.py +0 -0
  180. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_core.py +0 -0
  181. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_destination_support_contact_v182.py +0 -0
  182. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_engineering_request_v07.py +0 -0
  183. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_evidence_replay_v12.py +0 -0
  184. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_evidence_trust_coverage_v12.py +0 -0
  185. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_evidence_trust_transport_v12.py +0 -0
  186. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_evidence_trust_v12.py +0 -0
  187. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_evidence_viewer_palette_v130.py +0 -0
  188. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_gazebo_cli_v0122.py +0 -0
  189. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_golden_abb_runner_v171.py +0 -0
  190. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_golden_abb_showcase.py +0 -0
  191. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_interpreter_profiles_v08.py +0 -0
  192. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_joint_state_probe_v0125.py +0 -0
  193. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_live_provider_qualification.py +0 -0
  194. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_measured_motion_v10.py +0 -0
  195. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_moveit_planning_diagnostics_v0125.py +0 -0
  196. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_moveit_scene_v0123.py +0 -0
  197. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_natural_language_agent_v07.py +0 -0
  198. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_one_command_hardening_v13.py +0 -0
  199. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_one_command_pose_hardening_v15.py +0 -0
  200. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_one_command_regression_v141.py +0 -0
  201. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_one_command_v13.py +0 -0
  202. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_openai_strict_schema_v0113.py +0 -0
  203. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_optimization_v05.py +0 -0
  204. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_physical_campaign_v09.py +0 -0
  205. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_physical_evidence_v09.py +0 -0
  206. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_physical_motion_v09.py +0 -0
  207. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_planning_fallback_v012.py +0 -0
  208. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_pose_math_v0125.py +0 -0
  209. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_preexecution_contract_v10.py +0 -0
  210. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_production_authority_v11.py +0 -0
  211. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_production_grade_coverage_v11.py +0 -0
  212. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_production_grade_v11.py +0 -0
  213. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_project_spine_v013.py +0 -0
  214. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_provider_and_qualification.py +0 -0
  215. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_provider_criterion_v15.py +0 -0
  216. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_qualification_cli_lifecycle_v06.py +0 -0
  217. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_qualification_harness_v06.py +0 -0
  218. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_readme_pypi.py +0 -0
  219. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_real_provider_adapters.py +0 -0
  220. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_reference_workcell_ros_frames_v0125.py +0 -0
  221. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_reference_workcell_v012.py +0 -0
  222. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_report_test_contract_coverage_v16.py +0 -0
  223. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_report_test_lineage_v16.py +0 -0
  224. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_report_test_visual_execution_v16.py +0 -0
  225. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_robot_platform_v08.py +0 -0
  226. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_ros2_production_receipts_v011.py +0 -0
  227. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_ros2_simulation.py +0 -0
  228. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_ros_trajectory_v09.py +0 -0
  229. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_selective_verification_v14.py +0 -0
  230. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_setup_profile.py +0 -0
  231. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_sim_real_qualification_v011.py +0 -0
  232. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_simulation_platform_v08.py +0 -0
  233. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_smooth_motion_hotfix_v162.py +0 -0
  234. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_support_contact_hotfix_v161.py +0 -0
  235. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_tool_collision_v011.py +0 -0
  236. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_tool_scene_v0124.py +0 -0
  237. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_trajectory_action_probe_v0125.py +0 -0
  238. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_trajectory_qualification_v09.py +0 -0
  239. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_trajectory_tracking_v0125.py +0 -0
  240. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_twin_materialization_v10.py +0 -0
  241. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_twin_v08.py +0 -0
  242. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_ur5e_adapter_scopes_v09.py +0 -0
  243. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_ur5e_v10_adapter_scopes.py +0 -0
  244. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_user_cli_interactive_v131.py +0 -0
  245. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_user_cli_progress_v131.py +0 -0
  246. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_user_cli_report_visual_v16.py +0 -0
  247. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_user_cli_selective_v14.py +0 -0
  248. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_user_cli_v15.py +0 -0
  249. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_user_cli_v15_hotfix_inheritance.py +0 -0
  250. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_v052_stabilization.py +0 -0
  251. {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_v08_catalog_mapping_regression.py +0 -0
  252. {devagent_physical_engine-1.8.2 → 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.2
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, scoped destination-support place contact, 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.2
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.2
91
+ 1.8.4
92
92
  ```
93
93
 
94
94
  Run the normal customer workflow:
@@ -394,6 +394,30 @@ The v1.8.2 place receipt records the exact destination support id, workpiece id,
394
394
 
395
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
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
+
397
421
  ## Qualified visual-execution scope
398
422
 
399
423
  Measured report-test execution remains intentionally narrow:
@@ -594,9 +618,9 @@ devagent-physical-ai optional provider-backed engineering front end
594
618
 
595
619
  # Project status
596
620
 
597
- **v1.8.2 — Production/Stable software workflow**
621
+ **v1.8.4 — Production/Stable software workflow**
598
622
 
599
- v1.8.2 retains the v1.8.1 direct UR5e controller/action binding, v1.8 truthful robot support tiers, and ABB IRB1200 experimental visual runtime. It additionally splits UR5e transfer and placement at a hard motion boundary and scopes destination-support contact to the single zero-blend LIN place planning request, using a request-local full-ACM diff for exactly the attached-workpiece ↔ destination-support pair.
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.
600
624
 
601
625
  Production-oriented software capabilities include:
602
626
 
@@ -611,6 +635,7 @@ exact Requirement → Mapping → Verification Plan → Case provenance
611
635
  truthful robot support tiers
612
636
  qualified UR5e report-test visual execution contract
613
637
  direct UR5e controller-manager/action readiness binding
638
+ synchronous verified workpiece attach/detach lifecycle
614
639
  scoped destination-support place contact
615
640
  experimental exact ABB IRB1200 Gazebo/MoveIt/RViz preview
616
641
  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.2
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.2
50
+ 1.8.4
51
51
  ```
52
52
 
53
53
  Run the normal customer workflow:
@@ -353,6 +353,30 @@ The v1.8.2 place receipt records the exact destination support id, workpiece id,
353
353
 
354
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
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
+
356
380
  ## Qualified visual-execution scope
357
381
 
358
382
  Measured report-test execution remains intentionally narrow:
@@ -553,9 +577,9 @@ devagent-physical-ai optional provider-backed engineering front end
553
577
 
554
578
  # Project status
555
579
 
556
- **v1.8.2 — Production/Stable software workflow**
580
+ **v1.8.4 — Production/Stable software workflow**
557
581
 
558
- v1.8.2 retains the v1.8.1 direct UR5e controller/action binding, v1.8 truthful robot support tiers, and ABB IRB1200 experimental visual runtime. It additionally splits UR5e transfer and placement at a hard motion boundary and scopes destination-support contact to the single zero-blend LIN place planning request, using a request-local full-ACM diff for exactly the attached-workpiece ↔ destination-support pair.
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.
559
583
 
560
584
  Production-oriented software capabilities include:
561
585
 
@@ -570,6 +594,7 @@ exact Requirement → Mapping → Verification Plan → Case provenance
570
594
  truthful robot support tiers
571
595
  qualified UR5e report-test visual execution contract
572
596
  direct UR5e controller-manager/action readiness binding
597
+ synchronous verified workpiece attach/detach lifecycle
573
598
  scoped destination-support place contact
574
599
  experimental exact ABB IRB1200 Gazebo/MoveIt/RViz preview
575
600
  industrial Pilz PTP / LIN planning
@@ -623,4 +648,4 @@ Original creator: Tom Ha
623
648
  Original project: https://github.com/tomha85/devagent-physical-engine
624
649
  All rights reserved.
625
650
 
626
- 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.2"
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, scoped destination-support place contact, 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"]
@@ -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.2"
222
+ __version__ = "1.8.4"
@@ -60,7 +60,12 @@ def _compose(first_position, first_q, second_position, second_q):
60
60
  def _pose_from_msg(pose):
61
61
  return (
62
62
  (float(pose.position.x), float(pose.position.y), float(pose.position.z)),
63
- (float(pose.orientation.x), float(pose.orientation.y), float(pose.orientation.z), float(pose.orientation.w)),
63
+ (
64
+ float(pose.orientation.x),
65
+ float(pose.orientation.y),
66
+ float(pose.orientation.z),
67
+ float(pose.orientation.w),
68
+ ),
64
69
  )
65
70
 
66
71
 
@@ -73,7 +78,12 @@ def _pose_to_msg(position, quaternion, Pose):
73
78
  return pose
74
79
 
75
80
 
76
- def _canonical_attachment(link_name: str, item: dict[str, Any], position, quaternion) -> dict[str, Any]:
81
+ def _canonical_attachment(
82
+ link_name: str,
83
+ item: dict[str, Any],
84
+ position,
85
+ quaternion,
86
+ ) -> dict[str, Any]:
77
87
  return {
78
88
  "link_name": link_name,
79
89
  "id": str(item["id"]),
@@ -99,7 +109,17 @@ def _primitive(item, SolidPrimitive):
99
109
  return primitive
100
110
 
101
111
 
102
- def _collision_object(item, frame_id: str, position, quaternion, *, operation: int, CollisionObject, Pose, SolidPrimitive):
112
+ def _collision_object(
113
+ item,
114
+ frame_id: str,
115
+ position,
116
+ quaternion,
117
+ *,
118
+ operation: int,
119
+ CollisionObject,
120
+ Pose,
121
+ SolidPrimitive,
122
+ ):
103
123
  collision = CollisionObject()
104
124
  collision.header.frame_id = frame_id
105
125
  collision.id = str(item["id"])
@@ -116,11 +136,19 @@ def _collision_object(item, frame_id: str, position, quaternion, *, operation: i
116
136
 
117
137
  def _wait_future(node, future, timeout_s: float) -> bool:
118
138
  import rclpy
139
+
119
140
  rclpy.spin_until_future_complete(node, future, timeout_sec=timeout_s)
120
141
  return future.done()
121
142
 
122
143
 
123
- def _lookup_transform(node, buffer, *, target_frame: str, source_frame: str, timeout_s: float):
144
+ def _lookup_transform(
145
+ node,
146
+ buffer,
147
+ *,
148
+ target_frame: str,
149
+ source_frame: str,
150
+ timeout_s: float,
151
+ ):
124
152
  import rclpy
125
153
  from rclpy.time import Time
126
154
 
@@ -148,9 +176,12 @@ def _read_state(get_client, node, timeout_s: float, workpiece_id: str):
148
176
  response = future.result()
149
177
  if response is None:
150
178
  raise RuntimeError("get_planning_scene_empty")
151
- world_present = any(item.id == workpiece_id for item in response.scene.world.collision_objects)
179
+ world_present = any(
180
+ item.id == workpiece_id for item in response.scene.world.collision_objects
181
+ )
152
182
  attached = [
153
- item for item in response.scene.robot_state.attached_collision_objects
183
+ item
184
+ for item in response.scene.robot_state.attached_collision_objects
154
185
  if item.object.id == workpiece_id
155
186
  ]
156
187
  return world_present, attached
@@ -186,7 +217,9 @@ def transition(path: Path, *, operation: str, timeout_s: float) -> dict[str, Any
186
217
 
187
218
  pose_data = item["pose"]
188
219
  world_position = tuple(float(value) for value in pose_data["position_m"])
189
- world_quaternion = tuple(float(value) for value in pose_data["quaternion_xyzw"])
220
+ world_quaternion = tuple(
221
+ float(value) for value in pose_data["quaternion_xyzw"]
222
+ )
190
223
  scene = PlanningScene()
191
224
  scene.is_diff = True
192
225
  scene.robot_state.is_diff = True
@@ -217,18 +250,14 @@ def transition(path: Path, *, operation: str, timeout_s: float) -> dict[str, Any
217
250
  world_position,
218
251
  world_quaternion,
219
252
  )
220
- scene.world.collision_objects.append(
221
- _collision_object(
222
- item,
223
- planning_frame,
224
- world_position,
225
- world_quaternion,
226
- operation=CollisionObject.REMOVE,
227
- CollisionObject=CollisionObject,
228
- Pose=Pose,
229
- SolidPrimitive=SolidPrimitive,
230
- )
231
- )
253
+
254
+ # MoveIt applies robot_state.attached_collision_objects before processing
255
+ # world.collision_objects in a PlanningScene diff. Adding the attached body
256
+ # automatically removes an existing same-ID world object. Sending a second
257
+ # explicit world REMOVE therefore makes synchronous ApplyPlanningScene
258
+ # report failure because that later REMOVE targets an object that no longer
259
+ # exists. Keep ATTACH as one authoritative attached-object ADD and verify the
260
+ # resulting world/attached state by synchronous read-back below.
232
261
  attached = AttachedCollisionObject()
233
262
  attached.link_name = tool_link
234
263
  attached.touch_links = touch_links
@@ -244,7 +273,10 @@ def transition(path: Path, *, operation: str, timeout_s: float) -> dict[str, Any
244
273
  )
245
274
  scene.robot_state.attached_collision_objects.append(attached)
246
275
  expected_attachment = _canonical_attachment(
247
- tool_link, item, relative_position, relative_quaternion
276
+ tool_link,
277
+ item,
278
+ relative_position,
279
+ relative_quaternion,
248
280
  )
249
281
  attachment_hash = _hash(expected_attachment)
250
282
  elif operation == "detach":
@@ -278,12 +310,21 @@ def transition(path: Path, *, operation: str, timeout_s: float) -> dict[str, Any
278
310
  return {"success": False, "code": "apply_planning_scene_rejected"}
279
311
 
280
312
  world_present, attached_items = _read_state(
281
- get_client, node, timeout_s, str(item["id"])
313
+ get_client,
314
+ node,
315
+ timeout_s,
316
+ str(item["id"]),
317
+ )
318
+ observed_attached_link = (
319
+ attached_items[0].link_name if len(attached_items) == 1 else None
282
320
  )
283
- observed_attached_link = attached_items[0].link_name if len(attached_items) == 1 else None
284
321
 
285
322
  if operation == "attach":
286
- if world_present or len(attached_items) != 1 or observed_attached_link != tool_link:
323
+ if (
324
+ world_present
325
+ or len(attached_items) != 1
326
+ or observed_attached_link != tool_link
327
+ ):
287
328
  return {
288
329
  "success": False,
289
330
  "code": "workpiece_attach_readback_mismatch",
@@ -291,15 +332,28 @@ def transition(path: Path, *, operation: str, timeout_s: float) -> dict[str, Any
291
332
  "observed_attached_link": observed_attached_link,
292
333
  }
293
334
  observed_object = attached_items[0].object
294
- if len(observed_object.primitives) != 1 or len(observed_object.primitive_poses) != 1:
335
+ if (
336
+ len(observed_object.primitives) != 1
337
+ or len(observed_object.primitive_poses) != 1
338
+ ):
295
339
  return {"success": False, "code": "workpiece_attached_shape_invalid"}
296
340
  object_position, object_q = _pose_from_msg(observed_object.pose)
297
- primitive_position, primitive_q = _pose_from_msg(observed_object.primitive_poses[0])
341
+ primitive_position, primitive_q = _pose_from_msg(
342
+ observed_object.primitive_poses[0]
343
+ )
298
344
  observed_position, observed_q = _compose(
299
- object_position, object_q, primitive_position, primitive_q
345
+ object_position,
346
+ object_q,
347
+ primitive_position,
348
+ primitive_q,
300
349
  )
301
350
  observed_attachment_hash = _hash(
302
- _canonical_attachment(tool_link, item, observed_position, observed_q)
351
+ _canonical_attachment(
352
+ tool_link,
353
+ item,
354
+ observed_position,
355
+ observed_q,
356
+ )
303
357
  )
304
358
  if observed_attachment_hash != attachment_hash:
305
359
  return {
@@ -321,11 +375,17 @@ def transition(path: Path, *, operation: str, timeout_s: float) -> dict[str, Any
321
375
  success = world_present and not attached_items
322
376
  return {
323
377
  "success": success,
324
- "code": "workpiece_detach_verified" if success else "workpiece_detach_readback_mismatch",
378
+ "code": (
379
+ "workpiece_detach_verified"
380
+ if success
381
+ else "workpiece_detach_readback_mismatch"
382
+ ),
325
383
  "materialization_hash": materialization_hash,
326
384
  "twin_hash": twin_hash,
327
385
  "observed_world_present": world_present,
328
- "observed_attached_link": None if not attached_items else observed_attached_link,
386
+ "observed_attached_link": (
387
+ None if not attached_items else observed_attached_link
388
+ ),
329
389
  }
330
390
  finally:
331
391
  del listener
@@ -346,7 +406,10 @@ def main() -> int:
346
406
  timeout_s=float(args.timeout),
347
407
  )
348
408
  except Exception as exc:
349
- result = {"success": False, "code": f"workpiece_scene_probe_error:{type(exc).__name__}"}
409
+ result = {
410
+ "success": False,
411
+ "code": f"workpiece_scene_probe_error:{type(exc).__name__}",
412
+ }
350
413
  print(json.dumps(result, sort_keys=True))
351
414
  return 0 if result.get("success") else 2
352
415
 
@@ -1,7 +1,7 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devagent-physical-engine
3
- Version: 1.8.2
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, scoped destination-support place contact, 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.2
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.2
91
+ 1.8.4
92
92
  ```
93
93
 
94
94
  Run the normal customer workflow:
@@ -394,6 +394,30 @@ The v1.8.2 place receipt records the exact destination support id, workpiece id,
394
394
 
395
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
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
+
397
421
  ## Qualified visual-execution scope
398
422
 
399
423
  Measured report-test execution remains intentionally narrow:
@@ -594,9 +618,9 @@ devagent-physical-ai optional provider-backed engineering front end
594
618
 
595
619
  # Project status
596
620
 
597
- **v1.8.2 — Production/Stable software workflow**
621
+ **v1.8.4 — Production/Stable software workflow**
598
622
 
599
- v1.8.2 retains the v1.8.1 direct UR5e controller/action binding, v1.8 truthful robot support tiers, and ABB IRB1200 experimental visual runtime. It additionally splits UR5e transfer and placement at a hard motion boundary and scopes destination-support contact to the single zero-blend LIN place planning request, using a request-local full-ACM diff for exactly the attached-workpiece ↔ destination-support pair.
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.
600
624
 
601
625
  Production-oriented software capabilities include:
602
626
 
@@ -611,6 +635,7 @@ exact Requirement → Mapping → Verification Plan → Case provenance
611
635
  truthful robot support tiers
612
636
  qualified UR5e report-test visual execution contract
613
637
  direct UR5e controller-manager/action readiness binding
638
+ synchronous verified workpiece attach/detach lifecycle
614
639
  scoped destination-support place contact
615
640
  experimental exact ABB IRB1200 Gazebo/MoveIt/RViz preview
616
641
  industrial Pilz PTP / LIN planning
@@ -196,6 +196,7 @@ tests/test_one_command_regression_v141.py
196
196
  tests/test_one_command_v13.py
197
197
  tests/test_openai_strict_schema_v0113.py
198
198
  tests/test_optimization_v05.py
199
+ tests/test_package_metadata_v184.py
199
200
  tests/test_physical_campaign_v09.py
200
201
  tests/test_physical_evidence_v09.py
201
202
  tests/test_physical_motion_v09.py
@@ -245,4 +246,5 @@ tests/test_user_cli_v15.py
245
246
  tests/test_user_cli_v15_hotfix_inheritance.py
246
247
  tests/test_v052_stabilization.py
247
248
  tests/test_v08_catalog_mapping_regression.py
249
+ tests/test_workpiece_attach_semantics_v183.py
248
250
  tests/test_workpiece_lifecycle_v011.py
@@ -34,8 +34,8 @@ from devagent_physical_engine.ros2.report_test_visualization_v170 import (
34
34
 
35
35
 
36
36
  class IndustrialMotionV170Tests(unittest.TestCase):
37
- def test_release_version_is_v182(self) -> None:
38
- self.assertEqual(package.__version__, "1.8.2")
37
+ def test_release_version_is_v184(self) -> None:
38
+ self.assertEqual(package.__version__, "1.8.4")
39
39
 
40
40
  def test_reference_groups_cover_every_task_phase_once_in_order(self) -> None:
41
41
  groups = reference_industrial_groups()
@@ -0,0 +1,23 @@
1
+ from __future__ import annotations
2
+
3
+ from pathlib import Path
4
+ import tomllib
5
+ import unittest
6
+
7
+
8
+ class PackageMetadataV184Tests(unittest.TestCase):
9
+ def test_pypi_summary_respects_core_metadata_limit(self) -> None:
10
+ root = Path(__file__).resolve().parents[1]
11
+ metadata = tomllib.loads((root / "pyproject.toml").read_text(encoding="utf-8"))
12
+ summary = str(metadata["project"]["description"])
13
+ self.assertTrue(summary.strip())
14
+ self.assertLessEqual(len(summary), 512)
15
+
16
+ def test_package_version_is_v184(self) -> None:
17
+ root = Path(__file__).resolve().parents[1]
18
+ metadata = tomllib.loads((root / "pyproject.toml").read_text(encoding="utf-8"))
19
+ self.assertEqual(metadata["project"]["version"], "1.8.4")
20
+
21
+
22
+ if __name__ == "__main__":
23
+ unittest.main()
@@ -153,9 +153,11 @@ class TransferPlaceDiagnosticV172Tests(unittest.TestCase):
153
153
  self.assertTrue(payload["plan_only"])
154
154
  self.assertEqual(payload["result_code"], "pilz_place_segment_planning_failed")
155
155
 
156
- def test_release_preserves_v172_diagnostics_under_v182_runtime(self) -> None:
157
- self.assertEqual(package.__version__, "1.8.2")
158
- self.assertTrue(issubclass(PilzIndustrialSequencePlannerV182, PilzIndustrialSequencePlannerV172))
156
+ def test_v184_release_preserves_v172_diagnostics_and_v182_planner(self) -> None:
157
+ self.assertEqual(package.__version__, "1.8.4")
158
+ self.assertTrue(
159
+ issubclass(PilzIndustrialSequencePlannerV182, PilzIndustrialSequencePlannerV172)
160
+ )
159
161
  self.assertIs(
160
162
  visual_v170.PilzIndustrialSequencePlannerV170,
161
163
  PilzIndustrialSequencePlannerV182,
@@ -0,0 +1,38 @@
1
+ from __future__ import annotations
2
+
3
+ import inspect
4
+ import unittest
5
+
6
+ from devagent_physical_engine.ros2 import workpiece_scene_probe
7
+
8
+
9
+ class WorkpieceAttachSemanticsV183Tests(unittest.TestCase):
10
+ def test_attach_diff_does_not_send_redundant_world_remove(self):
11
+ source = inspect.getsource(workpiece_scene_probe.transition)
12
+ attach_block = source.split('if operation == "attach":', 1)[1].split(
13
+ 'elif operation == "detach":', 1
14
+ )[0]
15
+
16
+ self.assertIn(
17
+ "scene.robot_state.attached_collision_objects.append(attached)",
18
+ attach_block,
19
+ )
20
+ self.assertNotIn("scene.world.collision_objects.append", attach_block)
21
+ self.assertNotIn("operation=CollisionObject.REMOVE", attach_block)
22
+
23
+ def test_detach_still_restores_world_object_at_explicit_pose(self):
24
+ source = inspect.getsource(workpiece_scene_probe.transition)
25
+ detach_block = source.split('elif operation == "detach":', 1)[1].split(
26
+ 'else:', 1
27
+ )[0]
28
+
29
+ self.assertIn(
30
+ "scene.robot_state.attached_collision_objects.append(attached)",
31
+ detach_block,
32
+ )
33
+ self.assertIn("scene.world.collision_objects.append", detach_block)
34
+ self.assertIn("operation=CollisionObject.ADD", detach_block)
35
+
36
+
37
+ if __name__ == "__main__":
38
+ unittest.main()