# live-conformance/channels — channel lineup and guide The corpus of [`extensions/channel-lineup.md`](../../extensions/channel-lineup.md) §11: a sample linear channel as operators exchange it, imported into its `wai.video.channel` receipt and its `WLU1` lineup, its guides, the cue tags of windows of its Media Playlist, and what a verifier states of each. Every file but this one is written from fixed seeds by `wai_channel_lineup_vectors gen` (feature `channel_lineup`), and `wai_channel_lineup_vectors verify ` and `tests/channel_lineup.rs` require them byte for byte. The second implementation is [`../channel_lineup_verify.py`](../channel_lineup_verify.py), run as `python3 -I channel_lineup_verify.py channels`. The sample channel, `sample-1`, is two hours on 2026-10-29 from 18:00 UTC, four programmes of three content owners, with four ad breaks: | file | what | |---|---| | `sample.xmltv.xml` | the schedule: XMLTV, with a document type declaration, a second channel's programme beside it, and times in three zone forms | | `sample-a.mrss.xml`, `sample-b.mrss.xml` | two owners' Media RSS catalogues: content, durations, titles, categories, thumbnails, ratings and country restrictions, one item under `media:group`, one item no programme names | | `sample.m3u8` | the channel's Media Playlist: SCTE-35 date ranges with real `splice_insert()` and `time_signal()` sections and their CRC, an out/in pair split across two tags of one `ID`, one duration from `END-DATE`, and a date range that is not a break | | `sample.json` | the same channel in the JSON form | | `art-*.svg` | the artwork the icons and thumbnails name | | `sample.channel.json` | the receipt the sample yields, its first hour the window | | `sample.guide.xml`, `sample.part.guide.xml` | XMLTV guides of the whole schedule and of a range | | `sample.now-next.json`, `sample.before.now-next.json`, `sample.after.now-next.json` | now/next documents inside a break, before the schedule and after it | | `media_rss_loop.channel.json` | the receipt of one owner's items alone, back to back | | `aired-misreported.channel.json` | a receipt, signed, whose program-as-run its window does not give | | `sample.cues.json` | the cues the sample's import writes (`cues.json`, §9) | | `no-section.cues.json` | the cues of the same channel from the JSON form with brk-1's section left out: its receipt is the sample's | | `quoted.channel.json`, `quoted.cues.json` | the receipt and cues of the same channel from the JSON form with brk-1 named `brk"1` | | `line-feed.channel.json`, `line-feed.cues.json` | the receipt and cues of the same channel from the JSON form with brk-1 named with a line feed | | `carriage-return.channel.json`, `carriage-return.cues.json` | the same with brk-1 named with a carriage return, which an import refuses: the operator signs that receipt itself | | `far.channel.json`, `far.cues.json` | a channel scheduled at the end of the year 9999: a programme to 9999-12-31T23:59:59.999Z, a break of a millisecond from then, and one from 10000-01-01T00:00:00Z | | `sample.out-in.m3u8`, `sample.inside.m3u8`, `sample.offset.m3u8`, `sample.return.m3u8`, `sample.none.m3u8`, `sample.no-section.m3u8`, `sample.fractional.m3u8`, `sample.longest-uri.m3u8`, `sample.longest-segment.m3u8`, `sample.last-sequence.m3u8`, `far.m3u8` | the Media Playlists the windows of `playlists` render, their breaks' cue tags written (§7.4) | | `vectors.json` | the operator's key, and every vector | `vectors.json` holds: - `operator`: the key that signs every receipt and lineup, and its seed (a published seed: a test key that attests nothing); - `imports`: each with its `inputs` (§4.1: the files it reads, owners, `id_system`, `xmltv_channel`, `start_ms`, the artwork set by file name, the window, `signer_id` and `parent_receipt_hash`), its `edits`, and its `outcome`: `{"refused": reason}`, or the receipt's file and identity, the lineup's bytes and digest in hexadecimal, and the cues (each break's id, its start and its live-events `cue` payload in hexadecimal); - `verifications`: each with its `receipt` file, its `lineup` bytes in hexadecimal, its `guide` file or `null`, its `edits`, and its `facts`, what §8.3 states: `verdict`, `part`, `receipt`, `lineup`, `guide` (`format`, `from_ms`, `to_ms`, `at_ms`, and its `programmes`, each `start_ms`, `stop_ms`, `asset_id` and `aired`), and `entry`; - `playlists`: each with its `receipt` and `cues` files, its `window` (`media_sequence`, `start_ms`, its `segments`, each `uri` and `duration_ms`, and `ended`), and its `outcome`: `{"playlist": file}`, the playlist the window renders byte for byte, or `{"refused": reason, "index": n}` (§7.4: the segment's index for `cue_unaligned`, the break's for `cue_unwritable`, `null` for `playlist_malformed`); - `playlist_verifications`: each with its `receipt`, `cues` and `playlist` files, its `edits`, and its `facts`, what §8.4 states: `verdict`, `part`, `receipt`, `window` (`media_sequence`, `start_ms`, `segments`, the count, `ended`, and its `breaks`, each `break`, `start_ms`, `duration_ms` and `scte35`, whether it has a date range), and `index`. An edit is applied to a copy of the file it names before the vector is run: `{"file", "find", "replace"}` replaces the one occurrence of `find` (an edit whose `find` does not occur exactly once is a broken vector); with `"repeat": n` it keeps `find` and writes `replace` n times after it; and `{"file", "pad"}` appends that many space bytes. Each control is the sample with one such change, or with one input changed.