Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
205 commits
Select commit Hold shift + click to select a range
8d20b8d
Docs: rewrite install guide and make lerobot a required dependency (#…
yuecideng Apr 12, 2026
d2a8dad
Update cobotmagic arm asset. (#228)
matafela Apr 13, 2026
987d04f
Fix opw solver (#229)
matafela Apr 15, 2026
80368bd
Fix crashing when no grasp pose found. (#232)
matafela Apr 15, 2026
59021a4
add rl benchmark (#231)
matafela Apr 15, 2026
d860435
Enhance workspace analyzer computational efficiency (#230)
yuecideng Apr 15, 2026
d52ea77
Update CobotMagic default safe margin (#235)
matafela Apr 16, 2026
d5bf930
Fix demo action shape normalization and control-part mapping (#237)
yuecideng Apr 16, 2026
3bb2592
Refine URDF assembly component prefixes and name casing policy (#236)
chase6305 Apr 19, 2026
50843a5
Refactor: benchmark (#233)
matafela Apr 20, 2026
e0e16ae
Update pytorch kinematic solver benchmark param (#240)
matafela Apr 20, 2026
0497711
fix plan_trajectory (#242)
yhnsu Apr 22, 2026
ccce98a
docs: add NVIDIA driver guide and mesh loading tutorial (#245)
XuanchaoPENG Apr 23, 2026
386dc66
Add multi-version documentation build support (#234)
yuecideng Apr 24, 2026
9fb2204
Fix README docs link (#246)
yuecideng Apr 24, 2026
06258f1
docs: add AI coding agent skills and cross-reference throughout docum…
yuecideng Apr 28, 2026
72e9731
fix: correct the link of website (#249)
yangchen73 Apr 29, 2026
c824c86
docs: upgrade README badges and add auto-sync to introduction.rst (#250)
yuecideng Apr 29, 2026
8e92c08
upgrade pytorch kinematics (#244)
matafela Apr 30, 2026
72b5bb9
chore: upgrade black to 26.3.1 and fix code style (#251)
yuecideng Apr 30, 2026
fc54598
Improve API reference detail and coverage (#252)
yuecideng May 1, 2026
168f11c
feat: Add atomic action abstraction layer for embodied AI motion gene…
yuecideng May 1, 2026
c5e6f00
Fix pytorch solver qpos mapping (#253)
matafela May 7, 2026
23a1208
docs: Remove AI coding agent skills references (#254)
yuecideng May 7, 2026
076fc65
docs: add data generation tutorial for synthesized data pipeline (#238)
yvvonie May 8, 2026
f81b8a6
Update skills structure and roadmap docs (#257)
yuecideng May 8, 2026
9e34ec1
Adapt dexsim v0.4.0 (#226)
yuecideng May 9, 2026
72ffe43
docs: add uv installation support and update dependencies (#258)
yuecideng May 9, 2026
c6ce00f
Fix PyPI release workflow (#259)
yuecideng May 9, 2026
e11eb4e
docs: improve navigation, cross-references, and guides (#262)
yuecideng May 12, 2026
a251699
Fix multiversion docs overwrite on main branch push (#263)
yuecideng May 12, 2026
6e5f745
docs: add academic publications page (#265)
yuecideng May 12, 2026
c322584
Fix multiversion docs overwrite on main push (#266)
yuecideng May 12, 2026
5cdd9c2
ci: fix docs deployment to use GitHub Actions Pages source
yuecideng May 12, 2026
2a8b56c
ci: fix multiversion docs deployment (#267)
yuecideng May 12, 2026
5bc76ce
fix opw tcp (#261)
matafela May 13, 2026
c3f5b4d
Annotate full mesh (#260)
matafela May 19, 2026
83ef059
Adapt DexSim v0.4.1 (#272)
yuecideng May 19, 2026
498dce9
Add emissive light mode to randomize_indirect_lighting (#274)
yuecideng May 20, 2026
d46bedb
fix atomic action (#273)
XuanchaoPENG May 21, 2026
7823731
Add Newton physics backend support
yuecideng May 21, 2026
77963fa
sim-ready pipeline (#271)
XuanchaoPENG May 21, 2026
178c730
wip
yuecideng May 22, 2026
1773778
Fix multi-version GitHub Pages docs deployment (#277)
yuecideng May 22, 2026
010d3cd
update design docs
yuecideng May 23, 2026
2314a05
update cfg
yuecideng May 24, 2026
6878a9b
Merge remote-tracking branch 'origin/main' into feature/newton-physic…
yuecideng May 24, 2026
6c1e26e
wip
yuecideng May 25, 2026
65a8475
wip
yuecideng May 25, 2026
1d8d416
wip
yuecideng May 25, 2026
85a8ee4
wip
yuecideng May 25, 2026
1250aa0
style
yuecideng May 25, 2026
fef305e
standardize lerobot key (#280)
yhnsu May 26, 2026
41edaa4
wip
yuecideng May 26, 2026
bc1a8b3
Fix rigid object init ordering and reset after GPU physics setup (#283)
yuecideng May 26, 2026
a811b1d
Merge remote-tracking branch 'origin/main' into feature/newton-physic…
yuecideng May 26, 2026
87eedfe
wip
yuecideng May 26, 2026
389cfa9
Add YAML support for gym and RL training configs (#284)
yuecideng May 26, 2026
c5192b3
wip
yuecideng May 26, 2026
590211c
Add per-link articulation physics configuration (#278)
yuecideng May 26, 2026
aafc199
wip
yuecideng May 26, 2026
23feec1
wip
yuecideng May 26, 2026
1747cc4
wip
yuecideng May 28, 2026
3e4d4ee
Fix base solver fk (#285)
matafela May 28, 2026
cf5184e
wip
yuecideng May 28, 2026
7f09bb2
wip
yuecideng May 29, 2026
f87d885
wip
yuecideng May 29, 2026
0486c39
feat(newton): enable runtime mutation of physical properties via Newt…
yuecideng May 30, 2026
b3236fc
feat(sim): optimize Newton backend + expand rigid-object test coverage
yuecideng May 31, 2026
8c224a9
wip
yuecideng Jun 1, 2026
826d047
wip
yuecideng Jun 2, 2026
98c12d5
feat: add agent context routing system for EmbodiChain (#288)
yuecideng Jun 3, 2026
dd0f021
wip
yuecideng Jun 3, 2026
d93e61a
Add neural network IK solver (#286)
yangchen73 Jun 3, 2026
4b6852d
wip
yuecideng Jun 3, 2026
6034f7b
wip
yuecideng Jun 3, 2026
70dfc53
Add joint armature support for articulations (#290)
yuecideng Jun 4, 2026
1b86641
Align window controls with DexSim defaults (#291)
yuecideng Jun 4, 2026
9fcc807
Merge branch 'main' into feature/newton-physics-backend
yuecideng Jun 4, 2026
044877e
Improve installation guide and deduplicate gensim install docs (#293)
yuecideng Jun 4, 2026
1819048
Fix recording for PourWater (#292)
yangchen73 Jun 5, 2026
cb3240b
Auto-select default renderer based on GPU (#294)
yuecideng Jun 9, 2026
52e8a22
Merge remote-tracking branch 'origin/main' into feature/newton-physic…
yuecideng Jun 10, 2026
74bf17a
wip
yuecideng Jun 11, 2026
d5007f0
Merge remote-tracking branch 'origin/main' into feature/newton-physic…
yuecideng Jun 15, 2026
b338f4d
init articulation
yuecideng Jun 15, 2026
f8227f6
Merge remote-tracking branch 'origin/main' into feature/newton-physic…
yuecideng Jun 16, 2026
ceec28f
wip
yuecideng Jun 16, 2026
8388b4b
wip
yuecideng Jun 16, 2026
61855dc
wip
yuecideng Jun 16, 2026
c3923a8
add physcis backend
yuecideng Jun 18, 2026
396009f
wip: prepare Newton backend wiring for add_robot
yuecideng Jun 19, 2026
6b4709a
feat: enable RigidObject runtime attr mutation on Newton backend
yuecideng Jun 19, 2026
59fa679
feat: enable add_robot on the Newton backend
yuecideng Jun 19, 2026
1e3e75d
feat: Newton-native physics-attribute config for RigidObject & Articu…
yuecideng Jun 19, 2026
30a6ffe
test: add backend capability parity matrix
yuecideng Jun 19, 2026
3ccce78
feat: push per-link mass live on Newton in Articulation.set_link_phys…
yuecideng Jun 19, 2026
4d43fbc
fix: harden RigidObject not-ready Newton setter paths to mirror to meta
yuecideng Jun 19, 2026
a439bcb
wip
yuecideng Jun 19, 2026
006d2a1
wip
yuecideng Jun 21, 2026
4d0257c
docs: add Newton backend PR design (multi-env + differentiable env)
yuecideng Jun 21, 2026
79d3252
docs: implementation plan for Newton backend PR (multi-env + APG)
yuecideng Jun 21, 2026
86ead01
feat(sim/newton): add _arenas_cloned lifecycle flag
yuecideng Jun 21, 2026
56d0fc6
Revert "feat(sim/newton): add _arenas_cloned lifecycle flag"
yuecideng Jun 21, 2026
fc33a76
docs: revise Newton PR plan — Target 4 already complete
yuecideng Jun 21, 2026
56f1c9a
feat(sim): SimulationManager delegators for Newton diff stepper
yuecideng Jun 21, 2026
611d735
test(sim): isolate grad-guard test with semi_implicit solver
yuecideng Jun 21, 2026
68e3341
feat(sim/diff): Warp-tape <-> PyTorch-autograd bridge
yuecideng Jun 21, 2026
65f4488
feat(gym): DifferentiableEmbodiedEnv for APG
yuecideng Jun 21, 2026
13b981f
feat(gym/tasks): Franka FR3 reach APG example
yuecideng Jun 21, 2026
dec2222
docs: Newton differentiable-env topic + design doc update
yuecideng Jun 21, 2026
b18cb77
Merge branch 'main' into feature/newton-physics-backend
yuecideng Jun 23, 2026
8e1becc
wip
yuecideng Jun 23, 2026
a2ad495
Merge branch 'main' into feature/newton-physics-backend
yuecideng Jul 1, 2026
75d3183
Merge branch 'main' into feature/newton-physics-backend
yuecideng Jul 1, 2026
c3d3cd6
fix num_envs issue
yuecideng Jul 1, 2026
f9dca60
wip
yuecideng Jul 13, 2026
1d4b9eb
docs: define Newton runtime integration contracts
yuecideng Jul 13, 2026
ee88d7f
docs: plan Newton runtime contracts stage 1
yuecideng Jul 13, 2026
a9be048
fix(diff): default environments use Newton solver dynamics
yuecideng Jul 14, 2026
495d3be
fix(diff): persist Newton solver trajectory
yuecideng Jul 14, 2026
a1c4fff
fix(diff): use manager-owned Newton trajectories
yuecideng Jul 15, 2026
b5ac98d
fix(diff): defer resets until Newton backward
yuecideng Jul 15, 2026
0234479
Merge remote-tracking branch 'origin/main' into feature/newton-physic…
yuecideng Aug 5, 2026
8a40568
Merge branch 'main' into pr-276
yuecideng Aug 9, 2026
fe49dca
refactor: spawn
Aug 18, 2026
cd72a43
wip
Aug 18, 2026
a3a5c05
fix tutorial
Aug 19, 2026
75f9068
prepare envs
Aug 19, 2026
86ee783
add sim.prepare()
Aug 20, 2026
64b22be
Merge branch 'main' into feature/newton-physics-backend
yuecideng Aug 20, 2026
93b6bcb
Merge branch 'feature/newton-physics-backend' into xiemh
yuecideng Aug 20, 2026
f664125
wip
yuecideng Aug 20, 2026
bd25281
wip
Aug 21, 2026
59e063b
wip
Aug 21, 2026
5edfc80
0821fix example
Aug 21, 2026
d3fa5f6
modify default cfg
Aug 24, 2026
b448bd9
Adapt Spawn integration to DexSim 0.5 APIs (#546)
yuecideng Aug 27, 2026
145229a
refactor spawn (#516)
MahooX Aug 27, 2026
8fa5731
wip
yuecideng Aug 27, 2026
42cca74
Merge branch 'yueci/tmp-adapt' into feature/newton-physics-backend
yuecideng Aug 27, 2026
9483285
Merge remote-tracking branch 'origin/main' into feature/newton-physic…
yuecideng Aug 27, 2026
89efc74
wip
yuecideng Aug 28, 2026
a58d226
wip
yuecideng Aug 28, 2026
74912dd
wip
yuecideng Aug 28, 2026
6d612e2
feat(sim)!: make deformables Newton-only
yuecideng Aug 28, 2026
55eef03
Merge remote-tracking branch 'origin/main' into feature/newton-physic…
yuecideng Aug 29, 2026
f8d1436
wip
yuecideng Aug 30, 2026
1f6905e
Merge branch 'feature/newton-physics-backend' into codex/newton-only-…
yuecideng Aug 31, 2026
76fef95
refactor(gym)!: make differentiable env kinematics-only
yuecideng Aug 31, 2026
9d76bef
wip
yuecideng Aug 31, 2026
41769ba
wip
yuecideng Aug 31, 2026
88f74a8
wip
yuecideng Aug 31, 2026
918611d
support auto solver
yuecideng Sep 1, 2026
334505c
wip
yuecideng Sep 1, 2026
3067d68
Merge branch 'main' into feature/newton-physics-backend
yuecideng Sep 1, 2026
72b860a
feat(sim): add Newton deformable demos and controls
Sep 1, 2026
01f569a
wip
yuecideng Sep 2, 2026
092773a
Merge branch 'newton-contact'
Sep 3, 2026
682da25
fix(sim): restore camera attachments after topology rebuild
Sep 3, 2026
bf696da
wip
yuecideng Sep 3, 2026
cb926b8
Merge branch 'feature/newton-physics-backend' of https://github.com/D…
yuecideng Sep 3, 2026
67d8760
test(sim): lock complete contact reporting
Sep 4, 2026
577c502
wip
yuecideng Sep 4, 2026
f85e219
Merge branch 'main' into feature/newton-physics-backend
yuecideng Sep 6, 2026
c8bab37
Add full-horizon waypoint APG training foundation (#570)
yuecideng Sep 6, 2026
3697220
Merge branch 'feature/newton-physics-backend' of https://github.com/D…
yuecideng Sep 6, 2026
7ac83f9
Merge PR #564 into feature/newton-physics-backend
yuecideng Sep 6, 2026
d9b61fe
wip
yuecideng Sep 6, 2026
bfa9652
wip
yuecideng Sep 6, 2026
eb584cb
wip
yuecideng Sep 6, 2026
135116c
wip
yuecideng Sep 7, 2026
15f120b
Merge remote-tracking branch 'origin/main' into feature/newton-physic…
yuecideng Sep 8, 2026
58031b4
wip
yuecideng Sep 8, 2026
7e735c0
Merge remote-tracking branch 'origin/main' into feature/newton-physic…
yuecideng Sep 8, 2026
d5b1c56
wip
yuecideng Sep 8, 2026
443dcd2
wip
yuecideng Sep 8, 2026
d0d713e
wip
yuecideng Sep 9, 2026
ca77279
wip
yuecideng Sep 10, 2026
ba6dd98
wip
yuecideng Sep 10, 2026
a7e7aa5
Merge remote-tracking branch 'origin/main' into feature/newton-physic…
yuecideng Sep 10, 2026
cd51a8a
wip
yuecideng Sep 10, 2026
30ef209
wip
yuecideng Sep 10, 2026
30c309e
wip
yuecideng Sep 11, 2026
b89e855
test: consolidate redundant CI coverage
yuecideng Sep 10, 2026
aac369d
test(sim): align setup with manager lifecycle
yuecideng Sep 11, 2026
8167cd9
ci: reduce redundant runner work
yuecideng Sep 11, 2026
738c407
wip
yuecideng Sep 11, 2026
c2ee4b0
wip
yuecideng Sep 11, 2026
4b51aa9
Merge origin/main into feature/newton-physics-backend
yuecideng Sep 11, 2026
e476b52
wip
yuecideng Sep 11, 2026
9cb21ab
wip
yuecideng Sep 12, 2026
17e9cae
Merge remote-tracking branch 'origin/main' into feature/newton-physic…
yuecideng Sep 12, 2026
a25b420
wip
yuecideng Sep 12, 2026
b30490e
Merge remote-tracking branch 'origin/main' into feature/newton-physic…
yuecideng Sep 12, 2026
b46e715
wip
yuecideng Sep 12, 2026
ebe83a4
Merge remote-tracking branch 'origin/main' into feature/newton-physic…
yuecideng Sep 12, 2026
8b1b90e
style: format merged tutorial test
yuecideng Sep 12, 2026
837f1ff
docs: cover backend API exports
yuecideng Sep 12, 2026
dea827c
wip
yuecideng Sep 12, 2026
0c4fc60
fix pour water material randomization events
yuecideng Sep 12, 2026
b790075
wip
yuecideng Sep 12, 2026
650277c
wip
yuecideng Sep 12, 2026
737a3ec
wip
yuecideng Sep 12, 2026
21450fd
fix: align CI consumers with Newton backend contracts
yuecideng Sep 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
16 changes: 8 additions & 8 deletions .agents/skills/add-robot/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ Every robot config subclasses `RobotCfg` and overrides two hooks:

- `_build_defaults(self, init_dict=None)` — read variant fields from `init_dict`,
set them on `self`, then populate `urdf_cfg` / `control_parts` / `solver_cfg` /
`drive_pros` / `attrs`.
`joint_drive_props` / `attrs`.
- `build_pk_serial_chain(self, device=...)` — return `{control_part: pk.SerialChain}`,
reading the PK URDF from a single `_pk_urdf_path` source.

Expand Down Expand Up @@ -46,8 +46,8 @@ A cfg's `_build_defaults` must populate:
- `urdf_cfg` (URDFCfg) or `fpath`
- `control_parts` (Dict[str, List[str]]; joint names support regex)
- `solver_cfg` (Dict[str, SolverCfg]; keys match `control_parts`)
- `drive_pros` (JointDrivePropertiesCfg)
- `attrs` (RigidBodyAttributesCfg)
- `joint_drive_props` (JointDrivePropertiesCfg)
- `attrs` (RigidBodyPhysicsCfg)

`build_pk_serial_chain` must read from `_pk_urdf_path` (a property for
constant-path robots, a method for variant-dependent paths). The PK chain's DOF
Expand All @@ -69,7 +69,7 @@ must match the matching `control_parts` entry (the test stub asserts this).
self.urdf_cfg = URDFCfg(components=[...])
self.control_parts = {"arm": ["JOINT[1-6]"]}
self.solver_cfg = {"arm": OPWSolverCfg(end_link_name="link6", root_link_name="base_link")}
self.drive_pros = JointDrivePropertiesCfg(stiffness={"JOINT[1-6]": 1e4})
self.joint_drive_props = JointDrivePropertiesCfg(stiffness={"JOINT[1-6]": 1e4})
```

Variant-aware template (reads version / arm_kind):
Expand All @@ -79,7 +79,7 @@ must match the matching `control_parts` entry (the test stub asserts this).
init_dict = init_dict or {}
self.version = MyRobotVersion(init_dict.get("version", "v1"))
self.arm_kind = MyRobotArmKind(init_dict.get("arm_kind", "default"))
... # then urdf_cfg / control_parts / solver_cfg / drive_pros / attrs
... # then urdf_cfg / control_parts / solver_cfg / joint_drive_props / attrs
```

4. **Implement `build_pk_serial_chain`** reading from `_pk_urdf_path`:
Expand Down Expand Up @@ -149,8 +149,8 @@ Do not copy those semantic declarations into the robot class.
| `urdf_cfg` | URDFCfg | URDF file and components |
| `control_parts` | Dict[str, List[str]] | Joint groups for control |
| `solver_cfg` | Dict[str, SolverCfg] | IK solver configurations |
| `drive_pros` | JointDrivePropertiesCfg | Joint stiffness, damping, force |
| `attrs` | RigidBodyAttributesCfg | Rigid-body physics attributes |
| `joint_drive_props` | JointDrivePropertiesCfg | Joint drive, limits, friction, and armature |
| `attrs` | RigidBodyPhysicsCfg | Rigid-body physics attributes |
| variant fields | enum / str / bool | Optional subclass fields |
| `_pk_urdf_path` | property or method → str | URDF for the FK/IK serial chain |

Expand All @@ -160,5 +160,5 @@ Do not copy those semantic declarations into the robot class.
- Registry: `embodichain/lab/sim/robots/__init__.py`
- Docs: `docs/source/resources/robot/<name>.md`
- Tests: `tests/sim/objects/test_robot_cfg.py`
- Base class: `embodichain/lab/sim/cfg.py` (`RobotCfg`)
- Base class: `embodichain/lab/sim/cfg/robot.py` (`RobotCfg`)
- Guide: `docs/source/guides/add_robot.rst` · Tutorial: `docs/source/tutorial/add_robot.rst`
2 changes: 1 addition & 1 deletion .agents/skills/add-solver/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,7 @@ exactly:
`test_ur_solver.py`) to sample joint configs within limits with a safety
margin.
- A `BaseSolverTest` class with:
- `setup_simulation(self, sim_device)` — builds a `SimulationManagerCfg`,
- `setup_simulation(self, device)` — builds a `SimulationManagerCfg`,
a `RobotCfg` whose `solver_cfg={"arm": <Name>SolverCfg(...)}` uses the new
solver, and adds the robot via `self.sim.add_robot(cfg=cfg)`.
- `test_ik(self)` — the round-trip contract:
Expand Down
9 changes: 7 additions & 2 deletions .agents/skills/add-task-env/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,8 @@ For new task-first compositions, prefer:
This is a component, not a runnable deployment. It owns:

- `environment_id`;
- exactly one explicit `physics: default|newton` backend and its optional,
backend-matching `physics_config`;
- ordinary environment values such as episode limits and environment count;
- physical simulation entities under `simulation`; and
- manager configuration under `env`.
Expand Down Expand Up @@ -117,8 +119,10 @@ embodiment:

The original inline Gym format remains supported. When extending an existing
inline `env.json` or `env.yaml`, preserve that representation unless the user
asked for component extraction. Never select a component and repeat its owned
inline fields in the same deployment.
asked for component extraction. Every inline runnable config declares exactly
one `physics: default|newton` backend. Never select a component and repeat its
owned inline fields, including `physics` or `physics_config`, in the same
deployment. Use separate environment files for backend-specific settings.

### Optional Python entry point

Expand Down Expand Up @@ -173,6 +177,7 @@ trainer-routing smoke test when dependencies permit.
- [ ] Task family, optional subdomain, task name, and runnable IDs are stable
- [ ] Python and config paths share the same task-first hierarchy
- [ ] Environment component and runnable deployment ownership are not mixed
- [ ] Each environment file declares one backend and only matching physics fields
- [ ] A Python task module exists only when the selected route needs it
- [ ] No solution-method directory or same-named task package was introduced
- [ ] Existing components and manager functors were reused where possible
Expand Down
2 changes: 1 addition & 1 deletion .agents/skills/add-test/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ from embodichain.lab.sim import SimulationManager, SimulationManagerCfg

class TestMySimComponent:
def setup_method(self):
config = SimulationManagerCfg(headless=True, sim_device="cpu")
config = SimulationManagerCfg(headless=True, device="cpu")
self.sim = SimulationManager(config)
# ... setup ...

Expand Down
18 changes: 18 additions & 0 deletions .agents/skills/review-pr/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,10 @@ generic checklist or report an unproven concern as a finding.
- **Architect** — Protect subsystem ownership, layering, dependency direction,
public API and configuration contracts, extension boundaries, and viable
evolution paths.
- **Public API / developer experience engineer** — Review public import paths,
signatures, defaults, configuration schemas, CLI behavior, task discovery,
error messages, documentation examples, migration paths, and installed-wheel
usability from an external user's perspective.
- **High-performance computing expert** — Identify reachable hot-path
regressions in algorithmic complexity, batching/vectorization, allocation
and memory layout, CPU/GPU transfers or synchronization, parallel or
Expand All @@ -36,6 +40,20 @@ generic checklist or report an unproven concern as a finding.
semantic contracts, tool and action interfaces, planning/execution/
verification loops, recovery and cancellation, observability, and safe
autonomy.
- **Security and trust-boundary engineer** — Inspect user-controlled
configuration and Task Programs, file paths, subprocesses, native or plugin
boundaries, credentials, package loading, and CI permissions for unsafe
execution, data exposure, privilege escalation, or fail-open behavior.

### Role selection

Select perspectives from the changed files and their contract neighbors; do
not apply every role as a generic checklist. Read
[references/reviewer-perspectives.md](references/reviewer-perspectives.md) when
the change touches public APIs, untrusted inputs, long-running operations, or
test and release boundaries. Keep the evidence standard unchanged: a role may
raise a finding only when a reachable scenario, violated contract, and concrete
impact are established.

## Review contract

Expand Down
53 changes: 53 additions & 0 deletions .agents/skills/review-pr/references/reviewer-perspectives.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
# Reviewer Perspectives

Use this reference to select review lenses after the changed files and their
contract neighbors are identified. It complements `review-matrix.md`: the
matrix describes subsystem contracts, while this file describes the questions
to ask from a user's or operator's point of view.

## Perspective selection

| Change signal | Select this perspective | Evidence to inspect |
| --- | --- | --- |
| Public Python modules, `__all__`, config classes, YAML/JSON schemas, CLI, task IDs, package data, examples, or migration behavior | Public API / developer experience | Public facades, strict loaders, callers, registration, docs checker, installed-package paths, and round-trip tests |
| User-controlled files or programs, path resolution, dynamic imports, subprocesses, native extensions, plugins, secrets, or workflows | Security and trust boundary | Loader and validation boundaries, path joins, execution APIs, dependency loading, workflow permissions, and failure paths |
| Reset/close/cancel, retries, checkpoint/resume, asynchronous workers, distributed execution, or long-running services | Reliability / operations (conditional lens) | Lifecycle owners, cleanup, idempotence, restart state, bounded queues, observability, and worker-failure handling |
| Tests, fixtures, mocks, validation logic, or regression claims | Verification / test quality (mandatory pass, not a separate identity) | Test oracle, old-versus-new behavior, negative and boundary cases, partial batches, cleanup, determinism, and installation-level coverage |

## Public API / developer experience

Review the change as if consuming the installed package without repository
knowledge. Confirm that:

- public imports, `__all__`, signatures, defaults, typing, and lazy facades
agree with the documented API;
- `configclass` objects, required fields, nested defaults, and serialized
configuration preserve their contract through construction and round trips;
- CLI output, exit status, task discovery, relative paths, optional
dependencies, and package data work after wheel installation;
- errors identify the invalid input at the owning boundary and do not leave a
partially initialized or misleading state;
- breaking changes are intentional, documented, and accompanied by migration
or clear failure behavior.

Do not report naming or prose preferences unless they make a supported workflow
unreachable, ambiguous, or incompatible.

## Security and trust boundary

Trace data from untrusted configuration, Task Programs, file paths, workflow
inputs, or optional extensions to the first side effect. Confirm strict
decoding, safe path containment, least-privilege execution, secrets
isolation, and fail-closed behavior. Treat unsafe deserialization, unchecked
dynamic execution, path escape, dependency confusion, credential exposure, and
workflow permission expansion as findings only when the changed code makes the
scenario reachable and the impact concrete.

## Conditional perspectives

Reliability and verification are review lenses rather than mandatory reviewer
identities. Use reliability for lifecycle and restart behavior that is not
fully explained by the engine or agentic passes. Use verification for every
test or validation change, checking that tests observe the contract and would
fail on the relevant old behavior rather than merely mirroring the
implementation.
71 changes: 42 additions & 29 deletions .github/workflows/main.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,27 +12,18 @@ concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ !startsWith(github.ref, 'refs/tags/v') }}

permissions:
contents: read
pull-requests: read

jobs:
lint:
runs-on: Linux
env:
NVIDIA_DRIVER_CAPABILITIES: all
NVIDIA_VISIBLE_DEVICES: all
NVIDIA_DISABLE_REQUIRE: 1
container: &container_template
image: 192.168.3.13:5000/dexsdk:ubuntu22.04-cuda12.8.0-h5ffmpeg-v3-py311
volumes:
- "/cache:/cache"
- "/usr/share/vulkan/icd.d:/usr/share/vulkan/icd.d"
- "/usr/share/vulkan/implicit_layer.d:/usr/share/vulkan/implicit_layer.d"
- "/usr/share/glvnd/egl_vendor.d:/usr/share/glvnd/egl_vendor.d"
- "/tmp/.X11-unix:/tmp/.X11-unix"
- "/dev/shm/shared:/dev/shm/shared"
- "/usr/share/nvidia:/usr/share/nvidia"
options: --memory 100g --gpus device=0 --shm-size 53687091200
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/activate-conda
- uses: actions/setup-python@v5
with:
python-version: '3.11'
- name: Code Style check
run: |
echo "Workspace: ${GITHUB_WORKSPACE}"
Expand All @@ -47,28 +38,50 @@ jobs:
- name: Public API docs check
run: python docs/scripts/check_api_docs.py

docs-changes:
runs-on: ubuntu-latest
outputs:
required: ${{ steps.filter.outputs.docs }}
steps:
- uses: actions/checkout@v4
- uses: dorny/paths-filter@ceb8a2b8f2d89434be7ff52d3de7ec3738c5cc9d # v4.0.3
id: filter
with:
filters: |
docs:
- 'docs/**'
- 'embodichain/**'
- 'embodichain_tasks/**'
- 'examples/**'
- 'scripts/**'
- 'README.md'
- 'pyproject.toml'
- 'setup.py'
- 'VERSION'

build:
if: ${{ !startsWith(github.ref, 'refs/tags/v') }}
needs: lint
if: ${{ !startsWith(github.ref, 'refs/tags/v') && needs.docs-changes.outputs.required == 'true' }}
needs: [lint, docs-changes]
runs-on: Linux
env:
NVIDIA_DRIVER_CAPABILITIES: all
NVIDIA_VISIBLE_DEVICES: all
NVIDIA_DISABLE_REQUIRE: 1
container: *container_template
container: &container_template
image: 192.168.3.13:5000/dexsdk:ubuntu22.04-cuda12.8.0-h5ffmpeg-v3-py311
volumes:
- "/cache:/cache"
- "/usr/share/vulkan/icd.d:/usr/share/vulkan/icd.d"
- "/usr/share/vulkan/implicit_layer.d:/usr/share/vulkan/implicit_layer.d"
- "/usr/share/glvnd/egl_vendor.d:/usr/share/glvnd/egl_vendor.d"
- "/tmp/.X11-unix:/tmp/.X11-unix"
- "/dev/shm/shared:/dev/shm/shared"
- "/usr/share/nvidia:/usr/share/nvidia"
options: --memory 100g --gpus device=0 --shm-size 53687091200
steps:
- uses: actions/checkout@v4
- uses: ./.github/actions/activate-conda

- name: Cache Python dependencies
id: cache-pip
uses: actions/cache@v4
with:
path: ~/.cache/pip
key: ${{ runner.os }}-pip-docs-${{ hashFiles('docs/requirements.txt') }}
restore-keys: |
${{ runner.os }}-pip-docs-

# Restore the full multi-version site from the last successful build.
# The key never matches exactly (run_id is unique), so restore-keys is
# always used to pick up the most recently saved full site.
Expand Down
6 changes: 6 additions & 0 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,12 @@ omit the Python task module. Follow the authoritative
[configuration and registration contract](agent_context/topics/env-framework/configuration.md)
and `/add-task-env` before adding a deployment.

Every inline runnable Gym config and reusable physical environment declares
exactly one `physics: default|newton` backend. An environment component owns
its optional matching `physics_config`; a deployment cannot repeat or override
either field. Launcher `--physics` may confirm the file-owned backend but does
not switch it. Use a separate environment config for each backend.

## Code and validation

- Run **`black==26.3.1`**, using `black .`, before every commit.
Expand Down
Loading
Loading