From 3ae663699f398b41a14ee2a1bb87e0f76a352260 Mon Sep 17 00:00:00 2001 From: Transaction Science Date: Tue, 3 Nov 2026 16:45:52 -0500 Subject: [PATCH 1/2] live-contribution: the link record's magic is WLK1, no longer the clip record's WCL1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The contribution link record and the live-recording clip record both began WCL1. The clip record had it first (live-recording §5.1, the registry's only WCL1 row); the link record took the same four bytes when it was added, so a reader that tells records apart by their magic could not tell one from the other. The link record is now WLK1, a magic nothing else in the registry, the code or an open branch uses. live-contribution §6.2 and SPEC name it, §6.5 step 2 says the clip record's WCL1 is refused as malformed, and codecs/registry.rs registers it (REGISTRY.md and registry/ exported from it). joule-moq-ingest writes and reads it. The corpus live-conformance/links/ is regenerated with it, its files now .wlk1, plus clip_record_magic, a part with the clip record's magic, refused. live_contribution_verify.py reads WLK1 and also refuses each accepted part mutated to WCL1. A wire change: a link record written before this one is malformed to a reader of this revision. The CHANGELOG says so and acknowledges every corpus file that changed. Co-Authored-By: Claude Opus 5.5 --- joule-code/CHANGELOG.md | 7 + .../crates/joule-moq-ingest/README.md | 2 +- .../joule-moq-ingest/gateway.example.toml | 2 +- .../joule-moq-ingest/src/bin/link_vectors.rs | 15 +- .../crates/joule-moq-ingest/src/config.rs | 2 +- .../crates/joule-moq-ingest/src/contrib.rs | 2 +- .../crates/joule-moq-ingest/src/gateway.rs | 2 +- .../crates/joule-moq-ingest/src/lib.rs | 2 +- .../crates/joule-moq-ingest/src/linkrec.rs | 4 +- wai/CHANGELOG.md | 117 +++++++++ wai/REGISTRY.md | 1 + wai/SPEC.md | 2 +- wai/extensions/live-contribution.md | 9 +- wai/live-conformance/links/README.md | 4 +- ...{altered_count.wcl1 => altered_count.wlk1} | Bin 655 -> 655 bytes .../links/{bad_key.wcl1 => bad_key.wlk1} | Bin 655 -> 655 bytes ...d_without_groups.0.wcl1 => bad_magic.wlk1} | Bin 655 -> 655 bytes .../{bad_magic.wcl1 => bad_signature.wlk1} | Bin 655 -> 655 bytes ...ivery.wcl1 => bytes_without_delivery.wlk1} | Bin 595 -> 595 bytes ...un_outside.wcl1 => clip_record_magic.wlk1} | Bin 655 -> 655 bytes ...ount_mismatch.wcl1 => count_mismatch.wlk1} | Bin 655 -> 655 bytes .../{empty_span.wcl1 => empty_span.wlk1} | Bin 655 -> 655 bytes ...arent.wcl1 => first_part_with_parent.wlk1} | Bin 655 -> 655 bytes ...red.wcl1 => first_try_over_delivered.wlk1} | Bin 655 -> 655 bytes ...{last_byte_two.wcl1 => last_byte_two.wlk1} | Bin 655 -> 655 bytes ...t_reason.wcl1 => last_without_reason.wlk1} | Bin 655 -> 655 bytes ...nt.wcl1 => later_part_without_parent.wlk1} | Bin 655 -> 655 bytes ...st_window.wcl1 => margin_past_window.wlk1} | Bin 655 -> 655 bytes ...very.wcl1 => margin_without_recovery.wlk1} | Bin 575 -> 575 bytes .../{mode_unknown.wcl1 => mode_unknown.wlk1} | Bin 655 -> 655 bytes .../links/{no_window.wcl1 => no_window.wlk1} | Bin 655 -> 655 bytes ...ot_last.wcl1 => outstanding_not_last.wlk1} | Bin 655 -> 655 bytes ...col_unknown.wcl1 => protocol_unknown.wlk1} | Bin 655 -> 655 bytes ...eason_unknown.wcl1 => reason_unknown.wlk1} | Bin 655 -> 655 bytes ...out_last.wcl1 => reason_without_last.wlk1} | Bin 655 -> 655 bytes ...sordered.wcl1 => recovery_disordered.wlk1} | Bin 655 -> 655 bytes ....wcl1 => recovery_empty_with_figures.wlk1} | Bin 595 -> 595 bytes ...ery_samples.wcl1 => recovery_samples.wlk1} | Bin 655 -> 655 bytes ...sts.wcl1 => requested_below_requests.wlk1} | Bin 655 -> 655 bytes ...main_aes192.wcl1 => rist_main_aes192.wlk1} | Bin 655 -> 655 bytes ...main_psk256.wcl1 => rist_main_psk256.wlk1} | Bin 615 -> 615 bytes .../{rist_simple.wcl1 => rist_simple.wlk1} | Bin 615 -> 615 bytes ...rypted.wcl1 => rist_simple_encrypted.wlk1} | Bin 655 -> 655 bytes ...tt_disordered.wcl1 => rtt_disordered.wlk1} | Bin 655 -> 655 bytes ...gures.wcl1 => rtt_empty_with_figures.wlk1} | Bin 655 -> 655 bytes .../links/{run_empty.wcl1 => run_empty.wlk1} | Bin 675 -> 675 bytes .../{bad_signature.wcl1 => run_outside.wlk1} | Bin 655 -> 655 bytes .../{run_overfull.wcl1 => run_overfull.wlk1} | Bin 655 -> 655 bytes ...ull_alone.wcl1 => run_overfull_alone.wlk1} | Bin 655 -> 655 bytes .../{runs_overlap.wcl1 => runs_overlap.wlk1} | Bin 655 -> 655 bytes ...s_past_bound.wcl1 => runs_past_bound.wlk1} | Bin 10835 -> 10835 bytes .../{runs_short.wcl1 => runs_short.wlk1} | Bin 635 -> 635 bytes ...uns_truncated.wcl1 => runs_truncated.wlk1} | Bin 10815 -> 10815 bytes .../series_head_moved_without_groups.0.wlk1 | Bin 0 -> 655 bytes ...> series_head_moved_without_groups.1.wlk1} | Bin 595 -> 595 bytes .../links/series_other_cipher.0.wcl1 | Bin 655 -> 0 bytes .../links/series_other_cipher.0.wlk1 | Bin 0 -> 655 bytes ...pher.1.wcl1 => series_other_cipher.1.wlk1} | Bin 595 -> 595 bytes .../links/series_other_grant.0.wcl1 | Bin 655 -> 0 bytes .../links/series_other_grant.0.wlk1 | Bin 0 -> 655 bytes ...grant.1.wcl1 => series_other_grant.1.wlk1} | Bin 595 -> 595 bytes .../links/series_other_hop.0.wcl1 | Bin 655 -> 0 bytes .../links/series_other_hop.0.wlk1 | Bin 0 -> 655 bytes ...her_hop.1.wcl1 => series_other_hop.1.wlk1} | Bin 595 -> 595 bytes .../links/series_other_mode.0.wcl1 | Bin 655 -> 0 bytes .../links/series_other_mode.0.wlk1 | Bin 0 -> 655 bytes ...otocol.1.wcl1 => series_other_mode.1.wlk1} | Bin 595 -> 595 bytes .../links/series_other_principal.0.wcl1 | Bin 655 -> 0 bytes .../links/series_other_principal.0.wlk1 | Bin 0 -> 655 bytes ...l.1.wcl1 => series_other_principal.1.wlk1} | Bin 595 -> 595 bytes .../links/series_other_protocol.0.wcl1 | Bin 655 -> 0 bytes .../links/series_other_protocol.0.wlk1 | Bin 0 -> 655 bytes ...ow.1.wcl1 => series_other_protocol.1.wlk1} | Bin 595 -> 595 bytes .../links/series_other_room.0.wcl1 | Bin 655 -> 0 bytes .../links/series_other_room.0.wlk1 | Bin 0 -> 655 bytes ...r_room.1.wcl1 => series_other_room.1.wlk1} | Bin 595 -> 595 bytes .../links/series_other_session.0.wcl1 | Bin 655 -> 0 bytes .../links/series_other_session.0.wlk1 | Bin 0 -> 655 bytes ...ion.1.wcl1 => series_other_session.1.wlk1} | Bin 595 -> 595 bytes .../links/series_other_window.0.wcl1 | Bin 655 -> 0 bytes .../links/series_other_window.0.wlk1 | Bin 0 -> 655 bytes ...mode.1.wcl1 => series_other_window.1.wlk1} | Bin 595 -> 595 bytes ...t.0.wcl1 => series_part_after_last.0.wlk1} | Bin 655 -> 655 bytes .../links/series_part_after_last.1.wcl1 | Bin 595 -> 0 bytes .../links/series_part_after_last.1.wlk1 | Bin 0 -> 595 bytes .../links/series_sequence_gap.0.wcl1 | Bin 655 -> 0 bytes .../links/series_sequence_gap.0.wlk1 | Bin 0 -> 655 bytes .../links/series_sequence_gap.1.wcl1 | Bin 595 -> 0 bytes .../links/series_sequence_gap.1.wlk1 | Bin 0 -> 595 bytes .../links/series_skips_a_part.0.wcl1 | Bin 655 -> 0 bytes .../links/series_skips_a_part.0.wlk1 | Bin 0 -> 655 bytes .../links/series_skips_a_part.1.wcl1 | Bin 595 -> 0 bytes .../links/series_skips_a_part.1.wlk1 | Bin 0 -> 595 bytes ...part.2.wcl1 => series_skips_a_part.2.wlk1} | Bin 595 -> 595 bytes .../links/series_starts_late.0.wcl1 | Bin 595 -> 0 bytes .../links/series_starts_late.0.wlk1 | Bin 0 -> 595 bytes ..._late.1.wcl1 => series_starts_late.1.wlk1} | Bin 595 -> 595 bytes .../links/series_three_parts.0.wcl1 | Bin 655 -> 0 bytes .../links/series_three_parts.0.wlk1 | Bin 0 -> 655 bytes .../links/series_three_parts.1.wcl1 | Bin 595 -> 0 bytes .../links/series_three_parts.1.wlk1 | Bin 0 -> 595 bytes ...parts.2.wcl1 => series_three_parts.2.wlk1} | Bin 595 -> 595 bytes .../links/series_time_gap.0.wcl1 | Bin 655 -> 0 bytes .../links/series_time_gap.0.wlk1 | Bin 0 -> 655 bytes .../links/series_time_gap.1.wcl1 | Bin 595 -> 0 bytes .../links/series_time_gap.1.wlk1 | Bin 0 -> 595 bytes .../links/series_track_added.0.wcl1 | Bin 655 -> 0 bytes .../links/series_track_added.0.wlk1 | Bin 0 -> 655 bytes ...added.1.wcl1 => series_track_added.1.wlk1} | Bin 675 -> 675 bytes ...added.2.wcl1 => series_track_added.2.wlk1} | Bin 675 -> 675 bytes .../links/series_track_alias_changed.0.wcl1 | Bin 655 -> 0 bytes .../links/series_track_alias_changed.0.wlk1 | Bin 0 -> 655 bytes ...wcl1 => series_track_alias_changed.1.wlk1} | Bin 595 -> 595 bytes .../links/series_track_dropped.0.wcl1 | Bin 655 -> 0 bytes .../links/series_track_dropped.0.wlk1 | Bin 0 -> 655 bytes ...ped.1.wcl1 => series_track_dropped.1.wlk1} | Bin 515 -> 515 bytes .../links/series_wrong_parent.0.wcl1 | Bin 655 -> 0 bytes .../links/series_wrong_parent.0.wlk1 | Bin 0 -> 655 bytes ...rent.1.wcl1 => series_wrong_parent.1.wlk1} | Bin 595 -> 595 bytes ...rent.2.wcl1 => series_wrong_parent.2.wlk1} | Bin 595 -> 595 bytes ...{small_order_r.wcl1 => small_order_r.wlk1} | Bin 655 -> 655 bytes ...ler_aes192.wcl1 => srt_caller_aes192.wlk1} | Bin 595 -> 595 bytes ...rt_cipher_100.wcl1 => srt_cipher_100.wlk1} | Bin 655 -> 655 bytes ...tanding.wcl1 => srt_last_outstanding.wlk1} | Bin 635 -> 635 bytes ...ner_clean.wcl1 => srt_listener_clean.wlk1} | Bin 575 -> 575 bytes wai/live-conformance/links/srt_recovered.wcl1 | Bin 655 -> 0 bytes wai/live-conformance/links/srt_recovered.wlk1 | Bin 0 -> 655 bytes .../links/{too_large.wcl1 => too_large.wlk1} | Bin 11296 -> 11296 bytes ...ps.wcl1 => track_head_without_groups.wlk1} | Bin 655 -> 655 bytes ...ero_digest.wcl1 => track_zero_digest.wlk1} | Bin 655 -> 655 bytes ...s_not_begun.wcl1 => tracks_not_begun.wlk1} | Bin 575 -> 575 bytes ...past_bound.wcl1 => tracks_past_bound.wlk1} | Bin 1375 -> 1375 bytes ...cks_unsorted.wcl1 => tracks_unsorted.wlk1} | Bin 655 -> 655 bytes wai/live-conformance/links/trailing_byte.wcl1 | Bin 656 -> 0 bytes wai/live-conformance/links/trailing_byte.wlk1 | Bin 0 -> 656 bytes .../links/{truncated.wcl1 => truncated.wlk1} | Bin 654 -> 654 bytes ..._byte_two.wcl1 => truncated_byte_two.wlk1} | Bin 655 -> 655 bytes ..._not_full.wcl1 => truncated_not_full.wlk1} | Bin 655 -> 655 bytes .../{two_dropped.wcl1 => two_dropped.wlk1} | Bin 595 -> 595 bytes .../links/unknown_version.wcl1 | Bin 655 -> 0 bytes .../links/unknown_version.wlk1 | Bin 0 -> 655 bytes wai/live-conformance/links/vectors.json | 242 +++++++++--------- .../live_contribution_verify.py | 7 +- wai/registry/capabilities.json | 7 + wai/wai-rs/src/codecs/registry.rs | 2 + 145 files changed, 289 insertions(+), 140 deletions(-) rename wai/live-conformance/links/{altered_count.wcl1 => altered_count.wlk1} (78%) rename wai/live-conformance/links/{bad_key.wcl1 => bad_key.wlk1} (78%) rename wai/live-conformance/links/{series_head_moved_without_groups.0.wcl1 => bad_magic.wlk1} (78%) rename wai/live-conformance/links/{bad_magic.wcl1 => bad_signature.wlk1} (78%) rename wai/live-conformance/links/{bytes_without_delivery.wcl1 => bytes_without_delivery.wlk1} (74%) rename wai/live-conformance/links/{run_outside.wcl1 => clip_record_magic.wlk1} (81%) rename wai/live-conformance/links/{count_mismatch.wcl1 => count_mismatch.wlk1} (78%) rename wai/live-conformance/links/{empty_span.wcl1 => empty_span.wlk1} (78%) rename wai/live-conformance/links/{first_part_with_parent.wcl1 => first_part_with_parent.wlk1} (78%) rename wai/live-conformance/links/{first_try_over_delivered.wcl1 => first_try_over_delivered.wlk1} (78%) rename wai/live-conformance/links/{last_byte_two.wcl1 => last_byte_two.wlk1} (78%) rename wai/live-conformance/links/{last_without_reason.wcl1 => last_without_reason.wlk1} (78%) rename wai/live-conformance/links/{later_part_without_parent.wcl1 => later_part_without_parent.wlk1} (78%) rename wai/live-conformance/links/{margin_past_window.wcl1 => margin_past_window.wlk1} (78%) rename wai/live-conformance/links/{margin_without_recovery.wcl1 => margin_without_recovery.wlk1} (77%) rename wai/live-conformance/links/{mode_unknown.wcl1 => mode_unknown.wlk1} (78%) rename wai/live-conformance/links/{no_window.wcl1 => no_window.wlk1} (78%) rename wai/live-conformance/links/{outstanding_not_last.wcl1 => outstanding_not_last.wlk1} (78%) rename wai/live-conformance/links/{protocol_unknown.wcl1 => protocol_unknown.wlk1} (78%) rename wai/live-conformance/links/{reason_unknown.wcl1 => reason_unknown.wlk1} (78%) rename wai/live-conformance/links/{reason_without_last.wcl1 => reason_without_last.wlk1} (78%) rename wai/live-conformance/links/{recovery_disordered.wcl1 => recovery_disordered.wlk1} (78%) rename wai/live-conformance/links/{recovery_empty_with_figures.wcl1 => recovery_empty_with_figures.wlk1} (75%) rename wai/live-conformance/links/{recovery_samples.wcl1 => recovery_samples.wlk1} (78%) rename wai/live-conformance/links/{requested_below_requests.wcl1 => requested_below_requests.wlk1} (78%) rename wai/live-conformance/links/{rist_main_aes192.wcl1 => rist_main_aes192.wlk1} (78%) rename wai/live-conformance/links/{rist_main_psk256.wcl1 => rist_main_psk256.wlk1} (82%) rename wai/live-conformance/links/{rist_simple.wcl1 => rist_simple.wlk1} (83%) rename wai/live-conformance/links/{rist_simple_encrypted.wcl1 => rist_simple_encrypted.wlk1} (78%) rename wai/live-conformance/links/{rtt_disordered.wcl1 => rtt_disordered.wlk1} (78%) rename wai/live-conformance/links/{rtt_empty_with_figures.wcl1 => rtt_empty_with_figures.wlk1} (78%) rename wai/live-conformance/links/{run_empty.wcl1 => run_empty.wlk1} (85%) rename wai/live-conformance/links/{bad_signature.wcl1 => run_outside.wlk1} (78%) rename wai/live-conformance/links/{run_overfull.wcl1 => run_overfull.wlk1} (78%) rename wai/live-conformance/links/{run_overfull_alone.wcl1 => run_overfull_alone.wlk1} (78%) rename wai/live-conformance/links/{runs_overlap.wcl1 => runs_overlap.wlk1} (78%) rename wai/live-conformance/links/{runs_past_bound.wcl1 => runs_past_bound.wlk1} (98%) rename wai/live-conformance/links/{runs_short.wcl1 => runs_short.wlk1} (80%) rename wai/live-conformance/links/{runs_truncated.wcl1 => runs_truncated.wlk1} (98%) create mode 100644 wai/live-conformance/links/series_head_moved_without_groups.0.wlk1 rename wai/live-conformance/links/{series_head_moved_without_groups.1.wcl1 => series_head_moved_without_groups.1.wlk1} (64%) delete mode 100644 wai/live-conformance/links/series_other_cipher.0.wcl1 create mode 100644 wai/live-conformance/links/series_other_cipher.0.wlk1 rename wai/live-conformance/links/{series_other_cipher.1.wcl1 => series_other_cipher.1.wlk1} (64%) delete mode 100644 wai/live-conformance/links/series_other_grant.0.wcl1 create mode 100644 wai/live-conformance/links/series_other_grant.0.wlk1 rename wai/live-conformance/links/{series_other_grant.1.wcl1 => series_other_grant.1.wlk1} (64%) delete mode 100644 wai/live-conformance/links/series_other_hop.0.wcl1 create mode 100644 wai/live-conformance/links/series_other_hop.0.wlk1 rename wai/live-conformance/links/{series_other_hop.1.wcl1 => series_other_hop.1.wlk1} (64%) delete mode 100644 wai/live-conformance/links/series_other_mode.0.wcl1 create mode 100644 wai/live-conformance/links/series_other_mode.0.wlk1 rename wai/live-conformance/links/{series_other_protocol.1.wcl1 => series_other_mode.1.wlk1} (64%) delete mode 100644 wai/live-conformance/links/series_other_principal.0.wcl1 create mode 100644 wai/live-conformance/links/series_other_principal.0.wlk1 rename wai/live-conformance/links/{series_other_principal.1.wcl1 => series_other_principal.1.wlk1} (53%) delete mode 100644 wai/live-conformance/links/series_other_protocol.0.wcl1 create mode 100644 wai/live-conformance/links/series_other_protocol.0.wlk1 rename wai/live-conformance/links/{series_other_window.1.wcl1 => series_other_protocol.1.wlk1} (64%) delete mode 100644 wai/live-conformance/links/series_other_room.0.wcl1 create mode 100644 wai/live-conformance/links/series_other_room.0.wlk1 rename wai/live-conformance/links/{series_other_room.1.wcl1 => series_other_room.1.wlk1} (64%) delete mode 100644 wai/live-conformance/links/series_other_session.0.wcl1 create mode 100644 wai/live-conformance/links/series_other_session.0.wlk1 rename wai/live-conformance/links/{series_other_session.1.wcl1 => series_other_session.1.wlk1} (64%) delete mode 100644 wai/live-conformance/links/series_other_window.0.wcl1 create mode 100644 wai/live-conformance/links/series_other_window.0.wlk1 rename wai/live-conformance/links/{series_other_mode.1.wcl1 => series_other_window.1.wlk1} (64%) rename wai/live-conformance/links/{series_part_after_last.0.wcl1 => series_part_after_last.0.wlk1} (78%) delete mode 100644 wai/live-conformance/links/series_part_after_last.1.wcl1 create mode 100644 wai/live-conformance/links/series_part_after_last.1.wlk1 delete mode 100644 wai/live-conformance/links/series_sequence_gap.0.wcl1 create mode 100644 wai/live-conformance/links/series_sequence_gap.0.wlk1 delete mode 100644 wai/live-conformance/links/series_sequence_gap.1.wcl1 create mode 100644 wai/live-conformance/links/series_sequence_gap.1.wlk1 delete mode 100644 wai/live-conformance/links/series_skips_a_part.0.wcl1 create mode 100644 wai/live-conformance/links/series_skips_a_part.0.wlk1 delete mode 100644 wai/live-conformance/links/series_skips_a_part.1.wcl1 create mode 100644 wai/live-conformance/links/series_skips_a_part.1.wlk1 rename wai/live-conformance/links/{series_skips_a_part.2.wcl1 => series_skips_a_part.2.wlk1} (64%) delete mode 100644 wai/live-conformance/links/series_starts_late.0.wcl1 create mode 100644 wai/live-conformance/links/series_starts_late.0.wlk1 rename wai/live-conformance/links/{series_starts_late.1.wcl1 => series_starts_late.1.wlk1} (64%) delete mode 100644 wai/live-conformance/links/series_three_parts.0.wcl1 create mode 100644 wai/live-conformance/links/series_three_parts.0.wlk1 delete mode 100644 wai/live-conformance/links/series_three_parts.1.wcl1 create mode 100644 wai/live-conformance/links/series_three_parts.1.wlk1 rename wai/live-conformance/links/{series_three_parts.2.wcl1 => series_three_parts.2.wlk1} (64%) delete mode 100644 wai/live-conformance/links/series_time_gap.0.wcl1 create mode 100644 wai/live-conformance/links/series_time_gap.0.wlk1 delete mode 100644 wai/live-conformance/links/series_time_gap.1.wcl1 create mode 100644 wai/live-conformance/links/series_time_gap.1.wlk1 delete mode 100644 wai/live-conformance/links/series_track_added.0.wcl1 create mode 100644 wai/live-conformance/links/series_track_added.0.wlk1 rename wai/live-conformance/links/{series_track_added.1.wcl1 => series_track_added.1.wlk1} (75%) rename wai/live-conformance/links/{series_track_added.2.wcl1 => series_track_added.2.wlk1} (75%) delete mode 100644 wai/live-conformance/links/series_track_alias_changed.0.wcl1 create mode 100644 wai/live-conformance/links/series_track_alias_changed.0.wlk1 rename wai/live-conformance/links/{series_track_alias_changed.1.wcl1 => series_track_alias_changed.1.wlk1} (64%) delete mode 100644 wai/live-conformance/links/series_track_dropped.0.wcl1 create mode 100644 wai/live-conformance/links/series_track_dropped.0.wlk1 rename wai/live-conformance/links/{series_track_dropped.1.wcl1 => series_track_dropped.1.wlk1} (62%) delete mode 100644 wai/live-conformance/links/series_wrong_parent.0.wcl1 create mode 100644 wai/live-conformance/links/series_wrong_parent.0.wlk1 rename wai/live-conformance/links/{series_wrong_parent.1.wcl1 => series_wrong_parent.1.wlk1} (75%) rename wai/live-conformance/links/{series_wrong_parent.2.wcl1 => series_wrong_parent.2.wlk1} (64%) rename wai/live-conformance/links/{small_order_r.wcl1 => small_order_r.wlk1} (87%) rename wai/live-conformance/links/{srt_caller_aes192.wcl1 => srt_caller_aes192.wlk1} (77%) rename wai/live-conformance/links/{srt_cipher_100.wcl1 => srt_cipher_100.wlk1} (78%) rename wai/live-conformance/links/{srt_last_outstanding.wcl1 => srt_last_outstanding.wlk1} (76%) rename wai/live-conformance/links/{srt_listener_clean.wcl1 => srt_listener_clean.wlk1} (77%) delete mode 100644 wai/live-conformance/links/srt_recovered.wcl1 create mode 100644 wai/live-conformance/links/srt_recovered.wlk1 rename wai/live-conformance/links/{too_large.wcl1 => too_large.wlk1} (98%) rename wai/live-conformance/links/{track_head_without_groups.wcl1 => track_head_without_groups.wlk1} (78%) rename wai/live-conformance/links/{track_zero_digest.wcl1 => track_zero_digest.wlk1} (78%) rename wai/live-conformance/links/{tracks_not_begun.wcl1 => tracks_not_begun.wlk1} (77%) rename wai/live-conformance/links/{tracks_past_bound.wcl1 => tracks_past_bound.wlk1} (93%) rename wai/live-conformance/links/{tracks_unsorted.wcl1 => tracks_unsorted.wlk1} (78%) delete mode 100644 wai/live-conformance/links/trailing_byte.wcl1 create mode 100644 wai/live-conformance/links/trailing_byte.wlk1 rename wai/live-conformance/links/{truncated.wcl1 => truncated.wlk1} (78%) rename wai/live-conformance/links/{truncated_byte_two.wcl1 => truncated_byte_two.wlk1} (78%) rename wai/live-conformance/links/{truncated_not_full.wcl1 => truncated_not_full.wlk1} (78%) rename wai/live-conformance/links/{two_dropped.wcl1 => two_dropped.wlk1} (74%) delete mode 100644 wai/live-conformance/links/unknown_version.wcl1 create mode 100644 wai/live-conformance/links/unknown_version.wlk1 diff --git a/joule-code/CHANGELOG.md b/joule-code/CHANGELOG.md index 62779d6e2..bd20d16fa 100644 --- a/joule-code/CHANGELOG.md +++ b/joule-code/CHANGELOG.md @@ -4,6 +4,13 @@ All notable changes to the Joule Code standard are recorded here. The format fol ## [Unreleased] +### Changed — `joule-moq-ingest`: the contribution link record's magic is `WLK1` + +- **Wire change.** `linkrec::MAGIC` is `WLK1` (WAI `extensions/live-contribution.md` §6.2), so the link record no + longer shares `WCL1` with WAI's clip record (live-recording §5.1), which had it first. A part written before this + change is refused as `malformed`; nothing else in the record changes. `joule-moq-ingest-link-vectors` writes + `.wlk1` files, and adds `clip_record_magic`, a part bearing the clip record's magic, refused `malformed`. + ### Changed — `joule-moq-relay`: one object held once, and a socket that keeps what arrives - **`limits.quic_socket_buffer_bytes`** (4 MiB by default, and for the links a relay dials too): the diff --git a/joule-code/joule-code-rs/crates/joule-moq-ingest/README.md b/joule-code/joule-code-rs/crates/joule-moq-ingest/README.md index 4ec04d1da..d6d27beae 100644 --- a/joule-code/joule-code-rs/crates/joule-moq-ingest/README.md +++ b/joule-code/joule-code-rs/crates/joule-moq-ingest/README.md @@ -222,7 +222,7 @@ stream and the first AAC stream go to the video and audio tracks as WHIP's frame access unit (one ADTS frame) an object, the PTS on the room clock; a PES missing a packet is dropped whole. The catalog declares the owner's `link` track. -**The link record** (`linkrec`, `WCL1`): every `[contrib] record_interval_ms` and when the +**The link record** (`linkrec`, `WLK1`): every `[contrib] record_interval_ms` and when the session ends, the gateway signs a part: the sequence numbers passed, each delivered at the first try, recovered, dropped or outstanding, the loss runs, requests, retransmissions, round trips and recovery times, chained to the part before and naming each media track's receipt diff --git a/joule-code/joule-code-rs/crates/joule-moq-ingest/gateway.example.toml b/joule-code/joule-code-rs/crates/joule-moq-ingest/gateway.example.toml index e4ee55a36..547cad053 100644 --- a/joule-code/joule-code-rs/crates/joule-moq-ingest/gateway.example.toml +++ b/joule-code/joule-code-rs/crates/joule-moq-ingest/gateway.example.toml @@ -58,7 +58,7 @@ retry_after_s = 2 # what a 409 asks a player to wait [summary] # out_path = "sessions.jsonl" # session records, one JSON line each; absent: kept in memory only -# link_out_path = "links.hex" # contribution link records (WCL1), one hexadecimal line each +# link_out_path = "links.hex" # contribution link records (WLK1), one hexadecimal line each [rtmp] # Enhanced RTMP ingest (live-ingest §12); off unless a listener is set. diff --git a/joule-code/joule-code-rs/crates/joule-moq-ingest/src/bin/link_vectors.rs b/joule-code/joule-code-rs/crates/joule-moq-ingest/src/bin/link_vectors.rs index 0901a6843..dc100f5e9 100644 --- a/joule-code/joule-code-rs/crates/joule-moq-ingest/src/bin/link_vectors.rs +++ b/joule-code/joule-code-rs/crates/joule-moq-ingest/src/bin/link_vectors.rs @@ -1,5 +1,5 @@ //! `joule-moq-ingest-link-vectors`: the conformance corpus of the contribution link record, -//! `WCL1` (WAI `extensions/live-contribution.md` §6), written from fixed seeds, so the +//! `WLK1` (WAI `extensions/live-contribution.md` §6), written from fixed seeds, so the //! same bytes every run. //! //! ```text @@ -7,7 +7,7 @@ //! joule-moq-ingest-link-vectors --check regenerate and compare //! ``` //! -//! Each vector is a part (one `.wcl1` file) or a series (several, in order), with the +//! Each vector is a part (one `.wlk1` file) or a series (several, in order), with the //! outcome §6.5 and §6.6 give it: accepted, or refused with its reason (and, in a series, //! the index of the part refused). Each refused vector breaks one rule and keeps every //! other: where a rule after the signature is broken, the record is signed again. @@ -111,7 +111,7 @@ struct Out { impl Out { fn part(&mut self, name: &str, bytes: Vec, outcome: Result<(), Reason>, note: &str) { - let file = format!("{name}.wcl1"); + let file = format!("{name}.wlk1"); let mut v = json!({"name": name, "kind": "part", "files": [file], "note": note}); match outcome { Ok(()) => { @@ -132,7 +132,7 @@ impl Out { } fn series(&mut self, name: &str, parts: Vec>, outcome: Result<(), (usize, Reason)>, note: &str) { - let files: Vec = (0..parts.len()).map(|i| format!("{name}.{i}.wcl1")).collect(); + let files: Vec = (0..parts.len()).map(|i| format!("{name}.{i}.wlk1")).collect(); let mut v = json!({"name": name, "kind": "series", "files": files, "note": note}); let got = linkrec::verify_series(&parts); match outcome { @@ -204,7 +204,10 @@ fn corpus() -> Out { o.part("truncated", good[..good.len() - 1].to_vec(), Err(Reason::Truncated), "the signature's last byte missing"); let mut b = good.clone(); b[0] = b'X'; - o.part("bad_magic", b, Err(Reason::Malformed), "not WCL1"); + o.part("bad_magic", b, Err(Reason::Malformed), "not WLK1"); + let mut b = good.clone(); + b[..4].copy_from_slice(b"WCL1"); + o.part("clip_record_magic", b, Err(Reason::Malformed), "the clip record's magic, WCL1 (live-recording §5.1)"); let mut b = good.clone(); b.push(0); o.part("trailing_byte", b, Err(Reason::Malformed), "a byte after the signature"); @@ -440,7 +443,7 @@ fn main() -> ExitCode { if let Ok(rd) = std::fs::read_dir(&dir) { for e in rd.flatten() { let n = e.file_name().to_string_lossy().into_owned(); - if (n.ends_with(".wcl1") || n == "vectors.json") && !files.contains_key(&n) { + if (n.ends_with(".wlk1") || n == "vectors.json") && !files.contains_key(&n) { eprintln!("not generated: {n}"); bad += 1; } diff --git a/joule-code/joule-code-rs/crates/joule-moq-ingest/src/config.rs b/joule-code/joule-code-rs/crates/joule-moq-ingest/src/config.rs index 26a0aaf62..d029920db 100644 --- a/joule-code/joule-code-rs/crates/joule-moq-ingest/src/config.rs +++ b/joule-code/joule-code-rs/crates/joule-moq-ingest/src/config.rs @@ -544,7 +544,7 @@ pub struct SummaryConfig { /// Each session's record is appended here as one JSON line, when set. #[serde(default)] pub out_path: Option, - /// Each contribution link record part (`WCL1`) is appended here, as one line of + /// Each contribution link record part (`WLK1`) is appended here, as one line of /// hexadecimal, when set. #[serde(default)] pub link_out_path: Option, diff --git a/joule-code/joule-code-rs/crates/joule-moq-ingest/src/contrib.rs b/joule-code/joule-code-rs/crates/joule-moq-ingest/src/contrib.rs index 7a9da3962..c901dc30a 100644 --- a/joule-code/joule-code-rs/crates/joule-moq-ingest/src/contrib.rs +++ b/joule-code/joule-code-rs/crates/joule-moq-ingest/src/contrib.rs @@ -15,7 +15,7 @@ //! (live-ingest §7) and its arrival from the link as its arrival: the same objects, //! groups, catalog and receipts as a WHIP session's (live-ingest §4 to §8). //! - **The link record.** Every `record_interval_ms`, and when the session ends, the gateway -//! signs a part of the link's `WCL1` record ([`crate::linkrec`]) and publishes it on the +//! signs a part of the link's `WLK1` record ([`crate::linkrec`]) and publishes it on the //! owner's `link` track with its receipts: every sequence number delivered, recovered, //! dropped or outstanding, the requests and the round trips, and the head of every media //! track's receipt chain at the part's end. diff --git a/joule-code/joule-code-rs/crates/joule-moq-ingest/src/gateway.rs b/joule-code/joule-code-rs/crates/joule-moq-ingest/src/gateway.rs index 44fe308ee..e2e3047c2 100644 --- a/joule-code/joule-code-rs/crates/joule-moq-ingest/src/gateway.rs +++ b/joule-code/joule-code-rs/crates/joule-moq-ingest/src/gateway.rs @@ -422,7 +422,7 @@ impl Gateway { self.rtmp.lock().unwrap().iter().map(|(k, h)| (k.clone(), h.frames.load(Ordering::Relaxed))).collect() } - /// Every contribution link record part (`WCL1`) signed so far. + /// Every contribution link record part (`WLK1`) signed so far. pub fn link_records(&self) -> Vec> { self.contrib.records.lock().unwrap().clone() } diff --git a/joule-code/joule-code-rs/crates/joule-moq-ingest/src/lib.rs b/joule-code/joule-code-rs/crates/joule-moq-ingest/src/lib.rs index 23c89fd52..102bb8632 100644 --- a/joule-code/joule-code-rs/crates/joule-moq-ingest/src/lib.rs +++ b/joule-code/joule-code-rs/crates/joule-moq-ingest/src/lib.rs @@ -25,7 +25,7 @@ //! - **SRT and RIST** ([`contrib`]): contribution over UDP with retransmission, from //! `joule-contrib`, into the same tracks: a one-time session from `/srt` or `/rist` //! under the room grant, the transport stream demultiplexed, H.264, HEVC and AAC -//! carried; and the link's own record, `WCL1` ([`linkrec`]), signed part by part on the +//! carried; and the link's own record, `WLK1` ([`linkrec`]), signed part by part on the //! owner's `link` track. //! //! The WebRTC stack is `str0m` (sans-IO, MIT OR Apache-2.0) with its pure-Rust crypto diff --git a/joule-code/joule-code-rs/crates/joule-moq-ingest/src/linkrec.rs b/joule-code/joule-code-rs/crates/joule-moq-ingest/src/linkrec.rs index c8e56fd9b..e5dbb2987 100644 --- a/joule-code/joule-code-rs/crates/joule-moq-ingest/src/linkrec.rs +++ b/joule-code/joule-code-rs/crates/joule-moq-ingest/src/linkrec.rs @@ -1,4 +1,4 @@ -//! The contribution link record, `WCL1` (WAI `extensions/live-contribution.md` §6): what a +//! The contribution link record, `WLK1` (WAI `extensions/live-contribution.md` §6): what a //! contribution link over SRT or RIST carried, lost, recovered and dropped, and how long it //! took, signed by the gateway that received it, part by part, each part chained to the one //! before and naming the head of every media track's receipt chain at its end. @@ -11,7 +11,7 @@ use crate::room::{sha256, verify_strict, Reason as RoomReason}; use ed25519_dalek::{Signer, SigningKey}; use joule_contrib::stats::{Part, Run, Summary}; -pub const MAGIC: &[u8; 4] = b"WCL1"; +pub const MAGIC: &[u8; 4] = b"WLK1"; pub const VERSION: u8 = 1; pub const DOMAIN: &[u8] = b"wai:contrib-link\x01"; pub const MAX_TRACKS: usize = 8; diff --git a/wai/CHANGELOG.md b/wai/CHANGELOG.md index e596ede3a..be82ac34c 100644 --- a/wai/CHANGELOG.md +++ b/wai/CHANGELOG.md @@ -6,6 +6,123 @@ wire format may change and such changes are recorded here. ## Unreleased +### The contribution link record has its own magic, `WLK1` + +- **Wire change.** The contribution link record ([extensions/live-contribution.md](extensions/live-contribution.md) + §6.2) begins `WLK1`, no longer `WCL1`. The clip record of live-recording §5.1 had `WCL1` first; the link record, + added later, took the same four bytes, so a reader that tells records apart by their magic could not tell a link + record from a clip record, and the registry listed `WCL1` for the clip record alone. `WCL1` stays the clip + record's. A link record written before this change is `malformed` to a reader of this revision (§6.5 step 2), as a + new one is to a reader of the earlier revision; the signature's domain, `wai:contrib-link` 0x01, and every other + field are unchanged. +- **The registry** lists `WLK1` as a magic of live-contribution §6.2 (REGISTRY.md and `codecs/registry.rs`). +- **The corpus** [`live-conformance/links/`](live-conformance/links/) is regenerated with the new magic, each vector + file now `.wlk1`, and gains `clip_record_magic`: a part that bears the clip record's magic, refused `malformed`. + `live_contribution_verify.py` reads `WLK1`, and requires that a copy of each accepted part given the clip record's + magic is refused. `joule-moq-ingest` writes and reads `WLK1` (`linkrec::MAGIC`). +- **Breaking:** the corpus's index names the new files, and the files under the old magic are gone: + `record:corpus:wai/live-conformance/links/vectors.json`, + `record:corpus:wai/live-conformance/links/altered_count.wcl1`, + `record:corpus:wai/live-conformance/links/bad_key.wcl1`, + `record:corpus:wai/live-conformance/links/bad_magic.wcl1`, + `record:corpus:wai/live-conformance/links/bad_signature.wcl1`, + `record:corpus:wai/live-conformance/links/bytes_without_delivery.wcl1`, + `record:corpus:wai/live-conformance/links/count_mismatch.wcl1`, + `record:corpus:wai/live-conformance/links/empty_span.wcl1`, + `record:corpus:wai/live-conformance/links/first_part_with_parent.wcl1`, + `record:corpus:wai/live-conformance/links/first_try_over_delivered.wcl1`, + `record:corpus:wai/live-conformance/links/last_byte_two.wcl1`, + `record:corpus:wai/live-conformance/links/last_without_reason.wcl1`, + `record:corpus:wai/live-conformance/links/later_part_without_parent.wcl1`, + `record:corpus:wai/live-conformance/links/margin_past_window.wcl1`, + `record:corpus:wai/live-conformance/links/margin_without_recovery.wcl1`, + `record:corpus:wai/live-conformance/links/mode_unknown.wcl1`, + `record:corpus:wai/live-conformance/links/no_window.wcl1`, + `record:corpus:wai/live-conformance/links/outstanding_not_last.wcl1`, + `record:corpus:wai/live-conformance/links/protocol_unknown.wcl1`, + `record:corpus:wai/live-conformance/links/reason_unknown.wcl1`, + `record:corpus:wai/live-conformance/links/reason_without_last.wcl1`, + `record:corpus:wai/live-conformance/links/recovery_disordered.wcl1`, + `record:corpus:wai/live-conformance/links/recovery_empty_with_figures.wcl1`, + `record:corpus:wai/live-conformance/links/recovery_samples.wcl1`, + `record:corpus:wai/live-conformance/links/requested_below_requests.wcl1`, + `record:corpus:wai/live-conformance/links/rist_main_aes192.wcl1`, + `record:corpus:wai/live-conformance/links/rist_main_psk256.wcl1`, + `record:corpus:wai/live-conformance/links/rist_simple.wcl1`, + `record:corpus:wai/live-conformance/links/rist_simple_encrypted.wcl1`, + `record:corpus:wai/live-conformance/links/rtt_disordered.wcl1`, + `record:corpus:wai/live-conformance/links/rtt_empty_with_figures.wcl1`, + `record:corpus:wai/live-conformance/links/run_empty.wcl1`, + `record:corpus:wai/live-conformance/links/run_outside.wcl1`, + `record:corpus:wai/live-conformance/links/run_overfull.wcl1`, + `record:corpus:wai/live-conformance/links/run_overfull_alone.wcl1`, + `record:corpus:wai/live-conformance/links/runs_overlap.wcl1`, + `record:corpus:wai/live-conformance/links/runs_past_bound.wcl1`, + `record:corpus:wai/live-conformance/links/runs_short.wcl1`, + `record:corpus:wai/live-conformance/links/runs_truncated.wcl1`, + `record:corpus:wai/live-conformance/links/series_head_moved_without_groups.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_head_moved_without_groups.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_cipher.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_cipher.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_grant.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_grant.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_hop.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_hop.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_mode.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_mode.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_principal.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_principal.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_protocol.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_protocol.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_room.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_room.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_session.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_session.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_window.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_other_window.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_part_after_last.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_part_after_last.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_sequence_gap.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_sequence_gap.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_skips_a_part.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_skips_a_part.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_skips_a_part.2.wcl1`, + `record:corpus:wai/live-conformance/links/series_starts_late.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_starts_late.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_three_parts.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_three_parts.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_three_parts.2.wcl1`, + `record:corpus:wai/live-conformance/links/series_time_gap.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_time_gap.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_track_added.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_track_added.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_track_added.2.wcl1`, + `record:corpus:wai/live-conformance/links/series_track_alias_changed.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_track_alias_changed.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_track_dropped.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_track_dropped.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_wrong_parent.0.wcl1`, + `record:corpus:wai/live-conformance/links/series_wrong_parent.1.wcl1`, + `record:corpus:wai/live-conformance/links/series_wrong_parent.2.wcl1`, + `record:corpus:wai/live-conformance/links/small_order_r.wcl1`, + `record:corpus:wai/live-conformance/links/srt_caller_aes192.wcl1`, + `record:corpus:wai/live-conformance/links/srt_cipher_100.wcl1`, + `record:corpus:wai/live-conformance/links/srt_last_outstanding.wcl1`, + `record:corpus:wai/live-conformance/links/srt_listener_clean.wcl1`, + `record:corpus:wai/live-conformance/links/srt_recovered.wcl1`, + `record:corpus:wai/live-conformance/links/too_large.wcl1`, + `record:corpus:wai/live-conformance/links/track_head_without_groups.wcl1`, + `record:corpus:wai/live-conformance/links/track_zero_digest.wcl1`, + `record:corpus:wai/live-conformance/links/tracks_not_begun.wcl1`, + `record:corpus:wai/live-conformance/links/tracks_past_bound.wcl1`, + `record:corpus:wai/live-conformance/links/tracks_unsorted.wcl1`, + `record:corpus:wai/live-conformance/links/trailing_byte.wcl1`, + `record:corpus:wai/live-conformance/links/truncated.wcl1`, + `record:corpus:wai/live-conformance/links/truncated_byte_two.wcl1`, + `record:corpus:wai/live-conformance/links/truncated_not_full.wcl1`, + `record:corpus:wai/live-conformance/links/two_dropped.wcl1`, + `record:corpus:wai/live-conformance/links/unknown_version.wcl1`. + ### Tariff version 6: a job priced per endpoint, a third party's usage billed, and an upscale and a tone mapping billed by what re-derives them - **Tariff and invoice version 6** ([extensions/receipt-ledger.md](extensions/receipt-ledger.md) §4.9). A job price names diff --git a/wai/REGISTRY.md b/wai/REGISTRY.md index 6114c9a1d..027ed1477 100644 --- a/wai/REGISTRY.md +++ b/wai/REGISTRY.md @@ -407,6 +407,7 @@ and a role are fixed once registered. | `WKL1` | magic | defined | key-release §4.1 | | `WKT1` | magic | defined | key-release §9.3 | | `WLI1` | magic | defined | receipt-ledger §6.1 | +| `WLK1` | magic | defined | live-contribution §6.2 | | `WLT1` | magic | defined | receipt-ledger §4.1 | | `WLU1` | magic | defined | channel-lineup §6.1 | | `WMA1` | magic | defined | live-messaging §8 | diff --git a/wai/SPEC.md b/wai/SPEC.md index 384c34f26..4cd1d1ef6 100644 --- a/wai/SPEC.md +++ b/wai/SPEC.md @@ -1098,7 +1098,7 @@ And for **contribution over UDP with retransmission** — `wai.live.contribution Profile, VSF TR-06-2:2024 Main Profile), each admitted by a one-time session a publisher obtains under its room grant, its MPEG transport stream demultiplexed into the room's tracks as one envelope an access unit with first-hop receipts. The gateway signs the **link -record**, `WCL1`, part by part: every sequence number delivered at the first try, +record**, `WLK1`, part by part: every sequence number delivered at the first try, recovered within the receive window, dropped, or outstanding when the link ended, the retransmission requests, the round trips and the recovery times, each part chained to the one before and naming the head of every media track's receipt chain; a verifier recomputes diff --git a/wai/extensions/live-contribution.md b/wai/extensions/live-contribution.md index a8ea00439..9c0e48295 100644 --- a/wai/extensions/live-contribution.md +++ b/wai/extensions/live-contribution.md @@ -7,7 +7,7 @@ > session under its room grant; its encoder sends an MPEG transport stream over the > transport; the gateway demultiplexes it and carries each access unit as one envelope on > the room's tracks with first-hop receipts, as it carries a WHIP publisher's frames. -> Registers the record `wai.live.contribution`: the **contribution link record**, `WCL1`, +> Registers the record `wai.live.contribution`: the **contribution link record**, `WLK1`, > which the gateway signs part by part while the link runs: what became of every sequence > number (delivered at the first try, recovered within the receive window, dropped when its > time passed, or outstanding when the link ended), the retransmission requests and the @@ -339,7 +339,7 @@ measured before the first sequence number fall into the first part. | field | size | meaning | |---|---|---| -| `magic` | 4 | `WCL1` (ASCII) | +| `magic` | 4 | `WLK1` (ASCII) | | `version` | 1 | 1 | | `room` | 32 | the room id | | `hop` | 32 | the gateway's key, which signs the record and the tracks' receipts | @@ -416,8 +416,9 @@ fails, with its reason: 1. The record is at most 11 295 bytes (§6.7): otherwise `record_too_large`. 2. It reads, field by field in §6.2's order, to exactly its last byte, with `tracks` at most 8 and runs at most 512: `truncated` when it ends early; `unknown_version` for a version - other than 1; `malformed` for another magic, a byte after `sig`, a count past its bound, - or a `last` or `truncated` other than 0 and 1. + other than 1; `malformed` for another magic (live-recording §5.1's clip record, `WCL1`, + among them), a byte after `sig`, a count past its bound, or a `last` or `truncated` other + than 0 and 1. 3. The signature verifies under `hop`, strictly, as SPEC §7 *Signatures* requires: a key that fails that rule's steps 1 or 2 is `bad_key`, a signature that fails a later step `bad_signature`. diff --git a/wai/live-conformance/links/README.md b/wai/live-conformance/links/README.md index 5016c8c79..db7149bc2 100644 --- a/wai/live-conformance/links/README.md +++ b/wai/live-conformance/links/README.md @@ -1,4 +1,4 @@ -# links — the contribution link record, `WCL1` +# links — the contribution link record, `WLK1` The corpus of [live-contribution](../../extensions/live-contribution.md) §6: parts of the link record a gateway signs while it receives an SRT or RIST link, and series of them. @@ -8,7 +8,7 @@ link record a gateway signs while it receives an SRT or RIST link, and series of the index of the part refused), for an accepted part its `digest` and a `summary` of its fields, and a `note` on what it shows. `hop` is the signing key, `hop_seed` the seed it is made from, so anyone can sign a new vector the same way. -- Each `.wcl1` file is one record's bytes. +- Each `.wlk1` file is one record's bytes. Accepted vectors cover each protocol and mode, each key length, a session's last part with sequence numbers outstanding, a part whose loss runs are truncated, tracks not yet begun, diff --git a/wai/live-conformance/links/altered_count.wcl1 b/wai/live-conformance/links/altered_count.wlk1 similarity index 78% rename from wai/live-conformance/links/altered_count.wcl1 rename to wai/live-conformance/links/altered_count.wlk1 index bba77879c2427cc84ec63af0db46807a7b00fa73..717da0bee5ef0a4e7875923207bead9d41f0971e 100644 GIT binary patch delta 77 zcmV-T0J8s&1&;*-S4>N>155%yb;rC_9vBcU0yRR#nhg882a9TiEAU4PuiggOycg)I jIc2;m=at3dXwt2_{n|o_8j;F}rSwjZEpyq5L;(U@}9f j&VUu`=+N>155%yI8ZLocQ%AqVQkD$V2F<0Io7cIJD>wfe&5>JeknHo jA*>+AZngULpL!W=mq0-6IzShwL&xmL=&O6CkFGcg`Q#)5 delta 77 zcmV-T0J8s&1&;*-S3^v(155%y&)#}eFZcj>e9(|0Vo*4VKDTsH%4WN<40uqsB0NI! jiHLzL{gl?lQMi)qEkt2}8ERz7oHaLhHS3z-0eBS&;H)8Z diff --git a/wai/live-conformance/links/series_head_moved_without_groups.0.wcl1 b/wai/live-conformance/links/bad_magic.wlk1 similarity index 78% rename from wai/live-conformance/links/series_head_moved_without_groups.0.wcl1 rename to wai/live-conformance/links/bad_magic.wlk1 index f231adf014e671f8d36586dc4375389c2394b272..0143a23706252836551fbdbe59e05557c61ad017 100644 GIT binary patch delta 77 zcmV-T0J8s&1&;*-SWHW?155%yb;rC_9vBcU0yRR#nhg882a9TiEAU4PuiggOycg)I jIc2;m=at3dXwt2_{n|o_8j;F}rSwjZEpyq5L;(U@}9f j&VUu`=+N>155%yb;rC_9vBcU0yRR#nhg882a9TiEAU4PuiggOycg)I jIc2;m=at3dXwt2_{n|o_8j;F}rSwjZEpyq5L;(U@}9f j&VUu`=+N>0}uj0bCLn>l&}H=of`Xrt$(z?u0UI$l?D>IJfd|AG4i68 jDp~xbT!WIgq4e&)Y30C1SZ=c=+pw)U7bh6^#YGbX4#FcD delta 77 zcmV-T0J8tn1k(fqS3^v(0}uj02al=Z5ZsYrATBM8bxzZmAZH!3xdP}V2;PxVW=QPH1693oo006UyCKCVv diff --git a/wai/live-conformance/links/count_mismatch.wcl1 b/wai/live-conformance/links/count_mismatch.wlk1 similarity index 78% rename from wai/live-conformance/links/count_mismatch.wcl1 rename to wai/live-conformance/links/count_mismatch.wlk1 index 4f80d200d55eff937a01d3509c71c92ad5a31cf3..3df999647fe681c6f6b43541b48933eb2e007f3c 100644 GIT binary patch delta 77 zcmV-T0J8s&1&;*-S4>N>155%y{UTqOUR=i@6#-@GAY=VCYPxv7KWOft2-lz3n77q( juIKaVFzfH@Nho=X!3ufQm*vEutY1|GoyvN0qJ6duIou`^ delta 77 zcmV-T0J8s&1&;*-S3^v(155%ymUP!yh_4V^-;Jx<+RH0LQXcpXkeDI#Br+9?c68R~ jMoJin)GIHBD7$t^`}h0)fO6yAzN6OMw!AbsR6DN%8we!W diff --git a/wai/live-conformance/links/empty_span.wcl1 b/wai/live-conformance/links/empty_span.wlk1 similarity index 78% rename from wai/live-conformance/links/empty_span.wcl1 rename to wai/live-conformance/links/empty_span.wlk1 index 364a8569a2da6b8ad9775ebf62293e17cca106ff..833f729f9eb3e9fa24a0ab484054f6b8a3fcf589 100644 GIT binary patch delta 77 zcmV-T0J8s&1&;*-S4>N>155%yfAHwPEoLI@cYJhZ^^}02VyxE{UL joD73XU$jEaKc9Dxf31ZX+nPiHFcf$vLn+Qko!l1;55OTW delta 77 zcmV-T0J8s&1&;*-S3^v(155%ypB%zuRMoT+ALa4@tKzrng-;?_1((>!r*ff6CRCS* jTU`4I%_3vvaZBcsvzd=446y}VJm9~!CM)&Q@#a7V1IQzL diff --git a/wai/live-conformance/links/first_part_with_parent.wcl1 b/wai/live-conformance/links/first_part_with_parent.wlk1 similarity index 78% rename from wai/live-conformance/links/first_part_with_parent.wcl1 rename to wai/live-conformance/links/first_part_with_parent.wlk1 index f75bbc453d9cce3f39567821c7b5f79f7034b0a3..7514b8a25167e0d16bff03a6526b63b0e03ea564 100644 GIT binary patch delta 77 zcmV-T0J8s&1&;*-S4>N>155%ygs`Gl(is{7;A@1uG}P~0ggAA#(Qm=2J-ohLpg}>; jOc7lC_VMZBb*?w j<5BP?M1^lX88$_NF8&>B^N>155%yW~+qkg+HH_9~#LMKk8a>hQ27=N%T^$w delta 77 zcmV-T0J8s&1&;*-S3^v(155%y`l#!eCuU1D*QcSuDBh(5CcMkVgIjmG99vNj*C5!O j9yi&)k4mS34_&gxfwuAcE`RxD@)~K$&qtg-_d9$AHhLts diff --git a/wai/live-conformance/links/last_byte_two.wcl1 b/wai/live-conformance/links/last_byte_two.wlk1 similarity index 78% rename from wai/live-conformance/links/last_byte_two.wcl1 rename to wai/live-conformance/links/last_byte_two.wlk1 index 3b26a6fa3e0e01009c43cc1f83bc61109f44b015..06c253f98fb29f43f7c257b37a27e74fc404a0d8 100644 GIT binary patch delta 77 zcmV-T0J8s&1&;*-S4>N>155%yb;rC_9vBcU0yRR#nhg882a9TiEAU4PuiggOycg)I jIc2;m=at3dXwt2_{n|o_8j;F}rSwjZEpyq5L;(U@}9f j&VUu`=+N>155%yKUcUi`|4dgr5EGc;qUmx+AfqjaarPJo$;p+B7=bm jakObO$`V!!`&OkOtYW0TU}PMb4Lz*kwmDyE=V)UJHgY2X delta 77 zcmV-T0J8s&1&;*-S3^v(155%yAD&nRWwAz_aJXG51@}|wA6grb#%0t|611vPBKnMF jeK+bIZ9SNS+!1_~+>`baMxn{ACcD7-zr^k#6w*WiqFf?3 diff --git a/wai/live-conformance/links/later_part_without_parent.wcl1 b/wai/live-conformance/links/later_part_without_parent.wlk1 similarity index 78% rename from wai/live-conformance/links/later_part_without_parent.wcl1 rename to wai/live-conformance/links/later_part_without_parent.wlk1 index a5798267ae39336126e2072c36b80102ad8fcc8e..2d36420ddbff6e8738c7f4f00313440ec93a435a 100644 GIT binary patch delta 77 zcmV-T0J8s&1&;*-S4>N>155%yTo6z4WGZu_zAB|6BGAha&U6Sl=5gIN>155%yk$H)wljLPmzscyJf9uQm&?`Q2Qk@D&fTojV{*gLR jp--Zazb>4{!02=*en5B}1iRrJS=e_qb{sqHy04fGX&@ws delta 77 zcmV-T0J8s&1&;*-S3^v(155%ybM939C@6zIi;e8np)c2}B(n}Sd!~FZb3V`;Nd$Ys j{i^=E=yGxmTzk1#evWfta;*>6YW5lPv~`i4oo_S?2Dc+% diff --git a/wai/live-conformance/links/margin_without_recovery.wcl1 b/wai/live-conformance/links/margin_without_recovery.wlk1 similarity index 77% rename from wai/live-conformance/links/margin_without_recovery.wcl1 rename to wai/live-conformance/links/margin_without_recovery.wlk1 index b3c4430b50ba1af72d7fde7d9ec57294fb9ab446..41a0f7071d4e74acfc479caefa17603bc81b63d0 100644 GIT binary patch delta 77 zcmV-T0J8tT1iu6WS4>N>1N;F%E?Bq9#bU{gb4t>PpXv2#q)J18r juEL65RN8=2b@&mKm3rk!O3KC{bRt5hoWG2>y{}jVa{eVG delta 77 zcmV-T0J8tT1iu6WS3^v(1N;F%CI%uET5y6`m)s_CpPd9XKUCnICLiZqGO_t1fTi$c jVkF&kYxdD%5Z8pBce%vvyjNaE_ZayDuka#9 diff --git a/wai/live-conformance/links/mode_unknown.wcl1 b/wai/live-conformance/links/mode_unknown.wlk1 similarity index 78% rename from wai/live-conformance/links/mode_unknown.wcl1 rename to wai/live-conformance/links/mode_unknown.wlk1 index 4d4c70619403a661bedb4871044a622919d94878..45dc1e6af83ed75b6b589da5883b100594c9182f 100644 GIT binary patch delta 77 zcmV-T0J8s&1&;*-S4>N>155%y=c@DEmL?yJWA|s8$>A7`J5^<}tDB3!YL)-B1y?r6 jC|w;Wtdev>B;`qj1Yy`(bSjFY6`Q diff --git a/wai/live-conformance/links/no_window.wcl1 b/wai/live-conformance/links/no_window.wlk1 similarity index 78% rename from wai/live-conformance/links/no_window.wcl1 rename to wai/live-conformance/links/no_window.wlk1 index 3656686ff39ad5a6f003a1d21034b6f47ed4d0d5..bf762f0122e9ec1d34b8b2c5d25243164835dd33 100644 GIT binary patch delta 77 zcmV-T0J8s&1&;*-S4>N>155%ym}9&7{wHviu9~b_^Ivyq$J+oKRt$kmr&XCT2k_k( jG{)-)&~fz-yX&yx+U^Czl4~RJuosz`6w1aeBKu?vLER*@ delta 77 zcmV-T0J8s&1&;*-S3^v(155%yYnU$IK@J+UA!{i6t(S;7AZdPZYHjjXz;kK2OzPlS jh>NYaVm(EN>155%ySqcel+*;x-6tZkcgW|^u5A&~9+t}*$tuDC=ayua! delta 77 zcmV-T0J8s&1&;*-S3^v(155%yNG>8u70pJryURsWLqsZJ`Z>dCU?IACo9t!3aV4iB jfL%r7$wy#+rPo&;qUc~DKqMs6JiU>|K`(z6^G>=3gv%fT diff --git a/wai/live-conformance/links/protocol_unknown.wcl1 b/wai/live-conformance/links/protocol_unknown.wlk1 similarity index 78% rename from wai/live-conformance/links/protocol_unknown.wcl1 rename to wai/live-conformance/links/protocol_unknown.wlk1 index b80cbcbd3858478e9b9d49b37d650efea421f0d4..c8d769546e8c274043eed295e74b896a2704ce40 100644 GIT binary patch delta 77 zcmV-T0J8s&1&;*-S4>N>155%yLXFSwmG2ND8zVbBXlGxS)lQ_@wEc&0#*K%uFCHDg ja>cV3M7YQUH?#lNrSe<`_VM|*^#QwoUsS*H(F=0{76l~` delta 77 zcmV-T0J8s&1&;*-S3^v(155%ycz=6ZPxgPC@h$!>XHR{c>L=+_PbRt?vN>155%yxvmh5JPv8iCtC}HzVX`WmWg7jaN>155%y%=352JSIibTjkkd^_V5{-*qWgY-W(nF*Jt!bRrQB js)Gp816!lU;N)&wzp#n`uF$VT#&r13Zt}qf)r39)XXn~mrPOz9=i diff --git a/wai/live-conformance/links/recovery_disordered.wcl1 b/wai/live-conformance/links/recovery_disordered.wlk1 similarity index 78% rename from wai/live-conformance/links/recovery_disordered.wcl1 rename to wai/live-conformance/links/recovery_disordered.wlk1 index 30eec519d7858346564a1bbf198d5ce8cc51b42c..2769fe9681466773dba2829dc542749442f5e105 100644 GIT binary patch delta 77 zcmV-T0J8s&1&;*-S4>N>155%yjvxSSF}h_X?FS}%M^}S8DiWz0W`JzfDb5*SA>;~5 jcjA)zS>D?~Ktcx*-{oyi>A#PFsMloFehu5HXMzF^Ji8x} delta 77 zcmV-T0J8s&1&;*-S3^v(155%ydCt-BqET7}e}DquntkK{HFjCCge diff --git a/wai/live-conformance/links/recovery_empty_with_figures.wcl1 b/wai/live-conformance/links/recovery_empty_with_figures.wlk1 similarity index 75% rename from wai/live-conformance/links/recovery_empty_with_figures.wcl1 rename to wai/live-conformance/links/recovery_empty_with_figures.wlk1 index 4256c0e29fc2b05b6b5febe6e186e507c9c1a3dc..b56371eeceb0ef5e8d5b0e3f3d3b538c6c234acb 100644 GIT binary patch delta 77 zcmV-T0J8tn1k(fqS4>N>0}uj0Z2TOlm0+k^SdO>}ULB?0zQ_nVic2L#Rp-j{Q1MQ`~e*M7%aKj^Nq{ j+b`!Y`^)cC6UVlX(Rul-*qZ_j+caly^v`}jBd0+Ic0nbs diff --git a/wai/live-conformance/links/recovery_samples.wcl1 b/wai/live-conformance/links/recovery_samples.wlk1 similarity index 78% rename from wai/live-conformance/links/recovery_samples.wcl1 rename to wai/live-conformance/links/recovery_samples.wlk1 index 980427e124f6305615570afffa385d31f81be3d7..d3dcce889a6051a0699143c1ff834bbfe9e6e6d6 100644 GIT binary patch delta 77 zcmV-T0J8s&1&;*-S4>N>155%yZ9v`Ee&^49#hzkn04m-*cBJH2%Cg9XJCf5W&^(!! jS};%e0dx&n@yokF*ql+V4{^6(L(%Lb7{e5KzjyWvLZ2iu delta 77 zcmV-T0J8s&1&;*-S3^v(155%y(#4mM^=wQjBar9S+bum7(F#^9YaFno7%ded%c?XK j%0o!$eorhh64i7{qRR~3g>6Vn@^m&4B;AU=2$_BioJb!l diff --git a/wai/live-conformance/links/requested_below_requests.wcl1 b/wai/live-conformance/links/requested_below_requests.wlk1 similarity index 78% rename from wai/live-conformance/links/requested_below_requests.wcl1 rename to wai/live-conformance/links/requested_below_requests.wlk1 index f23851dd9e9d198f146a77a2904062f5a49c2c26..8b7e0d452a916ba2b17bb19374c0319859a6e61f 100644 GIT binary patch delta 77 zcmV-T0J8s&1&;*-S4>N>155%y!_qvSTe`aStkuIi=7ealGSJ)4mH=&Zo=x4p!>XyT jVn~fq$#&MPPkbkCZhfwWvW$^I-Y|#QrDxD%W4g}@wJ;}l delta 77 zcmV-T0J8s&1&;*-S3^v(155%y+n{l-#5oAr#jDs}QBwt5&=sgNXwW`%qN>155%y;+>!h!7vo78PBY&npNjNyuJ-FF6-)3r#4wC_t*@h jPppH&M)5)5tI^}bG(XB%srQfo(jqDK;UKXn#wM%+ELkLb delta 77 zcmV-T0J8s&1&;*-S3^v(155%yeJ;6Js%|htu*jAoXUdr_e j&Rha~excGLN>10(`K1=5~?UJuy5JSdbw7N&vqa!#FLae(Kj7fJk!!Iws< jW%&5zR^=?({7N>10(`KW#U~`J6HhB7Gs|r7}&Zb-a;v~9)!_;$)qRG0uGi1 jW|>92;h)6(_6;?o(o8O*E{x3)m5-81AwFo{ZK<3LzJnn< delta 77 zcmV-T0J8t*1m^?;S3^v(10(`Krk}VMeW|DldkFIP*GTxyvw|jMST&_F)y?eqx;|4W jtt(5TX#J#l3O^!AH%p|dz2`I%*ZzB;iioPhG*mDSS*Ro& diff --git a/wai/live-conformance/links/rist_simple_encrypted.wcl1 b/wai/live-conformance/links/rist_simple_encrypted.wlk1 similarity index 78% rename from wai/live-conformance/links/rist_simple_encrypted.wcl1 rename to wai/live-conformance/links/rist_simple_encrypted.wlk1 index 3d3a3289253f4edd812068da70dd30aa966cd613..2b95c9fe6596eb3e977e1bde55c5a66bedf89044 100644 GIT binary patch delta 77 zcmV-T0J8s&1&;*-S4>N>155%yDzULaY|zKW*xFp5q%5e1=aDm;A3_J@>C+; delta 77 zcmV-T0J8s&1&;*-S3^v(155%yxi>2R78a;#Z6;M%X5}9a diff --git a/wai/live-conformance/links/rtt_disordered.wcl1 b/wai/live-conformance/links/rtt_disordered.wlk1 similarity index 78% rename from wai/live-conformance/links/rtt_disordered.wcl1 rename to wai/live-conformance/links/rtt_disordered.wlk1 index 9816c1c78e5f2432fa84da3e0003e429dcb49704..645314a140fb8645657b97b6613399834c9689cf 100644 GIT binary patch delta 77 zcmV-T0J8s&1&;*-S4>N>155%yhMj69=zCv@b4|#6RcDRuLBs5Jk^ouhp9y&21~E{5 jmpoUrDJJ#8j%oaNSS8YSr06DLEuUVRkjawLIPv@q^l>Aq delta 77 zcmV-T0J8s&1&;*-S3^v(155%y8PH^qc{6{~kZI+YPJU(1#~-m;@$rK|m~%hj9p!G{ jf9MU+Ov5ZmZLx=s9&A|P7RmnBkJ{Hbpw#O>TCHOVLQW;D diff --git a/wai/live-conformance/links/rtt_empty_with_figures.wcl1 b/wai/live-conformance/links/rtt_empty_with_figures.wlk1 similarity index 78% rename from wai/live-conformance/links/rtt_empty_with_figures.wcl1 rename to wai/live-conformance/links/rtt_empty_with_figures.wlk1 index 9dac2dce5b35f68c90eff1eca5273ef257a09f6b..ca36ac99a25281adc7dfc0f492fbf684fb8fbbe4 100644 GIT binary patch delta 77 zcmV-T0J8s&1&;*-S4>N>155%yB%je3n>P}Kvm>)q>ZKhoRRu}=S$OAWLHTj@W&a;A j>;WN@4zJ5 delta 77 zcmV-T0J8s&1&;*-S3^v(155%ypv)ni11Lp*9ChydZr1~LK5Dafv+jZ_ZmdTmD`-tQvz diff --git a/wai/live-conformance/links/run_empty.wcl1 b/wai/live-conformance/links/run_empty.wlk1 similarity index 85% rename from wai/live-conformance/links/run_empty.wcl1 rename to wai/live-conformance/links/run_empty.wlk1 index 9333a18698d526a5bcdcd99b471e5f2682fe40e7..6a507f930c6b52205785abe43896a73fc22ebe4c 100644 GIT binary patch delta 77 zcmV-T0J8t11)~K6S4>N>17HF`SdznHe(U0^yu0OFXSp7E61-Ds@9pzsAb jFEhdi!2M72zV?0UR!uhISCn0XeJJLhC^J`Tj7v%7h+ jIw!}VarSg*^ky{}2=!N$3HS2Tl+X6A!S+L7r3z>ce^w@g diff --git a/wai/live-conformance/links/bad_signature.wcl1 b/wai/live-conformance/links/run_outside.wlk1 similarity index 78% rename from wai/live-conformance/links/bad_signature.wcl1 rename to wai/live-conformance/links/run_outside.wlk1 index 22735df2b9a5a01d33c05705673d4ebbad830561..83392f20aadeabcee056010b8dd888e3da6807e4 100644 GIT binary patch delta 97 zcmeBY?Pp~U_wnAyY{3+g;Ka`W0?behVt1?!n>7F4?!XOw3)YJlG)^_ScI)qzs`%gE tjz43}_R&=E&tb@VSIi#Xq%7^W`qiT}hfmy+esc}iSpHtH-f5~FI{>?ZBXj@& delta 97 zcmeBY?Pp~UclO!HY{3)~>BP?f0?behVl(BN2#VL(gr9odd$M^?)g!~*d7ZsJFV8Og tW1gE}N>155%ym{g0*57YFJjV?W<3C~s?MfjdSmpmlZZX3+);aSd{ j*ISCe$o_}YCgjpgvM#IhhJ2JG)HB4cX~OwFoT3&9MK2}l delta 77 zcmV-T0J8s&1&;*-S3^v(155%yT^s2BTA+cNhm0(H+xd8vGD)K7BXG0O8Bk#zQ0#}t jzCnVig}7h7Qx7m$|6zBmDPwge- diff --git a/wai/live-conformance/links/run_overfull_alone.wcl1 b/wai/live-conformance/links/run_overfull_alone.wlk1 similarity index 78% rename from wai/live-conformance/links/run_overfull_alone.wcl1 rename to wai/live-conformance/links/run_overfull_alone.wlk1 index c8f7ea890b4e740a9639323700775723d32931b5..7ebd1b68068618ed9f37d46be04e606db8dcd47d 100644 GIT binary patch delta 77 zcmV-T0J8s&1&;*-S4>N>155%yxhXxu7Xt6<_7f0;i`YU5aynu>E-}WP(wN76{zt>C jWJCB3539)YjL4B7&*UZ)(Zew%fe=*_mz?JFa6 diff --git a/wai/live-conformance/links/runs_overlap.wcl1 b/wai/live-conformance/links/runs_overlap.wlk1 similarity index 78% rename from wai/live-conformance/links/runs_overlap.wcl1 rename to wai/live-conformance/links/runs_overlap.wlk1 index 3abbf8339fd312e9ba1b85180287a90192309a41..12839217f00897ffd7799f0b9d45847b7f86d046 100644 GIT binary patch delta 77 zcmV-T0J8s&1&;*-S4>N>155%yoNPQR;N>0}v`eRRM8Ex+TIEVrkv84K;doYmU}7`B$R)Yrb{VKArHi jC>8Ls%+K@gWXOEGTj)g}MKF4p9>pbi)h1u5_9=-9P@5#d delta 77 zcmV-T0J8tnRMS)gS3^v(0}v`eQt&BpLuBxC8B>)~?2K(e!N0b(f06|`J=6gFOdVh+ jOvbXJ(i)^4<-^rQ1ggtD&*0u?pF3Xh0|V`P;g`A(GfE^< diff --git a/wai/live-conformance/links/runs_short.wcl1 b/wai/live-conformance/links/runs_short.wlk1 similarity index 80% rename from wai/live-conformance/links/runs_short.wcl1 rename to wai/live-conformance/links/runs_short.wlk1 index 071a55894d42187b90a525f23ed030d81c36fdcb..2176263fcb3f96ffd534657c2681e87c511dfe71 100644 GIT binary patch delta 77 zcmV-T0J8u41p5R7S4>N>12_UeN7ixt1;T|uUvTB%FLZGA(e=2)Il+8Pp^$mO12>yg j892YO8SimwCol|>nNhPVfvDG?hRMU&IkoLJW|ZFnZ7L-^ delta 77 zcmV-T0J8u41p5R7S3^v(12_Ue7!HIbdIpZYRC6j>zQuEz6=Szq9@E(wrn7cKt`Yok jOqKCd_N3x}T@`0{SHLMS_|9G^cAu<2MjiqH^!;}R$sHjx diff --git a/wai/live-conformance/links/runs_truncated.wcl1 b/wai/live-conformance/links/runs_truncated.wlk1 similarity index 98% rename from wai/live-conformance/links/runs_truncated.wcl1 rename to wai/live-conformance/links/runs_truncated.wlk1 index d75edbde592d0abe64fecb8fa93da5fb99c19ec0..104e16f758c31bfe1cbd8d0f68965b706f7ca13c 100644 GIT binary patch delta 77 zcmV-T0J8tTRKHXMS4>N>1N1ye jGg76&7;BZrgaB*0Pf1Iv>>)HEV)hey?`VQm?7yD{F|Q*7 diff --git a/wai/live-conformance/links/series_head_moved_without_groups.0.wlk1 b/wai/live-conformance/links/series_head_moved_without_groups.0.wlk1 new file mode 100644 index 0000000000000000000000000000000000000000..529f559b9dad367f748977f57c1b9a422bb04c59 GIT binary patch literal 655 zcmWId@it@>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkZH$M=NFNeJjNnK~Vv#q)a?dv{ig_6K+F_4n9r>=A#l n$})A2*7K=HA7@-zyZi4gr%vgqw>48ch50`(aLuT$3t|QUXrIGw literal 0 HcmV?d00001 diff --git a/wai/live-conformance/links/series_head_moved_without_groups.1.wcl1 b/wai/live-conformance/links/series_head_moved_without_groups.1.wlk1 similarity index 64% rename from wai/live-conformance/links/series_head_moved_without_groups.1.wcl1 rename to wai/live-conformance/links/series_head_moved_without_groups.1.wlk1 index 55ad6195d7ac5506caec78775140a743773b1260..28ac72672398445781dd017a66c1c0d447923e30 100644 GIT binary patch delta 113 zcmV-%0FM9D1k(fqS4>Nh1C}7D@s?`sgsUM_#n7kSKOf(^z6gYUd@yHAIY&Gag7@FC zxmp20mnEsACP0>%bwBa(+rev&>ykd}*FWOHOgBw)c(_lEw%N%kG_-;bYn=?gmTu$R Tzt?1n>`RhJHiV!F&;Nd delta 113 zcmV-%0FM9D1k(fqS3^vZ1C}7`^DY6xtp-FMS3C}d24E}YD!n2haIl@kOWfF6uljzm zxmp20gvzh#-^LPq9}}@-((BN%>Dk3RviG`ThP(Rlr-rq|Z5zpLnS=!_a8s+v#Y~9F TO<{GRAOYJ5X~a7tWx2or(3>}2 diff --git a/wai/live-conformance/links/series_other_cipher.0.wcl1 b/wai/live-conformance/links/series_other_cipher.0.wcl1 deleted file mode 100644 index f231adf014e671f8d36586dc4375389c2394b272..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 655 zcmWG{_Az7>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkYD`6hzmH8$a=UiY4C-c$9+aCcs3ug}Y~3;&qsCKx%d nIM*Qh`o*=3`~~mjxF5!?&NN=YuNQt-eD#u3{|r=)?B@gknJ>iz diff --git a/wai/live-conformance/links/series_other_cipher.0.wlk1 b/wai/live-conformance/links/series_other_cipher.0.wlk1 new file mode 100644 index 0000000000000000000000000000000000000000..529f559b9dad367f748977f57c1b9a422bb04c59 GIT binary patch literal 655 zcmWId@it@>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkZH$M=NFNeJjNnK~Vv#q)a?dv{ig_6K+F_4n9r>=A#l n$})A2*7K=HA7@-zyZi4gr%vgqw>48ch50`(aLuT$3t|QUXrIGw literal 0 HcmV?d00001 diff --git a/wai/live-conformance/links/series_other_cipher.1.wcl1 b/wai/live-conformance/links/series_other_cipher.1.wlk1 similarity index 64% rename from wai/live-conformance/links/series_other_cipher.1.wcl1 rename to wai/live-conformance/links/series_other_cipher.1.wlk1 index 4492361d188f82cabfd08cc9eb0efaaa9ca2accd..400ec35fb5fe7144a3552ef2254eb3e44c2a4f01 100644 GIT binary patch delta 113 zcmV-%0FM9D1k(fqS4>Nh1C}7D@s?`sgsUM_#n7kSKOf(^z6gYUd@yHAIY&Gag7@FC zxmp202t6=>TquPF-NF|29MChdpH_D7h+T!dl#nPHrXY8yUeH5;7PeiR=^9Ll#nt2M Ta7f^e0m&n*tHYB2L4r#GhHy1| delta 113 zcmV-%0FM9D1k(fqS3^vZ1C}7`^DY6xtp-FMS3C}d24E}YD!n2haIl@kOWfF6uljzm zxmp204GM~I6}pk=YD5;PbFFX2?he6jusuVuNKj?c7=^(mDvp~nahm1-`}B=Gg#B8y TcueVKBA5=USQ{V|;DsUt(*iPm diff --git a/wai/live-conformance/links/series_other_grant.0.wcl1 b/wai/live-conformance/links/series_other_grant.0.wcl1 deleted file mode 100644 index f231adf014e671f8d36586dc4375389c2394b272..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 655 zcmWG{_Az7>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkYD`6hzmH8$a=UiY4C-c$9+aCcs3ug}Y~3;&qsCKx%d nIM*Qh`o*=3`~~mjxF5!?&NN=YuNQt-eD#u3{|r=)?B@gknJ>iz diff --git a/wai/live-conformance/links/series_other_grant.0.wlk1 b/wai/live-conformance/links/series_other_grant.0.wlk1 new file mode 100644 index 0000000000000000000000000000000000000000..529f559b9dad367f748977f57c1b9a422bb04c59 GIT binary patch literal 655 zcmWId@it@>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkZH$M=NFNeJjNnK~Vv#q)a?dv{ig_6K+F_4n9r>=A#l n$})A2*7K=HA7@-zyZi4gr%vgqw>48ch50`(aLuT$3t|QUXrIGw literal 0 HcmV?d00001 diff --git a/wai/live-conformance/links/series_other_grant.1.wcl1 b/wai/live-conformance/links/series_other_grant.1.wlk1 similarity index 64% rename from wai/live-conformance/links/series_other_grant.1.wcl1 rename to wai/live-conformance/links/series_other_grant.1.wlk1 index 6a2ddcdf2d1c706ce8cef7c5cfa2cc3914f8b849..f271d51b03efde108306b9f0240c4bc17a91c429 100644 GIT binary patch delta 113 zcmV-%0FM9D1k(fqS4>Nh1C}7D@s?`sgsUM_#n7kSKOf(^z6gYUd@yHAIY&Gag7@FC zxmp20@a3mn92?|9vhETI#Nl`D*?Sls$(rAM<4EC@;h;id$5d?D{{ChnVH*UU{(i*a T`=jw_TbTcJ^^OlzFu}Lj(R&XZ7R;C#qIgn` Tp+#+5-JlC$+Z_ah13T9azk)G9 diff --git a/wai/live-conformance/links/series_other_hop.0.wcl1 b/wai/live-conformance/links/series_other_hop.0.wcl1 deleted file mode 100644 index f231adf014e671f8d36586dc4375389c2394b272..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 655 zcmWG{_Az7>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkYD`6hzmH8$a=UiY4C-c$9+aCcs3ug}Y~3;&qsCKx%d nIM*Qh`o*=3`~~mjxF5!?&NN=YuNQt-eD#u3{|r=)?B@gknJ>iz diff --git a/wai/live-conformance/links/series_other_hop.0.wlk1 b/wai/live-conformance/links/series_other_hop.0.wlk1 new file mode 100644 index 0000000000000000000000000000000000000000..529f559b9dad367f748977f57c1b9a422bb04c59 GIT binary patch literal 655 zcmWId@it@>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkZH$M=NFNeJjNnK~Vv#q)a?dv{ig_6K+F_4n9r>=A#l n$})A2*7K=HA7@-zyZi4gr%vgqw>48ch50`(aLuT$3t|QUXrIGw literal 0 HcmV?d00001 diff --git a/wai/live-conformance/links/series_other_hop.1.wcl1 b/wai/live-conformance/links/series_other_hop.1.wlk1 similarity index 64% rename from wai/live-conformance/links/series_other_hop.1.wcl1 rename to wai/live-conformance/links/series_other_hop.1.wlk1 index 6c6e75c91ca4942c150e3b24c364baaa7b615016..4c56220cde208b4a140abf78a4c221043d189f5b 100644 GIT binary patch delta 113 zcmV-%0FM9D1k(fqS4>Nh1C}7D@s?`sgsUM_#n7kSKOf(^z6gYUd@yHAIY&Gag7@FC zxmp20DeD^Nz5hiYjPd^V&YFc@A9Pcr3 diff --git a/wai/live-conformance/links/series_other_mode.0.wcl1 b/wai/live-conformance/links/series_other_mode.0.wcl1 deleted file mode 100644 index f231adf014e671f8d36586dc4375389c2394b272..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 655 zcmWG{_Az7>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkYD`6hzmH8$a=UiY4C-c$9+aCcs3ug}Y~3;&qsCKx%d nIM*Qh`o*=3`~~mjxF5!?&NN=YuNQt-eD#u3{|r=)?B@gknJ>iz diff --git a/wai/live-conformance/links/series_other_mode.0.wlk1 b/wai/live-conformance/links/series_other_mode.0.wlk1 new file mode 100644 index 0000000000000000000000000000000000000000..529f559b9dad367f748977f57c1b9a422bb04c59 GIT binary patch literal 655 zcmWId@it@>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkZH$M=NFNeJjNnK~Vv#q)a?dv{ig_6K+F_4n9r>=A#l n$})A2*7K=HA7@-zyZi4gr%vgqw>48ch50`(aLuT$3t|QUXrIGw literal 0 HcmV?d00001 diff --git a/wai/live-conformance/links/series_other_protocol.1.wcl1 b/wai/live-conformance/links/series_other_mode.1.wlk1 similarity index 64% rename from wai/live-conformance/links/series_other_protocol.1.wcl1 rename to wai/live-conformance/links/series_other_mode.1.wlk1 index 63eba18e64da47d20db7434c0cbcecae82f527da..4489e8f8972a4c4725214cad3d40f2bac4e08ad4 100644 GIT binary patch delta 115 zcmV-(0F3|B1k(fqS4>Nh1C}DF@s?`sgsUM_#n7kSKOf(^z6gYUd@yHAIY&Gag7@D6 z0GZyc*@@O_by<~C8mkJ;ool0$XdO`}JwjG$3%dAS Vdpqy@$!UNDrcshTB$AyB0tLfJGavu} delta 115 zcmV-(0F3|B1k(fqS3^vZ1C}D|^DY6xtp-FMS3C}d24E}YD!n2haIl@kOWfF6uljxi z0kOMS0YF3o;d-e#=cpOF1Z}N<8zvJ8vW*|D3iEfD7gZVRo+}$%WQ-oNjEPP%#C^(9 V?5iQ diff --git a/wai/live-conformance/links/series_other_principal.0.wcl1 b/wai/live-conformance/links/series_other_principal.0.wcl1 deleted file mode 100644 index f231adf014e671f8d36586dc4375389c2394b272..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 655 zcmWG{_Az7>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkYD`6hzmH8$a=UiY4C-c$9+aCcs3ug}Y~3;&qsCKx%d nIM*Qh`o*=3`~~mjxF5!?&NN=YuNQt-eD#u3{|r=)?B@gknJ>iz diff --git a/wai/live-conformance/links/series_other_principal.0.wlk1 b/wai/live-conformance/links/series_other_principal.0.wlk1 new file mode 100644 index 0000000000000000000000000000000000000000..529f559b9dad367f748977f57c1b9a422bb04c59 GIT binary patch literal 655 zcmWId@it@>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkZH$M=NFNeJjNnK~Vv#q)a?dv{ig_6K+F_4n9r>=A#l n$})A2*7K=HA7@-zyZi4gr%vgqw>48ch50`(aLuT$3t|QUXrIGw literal 0 HcmV?d00001 diff --git a/wai/live-conformance/links/series_other_principal.1.wcl1 b/wai/live-conformance/links/series_other_principal.1.wlk1 similarity index 53% rename from wai/live-conformance/links/series_other_principal.1.wcl1 rename to wai/live-conformance/links/series_other_principal.1.wlk1 index 4a79235ec5e29b86422abe5409cd371e9c16cc8c..dcd94b5b4be98ffa9d8084e6afe099666b876cff 100644 GIT binary patch delta 113 zcmV-%0FM9D1k(fqS4>Nh1C}7D@s?`sgsUM_#n7kSKOf(^z6gYUd@yHAIY&Gag7@FC zxmp20WDUMMv&?sLkf+;sBfm4w18Hqk60z<>E^Nb7(qy{x$P2>8Hs^2!9G!mAK8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkYD`6hzmH8$a=UiY4C-c$9+aCcs3ug}Y~3;&qsCKx%d nIM*Qh`o*=3`~~mjxF5!?&NN=YuNQt-eD#u3{|r=)?B@gknJ>iz diff --git a/wai/live-conformance/links/series_other_protocol.0.wlk1 b/wai/live-conformance/links/series_other_protocol.0.wlk1 new file mode 100644 index 0000000000000000000000000000000000000000..529f559b9dad367f748977f57c1b9a422bb04c59 GIT binary patch literal 655 zcmWId@it@>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkZH$M=NFNeJjNnK~Vv#q)a?dv{ig_6K+F_4n9r>=A#l n$})A2*7K=HA7@-zyZi4gr%vgqw>48ch50`(aLuT$3t|QUXrIGw literal 0 HcmV?d00001 diff --git a/wai/live-conformance/links/series_other_window.1.wcl1 b/wai/live-conformance/links/series_other_protocol.1.wlk1 similarity index 64% rename from wai/live-conformance/links/series_other_window.1.wcl1 rename to wai/live-conformance/links/series_other_protocol.1.wlk1 index df57845af32068d882b8b59a69c7c2aa106f88c2..97a8733b412464250d830de56e054fb4178b9551 100644 GIT binary patch delta 138 zcmV;50CoS<1k(fqS4>Nh1C}|c@s?`sgsUM_#n7kSKOf(^z6gYUd@yHAIY&Gag7@D8 z0e}Di0Dw9y*8l(j007a%*8l(j0Kn7%vC=^SKsk}JHeJkTI$@4;yfvLEr(tw(ygvAF sZ1?`L!r!^4g{}+@P3LM&&n>$QpEYv8rp5hLQcP69IaaRC))lVM2<&}5t^fc4 delta 138 zcmcc2a+!rW+}UR$^EAuXpY<3Itz~nO3%B8GWlPY0s^g zz`)R8rE?ufF)&;_0;U~!nKxc?WOR7K%Q4sR@x%zjg)Mt@-+f>DeZeEnxf=!Ls~@p& qED`liH)!)+?f!hrUqwW@2q=%@FB_qhRVy*XL{ diff --git a/wai/live-conformance/links/series_other_room.0.wcl1 b/wai/live-conformance/links/series_other_room.0.wcl1 deleted file mode 100644 index f231adf014e671f8d36586dc4375389c2394b272..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 655 zcmWG{_Az7>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkYD`6hzmH8$a=UiY4C-c$9+aCcs3ug}Y~3;&qsCKx%d nIM*Qh`o*=3`~~mjxF5!?&NN=YuNQt-eD#u3{|r=)?B@gknJ>iz diff --git a/wai/live-conformance/links/series_other_room.0.wlk1 b/wai/live-conformance/links/series_other_room.0.wlk1 new file mode 100644 index 0000000000000000000000000000000000000000..529f559b9dad367f748977f57c1b9a422bb04c59 GIT binary patch literal 655 zcmWId@it@>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkZH$M=NFNeJjNnK~Vv#q)a?dv{ig_6K+F_4n9r>=A#l n$})A2*7K=HA7@-zyZi4gr%vgqw>48ch50`(aLuT$3t|QUXrIGw literal 0 HcmV?d00001 diff --git a/wai/live-conformance/links/series_other_room.1.wcl1 b/wai/live-conformance/links/series_other_room.1.wlk1 similarity index 64% rename from wai/live-conformance/links/series_other_room.1.wcl1 rename to wai/live-conformance/links/series_other_room.1.wlk1 index ff79753eb9620ce48e83bdd16c03f730b5342d1d..606cf8f3d92b6cb9c07077642c2b4482120f97d8 100644 GIT binary patch delta 113 zcmV-%0FM9D1k(fqS4>Nh1C}7D@s?`sgsUM_#n7kSKOf(^z6gYUd@yHAIY&Gag7@FC zxmp20HujfAL!1uKV*$Uqh&9x#V&Y=q@3`sS?u%8)JD{LY5wSfY_;P6^@Fb-0y{)H? TXq~J`!g&iQ50uriP$Jn4Ezmdd delta 113 zcmV-%0FM9D1k(fqS3^vZ1C}7`^DY6xtp-FMS3C}d24E}YD!n2haIl@kOWfF6uljzm zxmp20dELHM`1B693#14qQ!3t1J)op@#U5P;OFam>O^a7L11~JFuBHes^cqonIFvr) TX8amQIiCAK8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkYD`6hzmH8$a=UiY4C-c$9+aCcs3ug}Y~3;&qsCKx%d nIM*Qh`o*=3`~~mjxF5!?&NN=YuNQt-eD#u3{|r=)?B@gknJ>iz diff --git a/wai/live-conformance/links/series_other_session.0.wlk1 b/wai/live-conformance/links/series_other_session.0.wlk1 new file mode 100644 index 0000000000000000000000000000000000000000..529f559b9dad367f748977f57c1b9a422bb04c59 GIT binary patch literal 655 zcmWId@it@>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkZH$M=NFNeJjNnK~Vv#q)a?dv{ig_6K+F_4n9r>=A#l n$})A2*7K=HA7@-zyZi4gr%vgqw>48ch50`(aLuT$3t|QUXrIGw literal 0 HcmV?d00001 diff --git a/wai/live-conformance/links/series_other_session.1.wcl1 b/wai/live-conformance/links/series_other_session.1.wlk1 similarity index 64% rename from wai/live-conformance/links/series_other_session.1.wcl1 rename to wai/live-conformance/links/series_other_session.1.wlk1 index a6cc6ae161bb3514875724e71451f2ee56f94ccc..360a63db35c785099358e002a40b6dcc1dbd4d26 100644 GIT binary patch delta 113 zcmV-%0FM9D1k(fqS4>Nh1C}7D@s?`sgsUM_#n7kSKOf(^z6gYUd@yHAIY&Gag7@FC zxmp20dArr;)vR)xQ*dr&1w5~a)kQ-zar^j{paH|2 TNKsLTutEK{vJ>icO+9i7X8t(8 delta 113 zcmV-%0FM9D1k(fqS3^vZ1C}7`^DY6xtp-FMS3C}d24E}YD!n2haIl@kOWfF6uljzm zxmp20S!CR(4pq-JZ(YKp6+{I)1#JR3WKxbb+Ya-J@D|Tem5bOk6IWNU9@)P77VQ}K T5ZDpDNuOJ2{GYo51ovkMds{I$ diff --git a/wai/live-conformance/links/series_other_window.0.wcl1 b/wai/live-conformance/links/series_other_window.0.wcl1 deleted file mode 100644 index f231adf014e671f8d36586dc4375389c2394b272..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 655 zcmWG{_Az7>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkYD`6hzmH8$a=UiY4C-c$9+aCcs3ug}Y~3;&qsCKx%d nIM*Qh`o*=3`~~mjxF5!?&NN=YuNQt-eD#u3{|r=)?B@gknJ>iz diff --git a/wai/live-conformance/links/series_other_window.0.wlk1 b/wai/live-conformance/links/series_other_window.0.wlk1 new file mode 100644 index 0000000000000000000000000000000000000000..529f559b9dad367f748977f57c1b9a422bb04c59 GIT binary patch literal 655 zcmWId@it@>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkZH$M=NFNeJjNnK~Vv#q)a?dv{ig_6K+F_4n9r>=A#l n$})A2*7K=HA7@-zyZi4gr%vgqw>48ch50`(aLuT$3t|QUXrIGw literal 0 HcmV?d00001 diff --git a/wai/live-conformance/links/series_other_mode.1.wcl1 b/wai/live-conformance/links/series_other_window.1.wlk1 similarity index 64% rename from wai/live-conformance/links/series_other_mode.1.wcl1 rename to wai/live-conformance/links/series_other_window.1.wlk1 index 061c3c9595a5bde5f709ed6273e71661277e6ad8..87864d5514555b431b87f59905214120d4c8375e 100644 GIT binary patch delta 138 zcmcc2a+!rW+{b$&^EAs9AE#x#ZCR}teDuQdyY}+;ckSb7sjV?c_qKGm5o-E=pOLYF zfq|jHO6NL|Vqmy<1WY^dGH<-($mo#xD);c=bVc5i6EY1;-hEW{`?C7B%v+bEHTP%i qea9l0nD9nc!H$(BFr5A2e~uT&`%*6Lxy@17D;bbx@!&@yHzNRz#X5EX delta 138 zcmcc2a+!rW+}UR$^EAuXpY<3Itz~nO3%B8GWlPY0s&c zz`)R8rE?ufF)&;_0;UgKVcdAhkrfN diff --git a/wai/live-conformance/links/series_part_after_last.0.wcl1 b/wai/live-conformance/links/series_part_after_last.0.wlk1 similarity index 78% rename from wai/live-conformance/links/series_part_after_last.0.wcl1 rename to wai/live-conformance/links/series_part_after_last.0.wlk1 index d99232ef79c0a71c24a4bb75e94a0a788055c5bc..3359aa5a0b017fd66e9d5a948dcaa66c4a9bd213 100644 GIT binary patch delta 77 zcmV-T0J8s&1&;*-S4>N>155%yJDdiSPE%91?E-s>R j+9LwsSnll?eiv`m-hbzhNR# diff --git a/wai/live-conformance/links/series_part_after_last.1.wcl1 b/wai/live-conformance/links/series_part_after_last.1.wcl1 deleted file mode 100644 index ab6e586cf841b5107e303ca635f031b16ff6db9f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 595 zcmWG{_Az7>K8qMtMJw(V#Wk+^GgJ+BVhW#6_8#Ah6E>mFf9Nk85m$RL=-BBhjIvlNHRgyFhgmG=?n}YehZLz0mMEm z3=AOg38@Hd;ljwkwC9@3yZUFR_ekyjv(C`>!nt#MH&``EF6a|ikxlq^qATI->dtgm zWkv>8sNtUvzT2kbslqsI^W9H(9%=|bk;=L0?bD=@r~FZ!*WkGJUICV#{)D}1XSaFX zW&gW=s=zJJxQ|6O5<+JkkNh<=@N!OVUwQg1KZ7LHJW=9MnR z>&=?azw+dFY>((wn0OxO=rm|Jf!q)CTSrsFcH8uG&5s$LKGuraYy2s?((LPsGp?yd s)gdRD?)HdvU+$0ZuiDVGQ$XkH)7*z)zLGy5NCp)Oe^;2^-=NM30CfJ;KmY&$ diff --git a/wai/live-conformance/links/series_part_after_last.1.wlk1 b/wai/live-conformance/links/series_part_after_last.1.wlk1 new file mode 100644 index 0000000000000000000000000000000000000000..87ba06f70f5f96ef6218a9ab0afd0c6263324c45 GIT binary patch literal 595 zcmWId@it@>K8qMtMJw(V#Wk+^GgJ+&cjZm?>ST+k=3BAf8-L|4Mu)t%|C z%8U%GP{ThTe78-!$RDoNbaUY9nB!td79{Fo#;N_g!zVh^2eg;XXd7|zQ|JfFmoO0_qpX>en(_?4t z)|)k-f91*V*dEcVF!4Ol(P_|d0=XaNH^(0$N1mLy5*oNK=GLmjYumb%Jk=XsHQh6s t)76vg{=nr&*b-re{C)4XIOIH-`Aztg?xOD5ev>9#Y6_ibd(3(dD*(v0*OveQ literal 0 HcmV?d00001 diff --git a/wai/live-conformance/links/series_sequence_gap.0.wcl1 b/wai/live-conformance/links/series_sequence_gap.0.wcl1 deleted file mode 100644 index f231adf014e671f8d36586dc4375389c2394b272..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 655 zcmWG{_Az7>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkYD`6hzmH8$a=UiY4C-c$9+aCcs3ug}Y~3;&qsCKx%d nIM*Qh`o*=3`~~mjxF5!?&NN=YuNQt-eD#u3{|r=)?B@gknJ>iz diff --git a/wai/live-conformance/links/series_sequence_gap.0.wlk1 b/wai/live-conformance/links/series_sequence_gap.0.wlk1 new file mode 100644 index 0000000000000000000000000000000000000000..529f559b9dad367f748977f57c1b9a422bb04c59 GIT binary patch literal 655 zcmWId@it@>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkZH$M=NFNeJjNnK~Vv#q)a?dv{ig_6K+F_4n9r>=A#l n$})A2*7K=HA7@-zyZi4gr%vgqw>48ch50`(aLuT$3t|QUXrIGw literal 0 HcmV?d00001 diff --git a/wai/live-conformance/links/series_sequence_gap.1.wcl1 b/wai/live-conformance/links/series_sequence_gap.1.wcl1 deleted file mode 100644 index cbb316f22dacc85080cd7a8e999daba13af63e6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 595 zcmWG{_Az7>K8qMtMJw(V#Wk+^GgJ+EDmCB=dbbB}o6xe>MgR~;i`15j0imCkh_ z#lUd!2$()_1*DgOA<>B+ObdWX1_l@n5rqokp&WuBl1xxF%upI)Is*fU-vT6F0I?4X z0|Q8WLMj4VxG*v>?YZXiuKwBSJyN^>tTXhzaPHjR4OUH(3;M)WWD~xf=t?-dx-;EX znUR4NYWU}a@3!f9sxVI5eD~9xhZ@39q;hV0`!s3fDSuSwH8`%lSAeCbKVh%h*==5T z+5fJeDsam)?qgAngwR>XBY({dyqr_pSDt>$&majkPt^V4Kii^`Q*J%ybG@H`dhD#- zdb8&9uRQr3+ar1vCY}d6IvpBLAos)kc4hO8XBCXUu4Jse#>Y`4@=Q<9ser|;;!Wif syL_E~Z|Rn^&r5559^U4-h^torTVTe_TeGE`I?n6}JXCl4`9~2p08N_Hp8x;= diff --git a/wai/live-conformance/links/series_sequence_gap.1.wlk1 b/wai/live-conformance/links/series_sequence_gap.1.wlk1 new file mode 100644 index 0000000000000000000000000000000000000000..b67e57768747f62d73f948ff82a407800ba638d1 GIT binary patch literal 595 zcmWId@it@>K8qMtMJw(V#Wk+^GgJ+*lL!uKum=*w&3=A+DA_^76LpcONB$=RUn4vVpbOr_xzXeFV0Ae2& z1_qG$gj58!aA9O%+H=k2UH!Aud!%;%S!d{b;oP~s8?2fn7xam%$R>O{(Uov^b!WP( zG9v>k)bP&--)+g3JNafu0_G!|{Q~s#VYj9k9uK-I=f5Kk1v)jDx zvj1H_Rp6Fq+{dCC38Ax&NB)`_csZxGuRQ&hpFt98o~Zl7f3`&>r`&qZ=XyW?^w?Ru z^=8fIUwQI7wny|TOgs;CbUHMgK<K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkYD`6hzmH8$a=UiY4C-c$9+aCcs3ug}Y~3;&qsCKx%d nIM*Qh`o*=3`~~mjxF5!?&NN=YuNQt-eD#u3{|r=)?B@gknJ>iz diff --git a/wai/live-conformance/links/series_skips_a_part.0.wlk1 b/wai/live-conformance/links/series_skips_a_part.0.wlk1 new file mode 100644 index 0000000000000000000000000000000000000000..529f559b9dad367f748977f57c1b9a422bb04c59 GIT binary patch literal 655 zcmWId@it@>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkZH$M=NFNeJjNnK~Vv#q)a?dv{ig_6K+F_4n9r>=A#l n$})A2*7K=HA7@-zyZi4gr%vgqw>48ch50`(aLuT$3t|QUXrIGw literal 0 HcmV?d00001 diff --git a/wai/live-conformance/links/series_skips_a_part.1.wcl1 b/wai/live-conformance/links/series_skips_a_part.1.wcl1 deleted file mode 100644 index 037e118a7879dc0fb4d8ac29ab20733b5520b1a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 595 zcmWG{_Az7>K8qMtMJw(V#Wk+^GgJ+EDmCB=dbbB}o6xe>MgR~;i`15j0imCkh_ z#lUd!2$()_1*DgOA;F0sObdWX1_l@n5rqokp&WuBl1xxF%upI)Is*fU-vT6F0I?4X z0|Q8WLMj4VxG*v>?YZXiuKwBSJyN^>tTXhzaPHjR4OUH(3;M)WWD~xf=t?-dx-;EX znUR4NYWU}a@3!f9sxVI5eD~9xhZ@39q;hV0`!s3fDSuSwH8`%lSAeCbKVh%h*==5T z+5fJeDsam)?qgAngwR>XBY({dyqr_pSDt>$&majkPt^V4Kii^`Q*J%ybG@H`dhD#- zdb8&9uRQr3+ar1vCY}d6It?05Aos)k_NS`8YmV2uO&5|sFD`m^xpr;N)D6CWT9($Q seQVpPIKRyAo^3|-rygdH@*l0ge>VwTJ@G|b?&kgkxhlhpb+2?800RQn&j0`b diff --git a/wai/live-conformance/links/series_skips_a_part.1.wlk1 b/wai/live-conformance/links/series_skips_a_part.1.wlk1 new file mode 100644 index 0000000000000000000000000000000000000000..5bc548ec53e00d10d6120c75ad3ceb1b5d608032 GIT binary patch literal 595 zcmWId@it@>K8qMtMJw(V#Wk+^GgJ+*lLxK}Om=*w&3=A+DA_^76LpcONB$=RUn4vVpbOr_xzXeFV0Ae2& z1_qG$gj58!aA9O%+H=k2UH!Aud!%;%S!d{b;oP~s8?2fn7xam%$R>O{(Uov^b!WP( zG9v>k)bP&--)+g3JNafu0_G!|{Q~s#VYj9k9uK-I=f5Kk1v)jDx zvj1H_Rp6Fq+{dCC38Ax&NB)`_csZxGuRQ&hpFt98o~Zl7f3`&>r`&qZ=XyW?^w?Ru z^=8fIUwQI7wny|TOgs;CbQ(0AK<4yn* s0TbjT1x0k;ZNh1C}5LMbVdb>JsfsR0#ye$!Wwv{+jEM$IIPLlK(3dH%X$g zxmp20v=2%U)pqR6ADJSyL8i(x6jPU5Q>YKOE27Y?POTO=qN7%xRb&|3BRoAEd~Ec_ TQ}f?F)$YUY>sH`=5$|#hZpk&? delta 113 zcmV-%0FM9D1k(fqS3^vZ1C}7fYsx?hqshSorYV%}*iDm+Zczv?Xqc|f=<;$k4KmKL zxmp20ORV2LZrBI!9aA&@X%o92cF#b0513Gx6h{cdEzvY#2?#2|0#)}jlWKGBch4S^ T3m$3+)38$w=|T&5k|~@F^|CMA diff --git a/wai/live-conformance/links/series_starts_late.0.wcl1 b/wai/live-conformance/links/series_starts_late.0.wcl1 deleted file mode 100644 index 037e118a7879dc0fb4d8ac29ab20733b5520b1a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 595 zcmWG{_Az7>K8qMtMJw(V#Wk+^GgJ+EDmCB=dbbB}o6xe>MgR~;i`15j0imCkh_ z#lUd!2$()_1*DgOA;F0sObdWX1_l@n5rqokp&WuBl1xxF%upI)Is*fU-vT6F0I?4X z0|Q8WLMj4VxG*v>?YZXiuKwBSJyN^>tTXhzaPHjR4OUH(3;M)WWD~xf=t?-dx-;EX znUR4NYWU}a@3!f9sxVI5eD~9xhZ@39q;hV0`!s3fDSuSwH8`%lSAeCbKVh%h*==5T z+5fJeDsam)?qgAngwR>XBY({dyqr_pSDt>$&majkPt^V4Kii^`Q*J%ybG@H`dhD#- zdb8&9uRQr3+ar1vCY}d6It?05Aos)k_NS`8YmV2uO&5|sFD`m^xpr;N)D6CWT9($Q seQVpPIKRyAo^3|-rygdH@*l0ge>VwTJ@G|b?&kgkxhlhpb+2?800RQn&j0`b diff --git a/wai/live-conformance/links/series_starts_late.0.wlk1 b/wai/live-conformance/links/series_starts_late.0.wlk1 new file mode 100644 index 0000000000000000000000000000000000000000..5bc548ec53e00d10d6120c75ad3ceb1b5d608032 GIT binary patch literal 595 zcmWId@it@>K8qMtMJw(V#Wk+^GgJ+*lLxK}Om=*w&3=A+DA_^76LpcONB$=RUn4vVpbOr_xzXeFV0Ae2& z1_qG$gj58!aA9O%+H=k2UH!Aud!%;%S!d{b;oP~s8?2fn7xam%$R>O{(Uov^b!WP( zG9v>k)bP&--)+g3JNafu0_G!|{Q~s#VYj9k9uK-I=f5Kk1v)jDx zvj1H_Rp6Fq+{dCC38Ax&NB)`_csZxGuRQ&hpFt98o~Zl7f3`&>r`&qZ=XyW?^w?Ru z^=8fIUwQI7wny|TOgs;CbQ(0AK<4yn* s0TbjT1x0k;ZNh1C}5LMbVdb>JsfsR0#ye$!Wwv{+jEM$IIPLlK(3dH%X$g zxmp20j!H-;Vro<}KOTqSm(_bZ=6y;Zsu{GCn65^{+rS!zYw)V{>2AEKnOmLNyH=tw Ta^bd#hv&=}V7FG8vGX$z@6_Y9A!Yqb?^K-SxB&*q}LS diff --git a/wai/live-conformance/links/series_three_parts.0.wcl1 b/wai/live-conformance/links/series_three_parts.0.wcl1 deleted file mode 100644 index f231adf014e671f8d36586dc4375389c2394b272..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 655 zcmWG{_Az7>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkYD`6hzmH8$a=UiY4C-c$9+aCcs3ug}Y~3;&qsCKx%d nIM*Qh`o*=3`~~mjxF5!?&NN=YuNQt-eD#u3{|r=)?B@gknJ>iz diff --git a/wai/live-conformance/links/series_three_parts.0.wlk1 b/wai/live-conformance/links/series_three_parts.0.wlk1 new file mode 100644 index 0000000000000000000000000000000000000000..529f559b9dad367f748977f57c1b9a422bb04c59 GIT binary patch literal 655 zcmWId@it@>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkZH$M=NFNeJjNnK~Vv#q)a?dv{ig_6K+F_4n9r>=A#l n$})A2*7K=HA7@-zyZi4gr%vgqw>48ch50`(aLuT$3t|QUXrIGw literal 0 HcmV?d00001 diff --git a/wai/live-conformance/links/series_three_parts.1.wcl1 b/wai/live-conformance/links/series_three_parts.1.wcl1 deleted file mode 100644 index 037e118a7879dc0fb4d8ac29ab20733b5520b1a9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 595 zcmWG{_Az7>K8qMtMJw(V#Wk+^GgJ+EDmCB=dbbB}o6xe>MgR~;i`15j0imCkh_ z#lUd!2$()_1*DgOA;F0sObdWX1_l@n5rqokp&WuBl1xxF%upI)Is*fU-vT6F0I?4X z0|Q8WLMj4VxG*v>?YZXiuKwBSJyN^>tTXhzaPHjR4OUH(3;M)WWD~xf=t?-dx-;EX znUR4NYWU}a@3!f9sxVI5eD~9xhZ@39q;hV0`!s3fDSuSwH8`%lSAeCbKVh%h*==5T z+5fJeDsam)?qgAngwR>XBY({dyqr_pSDt>$&majkPt^V4Kii^`Q*J%ybG@H`dhD#- zdb8&9uRQr3+ar1vCY}d6It?05Aos)k_NS`8YmV2uO&5|sFD`m^xpr;N)D6CWT9($Q seQVpPIKRyAo^3|-rygdH@*l0ge>VwTJ@G|b?&kgkxhlhpb+2?800RQn&j0`b diff --git a/wai/live-conformance/links/series_three_parts.1.wlk1 b/wai/live-conformance/links/series_three_parts.1.wlk1 new file mode 100644 index 0000000000000000000000000000000000000000..5bc548ec53e00d10d6120c75ad3ceb1b5d608032 GIT binary patch literal 595 zcmWId@it@>K8qMtMJw(V#Wk+^GgJ+*lLxK}Om=*w&3=A+DA_^76LpcONB$=RUn4vVpbOr_xzXeFV0Ae2& z1_qG$gj58!aA9O%+H=k2UH!Aud!%;%S!d{b;oP~s8?2fn7xam%$R>O{(Uov^b!WP( zG9v>k)bP&--)+g3JNafu0_G!|{Q~s#VYj9k9uK-I=f5Kk1v)jDx zvj1H_Rp6Fq+{dCC38Ax&NB)`_csZxGuRQ&hpFt98o~Zl7f3`&>r`&qZ=XyW?^w?Ru z^=8fIUwQI7wny|TOgs;CbQ(0AK<4yn* s0TbjT1x0k;ZNh1C}5LMbVdb>JsfsR0#ye$!Wwv{+jEM$IIPLlK(3dH%X$g zxmp20j!H-;Vro<}KOTqSm(_bZ=6y;Zsu{GCn65^{+rS!zYw)V{>2AEKnOmLNyH=tw Ta^bd#hv&=}V7FG8vGX$z@6_Y9A!Yqb?^K-SxB&*q}LS diff --git a/wai/live-conformance/links/series_time_gap.0.wcl1 b/wai/live-conformance/links/series_time_gap.0.wcl1 deleted file mode 100644 index f231adf014e671f8d36586dc4375389c2394b272..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 655 zcmWG{_Az7>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkYD`6hzmH8$a=UiY4C-c$9+aCcs3ug}Y~3;&qsCKx%d nIM*Qh`o*=3`~~mjxF5!?&NN=YuNQt-eD#u3{|r=)?B@gknJ>iz diff --git a/wai/live-conformance/links/series_time_gap.0.wlk1 b/wai/live-conformance/links/series_time_gap.0.wlk1 new file mode 100644 index 0000000000000000000000000000000000000000..529f559b9dad367f748977f57c1b9a422bb04c59 GIT binary patch literal 655 zcmWId@it@>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkZH$M=NFNeJjNnK~Vv#q)a?dv{ig_6K+F_4n9r>=A#l n$})A2*7K=HA7@-zyZi4gr%vgqw>48ch50`(aLuT$3t|QUXrIGw literal 0 HcmV?d00001 diff --git a/wai/live-conformance/links/series_time_gap.1.wcl1 b/wai/live-conformance/links/series_time_gap.1.wcl1 deleted file mode 100644 index fe400f8555913fa05da989a26e3033aaa2a80ef4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 595 zcmWG{_Az7>K8qMtMJw(V#Wk+^GgJ+EDmCB=dbbB}o6xe>MgR~;i`15j0?mCkh_ z#lUd!2$()_1*DgOA;F0sObdWX1_l@n5rqokp&WuBl1xxF%upI)Is*fU-vT6F0I?4X z0|Q8WLMj4VxG*v>?YZXiuKwBSJyN^>tTXhzaPHjR4OUH(3;M)WWD~xf=t?-dx-;EX znUR4NYWU}a@3!f9sxVI5eD~9xhZ@39q;hV0`!s3fDSuSwH8`%lSAeCbKVh%h*==5T z+5fJeDsam)?qgAngwR>XBY({dyqr_pSDt>$&majkPt^V4Kii^`Q*J%ybG@H`dhD#- zdb8&9uRQr3+ar1vCY}d6It?05Aos)k7Nzn!J1Vba*6V+BUhjT&;>LltPrJK8qMtMJw(V#Wk+^GgJ+*lLxK}Om=*w&3=A+DA_^76LpcONB$=RUn4vVpbOr_xzXeFV0Ae2& z1_qG$gj58!aA9O%+H=k2UH!Aud!%;%S!d{b;oP~s8?2fn7xam%$R>O{(Uov^b!WP( zG9v>k)bP&--)+g3JNafu0_G!|{Q~s#VYj9k9uK-I=f5Kk1v)jDx zvj1H_Rp6Fq+{dCC38Ax&NB)`_csZxGuRQ&hpFt98o~Zl7f3`&>r`&qZ=XyW?^w?Ru z^=8fIUwQI7wny|TOgs;CbQ(0AK<1@!Rel>YHiIzQNW1RDD__n}f!kqK_K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkYD`6hzmH8$a=UiY4C-c$9+aCcs3ug}Y~3;&qsCKx%d nIM*Qh`o*=3`~~mjxF5!?&NN=YuNQt-eD#u3{|r=)?B@gknJ>iz diff --git a/wai/live-conformance/links/series_track_added.0.wlk1 b/wai/live-conformance/links/series_track_added.0.wlk1 new file mode 100644 index 0000000000000000000000000000000000000000..529f559b9dad367f748977f57c1b9a422bb04c59 GIT binary patch literal 655 zcmWId@it@>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkZH$M=NFNeJjNnK~Vv#q)a?dv{ig_6K+F_4n9r>=A#l n$})A2*7K=HA7@-zyZi4gr%vgqw>48ch50`(aLuT$3t|QUXrIGw literal 0 HcmV?d00001 diff --git a/wai/live-conformance/links/series_track_added.1.wcl1 b/wai/live-conformance/links/series_track_added.1.wlk1 similarity index 75% rename from wai/live-conformance/links/series_track_added.1.wcl1 rename to wai/live-conformance/links/series_track_added.1.wlk1 index 6946fef3f43b8d8d44d9578e47ea2f8f791c675e..1eea3a5d56eb0febcca1ffd5e6219504dbd77d0e 100644 GIT binary patch delta 113 zcmV-%0FM8o1)~K6S4>Nh1C}7D@s?`sgsUM_#n7kSKOf(^z6gYUd@yHAIY&Gag7@FC zxvBv`JFR(<__Mk$X$6S|Cf)b#h}8IZ#N`SimC=NQCyx6flJDyMhDfBD389)p_Ir<* Ttow=Zw^WybC^8rih$I6HHETD$ delta 113 zcmV-%0FM8o1)~K6S3^vZ1C}7`^DY6xtp-FMS3C}d24E}YD!n2haIl@kOWfF6uljzm zxvBv`Iw4}VhsK%%R^`al&=MOCJqDsNJhUi|DUGq^Mv5_)eX1E;xQ1FtH>M!?{cSw9 TQ{P&8SKEbW`R&-?D>NMikx?>p diff --git a/wai/live-conformance/links/series_track_added.2.wcl1 b/wai/live-conformance/links/series_track_added.2.wlk1 similarity index 75% rename from wai/live-conformance/links/series_track_added.2.wcl1 rename to wai/live-conformance/links/series_track_added.2.wlk1 index 3a1af1456931927b441371aef8b6073ec19d17e8..713a3cfa92e8e3a8ce4d76baff16a703e45b2181 100644 GIT binary patch delta 113 zcmV-%0FM8o1)~K6S4>Nh1C}5*)>p6DwF(WFC~vcHWH>~K;ka3 zxvBv`)50Od7cWDGi&;f(%SJV*6--@Nfm9FhGd`@FOkFuQOzrPUl3Qo2a^z5W!o)Lm T!)x|re#N*&hUV1+;9{E%T;MVu delta 113 zcmV-%0FM8o1)~K6S3^vZ1C}6kpnG7gq&?uoPa@yr;Oew5%YkR9_u=Ctd8R@&-Tcw9 zxvBv`-Dqlwb)_6D!*tD|hZii(N&~^9C6H92luG=%zdf|GG7|d&+sxSc!!Mg336l diff --git a/wai/live-conformance/links/series_track_alias_changed.0.wcl1 b/wai/live-conformance/links/series_track_alias_changed.0.wcl1 deleted file mode 100644 index f231adf014e671f8d36586dc4375389c2394b272..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 655 zcmWG{_Az7>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkYD`6hzmH8$a=UiY4C-c$9+aCcs3ug}Y~3;&qsCKx%d nIM*Qh`o*=3`~~mjxF5!?&NN=YuNQt-eD#u3{|r=)?B@gknJ>iz diff --git a/wai/live-conformance/links/series_track_alias_changed.0.wlk1 b/wai/live-conformance/links/series_track_alias_changed.0.wlk1 new file mode 100644 index 0000000000000000000000000000000000000000..529f559b9dad367f748977f57c1b9a422bb04c59 GIT binary patch literal 655 zcmWId@it@>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkZH$M=NFNeJjNnK~Vv#q)a?dv{ig_6K+F_4n9r>=A#l n$})A2*7K=HA7@-zyZi4gr%vgqw>48ch50`(aLuT$3t|QUXrIGw literal 0 HcmV?d00001 diff --git a/wai/live-conformance/links/series_track_alias_changed.1.wcl1 b/wai/live-conformance/links/series_track_alias_changed.1.wlk1 similarity index 64% rename from wai/live-conformance/links/series_track_alias_changed.1.wcl1 rename to wai/live-conformance/links/series_track_alias_changed.1.wlk1 index 870b8f909aee1a4deae168e56b2fd366fc8a4d7c..0ae1b7af63809c008e157fe0c6cd7f1386a00152 100644 GIT binary patch delta 113 zcmV-%0FM9D1k(fqS4>Nh1C}7D@s?`sgsUM_#n7kSKOf(^z6gYUd@yHAIY&Gag7@FC zxmp20B&AHwb~<=Cz{!+ElJ{&liO@~5=U6ys138Qqt+SjRc1TM*Ht%Vs`;*fNpQz5% TvytW_x$84E%eU+c=JjR|$P_nU delta 113 zcmV-%0FM9D1k(fqS3^vZ1C}7`^DY6xtp-FMS3C}d24E}YD!n2haIl@kOWfF6uljzm zxmp20igI*DEvaiL9i~e=L#G0BiFT4VU3d@_QjR5PG7zecs62=>-1-wY-&qZ9c?SjI T@kJ<+2~E^vbv&n4(mIk26oDK8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkYD`6hzmH8$a=UiY4C-c$9+aCcs3ug}Y~3;&qsCKx%d nIM*Qh`o*=3`~~mjxF5!?&NN=YuNQt-eD#u3{|r=)?B@gknJ>iz diff --git a/wai/live-conformance/links/series_track_dropped.0.wlk1 b/wai/live-conformance/links/series_track_dropped.0.wlk1 new file mode 100644 index 0000000000000000000000000000000000000000..529f559b9dad367f748977f57c1b9a422bb04c59 GIT binary patch literal 655 zcmWId@it@>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkZH$M=NFNeJjNnK~Vv#q)a?dv{ig_6K+F_4n9r>=A#l n$})A2*7K=HA7@-zyZi4gr%vgqw>48ch50`(aLuT$3t|QUXrIGw literal 0 HcmV?d00001 diff --git a/wai/live-conformance/links/series_track_dropped.1.wcl1 b/wai/live-conformance/links/series_track_dropped.1.wlk1 similarity index 62% rename from wai/live-conformance/links/series_track_dropped.1.wcl1 rename to wai/live-conformance/links/series_track_dropped.1.wlk1 index 023de5ced4ac815d41e7a5ed396d1e69abce4a20..f4f034e40e72d835ad668ef5ea44a727b49e6383 100644 GIT binary patch delta 113 zcmV-%0FM8I1cL+vS4>Nh1C}7D@s?`sgsUM_#n7kSKOf(^z6gYUd@yHAIY&Gag7@FC zxe5V5U*qI{J!l8my}i;z!cwcb3@TQ}9&1n_pP4FpLLK3`t+@kv-!505T2*d&3?SzY Tb8{FXFvC42z|$&(_iNP*Le4U2 delta 113 zcmV-%0FM8I1cL+vS3^vZ1C}7`^DY6xtp-FMS3C}d24E}YD!n2haIl@kOWfF6uljzm zxe5V5duu9v2L6oSsd9T*rSoo(_9O>hzOqfVoP|;f;_juhkfe>>+S%A62u$|gIJ;vFn;*p5C8{e(45 diff --git a/wai/live-conformance/links/series_wrong_parent.0.wcl1 b/wai/live-conformance/links/series_wrong_parent.0.wcl1 deleted file mode 100644 index f231adf014e671f8d36586dc4375389c2394b272..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 655 zcmWG{_Az7>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkYD`6hzmH8$a=UiY4C-c$9+aCcs3ug}Y~3;&qsCKx%d nIM*Qh`o*=3`~~mjxF5!?&NN=YuNQt-eD#u3{|r=)?B@gknJ>iz diff --git a/wai/live-conformance/links/series_wrong_parent.0.wlk1 b/wai/live-conformance/links/series_wrong_parent.0.wlk1 new file mode 100644 index 0000000000000000000000000000000000000000..529f559b9dad367f748977f57c1b9a422bb04c59 GIT binary patch literal 655 zcmWId@it@>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkZH$M=NFNeJjNnK~Vv#q)a?dv{ig_6K+F_4n9r>=A#l n$})A2*7K=HA7@-zyZi4gr%vgqw>48ch50`(aLuT$3t|QUXrIGw literal 0 HcmV?d00001 diff --git a/wai/live-conformance/links/series_wrong_parent.1.wcl1 b/wai/live-conformance/links/series_wrong_parent.1.wlk1 similarity index 75% rename from wai/live-conformance/links/series_wrong_parent.1.wcl1 rename to wai/live-conformance/links/series_wrong_parent.1.wlk1 index 01730fbed37541305a1e66e4a0657498715bdeaf..e19ce29a5c06ccdcfef56d691658e4745a5e6999 100644 GIT binary patch delta 77 zcmV-T0J8tn1k(fqS4>N>0}uj0M{02@V^|nb8xGLANLw@W$d2jx#mB@=hPH8@9DSh# jydDNh1C}5LMbVdb>JsfsR0#ye$!Wwv{+jEM$IIPLlK(3dH%X$g zxmp20j!H-;Vro<}KOTqSm(_bZ=6y;Zsu{GCn65^{+rS!zYw)V{>2AEKnOmLNyH=tw Ta^bd#hv&=}V7FG8vGX$z@6_Y9A!Yqb?^K-SxB&*q}LS diff --git a/wai/live-conformance/links/small_order_r.wcl1 b/wai/live-conformance/links/small_order_r.wlk1 similarity index 87% rename from wai/live-conformance/links/small_order_r.wcl1 rename to wai/live-conformance/links/small_order_r.wlk1 index c220bfcef7839b0eb3ef26298308bb0b041a7495..d8eda38e93fac4595216c653865f07040a7198c6 100644 GIT binary patch delta 45 zcmV+|0Mh@D1&;*-S4>N>18f2yIc2;m=at3dXwt2_{n|o_8N>0}uj0wa?vb6=JO~PtbB^5l5GZ{wu&|Tdv^;@%bR)%>0vt jo1JclniFCEJL3`=>G!{IdqEDpgElm_hK&fKX;*mzQSKx3 delta 77 zcmV-T0J8tn1k(fqS3^v(0}uj0UyboOv$xg>9PMRpK6|3ZO8AEE8=Y1tW+P2|ty#FR jYy%Du8V8()5PZdx95WOhsUqSZO~)cp@7Sf9bh5k&ze6A$ diff --git a/wai/live-conformance/links/srt_cipher_100.wcl1 b/wai/live-conformance/links/srt_cipher_100.wlk1 similarity index 78% rename from wai/live-conformance/links/srt_cipher_100.wcl1 rename to wai/live-conformance/links/srt_cipher_100.wlk1 index 6939a50d59c5cf9dd65302a62c3393c52514e237..1dce05ae58fc3dd565c568c6e1ed3cb12f1ed3cd 100644 GIT binary patch delta 77 zcmV-T0J8s&1&;*-S4>N>155%y5m6v-1wgKA$2FM+Ze*B%K#aNXFB|yG58`3eg``oW j6_M8`GN0zoN}m=nyLc92O*sPwU~US3AP-^ez=Ac&WXyNjvjcC%-UVn84Qr j<8jQK(YfvCE;U!cCbviWlcKbNWII&;PTpt}N>12_Ue9j?oEv=uUpw0qonDpaXXa&lx>E`Qu!5WR-`?v!a# jKUF#W;T{qEtbPR5L8sMI68cLKd_tkqpv+Yy)};FZ78)a% delta 77 zcmV-T0J8u41p5R7S3^v(12_UedfMYW6Nnd8$#6z6uCyO@tphgXTmavm57L4SAd3xv jm<1{D>s0_YrZAL!qY>5IN>1N;F%oT(Liuu*jet}1e&%7W%u@h!Rm`UxSnesd)y_R(hF jrIKE{X@(KKL32%mrQZHeajF*ViWs5%(e6 diff --git a/wai/live-conformance/links/srt_recovered.wcl1 b/wai/live-conformance/links/srt_recovered.wcl1 deleted file mode 100644 index f231adf014e671f8d36586dc4375389c2394b272..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 655 zcmWG{_Az7>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkYD`6hzmH8$a=UiY4C-c$9+aCcs3ug}Y~3;&qsCKx%d nIM*Qh`o*=3`~~mjxF5!?&NN=YuNQt-eD#u3{|r=)?B@gknJ>iz diff --git a/wai/live-conformance/links/srt_recovered.wlk1 b/wai/live-conformance/links/srt_recovered.wlk1 new file mode 100644 index 0000000000000000000000000000000000000000..529f559b9dad367f748977f57c1b9a422bb04c59 GIT binary patch literal 655 zcmWId@it@>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkZH$M=NFNeJjNnK~Vv#q)a?dv{ig_6K+F_4n9r>=A#l n$})A2*7K=HA7@-zyZi4gr%vgqw>48ch50`(aLuT$3t|QUXrIGw literal 0 HcmV?d00001 diff --git a/wai/live-conformance/links/too_large.wcl1 b/wai/live-conformance/links/too_large.wlk1 similarity index 98% rename from wai/live-conformance/links/too_large.wcl1 rename to wai/live-conformance/links/too_large.wlk1 index 93de4a9c494cfaeea6c5fac24cf937ff33970803..72de7e1c95032a3494c5f0ca3cf0bdba6baa057d 100644 GIT binary patch delta 85 zcmV-b0IL6>SfE$~S4>N>155%yb;rC_9vBcU0yRR#nhg882a9TiEAU4PuiggOycg)I rIc2;m=at3dXwt2_{n|o_8SfE$~S3^v(155%y0&g@C7koTd%Il5EgS>j;F}rSwjZEpyq5L;(U@}9f r&VUu`=+N>155%y8krK=wi!8Bj!3QC66s3`j6tTEV`FO0nFtA#CpHRT j*c@CscP|X9FNwgTdAr3FvcaXL1@OXK5UN>155%ya0N?4N|0-ayv5;8D1BLwYnoVAn*#3QMJHf5dKHU7 j#aEOu;mZ?w`sx4x=bJ-mrrUFcQrj7(ZT35+N>HK;n@k}D delta 77 zcmV-T0J8s&1&;*-S3^v(155%yUQaoVCKRCx(Qu09UGYg~9Ksu2sRx?+CkUN8SnrMX j8|SCPzD66ugQG{Z`cg#mu~UVtS_4BOQTFLfq?GCaudX6W diff --git a/wai/live-conformance/links/tracks_not_begun.wcl1 b/wai/live-conformance/links/tracks_not_begun.wlk1 similarity index 77% rename from wai/live-conformance/links/tracks_not_begun.wcl1 rename to wai/live-conformance/links/tracks_not_begun.wlk1 index 3f7d7ec4ce35e66a3e619fd6200e0881e67d3c4b..cc567a2b72873db636985c4ca6100ac4987b30eb 100644 GIT binary patch delta 77 zcmV-T0J8tT1iu6WS4>N>1N;F%qD2q6kcqaqvz(rb_Si^+h*vrC4gu~!6UuCT$I8t> j5k2WkY7n{8Cn<|>NvTOm*XCstExtt4X4W_!-4Lt>Q!^tO delta 77 zcmV-T0J8tT1iu6WS3^v(1N;F%Y!Byg9|)r$^vs@zYd={N>0~`fFs|*>JT3z0iU{(0B@LXX{wF5i*OXO4*gE*Qim{ jHc5#~&_Fbq7^R+cMhx+zTyz`KjbJ3EE=zYT)ktd#+wdTi diff --git a/wai/live-conformance/links/tracks_unsorted.wcl1 b/wai/live-conformance/links/tracks_unsorted.wlk1 similarity index 78% rename from wai/live-conformance/links/tracks_unsorted.wcl1 rename to wai/live-conformance/links/tracks_unsorted.wlk1 index 08a36c53933cc5087dca0da089863a235f046488..5131aec92f132dbd6befc69149fd8e64b90640e1 100644 GIT binary patch delta 77 zcmV-T0J8s&1&;*-S4>N>155%yt}AHXxnExpJTtb;MbrtLmvh0~j*yK@%p5GBiPLB# jV|85G!D?|bXj-$^{`_dMEr8Ybf_}2EjVP#xZ;O@y2}UGx delta 77 zcmV-T0J8s&1&;*-S3^v(155%y<1&okw@A2Uej{&q)e3AJr%H%~$E0v|w;E|-tnPMj jN$##7;>AbTP_=>_ry;Sovgtg>no|2Wf;<}zPqP096HX(K diff --git a/wai/live-conformance/links/trailing_byte.wcl1 b/wai/live-conformance/links/trailing_byte.wcl1 deleted file mode 100644 index 4e023d882d02db9a34d801ff5bc17682a0d641e7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 656 zcmWG{_Az7>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkYD`6hzmH8$a=UiY4C-c$9+aCcs3ug}Y~3;&qsCKx%d oIM*Qh`o*=3`~~mjxF5!?&NN=YuNQt-eD#u3{|r=)?B`?v0A51H1ONa4 diff --git a/wai/live-conformance/links/trailing_byte.wlk1 b/wai/live-conformance/links/trailing_byte.wlk1 new file mode 100644 index 0000000000000000000000000000000000000000..81b8d4db483eba69df55fc81e4004a1c1deb508b GIT binary patch literal 656 zcmWId@it@>K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkZH$M=NFNeJjNnK~Vv#q)a?dv{ig_6K+F_4n9r>=A#l o$})A2*7K=HA7@-zyZi4gr%vgqw>48ch50`(aLuT$3u0yf04yBCZU6uP literal 0 HcmV?d00001 diff --git a/wai/live-conformance/links/truncated.wcl1 b/wai/live-conformance/links/truncated.wlk1 similarity index 78% rename from wai/live-conformance/links/truncated.wcl1 rename to wai/live-conformance/links/truncated.wlk1 index c492943a0f49c041969c48ff0b6a0f5770385616..29e68d074b8c6cab2151a154c8b5c54599d4b963 100644 GIT binary patch delta 76 zcmV-S0JHy&1&##+S4>N>155%xb;rC_9vBcU0yRR#nhg882a9TiEAU4PuiggOycg)I iIc2;m=at3dXwt2_{n|o_8j;F}rSwjZEpyq5L;(U@}9f i&VUu`=+N>155%yb;rC_9vBcU0yRR#nhg882a9TiEAU4PuiggOycg)I jIc2;m=at3dXwt2_{n|o_8j;F}rSwjZEpyq5L;(U@}9f j&VUu`=+N>155%y7>^m-{ZI+sJUv`XKZr=XA}ELXIwYSx3&!<(6kb&9 j(BbDU*X#`+yg`_|klfOR)!TGZ&s>wNAF`#9y+{85!kZ($ delta 77 zcmV-T0J8s&1&;*-S3^v(155%y6Lfofcqhj8tX-;^N-0-^fY9%cF4+jNb=M!5;;=en ju=W*KwdSMPt_$*ypbln%o8v5+$Jf;>a=ZKN>0}uj0(WdY=Ub}e?-D=aM`n9!FkbqZV2F=!!zwg}K)nYPV jaBiXV+y}Hl1Z25EQ}_f46puE3eBLs7y-|l+q4dxTj$b87 delta 77 zcmV-T0J8tn1k(fqS3^v(0}uj0uK1}h6Zc{di#{N6!+0+ZS{awe+ou0Idx!y!)!B#9jq diff --git a/wai/live-conformance/links/unknown_version.wcl1 b/wai/live-conformance/links/unknown_version.wcl1 deleted file mode 100644 index a676091fbd2441ff9070edf6dd3c6562ed2695c3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 655 zcmWG{_Az7<K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkYD`6hzmH8$a=UiY4C-c$9+aCcs3ug}Y~3;&qsCKx%d nIM*Qh`o*=3`~~mjxF5!?&NN=YuNQt-eD#u3{|r=)?B@gko4UmX diff --git a/wai/live-conformance/links/unknown_version.wlk1 b/wai/live-conformance/links/unknown_version.wlk1 new file mode 100644 index 0000000000000000000000000000000000000000..1defcec37d7712fa45f287992437a8da1fb5a638 GIT binary patch literal 655 zcmWId@it@<K8qMtMJw(V#Wk+^GgJ+_p!&ObbN%)k zO50D@u3-w3+?jYK^VwbjmY)8Ey=rH-dEI6IyMC&`Ezh`*MKuyaXC06HH8b#XPHkU# z`Yk^L#On+UPu_C-ym0(k)38E5{K=W46Kz)e9DARUvSBM{eu4%^ge%b9&d_iI`4i?> zPpB9yj6k#>k{C=p5-J9AKFkZH$M=NFNeJjNnK~Vv#q)a?dv{ig_6K+F_4n9r>=A#l n$})A2*7K=HA7@-zyZi4gr%vgqw>48ch50`(aLuT$3t|QUYbwKU literal 0 HcmV?d00001 diff --git a/wai/live-conformance/links/vectors.json b/wai/live-conformance/links/vectors.json index 50556bf86..425ab8972 100644 --- a/wai/live-conformance/links/vectors.json +++ b/wai/live-conformance/links/vectors.json @@ -17,9 +17,9 @@ ], "vectors": [ { - "digest": "5cc1535476d42709b31643409dd1078484963cc6e38c973bad37e6413ee3278c", + "digest": "a5d6c2b598610a96191a37dd049fa1f1b774142a4f57b86d5b787f4fd135d465", "files": [ - "srt_listener_clean.wcl1" + "srt_listener_clean.wlk1" ], "kind": "part", "name": "srt_listener_clean", @@ -45,9 +45,9 @@ } }, { - "digest": "ebf32e01c2ad06441e573c0e8506602be52abd222170b09dc44bdcd85aaffa7e", + "digest": "a8f1966aed84ab2153c5d0a7dd3f1fdfbabe08847d7c30674b39473c1282f7df", "files": [ - "srt_recovered.wcl1" + "srt_recovered.wlk1" ], "kind": "part", "name": "srt_recovered", @@ -73,9 +73,9 @@ } }, { - "digest": "ea851e5651b0b68723d22e0996618eeb8166f2b1bc45815767cbfbdba6ad5829", + "digest": "0a8cfad3a410a2071d36ada160872eb18ca648d05e5cf2cafdb0d7a613c91ca9", "files": [ - "srt_last_outstanding.wcl1" + "srt_last_outstanding.wlk1" ], "kind": "part", "name": "srt_last_outstanding", @@ -101,9 +101,9 @@ } }, { - "digest": "21ed51a4b79ec2d86233683b9ff9c19ad61e4b449c0910a2e2e02d2efe55c34d", + "digest": "08781b0991e605e199019c84ea0f0b5c54c7b4dc38e47a20c0246b43f561d1c1", "files": [ - "rist_simple.wcl1" + "rist_simple.wlk1" ], "kind": "part", "name": "rist_simple", @@ -129,9 +129,9 @@ } }, { - "digest": "92d3a4fda607d02fae34a9222e923e981e83b823df8d8de6ae7eb5c07c37bed1", + "digest": "39d08881c7b2eda1a17023a713bb83a78b65a183172386098ce5dd4301da3d68", "files": [ - "rist_main_psk256.wcl1" + "rist_main_psk256.wlk1" ], "kind": "part", "name": "rist_main_psk256", @@ -157,9 +157,9 @@ } }, { - "digest": "3f96e8549fc72865290e5b1f7e2b96b1a7224619a338336b7da76636c4935fea", + "digest": "21e4a0b1ef6f31e4f2be3472370a3314e15741271eb85d793de30696ed3efb42", "files": [ - "srt_caller_aes192.wcl1" + "srt_caller_aes192.wlk1" ], "kind": "part", "name": "srt_caller_aes192", @@ -185,9 +185,9 @@ } }, { - "digest": "5083887d3d099fc55b55d4a2744837ecc7ca1b4a5f522df341e74a63ce3d5f30", + "digest": "ecdceee1052cba16c818a9d6bafc02cd24dc3af8feda1d980bcea0394f115991", "files": [ - "tracks_not_begun.wcl1" + "tracks_not_begun.wlk1" ], "kind": "part", "name": "tracks_not_begun", @@ -213,9 +213,9 @@ } }, { - "digest": "a8a01e673ce99aefddcef7aa8602b5e0e7ba6e6b113c490d59650c0dd3089a71", + "digest": "ab3c8f287643436d1aa81658b0570b4e11afdad85975e4e7a1465161a73d88de", "files": [ - "runs_truncated.wcl1" + "runs_truncated.wlk1" ], "kind": "part", "name": "runs_truncated", @@ -242,7 +242,7 @@ }, { "files": [ - "too_large.wcl1" + "too_large.wlk1" ], "kind": "part", "name": "too_large", @@ -252,7 +252,7 @@ }, { "files": [ - "truncated.wcl1" + "truncated.wlk1" ], "kind": "part", "name": "truncated", @@ -262,17 +262,27 @@ }, { "files": [ - "bad_magic.wcl1" + "bad_magic.wlk1" ], "kind": "part", "name": "bad_magic", - "note": "not WCL1", + "note": "not WLK1", "outcome": "refuse", "reason": "malformed" }, { "files": [ - "trailing_byte.wcl1" + "clip_record_magic.wlk1" + ], + "kind": "part", + "name": "clip_record_magic", + "note": "the clip record's magic, WCL1 (live-recording §5.1)", + "outcome": "refuse", + "reason": "malformed" + }, + { + "files": [ + "trailing_byte.wlk1" ], "kind": "part", "name": "trailing_byte", @@ -282,7 +292,7 @@ }, { "files": [ - "unknown_version.wcl1" + "unknown_version.wlk1" ], "kind": "part", "name": "unknown_version", @@ -292,7 +302,7 @@ }, { "files": [ - "bad_key.wcl1" + "bad_key.wlk1" ], "kind": "part", "name": "bad_key", @@ -302,7 +312,7 @@ }, { "files": [ - "bad_signature.wcl1" + "bad_signature.wlk1" ], "kind": "part", "name": "bad_signature", @@ -312,7 +322,7 @@ }, { "files": [ - "altered_count.wcl1" + "altered_count.wlk1" ], "kind": "part", "name": "altered_count", @@ -322,7 +332,7 @@ }, { "files": [ - "protocol_unknown.wcl1" + "protocol_unknown.wlk1" ], "kind": "part", "name": "protocol_unknown", @@ -332,7 +342,7 @@ }, { "files": [ - "mode_unknown.wcl1" + "mode_unknown.wlk1" ], "kind": "part", "name": "mode_unknown", @@ -342,7 +352,7 @@ }, { "files": [ - "rist_simple_encrypted.wcl1" + "rist_simple_encrypted.wlk1" ], "kind": "part", "name": "rist_simple_encrypted", @@ -352,7 +362,7 @@ }, { "files": [ - "rist_main_aes192.wcl1" + "rist_main_aes192.wlk1" ], "kind": "part", "name": "rist_main_aes192", @@ -362,7 +372,7 @@ }, { "files": [ - "srt_cipher_100.wcl1" + "srt_cipher_100.wlk1" ], "kind": "part", "name": "srt_cipher_100", @@ -372,7 +382,7 @@ }, { "files": [ - "last_without_reason.wcl1" + "last_without_reason.wlk1" ], "kind": "part", "name": "last_without_reason", @@ -382,7 +392,7 @@ }, { "files": [ - "reason_without_last.wcl1" + "reason_without_last.wlk1" ], "kind": "part", "name": "reason_without_last", @@ -392,7 +402,7 @@ }, { "files": [ - "reason_unknown.wcl1" + "reason_unknown.wlk1" ], "kind": "part", "name": "reason_unknown", @@ -402,7 +412,7 @@ }, { "files": [ - "empty_span.wcl1" + "empty_span.wlk1" ], "kind": "part", "name": "empty_span", @@ -412,7 +422,7 @@ }, { "files": [ - "no_window.wcl1" + "no_window.wlk1" ], "kind": "part", "name": "no_window", @@ -422,7 +432,7 @@ }, { "files": [ - "first_part_with_parent.wcl1" + "first_part_with_parent.wlk1" ], "kind": "part", "name": "first_part_with_parent", @@ -432,7 +442,7 @@ }, { "files": [ - "later_part_without_parent.wcl1" + "later_part_without_parent.wlk1" ], "kind": "part", "name": "later_part_without_parent", @@ -442,7 +452,7 @@ }, { "files": [ - "tracks_unsorted.wcl1" + "tracks_unsorted.wlk1" ], "kind": "part", "name": "tracks_unsorted", @@ -452,7 +462,7 @@ }, { "files": [ - "track_head_without_groups.wcl1" + "track_head_without_groups.wlk1" ], "kind": "part", "name": "track_head_without_groups", @@ -462,7 +472,7 @@ }, { "files": [ - "track_zero_digest.wcl1" + "track_zero_digest.wlk1" ], "kind": "part", "name": "track_zero_digest", @@ -472,7 +482,7 @@ }, { "files": [ - "count_mismatch.wcl1" + "count_mismatch.wlk1" ], "kind": "part", "name": "count_mismatch", @@ -482,7 +492,7 @@ }, { "files": [ - "first_try_over_delivered.wcl1" + "first_try_over_delivered.wlk1" ], "kind": "part", "name": "first_try_over_delivered", @@ -492,7 +502,7 @@ }, { "files": [ - "outstanding_not_last.wcl1" + "outstanding_not_last.wlk1" ], "kind": "part", "name": "outstanding_not_last", @@ -502,7 +512,7 @@ }, { "files": [ - "recovery_samples.wcl1" + "recovery_samples.wlk1" ], "kind": "part", "name": "recovery_samples", @@ -512,7 +522,7 @@ }, { "files": [ - "rtt_disordered.wcl1" + "rtt_disordered.wlk1" ], "kind": "part", "name": "rtt_disordered", @@ -522,7 +532,7 @@ }, { "files": [ - "rtt_empty_with_figures.wcl1" + "rtt_empty_with_figures.wlk1" ], "kind": "part", "name": "rtt_empty_with_figures", @@ -532,7 +542,7 @@ }, { "files": [ - "margin_past_window.wcl1" + "margin_past_window.wlk1" ], "kind": "part", "name": "margin_past_window", @@ -542,7 +552,7 @@ }, { "files": [ - "requested_below_requests.wcl1" + "requested_below_requests.wlk1" ], "kind": "part", "name": "requested_below_requests", @@ -552,7 +562,7 @@ }, { "files": [ - "runs_overlap.wcl1" + "runs_overlap.wlk1" ], "kind": "part", "name": "runs_overlap", @@ -562,7 +572,7 @@ }, { "files": [ - "run_outside.wcl1" + "run_outside.wlk1" ], "kind": "part", "name": "run_outside", @@ -572,7 +582,7 @@ }, { "files": [ - "run_empty.wcl1" + "run_empty.wlk1" ], "kind": "part", "name": "run_empty", @@ -582,7 +592,7 @@ }, { "files": [ - "run_overfull.wcl1" + "run_overfull.wlk1" ], "kind": "part", "name": "run_overfull", @@ -592,7 +602,7 @@ }, { "files": [ - "runs_short.wcl1" + "runs_short.wlk1" ], "kind": "part", "name": "runs_short", @@ -602,7 +612,7 @@ }, { "files": [ - "truncated_not_full.wcl1" + "truncated_not_full.wlk1" ], "kind": "part", "name": "truncated_not_full", @@ -612,7 +622,7 @@ }, { "files": [ - "run_overfull_alone.wcl1" + "run_overfull_alone.wlk1" ], "kind": "part", "name": "run_overfull_alone", @@ -622,7 +632,7 @@ }, { "files": [ - "recovery_disordered.wcl1" + "recovery_disordered.wlk1" ], "kind": "part", "name": "recovery_disordered", @@ -632,7 +642,7 @@ }, { "files": [ - "recovery_empty_with_figures.wcl1" + "recovery_empty_with_figures.wlk1" ], "kind": "part", "name": "recovery_empty_with_figures", @@ -642,7 +652,7 @@ }, { "files": [ - "tracks_past_bound.wcl1" + "tracks_past_bound.wlk1" ], "kind": "part", "name": "tracks_past_bound", @@ -652,7 +662,7 @@ }, { "files": [ - "runs_past_bound.wcl1" + "runs_past_bound.wlk1" ], "kind": "part", "name": "runs_past_bound", @@ -662,7 +672,7 @@ }, { "files": [ - "last_byte_two.wcl1" + "last_byte_two.wlk1" ], "kind": "part", "name": "last_byte_two", @@ -672,7 +682,7 @@ }, { "files": [ - "truncated_byte_two.wcl1" + "truncated_byte_two.wlk1" ], "kind": "part", "name": "truncated_byte_two", @@ -682,7 +692,7 @@ }, { "files": [ - "small_order_r.wcl1" + "small_order_r.wlk1" ], "kind": "part", "name": "small_order_r", @@ -692,7 +702,7 @@ }, { "files": [ - "margin_without_recovery.wcl1" + "margin_without_recovery.wlk1" ], "kind": "part", "name": "margin_without_recovery", @@ -701,9 +711,9 @@ "reason": "account_invalid" }, { - "digest": "a446a02d0a5566f3967dc8137005a1403eebabb29a6a378998bb35bfc6420c7d", + "digest": "950215c0432843c0acf4c1ba3616a430773a59e73158ae8bf1b59f83dcbb05de", "files": [ - "two_dropped.wcl1" + "two_dropped.wlk1" ], "kind": "part", "name": "two_dropped", @@ -730,7 +740,7 @@ }, { "files": [ - "bytes_without_delivery.wcl1" + "bytes_without_delivery.wlk1" ], "kind": "part", "name": "bytes_without_delivery", @@ -740,14 +750,14 @@ }, { "digests": [ - "ebf32e01c2ad06441e573c0e8506602be52abd222170b09dc44bdcd85aaffa7e", - "c46bca400aa3c9c103a62994eed84d938c6e51082f6898aecee8f272350d32ce", - "b281373cbf176c52ec7ab873b9da8bdb6cd58c1167fb1f4e72218b7a6273cbdc" + "a8f1966aed84ab2153c5d0a7dd3f1fdfbabe08847d7c30674b39473c1282f7df", + "0645d19776ea12ed4b540904c6c969c441fe9aeb90c7cbdd4e92ff2b143749a2", + "a51671b15792e2c2f57dee35f2fc08f086113d7f1f9dd25e8816035494d6bb1a" ], "files": [ - "series_three_parts.0.wcl1", - "series_three_parts.1.wcl1", - "series_three_parts.2.wcl1" + "series_three_parts.0.wlk1", + "series_three_parts.1.wlk1", + "series_three_parts.2.wlk1" ], "kind": "series", "name": "series_three_parts", @@ -813,8 +823,8 @@ { "at": 0, "files": [ - "series_starts_late.0.wcl1", - "series_starts_late.1.wcl1" + "series_starts_late.0.wlk1", + "series_starts_late.1.wlk1" ], "kind": "series", "name": "series_starts_late", @@ -825,9 +835,9 @@ { "at": 1, "files": [ - "series_wrong_parent.0.wcl1", - "series_wrong_parent.1.wcl1", - "series_wrong_parent.2.wcl1" + "series_wrong_parent.0.wlk1", + "series_wrong_parent.1.wlk1", + "series_wrong_parent.2.wlk1" ], "kind": "series", "name": "series_wrong_parent", @@ -838,9 +848,9 @@ { "at": 2, "files": [ - "series_skips_a_part.0.wcl1", - "series_skips_a_part.1.wcl1", - "series_skips_a_part.2.wcl1" + "series_skips_a_part.0.wlk1", + "series_skips_a_part.1.wlk1", + "series_skips_a_part.2.wlk1" ], "kind": "series", "name": "series_skips_a_part", @@ -851,8 +861,8 @@ { "at": 1, "files": [ - "series_other_session.0.wcl1", - "series_other_session.1.wcl1" + "series_other_session.0.wlk1", + "series_other_session.1.wlk1" ], "kind": "series", "name": "series_other_session", @@ -863,8 +873,8 @@ { "at": 1, "files": [ - "series_head_moved_without_groups.0.wcl1", - "series_head_moved_without_groups.1.wcl1" + "series_head_moved_without_groups.0.wlk1", + "series_head_moved_without_groups.1.wlk1" ], "kind": "series", "name": "series_head_moved_without_groups", @@ -875,8 +885,8 @@ { "at": 1, "files": [ - "series_track_dropped.0.wcl1", - "series_track_dropped.1.wcl1" + "series_track_dropped.0.wlk1", + "series_track_dropped.1.wlk1" ], "kind": "series", "name": "series_track_dropped", @@ -887,8 +897,8 @@ { "at": 1, "files": [ - "series_part_after_last.0.wcl1", - "series_part_after_last.1.wcl1" + "series_part_after_last.0.wlk1", + "series_part_after_last.1.wlk1" ], "kind": "series", "name": "series_part_after_last", @@ -899,8 +909,8 @@ { "at": 1, "files": [ - "series_sequence_gap.0.wcl1", - "series_sequence_gap.1.wcl1" + "series_sequence_gap.0.wlk1", + "series_sequence_gap.1.wlk1" ], "kind": "series", "name": "series_sequence_gap", @@ -911,8 +921,8 @@ { "at": 1, "files": [ - "series_time_gap.0.wcl1", - "series_time_gap.1.wcl1" + "series_time_gap.0.wlk1", + "series_time_gap.1.wlk1" ], "kind": "series", "name": "series_time_gap", @@ -923,8 +933,8 @@ { "at": 1, "files": [ - "series_other_hop.0.wcl1", - "series_other_hop.1.wcl1" + "series_other_hop.0.wlk1", + "series_other_hop.1.wlk1" ], "kind": "series", "name": "series_other_hop", @@ -935,8 +945,8 @@ { "at": 1, "files": [ - "series_other_room.0.wcl1", - "series_other_room.1.wcl1" + "series_other_room.0.wlk1", + "series_other_room.1.wlk1" ], "kind": "series", "name": "series_other_room", @@ -947,8 +957,8 @@ { "at": 1, "files": [ - "series_other_principal.0.wcl1", - "series_other_principal.1.wcl1" + "series_other_principal.0.wlk1", + "series_other_principal.1.wlk1" ], "kind": "series", "name": "series_other_principal", @@ -959,8 +969,8 @@ { "at": 1, "files": [ - "series_other_grant.0.wcl1", - "series_other_grant.1.wcl1" + "series_other_grant.0.wlk1", + "series_other_grant.1.wlk1" ], "kind": "series", "name": "series_other_grant", @@ -971,8 +981,8 @@ { "at": 1, "files": [ - "series_other_protocol.0.wcl1", - "series_other_protocol.1.wcl1" + "series_other_protocol.0.wlk1", + "series_other_protocol.1.wlk1" ], "kind": "series", "name": "series_other_protocol", @@ -983,8 +993,8 @@ { "at": 1, "files": [ - "series_other_mode.0.wcl1", - "series_other_mode.1.wcl1" + "series_other_mode.0.wlk1", + "series_other_mode.1.wlk1" ], "kind": "series", "name": "series_other_mode", @@ -995,8 +1005,8 @@ { "at": 1, "files": [ - "series_other_cipher.0.wcl1", - "series_other_cipher.1.wcl1" + "series_other_cipher.0.wlk1", + "series_other_cipher.1.wlk1" ], "kind": "series", "name": "series_other_cipher", @@ -1007,8 +1017,8 @@ { "at": 1, "files": [ - "series_other_window.0.wcl1", - "series_other_window.1.wcl1" + "series_other_window.0.wlk1", + "series_other_window.1.wlk1" ], "kind": "series", "name": "series_other_window", @@ -1019,8 +1029,8 @@ { "at": 1, "files": [ - "series_track_alias_changed.0.wcl1", - "series_track_alias_changed.1.wcl1" + "series_track_alias_changed.0.wlk1", + "series_track_alias_changed.1.wlk1" ], "kind": "series", "name": "series_track_alias_changed", @@ -1030,14 +1040,14 @@ }, { "digests": [ - "ebf32e01c2ad06441e573c0e8506602be52abd222170b09dc44bdcd85aaffa7e", - "74a07b60ada43de0c44f22dfe3e0eab42fcb8167a9f7e1e32479a64235ddfcd1", - "6d142f165bf08fb9710829861ffb971dab0adfa7a18bded95259d604bcc34f37" + "a8f1966aed84ab2153c5d0a7dd3f1fdfbabe08847d7c30674b39473c1282f7df", + "36d657afd9b50a0d97286fbf2dbaee13232d481a12b0cba5ae3612a66540e22e", + "04835ff14f0279fc3cd2340119151438a5864f9d80df6088788530625b8b0ed6" ], "files": [ - "series_track_added.0.wcl1", - "series_track_added.1.wcl1", - "series_track_added.2.wcl1" + "series_track_added.0.wlk1", + "series_track_added.1.wlk1", + "series_track_added.2.wlk1" ], "kind": "series", "name": "series_track_added", diff --git a/wai/live-conformance/live_contribution_verify.py b/wai/live-conformance/live_contribution_verify.py index 923c44057..ef4493478 100644 --- a/wai/live-conformance/live_contribution_verify.py +++ b/wai/live-conformance/live_contribution_verify.py @@ -1,6 +1,6 @@ #!/usr/bin/env python3 """Independent verifier of the contribution link-record corpus (extensions/live-contribution.md -§6, the record `WCL1`, and §7's refusals of it). +§6, the record `WLK1`, and §7's refusals of it). Written from extensions/live-contribution.md alone. It shares no code with the reference implementation (joule-moq-ingest), which generates the corpus, and never runs it. It checks @@ -41,7 +41,8 @@ sys.path.insert(0, os.path.join(HERE, "..", "claim-conformance")) import _ed25519 as ED # noqa: E402 FORMAT = "wai-live-contribution-links/1" -MAGIC = b"WCL1" +MAGIC = b"WLK1" +CLIP_MAGIC = b"WCL1" # live-recording §5.1: the clip record, another record's magic VERSION = 1 DOMAIN = b"wai:contrib-link\x01" # §6.5: the 17 bytes the signature covers before the record FIXED = 415 # §6.7: the fixed fields and the signature @@ -506,7 +507,7 @@ def mutations(records, series): for i in range(min(3, b[runs_at(b)] | b[runs_at(b) + 1] << 8)) for part, off in (("first", 0), ("count", 8), ("recovered", 12), ("dropped", 16))]) each("truncated at every length", lambda b: [("to %d" % n, b[:n]) for n in range(len(b))]) each("a byte appended", lambda b: [("0x00", b + b"\x00"), ("0xff", b + b"\xff")]) - each("the magic changed", lambda b: [("byte %d" % i, flipped(b, i, 0x20)) for i in range(4)] + [("WCL2", b"WCL2" + b[4:])]) + each("the magic changed", lambda b: [("byte %d" % i, flipped(b, i, 0x20)) for i in range(4)] + [("WLK2", b"WLK2" + b[4:]), ("the clip record's", CLIP_MAGIC + b[4:])]) each("the version changed", lambda b: [("to %d" % n, b[:4] + bytes([n]) + b[5:]) for n in (0, 2, 255)]) each("a byte of the hop key changed", lambda b: [("hop[%d]" % i, flipped(b, FIELD_AT["hop"][0] + i, bit)) for i, bit in ((0, 1), (15, 0x10), (31, 0x80))]) each("the record padded past its bound", lambda b: [("to %d" % (MAX_SIZE + 1), b + bytes(MAX_SIZE + 1 - len(b)))]) diff --git a/wai/registry/capabilities.json b/wai/registry/capabilities.json index 4b3c200ab..183e1a6bf 100644 --- a/wai/registry/capabilities.json +++ b/wai/registry/capabilities.json @@ -2968,6 +2968,13 @@ "section": "§6.1", "status": "defined" }, + { + "name": "WLK1", + "kind": "magic", + "document": "extensions/live-contribution.md", + "section": "§6.2", + "status": "defined" + }, { "name": "WLT1", "kind": "magic", diff --git a/wai/wai-rs/src/codecs/registry.rs b/wai/wai-rs/src/codecs/registry.rs index aa4ae47a7..ec75acc21 100644 --- a/wai/wai-rs/src/codecs/registry.rs +++ b/wai/wai-rs/src/codecs/registry.rs @@ -649,6 +649,7 @@ const LIVE_RECORDING: &str = "extensions/live-recording.md"; const TIMED_TEXT: &str = "extensions/timed-text.md"; const LIVE_METERING: &str = "extensions/live-metering.md"; const ENERGY_STEERING: &str = "extensions/energy-steering.md"; +const LIVE_CONTRIBUTION: &str = "extensions/live-contribution.md"; const LIVE_MODERATION: &str = "extensions/live-moderation.md"; const CONFIDENTIALITY: &str = "extensions/confidentiality.md"; const LIVE_MESSAGING: &str = "extensions/live-messaging.md"; @@ -778,6 +779,7 @@ pub const WIRE_IDENTIFIERS: &[WireIdentifier] = &[ wire("WMR1", WireKind::Magic, LIVE_METERING, "§4.1", WireStatus::Defined), wire("WSP1", WireKind::Magic, ENERGY_STEERING, "§3.1", WireStatus::Defined), wire("WSD1", WireKind::Magic, ENERGY_STEERING, "§7.1", WireStatus::Defined), + wire("WLK1", WireKind::Magic, LIVE_CONTRIBUTION, "§6.2", WireStatus::Defined), wire("WMP1", WireKind::Magic, LIVE_MODERATION, "§3.1", WireStatus::Defined), wire("WMS1", WireKind::Magic, LIVE_MODERATION, "§4.2", WireStatus::Defined), wire("WMN1", WireKind::Magic, LIVE_MODERATION, "§5.1", WireStatus::Defined), -- 2.54.0 (Apple Git-157) From 2729806f692ddb9cf3605df4730bd2dc0a9c4fdd Mon Sep 17 00:00:00 2001 From: Transaction Science Date: Tue, 3 Nov 2026 17:11:59 -0500 Subject: [PATCH 2/2] live-recording: a record with the link record's magic, WLK1, is not a clip record MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The link corpus refuses a part that bears the clip record's magic; this adds the reverse. The live-recording corpus gains the clip link_record_magic: chunk 4's clip record beginning WLK1 and signed under it, so the magic is its one defect, refused malformed at the clip (§5.2, which now names WLK1 among the other magics). wai_live_record_vectors writes it; the README lists it. live_record_verify.py requires the same refusal, malformed at the clip, of a copy of each accepted clip given WLK1, so a verifier that reads past the magic to the signature fails. The CHANGELOG entry for WLK1 says so. Co-Authored-By: Claude Opus 5.5 --- wai/CHANGELOG.md | 5 +++ wai/extensions/live-recording.md | 5 +-- wai/live-conformance/live_record_verify.py | 32 ++++++++++++++++++-- wai/live-conformance/recordings/README.md | 10 ++++-- wai/live-conformance/recordings/vectors.json | 28 +++++++++++++++++ wai/wai-rs/src/live_record/corpus.rs | 16 ++++++++++ 6 files changed, 89 insertions(+), 7 deletions(-) diff --git a/wai/CHANGELOG.md b/wai/CHANGELOG.md index be82ac34c..c03bc8204 100644 --- a/wai/CHANGELOG.md +++ b/wai/CHANGELOG.md @@ -20,6 +20,11 @@ wire format may change and such changes are recorded here. file now `.wlk1`, and gains `clip_record_magic`: a part that bears the clip record's magic, refused `malformed`. `live_contribution_verify.py` reads `WLK1`, and requires that a copy of each accepted part given the clip record's magic is refused. `joule-moq-ingest` writes and reads `WLK1` (`linkrec::MAGIC`). +- **The reverse:** a record with the link record's magic is not a clip record. The live-recording corpus + [`live-conformance/recordings/`](live-conformance/recordings/) gains the clip `link_record_magic`: chunk 4's clip + record beginning `WLK1` and signed under it, refused `malformed` at the clip (live-recording §5.2, which now names + `WLK1` among the other magics). `live_record_verify.py` requires the same refusal of a copy of each accepted clip + given `WLK1`. - **Breaking:** the corpus's index names the new files, and the files under the old magic are gone: `record:corpus:wai/live-conformance/links/vectors.json`, `record:corpus:wai/live-conformance/links/altered_count.wcl1`, diff --git a/wai/extensions/live-recording.md b/wai/extensions/live-recording.md index 9cccd9db1..b2948c840 100644 --- a/wai/extensions/live-recording.md +++ b/wai/extensions/live-recording.md @@ -345,8 +345,9 @@ start and `trim_out` at the end; the clip's bytes are its parts'. ### 5.2 Reading and rules A reader reads exactly the bytes it is given, as live-events §3.3 reads a record with -`WCL1` for `WEV1` (`truncated`, `malformed`, `unknown_version`), and refuses a record that -breaks any of these rules as `clip_record_invalid`: +`WCL1` for `WEV1` (`truncated`, `malformed`, `unknown_version`; another magic is +`malformed`, live-contribution §6.2's link record, `WLK1`, among them), and refuses a +record that breaks any of these rules as `clip_record_invalid`: - *k* is 1 to 16, and no take is named by two parts; - in each part, `count` is at least 1; each chunk's `index` is `first` plus its position, diff --git a/wai/live-conformance/live_record_verify.py b/wai/live-conformance/live_record_verify.py index 3d7294db2..4098f77f0 100644 --- a/wai/live-conformance/live_record_verify.py +++ b/wai/live-conformance/live_record_verify.py @@ -21,7 +21,9 @@ alone. Everything else is here: For every vector it requires the outcome, reason and place, and the data the corpus states; of the corpus, that every reason of §9 appears in it, and that every take it says it reuses is capture binding's, byte for byte. Then it mutates copies of the corpus, one defect each, -and requires every copy to fail. +and requires every copy to fail, and requires a copy of each accepted clip whose record +begins with the contribution link record's magic (live-contribution §6.2) to be refused as +`malformed` at the clip. python3 live_record_verify.py @@ -50,6 +52,8 @@ CLIP_DOMAIN = b"wai:live-clip\x01" LEAF_DOMAIN = b"wai:take-leaf\x01" NODE_DOMAIN = b"wai:out-node\x01" TAKE_DOMAIN = b"wai:capture-take\x01" +CLIP_MAGIC = b"WCL1" # §5.1 +LINK_MAGIC = b"WLK1" # live-contribution §6.2: the contribution link record, another record's magic LISTING, MANIFEST_FILE = "LISTING", "recording.wrm" ROOM, EVENTS, TAKE, COMPOSITE = 1, 2, 3, 4 COMPLETE = 1 @@ -551,7 +555,7 @@ def self_test(): def read_clip(b): """§5.1, §5.2: the clip record, or Refuse.""" - read_head(b, b"WCL1") + read_head(b, CLIP_MAGIC) r = Reader(b, 5) c = {"room": r.take(32), "in": r.uint(8), "out": r.uint(8), "parts": []} for _ in range(r.uint(1)): @@ -814,6 +818,27 @@ def mutations(doc): ] +def link_magic_fails(doc): + """A copy of each accepted clip whose record begins with the contribution link record's + magic in place of WCL1: §5.2 reads it as live-events §3.3 does, so it is refused as + `malformed` at the clip, before its signature is read. The failures.""" + fails, n = [], 0 + for v in doc["clips"]: + if v["outcome"] != "accept": + continue + n += 1 + record = LINK_MAGIC.hex() + v["record"][2 * len(CLIP_MAGIC):] + try: + got = verify_clip(dict(v, record=record)) + except Exception as e: # a crash is a failure to refuse it + got = "%s: %s" % (type(e).__name__, e) + if got != {"outcome": "refuse", "reason": "malformed", "at": ["clip"]}: + fails.append("clip %s given the link record's magic: %s" % (v["name"], json.dumps(got)[:160])) + if n == 0: + fails.append("no accepted clip to give the link record's magic") + return fails, n + + def main(corpus_dir): fails = [] st = ED._self_test() @@ -840,6 +865,9 @@ def main(corpus_dir): rf = reuse_fails(doc, takes) print("%s every take the corpus reuses is capture binding's, byte for byte" % ("PASS" if not rf else "FAIL")) fails += rf + lf, n = link_magic_fails(doc) + print("%s mutated copies refused: each of %d accepted clips given the link record's magic, WLK1, is malformed at the clip" % ("PASS" if not lf else "FAIL", n)) + fails += lf for label, mutated in mutations(doc): changed = {k: [v for v, o in zip(mutated[k], doc[k]) if v != o] for k in ("recordings", "clips")} caught = check(changed, quiet=True) if any(changed.values()) else [] diff --git a/wai/live-conformance/recordings/README.md b/wai/live-conformance/recordings/README.md index 6d917f878..37fd6b999 100644 --- a/wai/live-conformance/recordings/README.md +++ b/wai/live-conformance/recordings/README.md @@ -94,9 +94,11 @@ store), here with up to two takes: `missing_chunk`, `spliced_two_takes`, `reordered_chunk`, `altered_chunk`, `extra_chunk`, `uncommitted_head`, `commit_gap`, `commit_malformed`, `take_mismatch`, `device_mismatch`, `clip_wrong_room`, `clip_bad_signature`, `clip_record_invalid`, - `window_not_covered`, `trimmed_window`, `clip_truncated`, and spans of capture binding's + `window_not_covered`, `trimmed_window`, `clip_truncated`, spans of capture binding's defective takes: `commit_late`, `commit_early`, `root_not_extending`, `clock_unstable`, - `capture_discontinuous`, `chunk_too_long` and `commit_chain_broken`. + `capture_discontinuous`, `chunk_too_long` and `commit_chain_broken`, and + `link_record_magic`, a clip record that begins with the contribution link record's magic, + `WLK1` (live-contribution §6.2), signed under it, refused `malformed`. ## Running @@ -119,4 +121,6 @@ and sharing no code with `wai-rs`: it checks range proofs by the extension's rec for a run of one chunk, by RFC 9162 §2.1.3.2's algorithm, verifies each take with `capture_take_verify.py` (which verifies the room with `live_rooms_verify.py`), gives every vector the same outcome, requires the same coverage and reuse, and then mutates copies of -the corpus, one defect each, each of which must fail. Pass = an exit status of 0 from each. +the corpus, one defect each, each of which must fail; a copy of each accepted clip whose +record begins `WLK1` must be refused `malformed` at the clip. Pass = an exit status of 0 +from each. diff --git a/wai/live-conformance/recordings/vectors.json b/wai/live-conformance/recordings/vectors.json index 4f509051d..1e7e15982 100644 --- a/wai/live-conformance/recordings/vectors.json +++ b/wai/live-conformance/recordings/vectors.json @@ -3174,6 +3174,34 @@ "at": [ "clip" ] + }, + { + "name": "link_record_magic", + "about": "chunk 4's clip record beginning with the contribution link record's magic, WLK1 (live-contribution §6.2), and signed under it: another magic (§5.2)", + "descriptor": "5752443101d6b5a6849f61a8bbd9d4db526a9fc1c73ef949590cdcd9b0b65ce6375262d9bd0a29cf514deebfd5ca029b1d658b198bade764af98e09848c6fd53b129678b7200406cd8e95d060040420f0000000000170068747470733a2f2f6c6573736f6e732e6578616d706c650800000003002c0100005745503101fe1f0000000000000000000000000000000000000000000000000000000000000004f4013200000040420f00000000000100000040420f000000000003086469726563746f720101020b1a0f00000000000000000000000000000000000000000000000000000000000009706572666f726d65720301020018110000000000000000000000000000000000000000000000000000000000000861756469656e63650001010018000000000000000000000000000000000000000000000000000000000000000003067370656563680101046f707573000001000000000000100000004000000080bb0000010f056d757369630101046f70757300000100000000000080000000fe01000080bb000002000b63616d6572612d3130383002020d617630312e302e30384d2e30380b617663312e363430303238010003800268011e0096000000f40100000005d0021e00f4010000dc050000800738041e00dc050000a00f000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000011e00d0070000f401000002444546522c74e5c056bb1b6f962b4f7da37965c09b1753128837f7b1667991716b3a291d8f4a5b9303941d108fe20b89be7321d556fc9952d102095aaae736247edc540d", + "record": "574c4b31015f7bde3d64b102ebfb82fb02abbba177fd67bdd1e1766b22969af847746974ca8096980000000000c0d8a7000000000001e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f541f4686756b9083ffac11b1d229c5fc28a7fcd8e318f713ac7d417b930eda03e5c8b70c3a2bcef603d7df6edc44efe9a9dc4f2aa92c7c5fb23414057b21c10e80a000000000000008883ea090e9f374f91bacaac0864af7b6dafa57c4f8a3ac0040ec7fc669f1f2504000000000000000100000000000000000000000000000000000000040000000000000080889e2a01000000c0caad2a010000004400000000000000733b22d5d80b9a80443b60a14334000a8ab43f139364fa9cd3a547e8a7c523640442cf2390e19203569ebbfbb9a4ffedaa69546c681dfb5d0d1aff3c9d1f9437ddd75f76241ecda381c6d8d9232daab10b13803e2fe52ab86871c6bca67199fef3c6cda45663cd175aa9ba5f30289803a8059baa9924a9f919ef40d91902ca7e00b09aef291cbbb9927cefbbb3a26f4c2d4689a03a6b1cc7f938ce9c615890e9ddd6b5a6849f61a8bbd9d4db526a9fc1c73ef949590cdcd9b0b65ce6375262d9bda564b35c1a9a9920ce6547486ef68e47707682dd47f4facd0d908162dea0117c24db60ca4dc915df04763767f140b7c4da6d2709a4c98ee6f123c9fe83da8106", + "parts": [ + { + "device": "e57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5", + "commits": [ + "57455631015f7bde3d64b102ebfb82fb02abbba177fd67bdd1e1766b22969af847746974cae57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f500000000000000000000000000000000000000000000000000000000000000000000000000000000c091210000000000000c7e0041f4686756b9083ffac11b1d229c5fc28a7fcd8e318f713ac7d417b930eda03e00000000010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000efad5feffffff00b225c83a2ca0425ec89b11dd2b1e0ed0e6e7efdd631b6f710d677202d7a0cef1e45393eb7b2bb9cbb81512fb3e06fde8ec83eb80922a929d9c5a54945d38d50e", + "57455631015f7bde3d64b102ebfb82fb02abbba177fd67bdd1e1766b22969af847746974cae57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f50100000000000000d01b2ceb50bf890fd1732ca8571fbc36528777c1700f022f152a107036ad41e6e0a57e0000000000000c7e0041f4686756b9083ffac11b1d229c5fc28a7fcd8e318f713ac7d417b930eda03e0100000002d01b2ceb50bf890fd1732ca8571fbc36528777c1700f022f152a107036ad41e600000000000000000200000000000000880211aa301be185e15a6c1895c2d43367360f1104ca7e72fa3c576cf0437c1b000efad5feffffff004925dc67c54d87781c324edf555bdb731b121cbd675b33fc8cd2701b3b411bb2811310a25be4cb8d5863bbaa9454d63d7424c75c59e30befe4f8b586269ac003", + "57455631015f7bde3d64b102ebfb82fb02abbba177fd67bdd1e1766b22969af847746974cae57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f50200000000000000e66ae4f48b7d7b0f1d68ad2108e1004b82599f70aeefc04750889da9ea5049b0602a9d0000000000000c9e0041f4686756b9083ffac11b1d229c5fc28a7fcd8e318f713ac7d417b930eda03e0200000002e66ae4f48b7d7b0f1d68ad2108e1004b82599f70aeefc04750889da9ea5049b002000000000000000400000000000000c6cda45663cd175aa9ba5f30289803a8059baa9924a9f919ef40d91902ca7e00000efad5feffffff01bbf572927af2d03d45aa66c8f630bda9d29429e07e09a3a3d6c9a8d93332624434d5c46a8ec9252c35de44a3697254601dcbc25dec5af9ed2114f05ac64dacb79637cce6bf3e1a0e651af68894e3b832aeb050ef19ce5853242b441e9a7ebd07", + "57455631015f7bde3d64b102ebfb82fb02abbba177fd67bdd1e1766b22969af847746974cae57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f50300000000000000108de42c4bee54b94f97054909bc94cea6a6a65a2c9eb30090b514a7e4002621e0aebb0000000000000c9e0041f4686756b9083ffac11b1d229c5fc28a7fcd8e318f713ac7d417b930eda03e0300000002108de42c4bee54b94f97054909bc94cea6a6a65a2c9eb30090b514a7e400262104000000000000000600000000000000249f88d1dcac0f7d98b53d89fdbeb22c284ffc97c90ff18a1ee27980e3ce88bd000efad5feffffff01eb6ddc57c1c32eeef5f7ff5f2a73f33e16684a4b4249d3cb0b99f72adb199a218665fd17bff9911efed8a34e7165ddf2aae8d8f94f6fb44156d1c5929ff8186922b9f24e714834b5de5968e07dc0e7e5d4565ad95ef76ecc80b6803e017b6205", + "57455631015f7bde3d64b102ebfb82fb02abbba177fd67bdd1e1766b22969af847746974cae57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f5040000000000000039c62d2ccabc3770a207fa1560cb87d69299f7d78119a46d300a0fcc81251fe46033da0000000000000cde0041f4686756b9083ffac11b1d229c5fc28a7fcd8e318f713ac7d417b930eda03e040000000239c62d2ccabc3770a207fa1560cb87d69299f7d78119a46d300a0fcc81251fe406000000000000000800000000000000cef53df7a17ba27234381bf4fb47ad712b9f2aab80d4f837db1155d18af26a55000efad5feffffff03eb6ddc57c1c32eeef5f7ff5f2a73f33e16684a4b4249d3cb0b99f72adb199a21d75f76241ecda381c6d8d9232daab10b13803e2fe52ab86871c6bca67199fef3c6cda45663cd175aa9ba5f30289803a8059baa9924a9f919ef40d91902ca7e00ee5e6803bd5d5229a44bc456a97836a6bb5365652b2a68a6f570dfc0451a1fb0fd86776b39cc3bfed05f80580257a8142429100ac7f6635136afca694e9dc005", + "57455631015f7bde3d64b102ebfb82fb02abbba177fd67bdd1e1766b22969af847746974cae57d3fbe7257b2118009296bf654b41c7823e730f86568799b01b442d7a300f505000000000000008967cc4ff845c3efd0139b621aa7202a890aaac2ad7e6978a6c725c0a0acc2ad803efa0000000000000c9e0041f4686756b9083ffac11b1d229c5fc28a7fcd8e318f713ac7d417b930eda03e05000000038967cc4ff845c3efd0139b621aa7202a890aaac2ad7e6978a6c725c0a0acc2ad08000000000000000a000000000000008883ea090e9f374f91bacaac0864af7b6dafa57c4f8a3ac0040ec7fc669f1f25000efad5feffffff01b09aef291cbbb9927cefbbb3a26f4c2d4689a03a6b1cc7f938ce9c615890e9dd4393ecb00dac808558942659c01f4b61f0abc468ff7dd55a14b8002cb0a5f4da016d9a2f03e1592b1ce19f95b2bc7086380ecc92f6745a0e4e758b79041cee0d" + ], + "bytes": [ + "65417e62fa739f4aff802db45b951d3e527b30dba413fe4cc2666addb28654cd04ae27cff61f094e86bb995a4dd954641b9f66b8a6e9b327aa384ed9155a97bd55619f43" + ], + "take_vector": "lesson" + } + ], + "outcome": "refuse", + "reason": "malformed", + "at": [ + "clip" + ] } ] } diff --git a/wai/wai-rs/src/live_record/corpus.rs b/wai/wai-rs/src/live_record/corpus.rs index 476b46825..873dd2036 100644 --- a/wai/wai-rs/src/live_record/corpus.rs +++ b/wai/wai-rs/src/live_record/corpus.rs @@ -1126,6 +1126,22 @@ fn clip_vectors() -> Vec { let mut b = c.to_bytes(); b.truncate(b.len() - 1); out.push(cv("clip_truncated", "a clip record one byte short (§5.1)", &lesson, b, i, ClipIntent::Refuse("clip", TRUNCATED))); + // The contribution link record's magic on a clip record, signed again under it, so the + // magic is the one defect: a reader refuses it before it reads the signature. + let (c, i) = one(&lesson, 0, 4, 1, lv); + let mut b = c.to_bytes(); + b[..4].copy_from_slice(b"WLK1"); + let l = b.len(); + let sig = sign(&key(AUTHORITY), CLIP_DOMAIN, &b[..l - 64]); + b[l - 64..].copy_from_slice(&sig); + out.push(cv( + "link_record_magic", + "chunk 4's clip record beginning with the contribution link record's magic, WLK1 (live-contribution §6.2), and signed under it: another magic (§5.2)", + &lesson, + b, + i, + ClipIntent::Refuse("clip", MALFORMED), + )); out } -- 2.54.0 (Apple Git-157)