Skip to content

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 -sne lists 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 -l is empty and the forge holds no release. VERSION says 0.1.0 and CHANGELOG.md has a 0.1.0 section, but no tag was ever created for it.
  • No NOTICE file. Apache-2.0 section 4(d) obliges a redistributor to carry an existing NOTICE file 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

  1. The licence is EUPL-1.2 for every revision after commit 44a6bfa and for every release. LICENSE holds the licence text, byte for byte the same as LICENSES/EUPL-1.2.txt.
  2. Every revision up to and including 44a6bfa stays available under Apache-2.0. A grant that was made is not withdrawn. The README's License section names the boundary commit. Whether the 0.1.0 changelog section becomes a tag is decided with the release work; a tag on a later revision is EUPL-1.2.
  3. Per-file licence information follows the REUSE specification. REUSE.toml assigns EUPL-1.2 and the holder 2026 Lusoris to 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
  1. The holder text is 2026 Lusoris without 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.
  2. Four checks decide the licence state.
  3. reuse lint runs in the reuse-lint pre-commit job of lefthook.yml and in the REUSE lint job of .github/workflows/reuse.yml. Both are written by praetorctl adopt.
  4. praetorctl audit checks the order of the REUSE.toml tables.
  5. praetorctl audit checks that LICENSE holds the text of the declared licence and that no other root file is named like a licence.
  6. tests/test_governance.py checks the README and mkdocs.yml statements, and that no source file carries the former header.
  7. REUSE lint is the tenth required check, enforced in a second step. .github/rulesets/main.json declares 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 on main only after this change lands. The forge's rule set therefore gains the name after the first run on main; 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 lint reports all files compliant and names two licences, EUPL-1.2 and MIT.
  • Positive: LICENSE cannot 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.py changes 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 reuse and 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.yml say "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 on main.
  • 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.