Licensing cleanup: fix contradictory copyright metadata, add third-party notices - #103
Open
johnpierson wants to merge 4 commits into
Open
Licensing cleanup: fix contradictory copyright metadata, add third-party notices#103johnpierson wants to merge 4 commits into
johnpierson wants to merge 4 commits into
Conversation
The <Copyright> property in RhythmCore, RhythmRevit and RhythmUI held the string "MIT" -- both the wrong field for a license name and the wrong license, since the repo ships under BSD 3-Clause (see LICENSE). Replace with a proper copyright statement matching LICENSE, and move the license declaration into PackageLicenseExpression where it belongs, so NuGet pack metadata reports BSD-3-Clause instead of contradicting LICENSE. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Every AssemblyInfo.cs carried the Visual Studio placeholder "Copyright © 2023" -- no holder name, and a year that matches neither LICENSE (2019) nor anything else. Because GenerateAssemblyInfo is False in all five projects, these files (not the csproj <Copyright> property) are what actually lands in the shipped DLLs: the built RhythmCore.dll in deploy/ reports LegalCopyright "Copyright © 2023". Normalize AssemblyInfo.cs, the two extension csproj files, and the Dynamo package manifests (copyright_holder was the handle "j0hnp", years 2024/2025) to a single statement matching LICENSE. Metadata strings only -- no behavioural or version changes. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
zipDirectories.py and unloadLinksFromFile.py declared
__license__ = 'GNU General Public License v3.0', incompatible with the
repo's BSD 3-Clause LICENSE. Investigated provenance before changing:
- Both are authored by John Pierson (__author__), created from scratch
in this repo (d20bdcb, fbaa69f -- July 2021), not imported.
- Neither derives from third-party code: zipDirectories wraps
System.IO.Compression.ZipFile, unloadLinksFromFile wraps the Revit
TransmissionData API. No upstream reference in either file.
- Both carry the identical GPL string and come from the same batch,
consistent with a copy-paste slip in the header template.
- Every other RhythmPython file with a marker declares BSD 3-Clause.
This corrects the author's own marker on the author's own code; it does
not relicense anyone else's work. Aligned to the BSD 3-Clause string the
other RhythmPython files use.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The repo vendored a fair amount of third-party source with no notices file,
while LICENSE and README presented everything as BSD 3-Clause.
Documents eleven items, including three the original audit had not caught:
- ShortestWalk (MIT, (c) 2011 McNeel Europe) -- ~1,030 lines across nine
files under src/RhythmRevit/ShortestWalk/ and Utilities/, compiled into
RhythmRevit.dll with no copyright header anywhere, despite upstream MIT
terms requiring the notice be retained.
- polylabel-csharp -- upstream publishes no license at all; flagged rather
than assumed permissive.
- SpringNodes, @erfajo's converters, and two Dynamo forum snippets.
The headline item remains the Nuclex rectangle packer: six files under
IBM Common Public License v1.0, a weak-copyleft license, compiled into both
shipped DLLs. Called out explicitly rather than folded into a flat list.
Also records the redistributed Humanizer and Markov binaries, notes that the
LGPL LunchboxML file is 100% commented out and ships nothing, and links the
notices from the README's License section so the BSD-3 claim is qualified
where readers actually see it.
All licenses verified against file headers or upstream sources; all 25 file
paths verified to exist. Existing inline license headers left untouched.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes a set of licensing inconsistencies found during a read-only audit of the repo. Four commits, each independently reviewable.
Why
The repo ships under BSD 3-Clause (LICENSE, 2019 John Pierson), but the metadata said otherwise in several places, and there was no third-party notices file despite a meaningful amount of vendored third-party source — including weak-copyleft code compiled into the shipped DLLs.
What changed
1. csproj
<Copyright>said "MIT" (0faaf86)RhythmCore,RhythmRevitandRhythmUI(plusRhythmUI - Backup) all had<Copyright>MIT</Copyright>— a license name in a copyright field, and the wrong license. Replaced withCopyright (c) 2019 John Pierson, matching LICENSE.Since the underlying problem was a license name stuffed into a copyright field, I also added
<PackageLicenseExpression>BSD-3-Clause</PackageLicenseExpression>, which is the field that actually exists for this. Verified both evaluate correctly withdotnet msbuild -getProperty. Swept the other three csproj files — no other project had the same problem.2. Correction: the csproj
<Copyright>never reached the DLLs (a10bc92)Worth flagging, because it changes what the real problem was.
All five projects set
GenerateAssemblyInfo=False. That meansProperties/AssemblyInfo.cs— not the csproj<Copyright>property — suppliesAssemblyCopyrightAttribute. Confirmed against a built binary:So "MIT" was never baked into a shipped assembly. It was NuGet pack metadata that contradicted LICENSE — still worth fixing, but not the thing users' DLLs carried.
What was shipping is the untouched Visual Studio placeholder
Copyright © 2023: no holder name, and a year matching neither LICENSE nor anything else. Normalized across all fiveAssemblyInfo.csfiles, the two extension csproj files, and both Dynamo package manifests (deploy/pkg.json,deploy/Rhythm/pkg.json, which hadcopyright_holder: "j0hnp"with years 2024/2025).CI only builds DLLs into
deploy/<version>/— it does not regeneratepkg.json— so these edits persist. Metadata strings only; no behavioural or version changes.3. Two RhythmPython files marked GPL-3.0 (
05c04ab)RhythmPython/FileSystem/zipDirectories.pyandRhythmPython/Revit/Application/unloadLinksFromFile.pydeclared__license__ = 'GNU General Public License v3.0', incompatible with BSD-3.I investigated provenance before touching either, since silently relicensing someone else's code would be the worse error. Findings:
d20bdcb,fbaa69f, July 2021) — not imported.__author__is John Pierson on both.zipDirectorieswrapsSystem.IO.Compression.ZipFile;unloadLinksFromFilewraps the RevitTransmissionDataAPI. No upstream reference in either file.Corrected to the same BSD-3 string the other RhythmPython files use. This is the author's own marker on the author's own code — no third-party code was relicensed.
4. Added
THIRD-PARTY-NOTICES.md(f92d319)Covers eleven items. Beyond those already known, my sweep turned up three the audit had missed:
src/RhythmRevit/ShortestWalk/,Utilities/ShortestWalkUtils.cs), compiled intoRhythmRevit.dll. MIT, © 2011 McNeel Europe — Giulio Piacentino's Grasshopper component, arrived via Proving Ground's LunchBox.src/RhythmCore/Polylabel/) — upstream publishes no license at all.Also documents the redistributed Humanizer and Markov binaries in
deploy/(both MIT), and notes that the LGPL LunchboxML file is 100% commented out and contributes nothing to any build.The Nuclex rectangle packer (IBM CPL-1.0, six files) is called out at the top with a warning rather than buried in a flat list, since it's the one item with real copyleft implications.
Added a pointer from the README's License section so the BSD-3 claim is qualified where readers actually encounter it.
All licenses were verified against file headers or upstream sources rather than assumed; all 25 referenced file paths verified to exist. No existing inline license headers were stripped.
Needs your decision
Three items I deliberately did not act on. Each is disclosed accurately in the notices file, but each needs a call from you.
ShortestWalk is missing its MIT headers. Upstream MIT requires that "the above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software." None of the nine vendored files carries any copyright header. The notices file satisfies this at the distribution level, but adding per-file headers would be the cleaner fix. I left the files alone rather than editing headers into nine files of someone else's code without asking.
polylabel-csharp has no upstream license. https://github.com/eqmiller/polylabel-csharp publishes no LICENSE file and no license statement. Absent an express grant, the default position is that no redistribution rights were given — so this is arguably the highest-risk item in the repo, ahead of the CPL code. It's ~220 lines used by
Rhythm.Geometry.Polygon. Options: ask the author to add a license, re-derive it from Mapbox's ISC-licensed original, or replace the implementation.Nuclex CPL-1.0 code is disclosed, not removed. Six files under IBM Common Public License v1.0 — weak copyleft — compiled into both shipped DLLs, duplicated across
RhythmCore/GenerativeDesign/andRhythmRevit/Revit/Views/. Swapping out a rectangle packer that both DLLs depend on is a code change with behavioural risk, not a licensing cleanup. Your call whether to replace it or accept the CPL obligations; this PR only makes the situation visible.Testing
No end-to-end build was run — the changes are metadata strings plus one new markdown file, and a full build needs the Revit/Dynamo SDKs. Verified instead:
pkg.jsonfiles still parse as valid JSON.dotnet msbuild -getProperty:Copyright -getProperty:PackageLicenseExpressionreturns the expected values.Copyright © 2023,<Copyright>MIT<, orj0hnpmarkers remain anywhere insrc/ordeploy/.🤖 Generated with Claude Code