23. EUPL-1.2 Licence and REUSE Annotations¶
Date: 2026-10-11
Status¶
Accepted
Context¶
The repository was published under Apache-2.0 from its first commit. The operator decided on 2026-10-11 that the fleet's own repositories license their own code under the European Union Public Licence 1.2 from now on, and that past releases keep the licence they were published under.
Four measurements of main at commit 44a6bfa shape how the change is made:
- One human author.
git shortlog -snelists two names with one address, both the maintainer. No other person holds copyright in the tree, so the change needs no further consent. Eleven older commits carry a co-author trailer that names a tool, not a person. - No release.
git tag -lis empty and the forge holds no release.VERSIONsays0.1.0andCHANGELOG.mdhas a0.1.0section, but no tag was ever created for it. - No
NOTICEfile. Apache-2.0 section 4(d) obliges a redistributor to carry an existingNOTICEfile forward. There is none. - Licence information was not machine-readable. Ten source files named Apache-2.0 in a header line and every other file carried only a copyright line. One test looked for two phrases in
LICENSE; nothing else checked the licence of any file.
The tree also contains files that are not the project's own: the vendored interfig engine under tools/figures/third_party/interfig/upstream/, the built figure player under tools/figures/dist/ that bundles it with React, and the licence files of three agent skills adapted from MIT-licensed projects.
Decision¶
- The licence is EUPL-1.2 for every revision after commit
44a6bfaand for every release.LICENSEholds the licence text, byte for byte the same asLICENSES/EUPL-1.2.txt. - Every revision up to and including
44a6bfastays available under Apache-2.0. A grant that was made is not withdrawn. The README's License section names the boundary commit. Whether the0.1.0changelog section becomes a tag is decided with the release work; a tag on a later revision is EUPL-1.2. - Per-file licence information follows the REUSE specification.
REUSE.tomlassignsEUPL-1.2and the holder2026 Lusoristo the whole tree in its first table and overrides it for third-party files in the tables after it. REUSE 3.3 applies only the last table that matches a file, so the order is part of the declaration.
| Path | Licence | Holder |
|---|---|---|
tools/figures/third_party/interfig/upstream/** |
MIT | Vectorize AI, Inc. |
tools/figures/dist/** |
EUPL-1.2 AND MIT | Lusoris; Vectorize AI, Inc.; Meta Platforms, Inc. and affiliates |
LICENSE beside the caveman skill |
MIT | Julius Brussee |
LICENSE beside the adhd-format and social-text skills |
MIT | Ayoub Ghriss |
- The holder text is
2026 Lusoriswithout an address, the form the file headers already use. The ten headers that named Apache-2.0 carry the SPDX identifier of EUPL-1.2 instead. - Four checks decide the licence state.
reuse lintruns in thereuse-lintpre-commit job oflefthook.ymland in theREUSE lintjob of.github/workflows/reuse.yml. Both are written bypraetorctl adopt.praetorctl auditchecks the order of theREUSE.tomltables.praetorctl auditchecks thatLICENSEholds the text of the declared licence and that no other root file is named like a licence.tests/test_governance.pychecks the README andmkdocs.ymlstatements, and that no source file carries the former header.REUSE lintis the tenth required check, enforced in a second step..github/rulesets/main.jsondeclares it in this change, because the audit derives the required checks from the workflows on disk and fails when the file lacks one. ADR-0022 requires that a required check is a name some run reports, and the job reports onmainonly after this change lands. The forge's rule set therefore gains the name after the first run onmain; until then the audit prints that it does not yet compare this check with the forge.
Consequences¶
- Positive: every file has licence and copyright information a tool can read.
reuse lintreports all files compliant and names two licences,EUPL-1.2andMIT. - Positive:
LICENSEcannot drift from the declared licence, and a third-party file cannot enter the tree without a licence. - Negative: EUPL-1.2 is a copyleft licence. Article 5 obliges whoever distributes the work or a derivative of it to do so under the EUPL or under one of the compatible licences its appendix lists. The permissive terms apply only to the revisions named in decision 2.
- Negative: a contributor who adds a file from another project must add its licence text and an annotation table, or the commit and the pull request fail.
- Negative:
scripts/tunnel_hindsight.pychanges behaviour in this change. Replacing its header ended the baseline exemption of its unbounded restart loop, so the loop is now bounded: after 7200 starts of the port-forward the supervisor stops with exit status 1. - Negative: the pre-commit job skips on a workstation without
reuseand fails on a major version other than 6. On such a workstation only the hosted check decides. - Neutral: the software inside a built image keeps its own licences. This licence covers the files of this repository.
- Neutral: the README and
mkdocs.ymlsay "The Lusoris Authors" and the engine-written files carry their own header. The fleet settles one form in its rules, not this repository.
References¶
- Operator decisions of 2026-10-11 in the fleet answer ledger (paraphrased):
fleet-licence-sweep-20261011: public repositories with own code move to EUPL-1.2 going forward; past releases keep their licence; the README says from which version on; one pull request with REUSE annotations and a green licence check.imago-licence-reuse-check: the licence check is the repository's own REUSE lint job plus the licence part of the engine audit.imago-reuse-required-check-2: the rule-set file declares the required check in this change; the forge's rule set gains it after the job has run onmain.imago-copyright-holder-string: the holder text is the form of the repository's header rule, without an address.- REUSE specification 3.3.
- EUPL-1.2 text, Article 5 and the appendix of compatible licences.
- ADR-0022, decision 3.