devagent-physical-engine 1.8.0__tar.gz → 1.8.1__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.0/src/devagent_physical_engine.egg-info → devagent_physical_engine-1.8.1}/PKG-INFO +15 -6
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/README.md +14 -5
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/pyproject.toml +2 -2
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/__init__.py +3 -1
- devagent_physical_engine-1.8.1/src/devagent_physical_engine/controller_runtime_hotfix_v181.py +93 -0
- devagent_physical_engine-1.8.1/src/devagent_physical_engine/ros2/controller_action_probe.py +165 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1/src/devagent_physical_engine.egg-info}/PKG-INFO +15 -6
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine.egg-info/SOURCES.txt +3 -0
- devagent_physical_engine-1.8.1/tests/test_controller_runtime_hotfix_v181.py +194 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_industrial_motion_v170.py +2 -2
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_ros_trajectory_v09.py +82 -43
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_transfer_place_diagnostic_v172.py +1 -1
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/NOTICE +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/setup.cfg +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/__init__.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/compiler.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/contracts.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/coordinator.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/critic.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/evidence.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/interpreter.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/planner.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/recovery.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/routing.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/runtime.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/semantic.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/agent/structured.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ai_cli.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/cli.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/commercial.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/commercial_campaign.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/commercial_cli.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/commercial_importer.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/commercial_intelligence.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/commercial_readiness.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/commercial_repository.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/continuous_clearance.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/doctor.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/engineering_agent.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/engineering_request.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/evidence_replay.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/evidence_trust.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/execution.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/industrial_motion_hotfix_v170.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/industrial_motion_v170.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/models.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/one_command.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/one_command_runtime.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/one_command_v15.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/one_command_v16.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/operating_envelope.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/optimization/__init__.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/optimization/benchmark.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/optimization/candidates.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/optimization/contracts.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/optimization/evaluator.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/optimization/evidence.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/optimization/experience.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/optimization/measured.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/optimization/optimizer.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/optimization/orchestrator.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/physical_campaign.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/physical_evidence.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/physical_motion.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/planning.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/pose_math.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/preexecution_contract.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/production_authority.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/production_grade.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/project.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/provider_adapters/__init__.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/provider_adapters/anthropic.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/provider_adapters/common.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/provider_adapters/factory.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/provider_adapters/gemini.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/provider_adapters/openai.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/provider_criterion.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/provider_qualification.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/providers.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/qualification.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/qualification_cli.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/qualification_harness.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/reference_workcell.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/report_test_execution.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/report_test_execution_strict.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/robot_platform.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/robot_support_v18.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/robots.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/__init__.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/abb_irb1200.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/abb_irb1200_preview.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/acceptance.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/commands.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/continuous_clearance_probe.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/doctor.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/fk_pose.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/fk_probe.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/frame_alignment.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/gazebo_cli.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/gazebo_pose.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/gazebo_world.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v170.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v171.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v172.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/joint_state_probe.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/joint_state_recorder.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/measured_motion.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/moveit_joint_plan_probe.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/moveit_joint_plan_v161_probe.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/moveit_scene.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/moveit_task_planner.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/pilz_sequence_plan_probe.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/preexecution.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/qualification.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/qualification_v10.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/qualification_v11.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/qualification_v12.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/report_test_visualization.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/report_test_visualization_v170.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/scene_probe.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/state_validity_probe.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/support_contact_acm_probe_v170.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/support_contact_lease_v170.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/support_contact_runner_v161.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/support_contact_v161.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/task_adapter.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/task_visualization.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/tf_probe.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/tool_scene.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/tool_scene_probe.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/trajectory.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/trajectory_action_probe.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/trajectory_tracking.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/ur5e.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/ur5e_adapter.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/ur5e_v10_adapter.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/workpiece_follow.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/workpiece_gazebo_follower.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/workpiece_scene.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/ros2/workpiece_scene_probe.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/selective_verification.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/selective_verification_v16.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/setup_profile.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/sim_real_qualification.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/simulation.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/simulation_platform.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/smooth_motion_hotfix_v162.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/support_contact_hotfix_v161.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/tool_collision.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/trajectory_qualification.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/twin.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/twin_builder.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/twin_codec.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/twin_materialization.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/user_cli.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/user_cli_v15.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/user_cli_v16.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/user_cli_v18.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/verification.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine/workpiece_lifecycle.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine.egg-info/dependency_links.txt +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine.egg-info/entry_points.txt +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine.egg-info/requires.txt +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/src/devagent_physical_engine.egg-info/top_level.txt +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_abb_irb1200_visual_v18.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_agent_core.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_agent_semantic_hardening.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_ai_cli.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_ai_cli_v07.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_commercial_importer_v1.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_commercial_intelligence_v15.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_commercial_readiness_v1.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_commercial_v1.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_continuous_clearance_v011.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_core.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_engineering_request_v07.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_evidence_replay_v12.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_evidence_trust_coverage_v12.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_evidence_trust_transport_v12.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_evidence_trust_v12.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_evidence_viewer_palette_v130.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_gazebo_cli_v0122.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_golden_abb_runner_v171.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_golden_abb_showcase.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_interpreter_profiles_v08.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_joint_state_probe_v0125.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_live_provider_qualification.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_measured_motion_v10.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_moveit_planning_diagnostics_v0125.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_moveit_scene_v0123.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_natural_language_agent_v07.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_one_command_hardening_v13.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_one_command_pose_hardening_v15.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_one_command_regression_v141.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_one_command_v13.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_openai_strict_schema_v0113.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_optimization_v05.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_physical_campaign_v09.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_physical_evidence_v09.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_physical_motion_v09.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_planning_fallback_v012.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_pose_math_v0125.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_preexecution_contract_v10.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_production_authority_v11.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_production_grade_coverage_v11.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_production_grade_v11.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_project_spine_v013.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_provider_and_qualification.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_provider_criterion_v15.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_qualification_cli_lifecycle_v06.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_qualification_harness_v06.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_readme_pypi.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_real_provider_adapters.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_reference_workcell_ros_frames_v0125.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_reference_workcell_v012.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_report_test_contract_coverage_v16.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_report_test_lineage_v16.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_report_test_visual_execution_v16.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_robot_platform_v08.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_ros2_production_receipts_v011.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_ros2_simulation.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_selective_verification_v14.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_setup_profile.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_sim_real_qualification_v011.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_simulation_platform_v08.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_smooth_motion_hotfix_v162.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_support_contact_hotfix_v161.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_tool_collision_v011.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_tool_scene_v0124.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_trajectory_action_probe_v0125.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_trajectory_qualification_v09.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_trajectory_tracking_v0125.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_twin_materialization_v10.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_twin_v08.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_ur5e_adapter_scopes_v09.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_ur5e_v10_adapter_scopes.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_user_cli_interactive_v131.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_user_cli_progress_v131.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_user_cli_report_visual_v16.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_user_cli_selective_v14.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_user_cli_v15.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_user_cli_v15_hotfix_inheritance.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_v052_stabilization.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/tests/test_v08_catalog_mapping_regression.py +0 -0
- {devagent_physical_engine-1.8.0 → devagent_physical_engine-1.8.1}/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: Production-grade verification-first robotics evidence runtime with one-command customer intake, truthful robot support tiers, qualified UR5e report-test Gazebo execution, experimental ABB IRB1200 Gazebo/MoveIt/RViz visualization, transfer/place diagnostics, requirement-driven test generation, selective verification, deterministic Twin lineage, measured physical verification, replay inspection, regression, and FAT evidence.
|
|
3
|
+
Version: 1.8.1
|
|
4
|
+
Summary: Production-grade verification-first robotics evidence runtime with one-command customer intake, truthful robot support tiers, qualified UR5e report-test Gazebo execution, direct ROS controller/action readiness, experimental ABB IRB1200 Gazebo/MoveIt/RViz visualization, transfer/place diagnostics, requirement-driven test generation, selective verification, deterministic Twin lineage, measured physical verification, replay inspection, regression, and FAT evidence.
|
|
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.1
|
|
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.1
|
|
92
92
|
```
|
|
93
93
|
|
|
94
94
|
Run the normal customer workflow:
|
|
@@ -360,6 +360,14 @@ This is intentionally **visual simulation availability**, not measured FAT quali
|
|
|
360
360
|
|
|
361
361
|
Generic `abb_irb`, FANUC CRX, and KUKA KR profiles remain model-only until equivalent vendor/model visual runtimes are implemented and qualified.
|
|
362
362
|
|
|
363
|
+
## v1.8.1 direct UR5e controller/action readiness hotfix
|
|
364
|
+
|
|
365
|
+
A real UR5e target-stack run proved that Gazebo, `gz_ros2_control`, the controller manager, joint-state broadcaster, and `scaled_joint_trajectory_controller` could all initialize successfully while DevAgent remained stuck in startup readiness until the 120-second timeout. The old UR5e readiness gate depended on ROS CLI graph commands and expected the unscaled `/joint_trajectory_controller/follow_joint_trajectory` action even when the active controller was the scaled UR controller.
|
|
366
|
+
|
|
367
|
+
v1.8.1 makes UR5e readiness and trajectory execution use one controller-binding contract. A short-lived direct `rclpy` probe calls `/controller_manager/list_controllers`, deterministically selects the active trajectory controller, verifies its exact `FollowJointTrajectory` action server, and returns the bound action name. Required UR5e joint-state readiness continues to use the direct machine joint-state probe.
|
|
368
|
+
|
|
369
|
+
The readiness gate therefore no longer depends on a long-lived `ros2 daemon`, `ros2 node list`, `ros2 topic list`, or `ros2 action list`. It remains fail-closed on missing controller-manager service, no active trajectory controller, ambiguous active controllers, a missing trajectory action server, or missing required UR5e joint state. No collision rule, Pilz target, motion speed, Twin lineage, site-qualification boundary, or real-execution authority is relaxed.
|
|
370
|
+
|
|
363
371
|
## Qualified visual-execution scope
|
|
364
372
|
|
|
365
373
|
Measured report-test execution remains intentionally narrow:
|
|
@@ -560,9 +568,9 @@ devagent-physical-ai optional provider-backed engineering front end
|
|
|
560
568
|
|
|
561
569
|
# Project status
|
|
562
570
|
|
|
563
|
-
**v1.8.
|
|
571
|
+
**v1.8.1 — Production/Stable software workflow**
|
|
564
572
|
|
|
565
|
-
v1.8.
|
|
573
|
+
v1.8.1 retains the v1.8.0 truthful robot support tiers and ABB IRB1200 experimental visual runtime, while fixing the UR5e target-stack readiness gate so it directly binds the active controller manager trajectory controller and exact `FollowJointTrajectory` server instead of depending on ROS CLI graph discovery or an unscaled-controller naming assumption.
|
|
566
574
|
|
|
567
575
|
Production-oriented software capabilities include:
|
|
568
576
|
|
|
@@ -576,6 +584,7 @@ immutable project/Twin lineage
|
|
|
576
584
|
exact Requirement → Mapping → Verification Plan → Case provenance
|
|
577
585
|
truthful robot support tiers
|
|
578
586
|
qualified UR5e report-test visual execution contract
|
|
587
|
+
direct UR5e controller-manager/action readiness binding
|
|
579
588
|
experimental exact ABB IRB1200 Gazebo/MoveIt/RViz preview
|
|
580
589
|
industrial Pilz PTP / LIN planning
|
|
581
590
|
adaptive bounded blend selection
|
|
@@ -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.1
|
|
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.1
|
|
51
51
|
```
|
|
52
52
|
|
|
53
53
|
Run the normal customer workflow:
|
|
@@ -319,6 +319,14 @@ This is intentionally **visual simulation availability**, not measured FAT quali
|
|
|
319
319
|
|
|
320
320
|
Generic `abb_irb`, FANUC CRX, and KUKA KR profiles remain model-only until equivalent vendor/model visual runtimes are implemented and qualified.
|
|
321
321
|
|
|
322
|
+
## v1.8.1 direct UR5e controller/action readiness hotfix
|
|
323
|
+
|
|
324
|
+
A real UR5e target-stack run proved that Gazebo, `gz_ros2_control`, the controller manager, joint-state broadcaster, and `scaled_joint_trajectory_controller` could all initialize successfully while DevAgent remained stuck in startup readiness until the 120-second timeout. The old UR5e readiness gate depended on ROS CLI graph commands and expected the unscaled `/joint_trajectory_controller/follow_joint_trajectory` action even when the active controller was the scaled UR controller.
|
|
325
|
+
|
|
326
|
+
v1.8.1 makes UR5e readiness and trajectory execution use one controller-binding contract. A short-lived direct `rclpy` probe calls `/controller_manager/list_controllers`, deterministically selects the active trajectory controller, verifies its exact `FollowJointTrajectory` action server, and returns the bound action name. Required UR5e joint-state readiness continues to use the direct machine joint-state probe.
|
|
327
|
+
|
|
328
|
+
The readiness gate therefore no longer depends on a long-lived `ros2 daemon`, `ros2 node list`, `ros2 topic list`, or `ros2 action list`. It remains fail-closed on missing controller-manager service, no active trajectory controller, ambiguous active controllers, a missing trajectory action server, or missing required UR5e joint state. No collision rule, Pilz target, motion speed, Twin lineage, site-qualification boundary, or real-execution authority is relaxed.
|
|
329
|
+
|
|
322
330
|
## Qualified visual-execution scope
|
|
323
331
|
|
|
324
332
|
Measured report-test execution remains intentionally narrow:
|
|
@@ -519,9 +527,9 @@ devagent-physical-ai optional provider-backed engineering front end
|
|
|
519
527
|
|
|
520
528
|
# Project status
|
|
521
529
|
|
|
522
|
-
**v1.8.
|
|
530
|
+
**v1.8.1 — Production/Stable software workflow**
|
|
523
531
|
|
|
524
|
-
v1.8.
|
|
532
|
+
v1.8.1 retains the v1.8.0 truthful robot support tiers and ABB IRB1200 experimental visual runtime, while fixing the UR5e target-stack readiness gate so it directly binds the active controller manager trajectory controller and exact `FollowJointTrajectory` server instead of depending on ROS CLI graph discovery or an unscaled-controller naming assumption.
|
|
525
533
|
|
|
526
534
|
Production-oriented software capabilities include:
|
|
527
535
|
|
|
@@ -535,6 +543,7 @@ immutable project/Twin lineage
|
|
|
535
543
|
exact Requirement → Mapping → Verification Plan → Case provenance
|
|
536
544
|
truthful robot support tiers
|
|
537
545
|
qualified UR5e report-test visual execution contract
|
|
546
|
+
direct UR5e controller-manager/action readiness binding
|
|
538
547
|
experimental exact ABB IRB1200 Gazebo/MoveIt/RViz preview
|
|
539
548
|
industrial Pilz PTP / LIN planning
|
|
540
549
|
adaptive bounded blend selection
|
|
@@ -587,4 +596,4 @@ Original creator: Tom Ha
|
|
|
587
596
|
Original project: https://github.com/tomha85/devagent-physical-engine
|
|
588
597
|
All rights reserved.
|
|
589
598
|
|
|
590
|
-
See repository `LICENSE`, `NOTICE`, and `COPYRIGHT` for complete ownership and usage terms.
|
|
599
|
+
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 = "Production-grade verification-first robotics evidence runtime with one-command customer intake, truthful robot support tiers, qualified UR5e report-test Gazebo execution, experimental ABB IRB1200 Gazebo/MoveIt/RViz visualization, transfer/place diagnostics, requirement-driven test generation, selective verification, deterministic Twin lineage, measured physical verification, replay inspection, regression, and FAT evidence."
|
|
7
|
+
version = "1.8.1"
|
|
8
|
+
description = "Production-grade verification-first robotics evidence runtime with one-command customer intake, truthful robot support tiers, qualified UR5e report-test Gazebo execution, direct ROS controller/action readiness, experimental ABB IRB1200 Gazebo/MoveIt/RViz visualization, transfer/place diagnostics, requirement-driven test generation, selective verification, deterministic Twin lineage, measured physical verification, replay inspection, regression, and FAT evidence."
|
|
9
9
|
readme = { file = "README.md", content-type = "text/markdown" }
|
|
10
10
|
requires-python = ">=3.11"
|
|
11
11
|
dependencies = ["PyYAML>=6.0,<7"]
|
|
@@ -26,6 +26,7 @@ from .commercial_intelligence import (
|
|
|
26
26
|
)
|
|
27
27
|
from .commercial_readiness import CommercialProjectStatus, FATReportBuilder
|
|
28
28
|
from .commercial_repository import CommercialProjectRepository
|
|
29
|
+
from .controller_runtime_hotfix_v181 import install_controller_runtime_hotfix_v181
|
|
29
30
|
from .evidence_replay import ReplayInspectionService
|
|
30
31
|
from .evidence_trust import (
|
|
31
32
|
EVIDENCE_TRUST_SCHEMA_VERSION,
|
|
@@ -215,6 +216,7 @@ __all__ = [
|
|
|
215
216
|
install_support_contact_hotfix_v161()
|
|
216
217
|
install_smooth_motion_hotfix_v162()
|
|
217
218
|
install_industrial_motion_v170()
|
|
219
|
+
install_controller_runtime_hotfix_v181()
|
|
218
220
|
install_one_command_runtime()
|
|
219
221
|
|
|
220
|
-
__version__ = "1.8.
|
|
222
|
+
__version__ = "1.8.1"
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
from pathlib import Path
|
|
5
|
+
from typing import Mapping
|
|
6
|
+
|
|
7
|
+
from .ros2 import trajectory as _trajectory
|
|
8
|
+
from .ros2.commands import CommandExecutionError, RosCommandRunner
|
|
9
|
+
from .ros2.trajectory import RosTrajectoryError
|
|
10
|
+
from .ros2.ur5e_adapter import UR5E_JOINTS, UR5eGazeboAdapter
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
_DEFAULT_TRAJECTORY_ACTION = "/joint_trajectory_controller/follow_joint_trajectory"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def _last_json_mapping(stdout: str, *, code: str) -> Mapping[str, object]:
|
|
17
|
+
lines = [line.strip() for line in stdout.splitlines() if line.strip()]
|
|
18
|
+
if not lines:
|
|
19
|
+
raise RosTrajectoryError(code)
|
|
20
|
+
try:
|
|
21
|
+
payload = json.loads(lines[-1])
|
|
22
|
+
except json.JSONDecodeError as exc:
|
|
23
|
+
raise RosTrajectoryError(code) from exc
|
|
24
|
+
if not isinstance(payload, Mapping):
|
|
25
|
+
raise RosTrajectoryError(code)
|
|
26
|
+
return payload
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
def resolve_active_trajectory_action_v181(
|
|
30
|
+
runner: RosCommandRunner,
|
|
31
|
+
*,
|
|
32
|
+
preferred_action: str = _DEFAULT_TRAJECTORY_ACTION,
|
|
33
|
+
) -> str:
|
|
34
|
+
if not preferred_action.startswith("/") or any(
|
|
35
|
+
character.isspace() for character in preferred_action
|
|
36
|
+
):
|
|
37
|
+
raise RosTrajectoryError("trajectory_action_must_be_absolute")
|
|
38
|
+
|
|
39
|
+
service_timeout = 3.0
|
|
40
|
+
action_timeout = 3.0
|
|
41
|
+
helper = Path(_trajectory.__file__).with_name("controller_action_probe.py").resolve()
|
|
42
|
+
command = (
|
|
43
|
+
"python3",
|
|
44
|
+
str(helper),
|
|
45
|
+
"--preferred-action",
|
|
46
|
+
preferred_action,
|
|
47
|
+
"--service-timeout",
|
|
48
|
+
format(service_timeout, ".6g"),
|
|
49
|
+
"--action-timeout",
|
|
50
|
+
format(action_timeout, ".6g"),
|
|
51
|
+
)
|
|
52
|
+
try:
|
|
53
|
+
result = runner.run(
|
|
54
|
+
command,
|
|
55
|
+
timeout_s=service_timeout * 2.0 + action_timeout + 4.0,
|
|
56
|
+
)
|
|
57
|
+
except CommandExecutionError as exc:
|
|
58
|
+
raise RosTrajectoryError("trajectory_controller_discovery_timeout") from exc
|
|
59
|
+
|
|
60
|
+
payload = _last_json_mapping(
|
|
61
|
+
result.stdout,
|
|
62
|
+
code="trajectory_controller_probe_output_invalid",
|
|
63
|
+
)
|
|
64
|
+
code = str(payload.get("code") or "trajectory_controller_probe_failed")
|
|
65
|
+
if payload.get("success") is not True:
|
|
66
|
+
raise RosTrajectoryError(code)
|
|
67
|
+
if not result.ok:
|
|
68
|
+
raise RosTrajectoryError("trajectory_controller_probe_exit_nonzero")
|
|
69
|
+
|
|
70
|
+
action_name = str(payload.get("action_name") or "").strip()
|
|
71
|
+
if not action_name.startswith("/") or not action_name.endswith(
|
|
72
|
+
"/follow_joint_trajectory"
|
|
73
|
+
):
|
|
74
|
+
raise RosTrajectoryError("trajectory_controller_probe_output_invalid")
|
|
75
|
+
return action_name
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
def ur5e_ready_probe_v181(self: UR5eGazeboAdapter) -> tuple[bool, str]:
|
|
79
|
+
try:
|
|
80
|
+
action_name = resolve_active_trajectory_action_v181(self.runner)
|
|
81
|
+
_trajectory.read_joint_state(
|
|
82
|
+
self.runner,
|
|
83
|
+
timeout_s=4.0,
|
|
84
|
+
required_joint_names=UR5E_JOINTS,
|
|
85
|
+
)
|
|
86
|
+
except RosTrajectoryError as exc:
|
|
87
|
+
return False, str(exc)
|
|
88
|
+
return True, f"controller/action/joint-state ready:{action_name}"
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
def install_controller_runtime_hotfix_v181() -> None:
|
|
92
|
+
_trajectory.resolve_active_trajectory_action = resolve_active_trajectory_action_v181
|
|
93
|
+
UR5eGazeboAdapter._ready_probe = ur5e_ready_probe_v181
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import argparse
|
|
4
|
+
import json
|
|
5
|
+
import os
|
|
6
|
+
from typing import Any, Sequence
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
def _controller_from_action(action_name: str) -> str | None:
|
|
10
|
+
parts = tuple(part for part in str(action_name).strip().split("/") if part)
|
|
11
|
+
if len(parts) == 2 and parts[1] == "follow_joint_trajectory":
|
|
12
|
+
return parts[0]
|
|
13
|
+
return None
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def _is_trajectory_controller(name: str, controller_type: str) -> bool:
|
|
17
|
+
canonical_name = str(name).strip()
|
|
18
|
+
canonical_type = str(controller_type).strip().lower().replace("_", "")
|
|
19
|
+
return canonical_name.endswith("joint_trajectory_controller") or (
|
|
20
|
+
"trajectorycontroller" in canonical_type
|
|
21
|
+
)
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
def select_active_trajectory_controller(
|
|
25
|
+
controllers: Sequence[tuple[str, str, str]],
|
|
26
|
+
*,
|
|
27
|
+
preferred_action: str,
|
|
28
|
+
) -> tuple[str | None, str]:
|
|
29
|
+
preferred = _controller_from_action(preferred_action)
|
|
30
|
+
if preferred is None:
|
|
31
|
+
return None, "trajectory_action_must_be_absolute"
|
|
32
|
+
|
|
33
|
+
active = sorted(
|
|
34
|
+
{
|
|
35
|
+
str(name).strip()
|
|
36
|
+
for name, controller_type, state in controllers
|
|
37
|
+
if str(state).strip().lower() == "active"
|
|
38
|
+
and _is_trajectory_controller(name, controller_type)
|
|
39
|
+
and str(name).strip()
|
|
40
|
+
and "/" not in str(name).strip()
|
|
41
|
+
}
|
|
42
|
+
)
|
|
43
|
+
if not active:
|
|
44
|
+
return None, "trajectory_controller_not_active"
|
|
45
|
+
if preferred in active:
|
|
46
|
+
return preferred, "trajectory_controller_selected"
|
|
47
|
+
if len(active) == 1:
|
|
48
|
+
return active[0], "trajectory_controller_selected"
|
|
49
|
+
return None, "trajectory_controller_ambiguous:" + ",".join(active)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
def probe_controller_action(
|
|
53
|
+
*,
|
|
54
|
+
preferred_action: str,
|
|
55
|
+
service_timeout_s: float,
|
|
56
|
+
action_timeout_s: float,
|
|
57
|
+
) -> dict[str, Any]:
|
|
58
|
+
if service_timeout_s <= 0 or action_timeout_s <= 0:
|
|
59
|
+
raise ValueError("controller_action_probe_timeout_must_be_positive")
|
|
60
|
+
if not preferred_action.startswith("/") or any(
|
|
61
|
+
character.isspace() for character in preferred_action
|
|
62
|
+
):
|
|
63
|
+
raise ValueError("trajectory_action_must_be_absolute")
|
|
64
|
+
|
|
65
|
+
import rclpy
|
|
66
|
+
from control_msgs.action import FollowJointTrajectory
|
|
67
|
+
from controller_manager_msgs.srv import ListControllers
|
|
68
|
+
from rclpy.action import ActionClient
|
|
69
|
+
|
|
70
|
+
rclpy.init(args=None)
|
|
71
|
+
node = rclpy.create_node(f"devagent_controller_action_probe_{os.getpid()}")
|
|
72
|
+
service = node.create_client(ListControllers, "/controller_manager/list_controllers")
|
|
73
|
+
action_client = None
|
|
74
|
+
try:
|
|
75
|
+
if not service.wait_for_service(timeout_sec=float(service_timeout_s)):
|
|
76
|
+
return {"success": False, "code": "controller_manager_service_timeout"}
|
|
77
|
+
|
|
78
|
+
future = service.call_async(ListControllers.Request())
|
|
79
|
+
rclpy.spin_until_future_complete(node, future, timeout_sec=float(service_timeout_s))
|
|
80
|
+
if not future.done():
|
|
81
|
+
return {"success": False, "code": "controller_manager_list_timeout"}
|
|
82
|
+
response = future.result()
|
|
83
|
+
if response is None:
|
|
84
|
+
return {"success": False, "code": "controller_manager_list_failed"}
|
|
85
|
+
|
|
86
|
+
records = tuple(
|
|
87
|
+
(str(item.name), str(item.type), str(item.state))
|
|
88
|
+
for item in response.controller
|
|
89
|
+
)
|
|
90
|
+
controller, code = select_active_trajectory_controller(
|
|
91
|
+
records,
|
|
92
|
+
preferred_action=preferred_action,
|
|
93
|
+
)
|
|
94
|
+
if controller is None:
|
|
95
|
+
return {
|
|
96
|
+
"success": False,
|
|
97
|
+
"code": code,
|
|
98
|
+
"controllers": [
|
|
99
|
+
{"name": name, "type": controller_type, "state": state}
|
|
100
|
+
for name, controller_type, state in records
|
|
101
|
+
],
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
action_name = f"/{controller}/follow_joint_trajectory"
|
|
105
|
+
action_client = ActionClient(node, FollowJointTrajectory, action_name)
|
|
106
|
+
if not action_client.wait_for_server(timeout_sec=float(action_timeout_s)):
|
|
107
|
+
return {
|
|
108
|
+
"success": False,
|
|
109
|
+
"code": "trajectory_action_server_timeout",
|
|
110
|
+
"controller": controller,
|
|
111
|
+
"action_name": action_name,
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
selected_type = next(
|
|
115
|
+
(
|
|
116
|
+
controller_type
|
|
117
|
+
for name, controller_type, state in records
|
|
118
|
+
if name == controller and state.strip().lower() == "active"
|
|
119
|
+
),
|
|
120
|
+
"",
|
|
121
|
+
)
|
|
122
|
+
return {
|
|
123
|
+
"success": True,
|
|
124
|
+
"code": "trajectory_controller_action_ready",
|
|
125
|
+
"controller": controller,
|
|
126
|
+
"controller_type": selected_type,
|
|
127
|
+
"action_name": action_name,
|
|
128
|
+
}
|
|
129
|
+
finally:
|
|
130
|
+
if action_client is not None:
|
|
131
|
+
action_client.destroy()
|
|
132
|
+
node.destroy_client(service)
|
|
133
|
+
node.destroy_node()
|
|
134
|
+
if rclpy.ok():
|
|
135
|
+
rclpy.shutdown()
|
|
136
|
+
|
|
137
|
+
|
|
138
|
+
def main() -> int:
|
|
139
|
+
parser = argparse.ArgumentParser()
|
|
140
|
+
parser.add_argument(
|
|
141
|
+
"--preferred-action",
|
|
142
|
+
default="/joint_trajectory_controller/follow_joint_trajectory",
|
|
143
|
+
)
|
|
144
|
+
parser.add_argument("--service-timeout", type=float, default=3.0)
|
|
145
|
+
parser.add_argument("--action-timeout", type=float, default=3.0)
|
|
146
|
+
args = parser.parse_args()
|
|
147
|
+
|
|
148
|
+
try:
|
|
149
|
+
result = probe_controller_action(
|
|
150
|
+
preferred_action=str(args.preferred_action),
|
|
151
|
+
service_timeout_s=float(args.service_timeout),
|
|
152
|
+
action_timeout_s=float(args.action_timeout),
|
|
153
|
+
)
|
|
154
|
+
except Exception as exc:
|
|
155
|
+
result = {
|
|
156
|
+
"success": False,
|
|
157
|
+
"code": f"controller_action_probe_error:{type(exc).__name__}",
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
print(json.dumps(result, sort_keys=True, separators=(",", ":"), allow_nan=False))
|
|
161
|
+
return 0 if result.get("success") else 2
|
|
162
|
+
|
|
163
|
+
|
|
164
|
+
if __name__ == "__main__":
|
|
165
|
+
raise SystemExit(main())
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devagent-physical-engine
|
|
3
|
-
Version: 1.8.
|
|
4
|
-
Summary: Production-grade verification-first robotics evidence runtime with one-command customer intake, truthful robot support tiers, qualified UR5e report-test Gazebo execution, experimental ABB IRB1200 Gazebo/MoveIt/RViz visualization, transfer/place diagnostics, requirement-driven test generation, selective verification, deterministic Twin lineage, measured physical verification, replay inspection, regression, and FAT evidence.
|
|
3
|
+
Version: 1.8.1
|
|
4
|
+
Summary: Production-grade verification-first robotics evidence runtime with one-command customer intake, truthful robot support tiers, qualified UR5e report-test Gazebo execution, direct ROS controller/action readiness, experimental ABB IRB1200 Gazebo/MoveIt/RViz visualization, transfer/place diagnostics, requirement-driven test generation, selective verification, deterministic Twin lineage, measured physical verification, replay inspection, regression, and FAT evidence.
|
|
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.1
|
|
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.1
|
|
92
92
|
```
|
|
93
93
|
|
|
94
94
|
Run the normal customer workflow:
|
|
@@ -360,6 +360,14 @@ This is intentionally **visual simulation availability**, not measured FAT quali
|
|
|
360
360
|
|
|
361
361
|
Generic `abb_irb`, FANUC CRX, and KUKA KR profiles remain model-only until equivalent vendor/model visual runtimes are implemented and qualified.
|
|
362
362
|
|
|
363
|
+
## v1.8.1 direct UR5e controller/action readiness hotfix
|
|
364
|
+
|
|
365
|
+
A real UR5e target-stack run proved that Gazebo, `gz_ros2_control`, the controller manager, joint-state broadcaster, and `scaled_joint_trajectory_controller` could all initialize successfully while DevAgent remained stuck in startup readiness until the 120-second timeout. The old UR5e readiness gate depended on ROS CLI graph commands and expected the unscaled `/joint_trajectory_controller/follow_joint_trajectory` action even when the active controller was the scaled UR controller.
|
|
366
|
+
|
|
367
|
+
v1.8.1 makes UR5e readiness and trajectory execution use one controller-binding contract. A short-lived direct `rclpy` probe calls `/controller_manager/list_controllers`, deterministically selects the active trajectory controller, verifies its exact `FollowJointTrajectory` action server, and returns the bound action name. Required UR5e joint-state readiness continues to use the direct machine joint-state probe.
|
|
368
|
+
|
|
369
|
+
The readiness gate therefore no longer depends on a long-lived `ros2 daemon`, `ros2 node list`, `ros2 topic list`, or `ros2 action list`. It remains fail-closed on missing controller-manager service, no active trajectory controller, ambiguous active controllers, a missing trajectory action server, or missing required UR5e joint state. No collision rule, Pilz target, motion speed, Twin lineage, site-qualification boundary, or real-execution authority is relaxed.
|
|
370
|
+
|
|
363
371
|
## Qualified visual-execution scope
|
|
364
372
|
|
|
365
373
|
Measured report-test execution remains intentionally narrow:
|
|
@@ -560,9 +568,9 @@ devagent-physical-ai optional provider-backed engineering front end
|
|
|
560
568
|
|
|
561
569
|
# Project status
|
|
562
570
|
|
|
563
|
-
**v1.8.
|
|
571
|
+
**v1.8.1 — Production/Stable software workflow**
|
|
564
572
|
|
|
565
|
-
v1.8.
|
|
573
|
+
v1.8.1 retains the v1.8.0 truthful robot support tiers and ABB IRB1200 experimental visual runtime, while fixing the UR5e target-stack readiness gate so it directly binds the active controller manager trajectory controller and exact `FollowJointTrajectory` server instead of depending on ROS CLI graph discovery or an unscaled-controller naming assumption.
|
|
566
574
|
|
|
567
575
|
Production-oriented software capabilities include:
|
|
568
576
|
|
|
@@ -576,6 +584,7 @@ immutable project/Twin lineage
|
|
|
576
584
|
exact Requirement → Mapping → Verification Plan → Case provenance
|
|
577
585
|
truthful robot support tiers
|
|
578
586
|
qualified UR5e report-test visual execution contract
|
|
587
|
+
direct UR5e controller-manager/action readiness binding
|
|
579
588
|
experimental exact ABB IRB1200 Gazebo/MoveIt/RViz preview
|
|
580
589
|
industrial Pilz PTP / LIN planning
|
|
581
590
|
adaptive bounded blend selection
|
|
@@ -12,6 +12,7 @@ src/devagent_physical_engine/commercial_intelligence.py
|
|
|
12
12
|
src/devagent_physical_engine/commercial_readiness.py
|
|
13
13
|
src/devagent_physical_engine/commercial_repository.py
|
|
14
14
|
src/devagent_physical_engine/continuous_clearance.py
|
|
15
|
+
src/devagent_physical_engine/controller_runtime_hotfix_v181.py
|
|
15
16
|
src/devagent_physical_engine/doctor.py
|
|
16
17
|
src/devagent_physical_engine/engineering_agent.py
|
|
17
18
|
src/devagent_physical_engine/engineering_request.py
|
|
@@ -108,6 +109,7 @@ src/devagent_physical_engine/ros2/abb_irb1200_preview.py
|
|
|
108
109
|
src/devagent_physical_engine/ros2/acceptance.py
|
|
109
110
|
src/devagent_physical_engine/ros2/commands.py
|
|
110
111
|
src/devagent_physical_engine/ros2/continuous_clearance_probe.py
|
|
112
|
+
src/devagent_physical_engine/ros2/controller_action_probe.py
|
|
111
113
|
src/devagent_physical_engine/ros2/doctor.py
|
|
112
114
|
src/devagent_physical_engine/ros2/fk_pose.py
|
|
113
115
|
src/devagent_physical_engine/ros2/fk_probe.py
|
|
@@ -164,6 +166,7 @@ tests/test_commercial_intelligence_v15.py
|
|
|
164
166
|
tests/test_commercial_readiness_v1.py
|
|
165
167
|
tests/test_commercial_v1.py
|
|
166
168
|
tests/test_continuous_clearance_v011.py
|
|
169
|
+
tests/test_controller_runtime_hotfix_v181.py
|
|
167
170
|
tests/test_core.py
|
|
168
171
|
tests/test_engineering_request_v07.py
|
|
169
172
|
tests/test_evidence_replay_v12.py
|