### `wai.live.ad_presentation`: a player's signed claim that an ad was presented, and a spend that counts only presented impressions

- **The extension** ([ad-presentation](extensions/ad-presentation.md)) registers the record
  `wai.live.ad_presentation`. A presentation claim, `WPC1`, is a player's signed statement
  about one impression of a live-ads break: the break, the session and the slot of its
  form-2 `wai.video.ssai` receipt; the content hashes of the creative's media objects it
  presented; spans of the creative's media time, each with the least fraction of the pixels it
  observed in view, in basis points, and whether the ad was audible, measured over the ad's
  pixels, the player's area (the disclosure the video viewability guidelines ask for) or a
  television's full screen; a count of rendered frames where the platform exposes one; and
  optionally a device attestation.
- **The session key.** A player makes an Ed25519 key for each playback session of a room and
  signs its claims with it; the session its receipts name is derived from the key and the
  room, so the decider never chooses it and it links nothing across rooms.
- **The creative digest.** A creative is its media objects in order; its hash, in the pod,
  the receipt and the asset list's URIs, digests their content hashes and durations, so a
  claim's presented objects are checked against the bytes the creative's URI names.
- **Viewability rules, as their texts state them.** The video rule: at least 50% of the ad's
  pixels for 2 continuous seconds of played, unduplicated content (*Viewable Ad Impression
  Measurement Guidelines (Desktop)*, Version 2.0). The cross-media rule: 100% of the pixels for
  2 continuous seconds, which on a television output may be assumed (*Cross-Media Audience
  Measurement Standards (Phase I Video)* §2.2.1). A pause, stall or skip ends a run. The
  quartile a claim reaches is its contiguous coverage at VAST 4.3 §3.14.1's marks, and must be
  the receipt's `quartiles_reached`.
- **Device attestation.** A Privacy Pass token of RFC 9577 §2.2.1 whose TokenChallenge has as
  its redemption context a digest of the impression and the session key, so one token answers
  one impression; type 0x0002 is verified from the issuer's key as RFC 9578 §6.4 does
  (RSASSA-PSS with SHA-384), type 0x0001 by its issuer. A token attests the device an attester
  vouched for, not the rendering.
- **The billing rule.** An ad policy of version 2 (`WAP1`) names a viewability rule and can
  require a claim for each impression, an audible run and an attestation. Each claim then gets
  a verdict (reads, signed by the key its session is derived from, the impression's first,
  the creative's own objects, the receipt's quartile, viewable, attested when required), and
  the room verifier's spend-equivalence (live-ads §9.3 step 12) holds the **presented spend**,
  the prices of the impressions whose claim verifies, to the decider grant's ceiling. A
  stripped, redirected or forged beacon counts nothing. The text states plainly what a claim
  cannot prove without attestation (a modified player, or a party making session keys of its
  own, can state anything) and what attestation bounds and does not (a vouched device running
  modified software still signs).
- **live-ads** takes the version-2 policy, the derived session and the spend that counts; a
  policy of version 1 and every existing receipt verify as before, and `live-conformance/ads/`
  is unchanged.
- **Reference and corpus.** `wai-rs` feature `live_ads` (`src/live_ads/presentation.rs` and
  `presentation_corpus.rs`), which now takes `num-bigint` (already `oer`'s) for the RSA
  arithmetic. `live-conformance/presentation/`, written from fixed seeds by
  `wai_ad_presentation_vectors`, its issuer key RFC 9578 Appendix A.2's test key and its token
  checked first: good impressions under each rule, attested ones on television outputs, and a
  claim for each reason (too few pixels, a broken run, muted, a duplicate, a key that does not
  name the session, an object not the creative's, a misstated quartile, no token, another
  impression's token, an altered authenticator, a bad signature, a malformed claim, a session
  with no decision, and an impression with no claim), with a room whose receipts pass the
  ceiling only if every billed impression counted. Checked by `tests/ad_presentation.rs` and by
  `live-conformance/ad_presentation_verify.py`, a second implementation from the text with its
  own RSASSA-PSS, which requires every mutated copy to fail and catches each of its own checks
  dropped.
- **A reference producer** in the browser client, `joule-moq-web/web/ads/presentation.js`: a
  span recorder over a video element (an `IntersectionObserver`, the page's visibility and
  focus, volume, playback position and frame counts) and the claim's writer and signer on
  WebCrypto's Ed25519. Its tests turn observation sequences into the corpus's claims, byte for
  byte. No page of the client plays ads yet.

