wai/extensions/live-contribution.md profiles SRT and RIST onto a room's tracks through the ingest gateway: the one-time session resource, the listener's checks and codes, the gateway calling, RIST's port, CNAME and PSK; the transports as the gateway runs them; the transport stream onto the tracks; and the link record WCL1, its account, parts and chain, how a part and a series are verified, the size bound, the refusals, and the RIST texts' patent notices. live-conformance/live_contribution_verify.py is written from that text alone, standard library only, with mutation runs and dropped-check runs. The corpus gains vectors that isolate each check the verifier found uncovered. Interop with the reference tools, run locally as test peers (ignored unless named by environment variables): their SRT caller and listener and RIST sender and receiver of both profiles against joule-contrib, and their SRT caller and RIST sender into the gateway with an encoder's H.264, HEVC and AAC, through lossy paths. Two fixes they found: an SRT recovery margin is held to the window, and no part is cut before the first sequence number resolves. Co-Authored-By: Claude Opus 5.5 <[email protected]>
1104 lines
26 KiB
JSON
1104 lines
26 KiB
JSON
{
|
|
"format": "wai-live-contribution-links/1",
|
|
"hop": "ed6a47a39da869b5446155e40b2d93f1e3f0167be26732bae7a3ef9d8e3a3fd3",
|
|
"hop_seed": "5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c5c",
|
|
"reasons": [
|
|
"record_too_large",
|
|
"truncated",
|
|
"malformed",
|
|
"unknown_version",
|
|
"bad_key",
|
|
"bad_signature",
|
|
"link_invalid",
|
|
"account_invalid",
|
|
"runs_invalid",
|
|
"chain_broken",
|
|
"sequence_gap"
|
|
],
|
|
"vectors": [
|
|
{
|
|
"digest": "5cc1535476d42709b31643409dd1078484963cc6e38c973bad37e6413ee3278c",
|
|
"files": [
|
|
"srt_listener_clean.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "srt_listener_clean",
|
|
"note": "SRT, the gateway listening, AES-128: every packet at the first try",
|
|
"outcome": "accept",
|
|
"summary": {
|
|
"bytes": 52640,
|
|
"cipher": 128,
|
|
"delivered": 40,
|
|
"dropped": 0,
|
|
"ended": 0,
|
|
"first_try": 40,
|
|
"last": false,
|
|
"mode": 1,
|
|
"outstanding": 0,
|
|
"part": 0,
|
|
"protocol": 1,
|
|
"recovered": 0,
|
|
"runs": 0,
|
|
"seq_count": 40,
|
|
"seq_first": 42,
|
|
"size": 575
|
|
}
|
|
},
|
|
{
|
|
"digest": "ebf32e01c2ad06441e573c0e8506602be52abd222170b09dc44bdcd85aaffa7e",
|
|
"files": [
|
|
"srt_recovered.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "srt_recovered",
|
|
"note": "SRT: losses found and recovered within the window, one dropped",
|
|
"outcome": "accept",
|
|
"summary": {
|
|
"bytes": 40796,
|
|
"cipher": 128,
|
|
"delivered": 31,
|
|
"dropped": 1,
|
|
"ended": 0,
|
|
"first_try": 25,
|
|
"last": false,
|
|
"mode": 1,
|
|
"outstanding": 0,
|
|
"part": 0,
|
|
"protocol": 1,
|
|
"recovered": 6,
|
|
"runs": 4,
|
|
"seq_count": 32,
|
|
"seq_first": 1000000,
|
|
"size": 655
|
|
}
|
|
},
|
|
{
|
|
"digest": "ea851e5651b0b68723d22e0996618eeb8166f2b1bc45815767cbfbdba6ad5829",
|
|
"files": [
|
|
"srt_last_outstanding.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "srt_last_outstanding",
|
|
"note": "a session of one part, its last: three sequence numbers outstanding when the caller shut down",
|
|
"outcome": "accept",
|
|
"summary": {
|
|
"bytes": 9212,
|
|
"cipher": 0,
|
|
"delivered": 7,
|
|
"dropped": 0,
|
|
"ended": 1,
|
|
"first_try": 6,
|
|
"last": true,
|
|
"mode": 1,
|
|
"outstanding": 3,
|
|
"part": 0,
|
|
"protocol": 1,
|
|
"recovered": 1,
|
|
"runs": 3,
|
|
"seq_count": 10,
|
|
"seq_first": 7,
|
|
"size": 635
|
|
}
|
|
},
|
|
{
|
|
"digest": "21ed51a4b79ec2d86233683b9ff9c19ad61e4b449c0910a2e2e02d2efe55c34d",
|
|
"files": [
|
|
"rist_simple.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "rist_simple",
|
|
"note": "RIST Simple Profile, in the clear (the profile has no encryption)",
|
|
"outcome": "accept",
|
|
"summary": {
|
|
"bytes": 19740,
|
|
"cipher": 0,
|
|
"delivered": 15,
|
|
"dropped": 1,
|
|
"ended": 0,
|
|
"first_try": 11,
|
|
"last": false,
|
|
"mode": 1,
|
|
"outstanding": 0,
|
|
"part": 0,
|
|
"protocol": 2,
|
|
"recovered": 4,
|
|
"runs": 2,
|
|
"seq_count": 16,
|
|
"seq_first": 65536,
|
|
"size": 615
|
|
}
|
|
},
|
|
{
|
|
"digest": "92d3a4fda607d02fae34a9222e923e981e83b823df8d8de6ae7eb5c07c37bed1",
|
|
"files": [
|
|
"rist_main_psk256.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "rist_main_psk256",
|
|
"note": "RIST Main Profile under PSK with a 256-bit key",
|
|
"outcome": "accept",
|
|
"summary": {
|
|
"bytes": 13160,
|
|
"cipher": 256,
|
|
"delivered": 10,
|
|
"dropped": 0,
|
|
"ended": 0,
|
|
"first_try": 8,
|
|
"last": false,
|
|
"mode": 1,
|
|
"outstanding": 0,
|
|
"part": 0,
|
|
"protocol": 3,
|
|
"recovered": 2,
|
|
"runs": 2,
|
|
"seq_count": 10,
|
|
"seq_first": 70000,
|
|
"size": 615
|
|
}
|
|
},
|
|
{
|
|
"digest": "3f96e8549fc72865290e5b1f7e2b96b1a7224619a338336b7da76636c4935fea",
|
|
"files": [
|
|
"srt_caller_aes192.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "srt_caller_aes192",
|
|
"note": "SRT, the gateway calling the publisher's listener, AES-192",
|
|
"outcome": "accept",
|
|
"summary": {
|
|
"bytes": 13160,
|
|
"cipher": 192,
|
|
"delivered": 10,
|
|
"dropped": 0,
|
|
"ended": 0,
|
|
"first_try": 9,
|
|
"last": false,
|
|
"mode": 2,
|
|
"outstanding": 0,
|
|
"part": 0,
|
|
"protocol": 1,
|
|
"recovered": 1,
|
|
"runs": 1,
|
|
"seq_count": 10,
|
|
"seq_first": 9,
|
|
"size": 595
|
|
}
|
|
},
|
|
{
|
|
"digest": "5083887d3d099fc55b55d4a2744837ecc7ca1b4a5f522df341e74a63ce3d5f30",
|
|
"files": [
|
|
"tracks_not_begun.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "tracks_not_begun",
|
|
"note": "no group signed yet on either track: each head zero",
|
|
"outcome": "accept",
|
|
"summary": {
|
|
"bytes": 3948,
|
|
"cipher": 128,
|
|
"delivered": 3,
|
|
"dropped": 0,
|
|
"ended": 0,
|
|
"first_try": 3,
|
|
"last": false,
|
|
"mode": 1,
|
|
"outstanding": 0,
|
|
"part": 0,
|
|
"protocol": 1,
|
|
"recovered": 0,
|
|
"runs": 0,
|
|
"seq_count": 3,
|
|
"seq_first": 5,
|
|
"size": 575
|
|
}
|
|
},
|
|
{
|
|
"digest": "a8a01e673ce99aefddcef7aa8602b5e0e7ba6e6b113c490d59650c0dd3089a71",
|
|
"files": [
|
|
"runs_truncated.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "runs_truncated",
|
|
"note": "more loss runs than a part lists: the first 512, marked truncated, the sums at most the part's",
|
|
"outcome": "accept",
|
|
"summary": {
|
|
"bytes": 1452864,
|
|
"cipher": 128,
|
|
"delivered": 1104,
|
|
"dropped": 0,
|
|
"ended": 0,
|
|
"first_try": 552,
|
|
"last": false,
|
|
"mode": 1,
|
|
"outstanding": 0,
|
|
"part": 0,
|
|
"protocol": 1,
|
|
"recovered": 552,
|
|
"runs": 512,
|
|
"seq_count": 1104,
|
|
"seq_first": 100,
|
|
"size": 10815
|
|
}
|
|
},
|
|
{
|
|
"files": [
|
|
"too_large.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "too_large",
|
|
"note": "one byte past the largest record",
|
|
"outcome": "refuse",
|
|
"reason": "record_too_large"
|
|
},
|
|
{
|
|
"files": [
|
|
"truncated.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "truncated",
|
|
"note": "the signature's last byte missing",
|
|
"outcome": "refuse",
|
|
"reason": "truncated"
|
|
},
|
|
{
|
|
"files": [
|
|
"bad_magic.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "bad_magic",
|
|
"note": "not WCL1",
|
|
"outcome": "refuse",
|
|
"reason": "malformed"
|
|
},
|
|
{
|
|
"files": [
|
|
"trailing_byte.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "trailing_byte",
|
|
"note": "a byte after the signature",
|
|
"outcome": "refuse",
|
|
"reason": "malformed"
|
|
},
|
|
{
|
|
"files": [
|
|
"unknown_version.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "unknown_version",
|
|
"note": "version 2",
|
|
"outcome": "refuse",
|
|
"reason": "unknown_version"
|
|
},
|
|
{
|
|
"files": [
|
|
"bad_key.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "bad_key",
|
|
"note": "the hop's key is the identity point, of small order",
|
|
"outcome": "refuse",
|
|
"reason": "bad_key"
|
|
},
|
|
{
|
|
"files": [
|
|
"bad_signature.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "bad_signature",
|
|
"note": "a bit of the signature flipped",
|
|
"outcome": "refuse",
|
|
"reason": "bad_signature"
|
|
},
|
|
{
|
|
"files": [
|
|
"altered_count.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "altered_count",
|
|
"note": "a count changed after signing",
|
|
"outcome": "refuse",
|
|
"reason": "bad_signature"
|
|
},
|
|
{
|
|
"files": [
|
|
"protocol_unknown.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "protocol_unknown",
|
|
"note": "protocol 4",
|
|
"outcome": "refuse",
|
|
"reason": "link_invalid"
|
|
},
|
|
{
|
|
"files": [
|
|
"mode_unknown.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "mode_unknown",
|
|
"note": "mode 3",
|
|
"outcome": "refuse",
|
|
"reason": "link_invalid"
|
|
},
|
|
{
|
|
"files": [
|
|
"rist_simple_encrypted.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "rist_simple_encrypted",
|
|
"note": "the Simple Profile has no encryption, yet the cipher is 128",
|
|
"outcome": "refuse",
|
|
"reason": "link_invalid"
|
|
},
|
|
{
|
|
"files": [
|
|
"rist_main_aes192.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "rist_main_aes192",
|
|
"note": "PSK keys are 128 or 256 bits",
|
|
"outcome": "refuse",
|
|
"reason": "link_invalid"
|
|
},
|
|
{
|
|
"files": [
|
|
"srt_cipher_100.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "srt_cipher_100",
|
|
"note": "no such key length",
|
|
"outcome": "refuse",
|
|
"reason": "link_invalid"
|
|
},
|
|
{
|
|
"files": [
|
|
"last_without_reason.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "last_without_reason",
|
|
"note": "the last part names no reason the session ended",
|
|
"outcome": "refuse",
|
|
"reason": "link_invalid"
|
|
},
|
|
{
|
|
"files": [
|
|
"reason_without_last.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "reason_without_last",
|
|
"note": "a reason on a part that is not the last",
|
|
"outcome": "refuse",
|
|
"reason": "link_invalid"
|
|
},
|
|
{
|
|
"files": [
|
|
"reason_unknown.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "reason_unknown",
|
|
"note": "reason 9",
|
|
"outcome": "refuse",
|
|
"reason": "link_invalid"
|
|
},
|
|
{
|
|
"files": [
|
|
"empty_span.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "empty_span",
|
|
"note": "start equals end",
|
|
"outcome": "refuse",
|
|
"reason": "link_invalid"
|
|
},
|
|
{
|
|
"files": [
|
|
"no_window.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "no_window",
|
|
"note": "a window of 0 µs",
|
|
"outcome": "refuse",
|
|
"reason": "link_invalid"
|
|
},
|
|
{
|
|
"files": [
|
|
"first_part_with_parent.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "first_part_with_parent",
|
|
"note": "part 0 names a parent",
|
|
"outcome": "refuse",
|
|
"reason": "link_invalid"
|
|
},
|
|
{
|
|
"files": [
|
|
"later_part_without_parent.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "later_part_without_parent",
|
|
"note": "part 3 names none",
|
|
"outcome": "refuse",
|
|
"reason": "link_invalid"
|
|
},
|
|
{
|
|
"files": [
|
|
"tracks_unsorted.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "tracks_unsorted",
|
|
"note": "the tracks out of order",
|
|
"outcome": "refuse",
|
|
"reason": "link_invalid"
|
|
},
|
|
{
|
|
"files": [
|
|
"track_head_without_groups.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "track_head_without_groups",
|
|
"note": "a head with no group signed",
|
|
"outcome": "refuse",
|
|
"reason": "link_invalid"
|
|
},
|
|
{
|
|
"files": [
|
|
"track_zero_digest.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "track_zero_digest",
|
|
"note": "a track digest of zero",
|
|
"outcome": "refuse",
|
|
"reason": "link_invalid"
|
|
},
|
|
{
|
|
"files": [
|
|
"count_mismatch.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "count_mismatch",
|
|
"note": "delivered + dropped + outstanding is one short of the count",
|
|
"outcome": "refuse",
|
|
"reason": "account_invalid"
|
|
},
|
|
{
|
|
"files": [
|
|
"first_try_over_delivered.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "first_try_over_delivered",
|
|
"note": "more at the first try than delivered",
|
|
"outcome": "refuse",
|
|
"reason": "account_invalid"
|
|
},
|
|
{
|
|
"files": [
|
|
"outstanding_not_last.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "outstanding_not_last",
|
|
"note": "outstanding in a part that is not the last",
|
|
"outcome": "refuse",
|
|
"reason": "account_invalid"
|
|
},
|
|
{
|
|
"files": [
|
|
"recovery_samples.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "recovery_samples",
|
|
"note": "one recovery sample more than recovered",
|
|
"outcome": "refuse",
|
|
"reason": "account_invalid"
|
|
},
|
|
{
|
|
"files": [
|
|
"rtt_disordered.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "rtt_disordered",
|
|
"note": "the RTT's minimum above its median",
|
|
"outcome": "refuse",
|
|
"reason": "account_invalid"
|
|
},
|
|
{
|
|
"files": [
|
|
"rtt_empty_with_figures.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "rtt_empty_with_figures",
|
|
"note": "no RTT sample, yet figures",
|
|
"outcome": "refuse",
|
|
"reason": "account_invalid"
|
|
},
|
|
{
|
|
"files": [
|
|
"margin_past_window.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "margin_past_window",
|
|
"note": "a recovered packet's margin larger than the window",
|
|
"outcome": "refuse",
|
|
"reason": "account_invalid"
|
|
},
|
|
{
|
|
"files": [
|
|
"requested_below_requests.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "requested_below_requests",
|
|
"note": "requests naming fewer sequence numbers than there are requests",
|
|
"outcome": "refuse",
|
|
"reason": "account_invalid"
|
|
},
|
|
{
|
|
"files": [
|
|
"runs_overlap.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "runs_overlap",
|
|
"note": "two runs with no first-try packet between",
|
|
"outcome": "refuse",
|
|
"reason": "runs_invalid"
|
|
},
|
|
{
|
|
"files": [
|
|
"run_outside.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "run_outside",
|
|
"note": "a run past the part's sequence numbers",
|
|
"outcome": "refuse",
|
|
"reason": "runs_invalid"
|
|
},
|
|
{
|
|
"files": [
|
|
"run_empty.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "run_empty",
|
|
"note": "a run of no sequence number",
|
|
"outcome": "refuse",
|
|
"reason": "runs_invalid"
|
|
},
|
|
{
|
|
"files": [
|
|
"run_overfull.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "run_overfull",
|
|
"note": "recovered and dropped more than the run holds",
|
|
"outcome": "refuse",
|
|
"reason": "runs_invalid"
|
|
},
|
|
{
|
|
"files": [
|
|
"runs_short.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "runs_short",
|
|
"note": "the runs do not sum to the part's losses",
|
|
"outcome": "refuse",
|
|
"reason": "runs_invalid"
|
|
},
|
|
{
|
|
"files": [
|
|
"truncated_not_full.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "truncated_not_full",
|
|
"note": "marked truncated with fewer runs than a part lists",
|
|
"outcome": "refuse",
|
|
"reason": "runs_invalid"
|
|
},
|
|
{
|
|
"files": [
|
|
"run_overfull_alone.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "run_overfull_alone",
|
|
"note": "a run's recovered and dropped past its count, every sum still right",
|
|
"outcome": "refuse",
|
|
"reason": "runs_invalid"
|
|
},
|
|
{
|
|
"files": [
|
|
"recovery_disordered.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "recovery_disordered",
|
|
"note": "the recoveries' minimum above their median",
|
|
"outcome": "refuse",
|
|
"reason": "account_invalid"
|
|
},
|
|
{
|
|
"files": [
|
|
"recovery_empty_with_figures.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "recovery_empty_with_figures",
|
|
"note": "no recovery sample, yet a maximum",
|
|
"outcome": "refuse",
|
|
"reason": "account_invalid"
|
|
},
|
|
{
|
|
"files": [
|
|
"tracks_past_bound.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "tracks_past_bound",
|
|
"note": "more track heads than a record holds",
|
|
"outcome": "refuse",
|
|
"reason": "malformed"
|
|
},
|
|
{
|
|
"files": [
|
|
"runs_past_bound.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "runs_past_bound",
|
|
"note": "513 runs listed",
|
|
"outcome": "refuse",
|
|
"reason": "malformed"
|
|
},
|
|
{
|
|
"files": [
|
|
"last_byte_two.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "last_byte_two",
|
|
"note": "a last flag of 2",
|
|
"outcome": "refuse",
|
|
"reason": "malformed"
|
|
},
|
|
{
|
|
"files": [
|
|
"truncated_byte_two.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "truncated_byte_two",
|
|
"note": "a truncated flag of 2",
|
|
"outcome": "refuse",
|
|
"reason": "malformed"
|
|
},
|
|
{
|
|
"files": [
|
|
"small_order_r.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "small_order_r",
|
|
"note": "the signature's R is the identity point, of small order",
|
|
"outcome": "refuse",
|
|
"reason": "bad_signature"
|
|
},
|
|
{
|
|
"files": [
|
|
"margin_without_recovery.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "margin_without_recovery",
|
|
"note": "a recovery margin with nothing recovered",
|
|
"outcome": "refuse",
|
|
"reason": "account_invalid"
|
|
},
|
|
{
|
|
"digest": "a446a02d0a5566f3967dc8137005a1403eebabb29a6a378998bb35bfc6420c7d",
|
|
"files": [
|
|
"two_dropped.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "two_dropped",
|
|
"note": "two of four dropped, none recovered",
|
|
"outcome": "accept",
|
|
"summary": {
|
|
"bytes": 2632,
|
|
"cipher": 128,
|
|
"delivered": 2,
|
|
"dropped": 2,
|
|
"ended": 0,
|
|
"first_try": 2,
|
|
"last": false,
|
|
"mode": 1,
|
|
"outstanding": 0,
|
|
"part": 0,
|
|
"protocol": 1,
|
|
"recovered": 0,
|
|
"runs": 1,
|
|
"seq_count": 4,
|
|
"seq_first": 42,
|
|
"size": 595
|
|
}
|
|
},
|
|
{
|
|
"files": [
|
|
"bytes_without_delivery.wcl1"
|
|
],
|
|
"kind": "part",
|
|
"name": "bytes_without_delivery",
|
|
"note": "bytes delivered with nothing delivered",
|
|
"outcome": "refuse",
|
|
"reason": "account_invalid"
|
|
},
|
|
{
|
|
"digests": [
|
|
"ebf32e01c2ad06441e573c0e8506602be52abd222170b09dc44bdcd85aaffa7e",
|
|
"c46bca400aa3c9c103a62994eed84d938c6e51082f6898aecee8f272350d32ce",
|
|
"b281373cbf176c52ec7ab873b9da8bdb6cd58c1167fb1f4e72218b7a6273cbdc"
|
|
],
|
|
"files": [
|
|
"series_three_parts.0.wcl1",
|
|
"series_three_parts.1.wcl1",
|
|
"series_three_parts.2.wcl1"
|
|
],
|
|
"kind": "series",
|
|
"name": "series_three_parts",
|
|
"note": "a session of three parts, each chained to the one before, the last ended by DELETE",
|
|
"outcome": "accept",
|
|
"summaries": [
|
|
{
|
|
"bytes": 40796,
|
|
"cipher": 128,
|
|
"delivered": 31,
|
|
"dropped": 1,
|
|
"ended": 0,
|
|
"first_try": 25,
|
|
"last": false,
|
|
"mode": 1,
|
|
"outstanding": 0,
|
|
"part": 0,
|
|
"protocol": 1,
|
|
"recovered": 6,
|
|
"runs": 4,
|
|
"seq_count": 32,
|
|
"seq_first": 1000000,
|
|
"size": 655
|
|
},
|
|
{
|
|
"bytes": 21056,
|
|
"cipher": 128,
|
|
"delivered": 16,
|
|
"dropped": 0,
|
|
"ended": 0,
|
|
"first_try": 15,
|
|
"last": false,
|
|
"mode": 1,
|
|
"outstanding": 0,
|
|
"part": 1,
|
|
"protocol": 1,
|
|
"recovered": 1,
|
|
"runs": 1,
|
|
"seq_count": 16,
|
|
"seq_first": 1000032,
|
|
"size": 595
|
|
},
|
|
{
|
|
"bytes": 11844,
|
|
"cipher": 128,
|
|
"delivered": 9,
|
|
"dropped": 0,
|
|
"ended": 3,
|
|
"first_try": 9,
|
|
"last": true,
|
|
"mode": 1,
|
|
"outstanding": 1,
|
|
"part": 2,
|
|
"protocol": 1,
|
|
"recovered": 0,
|
|
"runs": 1,
|
|
"seq_count": 10,
|
|
"seq_first": 1000048,
|
|
"size": 595
|
|
}
|
|
]
|
|
},
|
|
{
|
|
"at": 0,
|
|
"files": [
|
|
"series_starts_late.0.wcl1",
|
|
"series_starts_late.1.wcl1"
|
|
],
|
|
"kind": "series",
|
|
"name": "series_starts_late",
|
|
"note": "a series whose first part is not part 0",
|
|
"outcome": "refuse",
|
|
"reason": "chain_broken"
|
|
},
|
|
{
|
|
"at": 1,
|
|
"files": [
|
|
"series_wrong_parent.0.wcl1",
|
|
"series_wrong_parent.1.wcl1",
|
|
"series_wrong_parent.2.wcl1"
|
|
],
|
|
"kind": "series",
|
|
"name": "series_wrong_parent",
|
|
"note": "part 1 names another parent",
|
|
"outcome": "refuse",
|
|
"reason": "chain_broken"
|
|
},
|
|
{
|
|
"at": 2,
|
|
"files": [
|
|
"series_skips_a_part.0.wcl1",
|
|
"series_skips_a_part.1.wcl1",
|
|
"series_skips_a_part.2.wcl1"
|
|
],
|
|
"kind": "series",
|
|
"name": "series_skips_a_part",
|
|
"note": "part 1 then part 3",
|
|
"outcome": "refuse",
|
|
"reason": "chain_broken"
|
|
},
|
|
{
|
|
"at": 1,
|
|
"files": [
|
|
"series_other_session.0.wcl1",
|
|
"series_other_session.1.wcl1"
|
|
],
|
|
"kind": "series",
|
|
"name": "series_other_session",
|
|
"note": "part 1 of another session",
|
|
"outcome": "refuse",
|
|
"reason": "chain_broken"
|
|
},
|
|
{
|
|
"at": 1,
|
|
"files": [
|
|
"series_head_moved_without_groups.0.wcl1",
|
|
"series_head_moved_without_groups.1.wcl1"
|
|
],
|
|
"kind": "series",
|
|
"name": "series_head_moved_without_groups",
|
|
"note": "a track's head changed with no group signed since",
|
|
"outcome": "refuse",
|
|
"reason": "chain_broken"
|
|
},
|
|
{
|
|
"at": 1,
|
|
"files": [
|
|
"series_track_dropped.0.wcl1",
|
|
"series_track_dropped.1.wcl1"
|
|
],
|
|
"kind": "series",
|
|
"name": "series_track_dropped",
|
|
"note": "a track of part 0 missing from part 1",
|
|
"outcome": "refuse",
|
|
"reason": "chain_broken"
|
|
},
|
|
{
|
|
"at": 1,
|
|
"files": [
|
|
"series_part_after_last.0.wcl1",
|
|
"series_part_after_last.1.wcl1"
|
|
],
|
|
"kind": "series",
|
|
"name": "series_part_after_last",
|
|
"note": "a part after the session's last",
|
|
"outcome": "refuse",
|
|
"reason": "chain_broken"
|
|
},
|
|
{
|
|
"at": 1,
|
|
"files": [
|
|
"series_sequence_gap.0.wcl1",
|
|
"series_sequence_gap.1.wcl1"
|
|
],
|
|
"kind": "series",
|
|
"name": "series_sequence_gap",
|
|
"note": "a sequence number between part 0 and part 1 accounted for by neither",
|
|
"outcome": "refuse",
|
|
"reason": "sequence_gap"
|
|
},
|
|
{
|
|
"at": 1,
|
|
"files": [
|
|
"series_time_gap.0.wcl1",
|
|
"series_time_gap.1.wcl1"
|
|
],
|
|
"kind": "series",
|
|
"name": "series_time_gap",
|
|
"note": "part 1 begins a microsecond after part 0 ended",
|
|
"outcome": "refuse",
|
|
"reason": "sequence_gap"
|
|
},
|
|
{
|
|
"at": 1,
|
|
"files": [
|
|
"series_other_hop.0.wcl1",
|
|
"series_other_hop.1.wcl1"
|
|
],
|
|
"kind": "series",
|
|
"name": "series_other_hop",
|
|
"note": "part 1 signed by another gateway",
|
|
"outcome": "refuse",
|
|
"reason": "chain_broken"
|
|
},
|
|
{
|
|
"at": 1,
|
|
"files": [
|
|
"series_other_room.0.wcl1",
|
|
"series_other_room.1.wcl1"
|
|
],
|
|
"kind": "series",
|
|
"name": "series_other_room",
|
|
"note": "part 1 of another room",
|
|
"outcome": "refuse",
|
|
"reason": "chain_broken"
|
|
},
|
|
{
|
|
"at": 1,
|
|
"files": [
|
|
"series_other_principal.0.wcl1",
|
|
"series_other_principal.1.wcl1"
|
|
],
|
|
"kind": "series",
|
|
"name": "series_other_principal",
|
|
"note": "part 1 of another owner",
|
|
"outcome": "refuse",
|
|
"reason": "chain_broken"
|
|
},
|
|
{
|
|
"at": 1,
|
|
"files": [
|
|
"series_other_grant.0.wcl1",
|
|
"series_other_grant.1.wcl1"
|
|
],
|
|
"kind": "series",
|
|
"name": "series_other_grant",
|
|
"note": "part 1 under another grant",
|
|
"outcome": "refuse",
|
|
"reason": "chain_broken"
|
|
},
|
|
{
|
|
"at": 1,
|
|
"files": [
|
|
"series_other_protocol.0.wcl1",
|
|
"series_other_protocol.1.wcl1"
|
|
],
|
|
"kind": "series",
|
|
"name": "series_other_protocol",
|
|
"note": "part 1 of another protocol",
|
|
"outcome": "refuse",
|
|
"reason": "chain_broken"
|
|
},
|
|
{
|
|
"at": 1,
|
|
"files": [
|
|
"series_other_mode.0.wcl1",
|
|
"series_other_mode.1.wcl1"
|
|
],
|
|
"kind": "series",
|
|
"name": "series_other_mode",
|
|
"note": "part 1 says the gateway called",
|
|
"outcome": "refuse",
|
|
"reason": "chain_broken"
|
|
},
|
|
{
|
|
"at": 1,
|
|
"files": [
|
|
"series_other_cipher.0.wcl1",
|
|
"series_other_cipher.1.wcl1"
|
|
],
|
|
"kind": "series",
|
|
"name": "series_other_cipher",
|
|
"note": "part 1 under another key length",
|
|
"outcome": "refuse",
|
|
"reason": "chain_broken"
|
|
},
|
|
{
|
|
"at": 1,
|
|
"files": [
|
|
"series_other_window.0.wcl1",
|
|
"series_other_window.1.wcl1"
|
|
],
|
|
"kind": "series",
|
|
"name": "series_other_window",
|
|
"note": "part 1 with another window",
|
|
"outcome": "refuse",
|
|
"reason": "chain_broken"
|
|
},
|
|
{
|
|
"at": 1,
|
|
"files": [
|
|
"series_track_alias_changed.0.wcl1",
|
|
"series_track_alias_changed.1.wcl1"
|
|
],
|
|
"kind": "series",
|
|
"name": "series_track_alias_changed",
|
|
"note": "a track's receipt chain changed",
|
|
"outcome": "refuse",
|
|
"reason": "chain_broken"
|
|
},
|
|
{
|
|
"digests": [
|
|
"ebf32e01c2ad06441e573c0e8506602be52abd222170b09dc44bdcd85aaffa7e",
|
|
"74a07b60ada43de0c44f22dfe3e0eab42fcb8167a9f7e1e32479a64235ddfcd1",
|
|
"6d142f165bf08fb9710829861ffb971dab0adfa7a18bded95259d604bcc34f37"
|
|
],
|
|
"files": [
|
|
"series_track_added.0.wcl1",
|
|
"series_track_added.1.wcl1",
|
|
"series_track_added.2.wcl1"
|
|
],
|
|
"kind": "series",
|
|
"name": "series_track_added",
|
|
"note": "a track that begins in part 1, named again in part 2",
|
|
"outcome": "accept",
|
|
"summaries": [
|
|
{
|
|
"bytes": 40796,
|
|
"cipher": 128,
|
|
"delivered": 31,
|
|
"dropped": 1,
|
|
"ended": 0,
|
|
"first_try": 25,
|
|
"last": false,
|
|
"mode": 1,
|
|
"outstanding": 0,
|
|
"part": 0,
|
|
"protocol": 1,
|
|
"recovered": 6,
|
|
"runs": 4,
|
|
"seq_count": 32,
|
|
"seq_first": 1000000,
|
|
"size": 655
|
|
},
|
|
{
|
|
"bytes": 21056,
|
|
"cipher": 128,
|
|
"delivered": 16,
|
|
"dropped": 0,
|
|
"ended": 0,
|
|
"first_try": 15,
|
|
"last": false,
|
|
"mode": 1,
|
|
"outstanding": 0,
|
|
"part": 1,
|
|
"protocol": 1,
|
|
"recovered": 1,
|
|
"runs": 1,
|
|
"seq_count": 16,
|
|
"seq_first": 1000032,
|
|
"size": 675
|
|
},
|
|
{
|
|
"bytes": 11844,
|
|
"cipher": 128,
|
|
"delivered": 9,
|
|
"dropped": 0,
|
|
"ended": 3,
|
|
"first_try": 9,
|
|
"last": true,
|
|
"mode": 1,
|
|
"outstanding": 1,
|
|
"part": 2,
|
|
"protocol": 1,
|
|
"recovered": 0,
|
|
"runs": 1,
|
|
"seq_count": 10,
|
|
"seq_first": 1000048,
|
|
"size": 675
|
|
}
|
|
]
|
|
}
|
|
]
|
|
}
|