Skip to content

feat(skills): add declarative placement relations - #481

Merged
yuecideng merged 38 commits into
mainfrom
feat/placement-relation-bindings
Aug 25, 2026
Merged

feat(skills): add declarative placement relations#481
yuecideng merged 38 commits into
mainfrom
feat/placement-relation-bindings

Conversation

@yuecideng

@yuecidengyuecideng commented Aug 11, 2026

Copy link
Copy Markdown
Contributor

Description

Stack

Defaults remain capability-scoped and all target poses are resolved from fresh registry snapshots. The implementation never guesses a frame from an entity name, mesh, or bounding box, so new tasks using an existing placement capability need scene configuration rather than task-local motion code.

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.py tests/sim/skills/test_compiler.py tests/gym/envs/expert_program/test_catalog.py -k 'support or container or relation or placement' — 12 passed, 58 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 declarations, defaults, live grounding, and automatic registration.
  • 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/placement-relation-bindings branch from 06a764e to 6fd5714CompareAugust 11, 2026 16:09
@yuecidengyuecideng added atomic action atomic action related functionality 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:11
@greptile-apps

greptile-appsBot commented Aug 11, 2026

Copy link
Copy Markdown

Greptile Summary

The PR adds declarative support-surface and container placement relations, including validated scene bindings, capability-scoped defaults, live target grounding, and automatic grounder registration.

  • Exposes and documents the new placement bindings, affordance payloads, and relation grounders.
  • Projects placement declarations into scene manifests and live registries using explicit object, articulation, or link parents.
  • Adds tests for defaults, live poses, confidence thresholds, and automatic registration.

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.pyAdds validated declarative placement bindings and projects their parent-relative target frames and defaults into manifests and registries.
embodichain/lab/gym/envs/expert_program/catalog.pyAutomatically installs exact built-in relation grounders when the scene declares support-surface or container bindings.
embodichain/lab/sim/skills/compiler.pyAdds typed support-surface and container grounders that preserve late pose resolution and configured confidence thresholds.
embodichain/lab/sim/skills/scene.pyDefines the versioned placement affordance payloads and validates their confidence thresholds.
docs/source/api_reference/embodichain/embodichain.lab.gym.envs.expert_program.rstDocuments the newly exported declarative placement binding classes and their public members.
docs/source/api_reference/embodichain/embodichain.lab.sim.skills.rstAdds API references for the built-in support-surface and container relation grounders.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart LR
A[Placement binding] --> B[SimulationSceneBinding]
B --> C[Scene manifest and registry]
C --> D[Typed placement affordance]
B --> E[Automatic grounder registration]
D --> F[Semantic placement relation]
E --> F
F --> G[Late-bound SceneEntityPose]
Loading

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

raise TypeError("is_default must be a bool.")


@dataclass(frozen=True, slots=True)

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 placement API

The newly exported placement bindings, affordance payloads, and relation grounders have no corresponding public documentation in this changeset, leaving users without guidance on declaration fields, registration behavior, or usage.

Context Used: CLAUDE.md (source)

Prompt To Fix With AI
This is a comment left during a code review.
Path: embodichain/lab/gym/envs/expert_program/simulation.py
Line: 363
Comment:
**Document the public placement API**
The newly exported placement bindings, affordance payloads, and relation grounders have no corresponding public documentation in this changeset, leaving users without guidance on declaration fields, registration behavior, or usage.
**Context Used:** CLAUDE.md ([source](https://github.com/dexforce/embodichain/blob/main/CLAUDE.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/placement-relation-bindings branch from 6fd5714 to 420cad6CompareAugust 21, 2026 09:35
@skywhite1024
skywhite1024force-pushed the feat/placement-relation-bindings branch from 420cad6 to 6fd5714CompareAugust 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
Base automatically changed from feat/workflow-reacquisition to mainAugust 25, 2026 08:54
# 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/sim/atomic_actions/execution.py
#	embodichain/lab/sim/skills/__init__.py
#	embodichain/lab/sim/skills/compiler.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_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 f099dca into mainAug 25, 2026
2 checks passed
@yuecideng
yuecideng deleted the feat/placement-relation-bindings branch August 25, 2026 11:20
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

atomic actionatomic action related functionalityenhancementNew feature or requestgymrobot learning env and its related features

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant

@yuecideng