devagent-physical-engine 1.0.0__tar.gz → 1.2.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 (189) hide show
  1. devagent_physical_engine-1.2.0/PKG-INFO +976 -0
  2. devagent_physical_engine-1.2.0/README.md +935 -0
  3. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/pyproject.toml +3 -3
  4. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/__init__.py +37 -1
  5. devagent_physical_engine-1.2.0/src/devagent_physical_engine/commercial_cli.py +413 -0
  6. devagent_physical_engine-1.2.0/src/devagent_physical_engine/evidence_replay.py +83 -0
  7. devagent_physical_engine-1.2.0/src/devagent_physical_engine/evidence_trust.py +897 -0
  8. devagent_physical_engine-1.2.0/src/devagent_physical_engine/production_authority.py +267 -0
  9. devagent_physical_engine-1.2.0/src/devagent_physical_engine/production_grade.py +1073 -0
  10. devagent_physical_engine-1.2.0/src/devagent_physical_engine.egg-info/PKG-INFO +976 -0
  11. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine.egg-info/SOURCES.txt +11 -0
  12. devagent_physical_engine-1.2.0/tests/test_evidence_replay_v12.py +149 -0
  13. devagent_physical_engine-1.2.0/tests/test_evidence_trust_coverage_v12.py +506 -0
  14. devagent_physical_engine-1.2.0/tests/test_evidence_trust_transport_v12.py +290 -0
  15. devagent_physical_engine-1.2.0/tests/test_evidence_trust_v12.py +281 -0
  16. devagent_physical_engine-1.2.0/tests/test_production_authority_v11.py +282 -0
  17. devagent_physical_engine-1.2.0/tests/test_production_grade_coverage_v11.py +379 -0
  18. devagent_physical_engine-1.2.0/tests/test_production_grade_v11.py +342 -0
  19. devagent_physical_engine-1.0.0/PKG-INFO +0 -398
  20. devagent_physical_engine-1.0.0/README.md +0 -357
  21. devagent_physical_engine-1.0.0/src/devagent_physical_engine/commercial_cli.py +0 -185
  22. devagent_physical_engine-1.0.0/src/devagent_physical_engine.egg-info/PKG-INFO +0 -398
  23. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/NOTICE +0 -0
  24. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/setup.cfg +0 -0
  25. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/agent/__init__.py +0 -0
  26. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/agent/compiler.py +0 -0
  27. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/agent/contracts.py +0 -0
  28. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/agent/coordinator.py +0 -0
  29. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/agent/critic.py +0 -0
  30. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/agent/evidence.py +0 -0
  31. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/agent/interpreter.py +0 -0
  32. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/agent/planner.py +0 -0
  33. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/agent/recovery.py +0 -0
  34. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/agent/routing.py +0 -0
  35. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/agent/runtime.py +0 -0
  36. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/agent/semantic.py +0 -0
  37. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/agent/structured.py +0 -0
  38. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ai_cli.py +0 -0
  39. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/cli.py +0 -0
  40. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/commercial.py +0 -0
  41. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/commercial_campaign.py +0 -0
  42. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/commercial_importer.py +0 -0
  43. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/commercial_readiness.py +0 -0
  44. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/commercial_repository.py +0 -0
  45. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/continuous_clearance.py +0 -0
  46. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/doctor.py +0 -0
  47. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/engineering_agent.py +0 -0
  48. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/engineering_request.py +0 -0
  49. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/execution.py +0 -0
  50. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/models.py +0 -0
  51. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/operating_envelope.py +0 -0
  52. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/optimization/__init__.py +0 -0
  53. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/optimization/benchmark.py +0 -0
  54. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/optimization/candidates.py +0 -0
  55. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/optimization/contracts.py +0 -0
  56. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/optimization/evaluator.py +0 -0
  57. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/optimization/evidence.py +0 -0
  58. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/optimization/experience.py +0 -0
  59. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/optimization/measured.py +0 -0
  60. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/optimization/optimizer.py +0 -0
  61. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/optimization/orchestrator.py +0 -0
  62. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/physical_campaign.py +0 -0
  63. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/physical_evidence.py +0 -0
  64. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/physical_motion.py +0 -0
  65. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/planning.py +0 -0
  66. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/pose_math.py +0 -0
  67. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/preexecution_contract.py +0 -0
  68. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/project.py +0 -0
  69. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/provider_adapters/__init__.py +0 -0
  70. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/provider_adapters/anthropic.py +0 -0
  71. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/provider_adapters/common.py +0 -0
  72. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/provider_adapters/factory.py +0 -0
  73. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/provider_adapters/gemini.py +0 -0
  74. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/provider_adapters/openai.py +0 -0
  75. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/provider_qualification.py +0 -0
  76. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/providers.py +0 -0
  77. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/qualification.py +0 -0
  78. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/qualification_cli.py +0 -0
  79. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/qualification_harness.py +0 -0
  80. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/reference_workcell.py +0 -0
  81. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/robot_platform.py +0 -0
  82. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/robots.py +0 -0
  83. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/__init__.py +0 -0
  84. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/acceptance.py +0 -0
  85. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/commands.py +0 -0
  86. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/continuous_clearance_probe.py +0 -0
  87. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/doctor.py +0 -0
  88. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/fk_pose.py +0 -0
  89. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/fk_probe.py +0 -0
  90. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/frame_alignment.py +0 -0
  91. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/gazebo_cli.py +0 -0
  92. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/gazebo_pose.py +0 -0
  93. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/gazebo_world.py +0 -0
  94. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/joint_state_probe.py +0 -0
  95. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/joint_state_recorder.py +0 -0
  96. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/measured_motion.py +0 -0
  97. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/moveit_joint_plan_probe.py +0 -0
  98. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/moveit_scene.py +0 -0
  99. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/moveit_task_planner.py +0 -0
  100. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/preexecution.py +0 -0
  101. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/qualification.py +0 -0
  102. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/qualification_v10.py +0 -0
  103. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/qualification_v11.py +0 -0
  104. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/qualification_v12.py +0 -0
  105. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/scene_probe.py +0 -0
  106. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/state_validity_probe.py +0 -0
  107. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/task_adapter.py +0 -0
  108. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/task_visualization.py +0 -0
  109. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/tf_probe.py +0 -0
  110. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/tool_scene.py +0 -0
  111. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/tool_scene_probe.py +0 -0
  112. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/trajectory.py +0 -0
  113. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/trajectory_action_probe.py +0 -0
  114. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/trajectory_tracking.py +0 -0
  115. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/ur5e.py +0 -0
  116. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/ur5e_adapter.py +0 -0
  117. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/ur5e_v10_adapter.py +0 -0
  118. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/workpiece_follow.py +0 -0
  119. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/workpiece_gazebo_follower.py +0 -0
  120. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/workpiece_scene.py +0 -0
  121. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/workpiece_scene_probe.py +0 -0
  122. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/setup_profile.py +0 -0
  123. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/sim_real_qualification.py +0 -0
  124. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/simulation.py +0 -0
  125. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/simulation_platform.py +0 -0
  126. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/tool_collision.py +0 -0
  127. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/trajectory_qualification.py +0 -0
  128. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/twin.py +0 -0
  129. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/twin_builder.py +0 -0
  130. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/twin_materialization.py +0 -0
  131. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/verification.py +0 -0
  132. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/workpiece_lifecycle.py +0 -0
  133. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine.egg-info/dependency_links.txt +0 -0
  134. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine.egg-info/entry_points.txt +0 -0
  135. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine.egg-info/requires.txt +0 -0
  136. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine.egg-info/top_level.txt +0 -0
  137. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_agent_core.py +0 -0
  138. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_agent_semantic_hardening.py +0 -0
  139. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_ai_cli.py +0 -0
  140. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_ai_cli_v07.py +0 -0
  141. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_commercial_importer_v1.py +0 -0
  142. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_commercial_readiness_v1.py +0 -0
  143. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_commercial_v1.py +0 -0
  144. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_continuous_clearance_v011.py +0 -0
  145. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_core.py +0 -0
  146. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_engineering_request_v07.py +0 -0
  147. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_gazebo_cli_v0122.py +0 -0
  148. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_interpreter_profiles_v08.py +0 -0
  149. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_joint_state_probe_v0125.py +0 -0
  150. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_live_provider_qualification.py +0 -0
  151. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_measured_motion_v10.py +0 -0
  152. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_moveit_planning_diagnostics_v0125.py +0 -0
  153. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_moveit_scene_v0123.py +0 -0
  154. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_natural_language_agent_v07.py +0 -0
  155. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_openai_strict_schema_v0113.py +0 -0
  156. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_optimization_v05.py +0 -0
  157. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_physical_campaign_v09.py +0 -0
  158. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_physical_evidence_v09.py +0 -0
  159. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_physical_motion_v09.py +0 -0
  160. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_planning_fallback_v012.py +0 -0
  161. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_pose_math_v0125.py +0 -0
  162. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_preexecution_contract_v10.py +0 -0
  163. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_project_spine_v013.py +0 -0
  164. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_provider_and_qualification.py +0 -0
  165. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_qualification_cli_lifecycle_v06.py +0 -0
  166. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_qualification_harness_v06.py +0 -0
  167. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_readme_pypi.py +0 -0
  168. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_real_provider_adapters.py +0 -0
  169. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_reference_workcell_ros_frames_v0125.py +0 -0
  170. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_reference_workcell_v012.py +0 -0
  171. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_robot_platform_v08.py +0 -0
  172. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_ros2_production_receipts_v011.py +0 -0
  173. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_ros2_simulation.py +0 -0
  174. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_ros_trajectory_v09.py +0 -0
  175. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_setup_profile.py +0 -0
  176. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_sim_real_qualification_v011.py +0 -0
  177. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_simulation_platform_v08.py +0 -0
  178. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_tool_collision_v011.py +0 -0
  179. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_tool_scene_v0124.py +0 -0
  180. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_trajectory_action_probe_v0125.py +0 -0
  181. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_trajectory_qualification_v09.py +0 -0
  182. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_trajectory_tracking_v0125.py +0 -0
  183. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_twin_materialization_v10.py +0 -0
  184. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_twin_v08.py +0 -0
  185. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_ur5e_adapter_scopes_v09.py +0 -0
  186. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_ur5e_v10_adapter_scopes.py +0 -0
  187. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_v052_stabilization.py +0 -0
  188. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_v08_catalog_mapping_regression.py +0 -0
  189. {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_workpiece_lifecycle_v011.py +0 -0
@@ -0,0 +1,976 @@
1
+ Metadata-Version: 2.4
2
+ Name: devagent-physical-engine
3
+ Version: 1.2.0
4
+ Summary: Production-grade verification-first robotics evidence runtime with customer Twin lineage, measured physical verification, deterministic replay inspection, regression, and FAT evidence.
5
+ Author: Tom Ha
6
+ License: All Rights Reserved
7
+ Project-URL: Homepage, https://github.com/tomha85/devagent-physical-engine
8
+ Project-URL: Repository, https://github.com/tomha85/devagent-physical-engine
9
+ Project-URL: Issues, https://github.com/tomha85/devagent-physical-engine/issues
10
+ Keywords: robotics,industrial-automation,agentic-ai,ros2,verification,digital-twin,fat-testing,regression,evidence,replay
11
+ Classifier: Development Status :: 5 - Production/Stable
12
+ Classifier: Intended Audience :: Developers
13
+ Classifier: Operating System :: OS Independent
14
+ Classifier: Programming Language :: Python :: 3
15
+ Classifier: Programming Language :: Python :: 3.11
16
+ Classifier: Programming Language :: Python :: 3.12
17
+ Classifier: Programming Language :: Python :: 3.13
18
+ Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
19
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
20
+ Requires-Python: >=3.11
21
+ Description-Content-Type: text/markdown
22
+ License-File: NOTICE
23
+ Requires-Dist: PyYAML<7,>=6.0
24
+ Provides-Extra: openai
25
+ Requires-Dist: openai<4,>=3.0; extra == "openai"
26
+ Provides-Extra: anthropic
27
+ Requires-Dist: anthropic<2,>=1.0; extra == "anthropic"
28
+ Provides-Extra: gemini
29
+ Requires-Dist: google-genai<3,>=2.0; extra == "gemini"
30
+ Provides-Extra: ai
31
+ Requires-Dist: openai<4,>=3.0; extra == "ai"
32
+ Requires-Dist: anthropic<2,>=1.0; extra == "ai"
33
+ Requires-Dist: google-genai<3,>=2.0; extra == "ai"
34
+ Provides-Extra: dev
35
+ Requires-Dist: build==1.6.0; extra == "dev"
36
+ Requires-Dist: twine==7.0.0; extra == "dev"
37
+ Requires-Dist: coverage[toml]<8,>=7.6; extra == "dev"
38
+ Requires-Dist: ruff<1,>=0.12; extra == "dev"
39
+ Requires-Dist: pip-audit<3,>=2.9; extra == "dev"
40
+ Dynamic: license-file
41
+
42
+ # DevAgent Smart Physical Engine
43
+
44
+ [![PyPI](https://img.shields.io/pypi/v/devagent-physical-engine.svg)](https://pypi.org/project/devagent-physical-engine/)
45
+ [![Python](https://img.shields.io/pypi/pyversions/devagent-physical-engine.svg)](https://pypi.org/project/devagent-physical-engine/)
46
+ [![Status: Production/Stable](https://img.shields.io/badge/status-production%2Fstable-blue.svg)](#project-status)
47
+
48
+ **Verification-first commissioning engineering for robotics and industrial automation: customer Twin import, deterministic verification, measured physical evidence, replayable evidence lineage, change-impact regression, and auditable FAT evidence.**
49
+
50
+ > **AI proposes. Deterministic engines validate, compile, verify, measure, and gate promotion. OEM robot controllers, PLCs, safety PLCs, and certified safety systems remain authoritative.**
51
+
52
+ DevAgent is designed to answer one practical question before engineers travel onsite:
53
+
54
+ > **What can be proven about this robot cell, what failed, what changed, and what evidence supports the conclusion?**
55
+
56
+ ## What v1.2.0 is
57
+
58
+ DevAgent Physical Engine `v1.2.0` is a Production/Stable **bounded software workflow** for:
59
+
60
+ - durable customer `Project / Site / Workcell` identity;
61
+ - explicit customer Twin evidence and immutable Twin revisions;
62
+ - deterministic structural and measured physical requirement checks;
63
+ - nominal, boundary, pairwise-boundary, and fault verification-plan generation;
64
+ - exact-Twin physical measurement artifacts;
65
+ - canonical physical-motion evidence and runtime measurement binding;
66
+ - immutable evidence bundles with artifact IDs, SHA-256 hashes, and Twin scope;
67
+ - fail-closed replay reconstruction of stored run/case/seed/reset-state/motion lineage;
68
+ - a read-only local/static Evidence Viewer for customer inspection;
69
+ - change-impact and baseline/current regression analysis;
70
+ - FAT evidence in Markdown, HTML, and JSON;
71
+ - content-addressed project evidence and release artifacts.
72
+
73
+ It does **not** claim that a customer robot cell is commissioned, functionally safe, or authorized for production execution.
74
+
75
+ ```text
76
+ customer_review_ready
77
+ production_engineering_ready
78
+ physical_qualification = false
79
+ site_qualification = false
80
+ real_execution_allowed = false
81
+ ```
82
+
83
+ `production_engineering_ready=true` means the supported engineering-evidence chain is complete. It is **not** a safety certificate or permission to command a production robot.
84
+
85
+ ## Product workflow
86
+
87
+ ```text
88
+ CUSTOMER PROJECT / SITE / WORKCELL
89
+ |
90
+ v
91
+ CUSTOMER ASSETS + EXPLICIT TWIN EVIDENCE
92
+ |
93
+ v
94
+ IMMUTABLE TWIN REVISION
95
+ |
96
+ v
97
+ REQUIREMENTS
98
+ |
99
+ v
100
+ VERIFICATION PLAN
101
+ nominal / boundary / pairwise / faults
102
+ |
103
+ v
104
+ QUALIFIED SIMULATION / SHADOW EXECUTION
105
+ |
106
+ v
107
+ MEASURED PHYSICAL EVIDENCE
108
+ cycle / clearance / TCP / tracking / collision
109
+ |
110
+ v
111
+ DETERMINISTIC VERDICTS
112
+ PASS / FAIL / NOT_TESTED
113
+ |
114
+ v
115
+ EVIDENCE BUNDLE + REPLAY RECONSTRUCTION
116
+ requirement / Twin / run / case / motion / hashes
117
+ |
118
+ v
119
+ CHANGE IMPACT + REGRESSION
120
+ |
121
+ v
122
+ FAT REPORT + READ-ONLY EVIDENCE VIEWER
123
+ ```
124
+
125
+ A generated verification plan is **not execution evidence**. Planned cases remain `planned_not_executed` until a runtime actually produces measured evidence.
126
+
127
+ A replay reconstruction is also **not re-execution**. `devagent-commercial replay` proves that DevAgent can reconstruct and verify the exact persisted physical case/motion lineage; a separately qualified simulation adapter must perform any actual rerun and create new evidence.
128
+
129
+ Unknown facts remain unknown. Unsupported requirements remain `NOT_TESTED`. A CAD, URDF, or mesh file does not prove pose, scale, TCP, calibration, collision geometry, or physics simply because the file exists.
130
+
131
+ ## Install
132
+
133
+ Python 3.11+ is required.
134
+
135
+ ```bash
136
+ python -m pip install --upgrade devagent-physical-engine==1.2.0
137
+ ```
138
+
139
+ Verify the installed version:
140
+
141
+ ```bash
142
+ python -c "import devagent_physical_engine as d; print(d.__version__)"
143
+ ```
144
+
145
+ Expected:
146
+
147
+ ```text
148
+ 1.2.0
149
+ ```
150
+
151
+ The package installs three CLIs:
152
+
153
+ ```text
154
+ devagent-commercial customer project / Twin / requirements / evidence / replay / FAT workflow
155
+ devagent-physical deterministic core, project inspection, ROS setup/qualification
156
+ devagent-physical-ai provider-backed natural-language engineering front end
157
+ ```
158
+
159
+ `pip install` does **not** install ROS 2, Gazebo, MoveIt, OEM drivers, or privileged operating-system packages.
160
+
161
+ ### Optional AI providers
162
+
163
+ ```bash
164
+ python -m pip install "devagent-physical-engine[openai]"
165
+ python -m pip install "devagent-physical-engine[anthropic]"
166
+ python -m pip install "devagent-physical-engine[gemini]"
167
+ # or all supported provider SDKs
168
+ python -m pip install "devagent-physical-engine[ai]"
169
+ ```
170
+
171
+ Typical credential variables:
172
+
173
+ ```bash
174
+ export OPENAI_API_KEY="..."
175
+ export ANTHROPIC_API_KEY="..."
176
+ export GEMINI_API_KEY="..." # GOOGLE_API_KEY is also accepted for Gemini
177
+ ```
178
+
179
+ Check SDK and credential availability without a provider network call:
180
+
181
+ ```bash
182
+ devagent-physical-ai doctor --provider openai
183
+ ```
184
+
185
+ A live provider qualification uses provider API credits:
186
+
187
+ ```bash
188
+ devagent-physical-ai qualify \
189
+ --provider openai \
190
+ --model YOUR_MODEL
191
+ ```
192
+
193
+ # Commercial workflow: end to end
194
+
195
+ The default SQLite project/evidence database is:
196
+
197
+ ```text
198
+ ~/.devagent/projects.db
199
+ ```
200
+
201
+ To use a dedicated database, put `--db` immediately after `devagent-commercial`:
202
+
203
+ ```bash
204
+ devagent-commercial --db ./customer-projects.db status warehouse-cnc-04
205
+ ```
206
+
207
+ The same project database can be inspected with:
208
+
209
+ ```bash
210
+ devagent-physical project --db ./customer-projects.db show warehouse-cnc-04
211
+ ```
212
+
213
+ ## 1. Create the customer project
214
+
215
+ ```bash
216
+ devagent-commercial init warehouse-cnc-04 \
217
+ --name "Warehouse CNC Loading Cell 04" \
218
+ --site atl-01 \
219
+ --workcell cnc-04
220
+ ```
221
+
222
+ Keep the same project ID when the cell changes. New evidence creates new immutable Twin revisions instead of overwriting history.
223
+
224
+ ## 2. Prepare customer Twin evidence
225
+
226
+ A customer folder can contain engineering assets plus exactly one DevAgent Twin manifest:
227
+
228
+ ```text
229
+ customer-cell/
230
+ ├── devagent-twin.yaml
231
+ ├── robot.urdf
232
+ ├── robot.srdf
233
+ ├── gripper.step
234
+ ├── fixture.stl
235
+ └── calibration.csv
236
+ ```
237
+
238
+ Supported inventory suffixes include:
239
+
240
+ ```text
241
+ .urdf .xacro .srdf .stl .dae .obj .step .stp .iges .igs
242
+ .yaml .yml .json .csv
243
+ ```
244
+
245
+ Customer assets are SHA-256 fingerprinted with bounded streaming I/O and may be up to 512 MiB per file. Symlinks and ambiguous multiple root `devagent-twin.*` manifests are rejected. Structured manifest input is intentionally subject to a smaller bounded text limit.
246
+
247
+ Physical facts are promoted only through one explicit manifest:
248
+
249
+ ```text
250
+ devagent-twin.yaml
251
+ devagent-twin.yml
252
+ devagent-twin.json
253
+ ```
254
+
255
+ Start from the template:
256
+
257
+ - [examples/commercial/devagent-twin.yaml](https://github.com/tomha85/devagent-physical-engine/blob/main/examples/commercial/devagent-twin.yaml)
258
+
259
+ **Do not use the template values as customer evidence.** Replace geometry, pose, TCP, payload, frames, physics values, and `source_ref` with actual customer/imported/measured evidence.
260
+
261
+ Minimal pattern:
262
+
263
+ ```yaml
264
+ schema_version: 1
265
+ length_unit: mm
266
+ angle_unit: deg
267
+
268
+ engineering_request:
269
+ robot: ur5e
270
+ operation: load
271
+ object_id: BOX_101
272
+ source: conveyor_a
273
+ destination: cnc_04
274
+ tool: parallel_gripper
275
+ payload_kg: 1.5
276
+ purpose: simulate
277
+
278
+ robot_base_pose:
279
+ x: 0
280
+ y: 0
281
+ z: 0
282
+ roll: 0
283
+ pitch: 0
284
+ yaw: 0
285
+ origin: measured
286
+ source_ref: SITE_SURVEY_2026_09_01
287
+ ```
288
+
289
+ DevAgent does not silently promote `estimated` or `default` values into customer evidence.
290
+
291
+ ## 3. Import the Twin and resolve missing information
292
+
293
+ ```bash
294
+ devagent-commercial import-twin warehouse-cnc-04 ./customer-cell \
295
+ | tee twin-import.json
296
+ ```
297
+
298
+ The JSON result includes `twin_revision_id`, `twin_state`, `information_requests`, discovered asset hashes, and an immutable evidence artifact.
299
+
300
+ If `information_requests` is non-empty, obtain real engineering evidence and import again. Do not guess TCP, robot base, calibration, geometry, or physics values merely to make the Twin pass.
301
+
302
+ List immutable revisions:
303
+
304
+ ```bash
305
+ devagent-physical project revisions warehouse-cnc-04 \
306
+ | tee twin-revisions.json
307
+ ```
308
+
309
+ Capture the latest revision ID and exact Twin hash without requiring `jq`:
310
+
311
+ ```bash
312
+ TWIN_REVISION=$(python - <<'PY'
313
+ import json
314
+ p = json.load(open("twin-revisions.json", encoding="utf-8"))
315
+ print(p["revisions"][-1]["revision_id"])
316
+ PY
317
+ )
318
+
319
+ TWIN_HASH=$(python - <<'PY'
320
+ import json
321
+ p = json.load(open("twin-revisions.json", encoding="utf-8"))
322
+ print(p["revisions"][-1]["twin_hash"])
323
+ PY
324
+ )
325
+
326
+ printf 'revision=%s\ntwin_hash=%s\n' "$TWIN_REVISION" "$TWIN_HASH"
327
+ ```
328
+
329
+ Never bind measurement evidence from one Twin revision to another Twin revision.
330
+
331
+ ## 4. Define deterministic requirements
332
+
333
+ Production example:
334
+
335
+ - [examples/commercial/requirements-production.csv](https://github.com/tomha85/devagent-physical-engine/blob/main/examples/commercial/requirements-production.csv)
336
+
337
+ ```csv
338
+ requirement_id,text,check,target,expected,severity
339
+ REQ-001,Twin shall be physics ready,physics_allowed,,true,must
340
+ REQ-101,Cycle time shall be less than or equal to 8 seconds,cycle_time_max_s,8.0,,must
341
+ REQ-102,Minimum clearance shall be at least 30 millimeters,minimum_clearance_m,0.03,,must
342
+ REQ-103,Final TCP error shall be at most 2 millimeters,final_tcp_error_max_m,0.002,,must
343
+ REQ-104,Maximum tracking error shall be at most 0.03 radians,max_tracking_error_rad,0.03,,must
344
+ REQ-105,Trajectory shall remain collision free,collision_free,,true,must
345
+ REQ-106,Physical task shall complete,physical_completed,,true,must
346
+ ```
347
+
348
+ Record the requirement set:
349
+
350
+ ```bash
351
+ devagent-commercial requirements warehouse-cnc-04 \
352
+ examples/commercial/requirements-production.csv \
353
+ | tee requirement-artifact.json
354
+ ```
355
+
356
+ Unsupported prose remains `NOT_TESTED`; an LLM cannot auto-pass it.
357
+
358
+ ## 5. Generate a bounded verification plan
359
+
360
+ Example:
361
+
362
+ - [examples/commercial/verification-plan.yaml](https://github.com/tomha85/devagent-physical-engine/blob/main/examples/commercial/verification-plan.yaml)
363
+
364
+ ```yaml
365
+ max_cases: 128
366
+ variation:
367
+ object_x_mm: [-20, 0, 20]
368
+ object_y_mm: [-20, 0, 20]
369
+ payload_kg: [1.0, 3.0, 5.0]
370
+ speed_pct: [70, 85, 100]
371
+ faults:
372
+ - missing_part
373
+ - controller_timeout
374
+ - sensor_latency
375
+ ```
376
+
377
+ ```bash
378
+ devagent-commercial verification-plan warehouse-cnc-04 \
379
+ examples/commercial/verification-plan.yaml \
380
+ --revision "$TWIN_REVISION" \
381
+ | tee verification-plan-artifact.json
382
+ ```
383
+
384
+ The generator creates bounded nominal, single-parameter boundary, pairwise-boundary, and explicit fault cases. It does **not** claim they were executed.
385
+
386
+ ## 6. Execute the supported scope and record real measurements
387
+
388
+ A measurement artifact must come from the simulation, hardware-shadow, or site-measurement workflow that actually produced the metrics.
389
+
390
+ Supported measured fields are:
391
+
392
+ ```text
393
+ cycle_time_s
394
+ minimum_clearance_m
395
+ final_tcp_error_m
396
+ max_tracking_error_rad
397
+ sample_count
398
+ collision_free
399
+ completed
400
+ ```
401
+
402
+ Schema/example:
403
+
404
+ - [examples/commercial/physical-measurement.json](https://github.com/tomha85/devagent-physical-engine/blob/main/examples/commercial/physical-measurement.json)
405
+
406
+ Replace the example metrics with actual run output and replace `twin_hash` with the exact `$TWIN_HASH` captured above.
407
+
408
+ ```json
409
+ {
410
+ "case_id": "nominal-load",
411
+ "backend": "gazebo_moveit",
412
+ "source_kind": "simulation",
413
+ "run_id": "physical-20260901T120000000000Z",
414
+ "qualification_ref": "~/.devagent/physical-qualification/physical-20260901T120000000000Z",
415
+ "twin_hash": "EXACT_TWIN_SHA256",
416
+ "metrics": {
417
+ "cycle_time_s": 7.43,
418
+ "minimum_clearance_m": 0.038,
419
+ "final_tcp_error_m": 0.0016,
420
+ "max_tracking_error_rad": 0.021,
421
+ "collision_free": true,
422
+ "completed": true,
423
+ "sample_count": 264
424
+ }
425
+ }
426
+ ```
427
+
428
+ Record external measurement evidence against the exact Twin revision:
429
+
430
+ ```bash
431
+ devagent-commercial record-measurement warehouse-cnc-04 \
432
+ physical-measurement.json \
433
+ --revision "$TWIN_REVISION" \
434
+ | tee physical-evidence.json
435
+ ```
436
+
437
+ Capture the content-addressed artifact ID:
438
+
439
+ ```bash
440
+ MEASUREMENT_ARTIFACT=$(python - <<'PY'
441
+ import json
442
+ p = json.load(open("physical-evidence.json", encoding="utf-8"))
443
+ print(p["artifact_id"])
444
+ PY
445
+ )
446
+ ```
447
+
448
+ The recorder rejects malformed/non-finite/negative metrics, exact-Twin hash mismatch, invalid source kinds, and inconsistent positive-clearance/collision claims.
449
+
450
+ ### Preferred typed runtime binding
451
+
452
+ If the runtime already owns `PhysicalMotionPlan` and `MotionExecutionMetrics`, prefer the typed binding over manually retyping metric JSON. In v1.2 this path also persists the canonical physical motion as immutable project evidence, enabling strong replay lineage.
453
+
454
+ ```python
455
+ from devagent_physical_engine import (
456
+ CommercialProjectRepository,
457
+ PhysicalEvidenceRecorder,
458
+ )
459
+
460
+ repository = CommercialProjectRepository("~/.devagent/projects.db")
461
+ recorder = PhysicalEvidenceRecorder(repository)
462
+
463
+ artifact = recorder.record_motion_metrics(
464
+ project_id="warehouse-cnc-04",
465
+ motion=physical_motion_plan, # PhysicalMotionPlan produced by the runtime
466
+ metrics=motion_execution_metrics, # MotionExecutionMetrics from execution
467
+ backend="gazebo_moveit",
468
+ run_id="physical-20260901T120000000000Z",
469
+ qualification_ref="~/.devagent/physical-qualification/physical-20260901T120000000000Z",
470
+ revision_id="twin-r0001",
471
+ case_id="case-0001",
472
+ )
473
+ ```
474
+
475
+ The typed bridge checks the motion/Twin binding and persists:
476
+
477
+ ```text
478
+ physical_measurement
479
+ physical_motion_plan
480
+ runtime_measurement_binding
481
+ ```
482
+
483
+ including exact artifact hashes, motion fingerprint, planner identity, metric origin, run ID, and qualification reference.
484
+
485
+ ## 7. Run the requirement campaign
486
+
487
+ ```bash
488
+ devagent-commercial campaign warehouse-cnc-04 \
489
+ examples/commercial/requirements-production.csv \
490
+ --revision "$TWIN_REVISION" \
491
+ --measurement "$MEASUREMENT_ARTIFACT" \
492
+ | tee campaign.json
493
+ ```
494
+
495
+ Capture the campaign artifact:
496
+
497
+ ```bash
498
+ CAMPAIGN_ARTIFACT=$(python - <<'PY'
499
+ import json
500
+ p = json.load(open("campaign.json", encoding="utf-8"))
501
+ print(p["artifact_id"])
502
+ PY
503
+ )
504
+ ```
505
+
506
+ A missing metric or unsupported check yields `NOT_TESTED`, never PASS. Failed/not-tested `must` requirements block bounded release readiness.
507
+
508
+ ## 8. Generate the first FAT evidence report
509
+
510
+ For the first campaign, no regression baseline exists yet:
511
+
512
+ ```bash
513
+ devagent-commercial fat-report warehouse-cnc-04 \
514
+ "$CAMPAIGN_ARTIFACT" \
515
+ --output FAT_REPORT.html \
516
+ | tee fat-artifact.json
517
+ ```
518
+
519
+ Supported output extensions are `.md`, `.html`, `.htm`, and `.json`. The immutable `fat_report` artifact stores Markdown, escaped customer-facing HTML, and structured JSON from the same evidence lineage.
520
+
521
+ ## 9. Build the v1.2 evidence bundle
522
+
523
+ After a campaign exists, bind the exact engineering chain into one immutable trace artifact:
524
+
525
+ ```bash
526
+ devagent-commercial evidence-bundle warehouse-cnc-04 \
527
+ "$CAMPAIGN_ARTIFACT" \
528
+ | tee evidence-bundle.json
529
+ ```
530
+
531
+ You can bind exact optional artifacts explicitly:
532
+
533
+ ```bash
534
+ devagent-commercial evidence-bundle warehouse-cnc-04 \
535
+ "$CAMPAIGN_ARTIFACT" \
536
+ --verification-plan "$PLAN_ARTIFACT" \
537
+ --regression "$REGRESSION_ARTIFACT" \
538
+ --fat-report "$FAT_ARTIFACT" \
539
+ | tee evidence-bundle.json
540
+ ```
541
+
542
+ The bundle records exact references containing:
543
+
544
+ ```text
545
+ artifact_id
546
+ artifact_type
547
+ artifact_hash
548
+ twin_revision_id
549
+ ```
550
+
551
+ and requirement traces containing verdict, observed value, expected threshold, reason, and evidence references.
552
+
553
+ Capture the bundle ID:
554
+
555
+ ```bash
556
+ EVIDENCE_BUNDLE=$(python - <<'PY'
557
+ import json
558
+ p = json.load(open("evidence-bundle.json", encoding="utf-8"))
559
+ print(p["artifact_id"])
560
+ PY
561
+ )
562
+ ```
563
+
564
+ ## 10. Verify replay reconstruction
565
+
566
+ `replay` is intentionally a verification command, not a robot-control command:
567
+
568
+ ```bash
569
+ devagent-commercial replay warehouse-cnc-04 \
570
+ "$EVIDENCE_BUNDLE" \
571
+ --qualification-root ~/.devagent/physical-qualification \
572
+ --output replay-manifest.json \
573
+ --record
574
+ ```
575
+
576
+ Before reconstruction, the hardened replay boundary verifies every bundle reference:
577
+
578
+ ```text
579
+ artifact ID
580
+ artifact type
581
+ artifact SHA-256
582
+ Twin revision scope
583
+ ```
584
+
585
+ It then verifies the persisted physical qualification evidence:
586
+
587
+ ```text
588
+ trusted qualification-store root
589
+ run_id
590
+ Twin SHA-256
591
+ case_id
592
+ case evidence hash
593
+ case fingerprint
594
+ seed
595
+ reset state
596
+ case parameters
597
+ canonical motion fingerprint
598
+ commercial physical_motion_plan fingerprint
599
+ ```
600
+
601
+ Successful output includes:
602
+
603
+ ```text
604
+ replayable = true
605
+ execution_performed = false
606
+ replay_manifest_hash = ...
607
+ ```
608
+
609
+ `--record` writes immutable `replay_verification` evidence after successful reconstruction.
610
+
611
+ **Important:** this does not command Gazebo, MoveIt, a real robot, an OEM controller, a PLC, or a safety PLC. A qualified simulation adapter may consume a verified replay manifest for an actual rerun, and that rerun must create new measured evidence.
612
+
613
+ If exact lineage cannot be proven, replay fails closed. Exit code `24` means the evidence bundle is not replayable under the supplied qualification store/run evidence.
614
+
615
+ ## 11. Inspect the Evidence Viewer
616
+
617
+ For customer sharing, generate a self-contained static HTML file:
618
+
619
+ ```bash
620
+ devagent-commercial evidence-viewer warehouse-cnc-04 \
621
+ --output DEVAGENT_EVIDENCE.html
622
+ ```
623
+
624
+ For local inspection:
625
+
626
+ ```bash
627
+ devagent-commercial evidence-viewer warehouse-cnc-04 \
628
+ --open-browser
629
+ ```
630
+
631
+ Default local URL:
632
+
633
+ ```text
634
+ http://127.0.0.1:8765/
635
+ ```
636
+
637
+ The built-in viewer is deliberately constrained:
638
+
639
+ - loopback host only (`127.0.0.1`, `localhost`, or `::1`);
640
+ - read-only GET surface;
641
+ - no write endpoint;
642
+ - no robot-control endpoint;
643
+ - customer strings HTML-escaped;
644
+ - `Cache-Control: no-store`;
645
+ - restrictive Content Security Policy.
646
+
647
+ It shows:
648
+
649
+ - project/site/workcell identity;
650
+ - customer-review readiness;
651
+ - production-engineering evidence readiness;
652
+ - explicit physical/site authority boundary;
653
+ - requirement verdicts;
654
+ - observed and expected values;
655
+ - evidence references;
656
+ - readiness blockers;
657
+ - immutable artifact IDs and SHA-256 hashes;
658
+ - exact Twin revision hashes.
659
+
660
+ Inspect the normalized graph as JSON when integrating another UI or audit tool:
661
+
662
+ ```bash
663
+ devagent-commercial evidence-graph warehouse-cnc-04 \
664
+ > evidence-graph.json
665
+ ```
666
+
667
+ The graph is derived from the existing immutable project store. It is **not a second source of truth**.
668
+
669
+ ## 12. Create a new Twin revision when the cell changes
670
+
671
+ When robot base, tool/TCP, fixture, workpiece, controller setting, or other evidence changes, update/import the evidence again instead of overwriting history:
672
+
673
+ ```bash
674
+ devagent-commercial import-twin warehouse-cnc-04 ./customer-cell-revision-2
675
+ ```
676
+
677
+ Then inspect the new revision:
678
+
679
+ ```bash
680
+ devagent-physical project revisions warehouse-cnc-04
681
+ ```
682
+
683
+ Compute conservative requirement impact:
684
+
685
+ ```bash
686
+ devagent-commercial impact warehouse-cnc-04 \
687
+ twin-r0001 twin-r0002 \
688
+ examples/commercial/requirements-production.csv \
689
+ | tee impact.json
690
+ ```
691
+
692
+ Capture its artifact ID:
693
+
694
+ ```bash
695
+ IMPACT_ARTIFACT=$(python - <<'PY'
696
+ import json
697
+ p = json.load(open("impact.json", encoding="utf-8"))
698
+ print(p["artifact_id"])
699
+ PY
700
+ )
701
+ ```
702
+
703
+ Run the current campaign on the new Twin/measurement evidence, then compare baseline/current campaign artifacts:
704
+
705
+ ```bash
706
+ devagent-commercial regression warehouse-cnc-04 \
707
+ "$BASELINE_CAMPAIGN" "$CURRENT_CAMPAIGN" \
708
+ --impact "$IMPACT_ARTIFACT" \
709
+ | tee regression.json
710
+ ```
711
+
712
+ Capture regression evidence:
713
+
714
+ ```bash
715
+ REGRESSION_ARTIFACT=$(python - <<'PY'
716
+ import json
717
+ p = json.load(open("regression.json", encoding="utf-8"))
718
+ print(p["artifact_id"])
719
+ PY
720
+ )
721
+ ```
722
+
723
+ A PASS -> non-PASS transition is a regression. Numeric observed values are compared as deltas. Stale evidence cannot preserve current readiness.
724
+
725
+ Generate the regression-aware FAT report:
726
+
727
+ ```bash
728
+ devagent-commercial fat-report warehouse-cnc-04 \
729
+ "$CURRENT_CAMPAIGN" \
730
+ --regression "$REGRESSION_ARTIFACT" \
731
+ --output FAT_REPORT_CURRENT.html
732
+ ```
733
+
734
+ Then build a new evidence bundle for the current campaign and inspect/replay that exact lineage.
735
+
736
+ ## 13. Inspect readiness and evidence artifacts
737
+
738
+ ```bash
739
+ devagent-commercial status warehouse-cnc-04
740
+ devagent-commercial artifacts warehouse-cnc-04
741
+ ```
742
+
743
+ Useful artifact filters:
744
+
745
+ ```bash
746
+ devagent-commercial artifacts warehouse-cnc-04 --type physical_measurement
747
+ devagent-commercial artifacts warehouse-cnc-04 --type physical_motion_plan
748
+ devagent-commercial artifacts warehouse-cnc-04 --type runtime_measurement_binding
749
+ devagent-commercial artifacts warehouse-cnc-04 --type verification_plan
750
+ devagent-commercial artifacts warehouse-cnc-04 --type commercial_campaign
751
+ devagent-commercial artifacts warehouse-cnc-04 --type change_impact
752
+ devagent-commercial artifacts warehouse-cnc-04 --type commercial_regression
753
+ devagent-commercial artifacts warehouse-cnc-04 --type fat_report
754
+ devagent-commercial artifacts warehouse-cnc-04 --type evidence_bundle
755
+ devagent-commercial artifacts warehouse-cnc-04 --type replay_verification
756
+ ```
757
+
758
+ # Evidence origin versus qualification authority
759
+
760
+ Evidence Trust uses origin labels to tell the reviewer where measurements came from:
761
+
762
+ ```text
763
+ MODEL_ONLY
764
+ SIMULATION_MEASURED
765
+ SHADOW_MEASURED
766
+ SITE_MEASURED
767
+ ```
768
+
769
+ These labels are **not certification levels** and do not automatically promote physical/site authority.
770
+
771
+ For example, this is a bounded engineering claim:
772
+
773
+ ```text
774
+ REQ-102: modeled clearance >= 30 mm
775
+ Observed: 37.2 mm
776
+ Verdict: PASS
777
+ Origin: SIMULATION_MEASURED
778
+ Twin: twin-r0007
779
+ Twin SHA-256: ...
780
+ Measurement artifact: art-...
781
+ Motion artifact: art-...
782
+ Replay reconstruction: verified
783
+ ```
784
+
785
+ It means the identified Twin/runtime/case evidence satisfied the deterministic modeled requirement. It does **not** mean the real workcell is safe for production.
786
+
787
+ # Supported deterministic requirement checks
788
+
789
+ Structural/Twin checks:
790
+
791
+ - `planning_allowed`
792
+ - `physics_allowed`
793
+ - `entity_present`
794
+ - `validation_issue_absent`
795
+ - `twin_state`
796
+
797
+ Measured physical checks:
798
+
799
+ - `cycle_time_max_s`
800
+ - `minimum_clearance_m`
801
+ - `final_tcp_error_max_m`
802
+ - `max_tracking_error_rad`
803
+ - `collision_free`
804
+ - `physical_completed`
805
+
806
+ A physical requirement without exact-Twin measurement evidence is `NOT_TESTED`.
807
+
808
+ # CLI exit codes for automation
809
+
810
+ `devagent-commercial` intentionally returns non-zero for engineering blockers so shell/CI automation does not silently treat a failed verification as success.
811
+
812
+ | Exit | Meaning |
813
+ | ---: | --- |
814
+ | `0` | command completed and its verdict/readiness gate passed where applicable |
815
+ | `10` | project/input/commercial contract error |
816
+ | `12` | imported Twin is invalid |
817
+ | `20` | campaign completed but is not release-ready |
818
+ | `21` | regression comparison detected a regression |
819
+ | `22` | FAT report generated but bounded release-readiness is false |
820
+ | `23` | project status is not `commercial_v1_ready` |
821
+ | `24` | evidence replay reconstruction is not currently replayable |
822
+
823
+ Preserve the command JSON output even when the process returns a non-zero engineering verdict.
824
+
825
+ # AI engineering front end
826
+
827
+ AI is optional and remains outside deterministic execution authority.
828
+
829
+ Interpret a natural-language request:
830
+
831
+ ```bash
832
+ devagent-physical-ai request \
833
+ "Use a UR5e to load BOX_101 from conveyor_a to cnc_04." \
834
+ --provider openai \
835
+ --model YOUR_MODEL
836
+ ```
837
+
838
+ Run the engineering agent:
839
+
840
+ ```bash
841
+ devagent-physical-ai engineer \
842
+ "Use a UR5e to load BOX_101 from conveyor_a to cnc_04. Simulate and verify the plan." \
843
+ --provider openai \
844
+ --model YOUR_MODEL
845
+ ```
846
+
847
+ Task-specific `--visualize` remains deliberately narrow: v1.2 retains the supported nominal UR5e `load` reference-workcell path and fails closed outside that scope.
848
+
849
+ ```bash
850
+ devagent-physical-ai engineer \
851
+ "Use a UR5e to load BOX_101 from conveyor_a to cnc_04. Simulate and verify the plan." \
852
+ --provider openai \
853
+ --model YOUR_MODEL \
854
+ --visualize
855
+ ```
856
+
857
+ `--visual-demo` is different: it runs a visual UR5e demo after engineering verification, but it is **not** claimed to be the requested BOX/source/destination task-specific motion.
858
+
859
+ # Physical simulation setup and qualification
860
+
861
+ Reference direction:
862
+
863
+ ```text
864
+ Ubuntu 24.04
865
+ ROS 2 Jazzy
866
+ Gazebo Harmonic
867
+ gz_ros2_control
868
+ Universal Robots ROS 2 driver
869
+ ur_simulation_gz
870
+ MoveIt 2
871
+ ```
872
+
873
+ Preview system changes:
874
+
875
+ ```bash
876
+ devagent-physical setup --profile ur5e-sim --dry-run
877
+ ```
878
+
879
+ Apply the supported setup explicitly:
880
+
881
+ ```bash
882
+ devagent-physical setup --profile ur5e-sim --yes
883
+ ```
884
+
885
+ Check and qualify the target runtime:
886
+
887
+ ```bash
888
+ devagent-physical ros doctor
889
+ devagent-physical ros qualify-trajectory-runtime
890
+ ```
891
+
892
+ Other reference commands:
893
+
894
+ ```bash
895
+ devagent-physical ros launch --dry-run
896
+ devagent-physical ros acceptance
897
+ devagent-physical ros demo
898
+ devagent-physical qualify
899
+ ```
900
+
901
+ Hosted Python CI cannot prove graphical Gazebo, MoveIt `move_group`, TF, controller actions, or OEM drivers. Physical-simulation qualification must run on the exact workstation/adapter stack. ABB, FANUC, KUKA, or other registry entries do not imply equal physical qualification.
902
+
903
+ # Evidence and authority rules
904
+
905
+ DevAgent is fail-closed by design:
906
+
907
+ - AI cannot authorize real robot execution.
908
+ - Missing customer facts remain unknown.
909
+ - Unsupported prose remains `NOT_TESTED`.
910
+ - Measurements bind to an immutable Twin revision/hash.
911
+ - Non-finite and malformed physical metrics are rejected.
912
+ - Stale campaign/regression/FAT evidence cannot preserve current readiness after evidence lineage changes.
913
+ - A verification plan is not execution evidence.
914
+ - A replay reconstruction is not execution evidence from a new run.
915
+ - Evidence bundles are content-addressed and replay validates referenced artifact IDs/types/hashes/Twin scope before reconstruction.
916
+ - The Evidence Viewer is read-only and exposes no robot-control endpoint.
917
+ - Simulation evidence does not override guarding, risk assessment, safety PLC validation, OEM controller validation, site acceptance, or engineer sign-off.
918
+
919
+ Readiness concepts remain intentionally separate:
920
+
921
+ ```text
922
+ customer_review_ready
923
+ bounded customer requirement/evidence review is complete
924
+
925
+ production_engineering_ready
926
+ supported physical requirements passed using exact-Twin measured evidence
927
+ with run/qualification provenance
928
+
929
+ physical_qualification / site_qualification / real_execution_allowed
930
+ false in the v1.2 commercial evidence workflow
931
+ ```
932
+
933
+ # Example files
934
+
935
+ - [Twin manifest template](https://github.com/tomha85/devagent-physical-engine/blob/main/examples/commercial/devagent-twin.yaml)
936
+ - [Basic structural requirements](https://github.com/tomha85/devagent-physical-engine/blob/main/examples/commercial/requirements.csv)
937
+ - [Production requirement checks](https://github.com/tomha85/devagent-physical-engine/blob/main/examples/commercial/requirements-production.csv)
938
+ - [Verification-plan input](https://github.com/tomha85/devagent-physical-engine/blob/main/examples/commercial/verification-plan.yaml)
939
+ - [Physical-measurement schema/example](https://github.com/tomha85/devagent-physical-engine/blob/main/examples/commercial/physical-measurement.json)
940
+
941
+ The examples are templates/schema examples; they are not customer-site evidence.
942
+
943
+ # Release quality
944
+
945
+ Every PR/main update runs Python 3.11/3.12/3.13 regression, compilation, Ruff checks, branch coverage, a dedicated >=90% production-authority coverage gate, a dedicated >=90% Evidence Trust/replay coverage gate, package build/clean-install smoke, CLI Evidence Trust smoke, and runtime dependency vulnerability audit.
946
+
947
+ Releases are created only from exact green `main`, rebuilt from the exact tag, clean-installed, supplied with CycloneDX SBOM + SHA-256 checksums, attached to GitHub Release, and published to PyPI through Trusted Publishing with digital attestations.
948
+
949
+ # Documentation
950
+
951
+ - [Evidence Trust v1.2](https://github.com/tomha85/devagent-physical-engine/blob/main/docs/EVIDENCE_TRUST_V12.md)
952
+ - [Production Grade v1.1](https://github.com/tomha85/devagent-physical-engine/blob/main/docs/PRODUCTION_GRADE_V1_1.md)
953
+ - [Production readiness](https://github.com/tomha85/devagent-physical-engine/blob/main/docs/PRODUCTION_READINESS.md)
954
+ - [Commercial V1](https://github.com/tomha85/devagent-physical-engine/blob/main/docs/COMMERCIAL_V1.md)
955
+ - [Commercial project spine](https://github.com/tomha85/devagent-physical-engine/blob/main/docs/COMMERCIAL_PROJECT_SPINE.md)
956
+ - [Architecture](https://github.com/tomha85/devagent-physical-engine/blob/main/docs/ARCHITECTURE.md)
957
+ - [Robot platform and Twin](https://github.com/tomha85/devagent-physical-engine/blob/main/docs/ROBOT_PLATFORM_AND_TWIN.md)
958
+ - [Measured physical runtime](https://github.com/tomha85/devagent-physical-engine/blob/main/docs/MEASURED_PHYSICAL_RUNTIME.md)
959
+ - [Qualification](https://github.com/tomha85/devagent-physical-engine/blob/main/docs/QUALIFICATION.md)
960
+ - [Optimization](https://github.com/tomha85/devagent-physical-engine/blob/main/docs/OPTIMIZATION.md)
961
+ - [AI providers](https://github.com/tomha85/devagent-physical-engine/blob/main/docs/AI_PROVIDERS.md)
962
+ - [PyPI release process](https://github.com/tomha85/devagent-physical-engine/blob/main/docs/PYPI_RELEASE.md)
963
+
964
+ ## Project status
965
+
966
+ **v1.2.0 — Production/Stable software workflow with customer Twin evidence, measured physical requirement verification, immutable evidence bundles, hardened replay reconstruction, read-only Evidence Viewer, change-impact regression, and FAT Markdown/HTML/JSON evidence.**
967
+
968
+ Production/Stable applies to the bounded software/API/CLI/evidence workflow. Physical qualification remains robot-, adapter-, workstation-, and evidence-specific. Customer-site qualification, functional-safety certification, and production-hardware command authority are not claimed and remain locked by default.
969
+
970
+ ## Ownership
971
+
972
+ DevAgent Smart Physical Engine
973
+ Copyright © 2026 Tom Ha
974
+ Original creator: Tom Ha
975
+ Original project: https://github.com/tomha85/devagent-physical-engine
976
+ All rights reserved.