### `wai.live.termination`: what nobody watches is ended with a receipt, and no bits above the panel

- **The extension** ([stream-termination](extensions/stream-termination.md)) registers the
  record `wai.live.termination`: a sink's **stream log**, `WSL1` records chained by digest
  and signed under a key it makes for its playback session. The **open** record states the
  stream (a MoQ track by its track digest, an HTTP stream by its content description), how it
  started (a user activation, or autoplay), the viewer's **autoplay setting** beside the
  platform's answer, the termination policy (the grace an unseen video stream gets, an idle
  timeout, an autoplay grace), the display declaration and the ladder offered. A **segment
  receipt** per segment states its objects' digest, bytes and media span, the rendition, its
  match against the panel, and each hop's joules (origin, relay, sink decode, display) with
  its acquisition class, the unmetered marker where a hop was not measured and nothing where
  the sink knows nothing of it. **Observations** record the document's visibility, occlusion
  (the presenting element out of the viewport, or the platform's report), the display's
  power and the viewer's interaction, at most once a second. The **termination** states its
  reason (`hidden`, `occluded`, `display_off`, `idle`, `autoplay_unattended`, `user`,
  `ended`), the media time and the joules of each hop up to it, one total per hop and class.
- **Verification** (§6): the chain and its order; nothing after a termination
  (`after_termination`: a stream terminated as hidden sends no further segment receipt); the
  reason against the state the log's own observations give at the termination
  (`reason_unsupported`; `reason_not_applicable` for hidden audio, which someone may still
  hear); a start by autoplay against the setting (`autoplay_against_setting`); every
  segment's match and admissibility; and the totals (`totals_mismatch`, a sum across two
  classes among them). An accepted log states its totals and unmetered counts, the absent
  hops, the panel counts, the unseen time and the **unwatched segments**: those received after
  the sink's own grace had run out while nobody could see them.
- **Display capability** ([capability-constraints](extensions/capability-constraints.md) §4):
  a sink declares its panel's resolution (sides without orientation), refresh rate, bit
  depth, dynamic range and physical size, and how a page reads each. A rendition's
  exceedances against it are four bits; the admissible renditions are those within it, or the
  least alone where none is; a sender sends no other, and a segment receipt records the match.
  The register gains `wai:transfer`, the coding-independent `TransferCharacteristics` code
  point. Physical size is recorded and bounds nothing in this revision.
- **Reference.** `wai-rs`'s `stream_termination` module (feature `stream_termination`, with a
  sink's writer); `wai-live-web` builds it for a page (`StreamLog`, `panelMatch`,
  `verifyStreamLog`) and `wai_live_web termination-verify` for the host. The room page
  (`joule-moq-web`'s `web/room/termination.js`) keeps a log for each track it receives,
  declares its panel, ends a video stream that has been hidden or out of view for its grace
  (the subscription cancelled, the audio kept) and opens a new log when it is seen again.
- **Conformance.** `live-conformance/termination/` (matches and logs, every reason refusing a
  log), `stream_termination_verify.py` as its second implementation, and `joule-moq-web`'s
  end-to-end scenario `termination`, in which the receiving page's tab really goes to the
  background.

