Conversation
Resolve CLI and Dashboard exploration conflicts against 28bff49. Reuse upstream exploration capabilities and physical-scene handoff rules; retain external-ENV operator receipts and YAM diagnostic dispatch. Validate real-robot terminal restrictions and YAM external Dashboard entry. Full unit suite: 582 passed, 3 skipped. Wheel checks: 2 passed.
There was a problem hiding this comment.
🟡 Changes recommended
Unresolved critical and moderate findings remain in YAM runtime lifecycle, toolkit status handling, geometry, and primitive-validation paths.
Get a fresh assessment by requesting another Copilot review.
Pull request overview
Adds dual-arm YAM support to RPent, including shared exploration, Dashboard, memory, RPC, and Pi0.5 workflows. Validation passed, but full autonomous task success remains unverified.
Changes:
- Adds YAM runtime, primitives, projection, safety, diagnostics, recovery, and operator controls.
- Integrates Pi0.5 VLA execution with shared RPent components.
- Adds contract/install tests and English and Chinese documentation.
Final findings include two moderate geometry issues, two moderate primitive-validation issues, one critical and one moderate runtime issue, one critical toolkit issue, and one operator-control nit.
File summaries
| File | Reviewed changes |
|---|---|
tests/unit_tests/rpent/utils/rpc/test_transport_loopback.py |
RPC loopback and NumPy payload tests |
tests/unit_tests/rpent/robots/test_registry_contracts.py |
Registry and exploration contracts |
tests/unit_tests/rpent/planner/test_codex_contracts.py |
Planner finish and retry contracts |
tests/unit_tests/rpent/dashboard/test_state_contracts.py |
Dashboard handoff and continuation contracts |
tests/unit_tests/rpent/dashboard/test_session_contracts.py |
Dashboard session lifecycle fixtures |
tests/unit_tests/rpent/cli/test_main_contracts.py |
CLI finalization contracts |
tests/unit_tests/robots/yam/test_yam_toolkit_contracts.py |
YAM toolkit, episode, and recipe contracts |
tests/unit_tests/robots/yam/test_yam_tool_schema_contracts.py |
YAM tool schema validation |
tests/unit_tests/robots/yam/test_yam_runtime_contracts.py |
YAM runtime safety and lifecycle contracts |
tests/unit_tests/robots/yam/test_yam_dashboard_contracts.py |
YAM Dashboard integration |
tests/unit_tests/robots/yam/conftest.py |
YAM test fixtures |
tests/integration_tests/robots/yam/test_installation.py |
YAM installation behavior |
rpent/utils/rpc/socket_rpc.py |
NumPy-compatible RPC framing |
rpent/tools/toolkit.py |
Shared toolkit integration |
rpent/robots/robot_spec.py |
Robot exploration capability contracts |
rpent/robots/components/env_client_base.py |
Environment-client base integration |
rpent/planner/codex.py |
Finish-result and retry handling |
rpent/dashboard/state.py |
Manual primitive handoff and continuation |
rpent/dashboard/spec.py |
Dashboard specification |
rpent/dashboard/planner_control.py |
Dashboard planner control |
rpent/cli/main.py |
Exploration execution and finalization |
rpent/cli/dashboard.py |
Dashboard lifecycle integration |
robots/yam/vla_test.py |
VLA validation |
robots/yam/vla_server.py |
Pi0.5 inference support |
robots/yam/toolkit.py |
YAM tools, recipes, continuation, and memory |
robots/yam/tasks.py |
Episode classification and task rules |
robots/yam/servo.py |
Servo control helpers |
robots/yam/robot_spec.py |
YAM robot configuration |
robots/yam/recovery.py |
Recovery operations |
robots/yam/prompts/user.py |
YAM user prompts |
robots/yam/prompts/system.py |
YAM system prompts |
robots/yam/prompts/__init__.py |
Prompt package initialization |
robots/yam/prompt_bundle.py |
Prompt configuration |
robots/yam/projection.py |
Camera projection support |
robots/yam/operator_control.py |
Operator receipt controls |
robots/yam/manual.py |
Manual control helpers |
robots/yam/hardware_ownership.py |
External hardware ownership |
robots/yam/guides/GUIDE_RPENT.md |
YAM integration guidance |
robots/yam/evaluation.py |
Evaluation handling |
robots/yam/env_server.py |
YAM environment RPC serving |
robots/yam/env_client.py |
YAM environment client |
robots/yam/diagnostics.py |
Diagnostic task execution |
robots/yam/contracts.py |
YAM runtime contracts |
robots/yam/config.example.json |
YAM configuration example |
robots/yam/cameras.py |
RGB-D capture and freshness validation |
robots/yam/__init__.py |
YAM package initialization |
robots/libero/robot_spec.py |
Robot specification compatibility |
pyproject.toml |
Packaging and project configuration |
docs/source-zh/rst_source/usage/yam.rst |
Chinese YAM usage documentation |
docs/source-zh/index.rst |
Chinese documentation index |
docs/source-en/rst_source/usage/yam.rst |
English YAM usage documentation |
docs/source-en/index.rst |
English documentation index |
Review details
Suppressed comments (4)
robots/yam/geometry.py:142
- This accepts finite affine matrices with scale, shear, or a reflection because only the bottom row is checked. These values are used as camera and arm extrinsics for world-point and collision calculations, so malformed calibration produces invalid geometry instead of failing closed; validate the upper-left block as a proper rotation.
if matrix.shape != (4, 4) or not np.isfinite(matrix).all():
raise ValueError(f"{name} must be a finite 4x4 matrix")
if not np.allclose(matrix[3], [0.0, 0.0, 0.0, 1.0]):
raise ValueError(f"{name} bottom row must be [0,0,0,1]")
return matrix.copy()
robots/yam/geometry.py:514
- When only
table_zis configured,guard_tableis still added as a plane above, but this condition leavestable_idasNone. The plane then enters_pairsas a normal pair with theworldbody;check()later splits both body names as<arm>_<body>, so collision-guarded transitions raise onworldinstead of returning a table-guard result. Treat the plane-backed table as a table pair too and add a regression test fortable_zwith collision guarding enabled.
table_id = (
self.model.geom("guard_table").id if self.table_mesh_configured else None
)
robots/yam/primitives.py:517
int(steps)silently truncates non-integral values such as1.5, so this handler executes one gripper increment even though the public parameter is an integer step count. Validate integrality before conversion, asmove_toalready does forsubsteps.
if int(steps) < 1:
raise ValueError("steps must be at least 1")
robots/yam/rlinf_env.py:628
- This operator motion only takes the environment lock; it does not require a stopped/nonterminal episode or set
_stop_requested. Ifreset_poseis invoked while Dashboard/Agent control is active, it can move both arms after the current chunk and leave the same episode ready, so the next policy command continues from an externally changed pose. Gate this command on a stopped operator state, or stop/invalidate the episode before moving.
def reset_to_configured_qpos(self) -> dict[str, Any]:
"""Explicit operator motion, separate from episode bookkeeping reset."""
with self._lock:
self._ensure_started()
self._move_to_configured_qpos("reset")
return {"reset_pose_reached": True}
- Files reviewed: 55/55 changed files
- Comments generated: 4
- Review effort level: Lite
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Serialize episode reset with stop generation, latch, and deferred-worker publication using the existing short lock. Keep runtime holds outside it. Normalize finish status before waiting for operator authority, reject fractional or boolean chunk counts, and list all valid receipt events. Reproduce the stop/reset race, premature uppercase finish, and fractional chunk execution before the fix. Full unit suite: 589 passed, 3 skipped.
Adds YAM dual-arm support aligned with RoboTwin primitive names and interfaces, reusing RPent’s shared exploration lifecycle, MemoryManager, RPC, and Dashboard. Includes Pi0.5 integration and diagnostic tasks.
Validation:
Full autonomous task success remains unverified.