devagent-physical-engine 1.8.4__tar.gz → 1.8.6__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {devagent_physical_engine-1.8.4/src/devagent_physical_engine.egg-info → devagent_physical_engine-1.8.6}/PKG-INFO +27 -6
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/README.md +27 -6
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/pyproject.toml +2 -1
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/__init__.py +1 -1
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/workpiece_scene.py +106 -15
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/workpiece_scene_probe.py +44 -1
- devagent_physical_engine-1.8.6/src/devagent_physical_engine/ros2/workpiece_scene_probe_v186.py +523 -0
- devagent_physical_engine-1.8.6/src/devagent_physical_engine/workpiece_lifecycle.py +116 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6/src/devagent_physical_engine.egg-info}/PKG-INFO +27 -6
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine.egg-info/SOURCES.txt +4 -1
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_industrial_motion_v170.py +2 -2
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_package_metadata_v184.py +2 -2
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_transfer_place_diagnostic_v172.py +2 -2
- devagent_physical_engine-1.8.6/tests/test_workpiece_scene_probe_v185.py +52 -0
- devagent_physical_engine-1.8.6/tests/test_workpiece_semantic_lifecycle_v186.py +208 -0
- devagent_physical_engine-1.8.4/src/devagent_physical_engine/workpiece_lifecycle.py +0 -66
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/NOTICE +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/setup.cfg +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/agent/__init__.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/agent/compiler.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/agent/contracts.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/agent/coordinator.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/agent/critic.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/agent/evidence.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/agent/interpreter.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/agent/planner.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/agent/recovery.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/agent/routing.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/agent/runtime.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/agent/semantic.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/agent/structured.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ai_cli.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/cli.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/commercial.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/commercial_campaign.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/commercial_cli.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/commercial_importer.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/commercial_intelligence.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/commercial_readiness.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/commercial_repository.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/continuous_clearance.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/controller_runtime_hotfix_v181.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/doctor.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/engineering_agent.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/engineering_request.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/evidence_replay.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/evidence_trust.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/execution.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/industrial_motion_hotfix_v170.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/industrial_motion_v170.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/industrial_motion_v182.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/models.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/one_command.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/one_command_runtime.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/one_command_v15.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/one_command_v16.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/operating_envelope.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/optimization/__init__.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/optimization/benchmark.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/optimization/candidates.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/optimization/contracts.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/optimization/evaluator.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/optimization/evidence.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/optimization/experience.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/optimization/measured.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/optimization/optimizer.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/optimization/orchestrator.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/physical_campaign.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/physical_evidence.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/physical_motion.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/planning.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/pose_math.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/preexecution_contract.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/production_authority.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/production_grade.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/project.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/provider_adapters/__init__.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/provider_adapters/anthropic.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/provider_adapters/common.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/provider_adapters/factory.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/provider_adapters/gemini.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/provider_adapters/openai.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/provider_criterion.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/provider_qualification.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/providers.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/qualification.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/qualification_cli.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/qualification_harness.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/reference_workcell.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/report_test_execution.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/report_test_execution_strict.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/robot_platform.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/robot_support_v18.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/robots.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/__init__.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/abb_irb1200.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/abb_irb1200_preview.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/acceptance.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/commands.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/continuous_clearance_probe.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/controller_action_probe.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/destination_support_contact_v182.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/doctor.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/fk_pose.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/fk_probe.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/frame_alignment.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/gazebo_cli.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/gazebo_pose.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/gazebo_world.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v170.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v171.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v172.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v182.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/joint_state_probe.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/joint_state_recorder.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/measured_motion.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/moveit_joint_plan_probe.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/moveit_joint_plan_v161_probe.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/moveit_scene.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/moveit_task_planner.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/pilz_sequence_plan_probe.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/pilz_sequence_plan_probe_v182.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/preexecution.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/qualification.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/qualification_v10.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/qualification_v11.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/qualification_v12.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/report_test_visualization.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/report_test_visualization_v170.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/scene_probe.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/state_validity_probe.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/support_contact_acm_probe_v170.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/support_contact_lease_v170.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/support_contact_runner_v161.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/support_contact_v161.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/task_adapter.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/task_visualization.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/tf_probe.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/tool_scene.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/tool_scene_probe.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/trajectory.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/trajectory_action_probe.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/trajectory_tracking.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/ur5e.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/ur5e_adapter.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/ur5e_v10_adapter.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/workpiece_follow.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/ros2/workpiece_gazebo_follower.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/selective_verification.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/selective_verification_v16.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/setup_profile.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/sim_real_qualification.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/simulation.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/simulation_platform.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/smooth_motion_hotfix_v162.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/support_contact_hotfix_v161.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/tool_collision.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/trajectory_qualification.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/twin.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/twin_builder.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/twin_codec.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/twin_materialization.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/user_cli.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/user_cli_v15.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/user_cli_v16.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/user_cli_v18.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine/verification.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine.egg-info/dependency_links.txt +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine.egg-info/entry_points.txt +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine.egg-info/requires.txt +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/src/devagent_physical_engine.egg-info/top_level.txt +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_abb_irb1200_visual_v18.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_agent_core.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_agent_semantic_hardening.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_ai_cli.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_ai_cli_v07.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_commercial_importer_v1.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_commercial_intelligence_v15.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_commercial_readiness_v1.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_commercial_v1.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_continuous_clearance_v011.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_controller_runtime_hotfix_v181.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_core.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_destination_support_contact_v182.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_engineering_request_v07.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_evidence_replay_v12.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_evidence_trust_coverage_v12.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_evidence_trust_transport_v12.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_evidence_trust_v12.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_evidence_viewer_palette_v130.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_gazebo_cli_v0122.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_golden_abb_runner_v171.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_golden_abb_showcase.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_interpreter_profiles_v08.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_joint_state_probe_v0125.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_live_provider_qualification.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_measured_motion_v10.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_moveit_planning_diagnostics_v0125.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_moveit_scene_v0123.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_natural_language_agent_v07.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_one_command_hardening_v13.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_one_command_pose_hardening_v15.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_one_command_regression_v141.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_one_command_v13.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_openai_strict_schema_v0113.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_optimization_v05.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_physical_campaign_v09.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_physical_evidence_v09.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_physical_motion_v09.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_planning_fallback_v012.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_pose_math_v0125.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_preexecution_contract_v10.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_production_authority_v11.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_production_grade_coverage_v11.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_production_grade_v11.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_project_spine_v013.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_provider_and_qualification.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_provider_criterion_v15.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_qualification_cli_lifecycle_v06.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_qualification_harness_v06.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_readme_pypi.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_real_provider_adapters.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_reference_workcell_ros_frames_v0125.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_reference_workcell_v012.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_report_test_contract_coverage_v16.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_report_test_lineage_v16.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_report_test_visual_execution_v16.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_robot_platform_v08.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_ros2_production_receipts_v011.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_ros2_simulation.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_ros_trajectory_v09.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_selective_verification_v14.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_setup_profile.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_sim_real_qualification_v011.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_simulation_platform_v08.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_smooth_motion_hotfix_v162.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_support_contact_hotfix_v161.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_tool_collision_v011.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_tool_scene_v0124.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_trajectory_action_probe_v0125.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_trajectory_qualification_v09.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_trajectory_tracking_v0125.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_twin_materialization_v10.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_twin_v08.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_ur5e_adapter_scopes_v09.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_ur5e_v10_adapter_scopes.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_user_cli_interactive_v131.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_user_cli_progress_v131.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_user_cli_report_visual_v16.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_user_cli_selective_v14.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_user_cli_v15.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_user_cli_v15_hotfix_inheritance.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_v052_stabilization.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_v08_catalog_mapping_regression.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_workpiece_attach_semantics_v183.py +0 -0
- {devagent_physical_engine-1.8.4 → devagent_physical_engine-1.8.6}/tests/test_workpiece_lifecycle_v011.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devagent-physical-engine
|
|
3
|
-
Version: 1.8.
|
|
3
|
+
Version: 1.8.6
|
|
4
4
|
Summary: Verification-first robotics commissioning runtime with exact-Twin evidence, qualified UR5e Gazebo/MoveIt report execution, truthful robot support tiers, selective verification, replay, regression, and FAT reporting.
|
|
5
5
|
Author: Tom Ha
|
|
6
6
|
License: All Rights Reserved
|
|
@@ -76,7 +76,7 @@ regression + FAT report + Evidence Viewer
|
|
|
76
76
|
Python 3.11+ is required.
|
|
77
77
|
|
|
78
78
|
```bash
|
|
79
|
-
python -m pip install --upgrade devagent-physical-engine==1.8.
|
|
79
|
+
python -m pip install --upgrade devagent-physical-engine==1.8.6
|
|
80
80
|
```
|
|
81
81
|
|
|
82
82
|
Verify the installed package:
|
|
@@ -88,7 +88,7 @@ python -c "import devagent_physical_engine as d; print(d.__version__)"
|
|
|
88
88
|
Expected:
|
|
89
89
|
|
|
90
90
|
```text
|
|
91
|
-
1.8.
|
|
91
|
+
1.8.6
|
|
92
92
|
```
|
|
93
93
|
|
|
94
94
|
Run the normal customer workflow:
|
|
@@ -418,6 +418,26 @@ v1.8.4 carries the exact v1.8.3 runtime semantics and shortens only the package
|
|
|
418
418
|
|
|
419
419
|
This metadata hotfix does not change the UR5e attach/detach lifecycle, collision policy, motion planning, Twin lineage, site-qualification boundary, or real-execution authority.
|
|
420
420
|
|
|
421
|
+
## v1.8.5 quaternion-invariant verified workpiece attach
|
|
422
|
+
|
|
423
|
+
A clean v1.8.4 UR5e target-stack run proved that synchronous `/apply_planning_scene` attachment now succeeds, world/attached state reaches strict read-back, and the remaining GRASP blocker is `workpiece_attachment_hash_mismatch`.
|
|
424
|
+
|
|
425
|
+
MoveIt round-trips attached-object rotations through Eigen. Unit quaternions `q` and `-q` represent the same physical rotation, but a raw component hash treats those two equivalent representations as different. v1.8.5 canonicalizes equivalent quaternion signs before workpiece attachment hashing using the same deterministic positive-`w` / first-nonzero-component rule already used by the qualified tool-scene path.
|
|
426
|
+
|
|
427
|
+
Verification remains strict for attachment identity, link, geometry contract, position, and physical rotation. This is not a tolerance-based PASS and does not change target geometry, TCP, collision policy, planner types, motion speeds, controller binding, Twin lineage, site qualification, or real-execution authority. If a hash mismatch remains, DevAgent records expected and observed hashes plus canonical expected/object/primitive/effective attachment poses for target diagnosis.
|
|
428
|
+
|
|
429
|
+
## v1.8.6 canonical semantic workpiece lifecycle
|
|
430
|
+
|
|
431
|
+
A clean v1.8.5 UR5e target-stack run again reached all five industrial preflight groups and executed `approach_pick`, while GRASP still failed with `workpiece_attachment_hash_mismatch`. That target evidence proved raw SHA equality of floating pose representations was too brittle to remain physical PASS authority.
|
|
432
|
+
|
|
433
|
+
v1.8.6 uses MoveIt's canonical existing-object lifecycle. Before GRASP, DevAgent reads back and semantically verifies the exact world workpiece. Attach then sends an ID-only `AttachedCollisionObject.ADD`; MoveIt transfers the already-verified world object's geometry and pose into the AttachedBody on the verified tool link. Release sends an ID-only attached-object REMOVE; MoveIt restores that same AttachedBody to the world at its current global pose.
|
|
434
|
+
|
|
435
|
+
The lifecycle remains fail-closed. Attach requires exact object identity, exact attached link, exact touch-link set, exact geometry kind, dimensions within `1e-9 m`, position error no greater than `0.1 mm`, and orientation error no greater than `1e-4 rad`. Detach similarly verifies restored world identity, geometry, destination frame, position, and orientation. Representation hashes remain recorded for audit diagnostics but do not override the explicit physical-semantic checks.
|
|
436
|
+
|
|
437
|
+
Every lifecycle transition persists a deterministic receipt containing probe stdout/stderr plus expected/observed semantic diagnostics. Any failure includes the receipt path so the next target-stack blocker can be diagnosed directly instead of being collapsed to a generic lifecycle code.
|
|
438
|
+
|
|
439
|
+
This release does not disable collision checking, change the verified tool/workpiece geometry, modify motion targets, planner types or speeds, detach early, grant site qualification, or expand real-execution authority.
|
|
440
|
+
|
|
421
441
|
## Qualified visual-execution scope
|
|
422
442
|
|
|
423
443
|
Measured report-test execution remains intentionally narrow:
|
|
@@ -618,9 +638,9 @@ devagent-physical-ai optional provider-backed engineering front end
|
|
|
618
638
|
|
|
619
639
|
# Project status
|
|
620
640
|
|
|
621
|
-
**v1.8.
|
|
641
|
+
**v1.8.6 — Production/Stable software workflow**
|
|
622
642
|
|
|
623
|
-
v1.8.
|
|
643
|
+
v1.8.6 retains v1.8.5 quaternion canonicalization, v1.8.4 PyPI metadata compliance, v1.8.3 synchronous service-safe attachment, v1.8.2 scoped destination-support place contact, and v1.8.1 direct UR5e controller/action binding. It upgrades the workpiece lifecycle to canonical MoveIt existing-object world↔attached transitions, strict physical-semantic pose/geometry verification, and persistent expected/observed lifecycle diagnostics instead of using floating representation SHA equality as PASS authority.
|
|
624
644
|
|
|
625
645
|
Production-oriented software capabilities include:
|
|
626
646
|
|
|
@@ -635,7 +655,8 @@ exact Requirement → Mapping → Verification Plan → Case provenance
|
|
|
635
655
|
truthful robot support tiers
|
|
636
656
|
qualified UR5e report-test visual execution contract
|
|
637
657
|
direct UR5e controller-manager/action readiness binding
|
|
638
|
-
|
|
658
|
+
canonical MoveIt existing-object workpiece attach/detach
|
|
659
|
+
semantic workpiece pose/geometry verification with persistent diagnostics
|
|
639
660
|
scoped destination-support place contact
|
|
640
661
|
experimental exact ABB IRB1200 Gazebo/MoveIt/RViz preview
|
|
641
662
|
industrial Pilz PTP / LIN planning
|
|
@@ -35,7 +35,7 @@ regression + FAT report + Evidence Viewer
|
|
|
35
35
|
Python 3.11+ is required.
|
|
36
36
|
|
|
37
37
|
```bash
|
|
38
|
-
python -m pip install --upgrade devagent-physical-engine==1.8.
|
|
38
|
+
python -m pip install --upgrade devagent-physical-engine==1.8.6
|
|
39
39
|
```
|
|
40
40
|
|
|
41
41
|
Verify the installed package:
|
|
@@ -47,7 +47,7 @@ python -c "import devagent_physical_engine as d; print(d.__version__)"
|
|
|
47
47
|
Expected:
|
|
48
48
|
|
|
49
49
|
```text
|
|
50
|
-
1.8.
|
|
50
|
+
1.8.6
|
|
51
51
|
```
|
|
52
52
|
|
|
53
53
|
Run the normal customer workflow:
|
|
@@ -377,6 +377,26 @@ v1.8.4 carries the exact v1.8.3 runtime semantics and shortens only the package
|
|
|
377
377
|
|
|
378
378
|
This metadata hotfix does not change the UR5e attach/detach lifecycle, collision policy, motion planning, Twin lineage, site-qualification boundary, or real-execution authority.
|
|
379
379
|
|
|
380
|
+
## v1.8.5 quaternion-invariant verified workpiece attach
|
|
381
|
+
|
|
382
|
+
A clean v1.8.4 UR5e target-stack run proved that synchronous `/apply_planning_scene` attachment now succeeds, world/attached state reaches strict read-back, and the remaining GRASP blocker is `workpiece_attachment_hash_mismatch`.
|
|
383
|
+
|
|
384
|
+
MoveIt round-trips attached-object rotations through Eigen. Unit quaternions `q` and `-q` represent the same physical rotation, but a raw component hash treats those two equivalent representations as different. v1.8.5 canonicalizes equivalent quaternion signs before workpiece attachment hashing using the same deterministic positive-`w` / first-nonzero-component rule already used by the qualified tool-scene path.
|
|
385
|
+
|
|
386
|
+
Verification remains strict for attachment identity, link, geometry contract, position, and physical rotation. This is not a tolerance-based PASS and does not change target geometry, TCP, collision policy, planner types, motion speeds, controller binding, Twin lineage, site qualification, or real-execution authority. If a hash mismatch remains, DevAgent records expected and observed hashes plus canonical expected/object/primitive/effective attachment poses for target diagnosis.
|
|
387
|
+
|
|
388
|
+
## v1.8.6 canonical semantic workpiece lifecycle
|
|
389
|
+
|
|
390
|
+
A clean v1.8.5 UR5e target-stack run again reached all five industrial preflight groups and executed `approach_pick`, while GRASP still failed with `workpiece_attachment_hash_mismatch`. That target evidence proved raw SHA equality of floating pose representations was too brittle to remain physical PASS authority.
|
|
391
|
+
|
|
392
|
+
v1.8.6 uses MoveIt's canonical existing-object lifecycle. Before GRASP, DevAgent reads back and semantically verifies the exact world workpiece. Attach then sends an ID-only `AttachedCollisionObject.ADD`; MoveIt transfers the already-verified world object's geometry and pose into the AttachedBody on the verified tool link. Release sends an ID-only attached-object REMOVE; MoveIt restores that same AttachedBody to the world at its current global pose.
|
|
393
|
+
|
|
394
|
+
The lifecycle remains fail-closed. Attach requires exact object identity, exact attached link, exact touch-link set, exact geometry kind, dimensions within `1e-9 m`, position error no greater than `0.1 mm`, and orientation error no greater than `1e-4 rad`. Detach similarly verifies restored world identity, geometry, destination frame, position, and orientation. Representation hashes remain recorded for audit diagnostics but do not override the explicit physical-semantic checks.
|
|
395
|
+
|
|
396
|
+
Every lifecycle transition persists a deterministic receipt containing probe stdout/stderr plus expected/observed semantic diagnostics. Any failure includes the receipt path so the next target-stack blocker can be diagnosed directly instead of being collapsed to a generic lifecycle code.
|
|
397
|
+
|
|
398
|
+
This release does not disable collision checking, change the verified tool/workpiece geometry, modify motion targets, planner types or speeds, detach early, grant site qualification, or expand real-execution authority.
|
|
399
|
+
|
|
380
400
|
## Qualified visual-execution scope
|
|
381
401
|
|
|
382
402
|
Measured report-test execution remains intentionally narrow:
|
|
@@ -577,9 +597,9 @@ devagent-physical-ai optional provider-backed engineering front end
|
|
|
577
597
|
|
|
578
598
|
# Project status
|
|
579
599
|
|
|
580
|
-
**v1.8.
|
|
600
|
+
**v1.8.6 — Production/Stable software workflow**
|
|
581
601
|
|
|
582
|
-
v1.8.
|
|
602
|
+
v1.8.6 retains v1.8.5 quaternion canonicalization, v1.8.4 PyPI metadata compliance, v1.8.3 synchronous service-safe attachment, v1.8.2 scoped destination-support place contact, and v1.8.1 direct UR5e controller/action binding. It upgrades the workpiece lifecycle to canonical MoveIt existing-object world↔attached transitions, strict physical-semantic pose/geometry verification, and persistent expected/observed lifecycle diagnostics instead of using floating representation SHA equality as PASS authority.
|
|
583
603
|
|
|
584
604
|
Production-oriented software capabilities include:
|
|
585
605
|
|
|
@@ -594,7 +614,8 @@ exact Requirement → Mapping → Verification Plan → Case provenance
|
|
|
594
614
|
truthful robot support tiers
|
|
595
615
|
qualified UR5e report-test visual execution contract
|
|
596
616
|
direct UR5e controller-manager/action readiness binding
|
|
597
|
-
|
|
617
|
+
canonical MoveIt existing-object workpiece attach/detach
|
|
618
|
+
semantic workpiece pose/geometry verification with persistent diagnostics
|
|
598
619
|
scoped destination-support place contact
|
|
599
620
|
experimental exact ABB IRB1200 Gazebo/MoveIt/RViz preview
|
|
600
621
|
industrial Pilz PTP / LIN planning
|
|
@@ -648,4 +669,4 @@ Original creator: Tom Ha
|
|
|
648
669
|
Original project: https://github.com/tomha85/devagent-physical-engine
|
|
649
670
|
All rights reserved.
|
|
650
671
|
|
|
651
|
-
See repository `LICENSE`, `NOTICE`, and `COPYRIGHT` for complete ownership and usage terms.
|
|
672
|
+
See repository `LICENSE`, `NOTICE`, and `COPYRIGHT` for complete ownership and usage terms.
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "devagent-physical-engine"
|
|
7
|
-
version = "1.8.
|
|
7
|
+
version = "1.8.6"
|
|
8
8
|
description = "Verification-first robotics commissioning runtime with exact-Twin evidence, qualified UR5e Gazebo/MoveIt report execution, truthful robot support tiers, selective verification, replay, regression, and FAT reporting."
|
|
9
9
|
readme = { file = "README.md", content-type = "text/markdown" }
|
|
10
10
|
requires-python = ">=3.11"
|
|
@@ -65,6 +65,7 @@ omit = [
|
|
|
65
65
|
# simulator, move_group, TF, controller actions, or gz services.
|
|
66
66
|
# Pure contracts/reference-workcell logic remains inside the hosted coverage gate.
|
|
67
67
|
"src/devagent_physical_engine/ros2/*_probe.py",
|
|
68
|
+
"src/devagent_physical_engine/ros2/workpiece_scene_probe_v186.py",
|
|
68
69
|
"src/devagent_physical_engine/ros2/qualification*.py",
|
|
69
70
|
"src/devagent_physical_engine/ros2/joint_state_recorder.py",
|
|
70
71
|
"src/devagent_physical_engine/ros2/ur5e_adapter.py",
|
|
@@ -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 =
|
|
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 /
|
|
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("
|
|
127
|
+
helper = Path(__file__).with_name("workpiece_scene_probe_v186.py").resolve()
|
|
98
128
|
result = self.runner.run(
|
|
99
129
|
(
|
|
100
130
|
"python3",
|
|
@@ -107,14 +137,43 @@ class MoveItWorkpieceLifecycleBridge:
|
|
|
107
137
|
),
|
|
108
138
|
timeout_s=self.timeout_s + 10.0,
|
|
109
139
|
)
|
|
140
|
+
probe_receipt_path = payload_path.with_name(payload_path.name + ".receipt.json")
|
|
141
|
+
output: dict[str, object] | None = None
|
|
110
142
|
try:
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
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=
|
|
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(
|
|
238
|
+
raise SimulationPlatformError(
|
|
239
|
+
f"workpiece_lifecycle_failed:{receipt.code}:evidence={probe_receipt_path}"
|
|
240
|
+
)
|
|
150
241
|
return receipt
|
|
151
242
|
|
|
152
243
|
def attach(
|
|
@@ -26,6 +26,24 @@ def _qnorm(q):
|
|
|
26
26
|
return tuple(float(value) / norm for value in q)
|
|
27
27
|
|
|
28
28
|
|
|
29
|
+
def _qcanonical(q):
|
|
30
|
+
"""Canonicalize equivalent q/-q rotations to one deterministic form."""
|
|
31
|
+
|
|
32
|
+
quaternion = _qnorm(q)
|
|
33
|
+
# A quaternion and its negation represent the same physical rotation. MoveIt
|
|
34
|
+
# round-trips poses through Eigen, which may legitimately return the opposite
|
|
35
|
+
# quaternion sign. Hash the rotation, not an arbitrary representation of it.
|
|
36
|
+
# Prefer positive w; for exact 180-degree rotations use the first non-zero xyz
|
|
37
|
+
# component as the deterministic sign discriminator.
|
|
38
|
+
for component in (quaternion[3], quaternion[0], quaternion[1], quaternion[2]):
|
|
39
|
+
if abs(component) <= 1e-15:
|
|
40
|
+
continue
|
|
41
|
+
if component < 0.0:
|
|
42
|
+
quaternion = tuple(-value for value in quaternion)
|
|
43
|
+
break
|
|
44
|
+
return tuple(_canon_float(value) for value in quaternion)
|
|
45
|
+
|
|
46
|
+
|
|
29
47
|
def _qmul(first, second):
|
|
30
48
|
ax, ay, az, aw = first
|
|
31
49
|
bx, by, bz, bw = second
|
|
@@ -69,6 +87,13 @@ def _pose_from_msg(pose):
|
|
|
69
87
|
)
|
|
70
88
|
|
|
71
89
|
|
|
90
|
+
def _pose_payload(position, quaternion) -> dict[str, list[float]]:
|
|
91
|
+
return {
|
|
92
|
+
"position_m": [_canon_float(value) for value in position],
|
|
93
|
+
"quaternion_xyzw": list(_qcanonical(quaternion)),
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
|
|
72
97
|
def _pose_to_msg(position, quaternion, Pose):
|
|
73
98
|
pose = Pose()
|
|
74
99
|
pose.position.x, pose.position.y, pose.position.z = (float(value) for value in position)
|
|
@@ -90,7 +115,7 @@ def _canonical_attachment(
|
|
|
90
115
|
"geometry_kind": str(item["geometry_kind"]),
|
|
91
116
|
"dimensions_m": [_canon_float(value) for value in item["dimensions_m"]],
|
|
92
117
|
"position_m": [_canon_float(value) for value in position],
|
|
93
|
-
"quaternion_xyzw":
|
|
118
|
+
"quaternion_xyzw": list(_qcanonical(quaternion)),
|
|
94
119
|
}
|
|
95
120
|
|
|
96
121
|
|
|
@@ -224,6 +249,7 @@ def transition(path: Path, *, operation: str, timeout_s: float) -> dict[str, Any
|
|
|
224
249
|
scene.is_diff = True
|
|
225
250
|
scene.robot_state.is_diff = True
|
|
226
251
|
attachment_hash = None
|
|
252
|
+
expected_attachment_pose = None
|
|
227
253
|
|
|
228
254
|
if operation == "attach":
|
|
229
255
|
transform = _lookup_transform(
|
|
@@ -279,6 +305,10 @@ def transition(path: Path, *, operation: str, timeout_s: float) -> dict[str, Any
|
|
|
279
305
|
relative_quaternion,
|
|
280
306
|
)
|
|
281
307
|
attachment_hash = _hash(expected_attachment)
|
|
308
|
+
expected_attachment_pose = _pose_payload(
|
|
309
|
+
relative_position,
|
|
310
|
+
relative_quaternion,
|
|
311
|
+
)
|
|
282
312
|
elif operation == "detach":
|
|
283
313
|
attached = AttachedCollisionObject()
|
|
284
314
|
attached.link_name = tool_link
|
|
@@ -361,6 +391,18 @@ def transition(path: Path, *, operation: str, timeout_s: float) -> dict[str, Any
|
|
|
361
391
|
"code": "workpiece_attachment_hash_mismatch",
|
|
362
392
|
"observed_world_present": world_present,
|
|
363
393
|
"observed_attached_link": observed_attached_link,
|
|
394
|
+
"expected_attachment_hash": attachment_hash,
|
|
395
|
+
"observed_attachment_hash": observed_attachment_hash,
|
|
396
|
+
"expected_attachment_pose": expected_attachment_pose,
|
|
397
|
+
"observed_object_pose": _pose_payload(object_position, object_q),
|
|
398
|
+
"observed_primitive_pose": _pose_payload(
|
|
399
|
+
primitive_position,
|
|
400
|
+
primitive_q,
|
|
401
|
+
),
|
|
402
|
+
"observed_attachment_pose": _pose_payload(
|
|
403
|
+
observed_position,
|
|
404
|
+
observed_q,
|
|
405
|
+
),
|
|
364
406
|
}
|
|
365
407
|
return {
|
|
366
408
|
"success": True,
|
|
@@ -370,6 +412,7 @@ def transition(path: Path, *, operation: str, timeout_s: float) -> dict[str, Any
|
|
|
370
412
|
"observed_world_present": False,
|
|
371
413
|
"observed_attached_link": tool_link,
|
|
372
414
|
"attachment_hash": attachment_hash,
|
|
415
|
+
"attachment_pose": expected_attachment_pose,
|
|
373
416
|
}
|
|
374
417
|
|
|
375
418
|
success = world_present and not attached_items
|