devagent-physical-engine 1.8.5__tar.gz → 1.8.8__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. {devagent_physical_engine-1.8.5/src/devagent_physical_engine.egg-info → devagent_physical_engine-1.8.8}/PKG-INFO +29 -7
  2. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/README.md +29 -7
  3. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/pyproject.toml +4 -1
  4. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/__init__.py +1 -1
  5. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/workpiece_scene.py +106 -15
  6. devagent_physical_engine-1.8.8/src/devagent_physical_engine/ros2/workpiece_scene_probe_v186.py +523 -0
  7. devagent_physical_engine-1.8.8/src/devagent_physical_engine/ros2/workpiece_scene_probe_v187.py +408 -0
  8. devagent_physical_engine-1.8.8/src/devagent_physical_engine/ros2/workpiece_scene_probe_v188.py +283 -0
  9. devagent_physical_engine-1.8.8/src/devagent_physical_engine/workpiece_lifecycle.py +116 -0
  10. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8/src/devagent_physical_engine.egg-info}/PKG-INFO +29 -7
  11. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine.egg-info/SOURCES.txt +5 -1
  12. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_industrial_motion_v170.py +2 -2
  13. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_package_metadata_v184.py +2 -2
  14. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_transfer_place_diagnostic_v172.py +2 -2
  15. devagent_physical_engine-1.8.8/tests/test_workpiece_semantic_lifecycle_v186.py +220 -0
  16. devagent_physical_engine-1.8.5/src/devagent_physical_engine/workpiece_lifecycle.py +0 -66
  17. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/NOTICE +0 -0
  18. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/setup.cfg +0 -0
  19. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/agent/__init__.py +0 -0
  20. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/agent/compiler.py +0 -0
  21. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/agent/contracts.py +0 -0
  22. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/agent/coordinator.py +0 -0
  23. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/agent/critic.py +0 -0
  24. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/agent/evidence.py +0 -0
  25. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/agent/interpreter.py +0 -0
  26. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/agent/planner.py +0 -0
  27. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/agent/recovery.py +0 -0
  28. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/agent/routing.py +0 -0
  29. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/agent/runtime.py +0 -0
  30. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/agent/semantic.py +0 -0
  31. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/agent/structured.py +0 -0
  32. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ai_cli.py +0 -0
  33. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/cli.py +0 -0
  34. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/commercial.py +0 -0
  35. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/commercial_campaign.py +0 -0
  36. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/commercial_cli.py +0 -0
  37. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/commercial_importer.py +0 -0
  38. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/commercial_intelligence.py +0 -0
  39. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/commercial_readiness.py +0 -0
  40. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/commercial_repository.py +0 -0
  41. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/continuous_clearance.py +0 -0
  42. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/controller_runtime_hotfix_v181.py +0 -0
  43. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/doctor.py +0 -0
  44. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/engineering_agent.py +0 -0
  45. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/engineering_request.py +0 -0
  46. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/evidence_replay.py +0 -0
  47. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/evidence_trust.py +0 -0
  48. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/execution.py +0 -0
  49. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/industrial_motion_hotfix_v170.py +0 -0
  50. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/industrial_motion_v170.py +0 -0
  51. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/industrial_motion_v182.py +0 -0
  52. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/models.py +0 -0
  53. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/one_command.py +0 -0
  54. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/one_command_runtime.py +0 -0
  55. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/one_command_v15.py +0 -0
  56. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/one_command_v16.py +0 -0
  57. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/operating_envelope.py +0 -0
  58. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/optimization/__init__.py +0 -0
  59. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/optimization/benchmark.py +0 -0
  60. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/optimization/candidates.py +0 -0
  61. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/optimization/contracts.py +0 -0
  62. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/optimization/evaluator.py +0 -0
  63. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/optimization/evidence.py +0 -0
  64. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/optimization/experience.py +0 -0
  65. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/optimization/measured.py +0 -0
  66. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/optimization/optimizer.py +0 -0
  67. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/optimization/orchestrator.py +0 -0
  68. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/physical_campaign.py +0 -0
  69. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/physical_evidence.py +0 -0
  70. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/physical_motion.py +0 -0
  71. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/planning.py +0 -0
  72. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/pose_math.py +0 -0
  73. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/preexecution_contract.py +0 -0
  74. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/production_authority.py +0 -0
  75. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/production_grade.py +0 -0
  76. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/project.py +0 -0
  77. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/provider_adapters/__init__.py +0 -0
  78. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/provider_adapters/anthropic.py +0 -0
  79. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/provider_adapters/common.py +0 -0
  80. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/provider_adapters/factory.py +0 -0
  81. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/provider_adapters/gemini.py +0 -0
  82. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/provider_adapters/openai.py +0 -0
  83. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/provider_criterion.py +0 -0
  84. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/provider_qualification.py +0 -0
  85. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/providers.py +0 -0
  86. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/qualification.py +0 -0
  87. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/qualification_cli.py +0 -0
  88. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/qualification_harness.py +0 -0
  89. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/reference_workcell.py +0 -0
  90. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/report_test_execution.py +0 -0
  91. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/report_test_execution_strict.py +0 -0
  92. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/robot_platform.py +0 -0
  93. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/robot_support_v18.py +0 -0
  94. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/robots.py +0 -0
  95. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/__init__.py +0 -0
  96. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/abb_irb1200.py +0 -0
  97. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/abb_irb1200_preview.py +0 -0
  98. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/acceptance.py +0 -0
  99. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/commands.py +0 -0
  100. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/continuous_clearance_probe.py +0 -0
  101. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/controller_action_probe.py +0 -0
  102. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/destination_support_contact_v182.py +0 -0
  103. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/doctor.py +0 -0
  104. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/fk_pose.py +0 -0
  105. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/fk_probe.py +0 -0
  106. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/frame_alignment.py +0 -0
  107. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/gazebo_cli.py +0 -0
  108. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/gazebo_pose.py +0 -0
  109. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/gazebo_world.py +0 -0
  110. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v170.py +0 -0
  111. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v171.py +0 -0
  112. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v172.py +0 -0
  113. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v182.py +0 -0
  114. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/joint_state_probe.py +0 -0
  115. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/joint_state_recorder.py +0 -0
  116. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/measured_motion.py +0 -0
  117. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/moveit_joint_plan_probe.py +0 -0
  118. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/moveit_joint_plan_v161_probe.py +0 -0
  119. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/moveit_scene.py +0 -0
  120. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/moveit_task_planner.py +0 -0
  121. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/pilz_sequence_plan_probe.py +0 -0
  122. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/pilz_sequence_plan_probe_v182.py +0 -0
  123. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/preexecution.py +0 -0
  124. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/qualification.py +0 -0
  125. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/qualification_v10.py +0 -0
  126. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/qualification_v11.py +0 -0
  127. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/qualification_v12.py +0 -0
  128. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/report_test_visualization.py +0 -0
  129. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/report_test_visualization_v170.py +0 -0
  130. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/scene_probe.py +0 -0
  131. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/state_validity_probe.py +0 -0
  132. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/support_contact_acm_probe_v170.py +0 -0
  133. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/support_contact_lease_v170.py +0 -0
  134. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/support_contact_runner_v161.py +0 -0
  135. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/support_contact_v161.py +0 -0
  136. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/task_adapter.py +0 -0
  137. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/task_visualization.py +0 -0
  138. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/tf_probe.py +0 -0
  139. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/tool_scene.py +0 -0
  140. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/tool_scene_probe.py +0 -0
  141. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/trajectory.py +0 -0
  142. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/trajectory_action_probe.py +0 -0
  143. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/trajectory_tracking.py +0 -0
  144. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/ur5e.py +0 -0
  145. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/ur5e_adapter.py +0 -0
  146. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/ur5e_v10_adapter.py +0 -0
  147. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/workpiece_follow.py +0 -0
  148. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/workpiece_gazebo_follower.py +0 -0
  149. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/ros2/workpiece_scene_probe.py +0 -0
  150. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/selective_verification.py +0 -0
  151. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/selective_verification_v16.py +0 -0
  152. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/setup_profile.py +0 -0
  153. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/sim_real_qualification.py +0 -0
  154. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/simulation.py +0 -0
  155. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/simulation_platform.py +0 -0
  156. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/smooth_motion_hotfix_v162.py +0 -0
  157. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/support_contact_hotfix_v161.py +0 -0
  158. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/tool_collision.py +0 -0
  159. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/trajectory_qualification.py +0 -0
  160. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/twin.py +0 -0
  161. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/twin_builder.py +0 -0
  162. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/twin_codec.py +0 -0
  163. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/twin_materialization.py +0 -0
  164. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/user_cli.py +0 -0
  165. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/user_cli_v15.py +0 -0
  166. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/user_cli_v16.py +0 -0
  167. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/user_cli_v18.py +0 -0
  168. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine/verification.py +0 -0
  169. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine.egg-info/dependency_links.txt +0 -0
  170. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine.egg-info/entry_points.txt +0 -0
  171. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine.egg-info/requires.txt +0 -0
  172. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/src/devagent_physical_engine.egg-info/top_level.txt +0 -0
  173. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_abb_irb1200_visual_v18.py +0 -0
  174. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_agent_core.py +0 -0
  175. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_agent_semantic_hardening.py +0 -0
  176. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_ai_cli.py +0 -0
  177. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_ai_cli_v07.py +0 -0
  178. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_commercial_importer_v1.py +0 -0
  179. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_commercial_intelligence_v15.py +0 -0
  180. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_commercial_readiness_v1.py +0 -0
  181. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_commercial_v1.py +0 -0
  182. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_continuous_clearance_v011.py +0 -0
  183. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_controller_runtime_hotfix_v181.py +0 -0
  184. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_core.py +0 -0
  185. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_destination_support_contact_v182.py +0 -0
  186. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_engineering_request_v07.py +0 -0
  187. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_evidence_replay_v12.py +0 -0
  188. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_evidence_trust_coverage_v12.py +0 -0
  189. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_evidence_trust_transport_v12.py +0 -0
  190. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_evidence_trust_v12.py +0 -0
  191. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_evidence_viewer_palette_v130.py +0 -0
  192. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_gazebo_cli_v0122.py +0 -0
  193. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_golden_abb_runner_v171.py +0 -0
  194. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_golden_abb_showcase.py +0 -0
  195. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_interpreter_profiles_v08.py +0 -0
  196. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_joint_state_probe_v0125.py +0 -0
  197. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_live_provider_qualification.py +0 -0
  198. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_measured_motion_v10.py +0 -0
  199. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_moveit_planning_diagnostics_v0125.py +0 -0
  200. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_moveit_scene_v0123.py +0 -0
  201. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_natural_language_agent_v07.py +0 -0
  202. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_one_command_hardening_v13.py +0 -0
  203. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_one_command_pose_hardening_v15.py +0 -0
  204. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_one_command_regression_v141.py +0 -0
  205. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_one_command_v13.py +0 -0
  206. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_openai_strict_schema_v0113.py +0 -0
  207. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_optimization_v05.py +0 -0
  208. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_physical_campaign_v09.py +0 -0
  209. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_physical_evidence_v09.py +0 -0
  210. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_physical_motion_v09.py +0 -0
  211. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_planning_fallback_v012.py +0 -0
  212. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_pose_math_v0125.py +0 -0
  213. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_preexecution_contract_v10.py +0 -0
  214. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_production_authority_v11.py +0 -0
  215. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_production_grade_coverage_v11.py +0 -0
  216. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_production_grade_v11.py +0 -0
  217. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_project_spine_v013.py +0 -0
  218. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_provider_and_qualification.py +0 -0
  219. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_provider_criterion_v15.py +0 -0
  220. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_qualification_cli_lifecycle_v06.py +0 -0
  221. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_qualification_harness_v06.py +0 -0
  222. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_readme_pypi.py +0 -0
  223. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_real_provider_adapters.py +0 -0
  224. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_reference_workcell_ros_frames_v0125.py +0 -0
  225. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_reference_workcell_v012.py +0 -0
  226. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_report_test_contract_coverage_v16.py +0 -0
  227. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_report_test_lineage_v16.py +0 -0
  228. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_report_test_visual_execution_v16.py +0 -0
  229. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_robot_platform_v08.py +0 -0
  230. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_ros2_production_receipts_v011.py +0 -0
  231. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_ros2_simulation.py +0 -0
  232. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_ros_trajectory_v09.py +0 -0
  233. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_selective_verification_v14.py +0 -0
  234. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_setup_profile.py +0 -0
  235. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_sim_real_qualification_v011.py +0 -0
  236. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_simulation_platform_v08.py +0 -0
  237. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_smooth_motion_hotfix_v162.py +0 -0
  238. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_support_contact_hotfix_v161.py +0 -0
  239. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_tool_collision_v011.py +0 -0
  240. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_tool_scene_v0124.py +0 -0
  241. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_trajectory_action_probe_v0125.py +0 -0
  242. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_trajectory_qualification_v09.py +0 -0
  243. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_trajectory_tracking_v0125.py +0 -0
  244. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_twin_materialization_v10.py +0 -0
  245. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_twin_v08.py +0 -0
  246. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_ur5e_adapter_scopes_v09.py +0 -0
  247. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_ur5e_v10_adapter_scopes.py +0 -0
  248. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_user_cli_interactive_v131.py +0 -0
  249. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_user_cli_progress_v131.py +0 -0
  250. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_user_cli_report_visual_v16.py +0 -0
  251. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_user_cli_selective_v14.py +0 -0
  252. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_user_cli_v15.py +0 -0
  253. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_user_cli_v15_hotfix_inheritance.py +0 -0
  254. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_v052_stabilization.py +0 -0
  255. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_v08_catalog_mapping_regression.py +0 -0
  256. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_workpiece_attach_semantics_v183.py +0 -0
  257. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_workpiece_lifecycle_v011.py +0 -0
  258. {devagent_physical_engine-1.8.5 → devagent_physical_engine-1.8.8}/tests/test_workpiece_scene_probe_v185.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: devagent-physical-engine
3
- Version: 1.8.5
3
+ Version: 1.8.8
4
4
  Summary: Verification-first robotics commissioning runtime with exact-Twin evidence, qualified UR5e Gazebo/MoveIt report execution, truthful robot support tiers, selective verification, replay, regression, and FAT reporting.
5
5
  Author: Tom Ha
6
6
  License: All Rights Reserved
@@ -76,7 +76,7 @@ regression + FAT report + Evidence Viewer
76
76
  Python 3.11+ is required.
77
77
 
78
78
  ```bash
79
- python -m pip install --upgrade devagent-physical-engine==1.8.5
79
+ python -m pip install --upgrade devagent-physical-engine==1.8.8
80
80
  ```
81
81
 
82
82
  Verify the installed package:
@@ -88,7 +88,7 @@ python -c "import devagent_physical_engine as d; print(d.__version__)"
88
88
  Expected:
89
89
 
90
90
  ```text
91
- 1.8.5
91
+ 1.8.8
92
92
  ```
93
93
 
94
94
  Run the normal customer workflow:
@@ -426,6 +426,28 @@ MoveIt round-trips attached-object rotations through Eigen. Unit quaternions `q`
426
426
 
427
427
  Verification remains strict for attachment identity, link, geometry contract, position, and physical rotation. This is not a tolerance-based PASS and does not change target geometry, TCP, collision policy, planner types, motion speeds, controller binding, Twin lineage, site qualification, or real-execution authority. If a hash mismatch remains, DevAgent records expected and observed hashes plus canonical expected/object/primitive/effective attachment poses for target diagnosis.
428
428
 
429
+ ## v1.8.6 canonical semantic workpiece lifecycle
430
+
431
+ A clean v1.8.5 UR5e target-stack run again reached all five industrial preflight groups and executed `approach_pick`, while GRASP still failed with `workpiece_attachment_hash_mismatch`. That target evidence proved raw SHA equality of floating pose representations was too brittle to remain physical PASS authority.
432
+
433
+ v1.8.6 uses MoveIt's canonical existing-object lifecycle. Before GRASP, DevAgent reads back and semantically verifies the exact world workpiece. Attach then sends an ID-only `AttachedCollisionObject.ADD`; MoveIt transfers the already-verified world object's geometry and pose into the AttachedBody on the verified tool link. Release sends an ID-only attached-object REMOVE; MoveIt restores that same AttachedBody to the world at its current global pose.
434
+
435
+ The lifecycle remains fail-closed. Attach requires exact object identity, exact attached link, exact touch-link set, exact geometry kind, dimensions within `1e-9 m`, position error no greater than `0.1 mm`, and orientation error no greater than `1e-4 rad`. Detach similarly verifies restored world identity, geometry, destination frame, position, and orientation. Representation hashes remain recorded for audit diagnostics but do not override the explicit physical-semantic checks.
436
+
437
+ Every lifecycle transition persists a deterministic receipt containing probe stdout/stderr plus expected/observed semantic diagnostics. Any failure includes the receipt path so the next target-stack blocker can be diagnosed directly instead of being collapsed to a generic lifecycle code.
438
+
439
+ This release does not disable collision checking, change the verified tool/workpiece geometry, modify motion targets, planner types or speeds, detach early, grant site qualification, or expand real-execution authority.
440
+
441
+ ## v1.8.8 canonical world integrity gate before GRASP
442
+
443
+ v1.8.8 packages the latest workpiece-lifecycle diagnostics as an unambiguous release version so target acceptance no longer runs newer code while reporting `1.8.6`.
444
+
445
+ Before ATTACH, DevAgent now reasserts the exact canonical Twin workpiece into the live MoveIt world, synchronously reads the object back, normalizes ROS `uint8/octet` primitive representations safely, and requires exact identity/frame/geometry plus bounded pose agreement before attachment is attempted. Primitive type `0` remains invalid; DevAgent does not infer BOX/CYLINDER from dimensions or weaken collision checking.
446
+
447
+ The lifecycle receipt records the pre/post primitive type representation, canonical-world reassert result, semantic verification, and the exact inner failure code. Existing target poses, conservative Pilz motion limits, tool/workpiece geometry, site-qualification boundaries, and `real_execution_allowed = false` remain unchanged.
448
+
449
+ Hosted CI qualifies the software/build/install contract. The ROS/Gazebo/MoveIt workstation still requires a fresh target acceptance run of the released 1.8.8 artifact before this specific workpiece path can be called physically qualified.
450
+
429
451
  ## Qualified visual-execution scope
430
452
 
431
453
  Measured report-test execution remains intentionally narrow:
@@ -626,9 +648,9 @@ devagent-physical-ai optional provider-backed engineering front end
626
648
 
627
649
  # Project status
628
650
 
629
- **v1.8.5 — Production/Stable software workflow**
651
+ **v1.8.8 — Production/Stable software workflow**
630
652
 
631
- v1.8.5 retains v1.8.4 PyPI metadata compliance, v1.8.3 synchronous service-safe workpiece attachment, v1.8.2 scoped destination-support place contact, v1.8.1 direct UR5e controller/action binding, truthful robot support tiers, and the ABB IRB1200 experimental visual runtime. It makes strict workpiece attachment verification invariant to the mathematically equivalent quaternion representations `q` and `-q` and persists exact pose/hash diagnostics for any remaining mismatch.
653
+ v1.8.8 retains the v1.8.6 semantic lifecycle and the target-candidate improvements layered after it, while making the package/version identity explicit. The current GRASP path adds ROS-octet-safe diagnostics and a synchronous canonical-world reassert/readback gate before attachment. This release is intended to make the next workstation qualification run reproducible and attributable to one exact installable artifact.
632
654
 
633
655
  Production-oriented software capabilities include:
634
656
 
@@ -643,8 +665,8 @@ exact Requirement → Mapping → Verification Plan → Case provenance
643
665
  truthful robot support tiers
644
666
  qualified UR5e report-test visual execution contract
645
667
  direct UR5e controller-manager/action readiness binding
646
- synchronous verified workpiece attach/detach lifecycle
647
- quaternion-invariant strict attachment hashing
668
+ canonical MoveIt workpiece lifecycle with world-integrity gate
669
+ semantic workpiece pose/geometry verification with persistent diagnostics
648
670
  scoped destination-support place contact
649
671
  experimental exact ABB IRB1200 Gazebo/MoveIt/RViz preview
650
672
  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.5
38
+ python -m pip install --upgrade devagent-physical-engine==1.8.8
39
39
  ```
40
40
 
41
41
  Verify the installed package:
@@ -47,7 +47,7 @@ python -c "import devagent_physical_engine as d; print(d.__version__)"
47
47
  Expected:
48
48
 
49
49
  ```text
50
- 1.8.5
50
+ 1.8.8
51
51
  ```
52
52
 
53
53
  Run the normal customer workflow:
@@ -385,6 +385,28 @@ MoveIt round-trips attached-object rotations through Eigen. Unit quaternions `q`
385
385
 
386
386
  Verification remains strict for attachment identity, link, geometry contract, position, and physical rotation. This is not a tolerance-based PASS and does not change target geometry, TCP, collision policy, planner types, motion speeds, controller binding, Twin lineage, site qualification, or real-execution authority. If a hash mismatch remains, DevAgent records expected and observed hashes plus canonical expected/object/primitive/effective attachment poses for target diagnosis.
387
387
 
388
+ ## v1.8.6 canonical semantic workpiece lifecycle
389
+
390
+ A clean v1.8.5 UR5e target-stack run again reached all five industrial preflight groups and executed `approach_pick`, while GRASP still failed with `workpiece_attachment_hash_mismatch`. That target evidence proved raw SHA equality of floating pose representations was too brittle to remain physical PASS authority.
391
+
392
+ v1.8.6 uses MoveIt's canonical existing-object lifecycle. Before GRASP, DevAgent reads back and semantically verifies the exact world workpiece. Attach then sends an ID-only `AttachedCollisionObject.ADD`; MoveIt transfers the already-verified world object's geometry and pose into the AttachedBody on the verified tool link. Release sends an ID-only attached-object REMOVE; MoveIt restores that same AttachedBody to the world at its current global pose.
393
+
394
+ The lifecycle remains fail-closed. Attach requires exact object identity, exact attached link, exact touch-link set, exact geometry kind, dimensions within `1e-9 m`, position error no greater than `0.1 mm`, and orientation error no greater than `1e-4 rad`. Detach similarly verifies restored world identity, geometry, destination frame, position, and orientation. Representation hashes remain recorded for audit diagnostics but do not override the explicit physical-semantic checks.
395
+
396
+ Every lifecycle transition persists a deterministic receipt containing probe stdout/stderr plus expected/observed semantic diagnostics. Any failure includes the receipt path so the next target-stack blocker can be diagnosed directly instead of being collapsed to a generic lifecycle code.
397
+
398
+ This release does not disable collision checking, change the verified tool/workpiece geometry, modify motion targets, planner types or speeds, detach early, grant site qualification, or expand real-execution authority.
399
+
400
+ ## v1.8.8 canonical world integrity gate before GRASP
401
+
402
+ v1.8.8 packages the latest workpiece-lifecycle diagnostics as an unambiguous release version so target acceptance no longer runs newer code while reporting `1.8.6`.
403
+
404
+ Before ATTACH, DevAgent now reasserts the exact canonical Twin workpiece into the live MoveIt world, synchronously reads the object back, normalizes ROS `uint8/octet` primitive representations safely, and requires exact identity/frame/geometry plus bounded pose agreement before attachment is attempted. Primitive type `0` remains invalid; DevAgent does not infer BOX/CYLINDER from dimensions or weaken collision checking.
405
+
406
+ The lifecycle receipt records the pre/post primitive type representation, canonical-world reassert result, semantic verification, and the exact inner failure code. Existing target poses, conservative Pilz motion limits, tool/workpiece geometry, site-qualification boundaries, and `real_execution_allowed = false` remain unchanged.
407
+
408
+ Hosted CI qualifies the software/build/install contract. The ROS/Gazebo/MoveIt workstation still requires a fresh target acceptance run of the released 1.8.8 artifact before this specific workpiece path can be called physically qualified.
409
+
388
410
  ## Qualified visual-execution scope
389
411
 
390
412
  Measured report-test execution remains intentionally narrow:
@@ -585,9 +607,9 @@ devagent-physical-ai optional provider-backed engineering front end
585
607
 
586
608
  # Project status
587
609
 
588
- **v1.8.5 — Production/Stable software workflow**
610
+ **v1.8.8 — Production/Stable software workflow**
589
611
 
590
- v1.8.5 retains v1.8.4 PyPI metadata compliance, v1.8.3 synchronous service-safe workpiece attachment, v1.8.2 scoped destination-support place contact, v1.8.1 direct UR5e controller/action binding, truthful robot support tiers, and the ABB IRB1200 experimental visual runtime. It makes strict workpiece attachment verification invariant to the mathematically equivalent quaternion representations `q` and `-q` and persists exact pose/hash diagnostics for any remaining mismatch.
612
+ v1.8.8 retains the v1.8.6 semantic lifecycle and the target-candidate improvements layered after it, while making the package/version identity explicit. The current GRASP path adds ROS-octet-safe diagnostics and a synchronous canonical-world reassert/readback gate before attachment. This release is intended to make the next workstation qualification run reproducible and attributable to one exact installable artifact.
591
613
 
592
614
  Production-oriented software capabilities include:
593
615
 
@@ -602,8 +624,8 @@ exact Requirement → Mapping → Verification Plan → Case provenance
602
624
  truthful robot support tiers
603
625
  qualified UR5e report-test visual execution contract
604
626
  direct UR5e controller-manager/action readiness binding
605
- synchronous verified workpiece attach/detach lifecycle
606
- quaternion-invariant strict attachment hashing
627
+ canonical MoveIt workpiece lifecycle with world-integrity gate
628
+ semantic workpiece pose/geometry verification with persistent diagnostics
607
629
  scoped destination-support place contact
608
630
  experimental exact ABB IRB1200 Gazebo/MoveIt/RViz preview
609
631
  industrial Pilz PTP / LIN planning
@@ -657,4 +679,4 @@ Original creator: Tom Ha
657
679
  Original project: https://github.com/tomha85/devagent-physical-engine
658
680
  All rights reserved.
659
681
 
660
- See repository `LICENSE`, `NOTICE`, and `COPYRIGHT` for complete ownership and usage terms.
682
+ See repository `LICENSE`, `NOTICE`, and `COPYRIGHT` for complete ownership and usage terms.
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "devagent-physical-engine"
7
- version = "1.8.5"
7
+ version = "1.8.8"
8
8
  description = "Verification-first robotics commissioning runtime with exact-Twin evidence, qualified UR5e Gazebo/MoveIt report execution, truthful robot support tiers, selective verification, replay, regression, and FAT reporting."
9
9
  readme = { file = "README.md", content-type = "text/markdown" }
10
10
  requires-python = ">=3.11"
@@ -65,6 +65,9 @@ omit = [
65
65
  # simulator, move_group, TF, controller actions, or gz services.
66
66
  # Pure contracts/reference-workcell logic remains inside the hosted coverage gate.
67
67
  "src/devagent_physical_engine/ros2/*_probe.py",
68
+ "src/devagent_physical_engine/ros2/workpiece_scene_probe_v186.py",
69
+ "src/devagent_physical_engine/ros2/workpiece_scene_probe_v187.py",
70
+ "src/devagent_physical_engine/ros2/workpiece_scene_probe_v188.py",
68
71
  "src/devagent_physical_engine/ros2/qualification*.py",
69
72
  "src/devagent_physical_engine/ros2/joint_state_recorder.py",
70
73
  "src/devagent_physical_engine/ros2/ur5e_adapter.py",
@@ -219,4 +219,4 @@ install_industrial_motion_v170()
219
219
  install_controller_runtime_hotfix_v181()
220
220
  install_one_command_runtime()
221
221
 
222
- __version__ = "1.8.5"
222
+ __version__ = "1.8.8"
@@ -38,6 +38,30 @@ class MoveItWorkpieceLifecycleBridge:
38
38
  raise SimulationPlatformError("workpiece_materialization_missing_or_ambiguous")
39
39
  return matches[0]
40
40
 
41
+ @staticmethod
42
+ def _persist_probe_receipt(
43
+ path: Path,
44
+ *,
45
+ operation: WorkpieceOperation,
46
+ result,
47
+ output: dict[str, object] | None,
48
+ ) -> None:
49
+ record = {
50
+ "operation": operation.value,
51
+ "command_ok": bool(result.ok),
52
+ "returncode": int(getattr(result, "returncode", 0 if result.ok else 1)),
53
+ "duration_s": float(getattr(result, "duration_s", 0.0)),
54
+ "stdout": str(getattr(result, "stdout", "")),
55
+ "stderr": str(getattr(result, "stderr", "")),
56
+ "probe_output": output,
57
+ }
58
+ temporary = path.with_suffix(path.suffix + ".tmp")
59
+ temporary.write_text(
60
+ json.dumps(record, indent=2, sort_keys=True, allow_nan=False) + "\n",
61
+ encoding="utf-8",
62
+ )
63
+ temporary.replace(path)
64
+
41
65
  def _transition(
42
66
  self,
43
67
  *,
@@ -63,7 +87,11 @@ class MoveItWorkpieceLifecycleBridge:
63
87
  raise SimulationPlatformError("workpiece_world_pose_override_non_finite")
64
88
 
65
89
  workpiece = self._workpiece(materialization, workpiece_entity_id)
66
- position = tuple(world_position_m) if world_position_m is not None else workpiece.position_m
90
+ position = (
91
+ tuple(world_position_m)
92
+ if world_position_m is not None
93
+ else workpiece.position_m
94
+ )
67
95
  quaternion = (
68
96
  tuple(world_quaternion_xyzw)
69
97
  if world_quaternion_xyzw is not None
@@ -86,7 +114,9 @@ class MoveItWorkpieceLifecycleBridge:
86
114
  },
87
115
  },
88
116
  }
89
- payload_path = self.work_dir / f"{materialization.fingerprint}.{operation.value}.{workpiece.backend_id}.json"
117
+ payload_path = self.work_dir / (
118
+ f"{materialization.fingerprint}.{operation.value}.{workpiece.backend_id}.json"
119
+ )
90
120
  temporary = payload_path.with_suffix(payload_path.suffix + ".tmp")
91
121
  temporary.write_text(
92
122
  json.dumps(payload, sort_keys=True, separators=(",", ":"), allow_nan=False),
@@ -94,7 +124,7 @@ class MoveItWorkpieceLifecycleBridge:
94
124
  )
95
125
  temporary.replace(payload_path)
96
126
 
97
- helper = Path(__file__).with_name("workpiece_scene_probe.py").resolve()
127
+ helper = Path(__file__).with_name("workpiece_scene_probe_v188.py").resolve()
98
128
  result = self.runner.run(
99
129
  (
100
130
  "python3",
@@ -107,14 +137,43 @@ class MoveItWorkpieceLifecycleBridge:
107
137
  ),
108
138
  timeout_s=self.timeout_s + 10.0,
109
139
  )
140
+ probe_receipt_path = payload_path.with_name(payload_path.name + ".receipt.json")
141
+ output: dict[str, object] | None = None
110
142
  try:
111
- output = json.loads(result.stdout.strip().splitlines()[-1])
112
- except (IndexError, json.JSONDecodeError) as exc:
113
- raise SimulationPlatformError("workpiece_scene_probe_output_invalid") from exc
114
- if not isinstance(output, dict):
115
- raise SimulationPlatformError("workpiece_scene_probe_output_invalid")
143
+ decoded = json.loads(result.stdout.strip().splitlines()[-1])
144
+ if isinstance(decoded, dict):
145
+ output = decoded
146
+ except (IndexError, json.JSONDecodeError):
147
+ output = None
148
+ self._persist_probe_receipt(
149
+ probe_receipt_path,
150
+ operation=operation,
151
+ result=result,
152
+ output=output,
153
+ )
154
+ if output is None:
155
+ raise SimulationPlatformError(
156
+ f"workpiece_scene_probe_output_invalid:evidence={probe_receipt_path}"
157
+ )
116
158
 
117
159
  verified = bool(output.get("success")) and result.ok
160
+ semantic_key = (
161
+ "attachment_semantics"
162
+ if operation is WorkpieceOperation.ATTACH
163
+ else "world_semantics"
164
+ )
165
+ semantic = output.get(semantic_key)
166
+ semantic_payload = semantic if isinstance(semantic, dict) else {}
167
+ observed_world_present = (
168
+ bool(output["observed_world_present"])
169
+ if "observed_world_present" in output
170
+ else int(output.get("observed_world_count") or 0) > 0
171
+ )
172
+ observed_attached_link = (
173
+ str(output["observed_attached_link"])
174
+ if output.get("observed_attached_link") is not None
175
+ else None
176
+ )
118
177
  receipt = WorkpieceLifecycleReceipt(
119
178
  operation=operation,
120
179
  verified=verified,
@@ -133,20 +192,52 @@ class MoveItWorkpieceLifecycleBridge:
133
192
  if operation is WorkpieceOperation.ATTACH
134
193
  else WorkpieceState.WORLD
135
194
  ),
136
- observed_world_present=bool(output.get("observed_world_present")),
137
- observed_attached_link=(
138
- str(output["observed_attached_link"])
139
- if output.get("observed_attached_link") is not None
140
- else None
141
- ),
195
+ observed_world_present=observed_world_present,
196
+ observed_attached_link=observed_attached_link,
142
197
  attachment_hash=(
143
198
  str(output["attachment_hash"])
144
199
  if output.get("attachment_hash") is not None
145
200
  else None
146
201
  ),
202
+ observed_attachment_hash=(
203
+ str(output["observed_attachment_hash"])
204
+ if output.get("observed_attachment_hash") is not None
205
+ else None
206
+ ),
207
+ representation_hash_match=(
208
+ bool(output["representation_hash_match"])
209
+ if output.get("representation_hash_match") is not None
210
+ else None
211
+ ),
212
+ semantic_verified=(
213
+ bool(semantic_payload.get("success")) if semantic_payload else None
214
+ ),
215
+ position_error_m=(
216
+ float(semantic_payload["position_error_m"])
217
+ if semantic_payload.get("position_error_m") is not None
218
+ else None
219
+ ),
220
+ orientation_error_rad=(
221
+ float(semantic_payload["orientation_error_rad"])
222
+ if semantic_payload.get("orientation_error_rad") is not None
223
+ else None
224
+ ),
225
+ position_tolerance_m=(
226
+ float(semantic_payload["position_tolerance_m"])
227
+ if semantic_payload.get("position_tolerance_m") is not None
228
+ else None
229
+ ),
230
+ orientation_tolerance_rad=(
231
+ float(semantic_payload["orientation_tolerance_rad"])
232
+ if semantic_payload.get("orientation_tolerance_rad") is not None
233
+ else None
234
+ ),
235
+ diagnostic_path=str(probe_receipt_path),
147
236
  )
148
237
  if not receipt.verified:
149
- raise SimulationPlatformError(f"workpiece_lifecycle_failed:{receipt.code}")
238
+ raise SimulationPlatformError(
239
+ f"workpiece_lifecycle_failed:{receipt.code}:evidence={probe_receipt_path}"
240
+ )
150
241
  return receipt
151
242
 
152
243
  def attach(