devagent-physical-engine 1.7.1__tar.gz → 1.8.0__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.7.1/src/devagent_physical_engine.egg-info → devagent_physical_engine-1.8.0}/PKG-INFO +86 -15
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/README.md +84 -13
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/pyproject.toml +6 -3
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/__init__.py +1 -1
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/industrial_motion_hotfix_v170.py +9 -8
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/one_command_v16.py +8 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/qualification.py +28 -3
- devagent_physical_engine-1.8.0/src/devagent_physical_engine/robot_support_v18.py +97 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/robots.py +6 -0
- devagent_physical_engine-1.8.0/src/devagent_physical_engine/ros2/abb_irb1200.py +441 -0
- devagent_physical_engine-1.8.0/src/devagent_physical_engine/ros2/abb_irb1200_preview.py +203 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/doctor.py +9 -1
- devagent_physical_engine-1.8.0/src/devagent_physical_engine/ros2/industrial_sequence_planner_v172.py +239 -0
- devagent_physical_engine-1.8.0/src/devagent_physical_engine/user_cli_v18.py +283 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0/src/devagent_physical_engine.egg-info}/PKG-INFO +86 -15
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine.egg-info/SOURCES.txt +7 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine.egg-info/entry_points.txt +1 -1
- devagent_physical_engine-1.8.0/tests/test_abb_irb1200_visual_v18.py +180 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_golden_abb_showcase.py +6 -2
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_industrial_motion_v170.py +6 -6
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_robot_platform_v08.py +26 -1
- devagent_physical_engine-1.8.0/tests/test_transfer_place_diagnostic_v172.py +162 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/NOTICE +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/setup.cfg +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/agent/__init__.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/agent/compiler.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/agent/contracts.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/agent/coordinator.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/agent/critic.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/agent/evidence.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/agent/interpreter.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/agent/planner.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/agent/recovery.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/agent/routing.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/agent/runtime.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/agent/semantic.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/agent/structured.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ai_cli.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/cli.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/commercial.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/commercial_campaign.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/commercial_cli.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/commercial_importer.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/commercial_intelligence.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/commercial_readiness.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/commercial_repository.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/continuous_clearance.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/doctor.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/engineering_agent.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/engineering_request.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/evidence_replay.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/evidence_trust.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/execution.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/industrial_motion_v170.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/models.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/one_command.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/one_command_runtime.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/one_command_v15.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/operating_envelope.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/optimization/__init__.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/optimization/benchmark.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/optimization/candidates.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/optimization/contracts.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/optimization/evaluator.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/optimization/evidence.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/optimization/experience.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/optimization/measured.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/optimization/optimizer.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/optimization/orchestrator.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/physical_campaign.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/physical_evidence.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/physical_motion.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/planning.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/pose_math.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/preexecution_contract.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/production_authority.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/production_grade.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/project.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/provider_adapters/__init__.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/provider_adapters/anthropic.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/provider_adapters/common.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/provider_adapters/factory.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/provider_adapters/gemini.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/provider_adapters/openai.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/provider_criterion.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/provider_qualification.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/providers.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/qualification_cli.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/qualification_harness.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/reference_workcell.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/report_test_execution.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/report_test_execution_strict.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/robot_platform.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/__init__.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/acceptance.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/commands.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/continuous_clearance_probe.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/fk_pose.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/fk_probe.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/frame_alignment.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/gazebo_cli.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/gazebo_pose.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/gazebo_world.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v170.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/industrial_sequence_planner_v171.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/joint_state_probe.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/joint_state_recorder.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/measured_motion.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/moveit_joint_plan_probe.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/moveit_joint_plan_v161_probe.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/moveit_scene.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/moveit_task_planner.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/pilz_sequence_plan_probe.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/preexecution.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/qualification.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/qualification_v10.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/qualification_v11.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/qualification_v12.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/report_test_visualization.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/report_test_visualization_v170.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/scene_probe.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/state_validity_probe.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/support_contact_acm_probe_v170.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/support_contact_lease_v170.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/support_contact_runner_v161.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/support_contact_v161.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/task_adapter.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/task_visualization.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/tf_probe.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/tool_scene.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/tool_scene_probe.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/trajectory.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/trajectory_action_probe.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/trajectory_tracking.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/ur5e.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/ur5e_adapter.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/ur5e_v10_adapter.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/workpiece_follow.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/workpiece_gazebo_follower.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/workpiece_scene.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/ros2/workpiece_scene_probe.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/selective_verification.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/selective_verification_v16.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/setup_profile.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/sim_real_qualification.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/simulation.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/simulation_platform.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/smooth_motion_hotfix_v162.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/support_contact_hotfix_v161.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/tool_collision.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/trajectory_qualification.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/twin.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/twin_builder.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/twin_codec.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/twin_materialization.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/user_cli.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/user_cli_v15.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/user_cli_v16.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/verification.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine/workpiece_lifecycle.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine.egg-info/dependency_links.txt +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine.egg-info/requires.txt +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/src/devagent_physical_engine.egg-info/top_level.txt +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_agent_core.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_agent_semantic_hardening.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_ai_cli.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_ai_cli_v07.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_commercial_importer_v1.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_commercial_intelligence_v15.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_commercial_readiness_v1.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_commercial_v1.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_continuous_clearance_v011.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_core.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_engineering_request_v07.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_evidence_replay_v12.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_evidence_trust_coverage_v12.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_evidence_trust_transport_v12.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_evidence_trust_v12.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_evidence_viewer_palette_v130.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_gazebo_cli_v0122.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_golden_abb_runner_v171.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_interpreter_profiles_v08.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_joint_state_probe_v0125.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_live_provider_qualification.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_measured_motion_v10.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_moveit_planning_diagnostics_v0125.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_moveit_scene_v0123.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_natural_language_agent_v07.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_one_command_hardening_v13.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_one_command_pose_hardening_v15.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_one_command_regression_v141.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_one_command_v13.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_openai_strict_schema_v0113.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_optimization_v05.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_physical_campaign_v09.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_physical_evidence_v09.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_physical_motion_v09.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_planning_fallback_v012.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_pose_math_v0125.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_preexecution_contract_v10.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_production_authority_v11.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_production_grade_coverage_v11.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_production_grade_v11.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_project_spine_v013.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_provider_and_qualification.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_provider_criterion_v15.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_qualification_cli_lifecycle_v06.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_qualification_harness_v06.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_readme_pypi.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_real_provider_adapters.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_reference_workcell_ros_frames_v0125.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_reference_workcell_v012.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_report_test_contract_coverage_v16.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_report_test_lineage_v16.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_report_test_visual_execution_v16.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_ros2_production_receipts_v011.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_ros2_simulation.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_ros_trajectory_v09.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_selective_verification_v14.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_setup_profile.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_sim_real_qualification_v011.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_simulation_platform_v08.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_smooth_motion_hotfix_v162.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_support_contact_hotfix_v161.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_tool_collision_v011.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_tool_scene_v0124.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_trajectory_action_probe_v0125.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_trajectory_qualification_v09.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_trajectory_tracking_v0125.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_twin_materialization_v10.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_twin_v08.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_ur5e_adapter_scopes_v09.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_ur5e_v10_adapter_scopes.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_user_cli_interactive_v131.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_user_cli_progress_v131.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_user_cli_report_visual_v16.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_user_cli_selective_v14.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_user_cli_v15.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_user_cli_v15_hotfix_inheritance.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_v052_stabilization.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/tests/test_v08_catalog_mapping_regression.py +0 -0
- {devagent_physical_engine-1.7.1 → devagent_physical_engine-1.8.0}/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.
|
|
4
|
-
Summary: Production-grade verification-first robotics evidence runtime with one-command customer intake,
|
|
3
|
+
Version: 1.8.0
|
|
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.
|
|
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.
|
|
79
|
+
python -m pip install --upgrade devagent-physical-engine==1.8.0
|
|
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.
|
|
91
|
+
1.8.0
|
|
92
92
|
```
|
|
93
93
|
|
|
94
94
|
Run the normal customer workflow:
|
|
@@ -115,6 +115,19 @@ For machine-readable CI output:
|
|
|
115
115
|
devagent verify ./customer-project --json
|
|
116
116
|
```
|
|
117
117
|
|
|
118
|
+
Inspect truthful robot support tiers:
|
|
119
|
+
|
|
120
|
+
```bash
|
|
121
|
+
devagent robots
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
For the exact ABB IRB1200 experimental visual runtime:
|
|
125
|
+
|
|
126
|
+
```bash
|
|
127
|
+
devagent robot doctor abb_irb1200
|
|
128
|
+
devagent robot visualize abb_irb1200
|
|
129
|
+
```
|
|
130
|
+
|
|
118
131
|
Default locations:
|
|
119
132
|
|
|
120
133
|
```text
|
|
@@ -304,9 +317,52 @@ no fallback to an unqualified simulator or robot
|
|
|
304
317
|
|
|
305
318
|
The selected blend radii and every planning attempt receipt remain attached to motion metadata for auditability.
|
|
306
319
|
|
|
320
|
+
## v1.7.2 transfer/place diagnostic hotfix
|
|
321
|
+
|
|
322
|
+
A target-stack qualification run proved that `transfer_place` still returned Pilz `FAILURE(99999)` for every v1.7.1 blend candidate, including zero blend. v1.7.2 therefore does not keep guessing at blend values. When that exact bounded failure occurs, DevAgent remains fail-closed and runs two independent **plan-only** probes against the same attached-workpiece PlanningScene:
|
|
323
|
+
|
|
324
|
+
```text
|
|
325
|
+
lift target
|
|
326
|
+
↓
|
|
327
|
+
transfer PTP probe
|
|
328
|
+
↓ independent start at transfer target
|
|
329
|
+
place LIN probe
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
The result is classified deterministically as one of:
|
|
333
|
+
|
|
334
|
+
```text
|
|
335
|
+
pilz_transfer_segment_planning_failed
|
|
336
|
+
pilz_place_segment_planning_failed
|
|
337
|
+
pilz_transfer_and_place_segment_planning_failed
|
|
338
|
+
pilz_transfer_place_sequence_composition_failed
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
Each probe writes its own request/receipt plus a `transfer-place-diagnostic.json` summary. These probes never execute motion and never relax targets, planner types, collision policy, attached-workpiece scene state, velocity/acceleration limits, Twin lineage, or real-execution authority. Their purpose is to identify the exact target-stack defect before changing physical execution semantics.
|
|
342
|
+
|
|
343
|
+
## v1.8 truthful robot support + ABB IRB1200 visual runtime
|
|
344
|
+
|
|
345
|
+
v1.8 makes robot support explicit instead of implying that every built-in robot profile has the same simulator authority.
|
|
346
|
+
|
|
347
|
+
Support is exposed through:
|
|
348
|
+
|
|
349
|
+
```bash
|
|
350
|
+
devagent robots
|
|
351
|
+
devagent robot doctor <robot>
|
|
352
|
+
devagent robot visualize <robot>
|
|
353
|
+
```
|
|
354
|
+
|
|
355
|
+
The exact `abb_irb1200` profile adds an experimental visual runtime using Ubuntu 24.04, ROS 2 Jazzy, Gazebo Harmonic, `gz_ros2_control`, upstream ABB IRB1200 geometry, MoveIt, and RViz. Runtime readiness is bounded on controller state, `/joint_states`, FollowJointTrajectory, `move_group`, and RViz availability.
|
|
356
|
+
|
|
357
|
+
For the Golden ABB cell, DevAgent can load the waypoint seed, pre-plan every phase through MoveIt before sending any simulated trajectory, then execute the preview while Gazebo/RViz remain open for inspection.
|
|
358
|
+
|
|
359
|
+
This is intentionally **visual simulation availability**, not measured FAT qualification. ABB preview evidence is not promoted to a qualified physical measurement, and `real_execution_allowed` remains false. The normal One-Command ABB FAT path continues to fail closed until an exact-Twin measured ABB execution adapter is separately qualified.
|
|
360
|
+
|
|
361
|
+
Generic `abb_irb`, FANUC CRX, and KUKA KR profiles remain model-only until equivalent vendor/model visual runtimes are implemented and qualified.
|
|
362
|
+
|
|
307
363
|
## Qualified visual-execution scope
|
|
308
364
|
|
|
309
|
-
|
|
365
|
+
Measured report-test execution remains intentionally narrow:
|
|
310
366
|
|
|
311
367
|
```text
|
|
312
368
|
robot: UR5e
|
|
@@ -317,7 +373,7 @@ runtime: Ubuntu 24.04 + ROS 2 Jazzy + Gazebo Harmonic + MoveIt/Pilz
|
|
|
317
373
|
|
|
318
374
|
Unsupported customer Twins, unqualified robot profiles, boundary/fault cases outside the qualified scope, ambiguous case mappings, or incomplete lineage fail closed.
|
|
319
375
|
|
|
320
|
-
|
|
376
|
+
ABB IRB1200 is separately exposed as `SIMULATION_AVAILABLE_EXPERIMENTAL`: Gazebo/MoveIt/RViz preview is available, but it does not silently enter the UR5e measured FAT executor and cannot promote physical evidence.
|
|
321
377
|
|
|
322
378
|
## Interactive engineering session
|
|
323
379
|
|
|
@@ -425,12 +481,12 @@ Ubuntu 24.04
|
|
|
425
481
|
ROS 2 Jazzy
|
|
426
482
|
Gazebo Harmonic
|
|
427
483
|
gz_ros2_control
|
|
428
|
-
|
|
429
|
-
ur_simulation_gz
|
|
430
|
-
MoveIt 2 + Pilz Industrial Motion Planner
|
|
484
|
+
MoveIt 2
|
|
431
485
|
```
|
|
432
486
|
|
|
433
|
-
|
|
487
|
+
UR5e measured report-test execution additionally uses the Universal Robots ROS 2 driver, `ur_simulation_gz`, and Pilz Industrial Motion Planner.
|
|
488
|
+
|
|
489
|
+
Preview UR5e setup:
|
|
434
490
|
|
|
435
491
|
```bash
|
|
436
492
|
devagent-physical setup --profile ur5e-sim --dry-run
|
|
@@ -442,12 +498,24 @@ Apply explicitly:
|
|
|
442
498
|
devagent-physical setup --profile ur5e-sim --yes
|
|
443
499
|
```
|
|
444
500
|
|
|
445
|
-
Check runtime:
|
|
501
|
+
Check the UR5e runtime:
|
|
446
502
|
|
|
447
503
|
```bash
|
|
448
504
|
devagent-physical ros doctor
|
|
449
505
|
```
|
|
450
506
|
|
|
507
|
+
Check ABB IRB1200 visual runtime prerequisites:
|
|
508
|
+
|
|
509
|
+
```bash
|
|
510
|
+
devagent robot doctor abb_irb1200
|
|
511
|
+
```
|
|
512
|
+
|
|
513
|
+
Launch ABB IRB1200 Gazebo + MoveIt + RViz preview:
|
|
514
|
+
|
|
515
|
+
```bash
|
|
516
|
+
devagent robot visualize abb_irb1200
|
|
517
|
+
```
|
|
518
|
+
|
|
451
519
|
Hosted CI validates deterministic software contracts. It does not pretend to execute a graphical ROS/Gazebo/MoveIt target stack. Target-stack acceptance must run on the intended workstation.
|
|
452
520
|
|
|
453
521
|
## Optional AI providers
|
|
@@ -474,7 +542,7 @@ Provider-backed interpretation cannot grant physical truth, site qualification,
|
|
|
474
542
|
## Installed CLIs
|
|
475
543
|
|
|
476
544
|
```text
|
|
477
|
-
devagent one-command
|
|
545
|
+
devagent one-command verification, interactive report testing, robot support/visualization
|
|
478
546
|
devagent-commercial commercial/evidence workflow
|
|
479
547
|
devagent-physical deterministic core + ROS/qualification tools
|
|
480
548
|
devagent-physical-ai optional provider-backed engineering front end
|
|
@@ -492,9 +560,9 @@ devagent-physical-ai optional provider-backed engineering front end
|
|
|
492
560
|
|
|
493
561
|
# Project status
|
|
494
562
|
|
|
495
|
-
**v1.
|
|
563
|
+
**v1.8.0 — Production/Stable software workflow**
|
|
496
564
|
|
|
497
|
-
v1.
|
|
565
|
+
v1.8.0 retains the qualified UR5e measured report-test architecture and the v1.7.2 transfer/place diagnostics, while adding truthful robot support tiers and an exact ABB IRB1200 experimental Gazebo Harmonic + MoveIt + RViz visual runtime. ABB visualization is available for engineering preview, but measured FAT promotion remains fail-closed until the exact ABB execution adapter is separately qualified.
|
|
498
566
|
|
|
499
567
|
Production-oriented software capabilities include:
|
|
500
568
|
|
|
@@ -506,9 +574,12 @@ optional provider-backed advisory criterion proposals
|
|
|
506
574
|
requirement-driven nominal / boundary / fault case generation
|
|
507
575
|
immutable project/Twin lineage
|
|
508
576
|
exact Requirement → Mapping → Verification Plan → Case provenance
|
|
509
|
-
|
|
577
|
+
truthful robot support tiers
|
|
578
|
+
qualified UR5e report-test visual execution contract
|
|
579
|
+
experimental exact ABB IRB1200 Gazebo/MoveIt/RViz preview
|
|
510
580
|
industrial Pilz PTP / LIN planning
|
|
511
581
|
adaptive bounded blend selection
|
|
582
|
+
plan-only transfer/place segment diagnostics
|
|
512
583
|
lift-only support-contact ACM lease + exact restore
|
|
513
584
|
Gazebo/MoveIt selected-case visualization
|
|
514
585
|
typed physical measurement binding
|
|
@@ -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.
|
|
38
|
+
python -m pip install --upgrade devagent-physical-engine==1.8.0
|
|
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.
|
|
50
|
+
1.8.0
|
|
51
51
|
```
|
|
52
52
|
|
|
53
53
|
Run the normal customer workflow:
|
|
@@ -74,6 +74,19 @@ For machine-readable CI output:
|
|
|
74
74
|
devagent verify ./customer-project --json
|
|
75
75
|
```
|
|
76
76
|
|
|
77
|
+
Inspect truthful robot support tiers:
|
|
78
|
+
|
|
79
|
+
```bash
|
|
80
|
+
devagent robots
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
For the exact ABB IRB1200 experimental visual runtime:
|
|
84
|
+
|
|
85
|
+
```bash
|
|
86
|
+
devagent robot doctor abb_irb1200
|
|
87
|
+
devagent robot visualize abb_irb1200
|
|
88
|
+
```
|
|
89
|
+
|
|
77
90
|
Default locations:
|
|
78
91
|
|
|
79
92
|
```text
|
|
@@ -263,9 +276,52 @@ no fallback to an unqualified simulator or robot
|
|
|
263
276
|
|
|
264
277
|
The selected blend radii and every planning attempt receipt remain attached to motion metadata for auditability.
|
|
265
278
|
|
|
279
|
+
## v1.7.2 transfer/place diagnostic hotfix
|
|
280
|
+
|
|
281
|
+
A target-stack qualification run proved that `transfer_place` still returned Pilz `FAILURE(99999)` for every v1.7.1 blend candidate, including zero blend. v1.7.2 therefore does not keep guessing at blend values. When that exact bounded failure occurs, DevAgent remains fail-closed and runs two independent **plan-only** probes against the same attached-workpiece PlanningScene:
|
|
282
|
+
|
|
283
|
+
```text
|
|
284
|
+
lift target
|
|
285
|
+
↓
|
|
286
|
+
transfer PTP probe
|
|
287
|
+
↓ independent start at transfer target
|
|
288
|
+
place LIN probe
|
|
289
|
+
```
|
|
290
|
+
|
|
291
|
+
The result is classified deterministically as one of:
|
|
292
|
+
|
|
293
|
+
```text
|
|
294
|
+
pilz_transfer_segment_planning_failed
|
|
295
|
+
pilz_place_segment_planning_failed
|
|
296
|
+
pilz_transfer_and_place_segment_planning_failed
|
|
297
|
+
pilz_transfer_place_sequence_composition_failed
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
Each probe writes its own request/receipt plus a `transfer-place-diagnostic.json` summary. These probes never execute motion and never relax targets, planner types, collision policy, attached-workpiece scene state, velocity/acceleration limits, Twin lineage, or real-execution authority. Their purpose is to identify the exact target-stack defect before changing physical execution semantics.
|
|
301
|
+
|
|
302
|
+
## v1.8 truthful robot support + ABB IRB1200 visual runtime
|
|
303
|
+
|
|
304
|
+
v1.8 makes robot support explicit instead of implying that every built-in robot profile has the same simulator authority.
|
|
305
|
+
|
|
306
|
+
Support is exposed through:
|
|
307
|
+
|
|
308
|
+
```bash
|
|
309
|
+
devagent robots
|
|
310
|
+
devagent robot doctor <robot>
|
|
311
|
+
devagent robot visualize <robot>
|
|
312
|
+
```
|
|
313
|
+
|
|
314
|
+
The exact `abb_irb1200` profile adds an experimental visual runtime using Ubuntu 24.04, ROS 2 Jazzy, Gazebo Harmonic, `gz_ros2_control`, upstream ABB IRB1200 geometry, MoveIt, and RViz. Runtime readiness is bounded on controller state, `/joint_states`, FollowJointTrajectory, `move_group`, and RViz availability.
|
|
315
|
+
|
|
316
|
+
For the Golden ABB cell, DevAgent can load the waypoint seed, pre-plan every phase through MoveIt before sending any simulated trajectory, then execute the preview while Gazebo/RViz remain open for inspection.
|
|
317
|
+
|
|
318
|
+
This is intentionally **visual simulation availability**, not measured FAT qualification. ABB preview evidence is not promoted to a qualified physical measurement, and `real_execution_allowed` remains false. The normal One-Command ABB FAT path continues to fail closed until an exact-Twin measured ABB execution adapter is separately qualified.
|
|
319
|
+
|
|
320
|
+
Generic `abb_irb`, FANUC CRX, and KUKA KR profiles remain model-only until equivalent vendor/model visual runtimes are implemented and qualified.
|
|
321
|
+
|
|
266
322
|
## Qualified visual-execution scope
|
|
267
323
|
|
|
268
|
-
|
|
324
|
+
Measured report-test execution remains intentionally narrow:
|
|
269
325
|
|
|
270
326
|
```text
|
|
271
327
|
robot: UR5e
|
|
@@ -276,7 +332,7 @@ runtime: Ubuntu 24.04 + ROS 2 Jazzy + Gazebo Harmonic + MoveIt/Pilz
|
|
|
276
332
|
|
|
277
333
|
Unsupported customer Twins, unqualified robot profiles, boundary/fault cases outside the qualified scope, ambiguous case mappings, or incomplete lineage fail closed.
|
|
278
334
|
|
|
279
|
-
|
|
335
|
+
ABB IRB1200 is separately exposed as `SIMULATION_AVAILABLE_EXPERIMENTAL`: Gazebo/MoveIt/RViz preview is available, but it does not silently enter the UR5e measured FAT executor and cannot promote physical evidence.
|
|
280
336
|
|
|
281
337
|
## Interactive engineering session
|
|
282
338
|
|
|
@@ -384,12 +440,12 @@ Ubuntu 24.04
|
|
|
384
440
|
ROS 2 Jazzy
|
|
385
441
|
Gazebo Harmonic
|
|
386
442
|
gz_ros2_control
|
|
387
|
-
|
|
388
|
-
ur_simulation_gz
|
|
389
|
-
MoveIt 2 + Pilz Industrial Motion Planner
|
|
443
|
+
MoveIt 2
|
|
390
444
|
```
|
|
391
445
|
|
|
392
|
-
|
|
446
|
+
UR5e measured report-test execution additionally uses the Universal Robots ROS 2 driver, `ur_simulation_gz`, and Pilz Industrial Motion Planner.
|
|
447
|
+
|
|
448
|
+
Preview UR5e setup:
|
|
393
449
|
|
|
394
450
|
```bash
|
|
395
451
|
devagent-physical setup --profile ur5e-sim --dry-run
|
|
@@ -401,12 +457,24 @@ Apply explicitly:
|
|
|
401
457
|
devagent-physical setup --profile ur5e-sim --yes
|
|
402
458
|
```
|
|
403
459
|
|
|
404
|
-
Check runtime:
|
|
460
|
+
Check the UR5e runtime:
|
|
405
461
|
|
|
406
462
|
```bash
|
|
407
463
|
devagent-physical ros doctor
|
|
408
464
|
```
|
|
409
465
|
|
|
466
|
+
Check ABB IRB1200 visual runtime prerequisites:
|
|
467
|
+
|
|
468
|
+
```bash
|
|
469
|
+
devagent robot doctor abb_irb1200
|
|
470
|
+
```
|
|
471
|
+
|
|
472
|
+
Launch ABB IRB1200 Gazebo + MoveIt + RViz preview:
|
|
473
|
+
|
|
474
|
+
```bash
|
|
475
|
+
devagent robot visualize abb_irb1200
|
|
476
|
+
```
|
|
477
|
+
|
|
410
478
|
Hosted CI validates deterministic software contracts. It does not pretend to execute a graphical ROS/Gazebo/MoveIt target stack. Target-stack acceptance must run on the intended workstation.
|
|
411
479
|
|
|
412
480
|
## Optional AI providers
|
|
@@ -433,7 +501,7 @@ Provider-backed interpretation cannot grant physical truth, site qualification,
|
|
|
433
501
|
## Installed CLIs
|
|
434
502
|
|
|
435
503
|
```text
|
|
436
|
-
devagent one-command
|
|
504
|
+
devagent one-command verification, interactive report testing, robot support/visualization
|
|
437
505
|
devagent-commercial commercial/evidence workflow
|
|
438
506
|
devagent-physical deterministic core + ROS/qualification tools
|
|
439
507
|
devagent-physical-ai optional provider-backed engineering front end
|
|
@@ -451,9 +519,9 @@ devagent-physical-ai optional provider-backed engineering front end
|
|
|
451
519
|
|
|
452
520
|
# Project status
|
|
453
521
|
|
|
454
|
-
**v1.
|
|
522
|
+
**v1.8.0 — Production/Stable software workflow**
|
|
455
523
|
|
|
456
|
-
v1.
|
|
524
|
+
v1.8.0 retains the qualified UR5e measured report-test architecture and the v1.7.2 transfer/place diagnostics, while adding truthful robot support tiers and an exact ABB IRB1200 experimental Gazebo Harmonic + MoveIt + RViz visual runtime. ABB visualization is available for engineering preview, but measured FAT promotion remains fail-closed until the exact ABB execution adapter is separately qualified.
|
|
457
525
|
|
|
458
526
|
Production-oriented software capabilities include:
|
|
459
527
|
|
|
@@ -465,9 +533,12 @@ optional provider-backed advisory criterion proposals
|
|
|
465
533
|
requirement-driven nominal / boundary / fault case generation
|
|
466
534
|
immutable project/Twin lineage
|
|
467
535
|
exact Requirement → Mapping → Verification Plan → Case provenance
|
|
468
|
-
|
|
536
|
+
truthful robot support tiers
|
|
537
|
+
qualified UR5e report-test visual execution contract
|
|
538
|
+
experimental exact ABB IRB1200 Gazebo/MoveIt/RViz preview
|
|
469
539
|
industrial Pilz PTP / LIN planning
|
|
470
540
|
adaptive bounded blend selection
|
|
541
|
+
plan-only transfer/place segment diagnostics
|
|
471
542
|
lift-only support-contact ACM lease + exact restore
|
|
472
543
|
Gazebo/MoveIt selected-case visualization
|
|
473
544
|
typed physical measurement binding
|
|
@@ -4,8 +4,8 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "devagent-physical-engine"
|
|
7
|
-
version = "1.
|
|
8
|
-
description = "Production-grade verification-first robotics evidence runtime with one-command customer intake,
|
|
7
|
+
version = "1.8.0"
|
|
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."
|
|
9
9
|
readme = { file = "README.md", content-type = "text/markdown" }
|
|
10
10
|
requires-python = ">=3.11"
|
|
11
11
|
dependencies = ["PyYAML>=6.0,<7"]
|
|
@@ -47,7 +47,7 @@ Repository = "https://github.com/tomha85/devagent-physical-engine"
|
|
|
47
47
|
Issues = "https://github.com/tomha85/devagent-physical-engine/issues"
|
|
48
48
|
|
|
49
49
|
[project.scripts]
|
|
50
|
-
devagent = "devagent_physical_engine.
|
|
50
|
+
devagent = "devagent_physical_engine.user_cli_v18:main"
|
|
51
51
|
devagent-physical = "devagent_physical_engine.cli:main"
|
|
52
52
|
devagent-physical-ai = "devagent_physical_engine.ai_cli:main"
|
|
53
53
|
devagent-commercial = "devagent_physical_engine.commercial_cli:main"
|
|
@@ -75,11 +75,14 @@ omit = [
|
|
|
75
75
|
"src/devagent_physical_engine/ros2/moveit_task_planner.py",
|
|
76
76
|
"src/devagent_physical_engine/ros2/industrial_sequence_planner_v170.py",
|
|
77
77
|
"src/devagent_physical_engine/ros2/industrial_sequence_planner_v171.py",
|
|
78
|
+
"src/devagent_physical_engine/ros2/industrial_sequence_planner_v172.py",
|
|
78
79
|
"src/devagent_physical_engine/ros2/support_contact_lease_v170.py",
|
|
79
80
|
"src/devagent_physical_engine/ros2/fk_pose.py",
|
|
80
81
|
"src/devagent_physical_engine/ros2/gazebo_pose.py",
|
|
81
82
|
"src/devagent_physical_engine/ros2/workpiece_follow.py",
|
|
82
83
|
"src/devagent_physical_engine/ros2/workpiece_gazebo_follower.py",
|
|
84
|
+
"src/devagent_physical_engine/ros2/abb_irb1200.py",
|
|
85
|
+
"src/devagent_physical_engine/ros2/abb_irb1200_preview.py",
|
|
83
86
|
]
|
|
84
87
|
|
|
85
88
|
[tool.coverage.report]
|
|
@@ -24,23 +24,24 @@ def _patch_constructor(cls) -> None:
|
|
|
24
24
|
|
|
25
25
|
|
|
26
26
|
def install_industrial_motion_v170() -> None:
|
|
27
|
-
"""Route report-test execution through v1.7 industrial
|
|
27
|
+
"""Route report-test execution through the qualified v1.7 industrial runtime.
|
|
28
28
|
|
|
29
|
-
v1.7.1
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
29
|
+
v1.7.1 retries only generic Pilz sequence-planning failures with smaller internal
|
|
30
|
+
blend radii. v1.7.2 retains that bounded fallback and, if transfer/place still
|
|
31
|
+
fails at zero blend, runs plan-only transfer PTP and place LIN probes against the
|
|
32
|
+
same attached-workpiece scene. The probes only improve diagnosis; they never grant
|
|
33
|
+
execution authority or relax geometry, collision, speed, scene, or Twin lineage.
|
|
33
34
|
"""
|
|
34
35
|
|
|
35
36
|
from . import report_test_execution as base_exec
|
|
36
37
|
from . import report_test_execution_strict as strict_exec
|
|
37
38
|
from .ros2 import report_test_visualization as base_visual
|
|
38
39
|
from .ros2 import report_test_visualization_v170 as visual_v170
|
|
39
|
-
from .ros2.
|
|
40
|
-
|
|
40
|
+
from .ros2.industrial_sequence_planner_v172 import (
|
|
41
|
+
PilzIndustrialSequencePlannerV172,
|
|
41
42
|
)
|
|
42
43
|
|
|
43
|
-
visual_v170.PilzIndustrialSequencePlannerV170 =
|
|
44
|
+
visual_v170.PilzIndustrialSequencePlannerV170 = PilzIndustrialSequencePlannerV172
|
|
44
45
|
|
|
45
46
|
base_exec.run_report_test_visualization = run_report_test_visualization_v170
|
|
46
47
|
strict_exec.run_report_test_visualization = run_report_test_visualization_v170
|
|
@@ -13,6 +13,10 @@ from .commercial_repository import CommercialProjectRepository
|
|
|
13
13
|
from .one_command_v15 import OneCommandVerifier as OneCommandVerifierV15
|
|
14
14
|
from .one_command_v15 import SimpleVerifyResult
|
|
15
15
|
from .report_test_execution_strict import ReportTestFullExecutor
|
|
16
|
+
from .robot_support_v18 import ensure_v18_robot_profiles
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
ensure_v18_robot_profiles()
|
|
16
20
|
|
|
17
21
|
|
|
18
22
|
class ProfileGatedReportTestFullExecutor(ReportTestFullExecutor):
|
|
@@ -23,6 +27,10 @@ class ProfileGatedReportTestFullExecutor(ReportTestFullExecutor):
|
|
|
23
27
|
entering UR5e-specific request materialization so that One-Command can continue
|
|
24
28
|
producing bounded campaign/FAT evidence instead of surfacing an executor
|
|
25
29
|
traceback.
|
|
30
|
+
|
|
31
|
+
Exact profiles may expose an experimental visual runtime (for example ABB
|
|
32
|
+
IRB1200) while remaining blocked here until that runtime passes measured FAT
|
|
33
|
+
qualification. Availability is deliberately not treated as evidence authority.
|
|
26
34
|
"""
|
|
27
35
|
|
|
28
36
|
def execute(
|
|
@@ -9,6 +9,17 @@ from .robots import CATALOG
|
|
|
9
9
|
from .simulation import DeterministicSimulationBackend
|
|
10
10
|
|
|
11
11
|
|
|
12
|
+
# This is the original v1 cross-vendor *family* corpus. Exact model profiles added
|
|
13
|
+
# later (for example abb_irb1200) must not silently change the historical smoke
|
|
14
|
+
# baseline or turn a family-level qualification into a count of registry entries.
|
|
15
|
+
V1_ROBOT_FAMILIES = (
|
|
16
|
+
"ur5e",
|
|
17
|
+
"fanuc_crx",
|
|
18
|
+
"kuka_kr",
|
|
19
|
+
"abb_irb",
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
|
|
12
23
|
@dataclass(frozen=True, slots=True)
|
|
13
24
|
class QualificationCaseResult:
|
|
14
25
|
robot: str
|
|
@@ -35,10 +46,24 @@ def run_cross_vendor_smoke() -> QualificationSummary:
|
|
|
35
46
|
supervisor = ExecutionSupervisor()
|
|
36
47
|
goal = Goal("G1", "load", "P17", "conveyor_a", "cnc_04")
|
|
37
48
|
results: list[QualificationCaseResult] = []
|
|
38
|
-
for robot_name
|
|
49
|
+
for robot_name in V1_ROBOT_FAMILIES:
|
|
50
|
+
factory = CATALOG[robot_name]
|
|
39
51
|
resource = factory()
|
|
40
52
|
graph = planner.plan(goal, [resource])
|
|
41
53
|
world = WorldState(facts={"robot_ready", "object_available"})
|
|
42
|
-
report = supervisor.execute(
|
|
43
|
-
|
|
54
|
+
report = supervisor.execute(
|
|
55
|
+
graph,
|
|
56
|
+
[resource],
|
|
57
|
+
world,
|
|
58
|
+
DeterministicSimulationBackend(),
|
|
59
|
+
ExecutionMode.SIMULATION,
|
|
60
|
+
)
|
|
61
|
+
results.append(
|
|
62
|
+
QualificationCaseResult(
|
|
63
|
+
robot_name,
|
|
64
|
+
report.completed,
|
|
65
|
+
len(report.executed_tasks),
|
|
66
|
+
len(report.issues),
|
|
67
|
+
)
|
|
68
|
+
)
|
|
44
69
|
return QualificationSummary(tuple(results))
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
from .robot_platform import (
|
|
4
|
+
ARM_CAPABILITIES,
|
|
5
|
+
BUILTIN_ROBOT_PROFILES,
|
|
6
|
+
QualificationState,
|
|
7
|
+
RobotProfile,
|
|
8
|
+
RobotQualification,
|
|
9
|
+
RosIntegration,
|
|
10
|
+
SimulationTier,
|
|
11
|
+
)
|
|
12
|
+
|
|
13
|
+
ABB_IRB1200_PROFILE_KEY = "abb_irb1200"
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
def _abb_irb1200_profile() -> RobotProfile:
|
|
17
|
+
"""Exact ABB IRB 1200-5/0.9 profile.
|
|
18
|
+
|
|
19
|
+
The visual/physics runtime remains EXPERIMENTAL until target-workstation
|
|
20
|
+
acceptance proves the exact Gazebo/MoveIt integration. This makes the runtime
|
|
21
|
+
available without prematurely upgrading FAT evidence authority.
|
|
22
|
+
"""
|
|
23
|
+
|
|
24
|
+
return RobotProfile(
|
|
25
|
+
key=ABB_IRB1200_PROFILE_KEY,
|
|
26
|
+
vendor="abb",
|
|
27
|
+
model="irb1200_5_90",
|
|
28
|
+
capabilities=ARM_CAPABILITIES,
|
|
29
|
+
qualification=RobotQualification(
|
|
30
|
+
{
|
|
31
|
+
SimulationTier.DETERMINISTIC: QualificationState.QUALIFIED,
|
|
32
|
+
SimulationTier.KINEMATIC: QualificationState.EXPERIMENTAL,
|
|
33
|
+
SimulationTier.PHYSICS: QualificationState.EXPERIMENTAL,
|
|
34
|
+
SimulationTier.VISUAL: QualificationState.EXPERIMENTAL,
|
|
35
|
+
}
|
|
36
|
+
),
|
|
37
|
+
ros=RosIntegration(
|
|
38
|
+
ros2_compatible=True,
|
|
39
|
+
joint_state_interface="/joint_states",
|
|
40
|
+
trajectory_interface="joint_trajectory_controller/follow_joint_trajectory",
|
|
41
|
+
robot_description="abb_irb1200_support",
|
|
42
|
+
moveit_config="abb_irb1200_5_90_moveit_config",
|
|
43
|
+
hardware_driver="abb_ros2",
|
|
44
|
+
),
|
|
45
|
+
aliases=(
|
|
46
|
+
"abb irb1200",
|
|
47
|
+
"abb irb 1200",
|
|
48
|
+
"abb irb 1200-5/0.9",
|
|
49
|
+
"abb irb1200-5/0.9",
|
|
50
|
+
"irb1200",
|
|
51
|
+
"irb1200 5 90",
|
|
52
|
+
),
|
|
53
|
+
legacy_qualification="experimental",
|
|
54
|
+
notes=(
|
|
55
|
+
"Exact ABB IRB 1200-5/0.9 ROS2 profile.",
|
|
56
|
+
"Gazebo Harmonic + gz_ros2_control + MoveIt/RViz runtime is available "
|
|
57
|
+
"as an experimental visual path until laptop acceptance is recorded.",
|
|
58
|
+
"Visual preview motion is not FAT measurement evidence and real execution "
|
|
59
|
+
"remains locked.",
|
|
60
|
+
),
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def ensure_v18_robot_profiles() -> None:
|
|
65
|
+
"""Idempotently extend the built-in registry with exact v1.8 profiles."""
|
|
66
|
+
|
|
67
|
+
try:
|
|
68
|
+
BUILTIN_ROBOT_PROFILES.get(ABB_IRB1200_PROFILE_KEY)
|
|
69
|
+
except Exception:
|
|
70
|
+
BUILTIN_ROBOT_PROFILES.register(_abb_irb1200_profile())
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def robot_support_level(profile: RobotProfile) -> str:
|
|
74
|
+
"""Return a user-facing support label that never overstates qualification."""
|
|
75
|
+
|
|
76
|
+
physics = profile.qualification.state_for(SimulationTier.PHYSICS)
|
|
77
|
+
visual = profile.qualification.state_for(SimulationTier.VISUAL)
|
|
78
|
+
kinematic = profile.qualification.state_for(SimulationTier.KINEMATIC)
|
|
79
|
+
|
|
80
|
+
if physics is QualificationState.QUALIFIED and visual is QualificationState.QUALIFIED:
|
|
81
|
+
return "SIMULATION_SUPPORTED"
|
|
82
|
+
if physics is QualificationState.EXPERIMENTAL and visual is QualificationState.EXPERIMENTAL:
|
|
83
|
+
return "SIMULATION_AVAILABLE_EXPERIMENTAL"
|
|
84
|
+
if visual is QualificationState.QUALIFIED or kinematic is QualificationState.QUALIFIED:
|
|
85
|
+
return "VISUAL_SUPPORTED"
|
|
86
|
+
if visual is QualificationState.EXPERIMENTAL or kinematic is QualificationState.EXPERIMENTAL:
|
|
87
|
+
return "VISUAL_AVAILABLE_EXPERIMENTAL"
|
|
88
|
+
return "MODEL_ONLY"
|
|
89
|
+
|
|
90
|
+
|
|
91
|
+
ensure_v18_robot_profiles()
|
|
92
|
+
|
|
93
|
+
__all__ = [
|
|
94
|
+
"ABB_IRB1200_PROFILE_KEY",
|
|
95
|
+
"ensure_v18_robot_profiles",
|
|
96
|
+
"robot_support_level",
|
|
97
|
+
]
|
|
@@ -9,8 +9,10 @@ from .robot_platform import (
|
|
|
9
9
|
RobotPlatformError,
|
|
10
10
|
RobotProfileRegistry,
|
|
11
11
|
)
|
|
12
|
+
from .robot_support_v18 import ensure_v18_robot_profiles
|
|
12
13
|
|
|
13
14
|
|
|
15
|
+
ensure_v18_robot_profiles()
|
|
14
16
|
PROFILE_REGISTRY: RobotProfileRegistry = BUILTIN_ROBOT_PROFILES
|
|
15
17
|
|
|
16
18
|
|
|
@@ -34,6 +36,10 @@ def abb_irb(resource_id: str = "robot_01") -> Resource:
|
|
|
34
36
|
return _resource("abb_irb", resource_id)
|
|
35
37
|
|
|
36
38
|
|
|
39
|
+
def abb_irb1200(resource_id: str = "robot_01") -> Resource:
|
|
40
|
+
return _resource("abb_irb1200", resource_id)
|
|
41
|
+
|
|
42
|
+
|
|
37
43
|
class _RegistryBackedCatalog(Mapping[str, Callable[..., Resource]]):
|
|
38
44
|
"""Compatibility view for older core code that expects CATALOG[key]().
|
|
39
45
|
|