devagent-physical-engine 1.8.2__tar.gz → 1.8.4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {devagent_physical_engine-1.8.2/src/devagent_physical_engine.egg-info → devagent_physical_engine-1.8.4}/PKG-INFO +31 -6
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/README.md +30 -5
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/pyproject.toml +2 -2
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/__init__.py +1 -1
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/workpiece_scene_probe.py +93 -30
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4/src/devagent_physical_engine.egg-info}/PKG-INFO +31 -6
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine.egg-info/SOURCES.txt +2 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_industrial_motion_v170.py +2 -2
- devagent_physical_engine-1.8.4/tests/test_package_metadata_v184.py +23 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_transfer_place_diagnostic_v172.py +5 -3
- devagent_physical_engine-1.8.4/tests/test_workpiece_attach_semantics_v183.py +38 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/NOTICE +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/setup.cfg +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/__init__.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/compiler.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/contracts.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/coordinator.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/critic.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/evidence.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/interpreter.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/planner.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/recovery.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/routing.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/runtime.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/semantic.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/agent/structured.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ai_cli.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/cli.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/commercial.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/commercial_campaign.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/commercial_cli.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/commercial_importer.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/commercial_intelligence.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/commercial_readiness.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/commercial_repository.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/continuous_clearance.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/controller_runtime_hotfix_v181.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/doctor.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/engineering_agent.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/engineering_request.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/evidence_replay.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/evidence_trust.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/execution.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/industrial_motion_hotfix_v170.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/industrial_motion_v170.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/industrial_motion_v182.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/models.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/one_command.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/one_command_runtime.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/one_command_v15.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/one_command_v16.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/operating_envelope.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/optimization/__init__.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/optimization/benchmark.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/optimization/candidates.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/optimization/contracts.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/optimization/evaluator.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/optimization/evidence.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/optimization/experience.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/optimization/measured.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/optimization/optimizer.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/optimization/orchestrator.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/physical_campaign.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/physical_evidence.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/physical_motion.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/planning.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/pose_math.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/preexecution_contract.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/production_authority.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/production_grade.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/project.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/provider_adapters/__init__.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/provider_adapters/anthropic.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/provider_adapters/common.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/provider_adapters/factory.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/provider_adapters/gemini.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/provider_adapters/openai.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/provider_criterion.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/provider_qualification.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/providers.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/qualification.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/qualification_cli.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/qualification_harness.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/reference_workcell.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/report_test_execution.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/report_test_execution_strict.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/robot_platform.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/robot_support_v18.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/robots.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/__init__.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/abb_irb1200.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/abb_irb1200_preview.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/acceptance.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/commands.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/continuous_clearance_probe.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/controller_action_probe.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/destination_support_contact_v182.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/doctor.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/fk_pose.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/fk_probe.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/frame_alignment.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/gazebo_cli.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/gazebo_pose.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/gazebo_world.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v170.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v171.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v172.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v182.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/joint_state_probe.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/joint_state_recorder.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/measured_motion.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/moveit_joint_plan_probe.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/moveit_joint_plan_v161_probe.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/moveit_scene.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/moveit_task_planner.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/pilz_sequence_plan_probe.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/pilz_sequence_plan_probe_v182.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/preexecution.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/qualification.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/qualification_v10.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/qualification_v11.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/qualification_v12.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/report_test_visualization.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/report_test_visualization_v170.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/scene_probe.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/state_validity_probe.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/support_contact_acm_probe_v170.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/support_contact_lease_v170.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/support_contact_runner_v161.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/support_contact_v161.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/task_adapter.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/task_visualization.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/tf_probe.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/tool_scene.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/tool_scene_probe.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/trajectory.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/trajectory_action_probe.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/trajectory_tracking.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/ur5e.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/ur5e_adapter.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/ur5e_v10_adapter.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/workpiece_follow.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/workpiece_gazebo_follower.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/ros2/workpiece_scene.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/selective_verification.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/selective_verification_v16.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/setup_profile.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/sim_real_qualification.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/simulation.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/simulation_platform.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/smooth_motion_hotfix_v162.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/support_contact_hotfix_v161.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/tool_collision.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/trajectory_qualification.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/twin.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/twin_builder.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/twin_codec.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/twin_materialization.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/user_cli.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/user_cli_v15.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/user_cli_v16.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/user_cli_v18.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/verification.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine/workpiece_lifecycle.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine.egg-info/dependency_links.txt +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine.egg-info/entry_points.txt +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine.egg-info/requires.txt +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/src/devagent_physical_engine.egg-info/top_level.txt +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_abb_irb1200_visual_v18.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_agent_core.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_agent_semantic_hardening.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_ai_cli.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_ai_cli_v07.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_commercial_importer_v1.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_commercial_intelligence_v15.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_commercial_readiness_v1.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_commercial_v1.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_continuous_clearance_v011.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_controller_runtime_hotfix_v181.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_core.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_destination_support_contact_v182.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_engineering_request_v07.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_evidence_replay_v12.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_evidence_trust_coverage_v12.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_evidence_trust_transport_v12.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_evidence_trust_v12.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_evidence_viewer_palette_v130.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_gazebo_cli_v0122.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_golden_abb_runner_v171.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_golden_abb_showcase.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_interpreter_profiles_v08.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_joint_state_probe_v0125.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_live_provider_qualification.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_measured_motion_v10.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_moveit_planning_diagnostics_v0125.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_moveit_scene_v0123.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_natural_language_agent_v07.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_one_command_hardening_v13.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_one_command_pose_hardening_v15.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_one_command_regression_v141.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_one_command_v13.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_openai_strict_schema_v0113.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_optimization_v05.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_physical_campaign_v09.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_physical_evidence_v09.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_physical_motion_v09.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_planning_fallback_v012.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_pose_math_v0125.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_preexecution_contract_v10.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_production_authority_v11.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_production_grade_coverage_v11.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_production_grade_v11.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_project_spine_v013.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_provider_and_qualification.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_provider_criterion_v15.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_qualification_cli_lifecycle_v06.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_qualification_harness_v06.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_readme_pypi.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_real_provider_adapters.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_reference_workcell_ros_frames_v0125.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_reference_workcell_v012.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_report_test_contract_coverage_v16.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_report_test_lineage_v16.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_report_test_visual_execution_v16.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_robot_platform_v08.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_ros2_production_receipts_v011.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_ros2_simulation.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_ros_trajectory_v09.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_selective_verification_v14.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_setup_profile.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_sim_real_qualification_v011.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_simulation_platform_v08.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_smooth_motion_hotfix_v162.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_support_contact_hotfix_v161.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_tool_collision_v011.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_tool_scene_v0124.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_trajectory_action_probe_v0125.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_trajectory_qualification_v09.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_trajectory_tracking_v0125.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_twin_materialization_v10.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_twin_v08.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_ur5e_adapter_scopes_v09.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_ur5e_v10_adapter_scopes.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_user_cli_interactive_v131.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_user_cli_progress_v131.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_user_cli_report_visual_v16.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_user_cli_selective_v14.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_user_cli_v15.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_user_cli_v15_hotfix_inheritance.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_v052_stabilization.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_v08_catalog_mapping_regression.py +0 -0
- {devagent_physical_engine-1.8.2 → devagent_physical_engine-1.8.4}/tests/test_workpiece_lifecycle_v011.py +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devagent-physical-engine
|
|
3
|
-
Version: 1.8.
|
|
4
|
-
Summary:
|
|
3
|
+
Version: 1.8.4
|
|
4
|
+
Summary: Verification-first robotics commissioning runtime with exact-Twin evidence, qualified UR5e Gazebo/MoveIt report execution, truthful robot support tiers, selective verification, replay, regression, and FAT reporting.
|
|
5
5
|
Author: Tom Ha
|
|
6
6
|
License: All Rights Reserved
|
|
7
7
|
Project-URL: Homepage, https://github.com/tomha85/devagent-physical-engine
|
|
@@ -76,7 +76,7 @@ regression + FAT report + Evidence Viewer
|
|
|
76
76
|
Python 3.11+ is required.
|
|
77
77
|
|
|
78
78
|
```bash
|
|
79
|
-
python -m pip install --upgrade devagent-physical-engine==1.8.
|
|
79
|
+
python -m pip install --upgrade devagent-physical-engine==1.8.4
|
|
80
80
|
```
|
|
81
81
|
|
|
82
82
|
Verify the installed package:
|
|
@@ -88,7 +88,7 @@ python -c "import devagent_physical_engine as d; print(d.__version__)"
|
|
|
88
88
|
Expected:
|
|
89
89
|
|
|
90
90
|
```text
|
|
91
|
-
1.8.
|
|
91
|
+
1.8.4
|
|
92
92
|
```
|
|
93
93
|
|
|
94
94
|
Run the normal customer workflow:
|
|
@@ -394,6 +394,30 @@ The v1.8.2 place receipt records the exact destination support id, workpiece id,
|
|
|
394
394
|
|
|
395
395
|
The release does **not** change real-execution authority, site qualification, target poses, conservative motion scales, or the rule that every motion group must preflight successfully before execution begins.
|
|
396
396
|
|
|
397
|
+
## v1.8.3 synchronous verified workpiece attach
|
|
398
|
+
|
|
399
|
+
A clean v1.8.2 target-stack run proved all five industrial preflight groups and actual `approach_pick` execution, then failed closed at GRASP with `workpiece_lifecycle_failed:apply_planning_scene_rejected`.
|
|
400
|
+
|
|
401
|
+
The attach request previously combined an `AttachedCollisionObject.ADD` with a redundant same-ID world `CollisionObject.REMOVE`. MoveIt applies attached-object state first, which already transitions the same-ID object out of the world. Processing the later redundant world REMOVE can therefore make synchronous `/apply_planning_scene` report failure even though the attachment transition was already attempted.
|
|
402
|
+
|
|
403
|
+
v1.8.3 makes the attach transition service-safe and deterministic: the request contains only the authoritative attached-object ADD. DevAgent then synchronously reads the PlanningScene back and requires all of the following before motion may continue:
|
|
404
|
+
|
|
405
|
+
```text
|
|
406
|
+
workpiece absent from world
|
|
407
|
+
exactly one attached object with the expected id
|
|
408
|
+
attached link == verified tool mount link
|
|
409
|
+
attached primitive geometry is valid
|
|
410
|
+
attachment pose/geometry hash matches the expected attachment hash
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
Detach semantics remain explicit attached-object REMOVE plus world-object ADD at the verified placement pose. No collision rule, tool/workpiece geometry, TCP, touch link, target pose, motion speed, planner, site-qualification boundary, or real-execution authority is relaxed.
|
|
414
|
+
|
|
415
|
+
## v1.8.4 PyPI metadata compliance hotfix
|
|
416
|
+
|
|
417
|
+
v1.8.4 carries the exact v1.8.3 runtime semantics and shortens only the package Core Metadata `Summary` so it satisfies PyPI's 512-character limit. A regression test now parses `pyproject.toml` and rejects an empty or over-limit project description before release.
|
|
418
|
+
|
|
419
|
+
This metadata hotfix does not change the UR5e attach/detach lifecycle, collision policy, motion planning, Twin lineage, site-qualification boundary, or real-execution authority.
|
|
420
|
+
|
|
397
421
|
## Qualified visual-execution scope
|
|
398
422
|
|
|
399
423
|
Measured report-test execution remains intentionally narrow:
|
|
@@ -594,9 +618,9 @@ devagent-physical-ai optional provider-backed engineering front end
|
|
|
594
618
|
|
|
595
619
|
# Project status
|
|
596
620
|
|
|
597
|
-
**v1.8.
|
|
621
|
+
**v1.8.4 — Production/Stable software workflow**
|
|
598
622
|
|
|
599
|
-
v1.8.
|
|
623
|
+
v1.8.4 retains the v1.8.3 synchronous verified workpiece-attach fix, the v1.8.2 scoped destination-support place contract, v1.8.1 direct UR5e controller/action binding, truthful robot support tiers, and ABB IRB1200 experimental visual runtime. The only v1.8.4 behavior change is packaging metadata compliance for PyPI; physical runtime semantics are unchanged from v1.8.3.
|
|
600
624
|
|
|
601
625
|
Production-oriented software capabilities include:
|
|
602
626
|
|
|
@@ -611,6 +635,7 @@ exact Requirement → Mapping → Verification Plan → Case provenance
|
|
|
611
635
|
truthful robot support tiers
|
|
612
636
|
qualified UR5e report-test visual execution contract
|
|
613
637
|
direct UR5e controller-manager/action readiness binding
|
|
638
|
+
synchronous verified workpiece attach/detach lifecycle
|
|
614
639
|
scoped destination-support place contact
|
|
615
640
|
experimental exact ABB IRB1200 Gazebo/MoveIt/RViz preview
|
|
616
641
|
industrial Pilz PTP / LIN planning
|
|
@@ -35,7 +35,7 @@ regression + FAT report + Evidence Viewer
|
|
|
35
35
|
Python 3.11+ is required.
|
|
36
36
|
|
|
37
37
|
```bash
|
|
38
|
-
python -m pip install --upgrade devagent-physical-engine==1.8.
|
|
38
|
+
python -m pip install --upgrade devagent-physical-engine==1.8.4
|
|
39
39
|
```
|
|
40
40
|
|
|
41
41
|
Verify the installed package:
|
|
@@ -47,7 +47,7 @@ python -c "import devagent_physical_engine as d; print(d.__version__)"
|
|
|
47
47
|
Expected:
|
|
48
48
|
|
|
49
49
|
```text
|
|
50
|
-
1.8.
|
|
50
|
+
1.8.4
|
|
51
51
|
```
|
|
52
52
|
|
|
53
53
|
Run the normal customer workflow:
|
|
@@ -353,6 +353,30 @@ The v1.8.2 place receipt records the exact destination support id, workpiece id,
|
|
|
353
353
|
|
|
354
354
|
The release does **not** change real-execution authority, site qualification, target poses, conservative motion scales, or the rule that every motion group must preflight successfully before execution begins.
|
|
355
355
|
|
|
356
|
+
## v1.8.3 synchronous verified workpiece attach
|
|
357
|
+
|
|
358
|
+
A clean v1.8.2 target-stack run proved all five industrial preflight groups and actual `approach_pick` execution, then failed closed at GRASP with `workpiece_lifecycle_failed:apply_planning_scene_rejected`.
|
|
359
|
+
|
|
360
|
+
The attach request previously combined an `AttachedCollisionObject.ADD` with a redundant same-ID world `CollisionObject.REMOVE`. MoveIt applies attached-object state first, which already transitions the same-ID object out of the world. Processing the later redundant world REMOVE can therefore make synchronous `/apply_planning_scene` report failure even though the attachment transition was already attempted.
|
|
361
|
+
|
|
362
|
+
v1.8.3 makes the attach transition service-safe and deterministic: the request contains only the authoritative attached-object ADD. DevAgent then synchronously reads the PlanningScene back and requires all of the following before motion may continue:
|
|
363
|
+
|
|
364
|
+
```text
|
|
365
|
+
workpiece absent from world
|
|
366
|
+
exactly one attached object with the expected id
|
|
367
|
+
attached link == verified tool mount link
|
|
368
|
+
attached primitive geometry is valid
|
|
369
|
+
attachment pose/geometry hash matches the expected attachment hash
|
|
370
|
+
```
|
|
371
|
+
|
|
372
|
+
Detach semantics remain explicit attached-object REMOVE plus world-object ADD at the verified placement pose. No collision rule, tool/workpiece geometry, TCP, touch link, target pose, motion speed, planner, site-qualification boundary, or real-execution authority is relaxed.
|
|
373
|
+
|
|
374
|
+
## v1.8.4 PyPI metadata compliance hotfix
|
|
375
|
+
|
|
376
|
+
v1.8.4 carries the exact v1.8.3 runtime semantics and shortens only the package Core Metadata `Summary` so it satisfies PyPI's 512-character limit. A regression test now parses `pyproject.toml` and rejects an empty or over-limit project description before release.
|
|
377
|
+
|
|
378
|
+
This metadata hotfix does not change the UR5e attach/detach lifecycle, collision policy, motion planning, Twin lineage, site-qualification boundary, or real-execution authority.
|
|
379
|
+
|
|
356
380
|
## Qualified visual-execution scope
|
|
357
381
|
|
|
358
382
|
Measured report-test execution remains intentionally narrow:
|
|
@@ -553,9 +577,9 @@ devagent-physical-ai optional provider-backed engineering front end
|
|
|
553
577
|
|
|
554
578
|
# Project status
|
|
555
579
|
|
|
556
|
-
**v1.8.
|
|
580
|
+
**v1.8.4 — Production/Stable software workflow**
|
|
557
581
|
|
|
558
|
-
v1.8.
|
|
582
|
+
v1.8.4 retains the v1.8.3 synchronous verified workpiece-attach fix, the v1.8.2 scoped destination-support place contract, v1.8.1 direct UR5e controller/action binding, truthful robot support tiers, and ABB IRB1200 experimental visual runtime. The only v1.8.4 behavior change is packaging metadata compliance for PyPI; physical runtime semantics are unchanged from v1.8.3.
|
|
559
583
|
|
|
560
584
|
Production-oriented software capabilities include:
|
|
561
585
|
|
|
@@ -570,6 +594,7 @@ exact Requirement → Mapping → Verification Plan → Case provenance
|
|
|
570
594
|
truthful robot support tiers
|
|
571
595
|
qualified UR5e report-test visual execution contract
|
|
572
596
|
direct UR5e controller-manager/action readiness binding
|
|
597
|
+
synchronous verified workpiece attach/detach lifecycle
|
|
573
598
|
scoped destination-support place contact
|
|
574
599
|
experimental exact ABB IRB1200 Gazebo/MoveIt/RViz preview
|
|
575
600
|
industrial Pilz PTP / LIN planning
|
|
@@ -623,4 +648,4 @@ Original creator: Tom Ha
|
|
|
623
648
|
Original project: https://github.com/tomha85/devagent-physical-engine
|
|
624
649
|
All rights reserved.
|
|
625
650
|
|
|
626
|
-
See repository `LICENSE`, `NOTICE`, and `COPYRIGHT` for complete ownership and usage terms.
|
|
651
|
+
See repository `LICENSE`, `NOTICE`, and `COPYRIGHT` for complete ownership and usage terms.
|
|
@@ -4,8 +4,8 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "devagent-physical-engine"
|
|
7
|
-
version = "1.8.
|
|
8
|
-
description = "
|
|
7
|
+
version = "1.8.4"
|
|
8
|
+
description = "Verification-first robotics commissioning runtime with exact-Twin evidence, qualified UR5e Gazebo/MoveIt report execution, truthful robot support tiers, selective verification, replay, regression, and FAT reporting."
|
|
9
9
|
readme = { file = "README.md", content-type = "text/markdown" }
|
|
10
10
|
requires-python = ">=3.11"
|
|
11
11
|
dependencies = ["PyYAML>=6.0,<7"]
|
|
@@ -60,7 +60,12 @@ def _compose(first_position, first_q, second_position, second_q):
|
|
|
60
60
|
def _pose_from_msg(pose):
|
|
61
61
|
return (
|
|
62
62
|
(float(pose.position.x), float(pose.position.y), float(pose.position.z)),
|
|
63
|
-
(
|
|
63
|
+
(
|
|
64
|
+
float(pose.orientation.x),
|
|
65
|
+
float(pose.orientation.y),
|
|
66
|
+
float(pose.orientation.z),
|
|
67
|
+
float(pose.orientation.w),
|
|
68
|
+
),
|
|
64
69
|
)
|
|
65
70
|
|
|
66
71
|
|
|
@@ -73,7 +78,12 @@ def _pose_to_msg(position, quaternion, Pose):
|
|
|
73
78
|
return pose
|
|
74
79
|
|
|
75
80
|
|
|
76
|
-
def _canonical_attachment(
|
|
81
|
+
def _canonical_attachment(
|
|
82
|
+
link_name: str,
|
|
83
|
+
item: dict[str, Any],
|
|
84
|
+
position,
|
|
85
|
+
quaternion,
|
|
86
|
+
) -> dict[str, Any]:
|
|
77
87
|
return {
|
|
78
88
|
"link_name": link_name,
|
|
79
89
|
"id": str(item["id"]),
|
|
@@ -99,7 +109,17 @@ def _primitive(item, SolidPrimitive):
|
|
|
99
109
|
return primitive
|
|
100
110
|
|
|
101
111
|
|
|
102
|
-
def _collision_object(
|
|
112
|
+
def _collision_object(
|
|
113
|
+
item,
|
|
114
|
+
frame_id: str,
|
|
115
|
+
position,
|
|
116
|
+
quaternion,
|
|
117
|
+
*,
|
|
118
|
+
operation: int,
|
|
119
|
+
CollisionObject,
|
|
120
|
+
Pose,
|
|
121
|
+
SolidPrimitive,
|
|
122
|
+
):
|
|
103
123
|
collision = CollisionObject()
|
|
104
124
|
collision.header.frame_id = frame_id
|
|
105
125
|
collision.id = str(item["id"])
|
|
@@ -116,11 +136,19 @@ def _collision_object(item, frame_id: str, position, quaternion, *, operation: i
|
|
|
116
136
|
|
|
117
137
|
def _wait_future(node, future, timeout_s: float) -> bool:
|
|
118
138
|
import rclpy
|
|
139
|
+
|
|
119
140
|
rclpy.spin_until_future_complete(node, future, timeout_sec=timeout_s)
|
|
120
141
|
return future.done()
|
|
121
142
|
|
|
122
143
|
|
|
123
|
-
def _lookup_transform(
|
|
144
|
+
def _lookup_transform(
|
|
145
|
+
node,
|
|
146
|
+
buffer,
|
|
147
|
+
*,
|
|
148
|
+
target_frame: str,
|
|
149
|
+
source_frame: str,
|
|
150
|
+
timeout_s: float,
|
|
151
|
+
):
|
|
124
152
|
import rclpy
|
|
125
153
|
from rclpy.time import Time
|
|
126
154
|
|
|
@@ -148,9 +176,12 @@ def _read_state(get_client, node, timeout_s: float, workpiece_id: str):
|
|
|
148
176
|
response = future.result()
|
|
149
177
|
if response is None:
|
|
150
178
|
raise RuntimeError("get_planning_scene_empty")
|
|
151
|
-
world_present = any(
|
|
179
|
+
world_present = any(
|
|
180
|
+
item.id == workpiece_id for item in response.scene.world.collision_objects
|
|
181
|
+
)
|
|
152
182
|
attached = [
|
|
153
|
-
item
|
|
183
|
+
item
|
|
184
|
+
for item in response.scene.robot_state.attached_collision_objects
|
|
154
185
|
if item.object.id == workpiece_id
|
|
155
186
|
]
|
|
156
187
|
return world_present, attached
|
|
@@ -186,7 +217,9 @@ def transition(path: Path, *, operation: str, timeout_s: float) -> dict[str, Any
|
|
|
186
217
|
|
|
187
218
|
pose_data = item["pose"]
|
|
188
219
|
world_position = tuple(float(value) for value in pose_data["position_m"])
|
|
189
|
-
world_quaternion = tuple(
|
|
220
|
+
world_quaternion = tuple(
|
|
221
|
+
float(value) for value in pose_data["quaternion_xyzw"]
|
|
222
|
+
)
|
|
190
223
|
scene = PlanningScene()
|
|
191
224
|
scene.is_diff = True
|
|
192
225
|
scene.robot_state.is_diff = True
|
|
@@ -217,18 +250,14 @@ def transition(path: Path, *, operation: str, timeout_s: float) -> dict[str, Any
|
|
|
217
250
|
world_position,
|
|
218
251
|
world_quaternion,
|
|
219
252
|
)
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
Pose=Pose,
|
|
229
|
-
SolidPrimitive=SolidPrimitive,
|
|
230
|
-
)
|
|
231
|
-
)
|
|
253
|
+
|
|
254
|
+
# MoveIt applies robot_state.attached_collision_objects before processing
|
|
255
|
+
# world.collision_objects in a PlanningScene diff. Adding the attached body
|
|
256
|
+
# automatically removes an existing same-ID world object. Sending a second
|
|
257
|
+
# explicit world REMOVE therefore makes synchronous ApplyPlanningScene
|
|
258
|
+
# report failure because that later REMOVE targets an object that no longer
|
|
259
|
+
# exists. Keep ATTACH as one authoritative attached-object ADD and verify the
|
|
260
|
+
# resulting world/attached state by synchronous read-back below.
|
|
232
261
|
attached = AttachedCollisionObject()
|
|
233
262
|
attached.link_name = tool_link
|
|
234
263
|
attached.touch_links = touch_links
|
|
@@ -244,7 +273,10 @@ def transition(path: Path, *, operation: str, timeout_s: float) -> dict[str, Any
|
|
|
244
273
|
)
|
|
245
274
|
scene.robot_state.attached_collision_objects.append(attached)
|
|
246
275
|
expected_attachment = _canonical_attachment(
|
|
247
|
-
tool_link,
|
|
276
|
+
tool_link,
|
|
277
|
+
item,
|
|
278
|
+
relative_position,
|
|
279
|
+
relative_quaternion,
|
|
248
280
|
)
|
|
249
281
|
attachment_hash = _hash(expected_attachment)
|
|
250
282
|
elif operation == "detach":
|
|
@@ -278,12 +310,21 @@ def transition(path: Path, *, operation: str, timeout_s: float) -> dict[str, Any
|
|
|
278
310
|
return {"success": False, "code": "apply_planning_scene_rejected"}
|
|
279
311
|
|
|
280
312
|
world_present, attached_items = _read_state(
|
|
281
|
-
get_client,
|
|
313
|
+
get_client,
|
|
314
|
+
node,
|
|
315
|
+
timeout_s,
|
|
316
|
+
str(item["id"]),
|
|
317
|
+
)
|
|
318
|
+
observed_attached_link = (
|
|
319
|
+
attached_items[0].link_name if len(attached_items) == 1 else None
|
|
282
320
|
)
|
|
283
|
-
observed_attached_link = attached_items[0].link_name if len(attached_items) == 1 else None
|
|
284
321
|
|
|
285
322
|
if operation == "attach":
|
|
286
|
-
if
|
|
323
|
+
if (
|
|
324
|
+
world_present
|
|
325
|
+
or len(attached_items) != 1
|
|
326
|
+
or observed_attached_link != tool_link
|
|
327
|
+
):
|
|
287
328
|
return {
|
|
288
329
|
"success": False,
|
|
289
330
|
"code": "workpiece_attach_readback_mismatch",
|
|
@@ -291,15 +332,28 @@ def transition(path: Path, *, operation: str, timeout_s: float) -> dict[str, Any
|
|
|
291
332
|
"observed_attached_link": observed_attached_link,
|
|
292
333
|
}
|
|
293
334
|
observed_object = attached_items[0].object
|
|
294
|
-
if
|
|
335
|
+
if (
|
|
336
|
+
len(observed_object.primitives) != 1
|
|
337
|
+
or len(observed_object.primitive_poses) != 1
|
|
338
|
+
):
|
|
295
339
|
return {"success": False, "code": "workpiece_attached_shape_invalid"}
|
|
296
340
|
object_position, object_q = _pose_from_msg(observed_object.pose)
|
|
297
|
-
primitive_position, primitive_q = _pose_from_msg(
|
|
341
|
+
primitive_position, primitive_q = _pose_from_msg(
|
|
342
|
+
observed_object.primitive_poses[0]
|
|
343
|
+
)
|
|
298
344
|
observed_position, observed_q = _compose(
|
|
299
|
-
object_position,
|
|
345
|
+
object_position,
|
|
346
|
+
object_q,
|
|
347
|
+
primitive_position,
|
|
348
|
+
primitive_q,
|
|
300
349
|
)
|
|
301
350
|
observed_attachment_hash = _hash(
|
|
302
|
-
_canonical_attachment(
|
|
351
|
+
_canonical_attachment(
|
|
352
|
+
tool_link,
|
|
353
|
+
item,
|
|
354
|
+
observed_position,
|
|
355
|
+
observed_q,
|
|
356
|
+
)
|
|
303
357
|
)
|
|
304
358
|
if observed_attachment_hash != attachment_hash:
|
|
305
359
|
return {
|
|
@@ -321,11 +375,17 @@ def transition(path: Path, *, operation: str, timeout_s: float) -> dict[str, Any
|
|
|
321
375
|
success = world_present and not attached_items
|
|
322
376
|
return {
|
|
323
377
|
"success": success,
|
|
324
|
-
"code":
|
|
378
|
+
"code": (
|
|
379
|
+
"workpiece_detach_verified"
|
|
380
|
+
if success
|
|
381
|
+
else "workpiece_detach_readback_mismatch"
|
|
382
|
+
),
|
|
325
383
|
"materialization_hash": materialization_hash,
|
|
326
384
|
"twin_hash": twin_hash,
|
|
327
385
|
"observed_world_present": world_present,
|
|
328
|
-
"observed_attached_link":
|
|
386
|
+
"observed_attached_link": (
|
|
387
|
+
None if not attached_items else observed_attached_link
|
|
388
|
+
),
|
|
329
389
|
}
|
|
330
390
|
finally:
|
|
331
391
|
del listener
|
|
@@ -346,7 +406,10 @@ def main() -> int:
|
|
|
346
406
|
timeout_s=float(args.timeout),
|
|
347
407
|
)
|
|
348
408
|
except Exception as exc:
|
|
349
|
-
result = {
|
|
409
|
+
result = {
|
|
410
|
+
"success": False,
|
|
411
|
+
"code": f"workpiece_scene_probe_error:{type(exc).__name__}",
|
|
412
|
+
}
|
|
350
413
|
print(json.dumps(result, sort_keys=True))
|
|
351
414
|
return 0 if result.get("success") else 2
|
|
352
415
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devagent-physical-engine
|
|
3
|
-
Version: 1.8.
|
|
4
|
-
Summary:
|
|
3
|
+
Version: 1.8.4
|
|
4
|
+
Summary: Verification-first robotics commissioning runtime with exact-Twin evidence, qualified UR5e Gazebo/MoveIt report execution, truthful robot support tiers, selective verification, replay, regression, and FAT reporting.
|
|
5
5
|
Author: Tom Ha
|
|
6
6
|
License: All Rights Reserved
|
|
7
7
|
Project-URL: Homepage, https://github.com/tomha85/devagent-physical-engine
|
|
@@ -76,7 +76,7 @@ regression + FAT report + Evidence Viewer
|
|
|
76
76
|
Python 3.11+ is required.
|
|
77
77
|
|
|
78
78
|
```bash
|
|
79
|
-
python -m pip install --upgrade devagent-physical-engine==1.8.
|
|
79
|
+
python -m pip install --upgrade devagent-physical-engine==1.8.4
|
|
80
80
|
```
|
|
81
81
|
|
|
82
82
|
Verify the installed package:
|
|
@@ -88,7 +88,7 @@ python -c "import devagent_physical_engine as d; print(d.__version__)"
|
|
|
88
88
|
Expected:
|
|
89
89
|
|
|
90
90
|
```text
|
|
91
|
-
1.8.
|
|
91
|
+
1.8.4
|
|
92
92
|
```
|
|
93
93
|
|
|
94
94
|
Run the normal customer workflow:
|
|
@@ -394,6 +394,30 @@ The v1.8.2 place receipt records the exact destination support id, workpiece id,
|
|
|
394
394
|
|
|
395
395
|
The release does **not** change real-execution authority, site qualification, target poses, conservative motion scales, or the rule that every motion group must preflight successfully before execution begins.
|
|
396
396
|
|
|
397
|
+
## v1.8.3 synchronous verified workpiece attach
|
|
398
|
+
|
|
399
|
+
A clean v1.8.2 target-stack run proved all five industrial preflight groups and actual `approach_pick` execution, then failed closed at GRASP with `workpiece_lifecycle_failed:apply_planning_scene_rejected`.
|
|
400
|
+
|
|
401
|
+
The attach request previously combined an `AttachedCollisionObject.ADD` with a redundant same-ID world `CollisionObject.REMOVE`. MoveIt applies attached-object state first, which already transitions the same-ID object out of the world. Processing the later redundant world REMOVE can therefore make synchronous `/apply_planning_scene` report failure even though the attachment transition was already attempted.
|
|
402
|
+
|
|
403
|
+
v1.8.3 makes the attach transition service-safe and deterministic: the request contains only the authoritative attached-object ADD. DevAgent then synchronously reads the PlanningScene back and requires all of the following before motion may continue:
|
|
404
|
+
|
|
405
|
+
```text
|
|
406
|
+
workpiece absent from world
|
|
407
|
+
exactly one attached object with the expected id
|
|
408
|
+
attached link == verified tool mount link
|
|
409
|
+
attached primitive geometry is valid
|
|
410
|
+
attachment pose/geometry hash matches the expected attachment hash
|
|
411
|
+
```
|
|
412
|
+
|
|
413
|
+
Detach semantics remain explicit attached-object REMOVE plus world-object ADD at the verified placement pose. No collision rule, tool/workpiece geometry, TCP, touch link, target pose, motion speed, planner, site-qualification boundary, or real-execution authority is relaxed.
|
|
414
|
+
|
|
415
|
+
## v1.8.4 PyPI metadata compliance hotfix
|
|
416
|
+
|
|
417
|
+
v1.8.4 carries the exact v1.8.3 runtime semantics and shortens only the package Core Metadata `Summary` so it satisfies PyPI's 512-character limit. A regression test now parses `pyproject.toml` and rejects an empty or over-limit project description before release.
|
|
418
|
+
|
|
419
|
+
This metadata hotfix does not change the UR5e attach/detach lifecycle, collision policy, motion planning, Twin lineage, site-qualification boundary, or real-execution authority.
|
|
420
|
+
|
|
397
421
|
## Qualified visual-execution scope
|
|
398
422
|
|
|
399
423
|
Measured report-test execution remains intentionally narrow:
|
|
@@ -594,9 +618,9 @@ devagent-physical-ai optional provider-backed engineering front end
|
|
|
594
618
|
|
|
595
619
|
# Project status
|
|
596
620
|
|
|
597
|
-
**v1.8.
|
|
621
|
+
**v1.8.4 — Production/Stable software workflow**
|
|
598
622
|
|
|
599
|
-
v1.8.
|
|
623
|
+
v1.8.4 retains the v1.8.3 synchronous verified workpiece-attach fix, the v1.8.2 scoped destination-support place contract, v1.8.1 direct UR5e controller/action binding, truthful robot support tiers, and ABB IRB1200 experimental visual runtime. The only v1.8.4 behavior change is packaging metadata compliance for PyPI; physical runtime semantics are unchanged from v1.8.3.
|
|
600
624
|
|
|
601
625
|
Production-oriented software capabilities include:
|
|
602
626
|
|
|
@@ -611,6 +635,7 @@ exact Requirement → Mapping → Verification Plan → Case provenance
|
|
|
611
635
|
truthful robot support tiers
|
|
612
636
|
qualified UR5e report-test visual execution contract
|
|
613
637
|
direct UR5e controller-manager/action readiness binding
|
|
638
|
+
synchronous verified workpiece attach/detach lifecycle
|
|
614
639
|
scoped destination-support place contact
|
|
615
640
|
experimental exact ABB IRB1200 Gazebo/MoveIt/RViz preview
|
|
616
641
|
industrial Pilz PTP / LIN planning
|
|
@@ -196,6 +196,7 @@ tests/test_one_command_regression_v141.py
|
|
|
196
196
|
tests/test_one_command_v13.py
|
|
197
197
|
tests/test_openai_strict_schema_v0113.py
|
|
198
198
|
tests/test_optimization_v05.py
|
|
199
|
+
tests/test_package_metadata_v184.py
|
|
199
200
|
tests/test_physical_campaign_v09.py
|
|
200
201
|
tests/test_physical_evidence_v09.py
|
|
201
202
|
tests/test_physical_motion_v09.py
|
|
@@ -245,4 +246,5 @@ tests/test_user_cli_v15.py
|
|
|
245
246
|
tests/test_user_cli_v15_hotfix_inheritance.py
|
|
246
247
|
tests/test_v052_stabilization.py
|
|
247
248
|
tests/test_v08_catalog_mapping_regression.py
|
|
249
|
+
tests/test_workpiece_attach_semantics_v183.py
|
|
248
250
|
tests/test_workpiece_lifecycle_v011.py
|
|
@@ -34,8 +34,8 @@ from devagent_physical_engine.ros2.report_test_visualization_v170 import (
|
|
|
34
34
|
|
|
35
35
|
|
|
36
36
|
class IndustrialMotionV170Tests(unittest.TestCase):
|
|
37
|
-
def
|
|
38
|
-
self.assertEqual(package.__version__, "1.8.
|
|
37
|
+
def test_release_version_is_v184(self) -> None:
|
|
38
|
+
self.assertEqual(package.__version__, "1.8.4")
|
|
39
39
|
|
|
40
40
|
def test_reference_groups_cover_every_task_phase_once_in_order(self) -> None:
|
|
41
41
|
groups = reference_industrial_groups()
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from pathlib import Path
|
|
4
|
+
import tomllib
|
|
5
|
+
import unittest
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class PackageMetadataV184Tests(unittest.TestCase):
|
|
9
|
+
def test_pypi_summary_respects_core_metadata_limit(self) -> None:
|
|
10
|
+
root = Path(__file__).resolve().parents[1]
|
|
11
|
+
metadata = tomllib.loads((root / "pyproject.toml").read_text(encoding="utf-8"))
|
|
12
|
+
summary = str(metadata["project"]["description"])
|
|
13
|
+
self.assertTrue(summary.strip())
|
|
14
|
+
self.assertLessEqual(len(summary), 512)
|
|
15
|
+
|
|
16
|
+
def test_package_version_is_v184(self) -> None:
|
|
17
|
+
root = Path(__file__).resolve().parents[1]
|
|
18
|
+
metadata = tomllib.loads((root / "pyproject.toml").read_text(encoding="utf-8"))
|
|
19
|
+
self.assertEqual(metadata["project"]["version"], "1.8.4")
|
|
20
|
+
|
|
21
|
+
|
|
22
|
+
if __name__ == "__main__":
|
|
23
|
+
unittest.main()
|
|
@@ -153,9 +153,11 @@ class TransferPlaceDiagnosticV172Tests(unittest.TestCase):
|
|
|
153
153
|
self.assertTrue(payload["plan_only"])
|
|
154
154
|
self.assertEqual(payload["result_code"], "pilz_place_segment_planning_failed")
|
|
155
155
|
|
|
156
|
-
def
|
|
157
|
-
self.assertEqual(package.__version__, "1.8.
|
|
158
|
-
self.assertTrue(
|
|
156
|
+
def test_v184_release_preserves_v172_diagnostics_and_v182_planner(self) -> None:
|
|
157
|
+
self.assertEqual(package.__version__, "1.8.4")
|
|
158
|
+
self.assertTrue(
|
|
159
|
+
issubclass(PilzIndustrialSequencePlannerV182, PilzIndustrialSequencePlannerV172)
|
|
160
|
+
)
|
|
159
161
|
self.assertIs(
|
|
160
162
|
visual_v170.PilzIndustrialSequencePlannerV170,
|
|
161
163
|
PilzIndustrialSequencePlannerV182,
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import inspect
|
|
4
|
+
import unittest
|
|
5
|
+
|
|
6
|
+
from devagent_physical_engine.ros2 import workpiece_scene_probe
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class WorkpieceAttachSemanticsV183Tests(unittest.TestCase):
|
|
10
|
+
def test_attach_diff_does_not_send_redundant_world_remove(self):
|
|
11
|
+
source = inspect.getsource(workpiece_scene_probe.transition)
|
|
12
|
+
attach_block = source.split('if operation == "attach":', 1)[1].split(
|
|
13
|
+
'elif operation == "detach":', 1
|
|
14
|
+
)[0]
|
|
15
|
+
|
|
16
|
+
self.assertIn(
|
|
17
|
+
"scene.robot_state.attached_collision_objects.append(attached)",
|
|
18
|
+
attach_block,
|
|
19
|
+
)
|
|
20
|
+
self.assertNotIn("scene.world.collision_objects.append", attach_block)
|
|
21
|
+
self.assertNotIn("operation=CollisionObject.REMOVE", attach_block)
|
|
22
|
+
|
|
23
|
+
def test_detach_still_restores_world_object_at_explicit_pose(self):
|
|
24
|
+
source = inspect.getsource(workpiece_scene_probe.transition)
|
|
25
|
+
detach_block = source.split('elif operation == "detach":', 1)[1].split(
|
|
26
|
+
'else:', 1
|
|
27
|
+
)[0]
|
|
28
|
+
|
|
29
|
+
self.assertIn(
|
|
30
|
+
"scene.robot_state.attached_collision_objects.append(attached)",
|
|
31
|
+
detach_block,
|
|
32
|
+
)
|
|
33
|
+
self.assertIn("scene.world.collision_objects.append", detach_block)
|
|
34
|
+
self.assertIn("operation=CollisionObject.ADD", detach_block)
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
if __name__ == "__main__":
|
|
38
|
+
unittest.main()
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|