### `wai.media.contribution`: who contributed what, computed from the process

- **The extension** ([contribution](extensions/contribution.md)) registers the record
  `wai.media.contribution`. A tool signs a **session** naming its parties: people by Ed25519 key
  (`human`, `audience`), each countersigning its own membership (`wai-membership`), and models
  by digest. A person cannot be enrolled as a maker or a director of any sample without that
  signature (`party_not_countersigned`).
- **Steps.** Every act is a signed step (`wai-step`) in a hash chain, signed by the person who
  performed it or by the tool for a model: `author`, `generate`, `candidates`, `select`, `edit`,
  `inpaint`, `transform`, `compose` and `reject`; `direct` is reserved for direction tracks.
  Transforms and compositions evaluate pinned operations by name: deriving-edge's crop,
  rotation, mirror, overlay and grid composition, synthesis's upscale and denoise, and one new
  per-sample colour table, `wai-contribution:lut`. The exact generator is `wai.generate.spectral`.
- **The authorship map**, computed by re-executing each act's dependency rule: for every pixel
  of the output, `made_by` (whose act produced its value) and `directed_by` (whose prompt, mask,
  selection, parameters or arrangement conditioned it). A mixing filter takes the union of what
  it mixes; a selection adds the selector everywhere; a composition takes each layer where it is
  visible. Encoded with a palette and run-length rows, in one encoding, and bound to the output's
  samples by its digest. Shares are exact sample counts per party for each of the two sets,
  never one blended figure; an estimator's share rides beside them with its class.
- **Unknown is never zero.** An attested step's unpinned sample mapping leaves its samples
  `unknown`, and a verifier marks samples from steps it does not hold `undisclosed`; neither is
  ever credited to a party, and a stated map that credits an unknown sample is refused
  (`unknown_attributed`).
- **What a verifier checks**: the chain and every step's inclusion in the record's Merkle root;
  that an edit or an inpainting changed nothing outside its region, byte for byte
  (`outside_region_changed`); that a selection is a member of its committed set
  (`selection_not_in_set`) and that every candidate regenerates from its seed
  (`regeneration_mismatch`); that each transform and composition recomputes
  (`recompute_mismatch`); that the map recomputes (`map_mismatch`); and that the output's origin
  claim is synthesized wherever a model made a sample (`origin_understated`).
- **Selective disclosure.** Steps are disclosed with inclusion proofs and prompts are salted
  commitments; the outcome's tier says what was reached: `recomputed`, `checked` or `stated`.
- **Mappings.** One C2PA 2.4 actions statement per session, computed where every step is
  disclosed (`c2pa.created` from an empty canvas, then one action per step behind the output,
  with its software agent, its IPTC digital source type and its changed region); identity
  assertions and live tracks, informative.
- **WAI decides no legal question.** The record states facts a reader applies its own rule to.
- **Conformance.** `live-conformance/contribution/`, written from fixed seeds by
  `wai_contribution_vectors gen`, every reason of §11 refused at least once; `tests/contribution.rs`; and the second
  implementation, `live-conformance/contribution_verify.py`, which runs the generator in its own
  arithmetic after checking it against the generator's conformance vector, catches every
  mutated copy of the corpus, and is caught by the corpus with each of its checks dropped in
  turn. Audio maps by sample interval and video maps by frame are not part of this revision.

