Skip to content

fix(openyam): use canonical model description - #3929

Closed
TomCC7 wants to merge 1 commit into
cc/feat/openyam-macos-supportfrom
fix/openyam-canonical-description
Closed

TomCC7 wants to merge 1 commit into
cc/feat/openyam-macos-supportfrom
fix/openyam-canonical-description

Conversation

@TomCC7

@TomCC7 TomCC7 commented Sep 3, 2026

Copy link
Copy Markdown
Member

Summary

This isolates the model-description correction needed to validate #3465 on macOS without pulling in the unrelated learning-stack changes from #3853.

Stack

Validation

  • 12 focused OpenYAM tests
  • 1 self-hosted OpenYAM model-loading test
  • corrected LFS object SHA-256 verified
  • canonical model loaded directly from the corrected archive
  • Ruff format and lint
  • pre-commit hooks (the LFS data discovery hook was skipped because unrelated extracted assets are present in the shared worktree)

@TomCC7

TomCC7 commented Sep 3, 2026

Copy link
Copy Markdown
Member Author

Closing this follow-up; the requested yam_description pointer update will be applied directly to #3465 instead.

@TomCC7 TomCC7 closed this Sep 3, 2026
@greptile-apps

greptile-apps Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This change updates OpenYAM to use the canonical i2rt/yam.urdf model description, maps its arm joints to the hardware-facing names, and changes planning and teleoperation targets to base and gripper_tip.

No publishable defects were identified.

T-Rex validation blocked

The focused model-loading check reached make_openyam_model_config() but could not materialize the Git LFS model archive because the git-lfs executable is missing. The updated URDF therefore could not be parsed to confirm its joint names, base link, and gripper_tip frame. The focused pytest route also could not finish test setup because the python-dotenv package was unavailable.

Confidence Score: 5/5

No correctness or security finding requires changes before merge.

There are no final severity-bearing findings, so the required scoring table yields a score of 5. Confidence in the model asset itself is limited because the environment could not fetch the Git LFS archive for runtime URDF validation.

Files Needing Attention: No source file requires follow-up. The OpenYAM Git LFS model archive should be exercised in an environment with git-lfs available.

T-Rex T-Rex Logs

What T-Rex did

  • T-Rex ran the requested contract verification for the pull request.
  • The verification concluded that local artifact references were not uploaded with the results.
  • There are no uploaded artifacts available for review for this verification.

T-Rex Ran code and verified through T-Rex

Reviews (1): Last reviewed commit: "fix(openyam): use canonical model descri..." | Re-trigger Greptile

@codecov

codecov Bot commented Sep 3, 2026

Copy link
Copy Markdown

❌ 1 Tests Failed:

Tests completed Failed Passed Skipped
4763 1 4762 181
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.13s 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 0xff25d0eae8a0>

.../manipulators/openyam/test_openyam.py:60: 
_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ 
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 0xff2562030fd0>
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 0xff2562030fd0>
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': 'ddfecba8-2026-42e8-9cd7-b93983c55a4f.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.

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