Skip to content

Fix: Declare BSD-3-Clause in package.xml to match the repo LICENSE - #1

Merged
davetcoleman merged 1 commit into
mainfrom
fix/license-metadata
Sep 2, 2026
Merged

Fix: Declare BSD-3-Clause in package.xml to match the repo LICENSE#1
davetcoleman merged 1 commit into
mainfrom
fix/license-metadata

Conversation

@davetcoleman

@davetcoleman davetcoleman commented Sep 2, 2026

Copy link
Copy Markdown
Member

[written by AI]

Problem

All three packages declared <license>Apache-2.0</license> while the repo's root LICENSE is BSD-3-Clause, Copyright (c) 2025 PickNik Inc. A consumer reading one and not the other gets a different answer about what this code is licensed under, and automated SBOM tooling cannot resolve the conflict.

Which one was wrong

BSD-3-Clause is correct and the package.xml declarations were the error. Every other PickNik example workspace agrees, and example_robot_ws was the only outlier:

Repo package.xml Root LICENSE
moveit_pro_ur_ws (2 packages) BSD-3-Clause BSD-3-Clause
moveit_pro_kinova_ws (4 packages) BSD-3-Clause BSD-3-Clause
moveit_pro_franka_ws (4 packages) BSD-3-Clause BSD-3-Clause
moveit_pro_xarm_ws (3 packages) BSD-3-Clause BSD-3-Clause
moveit_pro_fanuc_ws (2 packages) BSD-3-Clause BSD-3-Clause
moveit_pro_kuka_ws (2 packages) BSD-3-Clause BSD-3-Clause
example_robot_ws (3 packages) Apache-2.0 BSD-3-Clause

Nothing in the repo's history suggests Apache-2.0 was deliberate. The declarations trace back to the tutorial's Step 2 / Step 8 / Step 12 commits and never matched the LICENSE added in Step 1.

The second change: declaring the vendored Robotiq model

example_robot_sim vendors a third-party MJCF model at mjcf/assets/, the Robotiq 2F-85 gripper description derived from ros-industrial/robotiq. It is already well documented in place, with its own LICENSE (Copyright (c) 2013, ROS-Industrial), README.md, and CHANGELOG.md, and the README states its license explicitly.

That license is BSD-2-Clause, not BSD-3: the LICENSE file carries only the two redistribution clauses and no "Neither the name of the copyright holder..." clause, which matches what its README claims. So the package ships under two licenses, and now says so:

<license>BSD-3-Clause</license>
<license file="mjcf/assets/LICENSE">BSD-2-Clause</license>

This is the same dual-declaration pattern moveit_pro_sam2 and moveit_pro_sam3 already use for vendored third-party model files. The attribution was never missing here, it just was not machine-readable.

The third change: the repo's own pre-commit hooks

CI runs pre-commit run --all-files, and the hooks had never been run against this tree, so the job failed on three of them independently of the license edit:

  • end-of-file-fixer: 17 files with no trailing newline (Dockerfile, docker-compose.yaml, launch files, MJCF assets, config YAMLs).
  • codespell: overriden twice in src/example_robot_mock/config/moveit/joint_limits.yaml. Fixed by hand, along with speicyfing in the same comment block, which codespell does not carry in its dictionary.
  • prettier with @prettier/plugin-xml: 7 XML files, including two of the three package.xml files this PR already touches.

All of that is the hooks' own output, taken as-is. pre-commit run -a is clean on the branch.

Scope

Three package.xml files for the license change, plus automated formatter output across the tree. No code, no behavior, no build changes. The root LICENSE and the vendored mjcf/assets/LICENSE are both untouched, since both were already correct.

The formatting diff is large because prettier reflows MJCF attribute lists onto separate lines, but it is not a semantic change: every reformatted .xml, .urdf, and .xacro file canonicalizes identically to its previous version (ElementTree.canonicalize(strip_text=True), all 15 files), and a numeric-token multiset comparison confirms no float or int value shifted in the MJCF models.

Manual verification

None needed. The license edit changes ROS package manifests, where <license> is metadata that no build step consumes. The rest is formatter output verified semantically inert by the canonicalization check above.

Known follow-ups, not fixed here

  • src/example_robot_sim/mjcf/assets/MUJOCO_LOG.TXT is a committed MuJoCo runtime log recording a NaN/Inf simulation-instability warning. It should be deleted and gitignored. This PR only trims its trailing newline.
  • example_robot_hw and example_robot_mock declare BSD-3-Clause with no file= attribute pointing at the root LICENSE. That matches the repo's existing convention and is not a regression, but REP 149 compliance would want it.

Found during a licensing audit of all 109 PickNik-authored public repos. Tracked in PickNikRobotics/moveit_pro#22271.

🤖 Generated with Claude Code

https://claude.ai/code/session_01EyWXfyZBDBJ61sSuumJKY4

@davetcoleman
davetcoleman marked this pull request as ready for review September 2, 2026 19:57
Also apply the repo's own pre-commit hooks, which had never been run
against the tree: end-of-file-fixer, prettier (XML), and codespell.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EyWXfyZBDBJ61sSuumJKY4
@davetcoleman
davetcoleman merged commit be407d8 into main Sep 2, 2026
1 check passed
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