open-standards/wai/extensions/influence.md

47 KiB
Raw Permalink Blame History

WAI Extension: Influence Attribution

Status: Draft. Registers the record wai.media.influence: who conditioned an output, by how much, and what each owner is owed for its deliveries. An owner, any party with a key, publishes a work (a style or reference image, a voice model, an adapter or another prior, a taste prior, or a catalogue, a signed set of works) with signed terms: the uses it allows, as a wai.ai.usage statement and as the acts of generation it allows, a per-use price or a revenue share, and the evidence it requires of a use. A tool that conditions a generation, a set of candidates or an inpainting of a contribution session on works signs a conditioning record beside the step, naming every work by digest with its owner's terms in force, its weight and its use; a use the terms disallow is refused (usage_disallowed). The pinned conditioned generator, wai-influence:spectral-blend, reads every reference image and adapter it names, so a verifier regenerates the step and a reference omitted, added or reweighted fails (conditioning_mismatch). Re-executing the steps gives every sample of the output the steps that made it, and a declared rule, wai-influence:share/1, divides the output's samples, in integer units, among the people who made samples, the owners of the works that conditioned the model that made them and of the model itself, and buckets that pay no one: works with no owner, unknown and undisclosed, never zero and never given to the tool or a payer. The tool signs an attribution whose shares a verifier recomputes; an estimated training-time share is stated beside them with its estimator's class, never added. A settlement statement (settlement §7.8) pays each owner an attribution line recomputed from the acknowledged deliveries of the output, the shares and the owner's tariff, and a transparency report tells one owner which outputs its works conditioned, how they were delivered and what it was paid, without the other owners' figures. No new transport, no payment rail and no money. The reference implementation is the influence module of wai-rs (feature influence); the corpus is live-conformance/influence/, and its second implementation is live-conformance/influence_verify.py. Keywords MUST, MUST NOT, SHOULD, MAY are RFC 2119/8174.

Texts read for this revision: the WAI texts this one cites; the abstracts of arXiv 2510.08062 (Attribution-by-design: Ensuring Inference-Time Provenance in Generative Music Systems, 9 October 2025) and arXiv 2607.00641 (What's a Credit Worth? A Market Framework for Attribution-Aware Compensation in Generative Music, 1 July 2026); and the published summaries of Re|Shaping Policies for Creativity, the fourth edition (February 2026) of the global report that monitors the 2005 Convention on the Protection and Promotion of the Diversity of Cultural Expressions, and of the resolution P10_TA(2026)0066 of 10 March 2026 on copyright and generative AI (procedure 2025/2058(INI)). The bodies of the report, the resolution and the papers were not read; §1.1 says what follows from them.

1. Scope

1.1 Why

The fourth edition of Re|Shaping Policies for Creativity (February 2026) projects that the revenues of music and audiovisual creators fall by about a fifth to a quarter by 2028 through the outputs of generative AI. The resolution P10_TA(2026)0066 (procedure 2025/2058(INI)), a non-legislative resolution of 10 March 2026, is concerned with generative systems that use protected content without authorisation or compensation, and calls for rights holders to control its use at training, at inference and in retrieval, with transparency and documentation of sources. arXiv 2510.08062 proposes building attribution into a generative system at inference: a catalogue that actively shapes an output is credited, and its owner is paid each time it is used, with the royalty flow traceable. arXiv 2607.00641 sets payment by a training-time attribution score, and finds that the noisier the score, the more the optimal contract moves from a royalty toward a fixed fee.

Conditioning at inference is often explicit: a tool loads a reference image, an adapter, a voice or a taste prior, and knows which. WAI's generator is exact (SPEC §5, Payload of wai.generate.spectral), and a contribution session already re-executes to its output sample by sample (contribution §7). This extension adds what conditioned each generation, by digest, and makes the attribution and the payment that follow recomputable. A training-time estimate stays an estimate: it is carried with its class beside the exact shares, as contribution §6 carries one, and is never part of them.

1.2 In scope and out of scope

In scope: the records (§2); works, terms, catalogues and a prior its owner publishes (§3); the conditioning record, the steps it names, the pinned conditioned generator, and the check of each reference's terms and use (§4); the step map, the rule, the attribution record, its comparison and the tier of a use (§5); the basis a settlement pays from, and a statement with attribution lines (§6); the transparency report (§7); verification (§8).

Out of scope:

  • Legal questions. WAI decides none. It states uses, shares and amounts under declared rules; whether a use needed a licence, whether a share is fair, and what an owner is entitled to are decided elsewhere, by others, under their own rules.
  • Money, a payment rail, an invoice, and contacting anyone. A statement's amounts are the figures a payment would rest on (settlement §13).
  • Training-time attribution as a payment basis. An estimate is reported with its class and pays no one here (§5.6); a deployment that pays on estimates does so outside the statement.
  • Remuneration of a session's own parties. The samples a person makes in a session are that person's share (§5.2), stated and paid by no attribution line in this revision.
  • Conditioned derivations. A conditioning record names a generate, candidates or inpaint step (§4.3). A style transfer is an inpainting over the whole picture; a transform carries no conditioning, since contribution §7.2 gives an attested transform's samples unknown and a pinned one introduces none.
  • Audio and video. Contribution's sessions are still images in this revision (contribution §3.1); a voice model is a kind of work now (§3.1), so that its terms can be published, and is used by the generators a later revision maps.

Relationship to the core spec: wai.media.influence is a record (SPEC §5): signed records a WAI tool emits and verifies. It names no payload format and is not dispatchable.

Relationship to contribution: every step this extension reads is a contribution step, verified by contribution §10 first; the session, the steps, the record and the map are unchanged. Relationship to settlement: an attribution line is that extension's line kind 2 (settlement §7.2, §7.8), recomputed there from a basis this extension verifies (§6). Relationship to ai-usage: the owner's terms carry a usage statement (ai-usage §3), and a reference states its use in ai-usage §6.1's form.

2. Records

Every record of this extension is a JSON object under contribution §2's encodings: strict JSON with no member named twice, at most 32 levels of nesting, byte strings in lowercase hexadecimal, unsigned integers at most 2^53 − 1 and no other number, no boolean, and the terms and date-times of jwp-receipts §2.4.3. Each record has exactly the members its section lists, at every level, and a kind naming it; a record that does not, or a member outside the values or ranges its section gives, is record_malformed. A signed record carries signer_pubkey (32 bytes, Ed25519, RFC 8032) and sig (64 bytes):

sig       = Ed25519(signer_key, "wai:influence\x01" || JCS(record without "sig"))
link_hash = BLAKE3("wai:influence-link\x01" || JCS(record))

JCS is RFC 8785. The signature is verified strictly (SPEC §7 Signatures): a key that fails step 1 or 2 is bad_key, and a signature that fails a later step bad_signature. A record is named by its link hash. A digest is SHA-256 (FIPS 180-4). An amount is in millionths of a minor unit of a currency (ISO 4217), as settlement §7.3 has one.

3. Works and their owners

3.1 Works

A work is what can condition a generation. It has a kind and is named by a digest:

kind the work its digest
image a style or reference image: an RGB8 state (contribution §2) the samples digest: SHA-256 over the buffer
voice a voice model the SHA-256 of its parameter set, as a pin's sha256 (SPEC §3.1)
adapter a parameter set a generator reads beside its model as for voice
prior a model or another parameter set: a style model, the model a session's model party names as for voice
taste a taste prior, an owned ranking model (wai.media.exploration) as for voice: the SHA-256 of its file
catalogue a signed set of works (§3.3) its link hash

The digest is the work's identity, as a pin's digest is a parameter set's (SPEC §3.1): nothing else selects it.

3.2 Terms

An owner publishes a work's terms in a record kind "wai-terms", signed by the owner:

member type meaning
kind string "wai-terms"
owner 32 B hex the owner's key
work object {"kind", "digest", "id"}: the work's kind and digest (§3.1), and id, a name for people, 1 to 256 bytes, which selects nothing
usage object or null the owner's usage statement (ai-usage §3), read by ai-usage §3.6
acts array 1 to 3 of candidates, generate and inpaint, in that order, none twice: the acts the owner allows its work to condition
tariff object {"currency", "per_use", "share_ppm"} (below)
attribution string stated, checked or recomputed: the lowest tier at which a use of the work stands (§5.5)
valid_from date-time when the terms come into force
valid_until date-time or null when they end, excluded; null for no end
issued_at, signer_pubkey, sig §2

tariff: currency is three capitals A–Z (ISO 4217) or null; per_use is an amount, 0 to 2^53 − 1, owed for each acknowledged delivery of an output the work's bucket has units in (§6.1); share_ppm, 0 to 1 000 000, is the owner's share, in parts per million, of the revenue attributable to its units (settlement §7.8). With currency null, per_use and share_ppm are 0. Terms whose valid_until is not after valid_from, or whose usage does not read, are record_malformed.

Terms are their owner's: a terms record MUST be signed by owner, and one signed by any other key is not_signed_by_owner, whatever its signature. Terms are in force at an instant t when valid_from ≤ t and, where valid_until is not null, t < valid_until, the date-times compared as the instants they denote. An owner changes its terms by publishing new ones; a use is held to the terms its reference names, in force at the step's issued_at.

3.3 Catalogues

A catalogue is a record kind "wai-catalogue", signed by its owner:

member type meaning
kind string "wai-catalogue"
owner 32 B hex the owner's key
works array 1 to 1024 digests of works, in strictly ascending order
issued_at, signer_pubkey, sig §2

A catalogue not signed by its owner is not_signed_by_owner. Terms whose work is a catalogue (kind catalogue, digest its link hash) govern every work it lists: a label, a collective or one person publishes terms once for a body of work, and a reference to one of its works names the catalogue (§4.1).

3.4 A prior its owner publishes

A style model, a voice model, an adapter or a taste prior is a parameter set in SPEC §3.1's sense. Its owner publishes it unchanged, pinned by its SHA-256, with terms naming that digest: the bytes a sink resolves a pin against are not altered by being owned, and a prior that travels in a WAI envelope carries the owner's usage statement in its manifest as any object does (ai-usage §4.1). An owner is a key: a person, a collective or a label each signs with one, and this extension names none of them otherwise.

This extension sets no consent requirement for a service's own mechanics: conditioning a generation on the works a person chose, computing the shares, settling the lines and writing the reports. Using a distributor's WAI service is the person's agreement to how that service works. The terms are the owner's preferences and prices, read as this section reads them. Where a regime asks the operator to state the lawful basis on which it processes what a record reveals, the operator states it as a lawful-basis declaration (jwp-receipts §2.4.6).

4. Conditioning

4.1 The conditioning record

A step a work conditioned is named, with every work that conditioned it, in a record kind "wai-conditioning", signed by the key that signed the step (the tool's, for a model's step: contribution §4.1):

member type meaning
kind string "wai-conditioning"
session 32 B hex the link hash of the session record
step integer the step's seq
link 32 B hex the step's link hash (contribution §2)
references array 1 to 16 references, no work named twice
issued_at, signer_pubkey, sig §2

A reference has exactly these members:

member type meaning
kind string the work's kind (§3.1)
work 32 B hex its digest
size object or null for an image, {"width", "height"}, each at least 1, the buffer at most 2^26 bytes; null for any other kind
catalogue 32 B hex or null the link hash of a catalogue that lists the work and whose terms govern it; null for none, and always null for a catalogue
terms 32 B hex or null the link hash of the owner's terms in force; null for a work with no owner, whose share pays no one (§5.2)
weight integer or null 1 to 1 000 000, the part of the step's samples the work conditioned, in parts per million
usage array 0 to 3 entries {"vocabulary", "term"}, the use made of the work, in ai-usage §6.1's form, in strictly ascending order of vocabulary

Every reference of a record has a weight or none has; the weights sum to at most 1 000 000. A usage entry's vocabulary is aipref, cawg or tdmrep, and its term a term of that vocabulary (ai-usage §6.2 rule 4) or null for a use outside it. Anything else is record_malformed. Conditioning is a use at inference; this extension maps it onto no term of any vocabulary, and the reference states the term the tool acted under, as a consumption claim does, and is held to the owner's statement (§4.5).

4.2 Why a record beside the step

Contribution §2 reads every record with exactly the members its section lists, and refuses any other member (record_malformed). A step with a member naming its conditioning would be refused by every verifier of contribution, and the session behind it could not be verified for anything. So this extension adds a record beside the step, and every step stays byte for byte what contribution reads:

a member of the step a record beside it (this extension)
a contribution verifier refuses the step, and the session verifies the session, and ignores the record
the binding to the step the step's signature the step's link hash, which the step's signature and the contribution record's root fix (contribution §5)
what commits to the set of records the root the attribution record, which lists every record it reads (§5.3)
a step no work conditioned carries an empty member has no record
the exact generator's steps regenerated by contribution regenerated by contribution; a record naming a work for one is refused (§4.4)

4.3 The steps a record names

A conditioning record names a step whose act is generate, candidates or inpaint, the acts by which a model introduces samples (contribution §4.2): a record that names any other step, or a second record naming a step an earlier one named, is conditioning_invalid. A record whose link is not the link hash of the step its step names is conditioning_unbound. A record whose step the verifier does not hold is not checked against it, and its step's samples are undisclosed (§5.1).

4.4 The conditioned generator wai-influence:spectral-blend

The generator wai.generate.spectral reads its model file and its prompt, nothing else (SPEC §5). A conditioning record that names a step of that generator names works the step did not read, and is conditioning_mismatch.

This extension pins a conditioned generator, wai-influence:spectral-blend. Contribution §4.4 gives a step of any generator but wai.generate.spectral the check attest, so a contribution verifier does not regenerate it; this extension does. A step of wai-influence:spectral-blend:

  • has a conditioning record (conditioning_missing otherwise), each of whose references is an image or an adapter with a weight (conditioning_invalid otherwise);
  • has the parameters contribution §4.4 gives a replicate step of wai.generate.spectral: a seed (each of its seeds) from 0 to 2^32 − 1, steps from 1 to 64, and an output whose sides are each at most 4096 with width · height at most 2^23 (params_invalid).

Its picture of width w and height h for a seed σ is computed byte by byte. The base B is generate(model, prompt, σ, steps, h, w) of wai.generate.spectral with the performer's model file and the opened prompt's text (the empty string where prompt is null), as contribution §4.5 runs it. Each reference i, in the record's order, gives a picture Pᵢ of the same size:

  • an image of size Wᵢ × Hᵢ: Pᵢ(x, y) is the reference's pixel (x mod Wᵢ, y mod Hᵢ), the reference tiled across the picture;
  • an adapter: generate(adapter, prompt, σ, steps, h, w), with the adapter's file, a model file of wai.generate.spectral, in place of the performer's.

With wᵢ the weights and W their sum, each byte of the picture is

⌊(B × (1 000 000 − W) + Σ wᵢ × Pᵢ + 500 000) / 1 000 000⌋

the same byte of B and of each Pᵢ. A generate step's output is the picture with its seed; the member at position k of a candidates step's set is the picture with seeds[k]; an inpaint step's output is the picture at the input's size inside the region and the input outside it (which contribution checks).

A verifier that holds the step, the performer's model file, the prompt's opening where prompt is not null, the samples of every reference image of its stated size and the file of every adapter computes each picture and compares it with the step's output: a state whose samples digest differs, or a pixel inside an inpainting's region that differs, is conditioning_mismatch. So a record that omits a work the step read, names one it did not, or states another weight fails. Where any of these is not held, the step is not regenerated.

4.5 Each reference's terms and use

For each reference whose terms is not null, in order:

  1. The terms are given, and so is the catalogue where catalogue is not null (record_missing).
  2. The terms' work is the reference's work: with catalogue null, its kind and digest are the reference's kind and work; with a catalogue, its kind is catalogue and its digest the catalogue's link hash, and the catalogue's owner is the terms' (otherwise terms_mismatch); and the catalogue lists the reference's work (not_in_catalogue).
  3. Where the verifier holds the step, the terms are in force at the step's issued_at (§3.2, terms_not_in_force).
  4. For each vocabulary the terms' usage statement carries, the reference's usage has an entry (usage_unanswered); for each entry whose term is not null, the statement's preference for it (ai-usage §3.2, §3.4, §3.5) is not disallow (usage_disallowed).
  5. Where the verifier holds the step, its act is one of the terms' acts (usage_disallowed).

A use the terms disallow is refused whatever is paid for it: an attribution that rests on one is refused, and so is a statement that pays from that attribution (§6.2). The two codes are ai-usage §9's, raised here for the owner's terms as ai-usage raises them for a consumption claim. A reference whose terms is null is checked against nothing: its work has no owner this record names, and its share is unowned.

5. Attribution

5.1 The step map

Every sample of the output has a step set, made_in: the steps whose act produced its value. It is computed as contribution §7.2 computes made_by, with each step in place of its performer, so the performers of a sample's made_in are its made_by:

act of step s made_in of each sample of its output
author, generate; each member of candidates {s}
edit, inpaint inside the region {s}; outside it, the input's at the same pixel
select the input's at the same pixel
transform, replicate the union of the made_in of the input pixels its sample mapping reads (contribution §4.5)
compose, replicate at a pixel an input covers, that input pixel's; at a canvas pixel no input covers, {s}
transform or compose, attest {unknown}

A state whose step the verifier does not hold gives every sample {undisclosed}; a replicate transform or compose over an input whose size the verifier does not know gives {undisclosed}. The markers are contribution §7.1's: never a step, and never credited.

5.2 The rule wai-influence:share/1

Each sample of the output is 1 000 000 units, and the whole is the number of samples times 1 000 000. The rule divides the whole, in integers, and the shares always sum to it:

  1. Makers. A sample's makers are its made_in: its steps in ascending seq, then unknown, then undisclosed. Of m makers each takes ⌊1 000 000 / m⌋ of the sample's units, and the first also takes the remainder. U(x) is what a maker x takes over all the samples.
  2. Steps. For each step s with U(s) above 0:
    • performed by a human or an audience party: its party bucket takes U(s);
    • performed by a model, with a conditioning record of n references: with weights, reference i takes ⌊U(s) × wᵢ / 1 000 000⌋; with none, each reference takes ⌊U(s) / (n + 1)⌋; the model takes what is left of U(s);
    • performed by a model with no conditioning record: the model takes U(s).
  3. Buckets. What a reference takes goes to the owner bucket of its terms (one bucket per terms record, holding its owner's key), or, with terms null, to the unowned bucket of its work. What a model takes goes to the owner bucket of the terms the attribution names for that model party (§5.3), or to the unowned bucket of the model's digest. U(unknown) and U(undisclosed) are buckets of their own.

So human-made samples go to the people who made them; a model's samples go, by the declared weights, to the owners of what conditioned it, and the rest to the model's owner; a sample no pinned rule fixes is unknown; and nothing goes to a party the rule does not name. With no weights the rule's split is equal, the model counted as one share: the weights were not declared, and the outcome says so (§8.3). A bucket with no units is not listed. An owner bucket lists the works whose references gave it units.

5.3 The attribution record

The tool signs one attribution of an output, kind "wai-attribution":

member type meaning
kind string "wai-attribution"
session 32 B hex the link hash of the session record
record 32 B hex the link hash of the contribution record
output 32 B hex the content hash of the output's object: the record's output.content_hash
samples integer the output's samples, width × height
rule term wai-influence:share/1
conditioning array 0 to 256 link hashes of the conditioning records it reads, in strictly ascending order
models array 0 to 64 entries {"party", "terms", "usage"}: a model party, the link hash of the terms of the work that party names, and its use in §4.1's form; in strictly ascending order of party
shares array the buckets (below), in their order
estimates array 0 to 16 training-time estimates (§5.6)
issued_at, signer_pubkey, sig §2: the tool's key

A bucket is one of:

  • {"bucket": "owner", "owner", "terms", "works", "units"}: an owner's key, the link hash of its terms, the digests of the works that gave it units in strictly ascending order, and its units;
  • {"bucket": "party", "party", "units"}: a keyed party of the session, by position;
  • {"bucket": "unowned", "work", "units"}: a work or a model with no owner named, by digest;
  • {"bucket": "unknown", "units"} and {"bucket": "undisclosed", "units"}.

Each bucket's units is at least 1. The buckets are in this order: owner buckets by (owner, terms), party buckets by party, unowned buckets by work, then unknown, then undisclosed; no bucket twice. A record that breaks any of this is record_malformed. Its shares sum to the whole, samples × 1 000 000 (shares_not_whole): a share is never given out of nothing, and none is lost.

The rule is declared by name. This revision defines one rule, and a record naming another is rule_unknown: a verifier recomputes shares only under a rule it holds.

5.4 Comparing the shares

The verifier computes the shares by §5.2 from the steps it holds and compares them with the record's, bucket by bucket, when its computed shares hold no undisclosed units:

  1. a computed unknown or undisclosed bucket with more units than the record's is unknown_attributed: units no pinned rule fixes, credited to someone (contribution §7.1);
  2. an owner bucket whose stated units exceed its computed units (0 where it has none) by exactly the units of one or more of the record's estimates for that owner, an estimate of p parts per million being p × samples units, is estimate_mixed;
  3. any other difference, a bucket missing, added, of other units or of other works, is shares_mismatch.

Where the computed shares hold undisclosed units, the record's shares are its signer's statement: they are checked to sum to the whole and are not compared, because the split of the undisclosed samples among makers is not fixed by what is disclosed. The tier of every bucket is then stated (§5.5).

5.5 The tier of a use

Each held step has a tier:

  • a step of wai-influence:spectral-blend: recomputed where this extension regenerated it (§4.4), checked otherwise;
  • any other step: recomputed where contribution reports it checked (for a generation of wai.generate.spectral, regenerated), checked where it reports it not-checked, and stated where it reports it attested (a generator or an operation the tool attests).

An owner bucket's tier is the lowest tier of the steps that gave it units, or stated where the shares were not compared (§5.4). An owner's terms state the lowest tier at which a use of its work stands (§3.2): an owner bucket below its terms' attribution is attribution_not_met. An owner that requires recomputed is paid only for uses a verifier regenerated, works and weights included; one that requires stated accepts the tool's statement.

The tier of the outcome is contribution §10.3's, with each step of wai-influence:spectral-blend counted checked there when this extension regenerated it: recomputed when every step behind the output is held and checked, stated when none is held, checked otherwise. A policy's lowest tier (§8.1) is held to it (tier_not_met).

5.6 Training-time estimates

An estimate is {"estimator", "class", "owner", "share_ppm"}: a term naming the method, a term naming its class (the family of methods it belongs to, such as an influence-function or a leave-one-out estimate), an owner's key, and the share it estimates in parts per million, at most 1 000 000. It is the tool's statement with its class, as contribution §6's estimate and an energy figure are: a verifier reports it as stated, beside the shares and never in them, and no attribution line is computed from it. An owner bucket holding an estimate's units is estimate_mixed (§5.4).

6. Payment

6.1 The basis

An accepted attribution is a basis for settlement's attribution lines (settlement §7.8), named by its link hash. It gives: the output's content hash; the whole; and, for each owner bucket, the owner's key, the bucket's units, and the terms' per_use and share_ppm. Party, unowned, unknown and undisclosed buckets pay no one: a party's samples are its own share and are paid outside this revision, a work with no owner has no payee, and units no rule fixes are never paid to anyone. So every amount an attribution line states goes to an owner whose terms the verifier checked, for units the rule gave it.

An owner is owed, per object class of the deliveries, per_use for each acknowledged delivery of the output and share_ppm of the revenue of the output's paid bytes, in proportion to its units over the whole: an owner whose terms set a per-use price is paid per use, and one whose terms set a share is paid in proportion to its share of the output. The arithmetic, its rounding and its remainder are settlement §7.8's.

6.2 A statement with attribution lines

A verifier of a statement (settlement §7) whose lines include attribution lines is given the statement and settlement §8.1's inputs, and a list of influence cases (§8.1), the given attributions. It runs these steps and stops at the first refusal:

  1. It reads the statement (settlement §7.5), at statement.
  2. The bases. For each payer of an attribution line, in the order the lines first name it, at basis and its index k: a given attribution whose record's link hash is the payer is given (record_missing); §8 accepts it (its refusal, at basis, k, then its own place); and each owner bucket's terms name no currency or the statement's (currency_mismatch).
  3. The statement: settlement §8.2 with those bases, with its reasons and places.
  4. What it leaves out. Each other given attribution, in order, at given and its index: §8 accepts it (its refusal, at given, its index, then its own place); and where it has an owner bucket and its output is the content hash of an item of an acknowledgement the statement settles, the statement names it in no line: attribution_unsettled.

So a statement cannot pay an owner from an attribution the verifier refuses: a disallowed use, a share that does not recompute, and an owner whose required tier is not met each refuse it. Step 4 lets a party that holds an output's attribution check that a statement settling the output's deliveries pays its owners; a statement settles the bases it names, and a verifier finds an omitted one only where it holds it.

7. The transparency report

7.1 The record

For one owner and one statement, the statement's party signs a report, kind "wai-influence-report":

member type meaning
kind string "wai-influence-report"
owner 32 B hex the owner reported to
party 32 B hex the statement's party, which signs it
statement 32 B hex the statement's digest (settlement §7.4)
start, end integer the statement's period
outputs array 0 to 1024 outputs, in strictly ascending order of basis
amount integer the sum of every line's amount
issued_at, signer_pubkey, sig §2: the party's key

An output is {"basis", "output", "whole", "buckets", "lines"}: the basis's link hash, its output's content hash and whole; the owner's buckets in it, 1 to 16 {"terms", "works", "units"} in strictly ascending order of terms; and its lines, 1 to 4 {"class", "deliveries", "bytes", "revenue", "amount"} in strictly ascending order of class (1 to 4): for the object class, the deliveries and bytes of the owner's attribution line, the revenue R of settlement §7.8, and the line's amount.

A report answers was my work used, and what was I paid: the outputs its works had units in, the works, the units over the whole, the deliveries and the amounts. It names no other owner and no other owner's units, terms or amounts, and no object but the outputs it lists.

7.2 Verifying a report

A report is verified in one of two ways, each stopping at the first refusal:

  • By the owner, given the report and its own terms: the report reads and its signature verifies (record_malformed, bad_key, bad_signature, at report), and its signer is its party (signer_mismatch, at report); the terms read as §8.2 step 2 reads them, at terms and its index; each bucket's terms are given (record_missing) and are the owner's (terms_mismatch), at report, output and the output's index; and each line's amount is the sum over the buckets of per_use × deliveries + ⌊revenue × share_ppm × units / (1 000 000 × whole)⌋, and amount the sum of the lines' (report_mismatch). The owner recomputes what it was paid from its own terms and the report's figures.
  • By an auditor, given also the statement with its inputs and its given attributions: after the owner's checks, the statement passes §6.2 (its refusal at statement, then its place); the report's party, statement, start and end are the statement's party, digest and period (report_mismatch, at report); and the report's outputs are exactly the statement's attribution lines whose payee is owner, grouped by basis, with each basis's figures for the owner: a basis or a line missing is report_incomplete, and any other difference report_mismatch, at report.

So the party cannot tell an owner it was paid for fewer deliveries, or not used, while settling otherwise: an auditor holding the statement finds the difference.

8. Verification

8.1 Inputs

An influence case is: a contribution case (contribution §10.1), whose policy this extension holds instead (below); the conditioning records it holds, the terms and the catalogues, each in a list; and the attribution record. The reference images are among the contribution case's states, named by their samples digests, and the adapter files among its model files, named by their SHA-256. A policy has one member, tier (stated, checked or recomputed; default stated), the lowest tier of the outcome it accepts.

8.2 Steps

The verifier runs these steps and stops at the first refusal, which it reports with its reason and its place:

  1. Contribution. Contribution §10.2 accepts the contribution case under a policy of stated: otherwise its refusal, at contribution and then contribution's place.
  2. Reading (§2, §3, §4.1, §5.3): each terms record, at terms and its index, each catalogue, at catalogue and its index, each conditioning record, at conditioning and its index, and the attribution, at attribution, read and their signatures verify (record_malformed, bad_key, bad_signature); each terms record and catalogue is signed by its owner (not_signed_by_owner).
  3. The attribution (§5.3), at attribution: its session is the session's link hash (session_mismatch); its signer is the tool (signer_mismatch); its record is the contribution record's link hash, its output that record's content_hash (not null), and its samples that record's width × height (output_mismatch); its rule is wai-influence:share/1 (rule_unknown); its shares sum to the whole (shares_not_whole); each conditioning record it names is given (record_missing); and each models entry, at attribution, model and its index, names a model party (party_unknown) and terms that are given (record_missing).
  4. Each conditioning record the attribution names, in its order, at conditioning and the record's index: its session is the session's (session_mismatch) and its signer the tool (signer_mismatch); where the verifier holds its step, §4.3 (conditioning_unbound, conditioning_invalid) and, for the step's generator, §4.4's structure (conditioning_mismatch for wai.generate.spectral; conditioning_invalid, params_invalid for wai-influence:spectral-blend); each reference, at reference and its index, §4.5 (record_missing, terms_mismatch, not_in_catalogue, terms_not_in_force, usage_unanswered, usage_disallowed); and, where it holds what §4.4 reads, the regeneration (conditioning_mismatch).
  5. Steps with no record: each held step of wai-influence:spectral-blend has a record the attribution names (conditioning_missing, at step and the step's index among the contribution case's steps).
  6. Each models entry, at attribution, model and its index: the terms' work is of kind prior with the party's digest (terms_mismatch); §4.5 step 4 with the entry's usage (usage_unanswered, usage_disallowed); and for each held generate, candidates or inpaint step of that party, §4.5 steps 3 and 5 (terms_not_in_force, usage_disallowed).
  7. The shares (§5.2, §5.4), at shares: unknown_attributed, estimate_mixed, shares_mismatch.
  8. The owners' buckets, each at shares and its index among the record's shares: its terms are given (record_missing) and name its owner (terms_mismatch), and its tier meets their attribution (§5.5, attribution_not_met). Where the shares were compared, the first two hold by step 4.
  9. Policy: an outcome below the policy's tier is tier_not_met, at policy.

8.3 What an accepted case states

  • tier (§5.5), and record and attribution: the link hashes of the contribution record and of the attribution (the basis);
  • conditioning: for each record the attribution names, in its order, the step's seq; its status: recomputed where §4.4 regenerated it, checked for a step of a pinned generator not regenerated, stated for any other generator, committed where the step is not held; its weights, declared or equal; and each reference's work, its owner's key or null, and for each of its usage entries the preference of the owner's statement: allow, unknown, outside for a null term, or absent where the statement does not carry the vocabulary or the work has no terms;
  • shares: the computed and the stated buckets, as §5.3 writes them, and compared, whether §5.4 compared them;
  • owners: for each owner bucket of the record, in its order, its owner, its terms and its tier (§5.5);
  • estimates: the record's, as stated.

A statement with attribution lines states, accepted, settlement §8.3's figures, its attribution lines among them, and the link hashes of its bases, bases, in the order the lines first name them. A report states, accepted, its owner, its amount and, for each output, its basis and its amount.

9. Reasons

The codes this extension adds, each with where it is raised:

reason raised at
not_signed_by_owner §3.2, §3.3, §8.2 step 2
rule_unknown §5.3, §8.2 step 3
shares_not_whole §5.3, §8.2 step 3
conditioning_unbound §4.3, §8.2 step 4
conditioning_invalid §4.3, §4.4, §8.2 step 4
conditioning_missing §4.4, §8.2 step 5
conditioning_mismatch §4.4, §8.2 step 4
terms_mismatch §4.5, §7.2, §8.2 steps 4, 6 and 8
not_in_catalogue §4.5, §8.2 step 4
terms_not_in_force §3.2, §4.5, §8.2 steps 4 and 6
estimate_mixed §5.4, §5.6, §8.2 step 7
shares_mismatch §5.4, §8.2 step 7
attribution_not_met §5.5, §8.2 step 8
currency_mismatch §6.2 step 2
attribution_unsettled §6.2 step 4
report_mismatch §7.2
report_incomplete §7.2

A verifier of this extension also raises contribution §11's record_malformed, bad_key, bad_signature, session_mismatch, signer_mismatch, output_mismatch, party_unknown, params_invalid, unknown_attributed and tier_not_met at the places above; ai-usage §9's usage_unanswered and usage_disallowed for the owner's terms (§4.5); live-metering §9's record_missing for an input not given; every code of contribution §11 at contribution; and, for a statement, every code settlement §11 raises and reuses, at settlement's places.

10. Conformance

live-conformance/influence/ holds the corpus, in one file, vectors.json, written from fixed seeds by wai_influence_vectors gen. It holds the model files its sessions generate with (the model file of wai.generate.spectral's conformance vector, and a second model file written from it that is an owner's style model and adapter), and:

  • cases, each an influence case and the outcome §8.3 gives it. Accepted: a generation conditioned on an owner's reference image, regenerated, then a person's brush edit, the shares divided between the person, the image's owner and the model; candidates conditioned on an owner's adapter and on a work of another owner's catalogue, each regenerated with its seed, one selected by an audience member and colour-graded; a drawing composed with a layer an owner's style model generated, the model's samples paid to its owner and the canvas fill to the arranger; an inpainting by an attested model conditioned on a taste prior and on an image with no owner, with no weights, the split equal and stated; a conditioned generation behind an attested scaling, whose samples are unknown; the same inpainting with the drawing's step undisclosed, the shares stated; and an attribution with a training-time estimate beside its shares. Refused: each reason of §9 and each code it reuses, each a control of one defect, among them a conditioning reference omitted where the regeneration needs it, a reference named for a generation of the exact generator, a use the owner's terms disallow, shares that do not sum to the whole, an estimate mixed into an owner's share, the unknown samples given to the tool's own terms, a share that does not recompute, and an owner's required tier not met.
  • statements, each a settlement statement with its inputs and given attributions and the outcome of §6.2: accepted, a publisher's statement with its delivery lines and an attribution line for each owner of two outputs; refused, an attribution line whose amount does not recompute, one that states more deliveries than were acknowledged, an owner's line left out, a basis not given, a basis whose use the owner's terms disallow (a disallowed use paid), a tariff in another currency, and an output's deliveries settled with no line for its owners.
  • reports, each verified by the owner or by an auditor: accepted, an owner's report of two outputs, verified both ways; refused, a report that leaves an output out, one whose amount does not recompute, and one signed by another key.

A conforming verifier gives every case, statement and report the outcome, the reason, the place and the statements the corpus states. wai_influence_vectors verify and the test tests/influence.rs check that the file regenerates byte for byte, that wai-rs gives every vector its outcome, that every reason of §9 and every code it reuses refuses a vector, and that §9 lists exactly the reference's codes. live-conformance/influence_verify.py is the second implementation, written from this text: it shares no code with wai-rs; it verifies the contribution case with the contribution corpus's second implementation (contribution_verify.py), runs the generator of §4.4 with that implementation's arithmetic, reads usage statements with ai_usage_verify.py and statements with settlement_verify.py, verifies every signature with WAI's strict rule (claim-conformance/_ed25519.py) and every link hash with claim-conformance/_blake3.py, computes every share, line and report itself, mutates copies of the corpus and requires every copy to fail, and drops each of its own checks in turn and requires the corpus to catch the weakened verifier.

11. Security and privacy considerations

  • What is exact and what is stated. A reference is exact where the generator is pinned: the step regenerates only from the works it names, at the weights it states. For any other generator the record is the tool's statement of what it loaded, signed and bound to the step by its link hash, and the tier of the use says so. An owner chooses the tier it requires (§5.5).
  • Omission. A tool that leaves a work out of a step of the pinned generator fails the regeneration. For another generator, leaving a work out is a false statement the record keeps: the step is fixed by the root, the attribution names the records it reads, and the use is stated. A statement can leave a basis out; an auditor holding the attribution finds it (§6.2 step 4).
  • Unknown is never paid. Units a rule cannot fix are unknown or undisclosed, and the comparison refuses them credited to a bucket, the tool's own among them (§5.4). Work with no owner is unowned, by digest: anyone who owns that work can see its units, and publish terms.
  • Estimates. A training-time estimate is noisy, and its class says of what kind. It is reported, never added to a share and never paid here.
  • Owners are keys. Terms and catalogues bind a work to a key by that key's signature only, so no tool can present terms as an owner's that the owner did not sign. Two keys may sign terms for one work; this extension states which terms a reference named and decides nothing between them.
  • What a report reveals. An owner's report gives its own buckets, the whole, and the output's deliveries, bytes and revenue, and names no other owner. An auditor holding the statement and its bases learns every owner's shares and amounts of those outputs, as settlement §13 says of a party verifying a statement. A session names its parties by keys and digests, and prompts stay salted commitments (contribution §8.1).
  • Not a judgment. A share is a count of samples under a declared rule, and an amount is that count at a tariff; neither says what a work is worth or whether a use was lawful.