Files
paperspec/spec/14-rights.md
T
alexm 4fa326dc76
check / check (push) Successful in 42s
site / site (push) Successful in 3m4s
First implementation (#1)
Reviewed-on: #1
2026-10-15 05:47:05 -04:00

62 lines
4.3 KiB
Markdown

# 14. Rights
What a team may do with a paper depends on how it holds the paper, and AI processing is now a use that licenses name.
Every witness carries a rights record, every stage declares the uses it needs, and a stage runs only when the rights allow them.
Nothing here is legal advice: the defaults are a starting point that each team reviews with its own counsel.
## 14.1 The rights record
`scienting-rights/1`:
| Property | Holds |
| --- | --- |
| `license` | The license as stated, `{spdx?, text?, url?}`, or null. |
| `basis` | How the team holds the right: `open-license`, `publisher-tdm`, `collective-license`, `subscription`, `own-work`, `permission` or `unknown`. |
| `uses` | Each of `read`, `tdm`, `redistribute`, `quote-public` and `accessible-copy` as `true`, `false` or `"unknown"`, and `ai`: a map from each pair `<purpose>/<processor>` to the same values. |
| `asserted_by` | `{by, evidence}`: who or what recorded the basis, and on what: a license URL, a contract's hash, Crossref's license field, a delivery, a statement. |
| `at`, `valid_until` | When it was recorded, and when the basis ends, or null. |
Purposes are `internal` (results stay inside the organization) and `external` (results leave it).
Processors are `local` (the team's machines), `tenancy` (the team's cloud account), `outside-no-retention` (an outside service contractually keeping nothing) and `outside` (one that may retain).
A use or pair that is absent is `"unknown"`.
A producer sets `license` and a provisional `basis` from Crossref for open-access papers, and never sets a use to `true` on its own for anything else.
## 14.2 Effective uses
To find a witness's uses at a time *t*:
1. If `valid_until` is set and *t* is not before it, every use is `false`: an expired basis stops everything at once.
2. Otherwise start from the record's uses, and for each policy that applies at *t*, replace each `"unknown"` with the policy's value, where the policy has one.
A policy never overrides `true` or `false`.
A policy, `scienting-policy/1`, is a project owner's signed decision: `applies_to` (any of `basis`, `license`, `doi_prefixes` and `witnesses`, all of which must match), the `uses` it decides, a `statement`, `by`, `at` and `valid_until`.
It applies from `at` until `valid_until`.
A node established from several witnesses takes the most restrictive of their uses: `false` if any is false, else `"unknown"` if any is unknown, else `true`.
This is the default combining rule.
## 14.3 Stages
`scienting-stages/1` maps each stage to what it needs: a list of `uses`, and optionally `ai`, with a `purpose` and the `processors` it may run on.
A stage may run on a processor when every listed use is `true`, the processor is among those allowed, if any are listed, and the pair `ai/<purpose>/<processor>` is `true`.
When a check fails, the refusal lists what is lacking: a use or pair that is `false` by name, one that is unknown with a trailing `?`, and a disallowed processor as `processor:<name>`.
[registry/stages/scienting-stages-default.json](../registry/stages/scienting-stages-default.json) holds a default set; a team replaces the file, not the code.
Rights are checked when a stage runs and again whenever text is served.
Every derived artifact records the rights record and use it was made under, so it can be listed and purged when a basis ends.
## 14.4 Backends and profiles
A backend's code and weights can be licensed differently, and the weight license may exclude commercial or competing use.
`scienting-backend/1` declares a backend's `code_license`, its `weights` with their licenses, and the `conditions` they impose:
| Condition | Met when the team profile |
| --- | --- |
| `revenue-cap` with `usd` | states revenue or funding at most `usd`. |
| `no-competition` with `vendor` | states what it competes with, and that does not include the vendor. |
| `purpose` with `allowed` | states a purpose among those allowed. |
`scienting-profile/1` records what conditions ask: the team's `purpose` (`research`, `personal`, `education`, `startup` or `commercial`), `revenue_or_funding_usd` as `{at_most}` or null when unknown, and `competes_with`, or null when unknown.
A condition whose answer is unknown is not met, and the gate refuses a backend with any unmet condition.
`rights.jsonl` exercises stages, policies, expiry, combining and backends.