### `wai.media.robustness`: robustness evidence anyone recomputes, claims held to it, and soft bindings over a span of a track

- **Span bindings** ([jwp-receipts](extensions/jwp-receipts.md) §2.6.4): a claim of class
  `soft-binding-span` declares a soft-binding value computed over a span of one track: its
  media time in milliseconds, both ends included, and, where the publisher states them, the
  groups or the objects that carry it. Its subject is the span's first object, the anchor. It
  maps onto a block of a C2PA soft-binding assertion whose scope is a `timespan` (C2PA 2.4
  §18.10); a whole-object binding is the block with the empty scope. A recovery through a span
  needs a verified delivery receipt within the span and attests the span — not which part of it
  the object in hand came from, nothing outside it, and, for a span of media time alone, no
  object but the anchor; a receipt outside it is `recovery_outside_span`. A recovery record may
  name a span declaration. New reasons `span_malformed` and `span_inverted` (step 4) and
  `recovery_outside_span` (step 6). `soft-binding` claims are unchanged, and every existing
  claim vector is byte-identical; the span vectors are appended to `claim-conformance/`, and
  `claim_verify.py` and `differential.py` read the class.
- **Robustness records** ([robustness-evidence](extensions/robustness-evidence.md)): a corpus
  document names pictures or clips by the SHA-256 of their samples, and itself by the SHA-256 of
  its JCS. An attack battery is a list of registered transforms (`wai-attack:*`), each an integer
  function of the frames, its exact parameters and a seed: synthesis §7.5.7's battery with its
  parameters free, and a gamma computed in integers. A signed record names the algorithm by term
  and definition digest, the corpus, the battery and the harness (`wai-robustness-harness:1`),
  and per attack the counts — items that survived out of the corpus, items read as another
  value, negatives read as marked — with survival, false-positive and balanced-accuracy rates and
  the true-positive rate at 1% false positives as exact fractions in lowest terms, never
  floating point (`rate_not_exact`). A verifier holding the corpus reruns the battery and the
  detector and gets the table bit for bit (`table_irreproducible`); one that does not states the
  record.
- **Claims held to their evidence.** A robustness claim lists the attacks an algorithm claims
  to survive, by media, transform and parameters, and cites records; it holds only where a cited
  record shows every corpus item survived the attack and no negative read as marked
  (`claim_unevidenced`, `claim_exceeds_evidence`), and, under a policy that asks, only over
  reproduced records (`evidence_not_reproduced`).
- **`wai-mark:tent64`'s own evidence.** Records over the `spectral`, `leaves` and `clips`
  measurement sets with synthesis §7.5.7's battery, whose tables equal the synthesis corpus's
  `battery.json`, and a claim that is exactly synthesis §7.5.8's list and holds over them.
- **The proposed `robustnessEvidence` object** (*Robustness Evidence for C2PA Soft-Binding
  Algorithms*, pinned by digest) is mapped field for field, informatively (§11).
- `wai-rs` module `robustness` (feature `robustness`), `wai_robustness_vectors`, the corpus
  `live-conformance/robustness/` (a conformance record over three pictures the corpus holds, the
  tent64 records and claim, and a case refused for each reason), and `robustness_verify.py`, the
  second implementation, which reruns the conformance battery end to end with `_wai_mark.py` and
  requires the same table. Registry: `wai.media.robustness` (record), the document kinds
  `wai-robustness`, `wai-robustness-claim` and `wai-robustness-corpus`, and the schemes
  `wai-attack:` and `wai-robustness-harness:1`.

