devagent-physical-engine 0.11.6__tar.gz → 0.12.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-0.11.6/src/devagent_physical_engine.egg-info → devagent_physical_engine-0.12.1}/PKG-INFO +80 -24
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/README.md +79 -23
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/pyproject.toml +12 -4
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/__init__.py +1 -1
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/agent/coordinator.py +30 -1
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/ai_cli.py +64 -41
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/engineering_agent.py +23 -15
- devagent_physical_engine-0.12.1/src/devagent_physical_engine/reference_workcell.py +271 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/ros2/__init__.py +3 -0
- devagent_physical_engine-0.12.1/src/devagent_physical_engine/ros2/fk_pose.py +91 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/ros2/fk_probe.py +21 -5
- devagent_physical_engine-0.12.1/src/devagent_physical_engine/ros2/gazebo_pose.py +104 -0
- devagent_physical_engine-0.12.1/src/devagent_physical_engine/ros2/moveit_joint_plan_probe.py +159 -0
- devagent_physical_engine-0.12.1/src/devagent_physical_engine/ros2/moveit_task_planner.py +139 -0
- devagent_physical_engine-0.12.1/src/devagent_physical_engine/ros2/qualification_v12.py +97 -0
- devagent_physical_engine-0.12.1/src/devagent_physical_engine/ros2/task_adapter.py +52 -0
- devagent_physical_engine-0.12.1/src/devagent_physical_engine/ros2/task_visualization.py +325 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/ros2/trajectory.py +40 -15
- devagent_physical_engine-0.12.1/src/devagent_physical_engine/ros2/workpiece_follow.py +107 -0
- devagent_physical_engine-0.12.1/src/devagent_physical_engine/ros2/workpiece_gazebo_follower.py +218 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/ros2/workpiece_scene.py +26 -2
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1/src/devagent_physical_engine.egg-info}/PKG-INFO +80 -24
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine.egg-info/SOURCES.txt +12 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_ai_cli.py +66 -22
- devagent_physical_engine-0.12.1/tests/test_planning_fallback_v012.py +165 -0
- devagent_physical_engine-0.12.1/tests/test_reference_workcell_v012.py +152 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_ros_trajectory_v09.py +60 -3
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/NOTICE +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/setup.cfg +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/agent/__init__.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/agent/compiler.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/agent/contracts.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/agent/critic.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/agent/evidence.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/agent/interpreter.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/agent/planner.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/agent/recovery.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/agent/routing.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/agent/runtime.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/agent/semantic.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/agent/structured.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/cli.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/continuous_clearance.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/doctor.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/engineering_request.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/execution.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/models.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/operating_envelope.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/optimization/__init__.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/optimization/benchmark.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/optimization/candidates.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/optimization/contracts.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/optimization/evaluator.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/optimization/evidence.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/optimization/experience.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/optimization/measured.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/optimization/optimizer.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/optimization/orchestrator.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/physical_campaign.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/physical_evidence.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/physical_motion.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/planning.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/preexecution_contract.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/provider_adapters/__init__.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/provider_adapters/anthropic.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/provider_adapters/common.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/provider_adapters/factory.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/provider_adapters/gemini.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/provider_adapters/openai.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/provider_qualification.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/providers.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/qualification.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/qualification_cli.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/qualification_harness.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/robot_platform.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/robots.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/ros2/acceptance.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/ros2/commands.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/ros2/continuous_clearance_probe.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/ros2/doctor.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/ros2/frame_alignment.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/ros2/gazebo_world.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/ros2/joint_state_recorder.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/ros2/measured_motion.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/ros2/moveit_scene.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/ros2/preexecution.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/ros2/qualification.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/ros2/qualification_v10.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/ros2/qualification_v11.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/ros2/scene_probe.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/ros2/state_validity_probe.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/ros2/tf_probe.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/ros2/tool_scene.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/ros2/tool_scene_probe.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/ros2/ur5e.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/ros2/ur5e_adapter.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/ros2/ur5e_v10_adapter.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/ros2/workpiece_scene_probe.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/setup_profile.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/sim_real_qualification.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/simulation.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/simulation_platform.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/tool_collision.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/trajectory_qualification.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/twin.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/twin_builder.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/twin_materialization.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/verification.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine/workpiece_lifecycle.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine.egg-info/dependency_links.txt +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine.egg-info/entry_points.txt +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine.egg-info/requires.txt +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/src/devagent_physical_engine.egg-info/top_level.txt +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_agent_core.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_agent_semantic_hardening.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_ai_cli_v07.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_continuous_clearance_v011.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_core.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_engineering_request_v07.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_interpreter_profiles_v08.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_live_provider_qualification.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_measured_motion_v10.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_natural_language_agent_v07.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_openai_strict_schema_v0113.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_optimization_v05.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_physical_campaign_v09.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_physical_evidence_v09.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_physical_motion_v09.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_preexecution_contract_v10.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_provider_and_qualification.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_qualification_cli_lifecycle_v06.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_qualification_harness_v06.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_readme_pypi.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_real_provider_adapters.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_robot_platform_v08.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_ros2_production_receipts_v011.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_ros2_simulation.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_setup_profile.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_sim_real_qualification_v011.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_simulation_platform_v08.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_tool_collision_v011.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_trajectory_qualification_v09.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_twin_materialization_v10.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_twin_v08.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_ur5e_adapter_scopes_v09.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_ur5e_v10_adapter_scopes.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_v052_stabilization.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_v08_catalog_mapping_regression.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.1}/tests/test_workpiece_lifecycle_v011.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: devagent-physical-engine
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.12.1
|
|
4
4
|
Summary: Verification-first agentic engineering, simulation, and evidence runtime for robotics and industrial automation.
|
|
5
5
|
Author: Tom Ha
|
|
6
6
|
License: All Rights Reserved
|
|
@@ -66,7 +66,7 @@ Core principles:
|
|
|
66
66
|
- **Deterministic verification** — task graphs, motion contracts, collision constraints, scene state, and promotion gates are checked outside the model.
|
|
67
67
|
- **Exact Twin binding** — physical motion is bound to a canonical Twin and immutable fingerprints rather than free-form model text.
|
|
68
68
|
- **Measured simulation** — supported ROS 2 / Gazebo / MoveIt paths collect runtime evidence instead of treating a generated plan as proof.
|
|
69
|
-
- **
|
|
69
|
+
- **No fake task visualization** — generic demo motion is never labeled as the requested BOX/source/destination task.
|
|
70
70
|
- **Real execution remains locked** — simulation success is not site qualification, functional-safety certification, or permission to run production hardware.
|
|
71
71
|
|
|
72
72
|
## Install
|
|
@@ -135,42 +135,79 @@ While the command runs, stage-by-stage progress is printed to `stderr` and the f
|
|
|
135
135
|
```text
|
|
136
136
|
[DevAgent + 0.00s] START provider=openai model=<model-id>
|
|
137
137
|
[DevAgent + 0.00s] INTERPRETER understanding engineering request
|
|
138
|
-
[DevAgent +
|
|
139
|
-
[DevAgent +
|
|
140
|
-
[DevAgent +
|
|
141
|
-
[DevAgent +
|
|
142
|
-
[DevAgent + 15.78s] COMPLETE ready_for_twin_simulation=true
|
|
138
|
+
[DevAgent + 4.20s] PLANNER revision=0 generating high-level task graph
|
|
139
|
+
[DevAgent + 10.30s] CRITIC revision=0 reviewing verified plan
|
|
140
|
+
[DevAgent + 13.10s] SIMULATION deterministic model execution completed
|
|
141
|
+
[DevAgent + 13.11s] COMPLETE ready_for_twin_simulation=true
|
|
143
142
|
```
|
|
144
143
|
|
|
145
144
|
Use `--quiet` when a script or CI job needs JSON without terminal progress.
|
|
146
145
|
|
|
147
|
-
##
|
|
146
|
+
## Task-specific visual simulation
|
|
148
147
|
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
To prove that the workstation can launch Gazebo / MoveIt and visibly move a UR5e, use the explicit visual demo:
|
|
148
|
+
For the supported v0.12 UR5e `load` scope, `--visualize` continues from the verified high-level task into a physical simulation path:
|
|
152
149
|
|
|
153
150
|
```bash
|
|
154
151
|
devagent-physical-ai engineer \
|
|
155
152
|
"Use a UR5e to load BOX_101 from conveyor_a to cnc_04. Simulate and verify the plan." \
|
|
156
153
|
--provider openai \
|
|
157
154
|
--model <model-id> \
|
|
158
|
-
--
|
|
155
|
+
--visualize
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
The current task-specific path uses the packaged `ur5e_reference_load_cell_v1` canonical workcell. The request identities remain exact (`BOX_101`, `conveyor_a`, `cnc_04`), while the reference source/destination poses, primitive geometry, nominal workpiece geometry, and reference tool are deterministic template facts rather than guessed customer-site facts.
|
|
159
|
+
|
|
160
|
+
The runtime then performs this bounded sequence:
|
|
161
|
+
|
|
162
|
+
```text
|
|
163
|
+
validated AI task graph
|
|
164
|
+
|
|
|
165
|
+
v
|
|
166
|
+
packaged canonical UR5e load Twin
|
|
167
|
+
|
|
|
168
|
+
v
|
|
169
|
+
Gazebo + MoveIt world materialization and read-back
|
|
170
|
+
|
|
|
171
|
+
v
|
|
172
|
+
MoveIt FK cross-check of reference pick/place targets
|
|
173
|
+
|
|
|
174
|
+
v
|
|
175
|
+
MoveIt joint-space plan for each physical phase
|
|
176
|
+
|
|
|
177
|
+
v
|
|
178
|
+
pre-pick -> pick -> attach BOX -> lift -> transfer -> place
|
|
179
|
+
|
|
|
180
|
+
v
|
|
181
|
+
BOX visually follows tool0 while attached in Gazebo
|
|
182
|
+
|
|
|
183
|
+
v
|
|
184
|
+
verified destination pose -> detach -> retract -> home
|
|
185
|
+
|
|
|
186
|
+
v
|
|
187
|
+
measured motion/evidence report
|
|
159
188
|
```
|
|
160
189
|
|
|
161
|
-
|
|
190
|
+
On a successful run, Gazebo / MoveIt remains open by default so the engineer can inspect the final workcell. Add `--close-after` to close it after success.
|
|
191
|
+
|
|
192
|
+
v0.12.1 hardens the initial ROS joint-state snapshot by parsing `ros2 topic echo --once` output as a YAML document stream. This accepts the normal ROS 2 trailing `---` message separator instead of incorrectly classifying an otherwise valid `/joint_states` sample as `joint_state_snapshot_invalid`.
|
|
193
|
+
|
|
194
|
+
The packaged reference workcell is **not customer-site geometry**. Arbitrary plant layouts require an imported or user-declared physical Twin with trusted poses, collision geometry, tool/TCP information, and workpiece properties. DevAgent does not invent those site facts from a natural-language prompt.
|
|
195
|
+
|
|
196
|
+
The v0.12 implementation remains evidence-gated: source/CI success does not prove the ROS target campaign has passed on a particular workstation. Use the executable qualification below before treating the task-specific path as qualified on that target.
|
|
197
|
+
|
|
198
|
+
### Visual stack demo
|
|
162
199
|
|
|
163
|
-
To
|
|
200
|
+
To test only that the workstation can launch Gazebo / MoveIt and visibly move a UR5e, without claiming that motion represents the requested BOX task, use:
|
|
164
201
|
|
|
165
202
|
```bash
|
|
166
203
|
devagent-physical-ai engineer \
|
|
167
204
|
"Use a UR5e to load BOX_101 from conveyor_a to cnc_04. Simulate and verify the plan." \
|
|
168
205
|
--provider openai \
|
|
169
206
|
--model <model-id> \
|
|
170
|
-
--
|
|
207
|
+
--visual-demo
|
|
171
208
|
```
|
|
172
209
|
|
|
173
|
-
|
|
210
|
+
`--visual-demo` is explicitly reported as `task_specific=false`.
|
|
174
211
|
|
|
175
212
|
## How it works
|
|
176
213
|
|
|
@@ -192,13 +229,13 @@ VERIFIED HIGH-LEVEL TASK GRAPH
|
|
|
192
229
|
CANONICAL PHYSICAL TWIN + IMMUTABLE HASH
|
|
193
230
|
|
|
|
194
231
|
v
|
|
195
|
-
|
|
232
|
+
MOVEIT-COMPILED PHYSICAL MOTION CONTRACTS
|
|
196
233
|
|
|
|
197
234
|
v
|
|
198
235
|
GAZEBO / MOVEIT MATERIALIZATION + READ-BACK
|
|
199
236
|
|
|
|
200
237
|
v
|
|
201
|
-
COLLISION /
|
|
238
|
+
COLLISION / TOOL / WORKPIECE VERIFICATION
|
|
202
239
|
|
|
|
203
240
|
v
|
|
204
241
|
ROS 2 SIMULATION + MEASURED RUNTIME EVIDENCE
|
|
@@ -212,6 +249,8 @@ REAL HARDWARE AUTHORIZATION REMAINS SEPARATELY LOCKED
|
|
|
212
249
|
|
|
213
250
|
The high-level AI task graph and the physical motion plan are not the same artifact. A `pick -> move -> place` graph is engineering intent. Gazebo execution requires a physically grounded Twin and compiled trajectory. This separation prevents an AI-generated task description from becoming an implicit motor command.
|
|
214
251
|
|
|
252
|
+
For a nominal low-risk `load` simulation, the Critic remains advisory after deterministic compilation and verification. If it repeatedly requests subjective revisions but never rejects the plan, DevAgent may use a bounded deterministic advisory fallback after the revision budget is exhausted. A Critic `REJECT`, deterministic violation, higher-risk qualification/commissioning intent, fault injection, physical variation, or explicit engineering threshold still blocks that fallback.
|
|
253
|
+
|
|
215
254
|
## General architecture
|
|
216
255
|
|
|
217
256
|
The architecture has three authority layers:
|
|
@@ -260,9 +299,9 @@ This plain-text diagram is intentionally used instead of Mermaid so the same REA
|
|
|
260
299
|
|
|
261
300
|
The canonical Twin records robot identity, frames, source/destination entities, workpiece, tool, geometry, physics evidence, controller metadata, uncertainty, and provenance. Unknown physical information remains unknown rather than being filled with AI guesses.
|
|
262
301
|
|
|
263
|
-
|
|
302
|
+
The UR5e canonical adapter can bind one materialization to Gazebo and MoveIt, verify world/scene read-back, apply a runtime-owned tool collision object, verify workpiece attach/detach transitions, execute compiled joint trajectories, record joint states, and compute MoveIt FK metrics.
|
|
264
303
|
|
|
265
|
-
A stronger pre-execution receipt requires evidence such as:
|
|
304
|
+
The stronger production-candidate verifier can additionally use measured collision distance and conservative continuous-path clearance proof. A stronger pre-execution receipt requires evidence such as:
|
|
266
305
|
|
|
267
306
|
```text
|
|
268
307
|
verified=true
|
|
@@ -284,7 +323,7 @@ The deterministic robot-profile layer includes abstractions for:
|
|
|
284
323
|
- KUKA KR family
|
|
285
324
|
- ABB IRB family
|
|
286
325
|
|
|
287
|
-
Physical simulation and qualification are adapter- and vendor-specific.
|
|
326
|
+
Physical simulation and qualification are adapter- and vendor-specific. The v0.12 task-specific visible `load` runtime is UR5e-specific. A profile existing in the registry does not imply equivalent physical qualification for every vendor.
|
|
288
327
|
|
|
289
328
|
## ROS 2 / Gazebo reference target
|
|
290
329
|
|
|
@@ -310,7 +349,22 @@ devagent-physical ros demo
|
|
|
310
349
|
devagent-physical ros qualify-trajectory-runtime
|
|
311
350
|
```
|
|
312
351
|
|
|
313
|
-
|
|
352
|
+
Run the v0.12 task-specific target qualification:
|
|
353
|
+
|
|
354
|
+
```bash
|
|
355
|
+
python -m devagent_physical_engine.ros2.qualification_v12
|
|
356
|
+
```
|
|
357
|
+
|
|
358
|
+
This must visibly execute the reference task and produce a passing report before the target workstation's v0.12 task-specific ROS simulation is considered qualified. It still intentionally reports:
|
|
359
|
+
|
|
360
|
+
```text
|
|
361
|
+
physical_qualification=false
|
|
362
|
+
commissioning_qualification=false
|
|
363
|
+
site_qualification=false
|
|
364
|
+
real_execution_allowed=false
|
|
365
|
+
```
|
|
366
|
+
|
|
367
|
+
For the stronger continuous-clearance production-candidate campaign:
|
|
314
368
|
|
|
315
369
|
```bash
|
|
316
370
|
python -m devagent_physical_engine.ros2.qualification_v11 \
|
|
@@ -340,6 +394,8 @@ Provider qualification uses API credits and verifies the bounded Interpreter / P
|
|
|
340
394
|
|
|
341
395
|
Repository CI verifies Python 3.11, 3.12, and 3.13, Ruff correctness, branch coverage, package build, clean wheel installation, and runtime dependency vulnerability audit.
|
|
342
396
|
|
|
397
|
+
ROS/Gazebo/MoveIt executable orchestration is separately target-qualified because hosted Python CI cannot truthfully exercise a graphical Gazebo process, MoveIt `move_group`, TF, ROS controllers, and Gazebo services. Pure reference-workcell contracts and deterministic planning logic remain covered by normal unit/coverage gates.
|
|
398
|
+
|
|
343
399
|
A green `main` release is tied to the exact CI-tested commit. Release artifacts are rebuilt and verified from the exact tag, checked with Twine, installed into a clean environment, accompanied by SHA256 checksums and an SBOM, attached to the GitHub Release, and published to PyPI through Trusted Publishing.
|
|
344
400
|
|
|
345
401
|
## Documentation
|
|
@@ -362,9 +418,9 @@ Detailed engineering documentation lives in the repository:
|
|
|
362
418
|
|
|
363
419
|
## Project status
|
|
364
420
|
|
|
365
|
-
**v0.
|
|
421
|
+
**v0.12.1 — Beta software / evidence-gated task-specific physical simulation.**
|
|
366
422
|
|
|
367
|
-
The software and release pipeline are production-oriented, but physical readiness is scope-specific and evidence-driven. The UR5e
|
|
423
|
+
The software and release pipeline are production-oriented, but physical readiness is scope-specific and evidence-driven. The UR5e task-specific reference-workcell path must pass the executable v0.12 ROS/Gazebo/MoveIt campaign on the target workstation before that scope is considered simulation-qualified there. Real robot execution remains locked. Functional-safety certification and site qualification are not claimed.
|
|
368
424
|
|
|
369
425
|
## Ownership
|
|
370
426
|
|
|
@@ -25,7 +25,7 @@ Core principles:
|
|
|
25
25
|
- **Deterministic verification** — task graphs, motion contracts, collision constraints, scene state, and promotion gates are checked outside the model.
|
|
26
26
|
- **Exact Twin binding** — physical motion is bound to a canonical Twin and immutable fingerprints rather than free-form model text.
|
|
27
27
|
- **Measured simulation** — supported ROS 2 / Gazebo / MoveIt paths collect runtime evidence instead of treating a generated plan as proof.
|
|
28
|
-
- **
|
|
28
|
+
- **No fake task visualization** — generic demo motion is never labeled as the requested BOX/source/destination task.
|
|
29
29
|
- **Real execution remains locked** — simulation success is not site qualification, functional-safety certification, or permission to run production hardware.
|
|
30
30
|
|
|
31
31
|
## Install
|
|
@@ -94,42 +94,79 @@ While the command runs, stage-by-stage progress is printed to `stderr` and the f
|
|
|
94
94
|
```text
|
|
95
95
|
[DevAgent + 0.00s] START provider=openai model=<model-id>
|
|
96
96
|
[DevAgent + 0.00s] INTERPRETER understanding engineering request
|
|
97
|
-
[DevAgent +
|
|
98
|
-
[DevAgent +
|
|
99
|
-
[DevAgent +
|
|
100
|
-
[DevAgent +
|
|
101
|
-
[DevAgent + 15.78s] COMPLETE ready_for_twin_simulation=true
|
|
97
|
+
[DevAgent + 4.20s] PLANNER revision=0 generating high-level task graph
|
|
98
|
+
[DevAgent + 10.30s] CRITIC revision=0 reviewing verified plan
|
|
99
|
+
[DevAgent + 13.10s] SIMULATION deterministic model execution completed
|
|
100
|
+
[DevAgent + 13.11s] COMPLETE ready_for_twin_simulation=true
|
|
102
101
|
```
|
|
103
102
|
|
|
104
103
|
Use `--quiet` when a script or CI job needs JSON without terminal progress.
|
|
105
104
|
|
|
106
|
-
##
|
|
105
|
+
## Task-specific visual simulation
|
|
107
106
|
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
To prove that the workstation can launch Gazebo / MoveIt and visibly move a UR5e, use the explicit visual demo:
|
|
107
|
+
For the supported v0.12 UR5e `load` scope, `--visualize` continues from the verified high-level task into a physical simulation path:
|
|
111
108
|
|
|
112
109
|
```bash
|
|
113
110
|
devagent-physical-ai engineer \
|
|
114
111
|
"Use a UR5e to load BOX_101 from conveyor_a to cnc_04. Simulate and verify the plan." \
|
|
115
112
|
--provider openai \
|
|
116
113
|
--model <model-id> \
|
|
117
|
-
--
|
|
114
|
+
--visualize
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
The current task-specific path uses the packaged `ur5e_reference_load_cell_v1` canonical workcell. The request identities remain exact (`BOX_101`, `conveyor_a`, `cnc_04`), while the reference source/destination poses, primitive geometry, nominal workpiece geometry, and reference tool are deterministic template facts rather than guessed customer-site facts.
|
|
118
|
+
|
|
119
|
+
The runtime then performs this bounded sequence:
|
|
120
|
+
|
|
121
|
+
```text
|
|
122
|
+
validated AI task graph
|
|
123
|
+
|
|
|
124
|
+
v
|
|
125
|
+
packaged canonical UR5e load Twin
|
|
126
|
+
|
|
|
127
|
+
v
|
|
128
|
+
Gazebo + MoveIt world materialization and read-back
|
|
129
|
+
|
|
|
130
|
+
v
|
|
131
|
+
MoveIt FK cross-check of reference pick/place targets
|
|
132
|
+
|
|
|
133
|
+
v
|
|
134
|
+
MoveIt joint-space plan for each physical phase
|
|
135
|
+
|
|
|
136
|
+
v
|
|
137
|
+
pre-pick -> pick -> attach BOX -> lift -> transfer -> place
|
|
138
|
+
|
|
|
139
|
+
v
|
|
140
|
+
BOX visually follows tool0 while attached in Gazebo
|
|
141
|
+
|
|
|
142
|
+
v
|
|
143
|
+
verified destination pose -> detach -> retract -> home
|
|
144
|
+
|
|
|
145
|
+
v
|
|
146
|
+
measured motion/evidence report
|
|
118
147
|
```
|
|
119
148
|
|
|
120
|
-
|
|
149
|
+
On a successful run, Gazebo / MoveIt remains open by default so the engineer can inspect the final workcell. Add `--close-after` to close it after success.
|
|
150
|
+
|
|
151
|
+
v0.12.1 hardens the initial ROS joint-state snapshot by parsing `ros2 topic echo --once` output as a YAML document stream. This accepts the normal ROS 2 trailing `---` message separator instead of incorrectly classifying an otherwise valid `/joint_states` sample as `joint_state_snapshot_invalid`.
|
|
152
|
+
|
|
153
|
+
The packaged reference workcell is **not customer-site geometry**. Arbitrary plant layouts require an imported or user-declared physical Twin with trusted poses, collision geometry, tool/TCP information, and workpiece properties. DevAgent does not invent those site facts from a natural-language prompt.
|
|
154
|
+
|
|
155
|
+
The v0.12 implementation remains evidence-gated: source/CI success does not prove the ROS target campaign has passed on a particular workstation. Use the executable qualification below before treating the task-specific path as qualified on that target.
|
|
156
|
+
|
|
157
|
+
### Visual stack demo
|
|
121
158
|
|
|
122
|
-
To
|
|
159
|
+
To test only that the workstation can launch Gazebo / MoveIt and visibly move a UR5e, without claiming that motion represents the requested BOX task, use:
|
|
123
160
|
|
|
124
161
|
```bash
|
|
125
162
|
devagent-physical-ai engineer \
|
|
126
163
|
"Use a UR5e to load BOX_101 from conveyor_a to cnc_04. Simulate and verify the plan." \
|
|
127
164
|
--provider openai \
|
|
128
165
|
--model <model-id> \
|
|
129
|
-
--
|
|
166
|
+
--visual-demo
|
|
130
167
|
```
|
|
131
168
|
|
|
132
|
-
|
|
169
|
+
`--visual-demo` is explicitly reported as `task_specific=false`.
|
|
133
170
|
|
|
134
171
|
## How it works
|
|
135
172
|
|
|
@@ -151,13 +188,13 @@ VERIFIED HIGH-LEVEL TASK GRAPH
|
|
|
151
188
|
CANONICAL PHYSICAL TWIN + IMMUTABLE HASH
|
|
152
189
|
|
|
|
153
190
|
v
|
|
154
|
-
|
|
191
|
+
MOVEIT-COMPILED PHYSICAL MOTION CONTRACTS
|
|
155
192
|
|
|
|
156
193
|
v
|
|
157
194
|
GAZEBO / MOVEIT MATERIALIZATION + READ-BACK
|
|
158
195
|
|
|
|
159
196
|
v
|
|
160
|
-
COLLISION /
|
|
197
|
+
COLLISION / TOOL / WORKPIECE VERIFICATION
|
|
161
198
|
|
|
|
162
199
|
v
|
|
163
200
|
ROS 2 SIMULATION + MEASURED RUNTIME EVIDENCE
|
|
@@ -171,6 +208,8 @@ REAL HARDWARE AUTHORIZATION REMAINS SEPARATELY LOCKED
|
|
|
171
208
|
|
|
172
209
|
The high-level AI task graph and the physical motion plan are not the same artifact. A `pick -> move -> place` graph is engineering intent. Gazebo execution requires a physically grounded Twin and compiled trajectory. This separation prevents an AI-generated task description from becoming an implicit motor command.
|
|
173
210
|
|
|
211
|
+
For a nominal low-risk `load` simulation, the Critic remains advisory after deterministic compilation and verification. If it repeatedly requests subjective revisions but never rejects the plan, DevAgent may use a bounded deterministic advisory fallback after the revision budget is exhausted. A Critic `REJECT`, deterministic violation, higher-risk qualification/commissioning intent, fault injection, physical variation, or explicit engineering threshold still blocks that fallback.
|
|
212
|
+
|
|
174
213
|
## General architecture
|
|
175
214
|
|
|
176
215
|
The architecture has three authority layers:
|
|
@@ -219,9 +258,9 @@ This plain-text diagram is intentionally used instead of Mermaid so the same REA
|
|
|
219
258
|
|
|
220
259
|
The canonical Twin records robot identity, frames, source/destination entities, workpiece, tool, geometry, physics evidence, controller metadata, uncertainty, and provenance. Unknown physical information remains unknown rather than being filled with AI guesses.
|
|
221
260
|
|
|
222
|
-
|
|
261
|
+
The UR5e canonical adapter can bind one materialization to Gazebo and MoveIt, verify world/scene read-back, apply a runtime-owned tool collision object, verify workpiece attach/detach transitions, execute compiled joint trajectories, record joint states, and compute MoveIt FK metrics.
|
|
223
262
|
|
|
224
|
-
A stronger pre-execution receipt requires evidence such as:
|
|
263
|
+
The stronger production-candidate verifier can additionally use measured collision distance and conservative continuous-path clearance proof. A stronger pre-execution receipt requires evidence such as:
|
|
225
264
|
|
|
226
265
|
```text
|
|
227
266
|
verified=true
|
|
@@ -243,7 +282,7 @@ The deterministic robot-profile layer includes abstractions for:
|
|
|
243
282
|
- KUKA KR family
|
|
244
283
|
- ABB IRB family
|
|
245
284
|
|
|
246
|
-
Physical simulation and qualification are adapter- and vendor-specific.
|
|
285
|
+
Physical simulation and qualification are adapter- and vendor-specific. The v0.12 task-specific visible `load` runtime is UR5e-specific. A profile existing in the registry does not imply equivalent physical qualification for every vendor.
|
|
247
286
|
|
|
248
287
|
## ROS 2 / Gazebo reference target
|
|
249
288
|
|
|
@@ -269,7 +308,22 @@ devagent-physical ros demo
|
|
|
269
308
|
devagent-physical ros qualify-trajectory-runtime
|
|
270
309
|
```
|
|
271
310
|
|
|
272
|
-
|
|
311
|
+
Run the v0.12 task-specific target qualification:
|
|
312
|
+
|
|
313
|
+
```bash
|
|
314
|
+
python -m devagent_physical_engine.ros2.qualification_v12
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
This must visibly execute the reference task and produce a passing report before the target workstation's v0.12 task-specific ROS simulation is considered qualified. It still intentionally reports:
|
|
318
|
+
|
|
319
|
+
```text
|
|
320
|
+
physical_qualification=false
|
|
321
|
+
commissioning_qualification=false
|
|
322
|
+
site_qualification=false
|
|
323
|
+
real_execution_allowed=false
|
|
324
|
+
```
|
|
325
|
+
|
|
326
|
+
For the stronger continuous-clearance production-candidate campaign:
|
|
273
327
|
|
|
274
328
|
```bash
|
|
275
329
|
python -m devagent_physical_engine.ros2.qualification_v11 \
|
|
@@ -299,6 +353,8 @@ Provider qualification uses API credits and verifies the bounded Interpreter / P
|
|
|
299
353
|
|
|
300
354
|
Repository CI verifies Python 3.11, 3.12, and 3.13, Ruff correctness, branch coverage, package build, clean wheel installation, and runtime dependency vulnerability audit.
|
|
301
355
|
|
|
356
|
+
ROS/Gazebo/MoveIt executable orchestration is separately target-qualified because hosted Python CI cannot truthfully exercise a graphical Gazebo process, MoveIt `move_group`, TF, ROS controllers, and Gazebo services. Pure reference-workcell contracts and deterministic planning logic remain covered by normal unit/coverage gates.
|
|
357
|
+
|
|
302
358
|
A green `main` release is tied to the exact CI-tested commit. Release artifacts are rebuilt and verified from the exact tag, checked with Twine, installed into a clean environment, accompanied by SHA256 checksums and an SBOM, attached to the GitHub Release, and published to PyPI through Trusted Publishing.
|
|
303
359
|
|
|
304
360
|
## Documentation
|
|
@@ -321,9 +377,9 @@ Detailed engineering documentation lives in the repository:
|
|
|
321
377
|
|
|
322
378
|
## Project status
|
|
323
379
|
|
|
324
|
-
**v0.
|
|
380
|
+
**v0.12.1 — Beta software / evidence-gated task-specific physical simulation.**
|
|
325
381
|
|
|
326
|
-
The software and release pipeline are production-oriented, but physical readiness is scope-specific and evidence-driven. The UR5e
|
|
382
|
+
The software and release pipeline are production-oriented, but physical readiness is scope-specific and evidence-driven. The UR5e task-specific reference-workcell path must pass the executable v0.12 ROS/Gazebo/MoveIt campaign on the target workstation before that scope is considered simulation-qualified there. Real robot execution remains locked. Functional-safety certification and site qualification are not claimed.
|
|
327
383
|
|
|
328
384
|
## Ownership
|
|
329
385
|
|
|
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "devagent-physical-engine"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.12.1"
|
|
8
8
|
description = "Verification-first agentic engineering, simulation, and evidence runtime for robotics and industrial automation."
|
|
9
9
|
readme = { file = "README.md", content-type = "text/markdown" }
|
|
10
10
|
requires-python = ">=3.11"
|
|
@@ -57,14 +57,22 @@ where = ["src"]
|
|
|
57
57
|
branch = true
|
|
58
58
|
source = ["devagent_physical_engine"]
|
|
59
59
|
omit = [
|
|
60
|
-
# ROS
|
|
61
|
-
# Gazebo/MoveIt environment.
|
|
62
|
-
# pretending hosted unit
|
|
60
|
+
# ROS probes and executable target-stack orchestration require a real ROS/Jazzy/
|
|
61
|
+
# Gazebo/MoveIt environment. v0.12 task-specific runtime code is qualified by the
|
|
62
|
+
# executable qualification_v12 campaign rather than pretending hosted unit CI can
|
|
63
|
+
# exercise a graphical simulator, move_group, TF, controller actions, or gz services.
|
|
64
|
+
# Pure contracts/reference-workcell logic remains inside the hosted coverage gate.
|
|
63
65
|
"src/devagent_physical_engine/ros2/*_probe.py",
|
|
64
66
|
"src/devagent_physical_engine/ros2/qualification*.py",
|
|
65
67
|
"src/devagent_physical_engine/ros2/joint_state_recorder.py",
|
|
66
68
|
"src/devagent_physical_engine/ros2/ur5e_adapter.py",
|
|
67
69
|
"src/devagent_physical_engine/ros2/ur5e_v10_adapter.py",
|
|
70
|
+
"src/devagent_physical_engine/ros2/task_*.py",
|
|
71
|
+
"src/devagent_physical_engine/ros2/moveit_task_planner.py",
|
|
72
|
+
"src/devagent_physical_engine/ros2/fk_pose.py",
|
|
73
|
+
"src/devagent_physical_engine/ros2/gazebo_pose.py",
|
|
74
|
+
"src/devagent_physical_engine/ros2/workpiece_follow.py",
|
|
75
|
+
"src/devagent_physical_engine/ros2/workpiece_gazebo_follower.py",
|
|
68
76
|
]
|
|
69
77
|
|
|
70
78
|
[tool.coverage.report]
|
|
@@ -23,10 +23,18 @@ class VerifiedPlanArtifact:
|
|
|
23
23
|
planner_evidence: tuple[AgentEvidence, ...]
|
|
24
24
|
critic_evidence: tuple[AgentEvidence, ...]
|
|
25
25
|
revision_rounds: int
|
|
26
|
+
acceptance_basis: str = "critic_accept"
|
|
26
27
|
|
|
27
28
|
|
|
28
29
|
class PlanningCoordinator:
|
|
29
|
-
"""Planner/critic loop with bounded revisions and deterministic plan proof.
|
|
30
|
+
"""Planner/critic loop with bounded revisions and deterministic plan proof.
|
|
31
|
+
|
|
32
|
+
The critic is advisory. A caller may explicitly allow a deterministic fallback for
|
|
33
|
+
a bounded low-risk simulation scope. That fallback is never used after REJECT and
|
|
34
|
+
never replaces deterministic graph verification; it only prevents subjective
|
|
35
|
+
critic scoring from randomly blocking a graph that the deterministic compiler and
|
|
36
|
+
verifier already proved structurally/safely admissible for that scope.
|
|
37
|
+
"""
|
|
30
38
|
|
|
31
39
|
def __init__(
|
|
32
40
|
self,
|
|
@@ -55,10 +63,13 @@ class PlanningCoordinator:
|
|
|
55
63
|
*,
|
|
56
64
|
engineering_context: Mapping[str, Any] | None = None,
|
|
57
65
|
progress: ProgressCallback | None = None,
|
|
66
|
+
allow_deterministic_advisory_fallback: bool = False,
|
|
58
67
|
) -> VerifiedPlanArtifact:
|
|
59
68
|
feedback: tuple[str, ...] = ()
|
|
60
69
|
planner_evidence: list[AgentEvidence] = []
|
|
61
70
|
critic_evidence: list[AgentEvidence] = []
|
|
71
|
+
last_graph: TaskGraph | None = None
|
|
72
|
+
last_revision = 0
|
|
62
73
|
|
|
63
74
|
for revision in range(self.max_revision_rounds + 1):
|
|
64
75
|
if progress is not None:
|
|
@@ -75,6 +86,8 @@ class PlanningCoordinator:
|
|
|
75
86
|
engineering_context=engineering_context,
|
|
76
87
|
)
|
|
77
88
|
planner_evidence.append(planned.evidence)
|
|
89
|
+
last_graph = planned.graph
|
|
90
|
+
last_revision = revision
|
|
78
91
|
if progress is not None:
|
|
79
92
|
progress(
|
|
80
93
|
"PLANNER",
|
|
@@ -118,6 +131,7 @@ class PlanningCoordinator:
|
|
|
118
131
|
planner_evidence=tuple(planner_evidence),
|
|
119
132
|
critic_evidence=tuple(critic_evidence),
|
|
120
133
|
revision_rounds=revision,
|
|
134
|
+
acceptance_basis="critic_accept",
|
|
121
135
|
)
|
|
122
136
|
|
|
123
137
|
if reviewed.critique.decision is CriticDecision.REJECT:
|
|
@@ -142,6 +156,21 @@ class PlanningCoordinator:
|
|
|
142
156
|
f"revision={revision} requires another planning round",
|
|
143
157
|
)
|
|
144
158
|
|
|
159
|
+
if allow_deterministic_advisory_fallback and last_graph is not None:
|
|
160
|
+
if progress is not None:
|
|
161
|
+
progress(
|
|
162
|
+
"PLANNING",
|
|
163
|
+
"advisory revision budget exhausted; accepting deterministic-valid low-risk simulation plan",
|
|
164
|
+
)
|
|
165
|
+
return VerifiedPlanArtifact(
|
|
166
|
+
graph=last_graph,
|
|
167
|
+
graph_hash=task_graph_hash(last_graph),
|
|
168
|
+
planner_evidence=tuple(planner_evidence),
|
|
169
|
+
critic_evidence=tuple(critic_evidence),
|
|
170
|
+
revision_rounds=last_revision,
|
|
171
|
+
acceptance_basis="deterministic_low_risk_advisory_fallback",
|
|
172
|
+
)
|
|
173
|
+
|
|
145
174
|
if progress is not None:
|
|
146
175
|
progress("PLANNING", "revision budget exhausted")
|
|
147
176
|
raise PlanningCoordinationError("revision_budget_exhausted")
|