Adopt the fleet license posture: one declaration, rendered per repo - #270
Merged
Conversation
cargo-deny fails CLOSED on a LicenseRef it does not know. theatron's own LICENSE already conforms to its interop posture and is untouched, but repos that depend on it now render PolyForm Noncommercial, and this list is what lets a dependency graph containing them resolve.
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.
Finding
License across the fleet was a per-repo accident. Measured before this change: five licensing
regimes with no visible logic, plus six repos carrying no LICENSE at all.
gnomon,thumosandlogismoswere Shield whilezetesis,sphragisandepistolewere AGPL,and nothing distinguished them. Two repos disagreed with themselves:
koinondeclaredlicense = "Apache-2.0"inCargo.tomland shipped no license file, and the licensor identity variedbetween a GitHub org handle and an individual across repos.
The absent six are the worst case, not the mildest. No LICENSE means all rights reserved by
default — on a public repo, the most restrictive possible outcome, reached without anyone deciding it.
Why this matters
AGPL does not restrict commercial use. It is a Free Software license that permits commercial use
including resale; what it requires is share-alike. So the eight AGPL repos were providing neither
property they were chosen for, which makes moving off them a strict improvement in intent-match rather
than a trade.
The licensor named no legal person. PolyForm's Noncompete and every proprietary notice are
enforceable only by someone who holds the copyright. Notices named
forkwright— a GitHub organisationhandle, not a legal entity — or, in one repo, an individual while the work is invoiced through a
company.
Relicensing is unilateral only while there is a single copyright holder. It requires every
contributor's consent once there are others, and publishing publicly is what invites contributors. So
this lands before any public flip, not after.
Desired correction
Posture is declared once and rendered, rather than written per repo:
fleetproductinteropprivateLicensor: Ardent Works LLC everywhere.
The
Cargo.tomllicensefield moves in the same commit as the license text, deliberately. A repowhose manifest claims one license while its LICENSE states another is internally contradictory, and
that is worse than either original state — a scanner reports the stricter of the two, and a reader
cannot tell which governs.
What is deliberately NOT changed
Repos carrying an inherited copyleft obligation keep their current license:
aletheia(142 filesunder
crates/krites/derived from CozoDB, MPL-2.0, with a live burn-down ledger),akroasis(9vendored GPL-3.0 protobuf schemas), and
thumos(a separately-licensed kernel crate). An inheritedobligation is not ours to override, and relicensing derived code would be a violation performed as
tidying.
That distinction was established by a ten-repo provenance audit rather than assumed: strong copyleft
(GPL, AGPL) reaches the whole combined work, while weak file-level copyleft (MPL) reaches only the
derived files. Getting it backwards in either direction is a mistake — the strict reading blocks work
that is free to move, the loose reading relicenses work that cannot be.
Done when:every repo's LICENSE and manifest agree with each other and with the declared posture, anda check fails when either drifts.
Note
The renderer is
utilities/apply-license-posture.pyin metis-ops, with a--checkmode. It reads theposture from kanon's
fleet-repos.tomlwhen that field exists and from a staging file only until then,so the staging copy dies by construction rather than by anyone remembering to delete it.
License texts are the canonical ones fetched as bytes from SPDX's
license-list-data, not transcribed— a page-summarising fetch of the same license silently abbreviated four sections, and a license with
summarised Definitions is worthless.