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.
Files changed (149) hide show
  1. {devagent_physical_engine-0.11.6/src/devagent_physical_engine.egg-info → devagent_physical_engine-0.12.0}/PKG-INFO +78 -24
  2. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/README.md +77 -23
  3. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/pyproject.toml +12 -4
  4. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/__init__.py +1 -1
  5. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/agent/coordinator.py +30 -1
  6. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ai_cli.py +64 -41
  7. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/engineering_agent.py +23 -15
  8. devagent_physical_engine-0.12.0/src/devagent_physical_engine/reference_workcell.py +271 -0
  9. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/__init__.py +3 -0
  10. devagent_physical_engine-0.12.0/src/devagent_physical_engine/ros2/fk_pose.py +91 -0
  11. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/fk_probe.py +21 -5
  12. devagent_physical_engine-0.12.0/src/devagent_physical_engine/ros2/gazebo_pose.py +104 -0
  13. devagent_physical_engine-0.12.0/src/devagent_physical_engine/ros2/moveit_joint_plan_probe.py +159 -0
  14. devagent_physical_engine-0.12.0/src/devagent_physical_engine/ros2/moveit_task_planner.py +139 -0
  15. devagent_physical_engine-0.12.0/src/devagent_physical_engine/ros2/qualification_v12.py +97 -0
  16. devagent_physical_engine-0.12.0/src/devagent_physical_engine/ros2/task_adapter.py +52 -0
  17. devagent_physical_engine-0.12.0/src/devagent_physical_engine/ros2/task_visualization.py +325 -0
  18. devagent_physical_engine-0.12.0/src/devagent_physical_engine/ros2/workpiece_follow.py +107 -0
  19. devagent_physical_engine-0.12.0/src/devagent_physical_engine/ros2/workpiece_gazebo_follower.py +218 -0
  20. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/workpiece_scene.py +26 -2
  21. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0/src/devagent_physical_engine.egg-info}/PKG-INFO +78 -24
  22. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine.egg-info/SOURCES.txt +12 -0
  23. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_ai_cli.py +66 -22
  24. devagent_physical_engine-0.12.0/tests/test_planning_fallback_v012.py +165 -0
  25. devagent_physical_engine-0.12.0/tests/test_reference_workcell_v012.py +152 -0
  26. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/NOTICE +0 -0
  27. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/setup.cfg +0 -0
  28. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/agent/__init__.py +0 -0
  29. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/agent/compiler.py +0 -0
  30. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/agent/contracts.py +0 -0
  31. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/agent/critic.py +0 -0
  32. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/agent/evidence.py +0 -0
  33. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/agent/interpreter.py +0 -0
  34. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/agent/planner.py +0 -0
  35. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/agent/recovery.py +0 -0
  36. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/agent/routing.py +0 -0
  37. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/agent/runtime.py +0 -0
  38. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/agent/semantic.py +0 -0
  39. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/agent/structured.py +0 -0
  40. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/cli.py +0 -0
  41. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/continuous_clearance.py +0 -0
  42. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/doctor.py +0 -0
  43. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/engineering_request.py +0 -0
  44. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/execution.py +0 -0
  45. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/models.py +0 -0
  46. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/operating_envelope.py +0 -0
  47. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/optimization/__init__.py +0 -0
  48. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/optimization/benchmark.py +0 -0
  49. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/optimization/candidates.py +0 -0
  50. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/optimization/contracts.py +0 -0
  51. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/optimization/evaluator.py +0 -0
  52. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/optimization/evidence.py +0 -0
  53. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/optimization/experience.py +0 -0
  54. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/optimization/measured.py +0 -0
  55. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/optimization/optimizer.py +0 -0
  56. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/optimization/orchestrator.py +0 -0
  57. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/physical_campaign.py +0 -0
  58. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/physical_evidence.py +0 -0
  59. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/physical_motion.py +0 -0
  60. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/planning.py +0 -0
  61. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/preexecution_contract.py +0 -0
  62. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/provider_adapters/__init__.py +0 -0
  63. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/provider_adapters/anthropic.py +0 -0
  64. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/provider_adapters/common.py +0 -0
  65. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/provider_adapters/factory.py +0 -0
  66. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/provider_adapters/gemini.py +0 -0
  67. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/provider_adapters/openai.py +0 -0
  68. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/provider_qualification.py +0 -0
  69. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/providers.py +0 -0
  70. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/qualification.py +0 -0
  71. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/qualification_cli.py +0 -0
  72. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/qualification_harness.py +0 -0
  73. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/robot_platform.py +0 -0
  74. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/robots.py +0 -0
  75. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/acceptance.py +0 -0
  76. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/commands.py +0 -0
  77. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/continuous_clearance_probe.py +0 -0
  78. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/doctor.py +0 -0
  79. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/frame_alignment.py +0 -0
  80. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/gazebo_world.py +0 -0
  81. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/joint_state_recorder.py +0 -0
  82. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/measured_motion.py +0 -0
  83. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/moveit_scene.py +0 -0
  84. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/preexecution.py +0 -0
  85. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/qualification.py +0 -0
  86. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/qualification_v10.py +0 -0
  87. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/qualification_v11.py +0 -0
  88. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/scene_probe.py +0 -0
  89. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/state_validity_probe.py +0 -0
  90. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/tf_probe.py +0 -0
  91. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/tool_scene.py +0 -0
  92. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/tool_scene_probe.py +0 -0
  93. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/trajectory.py +0 -0
  94. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/ur5e.py +0 -0
  95. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/ur5e_adapter.py +0 -0
  96. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/ur5e_v10_adapter.py +0 -0
  97. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/ros2/workpiece_scene_probe.py +0 -0
  98. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/setup_profile.py +0 -0
  99. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/sim_real_qualification.py +0 -0
  100. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/simulation.py +0 -0
  101. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/simulation_platform.py +0 -0
  102. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/tool_collision.py +0 -0
  103. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/trajectory_qualification.py +0 -0
  104. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/twin.py +0 -0
  105. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/twin_builder.py +0 -0
  106. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/twin_materialization.py +0 -0
  107. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/verification.py +0 -0
  108. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine/workpiece_lifecycle.py +0 -0
  109. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine.egg-info/dependency_links.txt +0 -0
  110. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine.egg-info/entry_points.txt +0 -0
  111. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine.egg-info/requires.txt +0 -0
  112. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/src/devagent_physical_engine.egg-info/top_level.txt +0 -0
  113. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_agent_core.py +0 -0
  114. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_agent_semantic_hardening.py +0 -0
  115. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_ai_cli_v07.py +0 -0
  116. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_continuous_clearance_v011.py +0 -0
  117. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_core.py +0 -0
  118. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_engineering_request_v07.py +0 -0
  119. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_interpreter_profiles_v08.py +0 -0
  120. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_live_provider_qualification.py +0 -0
  121. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_measured_motion_v10.py +0 -0
  122. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_natural_language_agent_v07.py +0 -0
  123. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_openai_strict_schema_v0113.py +0 -0
  124. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_optimization_v05.py +0 -0
  125. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_physical_campaign_v09.py +0 -0
  126. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_physical_evidence_v09.py +0 -0
  127. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_physical_motion_v09.py +0 -0
  128. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_preexecution_contract_v10.py +0 -0
  129. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_provider_and_qualification.py +0 -0
  130. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_qualification_cli_lifecycle_v06.py +0 -0
  131. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_qualification_harness_v06.py +0 -0
  132. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_readme_pypi.py +0 -0
  133. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_real_provider_adapters.py +0 -0
  134. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_robot_platform_v08.py +0 -0
  135. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_ros2_production_receipts_v011.py +0 -0
  136. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_ros2_simulation.py +0 -0
  137. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_ros_trajectory_v09.py +0 -0
  138. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_setup_profile.py +0 -0
  139. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_sim_real_qualification_v011.py +0 -0
  140. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_simulation_platform_v08.py +0 -0
  141. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_tool_collision_v011.py +0 -0
  142. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_trajectory_qualification_v09.py +0 -0
  143. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_twin_materialization_v10.py +0 -0
  144. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_twin_v08.py +0 -0
  145. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_ur5e_adapter_scopes_v09.py +0 -0
  146. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_ur5e_v10_adapter_scopes.py +0 -0
  147. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_v052_stabilization.py +0 -0
  148. {devagent_physical_engine-0.11.6 → devagent_physical_engine-0.12.0}/tests/test_v08_catalog_mapping_regression.py +0 -0
  149. {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.11.6
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
- - **Fail-closed visualization** — DevAgent never substitutes a canned motion and labels it as the requested task.
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 + 6.84s] INTERPRETER validated request_id=REQ-...
139
- [DevAgent + 6.84s] PLANNER revision=0 generating high-level task graph
140
- [DevAgent + 12.21s] CRITIC revision=0 reviewing verified plan
141
- [DevAgent + 15.77s] SIMULATION running deterministic model execution
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
- ## Visual simulation
146
+ ## Task-specific visual simulation
148
147
 
149
- There are two deliberately different visualization modes.
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
- --visual-demo
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
- `--visual-demo` runs the packaged UR5e motion smoke through the ROS simulation stack. It is intentionally reported as `task_specific=false`; it proves the visualization/motion stack is working, not that the exact BOX task has been physically planned.
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
- To request visualization of the **exact engineering task**, use:
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
- --visualize
205
+ --visual-demo
171
206
  ```
172
207
 
173
- Task-specific visualization fails closed until the runtime has enough physical evidence to construct the exact scene and compile an exact `PhysicalMotionPlan`. Required evidence includes robot/source/destination poses, collision geometry, workpiece geometry, tool/TCP information, and the compiled physical motion. DevAgent will not display an unrelated canned movement and call it the requested task.
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
- EXACT PHYSICAL MOTION CONTRACT
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 / CLEARANCE / TOOL / WORKPIECE VERIFICATION
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
- For production-candidate UR5e simulation, the stronger verifier can use MoveIt PlanningScene read-back, runtime-owned tool collision binding, runtime-owned workpiece attach/detach transitions, measured collision distance, conservative continuous-path clearance proof, measured joint states, and MoveIt FK evidence.
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. Current production-candidate physical-runtime work is centered on the UR5e ROS 2 / Gazebo / MoveIt path; a profile existing in the registry does not imply equivalent physical qualification for every vendor.
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
- For the stronger production-candidate target campaign:
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.11.6 — Beta software / evidence-gated physical runtime.**
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 physical simulation path remains experimental until its exact target-stack qualification campaign passes. Real robot execution remains locked. Functional-safety certification and site qualification are not claimed.
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
- - **Fail-closed visualization** — DevAgent never substitutes a canned motion and labels it as the requested task.
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 + 6.84s] INTERPRETER validated request_id=REQ-...
98
- [DevAgent + 6.84s] PLANNER revision=0 generating high-level task graph
99
- [DevAgent + 12.21s] CRITIC revision=0 reviewing verified plan
100
- [DevAgent + 15.77s] SIMULATION running deterministic model execution
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
- ## Visual simulation
105
+ ## Task-specific visual simulation
107
106
 
108
- There are two deliberately different visualization modes.
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
- --visual-demo
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
- `--visual-demo` runs the packaged UR5e motion smoke through the ROS simulation stack. It is intentionally reported as `task_specific=false`; it proves the visualization/motion stack is working, not that the exact BOX task has been physically planned.
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
- To request visualization of the **exact engineering task**, use:
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
- --visualize
164
+ --visual-demo
130
165
  ```
131
166
 
132
- Task-specific visualization fails closed until the runtime has enough physical evidence to construct the exact scene and compile an exact `PhysicalMotionPlan`. Required evidence includes robot/source/destination poses, collision geometry, workpiece geometry, tool/TCP information, and the compiled physical motion. DevAgent will not display an unrelated canned movement and call it the requested task.
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
- EXACT PHYSICAL MOTION CONTRACT
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 / CLEARANCE / TOOL / WORKPIECE VERIFICATION
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
- For production-candidate UR5e simulation, the stronger verifier can use MoveIt PlanningScene read-back, runtime-owned tool collision binding, runtime-owned workpiece attach/detach transitions, measured collision distance, conservative continuous-path clearance proof, measured joint states, and MoveIt FK evidence.
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. Current production-candidate physical-runtime work is centered on the UR5e ROS 2 / Gazebo / MoveIt path; a profile existing in the registry does not imply equivalent physical qualification for every vendor.
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
- For the stronger production-candidate target campaign:
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.11.6 — Beta software / evidence-gated physical runtime.**
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 physical simulation path remains experimental until its exact target-stack qualification campaign passes. Real robot execution remains locked. Functional-safety certification and site qualification are not claimed.
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.11.6"
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 probe scripts and target-stack orchestration require a real ROS/Jazzy/
61
- # Gazebo/MoveIt environment. They are qualified by qualification_v11 rather than
62
- # pretending hosted unit execution covers them.
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]
@@ -41,4 +41,4 @@ __all__ = [
41
41
  "TwinValidator",
42
42
  ]
43
43
 
44
- __version__ = "0.11.6"
44
+ __version__ = "0.12.0"
@@ -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")