devagent-physical-engine 0.11.6__tar.gz → 0.12.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-0.11.6/src/devagent_physical_engine.egg-info → devagent_physical_engine-0.12.0}/PKG-INFO +78 -24
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/README.md +77 -23
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/pyproject.toml +12 -4
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/__init__.py +1 -1
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/agent/coordinator.py +30 -1
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ai_cli.py +64 -41
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/engineering_agent.py +23 -15
- devagent_physical_engine-0.12.0/src/devagent_physical_engine/reference_workcell.py +271 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/__init__.py +3 -0
- devagent_physical_engine-0.12.0/src/devagent_physical_engine/ros2/fk_pose.py +91 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/fk_probe.py +21 -5
- devagent_physical_engine-0.12.0/src/devagent_physical_engine/ros2/gazebo_pose.py +104 -0
- devagent_physical_engine-0.12.0/src/devagent_physical_engine/ros2/moveit_joint_plan_probe.py +159 -0
- devagent_physical_engine-0.12.0/src/devagent_physical_engine/ros2/moveit_task_planner.py +139 -0
- devagent_physical_engine-0.12.0/src/devagent_physical_engine/ros2/qualification_v12.py +97 -0
- devagent_physical_engine-0.12.0/src/devagent_physical_engine/ros2/task_adapter.py +52 -0
- devagent_physical_engine-0.12.0/src/devagent_physical_engine/ros2/task_visualization.py +325 -0
- devagent_physical_engine-0.12.0/src/devagent_physical_engine/ros2/workpiece_follow.py +107 -0
- devagent_physical_engine-0.12.0/src/devagent_physical_engine/ros2/workpiece_gazebo_follower.py +218 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/workpiece_scene.py +26 -2
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0/src/devagent_physical_engine.egg-info}/PKG-INFO +78 -24
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine.egg-info/SOURCES.txt +12 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_ai_cli.py +66 -22
- devagent_physical_engine-0.12.0/tests/test_planning_fallback_v012.py +165 -0
- devagent_physical_engine-0.12.0/tests/test_reference_workcell_v012.py +152 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/NOTICE +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/setup.cfg +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/agent/__init__.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/agent/compiler.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/agent/contracts.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/agent/critic.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/agent/evidence.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/agent/interpreter.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/agent/planner.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/agent/recovery.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/agent/routing.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/agent/runtime.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/agent/semantic.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/agent/structured.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/cli.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/continuous_clearance.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/doctor.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/engineering_request.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/execution.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/models.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/operating_envelope.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/optimization/__init__.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/optimization/benchmark.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/optimization/candidates.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/optimization/contracts.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/optimization/evaluator.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/optimization/evidence.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/optimization/experience.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/optimization/measured.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/optimization/optimizer.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/optimization/orchestrator.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/physical_campaign.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/physical_evidence.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/physical_motion.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/planning.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/preexecution_contract.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/provider_adapters/__init__.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/provider_adapters/anthropic.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/provider_adapters/common.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/provider_adapters/factory.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/provider_adapters/gemini.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/provider_adapters/openai.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/provider_qualification.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/providers.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/qualification.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/qualification_cli.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/qualification_harness.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/robot_platform.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/robots.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/acceptance.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/commands.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/continuous_clearance_probe.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/doctor.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/frame_alignment.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/gazebo_world.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/joint_state_recorder.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/measured_motion.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/moveit_scene.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/preexecution.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/qualification.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/qualification_v10.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/qualification_v11.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/scene_probe.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/state_validity_probe.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/tf_probe.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/tool_scene.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/tool_scene_probe.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/trajectory.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/ur5e.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/ur5e_adapter.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/ur5e_v10_adapter.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/workpiece_scene_probe.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/setup_profile.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/sim_real_qualification.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/simulation.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/simulation_platform.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/tool_collision.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/trajectory_qualification.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/twin.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/twin_builder.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/twin_materialization.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/verification.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/workpiece_lifecycle.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine.egg-info/dependency_links.txt +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine.egg-info/entry_points.txt +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine.egg-info/requires.txt +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine.egg-info/top_level.txt +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_agent_core.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_agent_semantic_hardening.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_ai_cli_v07.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_continuous_clearance_v011.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_core.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_engineering_request_v07.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_interpreter_profiles_v08.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_live_provider_qualification.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_measured_motion_v10.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_natural_language_agent_v07.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_openai_strict_schema_v0113.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_optimization_v05.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_physical_campaign_v09.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_physical_evidence_v09.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_physical_motion_v09.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_preexecution_contract_v10.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_provider_and_qualification.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_qualification_cli_lifecycle_v06.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_qualification_harness_v06.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_readme_pypi.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_real_provider_adapters.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_robot_platform_v08.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_ros2_production_receipts_v011.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_ros2_simulation.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_ros_trajectory_v09.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_setup_profile.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_sim_real_qualification_v011.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_simulation_platform_v08.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_tool_collision_v011.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_trajectory_qualification_v09.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_twin_materialization_v10.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_twin_v08.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_ur5e_adapter_scopes_v09.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_ur5e_v10_adapter_scopes.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_v052_stabilization.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_v08_catalog_mapping_regression.py +0 -0
- {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/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.0
|
|
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,77 @@ 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
|
+
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.
|
|
162
193
|
|
|
163
|
-
|
|
194
|
+
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.
|
|
195
|
+
|
|
196
|
+
### Visual stack demo
|
|
197
|
+
|
|
198
|
+
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
199
|
|
|
165
200
|
```bash
|
|
166
201
|
devagent-physical-ai engineer \
|
|
167
202
|
"Use a UR5e to load BOX_101 from conveyor_a to cnc_04. Simulate and verify the plan." \
|
|
168
203
|
--provider openai \
|
|
169
204
|
--model <model-id> \
|
|
170
|
-
--
|
|
205
|
+
--visual-demo
|
|
171
206
|
```
|
|
172
207
|
|
|
173
|
-
|
|
208
|
+
`--visual-demo` is explicitly reported as `task_specific=false`.
|
|
174
209
|
|
|
175
210
|
## How it works
|
|
176
211
|
|
|
@@ -192,13 +227,13 @@ VERIFIED HIGH-LEVEL TASK GRAPH
|
|
|
192
227
|
CANONICAL PHYSICAL TWIN + IMMUTABLE HASH
|
|
193
228
|
|
|
|
194
229
|
v
|
|
195
|
-
|
|
230
|
+
MOVEIT-COMPILED PHYSICAL MOTION CONTRACTS
|
|
196
231
|
|
|
|
197
232
|
v
|
|
198
233
|
GAZEBO / MOVEIT MATERIALIZATION + READ-BACK
|
|
199
234
|
|
|
|
200
235
|
v
|
|
201
|
-
COLLISION /
|
|
236
|
+
COLLISION / TOOL / WORKPIECE VERIFICATION
|
|
202
237
|
|
|
|
203
238
|
v
|
|
204
239
|
ROS 2 SIMULATION + MEASURED RUNTIME EVIDENCE
|
|
@@ -212,6 +247,8 @@ REAL HARDWARE AUTHORIZATION REMAINS SEPARATELY LOCKED
|
|
|
212
247
|
|
|
213
248
|
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
249
|
|
|
250
|
+
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.
|
|
251
|
+
|
|
215
252
|
## General architecture
|
|
216
253
|
|
|
217
254
|
The architecture has three authority layers:
|
|
@@ -260,9 +297,9 @@ This plain-text diagram is intentionally used instead of Mermaid so the same REA
|
|
|
260
297
|
|
|
261
298
|
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
299
|
|
|
263
|
-
|
|
300
|
+
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
301
|
|
|
265
|
-
A stronger pre-execution receipt requires evidence such as:
|
|
302
|
+
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
303
|
|
|
267
304
|
```text
|
|
268
305
|
verified=true
|
|
@@ -284,7 +321,7 @@ The deterministic robot-profile layer includes abstractions for:
|
|
|
284
321
|
- KUKA KR family
|
|
285
322
|
- ABB IRB family
|
|
286
323
|
|
|
287
|
-
Physical simulation and qualification are adapter- and vendor-specific.
|
|
324
|
+
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
325
|
|
|
289
326
|
## ROS 2 / Gazebo reference target
|
|
290
327
|
|
|
@@ -310,7 +347,22 @@ devagent-physical ros demo
|
|
|
310
347
|
devagent-physical ros qualify-trajectory-runtime
|
|
311
348
|
```
|
|
312
349
|
|
|
313
|
-
|
|
350
|
+
Run the v0.12 task-specific target qualification:
|
|
351
|
+
|
|
352
|
+
```bash
|
|
353
|
+
python -m devagent_physical_engine.ros2.qualification_v12
|
|
354
|
+
```
|
|
355
|
+
|
|
356
|
+
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:
|
|
357
|
+
|
|
358
|
+
```text
|
|
359
|
+
physical_qualification=false
|
|
360
|
+
commissioning_qualification=false
|
|
361
|
+
site_qualification=false
|
|
362
|
+
real_execution_allowed=false
|
|
363
|
+
```
|
|
364
|
+
|
|
365
|
+
For the stronger continuous-clearance production-candidate campaign:
|
|
314
366
|
|
|
315
367
|
```bash
|
|
316
368
|
python -m devagent_physical_engine.ros2.qualification_v11 \
|
|
@@ -340,6 +392,8 @@ Provider qualification uses API credits and verifies the bounded Interpreter / P
|
|
|
340
392
|
|
|
341
393
|
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
394
|
|
|
395
|
+
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.
|
|
396
|
+
|
|
343
397
|
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
398
|
|
|
345
399
|
## Documentation
|
|
@@ -362,9 +416,9 @@ Detailed engineering documentation lives in the repository:
|
|
|
362
416
|
|
|
363
417
|
## Project status
|
|
364
418
|
|
|
365
|
-
**v0.
|
|
419
|
+
**v0.12.0 — Beta software / evidence-gated task-specific physical simulation.**
|
|
366
420
|
|
|
367
|
-
The software and release pipeline are production-oriented, but physical readiness is scope-specific and evidence-driven. The UR5e
|
|
421
|
+
The software and release pipeline are production-oriented, but physical readiness is scope-specific and evidence-driven. The new 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
422
|
|
|
369
423
|
## Ownership
|
|
370
424
|
|
|
@@ -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,77 @@ 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
|
+
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.
|
|
121
152
|
|
|
122
|
-
|
|
153
|
+
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.
|
|
154
|
+
|
|
155
|
+
### Visual stack demo
|
|
156
|
+
|
|
157
|
+
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
158
|
|
|
124
159
|
```bash
|
|
125
160
|
devagent-physical-ai engineer \
|
|
126
161
|
"Use a UR5e to load BOX_101 from conveyor_a to cnc_04. Simulate and verify the plan." \
|
|
127
162
|
--provider openai \
|
|
128
163
|
--model <model-id> \
|
|
129
|
-
--
|
|
164
|
+
--visual-demo
|
|
130
165
|
```
|
|
131
166
|
|
|
132
|
-
|
|
167
|
+
`--visual-demo` is explicitly reported as `task_specific=false`.
|
|
133
168
|
|
|
134
169
|
## How it works
|
|
135
170
|
|
|
@@ -151,13 +186,13 @@ VERIFIED HIGH-LEVEL TASK GRAPH
|
|
|
151
186
|
CANONICAL PHYSICAL TWIN + IMMUTABLE HASH
|
|
152
187
|
|
|
|
153
188
|
v
|
|
154
|
-
|
|
189
|
+
MOVEIT-COMPILED PHYSICAL MOTION CONTRACTS
|
|
155
190
|
|
|
|
156
191
|
v
|
|
157
192
|
GAZEBO / MOVEIT MATERIALIZATION + READ-BACK
|
|
158
193
|
|
|
|
159
194
|
v
|
|
160
|
-
COLLISION /
|
|
195
|
+
COLLISION / TOOL / WORKPIECE VERIFICATION
|
|
161
196
|
|
|
|
162
197
|
v
|
|
163
198
|
ROS 2 SIMULATION + MEASURED RUNTIME EVIDENCE
|
|
@@ -171,6 +206,8 @@ REAL HARDWARE AUTHORIZATION REMAINS SEPARATELY LOCKED
|
|
|
171
206
|
|
|
172
207
|
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
208
|
|
|
209
|
+
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.
|
|
210
|
+
|
|
174
211
|
## General architecture
|
|
175
212
|
|
|
176
213
|
The architecture has three authority layers:
|
|
@@ -219,9 +256,9 @@ This plain-text diagram is intentionally used instead of Mermaid so the same REA
|
|
|
219
256
|
|
|
220
257
|
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
258
|
|
|
222
|
-
|
|
259
|
+
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
260
|
|
|
224
|
-
A stronger pre-execution receipt requires evidence such as:
|
|
261
|
+
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
262
|
|
|
226
263
|
```text
|
|
227
264
|
verified=true
|
|
@@ -243,7 +280,7 @@ The deterministic robot-profile layer includes abstractions for:
|
|
|
243
280
|
- KUKA KR family
|
|
244
281
|
- ABB IRB family
|
|
245
282
|
|
|
246
|
-
Physical simulation and qualification are adapter- and vendor-specific.
|
|
283
|
+
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
284
|
|
|
248
285
|
## ROS 2 / Gazebo reference target
|
|
249
286
|
|
|
@@ -269,7 +306,22 @@ devagent-physical ros demo
|
|
|
269
306
|
devagent-physical ros qualify-trajectory-runtime
|
|
270
307
|
```
|
|
271
308
|
|
|
272
|
-
|
|
309
|
+
Run the v0.12 task-specific target qualification:
|
|
310
|
+
|
|
311
|
+
```bash
|
|
312
|
+
python -m devagent_physical_engine.ros2.qualification_v12
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
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:
|
|
316
|
+
|
|
317
|
+
```text
|
|
318
|
+
physical_qualification=false
|
|
319
|
+
commissioning_qualification=false
|
|
320
|
+
site_qualification=false
|
|
321
|
+
real_execution_allowed=false
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
For the stronger continuous-clearance production-candidate campaign:
|
|
273
325
|
|
|
274
326
|
```bash
|
|
275
327
|
python -m devagent_physical_engine.ros2.qualification_v11 \
|
|
@@ -299,6 +351,8 @@ Provider qualification uses API credits and verifies the bounded Interpreter / P
|
|
|
299
351
|
|
|
300
352
|
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
353
|
|
|
354
|
+
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.
|
|
355
|
+
|
|
302
356
|
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
357
|
|
|
304
358
|
## Documentation
|
|
@@ -321,9 +375,9 @@ Detailed engineering documentation lives in the repository:
|
|
|
321
375
|
|
|
322
376
|
## Project status
|
|
323
377
|
|
|
324
|
-
**v0.
|
|
378
|
+
**v0.12.0 — Beta software / evidence-gated task-specific physical simulation.**
|
|
325
379
|
|
|
326
|
-
The software and release pipeline are production-oriented, but physical readiness is scope-specific and evidence-driven. The UR5e
|
|
380
|
+
The software and release pipeline are production-oriented, but physical readiness is scope-specific and evidence-driven. The new 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
381
|
|
|
328
382
|
## Ownership
|
|
329
383
|
|
|
@@ -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.0"
|
|
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")
|