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.
- devagent_physical_engine-1.2.0/PKG-INFO +976 -0
- devagent_physical_engine-1.2.0/README.md +935 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/pyproject.toml +3 -3
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/__init__.py +37 -1
- devagent_physical_engine-1.2.0/src/devagent_physical_engine/commercial_cli.py +413 -0
- devagent_physical_engine-1.2.0/src/devagent_physical_engine/evidence_replay.py +83 -0
- devagent_physical_engine-1.2.0/src/devagent_physical_engine/evidence_trust.py +897 -0
- devagent_physical_engine-1.2.0/src/devagent_physical_engine/production_authority.py +267 -0
- devagent_physical_engine-1.2.0/src/devagent_physical_engine/production_grade.py +1073 -0
- devagent_physical_engine-1.2.0/src/devagent_physical_engine.egg-info/PKG-INFO +976 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine.egg-info/SOURCES.txt +11 -0
- devagent_physical_engine-1.2.0/tests/test_evidence_replay_v12.py +149 -0
- devagent_physical_engine-1.2.0/tests/test_evidence_trust_coverage_v12.py +506 -0
- devagent_physical_engine-1.2.0/tests/test_evidence_trust_transport_v12.py +290 -0
- devagent_physical_engine-1.2.0/tests/test_evidence_trust_v12.py +281 -0
- devagent_physical_engine-1.2.0/tests/test_production_authority_v11.py +282 -0
- devagent_physical_engine-1.2.0/tests/test_production_grade_coverage_v11.py +379 -0
- devagent_physical_engine-1.2.0/tests/test_production_grade_v11.py +342 -0
- devagent_physical_engine-1.0.0/PKG-INFO +0 -398
- devagent_physical_engine-1.0.0/README.md +0 -357
- devagent_physical_engine-1.0.0/src/devagent_physical_engine/commercial_cli.py +0 -185
- devagent_physical_engine-1.0.0/src/devagent_physical_engine.egg-info/PKG-INFO +0 -398
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/NOTICE +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/setup.cfg +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/agent/__init__.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/agent/compiler.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/agent/contracts.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/agent/coordinator.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/agent/critic.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/agent/evidence.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/agent/interpreter.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/agent/planner.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/agent/recovery.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/agent/routing.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/agent/runtime.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/agent/semantic.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/agent/structured.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ai_cli.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/cli.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/commercial.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/commercial_campaign.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/commercial_importer.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/commercial_readiness.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/commercial_repository.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/continuous_clearance.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/doctor.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/engineering_agent.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/engineering_request.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/execution.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/models.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/operating_envelope.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/optimization/__init__.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/optimization/benchmark.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/optimization/candidates.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/optimization/contracts.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/optimization/evaluator.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/optimization/evidence.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/optimization/experience.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/optimization/measured.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/optimization/optimizer.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/optimization/orchestrator.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/physical_campaign.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/physical_evidence.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/physical_motion.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/planning.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/pose_math.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/preexecution_contract.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/project.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/provider_adapters/__init__.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/provider_adapters/anthropic.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/provider_adapters/common.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/provider_adapters/factory.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/provider_adapters/gemini.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/provider_adapters/openai.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/provider_qualification.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/providers.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/qualification.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/qualification_cli.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/qualification_harness.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/reference_workcell.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/robot_platform.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/robots.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/__init__.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/acceptance.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/commands.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/continuous_clearance_probe.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/doctor.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/fk_pose.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/fk_probe.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/frame_alignment.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/gazebo_cli.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/gazebo_pose.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/gazebo_world.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/joint_state_probe.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/joint_state_recorder.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/measured_motion.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/moveit_joint_plan_probe.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/moveit_scene.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/moveit_task_planner.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/preexecution.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/qualification.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/qualification_v10.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/qualification_v11.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/qualification_v12.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/scene_probe.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/state_validity_probe.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/task_adapter.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/task_visualization.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/tf_probe.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/tool_scene.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/tool_scene_probe.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/trajectory.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/trajectory_action_probe.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/trajectory_tracking.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/ur5e.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/ur5e_adapter.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/ur5e_v10_adapter.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/workpiece_follow.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/workpiece_gazebo_follower.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/workpiece_scene.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/ros2/workpiece_scene_probe.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/setup_profile.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/sim_real_qualification.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/simulation.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/simulation_platform.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/tool_collision.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/trajectory_qualification.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/twin.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/twin_builder.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/twin_materialization.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/verification.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine/workpiece_lifecycle.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine.egg-info/dependency_links.txt +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine.egg-info/entry_points.txt +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine.egg-info/requires.txt +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/src/devagent_physical_engine.egg-info/top_level.txt +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_agent_core.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_agent_semantic_hardening.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_ai_cli.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_ai_cli_v07.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_commercial_importer_v1.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_commercial_readiness_v1.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_commercial_v1.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_continuous_clearance_v011.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_core.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_engineering_request_v07.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_gazebo_cli_v0122.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_interpreter_profiles_v08.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_joint_state_probe_v0125.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_live_provider_qualification.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_measured_motion_v10.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_moveit_planning_diagnostics_v0125.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_moveit_scene_v0123.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_natural_language_agent_v07.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_openai_strict_schema_v0113.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_optimization_v05.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_physical_campaign_v09.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_physical_evidence_v09.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_physical_motion_v09.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_planning_fallback_v012.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_pose_math_v0125.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_preexecution_contract_v10.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_project_spine_v013.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_provider_and_qualification.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_qualification_cli_lifecycle_v06.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_qualification_harness_v06.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_readme_pypi.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_real_provider_adapters.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_reference_workcell_ros_frames_v0125.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_reference_workcell_v012.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_robot_platform_v08.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_ros2_production_receipts_v011.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_ros2_simulation.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_ros_trajectory_v09.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_setup_profile.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_sim_real_qualification_v011.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_simulation_platform_v08.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_tool_collision_v011.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_tool_scene_v0124.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_trajectory_action_probe_v0125.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_trajectory_qualification_v09.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_trajectory_tracking_v0125.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_twin_materialization_v10.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_twin_v08.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_ur5e_adapter_scopes_v09.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_ur5e_v10_adapter_scopes.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_v052_stabilization.py +0 -0
- {devagent_physical_engine-1.0.0 → devagent_physical_engine-1.2.0}/tests/test_v08_catalog_mapping_regression.py +0 -0
- {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
|
+
[](https://pypi.org/project/devagent-physical-engine/)
|
|
45
|
+
[](https://pypi.org/project/devagent-physical-engine/)
|
|
46
|
+
[](#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.
|