Skip to content

feat(expert-program): validate parallel joint segments - #482

Merged
yuecideng merged 40 commits into
mainfrom
feat/production-parallel-safety
Aug 25, 2026
Merged

feat(expert-program): validate parallel joint segments#482
yuecideng merged 40 commits into
mainfrom
feat/production-parallel-safety

Conversation

@yuecideng

@yuecidengyuecideng commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Description

Stack

Every supplied sample is checked against cuRobo joint bounds, self-collision, and the registry-backed live static/dynamic world. Uncovered joints, overlapping commands, collision rows, and sample-cap under-sampling fail closed. The gate validates the command as written; it neither replans nor replaces the trajectory.

Refs #471
Refs #474

Type of change

  • New feature (non-breaking change which adds functionality)

Screenshots

Not applicable.

Validation

  • pytest -q tests/gym/envs/expert_program/test_simulation_parallel_safety.py tests/sim/planners/test_curobo_planner.py tests/gym/envs/expert_program/test_catalog.py tests/gym/envs/expert_program/test_extensions.py tests/gym/envs/expert_program/test_simulation_environment.py — 164 passed, 1 skipped, 2 deselected
  • Black 26.3.1 check on changed Python files

Checklist

  • Changed Python files pass Black 26.3.1.
  • Public API and usage documentation is completed by follow-up layer test(tasks): gate cube physical recovery #483.
  • Tests cover exact sample order, dense interpolation, row-local collision, live world updates, and fail-closed configuration.
  • No dependency update is required.

Make endpoint bindings, timed command frames, transports, routing, safe holds, and profile lowering controller-agnostic. Preserve joint trajectories as optional feedback artifacts and add staged, same-address invocation revision semantics for mobile and whole-body safety.
@yuecideng
yuecidengforce-pushed the feat/production-parallel-safety branch from a271c5a to a41a4cdCompareAugust 11, 2026 16:09
@yuecidengyuecideng added motion gen Things related to motion generation for robot gym robot learning env and its related features enhancement New feature or request labels Aug 11, 2026
@yuecideng
yuecideng marked this pull request as ready for review August 11, 2026 16:12
@greptile-apps

greptile-appsBot commented Aug 11, 2026

Copy link
Copy Markdown

Greptile Summary

This PR adds a cuRobo-backed safety gate for synchronized joint-position branches.

  • Introduces validator and factory APIs bound to the assembled simulation runtime.
  • Densifies merged joint segments and validates bounds, self-collision, and the live collision world.
  • Extends planner interfaces with exact joint-trajectory validation support.
  • Adds focused catalog, extension, planner, and parallel-safety tests.

Confidence Score: 5/5

The PR appears safe to merge.

No blocking failure remains.

Important Files Changed

FilenameOverview
embodichain/lab/gym/envs/expert_program/simulation_parallel_safety.pyAdds the cuRobo-backed parallel-command validator, runtime-bound factory, interpolation, and fail-closed validation.
embodichain/lab/gym/envs/expert_program/catalog.pyBinds validator creation to the exact scene registry, action engine, and robot owned by the runtime assembly.
embodichain/lab/gym/envs/expert_program/simulation_environment.pyPasses the assembled scene registry and action engine into registration-owned validator creation.
embodichain/lab/sim/planners/curobo/curobo_planner.pyAdds cuRobo trajectory-validation behavior used by the parallel safety gate.
embodichain/lab/sim/planners/motion_generator.pyExposes planner trajectory-validation capability through the motion-generator boundary.
tests/gym/envs/expert_program/test_simulation_parallel_safety.pyCovers synchronized sampling, interpolation, collision handling, live world updates, and fail-closed configuration.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart LR
A[Parallel branch frames] --> B[Merge joint commands]
B --> C[Combine with measured robot state]
C --> D[Densify joint segment]
D --> E[Validate joint bounds]
E --> F[Validate self-collision]
F --> G[Validate live world collision]
G --> H{All samples safe?}
H -->|Yes| I[Dispatch merged command]
H -->|No| J[Reject command]
Loading

Reviews (5): Last reviewed commit: "Merge branch 'main' into feat/production..." | Re-trigger Greptile

Comment on lines +158 to +161
from .simulation_parallel_safety import (
CuroboParallelCommandSafetyValidator,
CuroboParallelSafetyValidatorFactory,
)

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2Document the public safety APIs

These exports add public validator and factory APIs without documenting their required aggregate control-part configuration, interpolation limits, runtime dependencies, or integration procedure, leaving users without the repository's required public API guidance.

Context Used: AGENTS.md (source)

Prompt To Fix With AI
This is a comment left during a code review.
Path: embodichain/lab/gym/envs/expert_program/__init__.py
Line: 158-161
Comment:
**Document the public safety APIs**
These exports add public validator and factory APIs without documenting their required aggregate control-part configuration, interpolation limits, runtime dependencies, or integration procedure, leaving users without the repository's required public API guidance.
**Context Used:** AGENTS.md ([source](https://github.com/dexforce/embodichain/blob/main/AGENTS.md))
---
For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

Fix in CodexFix in Claude Code

@skywhite1024
skywhite1024force-pushed the feat/production-parallel-safety branch from a41a4cd to ba13943CompareAugust 21, 2026 09:35
@skywhite1024
skywhite1024force-pushed the feat/production-parallel-safety branch from ba13943 to a41a4cdCompareAugust 21, 2026 11:31
…alog
# Conflicts:
#	agent_context/MAP.yaml
#	agent_context/topics/atomic-actions/atomic-actions.md
#	agent_context/topics/motion-planning/motion-planning.md
#	docs/design/declarative_expert_program_plan.md
#	docs/design/expert_program_rollout_report.md
#	docs/source/api_reference/embodichain/embodichain.lab.gym.envs.expert_program.rst
#	docs/source/api_reference/embodichain/embodichain.lab.sim.atomic_actions.rst
#	docs/source/api_reference/embodichain/embodichain.lab.sim.skills.rst
#	docs/source/overview/sim/atomic_actions/builtin_actions.md
#	docs/source/overview/sim/atomic_actions/expert_programs.md
#	docs/source/overview/sim/atomic_actions/index.md
#	docs/source/overview/sim/atomic_actions/robot_skill_profiles.md
#	docs/source/overview/sim/index.rst
#	docs/source/overview/sim/scene_registry.md
#	docs/source/tutorial/atomic_actions.rst
#	embodichain/agents/mllm/expert_program.py
#	embodichain/lab/gym/envs/__init__.py
#	embodichain/lab/gym/envs/demo.py
#	embodichain/lab/gym/envs/embodied_env.py
#	embodichain/lab/gym/envs/expert_program/__init__.py
#	embodichain/lab/gym/envs/expert_program/bridge.py
#	embodichain/lab/gym/envs/expert_program/cfg.py
#	embodichain/lab/gym/envs/expert_program/compiler.py
#	embodichain/lab/gym/envs/expert_program/decoder.py
#	embodichain/lab/gym/envs/expert_program/environment.py
#	embodichain/lab/gym/envs/expert_program/loader.py
#	embodichain/lab/gym/envs/expert_program/simulation.py
#	embodichain/lab/gym/envs/expert_program/simulation_environment.py
#	embodichain/lab/gym/envs/expert_program/simulation_policies.py
#	embodichain/lab/gym/envs/managers/_event_functors/dynamic_settling.py
#	embodichain/lab/gym/utils/gym_utils.py
#	embodichain/lab/sim/atomic_actions/__init__.py
#	embodichain/lab/sim/atomic_actions/affordance.py
#	embodichain/lab/sim/atomic_actions/bindings.py
#	embodichain/lab/sim/atomic_actions/core.py
#	embodichain/lab/sim/atomic_actions/engine.py
#	embodichain/lab/sim/atomic_actions/execution.py
#	embodichain/lab/sim/atomic_actions/goals.py
#	embodichain/lab/sim/atomic_actions/plans.py
#	embodichain/lab/sim/atomic_actions/primitives/_helpers.py
#	embodichain/lab/sim/atomic_actions/primitives/coordinated_pickment.py
#	embodichain/lab/sim/atomic_actions/primitives/coordinated_placement.py
#	embodichain/lab/sim/atomic_actions/primitives/hand_over.py
#	embodichain/lab/sim/atomic_actions/primitives/move_end_effector.py
#	embodichain/lab/sim/atomic_actions/primitives/move_held_object.py
#	embodichain/lab/sim/atomic_actions/primitives/move_joints.py
#	embodichain/lab/sim/atomic_actions/primitives/pick_up.py
#	embodichain/lab/sim/atomic_actions/primitives/place.py
#	embodichain/lab/sim/atomic_actions/primitives/press.py
#	embodichain/lab/sim/atomic_actions/runtime.py
#	embodichain/lab/sim/atomic_actions/state.py
#	embodichain/lab/sim/planners/base_planner.py
#	embodichain/lab/sim/planners/curobo/curobo_planner.py
#	embodichain/lab/sim/planners/curobo/curobo_yaml.py
#	embodichain/lab/sim/planners/motion_generator.py
#	embodichain/lab/sim/skills/__init__.py
#	embodichain/lab/sim/skills/calls.py
#	embodichain/lab/sim/skills/compiler.py
#	embodichain/lab/sim/skills/integration.py
#	embodichain/lab/sim/skills/parallel_runtime.py
#	embodichain/lab/sim/skills/profiles.py
#	embodichain/lab/sim/skills/runtime.py
#	embodichain/lab/sim/skills/scene.py
#	embodichain_tasks/configs/gym/expert_program/repeated_pick_place.json
#	embodichain_tasks/configs/gym/open_drawer/cobot_magic_3cam.json
#	embodichain_tasks/embodichain_tasks/multi_segments/cube_pick_place.py
#	embodichain_tasks/embodichain_tasks/tableware/open_drawer.py
#	scripts/benchmark/atomic_action/press_benchmark.py
#	scripts/tools/expert_program_rollout_report.py
#	scripts/tutorials/atomic_action/assemble.py
#	scripts/tutorials/atomic_action/coordinated_pickment.py
#	scripts/tutorials/atomic_action/coordinated_placement.py
#	scripts/tutorials/atomic_action/dynamic_obstacle_recovery.py
#	scripts/tutorials/atomic_action/hand_over.py
#	scripts/tutorials/atomic_action/move_end_effector.py
#	scripts/tutorials/atomic_action/move_held_object.py
#	scripts/tutorials/atomic_action/move_joints.py
#	scripts/tutorials/atomic_action/moving_target_recovery.py
#	scripts/tutorials/atomic_action/pickup.py
#	scripts/tutorials/atomic_action/place.py
#	scripts/tutorials/atomic_action/press.py
#	tests/agents/mllm/test_expert_program.py
#	tests/benchmark/expert_program/test_demo_success_open_drawer_sim.py
#	tests/gym/envs/expert_program/test_bridge.py
#	tests/gym/envs/expert_program/test_compiler.py
#	tests/gym/envs/expert_program/test_completion_metadata.py
#	tests/gym/envs/expert_program/test_decoder.py
#	tests/gym/envs/expert_program/test_environment.py
#	tests/gym/envs/expert_program/test_loader.py
#	tests/gym/envs/expert_program/test_parallel_compiler.py
#	tests/gym/envs/expert_program/test_parallel_schema.py
#	tests/gym/envs/expert_program/test_simulation.py
#	tests/gym/envs/expert_program/test_simulation_environment.py
#	tests/gym/envs/expert_program/test_simulation_policies.py
#	tests/gym/envs/expert_program/test_task_vertical_slices.py
#	tests/gym/envs/tasks/test_multi_segments_cube_pick_place.py
#	tests/gym/envs/test_demo.py
#	tests/gym/envs/test_embodied_env_expert_program.py
#	tests/gym/utils/test_gym_utils.py
#	tests/lab/scripts/test_run_env.py
#	tests/scripts/tools/test_expert_program_rollout_report.py
#	tests/sim/atomic_actions/test_actions.py
#	tests/sim/atomic_actions/test_affordance.py
#	tests/sim/atomic_actions/test_control.py
#	tests/sim/atomic_actions/test_core.py
#	tests/sim/atomic_actions/test_endpoint_runtime_e2e.py
#	tests/sim/atomic_actions/test_engine.py
#	tests/sim/atomic_actions/test_engine_per_env.py
#	tests/sim/atomic_actions/test_runner.py
#	tests/sim/atomic_actions/test_trajectory_ops.py
#	tests/sim/planners/test_curobo_planner.py
#	tests/sim/planners/test_motion_generator_batched.py
#	tests/sim/skills/test_calls.py
#	tests/sim/skills/test_compiler.py
#	tests/sim/skills/test_curobo_semantic_runtime_dynamic_recovery_gpu.py
#	tests/sim/skills/test_effects.py
#	tests/sim/skills/test_evidence.py
#	tests/sim/skills/test_integration.py
#	tests/sim/skills/test_parallel_runtime.py
#	tests/sim/skills/test_profiles.py
#	tests/sim/skills/test_runtime.py
#	tests/sim/skills/test_scene.py
#	tests/test_expert_program_package_data.py
…feat/workflow-reacquisition
# Conflicts:
#	agent_context/topics/atomic-actions/atomic-actions.md
#	docs/design/declarative_expert_program_plan.md
#	docs/source/api_reference/embodichain/embodichain.lab.sim.atomic_actions.rst
#	docs/source/overview/sim/atomic_actions/index.md
#	embodichain/lab/gym/envs/expert_program/catalog.py
#	embodichain/lab/gym/envs/expert_program/simulation_environment.py
#	embodichain/lab/sim/atomic_actions/execution.py
#	embodichain/lab/sim/atomic_actions/invocation.py
#	embodichain/lab/sim/skills/compiler.py
#	embodichain/lab/sim/skills/runtime.py
#	embodichain_tasks/embodichain_tasks/multi_segments/cube_pick_place.py
#	embodichain_tasks/embodichain_tasks/tableware/__init__.py
#	tests/gym/envs/expert_program/test_simulation_environment.py
#	tests/gym/envs/tasks/test_multi_segments_cube_pick_place.py
#	tests/gym/envs/tasks/test_open_drawer.py
#	tests/sim/atomic_actions/test_engine_per_env.py
#	tests/sim/skills/test_compiler.py
#	tests/sim/skills/test_profiles.py
#	tests/sim/skills/test_runtime.py
…on-bindings
# Conflicts:
#	embodichain/lab/gym/envs/expert_program/__init__.py
#	embodichain/lab/gym/envs/expert_program/catalog.py
#	embodichain/lab/gym/envs/expert_program/simulation.py
#	embodichain/lab/sim/skills/__init__.py
#	embodichain/lab/sim/skills/compiler.py
#	tests/gym/envs/expert_program/test_simulation.py
…parallel-safety
# Conflicts:
#	embodichain/lab/gym/envs/expert_program/__init__.py
#	embodichain/lab/sim/planners/base_planner.py
#	embodichain/lab/sim/planners/curobo/curobo_planner.py
#	tests/gym/envs/expert_program/test_catalog.py
#	tests/gym/envs/expert_program/test_simulation_environment.py
Base automatically changed from feat/placement-relation-bindings to mainAugust 25, 2026 11:20
# Conflicts:
#	docs/design/declarative_expert_program_plan.md
#	docs/source/api_reference/embodichain/embodichain.lab.gym.envs.expert_program.rst
#	docs/source/api_reference/public_api.rst
#	embodichain/lab/gym/envs/expert_program/__init__.py
#	embodichain/lab/gym/envs/expert_program/catalog.py
#	embodichain/lab/gym/envs/expert_program/environment.py
#	embodichain/lab/gym/envs/expert_program/extensions.py
#	embodichain/lab/gym/envs/expert_program/simulation.py
#	embodichain/lab/gym/envs/expert_program/simulation_environment.py
#	embodichain/lab/sim/atomic_actions/execution.py
#	embodichain/lab/sim/skills/runtime.py
#	embodichain_tasks/configs/expert_program/hand_over.yaml
#	embodichain_tasks/configs/gym/expert_program/hand_over.json
#	embodichain_tasks/embodichain_tasks/expert_program/hand_over.py
#	embodichain_tasks/embodichain_tasks/expert_program/open_drawer.py
#	tests/gym/envs/expert_program/test_catalog.py
#	tests/gym/envs/expert_program/test_extensions.py
#	tests/gym/envs/expert_program/test_simulation_environment.py
#	tests/gym/envs/expert_program/test_task_hand_over.py
#	tests/sim/atomic_actions/test_engine_per_env.py
#	tests/sim/skills/test_runtime.py
@yuecideng
yuecideng merged commit 11209fa into mainAug 25, 2026
3 of 5 checks passed
@yuecideng
yuecideng deleted the feat/production-parallel-safety branch August 25, 2026 12:31
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancementNew feature or requestgymrobot learning env and its related featuresmotion genThings related to motion generation for robot

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@yuecideng