Skip to content

Fix agentic asset defaults - #847

Merged
qianl-nv merged 3 commits into
mainfrom
qianl/fix/agentic-gen-asset
Jul 2, 2026
Merged

Fix agentic asset defaults#847
qianl-nv merged 3 commits into
mainfrom
qianl/fix/agentic-gen-asset

Conversation

@qianl-nv

@qianl-nv qianl-nv commented Jul 2, 2026

Copy link
Copy Markdown
Collaborator

Summary

Fix agentic asset defaults

Detailed description

  • Switched agent embodiment preference from ik to default.
  • Moved the DROID default tag to droid_abs_joint_pos.
  • Removed redundant object-library initializers so instance names propagate.
  • Added prompt guidance for identifier-safe generated node ids.

qianl-nv added 3 commits July 1, 2026 22:51
Signed-off-by: Qian Lin <qianl@nvidia.com>
Signed-off-by: Qian Lin <qianl@nvidia.com>
Signed-off-by: Qian Lin <qianl@nvidia.com>
@qianl-nv
qianl-nv marked this pull request as ready for review July 2, 2026 06:21

@arena-review-bot arena-review-bot Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🤖 Isaac Lab-Arena Review Bot

Summary

Focused cleanup + fix for the agentic environment-generation defaults. Most of the diff is safe reduction: the removed __init__ overrides that only forwarded to super() are genuinely redundant, the removed object_type = ObjectType.RIGID lines match the LibraryObject base default, and the removed default_prim_path class attributes are dead (never read — prim paths come from the prim_path arg or the name-based default in ObjectBase.__init__). The real behavioral fix is that RedCube/GreenCube/RedContainer/GreenContainer no longer shadow the base __init__ (their old override dropped instance_name), so instance names now propagate. Two things worth a look: the DROID default control mode now diverges from the other families, and the propagation fix ships without a regression test.

Findings

🟡 Warning: isaaclab_arena/embodiments/droid/droid.py:141 — see inline comment (DROID default now diverges from the other families).

Test Coverage

The tag rename is well covered — test_asset_matcher.py updates the embodiment cases to the ["embodiment", "default"] pool and still asserts franka_joint_pos resolves by exact match ahead of the narrowed pool.

What's missing: the object-library fix (RedCube/GreenCube/RedContainer/GreenContainer now accepting instance_name) has no regression test. Before this PR those classes' __init__ signatures omitted instance_name, so RedCube(instance_name="foo") would have raised TypeError; now it should propagate. A one-liner would guard against the override creeping back — e.g. assert RedCube(instance_name="my_cube").name == "my_cube". Could we add that for at least one of the four?

Verdict

Minor fixes needed

Comment thread isaaclab_arena/embodiments/droid/droid.py
@greptile-apps

greptile-apps Bot commented Jul 2, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR replaces the "ik" embodiment-matching tag with "default" across all robot families and updates the intent compiler and prompt guidance accordingly. It also removes redundant __init__ overrides from object_library.py so that instance_name propagates correctly to instances.

  • Tag migration (ikdefault): FrankaIKEmbodiment, G1WBCPinkEmbodiment, GR1T2PinkEmbodiment each have their tag renamed. For DROID the default shifts from DroidDifferentialIKEmbodiment to DroidAbsoluteJointPositionEmbodiment, and IntentCompiler now passes preferred_tags=["default"] when resolving embodiments.
  • object_library.py cleanup: Nine classes lost their redundant __init__ methods (which simply forwarded unchanged kwargs to LibraryObject.__init__), and several dead class attributes (object_type = ObjectType.RIGID, default_prim_path) were removed; all have safe defaults in the parent.
  • Prompt guidance: A new instruction nudges the LLM to emit underscore-connected identifiers for query/instance names so generated node IDs are valid Python identifiers.

Confidence Score: 4/5

Safe to merge; all changes are internally consistent and the tag rename is applied uniformly across every robot family.

The DROID default is silently flipped from IK control to absolute joint-position control, which is a meaningful behavior change for any agent that queries "droid" by bare family name. The existing test suite only exercises the "franka" bare-family path; there is no test pinning "droid" → "droid_abs_joint_pos", so a future regression could go undetected. The object_library.py cleanups are safe (parent defaults are identical), and the prompt-guidance addition is low-risk.

isaaclab_arena/embodiments/droid/droid.py (tag ownership change) and isaaclab_arena/tests/test_asset_matcher.py (missing DROID resolution test).

Important Files Changed

Filename Overview
isaaclab_arena/agentic_environment_generation/intent_compiler.py Changed preferred_tags from ["ik"] to ["default"] when resolving embodiment assets; logic is consistent with the tag rename across all embodiment files.
isaaclab_arena/embodiments/droid/droid.py Moved "default" tag from DroidDifferentialIKEmbodiment to DroidAbsoluteJointPositionEmbodiment, changing which DROID variant is selected by bare-family queries; DroidDifferentialIKEmbodiment now inherits the shared mutable tags list from EmbodimentBase rather than having its own.
isaaclab_arena/assets/object_library.py Removed redundant init overrides that merely forwarded to LibraryObject.init, allowing instance_name to propagate; also removed unused default_prim_path and redundant object_type=ObjectType.RIGID class attributes (already the default in LibraryObject).
isaaclab_arena/agentic_environment_generation/environment_generation_agent.py Added prompt guidance instructing the LLM to use underscore_connected identifiers for queries and instance_names so node ids are valid Python identifiers.
isaaclab_arena/tests/test_asset_matcher.py Tests updated from "ik" to "default" tag throughout; covers franka bare-family resolution but no test was added for the DROID bare-family change (droid → droid_abs_joint_pos).

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A["Agent emits bare family name\n(e.g. 'franka', 'droid', 'g1', 'gr1')"] --> B["IntentCompiler._resolve_asset_node\nrequired_tags=['embodiment']\npreferred_tags=['default']"]
    B --> C{"Exact match\nin registry?"}
    C -- Yes --> D["Return exact asset\n(e.g. 'franka_joint_pos')"]
    C -- No --> E["Filter by required_tags=['embodiment']\nAND preferred_tags=['default']"]
    E --> F{"Substring / fuzzy match\nin preferred pool?"}
    F -- Yes --> G["Return default-tagged variant"]
    F -- No --> H["Fall back to required-tag pool\nfuzzy match"]
    H --> I{"Match found?"}
    I -- Yes --> J["Return match"]
    I -- No --> K["Record miss trace"]

    G --> G1["franka → franka_ik\n(tags: embodiment, default)"]
    G --> G2["droid → droid_abs_joint_pos\n(tags: embodiment, default)\nWAS: droid_differential_ik"]
    G --> G3["g1 → g1_wbc_pink\n(tags: embodiment, default)"]
    G --> G4["gr1 → gr1_pink\n(tags: embodiment, default)"]
Loading
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
    A["Agent emits bare family name\n(e.g. 'franka', 'droid', 'g1', 'gr1')"] --> B["IntentCompiler._resolve_asset_node\nrequired_tags=['embodiment']\npreferred_tags=['default']"]
    B --> C{"Exact match\nin registry?"}
    C -- Yes --> D["Return exact asset\n(e.g. 'franka_joint_pos')"]
    C -- No --> E["Filter by required_tags=['embodiment']\nAND preferred_tags=['default']"]
    E --> F{"Substring / fuzzy match\nin preferred pool?"}
    F -- Yes --> G["Return default-tagged variant"]
    F -- No --> H["Fall back to required-tag pool\nfuzzy match"]
    H --> I{"Match found?"}
    I -- Yes --> J["Return match"]
    I -- No --> K["Record miss trace"]

    G --> G1["franka → franka_ik\n(tags: embodiment, default)"]
    G --> G2["droid → droid_abs_joint_pos\n(tags: embodiment, default)\nWAS: droid_differential_ik"]
    G --> G3["g1 → g1_wbc_pink\n(tags: embodiment, default)"]
    G --> G4["gr1 → gr1_pink\n(tags: embodiment, default)"]
Loading

Comments Outside Diff (1)

  1. isaaclab_arena/tests/test_asset_matcher.py, line 113-127 (link)

    P2 Missing test for DROID bare-family resolution

    The test suite validates that "franka" resolves to "franka_ik" (the default-tagged variant), but there is no analogous test for the DROID family. This PR explicitly moves the default tag from DroidDifferentialIKEmbodiment to DroidAbsoluteJointPositionEmbodiment, making "droid""droid_abs_joint_pos" the new expected resolution. Adding a test_embodiment_droid_default_for_bare_family case — mirroring test_embodiment_default_for_bare_family but seeded with FakeAsset("droid_abs_joint_pos", ["embodiment", "default"]) and FakeAsset("droid_differential_ik", ["embodiment"]) — would pin this behavior and guard against the default accidentally reverting.

    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!

Reviews (1): Last reviewed commit: "Use default tag for agent embodiment sel..." | Re-trigger Greptile

Comment thread isaaclab_arena/embodiments/droid/droid.py

@alexmillane alexmillane left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@qianl-nv
qianl-nv enabled auto-merge (squash) July 2, 2026 09:33
@qianl-nv
qianl-nv merged commit 273abfb into main Jul 2, 2026
12 of 13 checks passed
@qianl-nv
qianl-nv deleted the qianl/fix/agentic-gen-asset branch July 2, 2026 09:48
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.

2 participants