Skip to content

Parse NewtonCollisionAPI contact penalty attributes - #2954

Closed
andrewkaufman wants to merge 13 commits into
newton-physics:mainfrom
andrewkaufman:akaufman/contact-penalty-parsing
Closed

Parse NewtonCollisionAPI contact penalty attributes#2954
andrewkaufman wants to merge 13 commits into
newton-physics:mainfrom
andrewkaufman:akaufman/contact-penalty-parsing

Conversation

@andrewkaufman

@andrewkaufman andrewkaufman commented May 25, 2026

Copy link
Copy Markdown
Member

Description

Add schema resolver mappings and USD parsing for the four contact penalty
attributes from NewtonCollisionAPI: newton:contactStiffness (ke),
newton:contactDamping (kd), newton:contactFrictionStiffness (kf),
newton:contactAdhesion (ka).

Replace old custom attribute names (newton:contact_ke/kd/kf/ka) with the
new schema names. Switch kf/ka parsing from get_float_with_fallback to the
resolver pattern, matching ke/kd which already used it. Legacy attribute names
still resolve with a DeprecationWarning.

Treat -inf as a sentinel meaning "use builder default" alongside None,
matching the gap_val pattern already in parse_usd. Required for forward
compatibility with newton-physics/newton-usd-schemas#62, which changes the
schema-level defaults of these four attributes from baked Newton ShapeConfig
values to -inf.

Document NewtonCollisionAPI and NewtonMeshCollisionAPI in the collision
USD integration guide.

Depends on newton-physics/newton-usd-schemas#62.

Checklist

  • New or existing tests cover these changes
  • The documentation is up to date with these changes
  • CHANGELOG.md has been updated (if user-facing change)

Test plan

uv run --extra dev -m newton.tests -k test_contact_penalty_attrs
uv run --extra dev -m newton.tests -k test_contact_penalty_legacy_fallback
uv run --extra dev -m newton.tests -k test_contact_penalty_inf_sentinel
uv run --extra dev -m newton.tests -k test_newton_contact_penalty_parsing

test_contact_penalty_inf_sentinel covers explicit -inf authoring at the
resolver level, the cross-resolver priority case (authored Newton -inf wins
over MuJoCo solref fallback), and the full-import substitution into
builder.default_shape_cfg.*.

New feature / API change

from pxr import Sdf, Usd, UsdGeom, UsdPhysics
import newton

stage = Usd.Stage.CreateInMemory()
UsdGeom.SetStageUpAxis(stage, UsdGeom.Tokens.z)
UsdGeom.SetStageMetersPerUnit(stage, 1.0)
UsdPhysics.Scene.Define(stage, "/physicsScene")

body = UsdGeom.Xform.Define(stage, "/body")
UsdPhysics.RigidBodyAPI.Apply(body.GetPrim())
UsdPhysics.MassAPI.Apply(body.GetPrim()).CreateMassAttr().Set(1.0)

collider = UsdGeom.Sphere.Define(stage, "/body/collider")
prim = collider.GetPrim()
UsdPhysics.CollisionAPI.Apply(prim)
prim.CreateAttribute("newton:contactStiffness", Sdf.ValueTypeNames.Float).Set(5000.0)
prim.CreateAttribute("newton:contactDamping", Sdf.ValueTypeNames.Float).Set(200.0)

builder = newton.ModelBuilder()
builder.add_usd(stage)
model = builder.finalize()

idx = 0
print(model.shape_material_ke.numpy()[idx])  # 5000.0
print(model.shape_material_kd.numpy()[idx])  # 200.0

@coderabbitai

coderabbitai Bot commented May 25, 2026

Copy link
Copy Markdown
Contributor

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds NewtonCollisionAPI USD attributes for per-shape contact penalties, maps them to internal ke/kd/kf/ka (with legacy-name fallback and DeprecationWarning), applies resolved values in the USD importer (including per-shape material density), and adds unit/integration tests plus documentation and changelog entries.

Changes

Newton USD Contact Penalty Attributes

Layer / File(s) Summary
NewtonCollisionAPI schema mapping
newton/_src/usd/schemas.py
Newton schema resolver maps newton:contactStiffness, newton:contactDamping, newton:contactFrictionStiffness, newton:contactAdhesion to internal parameters ke, kd, kf, ka and provides legacy-name fallback with deprecation warnings.
USD shape import with contact penalties and material density
newton/_src/utils/import_usd.py
Shape import resolves contact penalty parameters kf/ka via schema resolver (defaulting to builder config), wires them into shape configs, and uses material density for per-shape mass when available.
Schema resolver unit tests
newton/tests/test_schema_resolver.py
Tests schema resolution for contact penalty parameters across resolver backends (Newton, MuJoCo, PhysX), including fallback behavior, priority interactions, legacy-name deprecation, and full ModelBuilder.add_usd() import validation.
USD import integration tests
newton/tests/test_import_usd.py
Tests end-to-end USD import with fully-authored, partially-authored, and unset contact penalty attributes, verifying fallback to builder defaults.
User documentation and changelog
docs/concepts/collisions.rst, CHANGELOG.md
Introduces NewtonCollisionAPI and NewtonMeshCollisionAPI documentation with schema examples, attribute tables, fallback semantics, and changelog entries for new parsing support, attribute renames, and deprecation notices.

Sequence Diagram

sequenceDiagram
  participant USDStage
  participant SchemaResolverNewton
  participant Importer
  participant ModelBuilder
  USDStage->>SchemaResolverNewton: read newton:contactStiffness/Damping/FrictionStiffness/Adhesion
  SchemaResolverNewton->>USDStage: fallback to legacy newton:contact_* (emit DeprecationWarning)
  SchemaResolverNewton->>Importer: return ke/kd/kf/ka values
  Importer->>ModelBuilder: construct ShapeConfig and apply density/defaults
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Suggested reviewers

  • adenzler-nvidia
  • eric-heiden
🚥 Pre-merge checks | ✅ 5
✅ Passed checks (5 passed)
Check name Status Explanation
Title check ✅ Passed The title accurately summarizes the main change: adding USD parsing for NewtonCollisionAPI contact penalty attributes (ke, kd, kf, ka).
Docstring Coverage ✅ Passed Docstring coverage is 90.00% which is sufficient. The required threshold is 80.00%.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@andrewkaufman
andrewkaufman marked this pull request as draft May 25, 2026 19:49
@andrewkaufman andrewkaufman added the usd Issues regarding USD import/export label May 25, 2026
@andrewkaufman andrewkaufman added this to the 1.3 Release milestone May 25, 2026

@coderabbitai coderabbitai 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.

Actionable comments posted: 1

🧹 Nitpick comments (1)
newton/tests/test_import_usd.py (1)

5224-5248: ⚡ Quick win

Apply NewtonCollisionAPI in this test to validate schema-based behavior, not just raw attribute presence.

Right now the test only authors raw newton:contact* attributes. Adding Prim.ApplyAPI("NewtonCollisionAPI") to these colliders makes the test match the intended schema contract and improves regression coverage.

Proposed patch
         col_all = UsdGeom.Cube.Define(stage, "/Articulation/AllAuthored/Collider")
         col_all_prim = col_all.GetPrim()
+        col_all_prim.ApplyAPI("NewtonCollisionAPI")
         UsdPhysics.CollisionAPI.Apply(col_all_prim)
         col_all_prim.CreateAttribute("newton:contactStiffness", Sdf.ValueTypeNames.Float).Set(5000.0)
         col_all_prim.CreateAttribute("newton:contactDamping", Sdf.ValueTypeNames.Float).Set(200.0)
         col_all_prim.CreateAttribute("newton:contactFrictionStiffness", Sdf.ValueTypeNames.Float).Set(2000.0)
         col_all_prim.CreateAttribute("newton:contactAdhesion", Sdf.ValueTypeNames.Float).Set(0.5)
@@
         col_partial = UsdGeom.Sphere.Define(stage, "/Articulation/PartialAuthored/Collider")
         col_partial_prim = col_partial.GetPrim()
+        col_partial_prim.ApplyAPI("NewtonCollisionAPI")
         UsdPhysics.CollisionAPI.Apply(col_partial_prim)
         col_partial_prim.CreateAttribute("newton:contactStiffness", Sdf.ValueTypeNames.Float).Set(9999.0)
@@
         col_none = UsdGeom.Capsule.Define(stage, "/Articulation/NoAuthored/Collider")
         col_none_prim = col_none.GetPrim()
+        col_none_prim.ApplyAPI("NewtonCollisionAPI")
         UsdPhysics.CollisionAPI.Apply(col_none_prim)
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@newton/tests/test_import_usd.py` around lines 5224 - 5248, The colliders in
the test are only setting raw newton:contact* attributes but not applying the
NewtonCollisionAPI schema; update the test to call
ApplyAPI("NewtonCollisionAPI") on each collider prim (col_all_prim,
col_partial_prim, col_none_prim) before or after setting their contact
attributes so the test validates schema-based behavior rather than just raw
attributes.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@newton/_src/usd/schemas.py`:
- Around line 88-91: The schema drop removed legacy attribute keys
(newton:contact_ke/kd/kf/ka) causing older USD files to silently use defaults;
add a compatibility shim in newton/_src/usd/schemas.py that accepts the legacy
names by mapping them to the current keys ("ke","kd","kf","ka") using
SchemaAttribute entries (the same SchemaAttribute("newton:contactStiffness",
None) etc.), and emit a one-time deprecation warning when any legacy key is
encountered (use the existing logging facility or a warnings.warn call) so users
see guidance; keep both names functional for this deprecation window and
document removal for the next release.

---

Nitpick comments:
In `@newton/tests/test_import_usd.py`:
- Around line 5224-5248: The colliders in the test are only setting raw
newton:contact* attributes but not applying the NewtonCollisionAPI schema;
update the test to call ApplyAPI("NewtonCollisionAPI") on each collider prim
(col_all_prim, col_partial_prim, col_none_prim) before or after setting their
contact attributes so the test validates schema-based behavior rather than just
raw attributes.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: CHILL

Plan: Pro

Run ID: dabeb5e0-b04c-4d97-8698-9508d9230bfa

📥 Commits

Reviewing files that changed from the base of the PR and between 5dd30ef and 8a1276e.

📒 Files selected for processing (6)
  • CHANGELOG.md
  • docs/concepts/collisions.rst
  • newton/_src/usd/schemas.py
  • newton/_src/utils/import_usd.py
  • newton/tests/test_import_usd.py
  • newton/tests/test_schema_resolver.py

Comment thread newton/_src/usd/schemas.py Outdated
@andrewkaufman andrewkaufman moved this to In Progress in Newton Roadmap May 25, 2026
@andrewkaufman andrewkaufman self-assigned this May 25, 2026

@coderabbitai coderabbitai 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.

Actionable comments posted: 1

🧹 Nitpick comments (1)
newton/tests/test_schema_resolver.py (1)

1758-1760: ⚡ Quick win

Assert that no deprecation warning is emitted when the new name is authored.

You already verify value precedence, but adding a no-warning assertion would lock in the intended behavior (new name should short-circuit legacy fallback).

Suggested patch
         # New name takes priority over legacy when both are authored
         collider.CreateAttribute("newton:contactStiffness", Sdf.ValueTypeNames.Float).Set(9999.0)
-        self.assertAlmostEqual(resolver.get_value(collider, PrimType.SHAPE, "ke"), 9999.0)
+        with warnings.catch_warnings(record=True) as caught:
+            warnings.simplefilter("always")
+            self.assertAlmostEqual(resolver.get_value(collider, PrimType.SHAPE, "ke"), 9999.0)
+        self.assertFalse(any(issubclass(w.category, DeprecationWarning) for w in caught))
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@newton/tests/test_schema_resolver.py` around lines 1758 - 1760, Wrap the call
that checks precedence (the collider.CreateAttribute(...) then
resolver.get_value(collider, PrimType.SHAPE, "ke")) in a warnings capture and
assert that no deprecation/warning was emitted: use Python's
warnings.catch_warnings(record=True) with warnings.simplefilter("always"), call
resolver.get_value inside that context, and assert the recorded warnings list is
empty; ensure warnings is imported if not already and keep the existing value
assertion (self.assertAlmostEqual(...)) alongside the no-warning assertion to
lock behavior that the new name short-circuits legacy fallback.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@newton/_src/usd/schemas.py`:
- Around line 108-129: The SchemaAttribute entries for "ke", "kd", "kf", and
"ka" use usd_value_getter=_newton_contact_attr_with_fallback(...) but do not
list the legacy attribute names in the SchemaAttribute.attribute_names, so
SchemaResolver.collect_prim_attrs() will not include the legacy keys in
schema_attrs; update each SchemaAttribute (the ones created for "ke", "kd",
"kf", "ka") to include the legacy attribute name (e.g., "newton:contact_ke",
"newton:contact_kd", "newton:contact_kf", "newton:contact_ka") in the
attribute_names parameter so that collect_prim_attrs() tracks both the current
spec.name and the legacy key used by the fallback getter.

---

Nitpick comments:
In `@newton/tests/test_schema_resolver.py`:
- Around line 1758-1760: Wrap the call that checks precedence (the
collider.CreateAttribute(...) then resolver.get_value(collider, PrimType.SHAPE,
"ke")) in a warnings capture and assert that no deprecation/warning was emitted:
use Python's warnings.catch_warnings(record=True) with
warnings.simplefilter("always"), call resolver.get_value inside that context,
and assert the recorded warnings list is empty; ensure warnings is imported if
not already and keep the existing value assertion (self.assertAlmostEqual(...))
alongside the no-warning assertion to lock behavior that the new name
short-circuits legacy fallback.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: CHILL

Plan: Pro

Run ID: 4fa1b9af-d201-4386-b707-622a299b223f

📥 Commits

Reviewing files that changed from the base of the PR and between 8a1276e and 5e27d6d.

📒 Files selected for processing (4)
  • CHANGELOG.md
  • newton/_src/usd/schemas.py
  • newton/tests/test_import_usd.py
  • newton/tests/test_schema_resolver.py
✅ Files skipped from review due to trivial changes (1)
  • CHANGELOG.md

Comment thread newton/_src/usd/schemas.py

@coderabbitai coderabbitai 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.

🧹 Nitpick comments (1)
newton/tests/test_schema_resolver.py (1)

1760-1766: ⚡ Quick win

Assert new-name precedence is warning-free.

This block verifies returned values, but it doesn’t assert that DeprecationWarning is not emitted when new names are authored alongside legacy names.

Suggested test tightening
@@
 import math
 import unittest
+import warnings
 from pathlib import Path
 from typing import Any
@@
-        self.assertAlmostEqual(resolver.get_value(collider, PrimType.SHAPE, "ke"), 9999.0)
-        self.assertAlmostEqual(resolver.get_value(collider, PrimType.SHAPE, "kd"), 999.0)
-        self.assertAlmostEqual(resolver.get_value(collider, PrimType.SHAPE, "kf"), 888.0)
-        self.assertAlmostEqual(resolver.get_value(collider, PrimType.SHAPE, "ka"), 0.99)
+        with warnings.catch_warnings(record=True) as caught:
+            warnings.simplefilter("always", DeprecationWarning)
+            self.assertAlmostEqual(resolver.get_value(collider, PrimType.SHAPE, "ke"), 9999.0)
+            self.assertAlmostEqual(resolver.get_value(collider, PrimType.SHAPE, "kd"), 999.0)
+            self.assertAlmostEqual(resolver.get_value(collider, PrimType.SHAPE, "kf"), 888.0)
+            self.assertAlmostEqual(resolver.get_value(collider, PrimType.SHAPE, "ka"), 0.99)
+        self.assertFalse(any(issubclass(w.category, DeprecationWarning) for w in caught))
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@newton/tests/test_schema_resolver.py` around lines 1760 - 1766, Wrap the
calls to resolver.get_value for the collider assertions in a warnings capture
block and assert that no DeprecationWarning was recorded; e.g. use
warnings.catch_warnings(record=True) with warnings.simplefilter("always") around
the four resolver.get_value calls (which reference resolver.get_value, collider,
PrimType.SHAPE and the attributes
"newton:contactDamping"/"newton:contactFrictionStiffness"/"newton:contactAdhesion"),
then assert that no captured warning has category DeprecationWarning (e.g.
assert not any(w.category is DeprecationWarning for w in captured_warnings)).
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In `@newton/tests/test_schema_resolver.py`:
- Around line 1760-1766: Wrap the calls to resolver.get_value for the collider
assertions in a warnings capture block and assert that no DeprecationWarning was
recorded; e.g. use warnings.catch_warnings(record=True) with
warnings.simplefilter("always") around the four resolver.get_value calls (which
reference resolver.get_value, collider, PrimType.SHAPE and the attributes
"newton:contactDamping"/"newton:contactFrictionStiffness"/"newton:contactAdhesion"),
then assert that no captured warning has category DeprecationWarning (e.g.
assert not any(w.category is DeprecationWarning for w in captured_warnings)).

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yml

Review profile: CHILL

Plan: Pro

Run ID: 25d57d56-d15c-428d-9292-0ae87fdc3bc7

📥 Commits

Reviewing files that changed from the base of the PR and between 5e27d6d and 3b87c04.

📒 Files selected for processing (1)
  • newton/tests/test_schema_resolver.py

@codecov

codecov Bot commented May 25, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ All tests successful. No failed tests found.

📢 Thoughts on this report? Let us know!

andrewkaufman and others added 12 commits May 27, 2026 19:26
Add schema resolver mappings and USD parsing for the four contact penalty
attributes from NewtonCollisionAPI: newton:contactStiffness (ke),
newton:contactDamping (kd), newton:contactFrictionStiffness (kf),
newton:contactAdhesion (ka).

Replace old custom attribute names (newton:contact_ke/kd/kf/ka) with the
new schema names. Switch kf/ka parsing from get_float_with_fallback to the
resolver pattern, matching ke/kd which already used it.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Legacy newton:contact_ke/kd/kf/ka attributes now resolve with a
DeprecationWarning, falling back to the new newton:contactStiffness etc.
names. New name takes priority when both are authored.

Apply NewtonCollisionAPI in integration test colliders.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… new-name priority

Add attribute_names tuples so collect_prim_attrs tracks legacy names.
Assert DeprecationWarning is not emitted when new names short-circuit
the fallback.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
newton-usd-schemas PR newton-physics#62 changes the schema defaults for
contactStiffness/contactDamping/contactFrictionStiffness/contactAdhesion
from baked Newton ShapeConfig values to the -inf sentinel (matching the
contactGap precedent). Once that schema lands, the parser will receive
float('-inf') for unauthored attributes instead of None, so the existing
'shape_kX is None' fallback would no longer trigger and -inf would
propagate to the solver.

Add an explicit '-inf' check alongside the None check, mirroring how
gap_val is already handled a few lines above. Future-proofs the parser
for the schema bump and also lets authors explicitly opt back into the
builder default by writing -inf on a single attribute.

Add test_newton_contact_penalty_inf_sentinel covering the explicit -inf
case.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Two new tests document the cross-resolver semantics around the -inf
sentinel:

- test_newton_contact_penalty_unauthored_with_mjc_solref locks in
  existing fallback behavior: when NewtonCollisionAPI's contactStiffness/
  contactDamping are unauthored, MuJoCo's mjc:solref takes effect via
  solref_to_stiffness/solref_to_damping.

- test_newton_contact_penalty_explicit_inf_overrides_mjc_solref
  documents that explicit Newton -inf authoring is treated as an
  authored value and wins over MjcCollisionAPI's mjc:solref in the
  resolver priority order. The -inf sentinel then triggers the
  builder.default_shape_cfg.* substitution rather than the
  solref-derived value. Authors who want solref to take effect should
  simply leave the Newton attribute unauthored.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Schema resolver semantics belong in test_schema_resolver.py (matching
the existing test_contact_penalty_attrs and test_contact_penalty_legacy_fallback
tests on this PR), not test_import_usd.py. Replace the three
test_newton_contact_penalty_* tests in test_import_usd.py with a single
test_contact_penalty_inf_sentinel in test_schema_resolver.py covering:

- Resolver returns the authored -inf sentinel as-is (parser substitutes
  builder.default_shape_cfg.* downstream).
- Cross-resolver: explicit Newton -inf wins over MuJoCo solref fallback
  in priority order because the sentinel is authored, not unset.
- Full import end-to-end: builder.default_shape_cfg.* is substituted
  for -inf on the resulting shape.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
…solver test in test_schema_resolver.py

Per review: the parser-level inf_sentinel test belongs alongside the
other parse_usd integration tests. Only the cross-resolver portion
(explicit Newton -inf vs MuJoCo solref priority) requires the resolver
test file. Split accordingly:

- test_import_usd.py::test_newton_contact_penalty_inf_sentinel: end-to-end
  parser substitution of builder.default_shape_cfg.* for -inf authoring.
- test_schema_resolver.py::test_contact_penalty_inf_sentinel_cross_resolver:
  resolver-level priority where explicit -inf outranks an unauthored
  upstream mjc:solref fallback.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@andrewkaufman
andrewkaufman force-pushed the akaufman/contact-penalty-parsing branch from 8e6af0c to 9934baf Compare May 27, 2026 19:27
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
@andrewkaufman

Copy link
Copy Markdown
Member Author

Closed in favor of #3005

@github-project-automation github-project-automation Bot moved this from In Progress to Done in Newton Roadmap May 29, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

usd Issues regarding USD import/export

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

1 participant