ADR-0012: Licensing — uniform Apache-2.0, no commercial tier
- Status: Accepted
- Date: 2026-05-24
- Amended: 2026-06-16 (superseded the two-tier open-core model with uniform Apache-2.0; see History below)
- Related: CLAUDE.md §1.9 (license lineage), §3 (layer discipline), §4 (docs / ADR discipline), ADR-0004
Context
Every package in this monorepo is Apache-2.0: the root LICENSE,
every pyproject.toml, and the NOTICE. CLAUDE.md §1.9 codifies this:
"OpenRAL's own code is uniformly Apache-2.0 … copy-left is rejected
without TSC review."
A previously-proposed version of this ADR introduced a two-tier
open-core model — Apache-2.0 for the core, plus a source-available
commercial tier (PolyForm Small Business License 1.0.0 + a bespoke
Academic Research Additional Permission) for planned agentic /
orchestration layers (reasoner, wam, dispatcher, skill_catalog,
fleet), with a hosted SaaS half under BSL-1.1 in a separate
openral/cloud repo. That model was never enacted in code — no
package ever shipped under PolyForm or BSL, and the two license texts
were the only artifacts it produced.
That two-tier model is now withdrawn. OpenRAL is, and will remain, a
fully open-source project under a single permissive license. The
agentic and orchestration layers it would have gated (reasoner,
wam, dispatcher, skill_catalog, fleet) are core to the value of
an open robot-agent harness and must be open for the ecosystem,
certifiers, academic forks, and downstream ROS users — the same
reasoning that already kept safety and observability open.
Decision
License every package in this repository under Apache-2.0. There is no Tier 2, no source-available tier, and no BSL tier.
- All Python packages under
python/(including the plannedreasoner,wam,dispatcher,skill_catalog,fleet), all ROS packages underpackages/, the C++ undercpp/, and alltools/,scripts/,examples/,tests/,docs/,robots/, andrskills/<name>/rskill.yamlmanifests are Apache-2.0. - The only license texts in the tree are
LICENSE(root) andLICENSES/Apache-2.0.txt(a verbatim copy). NoPolyForm-*orAcademic-Research-Permissiontexts exist. pyproject.tomlin every member declareslicense = { text = "Apache-2.0" }.- No CLA is required for the previous tier-relicensing reason. The DCO
(see
CONTRIBUTING.md) remains the contribution mechanism.
Third-party model weights are a separate matter
Skill weights distributed via Hugging Face Hub keep their own
upstream licenses (SmolVLA Apache-2.0, π0 research-permissive, GR00T
NVIDIA non-commercial / NVIDIA Open Model, OpenVLA MIT, ACT MIT,
Diffusion Policy MIT, …). The license-lineage code in python/rskill/
surfaces each weight's posture at install time and the loader enforces
the non-commercial guard (OPENRAL_ALLOW_NONCOMMERCIAL=1) per
ADR-0046. This is compliance for
models OpenRAL does not own — it does not affect the Apache-2.0 license
of OpenRAL's own code, and it is unchanged by this ADR. OpenRAL cannot
add or remove restrictions on third-party weights; it only surfaces the
posture. Closed third-party vendor SDKs (e.g. API-only VLAs) are never
bundled — they stay behind the license guard and an env var.
Consequences
- No code under
python/,packages/, orcpp/changes license. Everything is and stays Apache-2.0; the planned orchestration packages inherit Apache-2.0 when they land. - OSI status holds for the whole repo. Debian, Fedora, conda-forge, and the FSF can ship every package without legal review.
- No CLA, no license-check gate, no
LicensePosturecode tier enum. The earlier follow-on work to addPOLYFORM_SMALL_BUSINESS/APACHE_2_0_TIER1enum values, atools/license_check.pysource-tree gate, and per-directoryLICENSEfiles is cancelled — there is nothing to gate. (TheRSkillLicensePostureenum for third-party weights is unrelated and stays.) - No per-subtree licensing discipline is needed for reviewers (cf. ADR-0004): the whole tree is one license.
- Revenue strategy is out of scope of the codebase. Any future commercial offering (hosted service, support) does not require relicensing OpenRAL source; if one is ever proposed it lands as its own ADR and TSC decision, not as a silent license change here.
History — the withdrawn two-tier model
The original (2026-05-24, Proposed) decision adopted a two-tier
open-core model: Apache-2.0 core + a PolyForm Small Business 1.0.0
"Commercial Source-Available" tier (with an Academic Research Additional
Permission) for reasoner / wam / dispatcher / skill_catalog /
fleet, and a BSL-1.1 hosted half in openral/cloud. The intent was to
let researchers and small organisations (<100 employees, <$1M revenue)
use everything free while charging larger enterprises for the
orchestration surface. The survey behind it (Datadog, Grafana, Sentry,
Elastic, Honeycomb, New Relic, OpenTelemetry, Jaeger, Prometheus) found
"permissive SDK + restricted product" to be the prevailing commercial
pattern, and considered and rejected BSL, FSL, Elastic License v2, SSPL,
Commons Clause, AGPL dual-licensing, and PolyForm Noncommercial.
That model never produced a single licensed line of code. It is withdrawn in favour of a uniformly Apache-2.0, fully open-source project; the two PolyForm/Academic license texts and the NOTICE/README two-tier wording it introduced were removed in the same change as this amendment. This section is retained so the history and the rejected alternatives have a paper trail (CLAUDE.md §4).
Verification
just docs-build(mkdocs--strict) renders this ADR.just lint/just testpass (no code touched).LICENSES/contains onlyApache-2.0.txt; noPolyForm-*orAcademic-Research-Permissionfiles remain.NOTICE,README.md,GOVERNANCE.md, andCLAUDE.md §1.9describe a single Apache-2.0 license with no commercial / source-available / BSL tier.grep -rniE 'polyform|source-available|two-tier|BSL tier'over the tree returns no live OpenRAL-licensing claims (third-party weight / graph-DB dependency mentions are unrelated).