โ All docs ยท Home
ADR 0022 โ Data licensing: a rights IRI on the annotation, a default license in the well-known
- Status: accepted
- Date: 2026-07-05
Context
The requirement is as old as the project. The original 2014 Freedback whitebook ("Data Distribution Policies") demanded that every piece of feedback carry explicit licensing, recommended Open Data / permissive Creative Commons defaults, and asked that licensing information be exposed at a designated endpoint so it is "contractually valuable for both collectors and publishers". The modern protocol had no licensing story at all: collectors aggregating annotations across servers had no machine-readable terms to rely on, and publishers had no way to state any.
Two constraints shape the solution:
- Zero net-new vocabulary if the standards already provide it (the spirit
of INVARIANT 2). The W3C Web Annotation model already defines a
rightsproperty on annotations โ an IRI identifying the license โ mapped todcterms:rightsin the anno@contextwe pin. - A license is a statement by the author. Under the content-addressing scheme (ADR 0002) and detached signatures (ADR 0003), anything that changes the meaning of an annotation must live inside its canonical bytes; anything appended by intermediaries must not.
Decision
- Adopt the W3C
rightsproperty โ no new vocabulary. The model gains an optionalrights: Option<String>(a license IRI, e.g.https://creativecommons.org/licenses/by/4.0/). The pinned Freedback@contextgains the matchingrightsโdcterms:rights(@type: @id) term โ an additive context change, allowed by the stable-URL policy. Both ingest paths (the alias normalizer, ADR 0007, and full JSON-LD compaction, ADR 0011) preserve it. rightsis content. When present it participates in the RFC 8785 canonical bytes: the same feedback under a different license is a different statement (different dedup id), and the author's signature covers the license. When absent, the canonical bytes are byte-identical to the pre-licensing form (skip_serializing_if), so every existing fixture, signature, and dedup id remains valid โ pinned by test.- Validation stays in SHACL (INVARIANT 3):
dcterms:rightsis optional,sh:maxCount 1,sh:nodeKind sh:IRI. A pure relaxation of the profile โ no previously-valid data becomes invalid โ so the publishedshapes.ttlstays stable-URL-compatible. - A server-level default license at the designated endpoint. The feedback
server takes
FREEDBACK_DEFAULT_LICENSE(an IRI) and, when set, surfaces it in/.well-known/freedbackas"license". Semantics: annotations served without an explicitrightsare distributed under the server's default license; an annotation's ownrightsalways takes precedence. The server never stamps the default into stored annotations (that would forge content into signed bytes) and enforces nothing beyond the SHACL IRI check โ the protocol carries the terms; contract law does the rest. - Every writer can set it.
freedback write --license <IRI>(CLI) and adata-licenseattribute on every widget kind (signed and bearer paths โ in the signed path the license is part of the signed content).
Why not the alternatives
- Per-server-only licensing (no per-annotation field). Simple, but the license would change when an annotation federates through a differently- configured cache, and authors could not choose terms at all. The author owns the annotation (INVARIANT 4); the license is theirs to state.
- A mandatory
rightsfield. Faithful to the whitebook's letter, but too much friction: every existing annotation, fixture, and signing client would break (a required field changes every canonical byte stream), and casual feedback would need a licensing decision up front. The server default covers the common case; the field covers the explicit one. - License in the body. The body is the feedback itself (INVARIANT 2); licensing is metadata about the whole annotation. The envelope already has a standard slot for it.
Consequences
Annotationgainsrights+with_rights; canonical-bytes tests pin both directions (absence unchanged, presence changes the id). The widget JCS cross-language pin gains a licensed variant.- The RDF mapping emits
dcterms:rightsas an IRI node (non-IRI values become literals that fail the SHACL node-kind check โ422), and the SHACL-subset interpreter learnssh:nodeKind. /.well-known/freedbackmay carry"license"; discovery/collection tooling can read a server's terms before harvesting. Aggregators that mix servers should track the per-annotationrights(or the origin server's default) if they need to honor per-item terms โ future work if it ever matters.- Deletion is unaffected: erasure (ADR 0021) removes the record regardless of its license โ the right to be forgotten is not waived by licensing.