Skip to content

fix(openyam): align learning stack with canonical model - #3853

Open
TomCC7 wants to merge 9 commits into
cc/feat/external-python-native-modulefrom
fix/openyam-learning-baseline
Open

fix(openyam): align learning stack with canonical model#3853
TomCC7 wants to merge 9 commits into
cc/feat/external-python-native-modulefrom
fix/openyam-learning-baseline

Conversation

@TomCC7

@TomCC7 TomCC7 commented Sep 1, 2026

Copy link
Copy Markdown
Member

This is layer 1 of the OpenYAM learning slice in the original stack. It aligns the OpenYAM model, teleoperation, home pose, and IK behavior required by the policy and collection layers above it.

Learning slice

  1. feat: add isolated Python module runtime #3478 — external Python native-module runtime
  2. fix(openyam): align learning stack with canonical model #3853 — OpenYAM learning baseline
  3. refactor(imitation): isolate LeRobot policy runtime #3315 — isolated LeRobot policy runtime
  4. feat(imitation): add native OpenYAM collection #3854 — native OpenYAM collection
  5. feat(imitation): add controlled OpenYAM policy rollout #3855 — controlled OpenYAM policy rollout
  6. feat(a1z): a1z learning workflow #3318 — A1Z learning workflow

Validation: 64 focused OpenYAM and Pink IK tests passed.

@codecov

codecov Bot commented Sep 1, 2026

Copy link
Copy Markdown

❌ 1 Tests Failed:

Tests completed Failed Passed Skipped
4679 1 4678 180
View the top 1 failed test(s) by shortest run time
dimos.robot.manipulators.openyam.test_openyam::test_make_openyam_model_config_uses_canonical_arm_joints
Stack Traces | 3.15s run time
def test_make_openyam_model_config_uses_canonical_arm_joints() -> None:
        config = make_openyam_model_config()
    
>       assert OPENYAM_MODEL_PATH.parts[-2:] == ("i2rt", "yam.urdf")

config     = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/yam_description.tar.gz after 3 attempt...tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] RobotModelConfig object at 0xffe4d7f41d10>

.../manipulators/openyam/test_openyam.py:63: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
dimos/utils/data.py:370: in __getattribute__
    resolved = object.__getattribute__(self, "_ensure_downloaded")()
        name       = 'parts'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/yam_description.tar.gz after 3 attempt...cription.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xffe4e9cdfed0>
dimos/utils/data.py:353: in _ensure_downloaded
    cache = get_data(filename)
        cache      = None
        filename   = 'yam_description/i2rt/yam.urdf'
        self       = <[RuntimeError("Failed to pull LFS file .../dimos/data/.lfs/yam_description.tar.gz after 3 attempt...cription.tar.gz', '--exclude=']' returned non-zero exit status 1.") raised in repr()] LfsPath object at 0xffe4e9cdfed0>
dimos/utils/data.py:310: in get_data
    archive_path = _decompress_archive(_pull_lfs_archive(archive_name))
        archive_name = 'yam_description'
        data_dir   = PosixPath('.../dimos/dimos/data')
        file_path  = PosixPath('.../dimos/dimos/data/yam_description/i2rt/yam.urdf')
        name       = 'yam_description/i2rt/yam.urdf'
        nested_path = PosixPath('i2rt/yam.urdf')
        path_parts = ('yam_description', 'i2rt', 'yam.urdf')
dimos/utils/data.py:254: in _pull_lfs_archive
    _lfs_pull(file_path, repo_root)
        file_path  = PosixPath('.../dimos/data/.lfs/yam_description.tar.gz')
        filename   = 'yam_description'
        repo_root  = PosixPath('.../work/dimos/dimos')
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 

file_path = PosixPath('.../dimos/data/.lfs/yam_description.tar.gz')
repo_root = PosixPath('.../work/dimos/dimos')

    def _lfs_pull(file_path: Path, repo_root: Path, *, retries: int = 2) -> None:
        relative_path = file_path.relative_to(repo_root)
    
        env = os.environ.copy()
        env["GIT_LFS_FORCE_PROGRESS"] = "1"
    
        last_err: subprocess.CalledProcessError | None = None
        for attempt in range(1, retries + 2):  # retries + 1 total attempts
            try:
                subprocess.run(
                    # --exclude= overrides lfs.fetchexclude from .lfsconfig, which
                    # otherwise silently skips data/.lfs/* even when --include matches.
                    ["git", "lfs", "pull", "--include", str(relative_path), "--exclude="],
                    cwd=repo_root,
                    check=True,
                    env=env,
                )
                return
            except subprocess.CalledProcessError as e:
                last_err = e
                if attempt <= retries:
                    time.sleep(attempt)  # 1s, 2s backoff
    
>       raise RuntimeError(
            f"Failed to pull LFS file {file_path} after {retries + 1} attempts: {last_err}"
        )
E       RuntimeError: Failed to pull LFS file .../dimos/data/.lfs/yam_description.tar.gz after 3 attempts: Command '['git', 'lfs', 'pull', '--include', 'data/.lfs/yam_description.tar.gz', '--exclude=']' returned non-zero exit status 1.

attempt    = 3
env        = {'ACCEPT_EULA': 'Y', 'ACTIONS_ID_TOKEN_REQUEST_TOKEN': 'eyJhbGciOiJSUzI1NiIsImtpZCI6IjM4ODI2YjE3LTZhMzAtNWY5Yi1iMTY5LT...-version=2.0', 'ACTIONS_ORCHESTRATION_ID': '44ec126e-9a65-4b56-a724-0b528375abe6.tests.ubuntu-24_04-arm_3_14_fal', ...}
file_path  = PosixPath('.../dimos/data/.lfs/yam_description.tar.gz')
last_err   = CalledProcessError(1, ['git', 'lfs', 'pull', '--include', 'data/.lfs/yam_description.tar.gz', '--exclude='])
relative_path = PosixPath('data/.lfs/yam_description.tar.gz')
repo_root  = PosixPath('.../work/dimos/dimos')
retries    = 2

dimos/utils/data.py:224: RuntimeError

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

@TomCC7
TomCC7 marked this pull request as ready for review September 1, 2026 03:22
@greptile-apps

greptile-apps Bot commented Sep 1, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This change aligns OpenYAM planning and teleoperation with the canonical robot description, adds an explicit collection-ready home posture and velocity limits, reduces Pink IK models to commanded joints, and applies OpenYAM-specific Quest posture weighting.

The executed Pinocchio runtime check verified that controlled-joint reduction removes uncommanded joints, preserves the commanded joint mapping, and writes configured velocity limits to the correct Pinocchio velocity coordinates even when model coordinate order differs. No reportable defect was found in those exercised behaviors.

T-Rex validation blocked

Canonical OpenYAM model loading could not be exercised because the required data/.lfs/yam_description.tar.gz asset is an unresolved Git LFS pointer and the git-lfs tool is missing. Quest solver construction and posture-weight execution could not be exercised because the isolated runtime is missing the turbojpeg package.

Confidence Score: 5/5

No merge-blocking defect was found in the executed controlled-joint reduction and velocity-limit paths.

The completed runtime check passed for the highest-risk joint-mapping and velocity-coordinate behavior, and no final defect comments were produced. Canonical model and Quest execution remain unexercised because their required local dependencies are unavailable.

Files Needing Attention: The canonical-asset paths in dimos/robot/manipulators/openyam/config.py and the Quest solver path in dimos/robot/manipulators/openyam/teleop_ik.py should be exercised in an environment with Git LFS, the OpenYAM model archive, and turbojpeg installed.

T-Rex T-Rex Logs

What T-Rex did

  • The Pinocchio runtime probe was executed with a deliberately reordered URDF, reduced to commanded joints, and tested against the joint mapping and velocity limits; the probe exited successfully and the contracts behaved as intended.
  • Canonical OpenYAM asset loading and Quest posture checks were attempted but blocked due to missing dependencies (git-lfs and turbojpeg), so those checks could not run.
  • The validation run documented that no failures were observed in the exercised contracts, and the logs recorded the exact commands and exit codes at the top of each captured artifact to enable review.

View all artifacts

T-Rex Ran code and verified through T-Rex

Reviews (1): Last reviewed commit: "fix(openyam): align teleop with canonica..." | Re-trigger Greptile

@TomCC7
TomCC7 force-pushed the fix/openyam-learning-baseline branch 4 times, most recently from 9421c5f to e0cac4d Compare September 1, 2026 17:17
@TomCC7
TomCC7 force-pushed the fix/openyam-learning-baseline branch from e0cac4d to 9e586e8 Compare September 1, 2026 18:54
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant