# 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 proposals for counsel to set. ## 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 `/` 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`. That combining rule is proposed for counsel to confirm. ## 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//` 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:`. [registry/stages/scienting-stages-default.json](../registry/stages/scienting-stages-default.json) holds the design's proposed defaults; 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 weights decide whether a paying team may use it. `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.